diff --git a/.gitattributes b/.gitattributes index 799d79ab4e0..bf7887376e6 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2,861 +2,3 @@ /.classpath -text /.project -text .settings/org.eclipse.jdt.core.prefs -text -/CHANGES.txt -text svneol=native#text/plain -/LICENSE.txt svneol=native#text/plain -/README.txt svneol=native#text/plain -build/Forge.icns -text svneol=unset#unset -build/backgroundImage.jpg -text svneol=unset#image/jpeg -build/create-dmg -text -build/forge.ico -text svneol=unset#image/ico -build/forge.sh svneol=native#text/x-sh -build/support/AdiumApplescriptRunner -text svneol=unset#unset -build/support/template.applescript -text -/delete-me.txt svneol=native#text/plain -/forge.properties svneol=native#text/plain -/pom.xml svneol=native#text/xml -res/AllTokens.txt -text svneol=native#text/plain -res/PerSetTracking.py svneol=native#text/x-python -res/blockdata/blocks.txt svneol=native#text/plain -res/blockdata/setdata.txt svneol=native#text/plain -res/booster-decks -text svneol=unset#unset -res/boosterdata/10E.pack -text -res/boosterdata/2ED.pack -text -res/boosterdata/3ED.pack -text -res/boosterdata/4ED.pack -text -res/boosterdata/5DN.pack -text -res/boosterdata/5ED.pack -text -res/boosterdata/6ED.pack -text -res/boosterdata/7ED.pack -text -res/boosterdata/8ED.pack -text -res/boosterdata/9ED.pack -text -res/boosterdata/A.pack -text -res/boosterdata/ALA.pack -text -res/boosterdata/ALL.pack -text -res/boosterdata/APC.pack -text -res/boosterdata/ARB.pack -text -res/boosterdata/ARN.pack -text -res/boosterdata/ATQ.pack -text -res/boosterdata/B.pack -text -res/boosterdata/BOK.pack -text -res/boosterdata/CFX.pack -text -res/boosterdata/CHK.pack -text -res/boosterdata/CHR.pack -text -res/boosterdata/CSP.pack -text -res/boosterdata/DIS.pack -text -res/boosterdata/DRK.pack -text -res/boosterdata/DST.pack -text -res/boosterdata/EVE.pack -text -res/boosterdata/EXO.pack -text -res/boosterdata/FEM.pack -text -res/boosterdata/FUT.pack -text -res/boosterdata/GPT.pack -text -res/boosterdata/HML.pack -text -res/boosterdata/ICE.pack -text -res/boosterdata/INV.pack -text -res/boosterdata/JUD.pack -text -res/boosterdata/LEA.pack -text -res/boosterdata/LEB.pack -text -res/boosterdata/LEG.pack -text -res/boosterdata/LGN.pack -text -res/boosterdata/LRW.pack -text -res/boosterdata/M10.pack -text -res/boosterdata/M11.pack -text -res/boosterdata/MBS.pack -text -res/boosterdata/MIR.pack -text -res/boosterdata/MMQ.pack -text -res/boosterdata/MOR.pack -text -res/boosterdata/MRD.pack -text -res/boosterdata/NMS.pack -text -res/boosterdata/NPH.pack -text -res/boosterdata/ODY.pack -text -res/boosterdata/ONS.pack -text -res/boosterdata/P02.pack -text -res/boosterdata/PCY.pack -text -res/boosterdata/PLC.pack -text -res/boosterdata/PLS.pack -text -res/boosterdata/POR.pack -text -res/boosterdata/PTK.pack -text -res/boosterdata/RAV.pack -text -res/boosterdata/ROE.pack -text -res/boosterdata/SCG.pack -text -res/boosterdata/SHM.pack -text -res/boosterdata/SOK.pack -text -res/boosterdata/SOM.pack -text -res/boosterdata/STH.pack -text -res/boosterdata/TMP.pack -text -res/boosterdata/TOR.pack -text -res/boosterdata/TSP.pack -text -res/boosterdata/UDS.pack -text -res/boosterdata/ULG.pack -text -res/boosterdata/USG.pack -text -res/boosterdata/VIS.pack -text -res/boosterdata/WTH.pack -text -res/boosterdata/WWK.pack -text -res/boosterdata/ZEN.pack -text -res/card-pictures-token.txt -text svneol=native#text/plain -res/decks/JuzamjediCube.dck -text -res/draft/common.txt -text svneol=native#text/plain -res/draft/cube_juzamjedi.draft -text -res/draft/draft.properties -text svneol=native#text/plain -res/draft/rare.txt -text svneol=native#text/plain -res/draft/uncommon.txt -text svneol=native#text/plain -res/gui/display_layout.xml svneol=native#text/xml -res/gui/display_new_layout.xml svneol=native#text/xml -res/gui/gui.properties svneol=native#text/plain -res/images/deckeditor/filter_artifact_n.png -text svneol=unset#image/png -res/images/deckeditor/filter_artifact_y.png -text svneol=unset#image/png -res/images/deckeditor/filter_black_n.png -text svneol=unset#image/png -res/images/deckeditor/filter_black_y.png -text svneol=unset#image/png -res/images/deckeditor/filter_blue_n.png -text svneol=unset#image/png -res/images/deckeditor/filter_blue_y.png -text svneol=unset#image/png -res/images/deckeditor/filter_colorless_n.png -text svneol=unset#image/png -res/images/deckeditor/filter_colorless_y.png -text svneol=unset#image/png -res/images/deckeditor/filter_creature_n.png -text svneol=unset#image/png -res/images/deckeditor/filter_creature_y.png -text svneol=unset#image/png -res/images/deckeditor/filter_enchant_n.png -text svneol=unset#image/png -res/images/deckeditor/filter_enchant_y.png -text svneol=unset#image/png -res/images/deckeditor/filter_green_n.png -text svneol=unset#image/png -res/images/deckeditor/filter_green_y.png -text svneol=unset#image/png -res/images/deckeditor/filter_instant_n.png -text svneol=unset#image/png -res/images/deckeditor/filter_instant_y.png -text svneol=unset#image/png -res/images/deckeditor/filter_land_n.png -text svneol=unset#image/png -res/images/deckeditor/filter_land_y.png -text svneol=unset#image/png -res/images/deckeditor/filter_planeswalker_n.png -text svneol=unset#image/png -res/images/deckeditor/filter_planeswalker_y.png -text svneol=unset#image/png -res/images/deckeditor/filter_red_n.png -text svneol=unset#image/png -res/images/deckeditor/filter_red_y.png -text svneol=unset#image/png -res/images/deckeditor/filter_sorcery_n.png -text svneol=unset#image/png -res/images/deckeditor/filter_sorcery_y.png -text svneol=unset#image/png -res/images/deckeditor/filter_white_n.png -text svneol=unset#image/png -res/images/deckeditor/filter_white_y.png -text svneol=unset#image/png -res/images/symbols-13/0.png -text svneol=unset#image/png -res/images/symbols-13/1.png -text svneol=unset#image/png -res/images/symbols-13/10.png -text svneol=unset#image/png -res/images/symbols-13/11.png -text svneol=unset#image/png -res/images/symbols-13/12.png -text svneol=unset#image/png -res/images/symbols-13/15.png -text svneol=unset#image/png -res/images/symbols-13/16.png -text svneol=unset#image/png -res/images/symbols-13/2.png -text svneol=unset#image/png -res/images/symbols-13/20.png -text svneol=unset#image/png -res/images/symbols-13/2B.png -text svneol=unset#image/png -res/images/symbols-13/2G.png -text svneol=unset#image/png -res/images/symbols-13/2R.png -text svneol=unset#image/png -res/images/symbols-13/2U.png -text svneol=unset#image/png -res/images/symbols-13/2W.png -text svneol=unset#image/png -res/images/symbols-13/3.png -text svneol=unset#image/png -res/images/symbols-13/4.png -text svneol=unset#image/png -res/images/symbols-13/5.png -text svneol=unset#image/png -res/images/symbols-13/6.png -text svneol=unset#image/png -res/images/symbols-13/7.png -text svneol=unset#image/png -res/images/symbols-13/8.png -text svneol=unset#image/png -res/images/symbols-13/9.png -text svneol=unset#image/png -res/images/symbols-13/B.png -text svneol=unset#image/png -res/images/symbols-13/BG.png -text svneol=unset#image/png -res/images/symbols-13/BR.png -text svneol=unset#image/png -res/images/symbols-13/C.png -text svneol=unset#image/png -res/images/symbols-13/G.png -text svneol=unset#image/png -res/images/symbols-13/GU.png -text svneol=unset#image/png -res/images/symbols-13/GW.png -text svneol=unset#image/png -res/images/symbols-13/PB.png -text svneol=unset#image/png -res/images/symbols-13/PG.png -text svneol=unset#image/png -res/images/symbols-13/PR.png -text svneol=unset#image/png -res/images/symbols-13/PU.png -text svneol=unset#image/png -res/images/symbols-13/PW.png -text svneol=unset#image/png -res/images/symbols-13/Q.png -text svneol=unset#image/png -res/images/symbols-13/R.png -text svneol=unset#image/png -res/images/symbols-13/RG.png -text svneol=unset#image/png -res/images/symbols-13/RW.png -text svneol=unset#image/png -res/images/symbols-13/S.png -text svneol=unset#image/png -res/images/symbols-13/T.png -text svneol=unset#image/png -res/images/symbols-13/U.png -text svneol=unset#image/png -res/images/symbols-13/UB.png -text svneol=unset#image/png -res/images/symbols-13/UR.png -text svneol=unset#image/png -res/images/symbols-13/W.png -text svneol=unset#image/png -res/images/symbols-13/WB.png -text svneol=unset#image/png -res/images/symbols-13/WU.png -text svneol=unset#image/png -res/images/symbols-13/X.png -text svneol=unset#image/png -res/images/symbols-13/Y.png -text svneol=unset#image/png -res/images/symbols-13/Z.png -text svneol=unset#image/png -res/images/symbols-13/attack.png -text svneol=unset#image/png -res/images/symbols-13/defend.png -text svneol=unset#image/png -res/images/symbols-13/slash.png -text svneol=unset#image/png -res/images/symbols-13/summonsick.png -text svneol=unset#image/png -res/images/ui/newgame_background.jpg -text svneol=unset#image/jpeg -res/lang/de.properties svneol=native#text/plain -res/lang/en.properties svneol=native#text/plain -res/lang/howTo/de.properties svneol=native#text/plain -res/lang/howTo/en.properties svneol=native#text/plain -res/lang/lang.properties svneol=native#text/plain -res/licenses/multiline-label-license.txt svneol=native#text/plain -res/licenses/xpp3-license.txt svneol=native#text/plain -res/licenses/xstream-license.txt svneol=native#text/plain -res/main.properties svneol=native#text/plain -res/mtg-data.txt svneol=native#text/plain -res/pics/BookIcon.png -text svneol=unset#image/png -res/pics/BoxIcon.png -text svneol=unset#image/png -res/pics/GoldIcon.png -text svneol=unset#image/png -res/pics/HeartIcon.png -text svneol=unset#image/png -res/pics/icons/BookIcon.png -text svneol=unset#image/png -res/pics/icons/BookIconSmall.png -text svneol=unset#image/png -res/pics/icons/BottlesIconSmall.png -text svneol=unset#image/png -res/pics/icons/BoxIcon.png -text svneol=unset#image/png -res/pics/icons/BoxIconSmall.png -text svneol=unset#image/png -res/pics/icons/CoinIcon.png -text svneol=unset#image/png -res/pics/icons/CoinIconSmall.png -text svneol=unset#image/png -res/pics/icons/CoinStack.png -text svneol=unset#image/png -res/pics/icons/ElixirIcon.png -text svneol=unset#image/png -res/pics/icons/FoxIconSmall.png -text svneol=unset#image/png -res/pics/icons/GearIconSmall.png -text svneol=unset#image/png -res/pics/icons/GoldIcon.png -text svneol=unset#image/png -res/pics/icons/GoldIconLarge.png -text svneol=unset#image/png -res/pics/icons/GoldIconSmall.png -text svneol=unset#image/png -res/pics/icons/HeartIcon.png -text svneol=unset#image/png -res/pics/icons/LeafIconSmall.png -text svneol=unset#image/png -res/pics/icons/Life.png -text svneol=unset#image/png -res/pics/icons/MapIcon.png -text svneol=unset#image/png -res/pics/icons/MapIconLarge.png -text svneol=unset#image/png -res/pics/icons/ZeppelinIcon.png -text svneol=unset#image/png -res/pics/icons/notesIcon.png -text svneol=unset#image/png -res/pics_link/card-pictures_a.txt -text svneol=native#text/plain -res/pics_link/card-pictures_b.txt -text svneol=native#text/plain -res/pics_link/card-pictures_c.txt -text svneol=native#text/plain -res/pics_link/card-pictures_d.txt -text svneol=native#text/plain -res/pics_link/card-pictures_e.txt -text svneol=native#text/plain -res/pics_link/card-pictures_f.txt -text svneol=native#text/plain -res/pics_link/card-pictures_g.txt -text svneol=native#text/plain -res/pics_link/card-pictures_h.txt -text svneol=native#text/plain -res/pics_link/card-pictures_i.txt -text svneol=native#text/plain -res/pics_link/card-pictures_j.txt -text svneol=native#text/plain -res/pics_link/card-pictures_k.txt -text svneol=native#text/plain -res/pics_link/card-pictures_l.txt -text svneol=native#text/plain -res/pics_link/card-pictures_m.txt -text svneol=native#text/plain -res/pics_link/card-pictures_n.txt -text svneol=native#text/plain -res/pics_link/card-pictures_o.txt -text svneol=native#text/plain -res/pics_link/card-pictures_other.txt -text svneol=native#text/plain -res/pics_link/card-pictures_p.txt -text svneol=native#text/plain -res/pics_link/card-pictures_q.txt -text svneol=native#text/plain -res/pics_link/card-pictures_r.txt -text svneol=native#text/plain -res/pics_link/card-pictures_s.txt -text svneol=native#text/plain -res/pics_link/card-pictures_t.txt -text svneol=native#text/plain -res/pics_link/card-pictures_token.txt -text svneol=native#text/plain -res/pics_link/card-pictures_u.txt -text svneol=native#text/plain -res/pics_link/card-pictures_v.txt -text svneol=native#text/plain -res/pics_link/card-pictures_w.txt -text svneol=native#text/plain -res/pics_link/card-pictures_x.txt -text svneol=native#text/plain -res/pics_link/card-pictures_y.txt -text svneol=native#text/plain -res/pics_link/card-pictures_z.txt -text svneol=native#text/plain -res/quest/all-prices.txt -text svneol=native#text/plain -res/quest/decks/Abraham[!!-~]Lincoln[!!-~]3.dck -text -res/quest/decks/Albert[!!-~]Einstein[!!-~]2.dck -text -res/quest/decks/Albert[!!-~]Einstein[!!-~]3.dck -text -res/quest/decks/Aquaman[!!-~]1.dck -text -res/quest/decks/Aquaman[!!-~]2.dck -text -res/quest/decks/Aquaman[!!-~]3.dck -text -res/quest/decks/Aragorn[!!-~]2.dck -text -res/quest/decks/Atomic[!!-~]Robo[!!-~]3.dck -text -res/quest/decks/Bamm[!!-~]Bamm[!!-~]Rubble[!!-~]1.dck -text -res/quest/decks/Barney[!!-~]Rubble[!!-~]1.dck -text -res/quest/decks/Barney[!!-~]Rubble[!!-~]2.dck -text -res/quest/decks/Barney[!!-~]Rubble[!!-~]3.dck -text -res/quest/decks/Bart[!!-~]Simpson[!!-~]1.dck -text -res/quest/decks/Bart[!!-~]Simpson[!!-~]2.dck -text -res/quest/decks/Bart[!!-~]Simpson[!!-~]3.dck -text -res/quest/decks/Batman[!!-~]3.dck -text -res/quest/decks/Bela[!!-~]Lugosi[!!-~]3.dck -text -res/quest/decks/Betty[!!-~]Rubble[!!-~]3.dck -text -res/quest/decks/Blackbeard[!!-~]3.dck -text -res/quest/decks/Boba[!!-~]Fett[!!-~]3.dck -text -res/quest/decks/Boris[!!-~]Karloff[!!-~]3.dck -text -res/quest/decks/Boromir[!!-~]2.dck -text -res/quest/decks/Boromir[!!-~]3.dck -text -res/quest/decks/Boromir[!!-~]4.dck -text -res/quest/decks/Buffy[!!-~]1.dck -text -res/quest/decks/Buffy[!!-~]2.dck -text -res/quest/decks/Buffy[!!-~]3.dck -text -res/quest/decks/C3PO[!!-~]1.dck -text -res/quest/decks/C3PO[!!-~]2.dck -text -res/quest/decks/C3PO[!!-~]3.dck -text -res/quest/decks/Captain[!!-~]America[!!-~]2.dck -text -res/quest/decks/Captain[!!-~]America[!!-~]3.dck -text -res/quest/decks/Catwoman[!!-~]1.dck -text -res/quest/decks/Catwoman[!!-~]2.dck -text -res/quest/decks/Cave[!!-~]Troll[!!-~]3.dck -text -res/quest/decks/Comic[!!-~]Book[!!-~]Guy[!!-~]3.dck -text -res/quest/decks/Crocodile[!!-~]Dundee[!!-~]1.dck -text -res/quest/decks/Crocodile[!!-~]Dundee[!!-~]2.dck -text -res/quest/decks/Crocodile[!!-~]Dundee[!!-~]3.dck -text -res/quest/decks/Cyclops[!!-~]2.dck -text -res/quest/decks/Cyclops[!!-~]3.dck -text -res/quest/decks/Da[!!-~]Vinci[!!-~]1.dck -text -res/quest/decks/Da[!!-~]Vinci[!!-~]2.dck -text -res/quest/decks/Da[!!-~]Vinci[!!-~]3.dck -text -res/quest/decks/Darrin[!!-~]Stephens[!!-~]1.dck -text -res/quest/decks/Darrin[!!-~]Stephens[!!-~]2.dck -text -res/quest/decks/Darrin[!!-~]Stephens[!!-~]3.dck -text -res/quest/decks/Darrin[!!-~]Stephens[!!-~]4.dck -text -res/quest/decks/Darth[!!-~]Vader[!!-~]3.dck -text -res/quest/decks/Data[!!-~]3.dck -text -res/quest/decks/Deadpool[!!-~]2.dck -text -res/quest/decks/Deadpool[!!-~]3.dck -text -res/quest/decks/Demon[!!-~]3.dck -text -res/quest/decks/Dilbert[!!-~]3.dck -text -res/quest/decks/Dino[!!-~]2.dck -text -res/quest/decks/Dino[!!-~]3.dck -text -res/quest/decks/Doc[!!-~]Holiday[!!-~]1.dck -text -res/quest/decks/Doc[!!-~]Holiday[!!-~]2.dck -text -res/quest/decks/Doc[!!-~]Holiday[!!-~]3.dck -text -res/quest/decks/Doran[!!-~]3.dck -text -res/quest/decks/Dr[!!-~]No[!!-~]3.dck -text -res/quest/decks/Dr[!!-~]Strangelove[!!-~]3.dck -text -res/quest/decks/Electro[!!-~]2.dck -text -res/quest/decks/Electro[!!-~]3.dck -text -res/quest/decks/Elrond[!!-~]1.dck -text -res/quest/decks/Elrond[!!-~]2.dck -text -res/quest/decks/Elrond[!!-~]3.dck -text -res/quest/decks/Endora[!!-~]2.dck -text -res/quest/decks/Endora[!!-~]3.dck -text -res/quest/decks/Eomer[!!-~]2.dck -text -res/quest/decks/Ezio[!!-~]3.dck -text -res/quest/decks/Fat[!!-~]Albert[!!-~]1.dck -text -res/quest/decks/Fat[!!-~]Albert[!!-~]2.dck -text -res/quest/decks/Fat[!!-~]Albert[!!-~]3.dck -text -res/quest/decks/Fin[!!-~]Fang[!!-~]Foom[!!-~]1.dck -text -res/quest/decks/Fin[!!-~]Fang[!!-~]Foom[!!-~]2.dck -text -res/quest/decks/Fin[!!-~]Fang[!!-~]Foom[!!-~]3.dck -text -res/quest/decks/Fred[!!-~]Flintstone[!!-~]3.dck -text -res/quest/decks/Frodo[!!-~]1.dck -text -res/quest/decks/Frodo[!!-~]2.dck -text -res/quest/decks/Frodo[!!-~]3.dck -text -res/quest/decks/Galadriel[!!-~]2.dck -text -res/quest/decks/Galahad[!!-~]1.dck -text -res/quest/decks/Galahad[!!-~]2.dck -text -res/quest/decks/Galahad[!!-~]3.dck -text -res/quest/decks/Genghis[!!-~]Khan[!!-~]1.dck -text -res/quest/decks/Genghis[!!-~]Khan[!!-~]2.dck -text -res/quest/decks/Genghis[!!-~]Khan[!!-~]3.dck -text -res/quest/decks/George[!!-~]of[!!-~]the[!!-~]Jungle[!!-~]1.dck -text -res/quest/decks/George[!!-~]of[!!-~]the[!!-~]Jungle[!!-~]2.dck -text -res/quest/decks/George[!!-~]of[!!-~]the[!!-~]Jungle[!!-~]3.dck -text -res/quest/decks/Gimli[!!-~]2.dck -text -res/quest/decks/Gimli[!!-~]3.dck -text -res/quest/decks/Gold[!!-~]Finger[!!-~]3.dck -text -res/quest/decks/Gold[!!-~]Finger[!!-~]4.dck -text -res/quest/decks/Grampa[!!-~]Simpson[!!-~]1.dck -text -res/quest/decks/Grampa[!!-~]Simpson[!!-~]2.dck -text -res/quest/decks/Grampa[!!-~]Simpson[!!-~]3.dck -text -res/quest/decks/Green[!!-~]Arrow[!!-~]2.dck -text -res/quest/decks/Green[!!-~]Lantern[!!-~]3.dck -text -res/quest/decks/Hagrid[!!-~]2.dck -text -res/quest/decks/Han[!!-~]Solo[!!-~]3.dck -text -res/quest/decks/Hans[!!-~]3.dck -text -res/quest/decks/Harry[!!-~]Potter[!!-~]1.dck -text -res/quest/decks/Harry[!!-~]Potter[!!-~]2.dck -text -res/quest/decks/Harry[!!-~]Potter[!!-~]3.dck -text -res/quest/decks/Hellboy[!!-~]3.dck -text -res/quest/decks/Hercules[!!-~]1.dck -text -res/quest/decks/Hercules[!!-~]2.dck -text -res/quest/decks/Hercules[!!-~]3.dck -text -res/quest/decks/Hermione[!!-~]Granger[!!-~]3.dck -text -res/quest/decks/Higgins[!!-~]3.dck -text -res/quest/decks/Hobbes[!!-~]3.dck -text -res/quest/decks/Hobbes[!!-~]4.dck -text -res/quest/decks/Homer[!!-~]Simpson[!!-~]1.dck -text -res/quest/decks/Homer[!!-~]Simpson[!!-~]2.dck -text -res/quest/decks/Homer[!!-~]Simpson[!!-~]3.dck -text -res/quest/decks/Iceman[!!-~]3.dck -text -res/quest/decks/Indiana[!!-~]Jones[!!-~]1.dck -text -res/quest/decks/Indiana[!!-~]Jones[!!-~]2.dck -text -res/quest/decks/Indiana[!!-~]Jones[!!-~]3.dck -text -res/quest/decks/Jabba[!!-~]the[!!-~]Hut[!!-~]3.dck -text -res/quest/decks/Jack[!!-~]Sparrow[!!-~]1.dck -text -res/quest/decks/Jack[!!-~]Sparrow[!!-~]2.dck -text -res/quest/decks/James[!!-~]Bond[!!-~]1.dck -text -res/quest/decks/James[!!-~]Bond[!!-~]2.dck -text -res/quest/decks/James[!!-~]Bond[!!-~]3.dck -text -res/quest/decks/James[!!-~]T[!!-~]Kirk[!!-~]3.dck -text -res/quest/decks/Joe[!!-~]Kidd[!!-~]1.dck -text -res/quest/decks/Joe[!!-~]Kidd[!!-~]2.dck -text -res/quest/decks/Joe[!!-~]Kidd[!!-~]3.dck -text -res/quest/decks/Kang[!!-~]2.dck -text -res/quest/decks/Kang[!!-~]3.dck -text -res/quest/decks/King[!!-~]Arthur[!!-~]1.dck -text -res/quest/decks/King[!!-~]Arthur[!!-~]2.dck -text -res/quest/decks/King[!!-~]Arthur[!!-~]3.dck -text -res/quest/decks/King[!!-~]Edward[!!-~]1.dck -text -res/quest/decks/King[!!-~]Edward[!!-~]2.dck -text -res/quest/decks/King[!!-~]Edward[!!-~]3.dck -text -res/quest/decks/King[!!-~]Goldemar[!!-~]1.dck -text -res/quest/decks/King[!!-~]Kong[!!-~]1.dck -text -res/quest/decks/King[!!-~]Kong[!!-~]2.dck -text -res/quest/decks/King[!!-~]Kong[!!-~]3.dck -text -res/quest/decks/Kojak[!!-~]1.dck -text -res/quest/decks/Kojak[!!-~]2.dck -text -res/quest/decks/Kojak[!!-~]3.dck -text -res/quest/decks/Lisa[!!-~]Simpson[!!-~]2.dck -text -res/quest/decks/Luke[!!-~]Skywalker[!!-~]3.dck -text -res/quest/decks/Maggie[!!-~]Simpson[!!-~]3.dck -text -res/quest/decks/Magneto[!!-~]3.dck -text -res/quest/decks/Magnum[!!-~]1.dck -text -res/quest/decks/Magnum[!!-~]2.dck -text -res/quest/decks/Magnum[!!-~]3.dck -text -res/quest/decks/Marge[!!-~]Simpson[!!-~]2.dck -text -res/quest/decks/Morpheus[!!-~]3.dck -text -res/quest/decks/Mr[!!-~]Slate[!!-~]2.dck -text -res/quest/decks/Mr[!!-~]Slate[!!-~]3.dck -text -res/quest/decks/Nagini[!!-~]2.dck -text -res/quest/decks/Napoleon[!!-~]3.dck -text -res/quest/decks/Ned[!!-~]Flanders[!!-~]1.dck -text -res/quest/decks/Ned[!!-~]Flanders[!!-~]2.dck -text -res/quest/decks/Ned[!!-~]Flanders[!!-~]3.dck -text -res/quest/decks/Ned[!!-~]Flanders[!!-~]4.dck -text -res/quest/decks/Neo[!!-~]3.dck -text -res/quest/decks/Newton[!!-~]3.dck -text -res/quest/decks/Oberon[!!-~]1.dck -text -res/quest/decks/Oberon[!!-~]2.dck -text -res/quest/decks/Oberon[!!-~]3.dck -text -res/quest/decks/Odin[!!-~]3.dck -text -res/quest/decks/Optimus[!!-~]Prime[!!-~]3.dck -text -res/quest/decks/Pebbles[!!-~]Flintstone[!!-~]2.dck -text -res/quest/decks/Pebbles[!!-~]Flintstone[!!-~]3.dck -text -res/quest/decks/Picard[!!-~]3.dck -text -res/quest/decks/Pinky[!!-~]and[!!-~]the[!!-~]Brain[!!-~]2.dck -text -res/quest/decks/Pointy[!!-~]Haired[!!-~]Boss[!!-~]3.dck -text -res/quest/decks/Princess[!!-~]Selenia[!!-~]1.dck -text -res/quest/decks/Professor[!!-~]X[!!-~]2.dck -text -res/quest/decks/Professor[!!-~]X[!!-~]3.dck -text -res/quest/decks/R2-D2[!!-~]3.dck -text -res/quest/decks/Radagast[!!-~]2.dck -text -res/quest/decks/Radiant[!!-~]3.dck -text -res/quest/decks/Ratbert[!!-~]2.dck -text -res/quest/decks/Redwall[!!-~]2.dck -text -res/quest/decks/Riddler[!!-~]3.dck -text -res/quest/decks/Riddler[!!-~]4.dck -text -res/quest/decks/Rocky[!!-~]1.dck -text -res/quest/decks/Rocky[!!-~]2.dck -text -res/quest/decks/Rocky[!!-~]3.dck -text -res/quest/decks/Rogue[!!-~]3.dck -text -res/quest/decks/Samantha[!!-~]Stephens[!!-~]1.dck -text -res/quest/decks/Samantha[!!-~]Stephens[!!-~]2.dck -text -res/quest/decks/Samantha[!!-~]Stephens[!!-~]3.dck -text -res/quest/decks/Samantha[!!-~]Stephens[!!-~]4.dck -text -res/quest/decks/Samwise[!!-~]Gamgee[!!-~]2.dck -text -res/quest/decks/Samwise[!!-~]Gamgee[!!-~]3.dck -text -res/quest/decks/Saruman[!!-~]2.dck -text -res/quest/decks/Saruman[!!-~]3.dck -text -res/quest/decks/Sauron[!!-~]2.dck -text -res/quest/decks/Scooby[!!-~]Doo[!!-~]3.dck -text -res/quest/decks/Scotty[!!-~]2.dck -text -res/quest/decks/Seabiscuit[!!-~]1.dck -text -res/quest/decks/Seabiscuit[!!-~]2.dck -text -res/quest/decks/Seabiscuit[!!-~]3.dck -text -res/quest/decks/Secret[!!-~]Squirrel[!!-~]3.dck -text -res/quest/decks/Sherlock[!!-~]Holmes[!!-~]1.dck -text -res/quest/decks/Sherlock[!!-~]Holmes[!!-~]2.dck -text -res/quest/decks/Sherlock[!!-~]Holmes[!!-~]3.dck -text -res/quest/decks/Shrek[!!-~]1.dck -text -res/quest/decks/Silver[!!-~]Samurai[!!-~]2.dck -text -res/quest/decks/Silver[!!-~]Surfer[!!-~]3.dck -text -res/quest/decks/Spiderman[!!-~]2.dck -text -res/quest/decks/Spiderman[!!-~]3.dck -text -res/quest/decks/Spock[!!-~]2.dck -text -res/quest/decks/Storm[!!-~]1.dck -text -res/quest/decks/Storm[!!-~]2.dck -text -res/quest/decks/Storm[!!-~]3.dck -text -res/quest/decks/Sun[!!-~]Quan[!!-~]2.dck -text -res/quest/decks/Superman[!!-~]3.dck -text -res/quest/decks/Tarzan[!!-~]1.dck -text -res/quest/decks/Tarzan[!!-~]2.dck -text -res/quest/decks/Terminator[!!-~]3.dck -text -res/quest/decks/The[!!-~]Great[!!-~]Gazoo[!!-~]3.dck -text -res/quest/decks/Tom[!!-~]Bombadil[!!-~]3.dck -text -res/quest/decks/Totoro[!!-~]2.dck -text -res/quest/decks/Treebeard[!!-~]1.dck -text -res/quest/decks/Treebeard[!!-~]2.dck -text -res/quest/decks/Treebeard[!!-~]3.dck -text -res/quest/decks/Uncle[!!-~]Owen[!!-~]3.dck -text -res/quest/decks/Walle[!!-~]2.dck -text -res/quest/decks/Wally[!!-~]3.dck -text -res/quest/decks/White[!!-~]Knight[!!-~]1.dck -text -res/quest/decks/White[!!-~]Knight[!!-~]2.dck -text -res/quest/decks/White[!!-~]Knight[!!-~]3.dck -text -res/quest/decks/Wilma[!!-~]Flintstone[!!-~]1.dck -text -res/quest/decks/Wilma[!!-~]Flintstone[!!-~]2.dck -text -res/quest/decks/Wilma[!!-~]Flintstone[!!-~]3.dck -text -res/quest/decks/Wolverine[!!-~]3.dck -text -res/quest/decks/Wonder[!!-~]Woman[!!-~]2.dck -text -res/quest/decks/Wyatt[!!-~]Earp[!!-~]1.dck -text -res/quest/decks/Wyatt[!!-~]Earp[!!-~]2.dck -text -res/quest/decks/Wyatt[!!-~]Earp[!!-~]3.dck -text -res/quest/decks/quest1.dck -text -res/quest/decks/quest10.dck -text -res/quest/decks/quest11.dck -text -res/quest/decks/quest12.dck -text -res/quest/decks/quest13.dck -text -res/quest/decks/quest14.dck -text -res/quest/decks/quest15.dck -text -res/quest/decks/quest16.dck -text -res/quest/decks/quest17.dck -text -res/quest/decks/quest18.dck -text -res/quest/decks/quest19.dck -text -res/quest/decks/quest2.dck -text -res/quest/decks/quest20.dck -text -res/quest/decks/quest21.dck -text -res/quest/decks/quest22.dck -text -res/quest/decks/quest3.dck -text -res/quest/decks/quest4.dck -text -res/quest/decks/quest5.dck -text -res/quest/decks/quest6.dck -text -res/quest/decks/quest7.dck -text -res/quest/decks/quest8.dck -text -res/quest/decks/quest9.dck -text -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.preferences -text -res/quest/quest.properties -text svneol=native#text/plain -res/quest/quests.txt -text svneol=native#text/plain -res/quest/themes/-1[!!-~]-1[!!-~]Counters[!!-~]BG.thm -text -res/quest/themes/Anti[!!-~]Black[!!-~]WB.thm -text -res/quest/themes/Anti[!!-~]Black[!!-~]WG.thm -text -res/quest/themes/Anti[!!-~]Red[!!-~]WR.thm -text -res/quest/themes/Arcane[!!-~]Spirits[!!-~]UBG.thm -text -res/quest/themes/Artifacts[!!-~]Colorless.thm -text -res/quest/themes/Auras[!!-~]WRG.thm -text -res/quest/themes/Ball[!!-~]Lightning[!!-~]R.thm -text -res/quest/themes/Black[!!-~]Vise[!!-~]UB.thm -text -res/quest/themes/Burn[!!-~]R.thm -text -res/quest/themes/Clerics[!!-~]WB.thm -text -res/quest/themes/Dermageddon[!!-~]WG.thm -text -res/quest/themes/Domain.thm -text -res/quest/themes/Double[!!-~]Strike[!!-~]WR.thm -text -res/quest/themes/Elves[!!-~]G.thm -text -res/quest/themes/Enchantments[!!-~]WG.thm -text -res/quest/themes/Equipment[!!-~]W.thm -text -res/quest/themes/Exalted[!!-~]WUG.thm -text -res/quest/themes/Flying[!!-~]W.thm -text -res/quest/themes/Flying[!!-~]WR.thm -text -res/quest/themes/Flying[!!-~]WU.thm -text -res/quest/themes/Fungi[!!-~]and[!!-~]Saprolings[!!-~]WG.thm -text -res/quest/themes/Giants[!!-~]R.thm -text -res/quest/themes/Giants[!!-~]WR.thm -text -res/quest/themes/Goblins[!!-~]BR.thm -text -res/quest/themes/Goblins[!!-~]R.thm -text -res/quest/themes/Indestructibility[!!-~]WB.thm -text -res/quest/themes/Islandwalk[!!-~]U.thm -text -res/quest/themes/Kithkin[!!-~]W.thm -text -res/quest/themes/Landfall[!!-~]brG.thm -text -res/quest/themes/Lands[!!-~]WRG.thm -text -res/quest/themes/Legends[!!-~]WG.thm -text -res/quest/themes/Leyline[!!-~]of[!!-~]Singularity[!!-~]WUBRG.thm -text -res/quest/themes/Lifegain[!!-~]WBG.thm -text -res/quest/themes/Lorescale[!!-~]Coatl[!!-~]Urg.thm -text -res/quest/themes/Megrim[!!-~]UBR.thm -text -res/quest/themes/Merfolk[!!-~]U.thm -text -res/quest/themes/Milling[!!-~]UB.thm -text -res/quest/themes/Mono[!!-~]Black.thm -text -res/quest/themes/Mono[!!-~]Green.thm -text -res/quest/themes/Mono[!!-~]White.thm -text -res/quest/themes/Multicolor[!!-~]BG.thm -text -res/quest/themes/Multicolor[!!-~]BR.thm -text -res/quest/themes/Multicolor[!!-~]RG.thm -text -res/quest/themes/Multicolor[!!-~]UB.thm -text -res/quest/themes/Multicolor[!!-~]UG.thm -text -res/quest/themes/Multicolor[!!-~]UR.thm -text -res/quest/themes/Multicolor[!!-~]WB.thm -text -res/quest/themes/Multicolor[!!-~]WR.thm -text -res/quest/themes/Naya[!!-~]WRG.thm -text -res/quest/themes/Oath[!!-~]of[!!-~]Druids[!!-~]WG.thm -text -res/quest/themes/Pingers[!!-~]UR.thm -text -res/quest/themes/Rats[!!-~]B.thm -text -res/quest/themes/Reanimator[!!-~]B.thm -text -res/quest/themes/Sacrifice[!!-~]uBr.thm -text -res/quest/themes/Snakes[!!-~]G.thm -text -res/quest/themes/Snow[!!-~]UBRG.thm -text -res/quest/themes/Soldiers[!!-~]W.thm -text -res/quest/themes/Swampwalk[!!-~]BG.thm -text -res/quest/themes/Tap[!!-~]and[!!-~]Destroy[!!-~]WB.thm -text -res/quest/themes/The[!!-~]Rack[!!-~]B.thm -text -res/quest/themes/Treefolk[!!-~]WBG.thm -text -res/quest/themes/Underworld[!!-~]Dreams[!!-~]BUR.thm -text -res/quest/themes/Vampires[!!-~]B.thm -text -res/quest/themes/Vigilance[!!-~]Meekstone[!!-~]W.thm -text -res/quest/themes/White.thm -text -res/quest/themes/Wolves[!!-~]WG.thm -text -res/quest/themes/Zombies[!!-~]B.thm -text -res/quest/veryhard.txt -text svneol=native#text/plain -res/reprintSetInfo.py svneol=native#text/x-python -res/setInfoScript.py svneol=native#text/x-python -res/sound/tap.mp3 -text svneol=unset#audio/mpeg -src/arcane/ui/CardArea.java svneol=native#text/plain -src/arcane/ui/CardPanel.java svneol=native#text/plain -src/arcane/ui/CardPanelContainer.java svneol=native#text/plain -src/arcane/ui/HandArea.java svneol=native#text/plain -src/arcane/ui/PlayArea.java svneol=native#text/plain -src/arcane/ui/ScaledImagePanel.java svneol=native#text/plain -src/arcane/ui/ViewPanel.java svneol=native#text/plain -src/arcane/ui/util/Animation.java svneol=native#text/plain -src/arcane/ui/util/CardPanelMouseListener.java svneol=native#text/plain -src/arcane/ui/util/GlowText.java svneol=native#text/plain -src/arcane/ui/util/ImageUtil.java svneol=native#text/plain -src/arcane/ui/util/ManaSymbols.java svneol=native#text/plain -src/arcane/ui/util/UI.java svneol=native#text/plain -src/arcane/util/MultiplexOutputStream.java svneol=native#text/plain -src/arcane/util/Util.java svneol=native#text/plain -src/forge/AIPlayer.java svneol=native#text/plain -src/forge/AllZone.java svneol=native#text/plain -src/forge/AllZoneUtil.java svneol=native#text/plain -src/forge/Base64Coder.java svneol=native#text/plain -src/forge/BoosterDraft.java svneol=native#text/plain -src/forge/BoosterDraftAI.java svneol=native#text/plain -src/forge/BoosterGenerator.java svneol=native#text/plain -src/forge/ButtonUtil.java svneol=native#text/plain -src/forge/Card.java svneol=native#text/plain -src/forge/CardContainer.java svneol=native#text/plain -src/forge/CardFilter.java 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 svneol=native#text/plain -src/forge/CardUtil.java -text svneol=native#text/plain -src/forge/Card_Color.java svneol=native#text/plain -src/forge/Color.java svneol=native#text/plain -src/forge/Combat.java svneol=native#text/plain -src/forge/CombatUtil.java svneol=native#text/plain -src/forge/Command.java svneol=native#text/plain -src/forge/CommandArgs.java svneol=native#text/plain -src/forge/CommandList.java svneol=native#text/plain -src/forge/CommandReturn.java svneol=native#text/plain -src/forge/Computer.java svneol=native#text/plain -src/forge/ComputerAI_General.java svneol=native#text/plain -src/forge/ComputerAI_Input.java svneol=native#text/plain -src/forge/ComputerUtil.java svneol=native#text/plain -src/forge/ComputerUtil_Attack2.java svneol=native#text/plain -src/forge/ComputerUtil_Block2.java svneol=native#text/plain -src/forge/Constant.java svneol=native#text/plain -src/forge/CopyFiles.java svneol=native#text/plain -src/forge/Counters.java svneol=native#text/plain -src/forge/DefaultPlayerZone.java svneol=native#text/plain -src/forge/Display.java svneol=native#text/plain -src/forge/EndOfCombat.java svneol=native#text/plain -src/forge/EndOfTurn.java svneol=native#text/plain -src/forge/ExternalPanel.java svneol=native#text/plain -src/forge/FileFinder.java svneol=native#text/plain -src/forge/FileUtil.java svneol=native#text/plain -src/forge/GUI_DeckAnalysis.java svneol=native#text/plain -src/forge/GUI_Filter.java svneol=native#text/plain -src/forge/GUI_ImportPicture.java svneol=native#text/plain -src/forge/GUI_Quest_Filter.java svneol=native#text/plain -src/forge/GameAction.java svneol=native#text/plain -src/forge/GameActionUtil.java -text svneol=native#text/plain -src/forge/GameInfo.java svneol=native#text/plain -src/forge/GuiDisplay4.java 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 svneol=native#text/plain -src/forge/Gui_DeckEditor.java svneol=native#text/plain -src/forge/Gui_DeckEditor_Menu.java svneol=native#text/plain -src/forge/Gui_DownloadPictures_LQ.java svneol=native#text/plain -src/forge/Gui_DownloadPrices.java svneol=native#text/plain -src/forge/Gui_DownloadSetPictures_LQ.java svneol=native#text/plain -src/forge/Gui_MigrateLocalMWSSetPictures_HQ.java svneol=native#text/plain -src/forge/Gui_NewGame.java svneol=native#text/plain -src/forge/Gui_QuestOptions.java svneol=native#text/plain -src/forge/Gui_Quest_DeckEditor.java svneol=native#text/plain -src/forge/Gui_Quest_DeckEditor_Menu.java svneol=native#text/plain -src/forge/Gui_WinLose.java svneol=native#text/plain -src/forge/HandSizeOp.java svneol=native#text/plain -src/forge/HumanPlayer.java svneol=native#text/plain -src/forge/ImageCache.java svneol=native#text/plain -src/forge/ImagePreviewPanel.java svneol=native#text/plain -src/forge/MagicStack.java svneol=native#text/plain -src/forge/MenuItem_HowToPlay.java svneol=native#text/plain -src/forge/Move.java svneol=native#text/plain -src/forge/MyButton.java svneol=native#text/plain -src/forge/MyObservable.java svneol=native#text/plain -src/forge/MyRandom.java svneol=native#text/plain -src/forge/NameChanger.java svneol=native#text/plain -src/forge/Phase.java svneol=native#text/plain -src/forge/PhaseUtil.java svneol=native#text/plain -src/forge/Player.java svneol=native#text/plain -src/forge/PlayerUtil.java svneol=native#text/plain -src/forge/PlayerZone.java svneol=native#text/plain -src/forge/PlayerZone_ComesIntoPlay.java svneol=native#text/plain -src/forge/Quest_Assignment.java svneol=native#text/plain -src/forge/ReadBoosterPack.java svneol=native#text/plain -src/forge/ReadDraftBoosterPack.java svneol=native#text/plain -src/forge/ReadPriceList.java svneol=native#text/plain -src/forge/ReadQuest_Assignment.java svneol=native#text/plain -src/forge/SetInfo.java svneol=native#text/plain -src/forge/SetInfoUtil.java svneol=native#text/plain -src/forge/SimpleCombat.java svneol=native#text/plain -src/forge/StaticEffect.java svneol=native#text/plain -src/forge/StaticEffects.java svneol=native#text/plain -src/forge/TableModel.java svneol=native#text/plain -src/forge/TableSorter.java svneol=native#text/plain -src/forge/Time.java svneol=native#text/plain -src/forge/UndoCommand.java svneol=native#text/plain -src/forge/ZCTrigger.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_AlterLife.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Animate.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_ChangeZone.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Choose.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Clash.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Cleanup.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Combat.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Copy.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_CounterMagic.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Counters.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_DealDamage.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Debuff.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_DelayedTrigger.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Destroy.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Effect.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_EndGameCondition.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_GainControl.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Mana.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_PermanentState.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_PreventDamage.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Pump.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Regenerate.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Reveal.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Sacrifice.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Token.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Turns.java svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_ZoneAffecting.java svneol=native#text/plain -src/forge/card/cardFactory/CardFactoryUtil.java svneol=native#text/plain -src/forge/card/cardFactory/CardFactory_Auras.java -text svneol=native#text/plain -src/forge/card/cardFactory/CardFactory_Creatures.java -text svneol=native#text/plain -src/forge/card/cardFactory/CardFactory_Equipment.java svneol=native#text/plain -src/forge/card/cardFactory/CardFactory_Instants.java svneol=native#text/plain -src/forge/card/cardFactory/CardFactory_Lands.java svneol=native#text/plain -src/forge/card/cardFactory/CardFactory_Planeswalkers.java svneol=native#text/plain -src/forge/card/cardFactory/CardFactory_Sorceries.java -text svneol=native#text/plain -src/forge/card/mana/Mana.java svneol=native#text/plain -src/forge/card/mana/ManaCost.java svneol=native#text/plain -src/forge/card/mana/ManaPool.java svneol=native#text/plain -src/forge/card/mana/Mana_Part.java svneol=native#text/plain -src/forge/card/mana/Mana_PartColor.java svneol=native#text/plain -src/forge/card/mana/Mana_PartColorless.java svneol=native#text/plain -src/forge/card/mana/Mana_PartPhyrexian.java svneol=native#text/plain -src/forge/card/mana/Mana_PartSnow.java svneol=native#text/plain -src/forge/card/mana/Mana_PartSplit.java svneol=native#text/plain -src/forge/card/spellability/Ability.java svneol=native#text/plain -src/forge/card/spellability/Ability_Activated.java svneol=native#text/plain -src/forge/card/spellability/Ability_Mana.java svneol=native#text/plain -src/forge/card/spellability/Ability_Static.java svneol=native#text/plain -src/forge/card/spellability/Ability_Sub.java svneol=native#text/plain -src/forge/card/spellability/Ability_Triggered.java svneol=native#text/plain -src/forge/card/spellability/Cost.java svneol=native#text/plain -src/forge/card/spellability/Cost_Payment.java svneol=native#text/plain -src/forge/card/spellability/Spell.java svneol=native#text/plain -src/forge/card/spellability/SpellAbility.java svneol=native#text/plain -src/forge/card/spellability/SpellAbilityList.java svneol=native#text/plain -src/forge/card/spellability/SpellAbility_Condition.java svneol=native#text/plain -src/forge/card/spellability/SpellAbility_Requirements.java svneol=native#text/plain -src/forge/card/spellability/SpellAbility_Restriction.java svneol=native#text/plain -src/forge/card/spellability/SpellAbility_StackInstance.java svneol=native#text/plain -src/forge/card/spellability/SpellAbility_Variables.java svneol=native#text/plain -src/forge/card/spellability/Spell_Permanent.java svneol=native#text/plain -src/forge/card/spellability/Target.java svneol=native#text/plain -src/forge/card/spellability/Target_Choices.java svneol=native#text/plain -src/forge/card/spellability/Target_Selection.java svneol=native#text/plain -src/forge/card/trigger/Trigger.java svneol=native#text/plain -src/forge/card/trigger/TriggerHandler.java svneol=native#text/plain -src/forge/card/trigger/Trigger_AttackerBlocked.java svneol=native#text/plain -src/forge/card/trigger/Trigger_AttackerUnblocked.java svneol=native#text/plain -src/forge/card/trigger/Trigger_Attacks.java svneol=native#text/plain -src/forge/card/trigger/Trigger_Blocks.java svneol=native#text/plain -src/forge/card/trigger/Trigger_ChangesZone.java svneol=native#text/plain -src/forge/card/trigger/Trigger_Clashed.java svneol=native#text/plain -src/forge/card/trigger/Trigger_CounterAdded.java svneol=native#text/plain -src/forge/card/trigger/Trigger_Cycled.java svneol=native#text/plain -src/forge/card/trigger/Trigger_DamageDone.java svneol=native#text/plain -src/forge/card/trigger/Trigger_Discarded.java svneol=native#text/plain -src/forge/card/trigger/Trigger_Drawn.java svneol=native#text/plain -src/forge/card/trigger/Trigger_LandPlayed.java svneol=native#text/plain -src/forge/card/trigger/Trigger_LifeGained.java svneol=native#text/plain -src/forge/card/trigger/Trigger_LifeLost.java svneol=native#text/plain -src/forge/card/trigger/Trigger_Phase.java svneol=native#text/plain -src/forge/card/trigger/Trigger_Sacrificed.java svneol=native#text/plain -src/forge/card/trigger/Trigger_Shuffled.java svneol=native#text/plain -src/forge/card/trigger/Trigger_SpellAbilityCast.java svneol=native#text/plain -src/forge/card/trigger/Trigger_Taps.java svneol=native#text/plain -src/forge/card/trigger/Trigger_TapsForMana.java svneol=native#text/plain -src/forge/card/trigger/Trigger_TurnFaceUp.java svneol=native#text/plain -src/forge/card/trigger/Trigger_Unequip.java svneol=native#text/plain -src/forge/card/trigger/Trigger_Untaps.java svneol=native#text/plain -src/forge/deck/Deck.java svneol=native#text/plain -src/forge/deck/DeckManager.java svneol=native#text/plain -src/forge/deck/DownloadDeck.java svneol=native#text/plain -src/forge/deck/generate/Generate2ColorDeck.java svneol=native#text/plain -src/forge/deck/generate/Generate3ColorDeck.java svneol=native#text/plain -src/forge/deck/generate/GenerateConstructedDeck.java svneol=native#text/plain -src/forge/deck/generate/GenerateConstructedMultiColorDeck.java svneol=native#text/plain -src/forge/deck/generate/GenerateThemeDeck.java svneol=native#text/plain -src/forge/error/ErrorViewer.java svneol=native#text/plain -src/forge/error/ExceptionHandler.java svneol=native#text/plain -src/forge/gui/ForgeAction.java svneol=native#text/plain -src/forge/gui/GuiUtils.java svneol=native#text/plain -src/forge/gui/ListChooser.java svneol=native#text/plain -src/forge/gui/MultiLineLabel.java svneol=native#text/plain -src/forge/gui/MultiLineLabelUI.java svneol=native#text/plain -src/forge/gui/game/CardDetailPanel.java svneol=native#text/plain -src/forge/gui/game/CardPanel.java svneol=native#text/plain -src/forge/gui/game/CardPicturePanel.java svneol=native#text/plain -src/forge/gui/input/Input.java svneol=native#text/plain -src/forge/gui/input/InputControl.java svneol=native#text/plain -src/forge/gui/input/Input_Attack.java svneol=native#text/plain -src/forge/gui/input/Input_Block.java svneol=native#text/plain -src/forge/gui/input/Input_Cleanup.java svneol=native#text/plain -src/forge/gui/input/Input_Mulligan.java svneol=native#text/plain -src/forge/gui/input/Input_PassPriority.java svneol=native#text/plain -src/forge/gui/input/Input_PayManaCost.java svneol=native#text/plain -src/forge/gui/input/Input_PayManaCostUtil.java svneol=native#text/plain -src/forge/gui/input/Input_PayManaCost_Ability.java svneol=native#text/plain -src/forge/properties/ForgePreferences.java svneol=native#text/plain -src/forge/properties/ForgeProps.java svneol=native#text/plain -src/forge/properties/NewConstants.java svneol=native#text/plain -src/forge/properties/Preferences.java svneol=native#text/plain -src/forge/properties/SavePreferencesListener.java svneol=native#text/plain -src/forge/quest/data/QuestBattleManager.java svneol=native#text/plain -src/forge/quest/data/QuestBoosterPack.java svneol=native#text/plain -src/forge/quest/data/QuestData.java svneol=native#text/plain -src/forge/quest/data/QuestDataIO.java svneol=native#text/plain -src/forge/quest/data/QuestMatchState.java svneol=native#text/plain -src/forge/quest/data/QuestPreferences.java svneol=native#text/plain -src/forge/quest/data/QuestUtil.java svneol=native#text/plain -src/forge/quest/data/bazaar/QuestStallDefinition.java svneol=native#text/plain -src/forge/quest/data/bazaar/QuestStallManager.java svneol=native#text/plain -src/forge/quest/data/bazaar/QuestStallPurchasable.java svneol=native#text/plain -src/forge/quest/data/item/QuestInventory.java svneol=native#text/plain -src/forge/quest/data/item/QuestItemAbstract.java svneol=native#text/plain -src/forge/quest/data/item/QuestItemElixir.java svneol=native#text/plain -src/forge/quest/data/item/QuestItemEstates.java svneol=native#text/plain -src/forge/quest/data/item/QuestItemLuckyCoin.java svneol=native#text/plain -src/forge/quest/data/item/QuestItemMap.java svneol=native#text/plain -src/forge/quest/data/item/QuestItemSleight.java svneol=native#text/plain -src/forge/quest/data/item/QuestItemZeppelin.java svneol=native#text/plain -src/forge/quest/data/pet/QuestPetAbstract.java svneol=native#text/plain -src/forge/quest/data/pet/QuestPetBird.java svneol=native#text/plain -src/forge/quest/data/pet/QuestPetCrocodile.java svneol=native#text/plain -src/forge/quest/data/pet/QuestPetHound.java svneol=native#text/plain -src/forge/quest/data/pet/QuestPetManager.java svneol=native#text/plain -src/forge/quest/data/pet/QuestPetPlant.java svneol=native#text/plain -src/forge/quest/data/pet/QuestPetWolf.java svneol=native#text/plain -src/forge/quest/gui/QuestAbstractPanel.java svneol=native#text/plain -src/forge/quest/gui/QuestFrame.java svneol=native#text/plain -src/forge/quest/gui/bazaar/QuestBazaarItem.java svneol=native#text/plain -src/forge/quest/gui/bazaar/QuestBazaarPanel.java svneol=native#text/plain -src/forge/quest/gui/bazaar/QuestBazaarStall.java svneol=native#text/plain -src/forge/quest/gui/main/QuestBattle.java svneol=native#text/plain -src/forge/quest/gui/main/QuestMainPanel.java svneol=native#text/plain -src/forge/quest/gui/main/QuestQuest.java svneol=native#text/plain -src/forge/quest/gui/main/QuestSelectablePanel.java svneol=native#text/plain -src/treeProperties/PropertyElement.java svneol=native#text/plain -src/treeProperties/PropertyType.java svneol=native#text/plain -src/treeProperties/TreeProperties.java svneol=native#text/plain -src/treeProperties/types/FileType.java svneol=native#text/plain diff --git a/CHANGES.txt b/CHANGES.txt deleted file mode 100644 index 30eabb6f53b..00000000000 --- a/CHANGES.txt +++ /dev/null @@ -1,182 +0,0 @@ -Forge Beta: 0#-##-2011 ver 1.1.# - -(Quest icons used created by Teekatas, from his Legendora set - -http://raindropmemory.deviantart.com) - -#### cards in total. - - -A new bug reporting system based on Mantis is being developed. When Forge crashes a new report form will appear that will allow you to send in a detailed bug report. - -We would like to remove the old "Current Known Bugs" list topic on the forum. While this topic has been useful over the last two years it may be time to try another approach. - -In the future bugs and other issues will be reported with the Bug Report form, the Mantis based Cardforge Issue Tracker or by posting a message on the then current forge beta release topic at CCGH. - - -We have changed the archiving format to ".tar.bz2". There are utilities for Windows, Mac OS and the various *nix's that can be used to decompress these archives. - - -The Mac OS application version: - -We have packaged the Forge ##-##-2011 BETA version as a Mac OS application. You can double click the Forge.app icon to launch the forge application on your Apple computer running Mac OS. This application will automatically increase the java heap space memory for you as it launches. This version does not require the forge.command file and it does not need to start the Terminal application as part of the start up process. - -You can move a copy of your pictures and decks over to the Forge.app application. Right click or control click on the Forge.app icon. Select Show Package Contents form the contextual menu. A Finder window will open and will display a folder named Contents. Navigate to the folder: - -/Contents/Resources/Java/res/ - -Your decks can be placed in the decks folder, your pics can be placed in the pics folder, etc. - - -Fixes/Features: - -- Some cleanup in Card.java -- Changed usage of outdated Card.abilityUsed in most circumstances. -- Removed last beta's material from changes.txt. -- Restored setAbilityUsed. -- Updated some SVars. -- Added an easy and a medium version of the Odin deck. -- Added Gambit 2 deck to quest mode. -- AF_CopySpell wasn't setting Activation Player causing an NPE. -- Bugfix for non-GainControl Auras having Leave Play Command. -- Initial code for Attaching Auras that ETB Indirectly (i.e. not Casting). -- Converted SearchRebel to AF now that Auras can be placed when Indirectly ETB. -- Convert Hokori to Script. -- Fixed bug in UntapUpTo for AI. -- Attach artifacts to build, add in ftp site. -- Add local repo for tests. -- Removed some non-Aura restrictions from some card scripts. -- [maven-release-plugin] prepare release forge-1.1.1-SNAPSHOT. -- [maven-release-plugin] rollback the release of forge-1.1.1-SNAPSHOT. -- Fixed Path to Exile. -- Update dev connection. -- Update dev connection. -- Move release plugin back to 2.1 to avoid 2.2 bug. -- Update git location. -- [maven-release-plugin] prepare release forge-1.1.1. -- [maven-release-plugin] prepare for next development iteration. -- Fixed problem with attached artifact. -- [maven-release-plugin] prepare release forge-1.1.2. -- [maven-release-plugin] prepare for next development iteration. -- [maven-release-plugin] rollback the release of forge-1.1.2. -- Fixed local repo. -- [maven-release-plugin] prepare release forge-1.1.2. -- [maven-release-plugin] rollback the release of forge-1.1.2. -- Rev pom.xml. -- [maven-release-plugin] prepare release forge-1.1.3. -- [maven-release-plugin] prepare for next development iteration. -- Fixed repo again. -- Fixed AI not playing Auras. -- Added the new Krypto 3 deck to quest mode. -- Added the recent commit logs to changes.txt. -- Reduced access to Card.setUniqueNumber, this should be auto-generated by new Card(). -- The AI will now prefer to use unenchanted mana sources before enchanted ones. -- try again with another local repo. -- [maven-release-plugin] prepare release forge-1.1.4 -- [maven-release-plugin] prepare for next development iteration. -- Bugfix issue88, Tokens can no longer Persist. "Flickering" tokens no longer causes an NPE. -- Ran set info script. -- Fixed Tar Fiend. -- Converted Xenograft to script. -- Added RememberMilled capability for AF_Mill. -- Added the new Krypto 2 deck to quest mode. -- Made a couple of adjustments to Krypto 2. -- Ran set info script. -- Added the recent commit logs to changes.txt. -- Made additional adjustments to Krypto 2. -- Converted Belbe's Portal to script. -- Converted Conspiracy to script. -- Rewrote most of ReadCard to support LazyCardFactory in the future. Tested and works OK with current default PreloadingCardFactory. -- Rename forge.ReadCard and forge.ReadCardTest to CardReader and CardReaderTestNG. -- Finished LazyCardFactory (for unit testing only) and related classes. -- Eliminated many CheckStyle, FindBugs, and PMD errors in forge.CardUtil, forge.card.cardFactory.AbstractCardFactory, forge.card.cardFactory.CardFactoryTest, forge.card.cardFactory.LazyCardFactory, and net.slightlymagic.braids.util.NotImplementedError. -- Fixed conflicts in AbstractCardFactory.java. -- Cleanup. -- Ran set info script. -- Replaced the white dungeon special quest deck. -- Added the recent commit logs to changes.txt. -- Fix to local ftp. -- [maven-release-plugin] prepare release forge-1.1.5. -- [maven-release-plugin] prepare for next development iteration. -- The AI can now pay non mana costs for triggered abilities (this was really easy). -- Rollback version number to 1.1.2. -- Fixed Engulfing Slagwurm. -- Fixed some more triggers that used attackerBlocked instead of blocked. -- Issue 73: add Eclipse project settings to reduce CheckStyle errors. -- Removed RemAIDeck from some cards the AI can now use. -- Fixed accidental edit of display_new_layout.xml. -- Fixed Oona's Blackguard. -- Fixed Dwarven Patrol. -- Mantis 88: Change Crash Report text to fit our new issue reporting process. Updated README.txt. Updated res/lang/en.properties. Provisionally updated res/lang/de.properties; still needs a native speaker to go over it. Updated res/main.properties, changing the forum URL to the how-to tinyURL and removing the email address entirely. Updated src/forge/error/ErrorViewer.java and src/forge/properties/NewConstants.java to be congruent with the above changes. -- Updated Java files to reduce messages produced by CheckStyle, FindBugs, and/or PMD. -- Added snapshot deployment. -- Fixed some checkstyle issues. -- Refactor - now works in WindowBuilder. -- Fixed Path of Peace. -- Added the recent commit logs to changes.txt. -- Ran set info script. -- Fixed Misfortune's Gain. -- Replaced the blue dungeon special quest. -- Cleanups. Quest filter now can use WindowBuilder. -- Cardshop and deckanalysis now use WindowBuilder. -- DeckEditor now works in WindowBuilder. -- Updated the King Kong 1 and 2 decks. -- Made the Samantha Stephens 1 deck a little less and the Rocky 1 deck a little more powerful. -- Update German language rendition of Crash Report to fluent level. Special thanks to silly freak. -- Added LICENSE to test/java/net/slightlymagic/braids/util/testng/. -- Changed DamgeDone ValidSource list delimiter to "," instead of space. -- Integrated Mantis Bug Reporting. -- Fixed Goblin Gaveleer. -- Equiping and enchanting will now renew the timestamp of a card. -- Update for last commit. -- gui_quest_deckeditor can now use WindowBuilder. -- gui_import picure can now use WindowBuilder. -- Removed ComputerUtil.canPayCost from non-trigger canPlayAI checks. This is checked elsewhere and currently may prevent the AI from using cascade and casting spells for free. -- Fixed Rakdos Carnarium. -- Fixed Hope and Glory (Thanks Sol). -- Fixed Whiplash Trap. -- Updated some SVars. -- Added support for granting static abilities to tokens. -- Replaced the colorless dungeon special quest. -- Some fixes for Pyromancer's Swath (still not completely correct). -- Fixed Pyromancer's Swath. -- Fixed High Market. -- Fixed Typo in AF Token. -- Move to maven standard directory. -- Move to standard maven directory. -- Fixed return value. -- Update javax.jaxrpc. -- Fixed site and checkstyle configration. -- Added the recent commit logs to changes.txt. -- Ran set info script. -- Added menu item to launch Bug Report Screen. -- Added Bug Report to Deck Editor menu. -- Use Maven source paths. -- Edited the quests.txt file, reduced wins needed by 20%. -- Edited the quests.txt file, added Sloth's deck descriptions. -- Edited the QuestMainPanel.nextQuestInWins() method, lowered wins needed to 20 and reduced the int mul by one. -- Added the recent commit logs to changes.txt. -- Added a new description to quest 6. -- Move. -- Fixed checkstyle for eclipse. -- Updated maven release plugin. -- Added placeholder for official revision identifier. -- Reverted "- Added placeholder for official revision identifier." -- Updated maven site plugin. fix output directories in eclipse. -- Updated tests to run better in Eclipse. -- Fixed test names. -- Fixed checkstyles, fixed unit tests, added unit tests. -- Removed obselete libs and build files. - - -Many people helped with this version. A special thank you goes out to them: - - - - -Added many cards, including: - - - - -end diff --git a/LICENSE.txt b/LICENSE.txt deleted file mode 100644 index 94a9ed024d3..00000000000 --- a/LICENSE.txt +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/README.txt b/README.txt deleted file mode 100644 index 9ab279f3008..00000000000 --- a/README.txt +++ /dev/null @@ -1,40 +0,0 @@ -Memory Issues: - -In the past, some people noticed java heap space errors and lengthy pauses. The memory requirements for Forge have increased over time. The default setting on your computer for the java heap space may not be enough to prevent the above problems. - -The technically proficient can launch the forge jar with an argument from the CLI. The argument "-Xmx512m" may work for computers with 1 Gig of memory. Computers with 2 Gigs or more of memory should be able to use "-Xmx1024m" as an argument. - -We have created several scripts that will launch the Forge jar with "-Xmx1024m" as an argument. People using Windows OS should double click the "forge.exe" file. People using Apple's Mac OS X should double click the "forge.command" file. People using one of the other *nix OS should double click the "forge.sh" file. - -The script file must be located in the same folder as the "run-forge.jar" file and the "run-forge.jar" file name can not be changed. Otherwise, the scripts will not work. - -If you have a low end machine you may find that the scripts above will prevent java heap space errors but will find that forge still runs very slowly at times. - -In this case you can try the following. Remove the background jpg picture from /res/images/ui/ folder. You can try using low quality pictures rather than the high quality pictures. Or you can try removing all of the jpg pictures from the pics folder. You can also try using the old style battlefield UI rather than the newer battlefield UI. - -We have changed the archiving format to ".tar.bz2" since this may help to store the file permissions for the Mac OS X launcher. The Windows launcher in this version does not require you to rename the forge JAR file to work properly. Please keep the forge JAR file name set to "run-forge.jar". - - -Card Picture Issues: - -The server which contained the high quality card pictures is now off line and these high quality card pictures are no longer available as a download from within the forge application. We apologize, but the current dev team do not maintain this server and this matter is out of our control. - -Some people are choosing to re-download all of the low quality card and card set pictures when they install the next version of forge. This consumes large amounts of bandwidth needlessly. - -The server containing the set pictures is limited to 30 gigs per month. At the current rate the server will hit the maximum of 30 gigs per month long before we reach the end of the month. Please be careful! - -When you install the new version of forge find the forge/res/pics/ folder. Either move it or copy and paste the pics folder over to the recently installed new version of forge. This way you will only have to download the pictures for the new cards. - -This should save enough bandwidth that everyone will be able to download the new set pictures from the cardforge server. We do appreciate your efforts to save bandwidth. Thank you. - - -Reporting Bugs: - -To report a bug with an official beta release, please follow the instructions at http://www.slightlymagic.net/wiki/Forge#I_think_I_found_a_bug_in_Forge._What_do_I_do.3F . - -To report a bug (1) with an alpha test, (2) with a nightly build, (3) with something compiled from the official Forge software repository, or (4) with the leading edge (formerly "SVN Bug Reports"), please do not submit your bugs to the forum. Instead, please follow the instructions at http://www.slightlymagic.net/wiki/How_to_File_a_Bug_Report_with_Mantis . - - -Our Lawyers Made Us Do This: - -This product includes software developed by the Indiana University Extreme! Lab (http://www.extreme.indiana.edu/). diff --git a/build/Forge.icns b/build/Forge.icns deleted file mode 100644 index 28c1597baf0..00000000000 Binary files a/build/Forge.icns and /dev/null differ diff --git a/build/backgroundImage.jpg b/build/backgroundImage.jpg deleted file mode 100644 index a25b8aee734..00000000000 Binary files a/build/backgroundImage.jpg and /dev/null differ diff --git a/build/create-dmg b/build/create-dmg deleted file mode 100755 index a9ce2067a4b..00000000000 --- a/build/create-dmg +++ /dev/null @@ -1,168 +0,0 @@ -#! /bin/bash - -# Create a read-only disk image of the contents of a folder -# -# Usage: make-diskimage -# -# -# -# -# - -set -e; - -function pure_version() { - echo '1.0.0.2' -} - -function version() { - echo "create-dmg $(pure_version)" -} - -function usage() { - version - echo "Creates a fancy DMG file." - echo "Usage: $(basename $0) options... image.dmg source_folder" - echo "All contents of source_folder will be copied into the disk image." - echo "Options:" - echo " --volname name" - echo " set volume name (displayed in the Finder sidebar and window title)" - echo " --background pic.png" - echo " set folder background image (provide png, gif, jpg)" - echo " --window-pos x y" - echo " set position the folder window" - echo " --window-size width height" - echo " set size of the folder window" - echo " --icon-size icon_size" - echo " set window icons size (up to 128)" - echo " --icon file_name x y" - echo " set position of the file's icon" - echo " --custom-icon file_name custom_icon_or_sample_file x y" - echo " set position and custom icon" - echo " --version show tool version number" - echo " -h, --help display this help" - exit 0 -} - -WINX=10 -WINY=60 -WINW=600 -WINH=400 -ICON_SIZE=128 - -while test "${1:0:1}" = "-"; do - case $1 in - --volname) - VOLUME_NAME="$2" - shift; shift;; - --background) - BACKGROUND_FILE="$2" - BACKGROUND_FILE_NAME="$(basename $BACKGROUND_FILE)" - BACKGROUND_CLAUSE="set background picture of opts to file \".background:$BACKGROUND_FILE_NAME\"" - shift; shift;; - --icon-size) - ICON_SIZE="$2" - shift; shift;; - --window-pos) - WINX=$2; WINY=$3 - shift; shift; shift;; - --window-size) - WINW=$2; WINH=$3 - shift; shift; shift;; - --icon) - POSITION_CLAUSE="${POSITION_CLAUSE}set position of item \"$2\" to {$3, $4} -" - shift; shift; shift; shift;; - --custom-icon) - shift; shift; shift; shift; shift;; - -h | --help) - usage;; - --version) - version; exit 0;; - --pure-version) - pure_version; exit 0;; - -*) - echo "Unknown option $1. Run with --help for help." - exit 1;; - esac -done - -test -z "$2" && { - echo "Not enough arguments. Invoke with --help for help." - exit 1 -} - -DMG_PATH="$1" -DMG_DIRNAME="$(dirname "$DMG_PATH")" -DMG_DIR="$(cd $DMG_DIRNAME > /dev/null; pwd)" -DMG_NAME="$(basename "$DMG_PATH")" -DMG_TEMP_NAME="$DMG_DIR/rw.${DMG_NAME}" -SRC_FOLDER="$(cd "$2" > /dev/null; pwd)" -test -z "$VOLUME_NAME" && VOLUME_NAME="$(basename "$DMG_PATH" .dmg)" - -AUX_PATH="$(cd "$(dirname $0)"; pwd)/support" - -test -d "$AUX_PATH" || { - echo "Cannot find support directory: $AUX_PATH" - exit 1 -} - -# Create the image -echo "Creating disk image..." -test -f "${DMG_TEMP_NAME}" && rm -f "${DMG_TEMP_NAME}" -hdiutil create -srcfolder "$SRC_FOLDER" -volname "${VOLUME_NAME}" -fs HFS+ -fsargs "-c c=64,a=16,e=16" -format UDRW -size 300m "${DMG_TEMP_NAME}" - -# mount it -echo "Mounting disk image..." -MOUNT_DIR="/Volumes/${VOLUME_NAME}" -echo "Mount directory: $MOUNT_DIR" -DEV_NAME=$(hdiutil attach -readwrite -noverify -noautoopen "${DMG_TEMP_NAME}" | egrep '^/dev/' | sed 1q | awk '{print $1}') -echo "Device name: $DEV_NAME" - -#cp RightDS_Store "/Volumes/${VOLUME_NAME}/.DS_Store" - -if ! test -z "$BACKGROUND_FILE"; then - echo "Copying background file..." - test -d "$MOUNT_DIR/.background" || mkdir "$MOUNT_DIR/.background" - cp "$BACKGROUND_FILE" "$MOUNT_DIR/.background/$BACKGROUND_FILE_NAME" -fi - -# run applescript -APPLESCRIPT=$(mktemp -t createdmg) -cat "$AUX_PATH/template.applescript" | sed -e "s/WINX/$WINX/g" -e "s/WINY/$WINY/g" -e "s/WINW/$WINW/g" -e "s/WINH/$WINH/g" -e "s/BACKGROUND_CLAUSE/$BACKGROUND_CLAUSE/g" -e "s/ICON_SIZE/$ICON_SIZE/g" | perl -pe "s/POSITION_CLAUSE/$POSITION_CLAUSE/g" >"$APPLESCRIPT" - -echo "Running Applescript: ./AdiumApplescriptRunner \"${APPLESCRIPT}\" process_disk_image \"${VOLUME_NAME}\"" -"$AUX_PATH/AdiumApplescriptRunner" "${APPLESCRIPT}" process_disk_image "${VOLUME_NAME}" || true -echo "Done running the applescript..." -sleep 4 - -# make sure it's not world writeable -echo "Fixing permissions..." -chmod -Rf go-w "${MOUNT_DIR}" || true -echo "Done fixing permissions." - -# make the top window open itself on mount: -if [ -x /usr/local/bin/openUp ]; then - echo "Applying openUp..." - /usr/local/bin/openUp "${MOUNT_DIR}" -fi - -# unmount -echo "Unmounting disk image..." -hdiutil detach "${DEV_NAME}" - -# compress image -echo "Compressing disk image..." -hdiutil convert "${DMG_TEMP_NAME}" -format UDZO -imagekey zlib-level=9 -o "${DMG_DIR}/${DMG_NAME}" -rm -f "${DMG_TEMP_NAME}" - -# adding EULA resources -if [ ! -z "${EULA_RSRC}" -a "${EULA_RSRC}" != "-null-" ]; then - echo "adding EULA resources" - hdiutil unflatten "${DMG_DIR}/${DMG_NAME}" - /Developer/Tools/ResMerger -a "${EULA_RSRC}" -o "${DMG_DIR}/${DMG_NAME}" - hdiutil flatten "${DMG_DIR}/${DMG_NAME}" -fi - -echo "Disk image done" -exit 0 diff --git a/build/forge.ico b/build/forge.ico deleted file mode 100644 index 4605237f93d..00000000000 Binary files a/build/forge.ico and /dev/null differ diff --git a/build/forge.sh b/build/forge.sh deleted file mode 100755 index e6068616734..00000000000 --- a/build/forge.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -cd "`dirname \"$0\"`" -java -Xmx1024m -jar $project.build.finalName$ \ No newline at end of file diff --git a/build/support/AdiumApplescriptRunner b/build/support/AdiumApplescriptRunner deleted file mode 100755 index 4665eeece42..00000000000 Binary files a/build/support/AdiumApplescriptRunner and /dev/null differ diff --git a/build/support/template.applescript b/build/support/template.applescript deleted file mode 100644 index c12aad8a4bb..00000000000 --- a/build/support/template.applescript +++ /dev/null @@ -1,105 +0,0 @@ -on run -- for testing in script editor - process_disk_image("Adium X 1.0b20", "/Users/evands/adium-1.0/Release/Artwork") -end run - -on process_disk_image(volumeName) - tell application "Finder" - tell disk (volumeName as string) - open - - set theXOrigin to WINX - set theYOrigin to WINY - set theWidth to WINW - set theHeight to WINH - - set theBottomRightX to (theXOrigin + theWidth) - set theBottomRightY to (theYOrigin + theHeight) - set dsStore to "\"" & "/Volumes/" & volumeName & "/" & ".DS_STORE\"" - -- do shell script "rm " & dsStore - - tell container window - set current view to icon view - set toolbar visible to false - set statusbar visible to false - set the bounds to {theXOrigin, theYOrigin, theBottomRightX, theBottomRightY} - set statusbar visible to false - end tell - - set opts to the icon view options of container window - tell opts - set icon size to ICON_SIZE - set arrangement to not arranged - end tell - -- set background picture of opts to file ".background:background.png" - BACKGROUND_CLAUSE - - -- Positioning - POSITION_CLAUSE - -- set position of item "Adium.app" to {196, 273} - - -- Custom icons - -- my copyIconOfTo(artPath & "/ApplicationsIcon", "/Volumes/" & volumeName & "/Applications") - - -- Label colors - -- set label index of item "Adium.app" to 6 - -- set label index of item "License.txt" to 7 - -- set label index of item "Changes.txt" to 7 - -- set label index of item "Applications" to 4 - - update without registering applications - -- Force saving of the size - delay 1 - - tell container window - set statusbar visible to false - set the bounds to {theXOrigin, theYOrigin, theBottomRightX - 10, theBottomRightY - 10} - end tell - - update without registering applications - end tell - - delay 1 - - tell disk (volumeName as string) - tell container window - set statusbar visible to false - set the bounds to {theXOrigin, theYOrigin, theBottomRightX, theBottomRightY} - end tell - - update without registering applications - end tell - - --give the finder some time to write the .DS_Store file - delay 3 - - set waitTime to 0 - set ejectMe to false - repeat while ejectMe is false - delay 1 - set waitTime to waitTime + 1 - - if (do shell script "[ -f " & dsStore & " ]; echo $?") = "0" then set ejectMe to true - end repeat - log "waited " & waitTime & " seconds for .DS_STORE to be created." - end tell -end process_disk_image - -on copyIconOfTo(aFileOrFolderWithIcon, aFileOrFolder) - tell application "Finder" to set f to POSIX file aFileOrFolderWithIcon as alias - -- grab the file's icon - my CopyOrPaste(f, "c") - -- now the icon is in the clipboard - tell application "Finder" to set c to POSIX file aFileOrFolder as alias - my CopyOrPaste(result, "v") -end copyIconOfTo - -on CopyOrPaste(i, cv) - tell application "Finder" - activate - open information window of i - end tell - tell application "System Events" to tell process "Finder" to tell window 1 - keystroke tab -- select icon button - keystroke (cv & "w") using command down (* (copy or paste) + close window *) - end tell -- window 1 then process Finder then System Events -end CopyOrPaste \ No newline at end of file diff --git a/delete-me.txt b/delete-me.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/forge.properties b/forge.properties deleted file mode 100644 index 27f98ca1aab..00000000000 --- a/forge.properties +++ /dev/null @@ -1,46 +0,0 @@ -#properties-file for mtg forge - -##################### -## The file format ## -##################### - -# maybe you're familiar with property files. it's a simple way for key/value mappings: -# a line starting with '#' is a comment and is ignored. empty lines are also ignored -# other lines are interpreted as =. If you want to use special characters, -# you have to escape them, by prepending '\'. -# so for the key "contains'='", write "contains'\='", and for the key "contains'\'", write "contains'\\'" -# line breaks can be added as \n - - -# this file uses a slightly enhanced concept, including key suffixes. -# you can't use keys containing "--" for this reason: - -# a property ending with "--transparent-properties" results in the referenced properties-file being added - -# a property ending with "--properties" also result in adding, but the name used to add it is prepended. - -# assume a properties file: -# #example.properties -# property=value -# referencing it with -# example--properties=example.properties -# will result in the key "example/property". referencing it with -# example--transparent-properties=example.properties -# will result in the key "property". - -# the third suffix is "--file", and used to reference other files/directories needed in forge -# all paths specified, no matter what suffix, are relative to the current file and not neccessarily to this one - -# some substitutions are applied to a path. "$$" is replaced with "$", a "~/" or "~\" at the path's beginning is -# replaced with the user's home directory. a pattern like "${*}" ("*" being any string) is replaced with the -# system variable, for example, ${user.home} is (at the beginning) the same as "~" - -# all that said, the only thing of importance is that the keys do not change, and that all files are referenced -# correctly. the structure of your properties is not of relevance. you could also include all information in this -# file if you preserve the full keys. - - - -# this link includes the main properties file. you can move/rename etc. the res-folder. you just have to change -# this single line -main--transparent-properties=res/main.properties \ No newline at end of file diff --git a/pom.xml b/pom.xml deleted file mode 100644 index 4cb6835c8ef..00000000000 --- a/pom.xml +++ /dev/null @@ -1,875 +0,0 @@ - - 4.0.0 - - forge - forge - jar - Forge - 1.1.2-SNAPSHOT - - Forge lets you play the card game Magic: The Gathering against a computer opponent - using all of the rules. - - http://cardforge.org - - CardForge - http://cardforge.org - - 2007 - - Mantis - http://cardforge.org/bugz - - - - ISO-8859-1 - - - ISO-8859-1 - - - - - RobCashwalker - Rob Cashwalker - - owner - - - - DennisBergkamp - DennisBergkamp - - owner - - - - ChrisH - Chris H. - - developer - - - - Jendave - David Hudson - - developer - - - - slapshot5 - dennis.r.friedrichsen - - developer - - - - BraidsCC - Braids - - developer - - - - FriarSol - zenchristo - - developer - - - - Hellfish - keybone - - developer - - - - Sloth - deepsloth - - developer - - - - jeffwadsworth2010 - jeffwadsworth2010 - - developer - - - - 0soulstorm0 - 0soulstorm0 - - developer - - - - - - - GPL 3 - http://www.gnu.org/licenses/gpl-3.0-standalone.html - - - - - scm:git:ssh://git@gitorious.org/cardforge/cardforge.git - scm:git:ssh://git@gitorious.org/cardforge/cardforge.git - - - - 2.2.1 - - - - - Forge Forum - http://www.slightlymagic.net/forum/viewforum.php?f=26 - - - Forge Decks Forum - http://www.slightlymagic.net/forum/viewforum.php?f=48 - - - Forge Developer's Corner Forum - http://www.slightlymagic.net/forum/viewforum.php?f=52 - - - - - src - - - resources - - - test/java - - - test/resources - - - - - - org.apache.maven.wagon - wagon-ftp - 1.0 - - - - - - - maven-release-plugin - 2.2.1 - - - true - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.9 - - true - - - - com.google.code.maven-replacer-plugin - maven-replacer-plugin - 1.3.8 - - - package - - replace - - - - - build/forge.sh - - ${project.build.directory}/forge.sh - - false - - - $project.build.finalName$ - ${project.build.finalName}-jar-with-dependencies.jar - - - - - - maven-assembly-plugin - 2.2.1 - - - - jar-with-dependencies - - - - forge.Gui_NewGame - - - - - - make-assembly - - package - - - single - - - - - - - maven-compiler-plugin - 2.3.2 - - 1.6 - 1.6 - - - - - org.apache.maven.plugins - maven-source-plugin - 2.1.2 - - - - org.apache.maven.plugins - maven-deploy-plugin - 2.6 - - - - - - - - - org.apache.maven.plugins - maven-site-plugin - 3.0-beta-3 - - 8081 - - - - - - - - org.codehaus.mojo - build-helper-maven-plugin - 1.7 - - - released-version - - released-version - - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.8 - - true - false - false - package - package - - - - - - - - org.apache.maven.plugins - maven-antrun-plugin - 1.6 - - - - - org.eclipse.m2e - lifecycle-mapping - 1.0.0 - - - - - - - org.codehaus.mojo - - - build-helper-maven-plugin - - - [1.7,) - - - - released-version - - - - - - - - - - - - - - - - - - - - org.apache.maven.plugins - maven-project-info-reports-plugin - 2.4 - - false - false - - - - - index - plugins - summary - dependencies - project-team - mailing-list - cim - issue-tracking - license - - - - - - - org.apache.maven.plugins - maven-surefire-report-plugin - 2.9 - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.8 - - true - false - false - package - package - - - - - true - false - false - - - javadoc - - - - - - - org.apache.maven.plugins - maven-checkstyle-plugin - 2.6 - - ${basedir}/src/main/config/forge_checks.xml - - - - - org.apache.maven.plugins - maven-pmd-plugin - 2.5 - - true - utf-8 - 100 - 1.6 - - - - - org.apache.maven.plugins - maven-jxr-plugin - 2.3 - - true - - - - - org.codehaus.mojo - findbugs-maven-plugin - 2.3.2 - - - - org.codehaus.mojo - cobertura-maven-plugin - 2.5.1 - - - - org.apache.maven.plugins - maven-changelog-plugin - 2.2 - - - - org.codehaus.mojo - taglist-maven-plugin - 2.4 - - - - - - - todo - ignoreCase - - - FIXME - ignoreCase - - - deprecated - ignoreCase - - - - - - - - - - - - - com.miglayout - miglayout - 3.7.4 - - - com.mortennobel - java-image-scaling - 0.8.5 - - - com.google.guava - guava - r09 - - - com.thoughtworks.xstream - xstream - 1.3.1 - - - org.testng - testng - 6.1.1 - test - - - com.google.code.jyield - jyield - 1.0-SNAPSHOT - - - org.swinglabs - swingx - 1.6.1 - - - com.googlecode - minlog - 1.2 - - - org.java.net.substance - substance - 5.3 - - - org.mantisbt - mantisconnect-client-api - 1.1.1 - - - com.jgoodies - forms - 1.2.1 - - - javax.xml - jaxrpc-api - 1.1 - - - org.apache.axis - axis - 1.4 - - - org.apache.ant - ant-commons-logging - 1.8.2 - - - commons-discovery - commons-discovery - 20040218.194635 - - - axis - axis-wsdl4j - 1.5.1 - - - javax.activation - activation - 1.1.1 - - - javax.mail - mail - 1.4.1 - - - - - - forge-ftp-repository - Forge - ftp.cardforge.org/releases - - - forge-ftp-snapshot-repository - Forge - ftp.cardforge.org/snapshots - - - - - - arcane-maven-repo - Arcane Maven Repository - default - http://arcane.googlecode.com/svn/trunk/repository - - true - - - - - - - arcane-maven-repo - Arcane Maven Repository - default - http://arcane.googlecode.com/svn/trunk/repository - - true - - - - - - - - - windows-linux - - - - - - - - - - com.akathist.maven.plugins.launch4j - launch4j-maven-plugin - 1.3.3 - - - l4j-gui - package - - launch4j - - - gui - ${project.build.directory}/forge.exe - - ${project.build.finalName}-jar-with-dependencies.jar - - true - forge - ${basedir}/build/forge.ico - - forge.Gui_NewGame - false - anything - - - 1.6.0 - 1024 - - - ${releasedVersion.version}.0 - ${releasedVersion.version}.0 - Forge - Forge - ${releasedVersion.version}.0 - ${releasedVersion.version}.0 - Forge - forge - forge.exe - - - - - - - - maven-antrun-plugin - - - org.apache.ant - ant-nodeps - 1.7.1 - - - net.sourceforge.jarbundler - jarbundler - 2.2.0 - - - - - win-linux-app-bundle - package - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - run - - - - - - org.codehaus.mojo - build-helper-maven-plugin - 1.7 - - - attach-distribution - package - - attach-artifact - - - - - ${project.build.directory}/${project.build.finalName}.tar.bz2 - tar.bz2 - - - - - - - - - - - - "LICENSE.txt" - "CHANGES.txt" - "README.txt" - "Forge" - "Applications" - - osx - - - - - - - - - maven-antrun-plugin - - - org.apache.ant - ant-nodeps - 1.7.1 - - - net.sourceforge.jarbundler - jarbundler - 2.2.0 - - - - - osx-appbundle - package - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - run - - - - - - org.codehaus.mojo - build-helper-maven-plugin - 1.7 - - - attach-distribution-osx - package - - attach-artifact - - - - - ${project.build.directory}/${project.build.finalName}-osx.tar.bz2 - - tar.bz2 - osx - - - - - - - - - - - - - test-deploy - - - forge-ftp-repository-local - ftp://localhost/Users/dhudson/releases - - - forge-ftp-snapshot-repository-local - ftp://localhost/Users/dhudson/snapshots - - - - - diff --git a/res/AllTokens.txt b/res/AllTokens.txt deleted file mode 100644 index e9646041288..00000000000 --- a/res/AllTokens.txt +++ /dev/null @@ -1,836 +0,0 @@ -Angel -B -Creature Angel -3/3 -Flying - -Angel -W -Creature Angel -4/4 -Flying - -Ape -G -Creature Ape -2/2 - -Ape -G -Creature Ape -3/3 - -Assembly-Worker -C -Artifact Creature Assembly-Worker -2/2 - -Avatar -W -Creature Avatar -N/N -This creature's power and toughness are each equal to your life total. - -Bat -B -Creature Bat -1/1 -Flying - -Bat -B -Creature Bat -1/2 -"1B, Sacrifice this creature: Return an exiled card named Sengir Nosferatu to the battlefield under its owner's control." - -Bear -G -Creature Bear -2/2 - -Beast -G -Creature Beast -2/2 - -Beast -G -Creature Beast -3/3 - -Beast -G -Creature Beast -4/4 - -Beast -G -Creature Beast -5/5 - -Beast -R G W -Creature Beast -8/8 - -Bird -R -Creature Bird -4/4 -Flying - -Bird -U -Creature Bird -1/1 - -Bird -W -Creature Bird -1/1 -Flying - -Bird -W U -Creature Bird -1/1 -Flying - -Butterfly -G -Creature Insect -1/1 -Flying - -Camarid -U -Creature Camarid -1/1 - -Caribou -W -Creature Caribou -0/1 - -Carnivore -R -Creature Beast -3/1 - -Cat -B -Creature Cat -2/1 - -Cat -G -Creature Cat -1/1 - -Cat Warrior -G -Creature Cat Warrior -2/2 -Forestwalk - -Centaur -G -Creature Centaur -3/3 - -Centaur -G -Creature Centaur -3/3 -Protection from black - -Citizen -W -Creature Citizen -1/1 - -Demon -B -Creature Demon -X/X - -Deserter -W -Creature Deserter -0/1 - -Djinn -C -Artifact Creature Djinn -5/5 - -Dragon -R -Creature Dragon -4/4 -Flying - -Dragon -R -Creature Dragon -5/5 -Flying - -Dragon Spirit -U -Creature Dragon Spirit -5/5 -Flying - -Drake -U G -Creature Drake -2/2 -Flying - -Elemental -B R -Creature Elemental -5/5 - -Elemental -G -Creature Elemental -4/4 - -Elemental -G -Creature Elemental -7/7 -Trample - -Elemental -G -Creature Elemental -X/X - -Elemental -R -Creature Elemental -1/1 -Haste - -Elemental -R -Creature Elemental -3/1 - -Elemental -R -Creature Elemental -3/1 -Haste - -Elemental -R -Creature Elemental -3/3 - -Elemental -U -Creature Elemental -2/2 -Flying - -Elemental -U R -Creature Elemental -5/5 -Flying - -Elemental -W -Creature Elemental -4/4 -Flying - -Elemental Cat -R -Creature Elemental Cat -1/1 - -Elemental Shaman -R -Creature Elemental Shaman -3/1 - -Elephant -G -Creature Elephant -3/3 - -Elephant -G -Creature Elephant -N/N -This creature's power and toughness are each equal to the number of creature cards in its controller's graveyard. - -Elf Warrior -G -Creature Elf Warrior -1/1 - -Elf Warrior -G W -Creature Elf Warrior -1/1 - -Faerie -U -Creature Faerie -1/1 -Flying - -Faerie Rogue -B -Creature Faerie Rogue -1/1 -Flying - -Faerie Rogue -U B -Creature Faerie Rogue -1/1 -Flying - -Giant -R -Creature Giant -4/4 - -Giant Warrior -R G -Creature Giant Warrior -4/4 -Haste - -Giant Warrior -W -Creature Giant Warrior -5/5 - -Gnome -C -Artifact Creature Gnome -1/1 - -Goat -W -Creature Goat -0/1 - -Goblin -R -Creature Goblin -1/1 - -Goblin -R -Creature Goblin -1/1 -Haste - -Goblin -R -Creature Goblin -2/1 -Haste - -Goblin Rogue -B -Creature Goblin Rogue -1/1 - -Goblin Scout -R -Creature Goblin Scout -1/1 -Mountainwalk - -Goblin Soldier -R W -Creature Goblin Soldier -1/1 - -Goblin Warrior -R G -Creature Goblin Warrior -1/1 - -Graveborn -Creature Graveborn -B R -3/1 -Haste - -Griffin -W -Creature Griffin -2/2 -Flying - -Hippo -G -Creature Hippo -1/1 - -Homunculus -U -Artifact Creature -0/1 - -Hornet -C -Haste -1/1 -Flying - -Horror -B -Creature Horror -4/4 - -Hound -G -Creature Hound -1/1 - -Illusion -U -Creature Illusion -1/1 -Flying - -Insect -B -Creature Insect -0/1 - -Insect -G -Creature Insect -1/1 - -Insect -G -Creature Insect -6/1 -Shroud - -Kaldra -C -Legendary Creature Avatar -4/4 - -Kavu -B -Creature Kavu -3/3 - -Kelp -U -Creature Plant Wall -0/1 -Defender - -Kithkin Soldier -W -Creature Kithkin Soldier -1/1 - -Knight -B -Protection from white -2/2 -Flanking - -Knight -W -Creature Knight -1/1 -Banding - -Knight -W -Creature Knight -2/2 -First Strike - -Knight -W -Creature Knight -2/2 - -Kobolds of Kher Keep -R -Creature Kobold -0/1 - -Marit Lage -B -Indestructible -20/20 -Flying - -Merfolk Wizard -U -Creature Merfolk Wizard -1/1 - -Minion -B -Creature Minion -1/1 - -Minion -B -Creature Minion -X/X - -Minor Demon -B R -Creature Demon -1/1 - -Myr -C -Artifact Creature Myr -1/1 - -Ooze -G -Creature Ooze -X/X - -Orb -U -Creature Orb -X/X -Flying - -Pegasus -W -Creature Pegasus -1/1 -Flying - -Pentavite -C -Artifact Creature Pentavite -1/1 - -Pest -C -Artifact Creature Pest -0/1 - -Pincher -C -Creature Pincher -2/2 - -Plant Wall -G -Creature Plant Wall -0/1 -Defender - -Prism -C -Artifact Creature Prism -0/1 - -Rat -B -Creature Rat -1/1 - -Reflection -W -Creature Reflection -2/2 - -Reflection -W -Creature Reflection -X/X - -Sand -C -Creature Sand -1/1 - -Sand Warrior -R G W -Creature Sand Warrior -1/1 -"When a permanent name Hazezon Tamar isn't on the battlefield, exile this creature." - -Saproling -G -Creature Saproling -1/1 - -Saproling -G -Creature Saproling -N/N -This creature's power and toughness are each equal to the number of fade counters on Saproling Burst. - -Serf -B -Creature Serf -0/1 - -Shapeshifter -C -Creature Shapeshifter -1/1 -Changeling - -Sheep -G -Creature Sheep -0/1 - -Skeleton -B -Creature Skeleton -1/1 -B: Regenerate this creature. - -Sliver -C -Creature Sliver -1/1 - -Snake -C -Artifact Creature Snake -1/1 -"Whenever this creature deals damage to a player, that player gets a poison counter." - -Snake -G -Creature Snake -1/1 - -Snake -G U -Creature Snake -1/1 - -Soldier -W -Creature Soldier -1/1 - -Spawn -C -Artifact Creature Spawn -2/2 - -Spider -B -Creature Spider -2/4 -Reach - -Spider -G -Creature Spider -1/2 -Reach - -Spike -G -Creature Spike -1/1 - -Spirit -B -Creature Spirit -N/N - -Spirit -C -Creature Spirit -1/1 - -Spirit -W -Creature Spirit -1/1 -Flying - -Spirit -W -Creature Spirit -3/3 -Flying - -Spirit -W B -Creature Spirit -1/1 -Flying - -Splinter -G -Cumulative upkeep - G -1/1 -Flying - -Squirrel -G -Creature Squirrel -1/1 - -Stangg Twin -R G -Legendary Creature Human Warrior -3/4 - -Starfish -U -Creature Starfish -0/1 - -Survivor -R -Creature Survivor -1/1 - -Tetravite -C -This creature can't be enchanted. -1/1 -Flying - -Thopter -C -Artifact Creature Thopter -1/1 -Flying - -Thopter -U -Creature Thopter -1/1 -Flying - -Thrull -B -Creature Thrull -0/1 - -Thrull -B -Creature Thrull -1/1 - -Tombspawn -B -Creature Zombie -2/2 -Haste - -Treefolk Shaman -G -Creature Treefolk Shaman -2/1 - -Triskelavite -C -Artifact Creature -1/1 -Flying - -Voja -G W -Legendary Creature Wolf -2/2 - -Wall -C -Artifact Creature Wall -0/2 -Defender - -Wall -U -Creature Wall -5/5 -Defender - -Warrior -R -Creature Warrior -1/1 - -Wasp -C -Artifact Creature Insect -1/1 -Flying - -Weird -U -Flying -3/3 -Defender - -Wirefly -C -Artifact Creature Insect -2/2 -Flying - -Wolf -G -Creature Wolf -1/1 -This creature gets +1/+1 for each card named Sound the Call in each graveyard. - -Wolf -G -Creature Wolf -2/2 - -Wolves of the Hunt -G -Creature Wolf -1/1 -Bands with other Wolves - -Worm -B G -Creature Worm -1/1 - -Wurm -B -Creature Wurm -6/6 -Trample - -Wurm -G -Creature Wurm -6/6 - -Wurm -G -Creature Wurm -X/X - -Zombie -B -Creature Zombie -2/2 - diff --git a/res/PerSetTracking.py b/res/PerSetTracking.py deleted file mode 100755 index 280330adab1..00000000000 --- a/res/PerSetTracking.py +++ /dev/null @@ -1,128 +0,0 @@ -#!/usr/bin/env python - -pathToMtgData = "mtg-data.txt" - -############IMPLEMENTATION FOLLOWS############ -import os,sys,fnmatch - -if not os.path.exists(pathToMtgData) : - print("This script requires the text version of Arch's mtg-data to be present.You can download it from slightlymagic.net's forum and either place the text version next to this script or edit this script and provide the path to the file at the top.") - print("Press Enter to exit") - raw_input("") - sys.exit() - -if not os.path.isdir(sys.path[0] + os.sep + 'PerSetTracking Results') : - os.mkdir(sys.path[0] + os.sep + 'PerSetTracking Results') - -forgeFolderFiles = [] -forgeCards = [] -mtgDataCards = {} -setCodes = [] -forgeCardCount = 0 -mtgDataCardCount = 0 -setCodeCount = 0 - -hasFetchedSets = False -hasFetchedCardName = False -tmpName = "" -line = "" -prevline = "" - -#Parse mtg-data -print("Parsing mtg-data") -with open(pathToMtgData) as mtgdata : - for line in mtgdata : - if not hasFetchedSets : - if line != "\n" : - setCodes.append(line[0:3]) - else : - hasFetchedSets = True - if hasFetchedSets : - if not hasFetchedCardName : - tmpName = line - tmpName = tmpName.rstrip() - tmpName = tmpName.replace("AE", "Ae") - hasFetchedCardName = True - if line == "\n" : - mtgDataCards[tmpName] = prevline.rstrip() - hasFetchedCardName = False - - prevline = line - -#Parse Forge -print("Parsing Forge") -for root, dirnames, filenames in os.walk("cardsfolder"): - for fileName in fnmatch.filter(filenames, '*.txt'): - with open(os.path.join(root, fileName)) as currentForgeCard : - tmpname = currentForgeCard.readline() - tmpname = tmpname[5:].replace("AE","Ae") - tmpname = tmpname.rstrip() - forgeCards.append(tmpname) - -#Compare datasets and output results -print("Comparing datasets and outputting results.") -totalData = {} -currentMissing = [] -currentImplemented = [] -total = 0 -percentage = 0 -for currentSet in setCodes : - if currentSet == 'UNH' or currentSet == 'UGL' : continue #skip Unhinged and Unglued since they are only counting basic lands anyway - #if currentSet == 'VG1' or currentSet == 'VG2' or currentSet == 'VG3' : continue - #if currentSet == 'VG4' or currentSet == 'VGO' or currentSet == 'VG ' : continue - #if currentSet == 'FVD' or currentSet == 'FVE' or currentSet == 'FVR' : continue - #if currentSet == 'SDC' or currentSet == 'AST' or currentSet == 'DKM' : continue - #if currentSet == 'BTD' or currentSet == 'ARC' or currentSet == 'COM' : continue - #if currentSet == 'CHR' or currentSet == 'MED' or currentSet == 'H09' : continue - #if currentSet == 'ME2' or currentSet == 'ME3' or currentSet == 'ME4' : continue - #if currentSet == 'ATH' or currentSet == 'HOP' or currentSet == 'BRB' : continue - #if currentSet == 'EVG' or currentSet == 'GVL' or currentSet == 'JVC' : continue - for card in mtgDataCards.keys() : - if mtgDataCards[card].count(currentSet) > 0 : - if card in forgeCards : - currentImplemented.append(card) - else : - currentMissing.append(card) - total = len(currentMissing)+len(currentImplemented) - percentage = 0 - if total > 0 : - percentage = (float(len(currentImplemented))/float(total))*100 - currentMissing.sort() - currentImplemented.sort() - - with open(sys.path[0] + os.sep + "PerSetTracking Results" + os.sep + "set_" + currentSet + ".txt", "w") as output : - output.write("Implemented (" + str(len(currentImplemented)) + "):\n") - for everyImplemented in currentImplemented : - output.write(everyImplemented + '\n') - output.write("\n") - output.write("Missing (" + str(len(currentMissing)) + "):\n") - for everyMissing in currentMissing : - output.write(everyMissing + '\n') - output.write("\n") - output.write("Total: " + str(total) + "\n") - output.write("Percentage implemented: " + str(round(percentage,2)) + "%\n") - totalData[currentSet] = (len(currentImplemented),len(currentMissing),total,percentage) - del currentMissing[:] - del currentImplemented[:] - -#sort sets by percentage completed -totalDataList = sorted(totalData.items(), key=lambda (key,entry): entry[3], reverse=True) - -totalPercentage = 0 -totalMissing = 0 -totalImplemented = 0 -fullTotal = 0 -with open(sys.path[0] + os.sep + "PerSetTracking Results" + os.sep + "CompleteStats.txt", "w") as statsfile: - statsfile.write("Set: Implemented (Missing) / Total = Percentage Implemented\n") - for k,dataKey in totalDataList : - totalImplemented += dataKey[0] - totalMissing += dataKey[1] - fullTotal += dataKey[2] - statsfile.write(k + ": " + str(dataKey[0]) + " (" + str(dataKey[1]) + ") / " + str(dataKey[2]) + " = " + str(round(dataKey[3], 2)) + "%\n") - totalPercentage = totalImplemented / fullTotal - statsfile.write("\n") - statsfile.write("Total over all sets: " + str(totalImplemented) + " (" + str(totalMissing) + ") / " + str(fullTotal)) - -print "Done!" -print "Press Enter to exit." -raw_input("") diff --git a/res/blockdata/blocks.txt b/res/blockdata/blocks.txt deleted file mode 100644 index dc0ac37eb42..00000000000 --- a/res/blockdata/blocks.txt +++ /dev/null @@ -1,46 +0,0 @@ -Index:0|Set0:LEA|Name:Alpha|DraftPacks:3|LandSetCode:LEA|SealedPacks:6 -Index:1|Set0:LEB|Name:Beta|DraftPacks:3|LandSetCode:LEB|SealedPacks:6 -Index:2|Set0:2ED|Name:Unlimited|DraftPacks:3|LandSetCode:2ED|SealedPacks:6 -Index:3|Set0:ARN|Name:Arabian Nights|DraftPacks:5|LandSetCode:2ED|SealedPacks:9 -Index:4|Set0:ATQ|Name:Antiquities|DraftPacks:5|LandSetCode:ATQ|SealedPacks:9 -Index:5|Set0:3ED|Name:Revised|DraftPacks:3|LandSetCode:3ED|SealedPacks:6 -Index:6|Set0:LEG|Name:Legends|DraftPacks:3|LandSetCode:3ED|SealedPacks:6 -Index:7|Set0:DRK|Name:The Dark|DraftPacks:5|LandSetCode:3ED|SealedPacks:9 -Index:8|Set0:FEM|Name:Fallen Empires|DraftPacks:5|LandSetCode:3ED|SealedPacks:9 -Index:9|Set0:4ED|Name:Fourth Edition|DraftPacks:3|LandSetCode:4ED|SealedPacks:6 - -Index:10|Set0:ICE|Set1:ALL|Set2:CSP|Name:Ice Age|DraftPacks:3|LandSetCode:ICE|SealedPacks:6 -Index:11|Set0:HML|Name:Homelands|DraftPacks:5|LandSetCode:4ED|SealedPacks:9 -Index:12|Set0:MIR|Set1:VIS|Set2:WTH|Name:Mirage|DraftPacks:3|LandSetCode:MIR|SealedPacks:6 -Index:13|Set0:5ED|Name:Fifth Edition|DraftPacks:3|LandSetCode:5ED|SealedPacks:6 -Index:14|Set0:POR|Name:Portal|DraftPacks:3|LandSetCode:POR|SealedPacks:6 -Index:15|Set0:TMP|Set1:STH|Set2:EXO|Name:Tempest|DraftPacks:3|LandSetCode:TMP|SealedPacks:6 -Index:16|Set0:PO2|Name:Portal Second Age|DraftPacks:3|LandSetCode:PO2|SealedPacks:6 -Index:17|Set0:USG|Set1:ULG|Set2:UDS|Name:Urza|DraftPacks:3|LandSetCode:USG|SealedPacks:6 -Index:18|Set0:6ED|Name:Sixth Edition|DraftPacks:3|LandSetCode:6ED|SealedPacks:6 -Index:19|Set0:PTK|Name:Portal Three Kingdoms|DraftPacks:5|LandSetCode:PTK|SealedPacks:9 - -Index:20|Set0:MMQ|Set1:NMS|Set2:PCY|Name:Masques|DraftPacks:3|LandSetCode:MMQ|SealedPacks:6 -Index:21|Set0:INV|Set1:PLS|Set2:APC|Name:Invasion|DraftPacks:3|LandSetCode:INV|SealedPacks:6 -Index:22|Set0:7ED|Name:Seventh Edition|DraftPacks:3|LandSetCode:7ED|SealedPacks:6 -Index:23|Set0:ODY|Set1:TOR|Set2:JUD|Name:Odyssey|DraftPacks:3|LandSetCode:ODY|SealedPacks:6 -Index:24|Set0:ONS|Set1:LGN|Set2:SCG|Name:Onslaught|DraftPacks:3|LandSetCode:ONS|SealedPacks:6 -Index:25|Set0:8ED|Name:Eighth Edition|DraftPacks:3|LandSetCode:8ED|SealedPacks:6 -Index:26|Set0:MRD|Set1:DST|Set2:5DN|Name:Mirrodin|DraftPacks:3|LandSetCode:MRD|SealedPacks:6 -Index:27|Set0:CHK|Set1:BOK|Set2:SOK|Name:Kamigawa|DraftPacks:3|LandSetCode:CHK|SealedPacks:6 -Index:28|Set0:9ED|Name:Ninth Edition|DraftPacks:3|LandSetCode:9ED|SealedPacks:6 -Index:29|Set0:RAV|Set1:GPT|Set2:DIS|Name:Ravnica|DraftPacks:3|LandSetCode:RAV|SealedPacks:6 - -Index:30|Set0:CSP|Name:Coldsnap|DraftPacks:3|LandSetCode:9ED|SealedPacks:6 -Index:31|Set0:TSP|Set1:PLC|Set2:FUT|Name:Time Spiral|DraftPacks:3|LandSetCode:TSP|SealedPacks:6 -Index:32|Set0:10E|Name:Tenth Edition|DraftPacks:3|LandSetCode:10E|SealedPacks:6 -Index:33|Set0:LRW|Set1:MOR|Name:Lorwyn|DraftPacks:3|LandSetCode:LRW|SealedPacks:6 -Index:34|Set0:SHM|Set1:EVE|Name:Shadowmoor|DraftPacks:3|LandSetCode:SHM|SealedPacks:6 -Index:35|Set0:ALA|Set1:CFX|Set2:ARB|Name:Shards of Alara|DraftPacks:3|LandSetCode:ALA|SealedPacks:6 -Index:36|Set0:M10|Name:Magic 2010|DraftPacks:3|LandSetCode:M10|SealedPacks:6 -Index:37|Set0:ZEN|Set1:WWK|Name:Zendikar|DraftPacks:3|LandSetCode:ZEN|SealedPacks:6 -Index:38|Set0:ROE|Name:Rise of the Eldrazi|DraftPacks:3|LandSetCode:ROE|SealedPacks:6 -Index:39|Set0:M11|Name:Magic 2011|DraftPacks:3|LandSetCode:M11|SealedPacks:6 - -Index:40|Set0:SOM|Set1:MBS|Set2:NPH|Name:Scars of Mirrodin|DraftPacks:3|LandSetCode:SOM|SealedPacks:6 -Index:41|Set0:M12|Name:Magic 2012|DraftPacks:3|LandSetCode:M12|SealedPacks:6 diff --git a/res/blockdata/setdata.txt b/res/blockdata/setdata.txt deleted file mode 100644 index ecc1724347f..00000000000 --- a/res/blockdata/setdata.txt +++ /dev/null @@ -1,85 +0,0 @@ -Index:0|Code2:MBP|Code3:MBP|Name:Media Insert Promo -Index:1|Code2:A|Code3:LEA|Name:Limited Edition Alpha -Index:2|Code2:B|Code3:LEB|Name:Limited Edition Beta -Index:3|Code2:U|Code3:2ED|Name:Unlimited -Index:4|Code2:AN|Code3:ARN|Name:Arabian Nights -Index:5|Code2:AQ|Code3:ATQ|Name:Antiquities -Index:6|Code2:R|Code3:3ED|Name:Revised Edition -Index:7|Code2:LG|Code3:LEG|Name:Legends -Index:8|Code2:DK|Code3:DRK|Name:The Dark -Index:9|Code2:FE|Code3:FEM|Name:Fallen Empires - -Index:10|Code2:4E|Code3:4ED|Name:Fourth Edition -Index:11|Code2:IA|Code3:ICE|Name:Ice Age -Index:12|Code2:CH|Code3:CHR|Name:Chronicles -Index:13|Code2:HL|Code3:HML|Name:Homelands -Index:14|Code2:AL|Code3:ALL|Name:Alliances -Index:15|Code2:MI|Code3:MIR|Name:Mirage -Index:16|Code2:VI|Code3:VIS|Name:Visions -Index:17|Code2:5E|Code3:5ED|Name:Fifth Edition -Index:18|Code2:PT|Code3:POR|Name:Portal -Index:19|Code2:WL|Code3:WTH|Name:Weatherlight - -Index:20|Code2:TE|Code3:TMP|Name:Tempest -Index:21|Code2:SH|Code3:STH|Name:Stronghold -Index:22|Code2:EX|Code3:EXO|Name:Exodus -Index:23|Code2:P2|Code3:PO2|Name:Portal Second Age -Index:24|Code2:US|Code3:USG|Name:Urza's Saga -Index:25|Code2:UL|Code3:ULG|Name:Urza's Legacy -Index:26|Code2:6E|Code3:6ED|Name:Classic (Sixth Edition) -Index:27|Code2:UD|Code3:UDS|Name:Urza's Destiny -Index:28|Code2:P3|Code3:PTK|Name:Portal Three Kingdoms -Index:29|Code2:ST|Code3:S99|Name:Starter 1999 - -Index:30|Code2:MM|Code3:MMQ|Name:Mercadian Masques -Index:31|Code2:NE|Code3:NMS|Name:Nemesis -Index:32|Code2:S2K|Code3:S00|Name:Starter 2000 -Index:33|Code2:PY|Code3:PCY|Name:Prophecy -Index:34|Code2:IN|Code3:INV|Name:Invasion -Index:35|Code2:PS|Code3:PLS|Name:Planeshift -Index:36|Code2:7E|Code3:7ED|Name:Seventh Edition -Index:37|Code2:AP|Code3:APC|Name:Apocalypse -Index:38|Code2:OD|Code3:ODY|Name:Odyssey -Index:39|Code2:TO|Code3:TOR|Name:Torment - -Index:40|Code2:JU|Code3:JUD|Name:Judgment -Index:41|Code2:ON|Code3:ONS|Name:Onslaught -Index:42|Code2:LE|Code3:LGN|Name:Legions -Index:43|Code2:SC|Code3:SCG|Name:Scourge -Index:44|Code2:8E|Code3:8ED|Name:Core Set - Eighth Edition -Index:45|Code2:MR|Code3:MRD|Name:Mirrodin -Index:46|Code2:DS|Code3:DST|Name:Darksteel -Index:47|Code2:FD|Code3:5DN|Name:Fifth Dawn -Index:48|Code2:CHK|Code3:CHK|Name:Champions of Kamigawa -Index:49|Code2:BOK|Code3:BOK|Name:Betrayers of Kamigawa - -Index:50|Code2:SOK|Code3:SOK|Name:Saviors of Kamigawa -Index:51|Code2:9E|Code3:9ED|Name:Core Set - Ninth Edition -Index:52|Code2:RAV|Code3:RAV|Name:Ravnica: City of Guilds -Index:53|Code2:GP|Code3:GPT|Name:Guildpact -Index:54|Code2:DIS|Code3:DIS|Name:Dissension -Index:55|Code2:CS|Code3:CSP|Name:Coldsnap -Index:56|Code2:TSP|Code3:TSP|Name:Time Spiral -Index:57|Code2:TSB|Code3:TSB|Name:Time Spiral Timeshifted -Index:58|Code2:PLC|Code3:PLC|Name:Planar Chaos -Index:59|Code2:FUT|Code3:FUT|Name:Future Sight - -Index:60|Code2:10E|Code3:10E|Name:Core Set - Tenth Edition -Index:61|Code2:LRW|Code3:LRW|Name:Lorwyn -Index:62|Code2:MOR|Code3:MOR|Name:Morningtide -Index:63|Code2:SHM|Code3:SHM|Name:Shadowmoor -Index:64|Code2:EVE|Code3:EVE|Name:Eventide -Index:65|Code2:ALA|Code3:ALA|Name:Shards of Alara -Index:66|Code2:CFX|Code3:CFX|Name:Conflux -Index:67|Code2:ARB|Code3:ARB|Name:Alara Reborn -Index:68|Code2:M10|Code3:M10|Name:Magic 2010 -Index:69|Code2:ZEN|Code3:ZEN|Name:Zendikar - -Index:70|Code2:WWK|Code3:WWK|Name:Worldwake -Index:71|Code2:ROE|Code3:ROE|Name:Rise of the Eldrazi -Index:72|Code2:M11|Code3:M11|Name:Magic 2011 -Index:73|Code2:SOM|Code3:SOM|Name:Scars of Mirrodin -Index:74|Code2:MBS|Code3:MBS|Name:Mirrodin Besieged -Index:75|Code2:NPH|Code3:NPH|Name:New Phyrexia -Index:76|Code2:COM|Code3:COM|Name:Commander -Index:77|Code2:M12|Code3:M12|Name:Magic 2012 \ No newline at end of file diff --git a/res/booster-decks b/res/booster-decks deleted file mode 100644 index 7549badbc75..00000000000 Binary files a/res/booster-decks and /dev/null differ diff --git a/res/boosterdata/10E.pack b/res/boosterdata/10E.pack deleted file mode 100644 index a78207c8696..00000000000 --- a/res/boosterdata/10E.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:10 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/2ED.pack b/res/boosterdata/2ED.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/2ED.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/3ED.pack b/res/boosterdata/3ED.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/3ED.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/4ED.pack b/res/boosterdata/4ED.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/4ED.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/5DN.pack b/res/boosterdata/5DN.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/5DN.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/5ED.pack b/res/boosterdata/5ED.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/5ED.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/6ED.pack b/res/boosterdata/6ED.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/6ED.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/7ED.pack b/res/boosterdata/7ED.pack deleted file mode 100644 index a78207c8696..00000000000 --- a/res/boosterdata/7ED.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:10 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/8ED.pack b/res/boosterdata/8ED.pack deleted file mode 100644 index a78207c8696..00000000000 --- a/res/boosterdata/8ED.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:10 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/9ED.pack b/res/boosterdata/9ED.pack deleted file mode 100644 index a78207c8696..00000000000 --- a/res/boosterdata/9ED.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:10 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/A.pack b/res/boosterdata/A.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/A.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/ALA.pack b/res/boosterdata/ALA.pack deleted file mode 100644 index aa6c3d91492..00000000000 --- a/res/boosterdata/ALA.pack +++ /dev/null @@ -1,4 +0,0 @@ -Commons:10 -Uncommons:3 -Rares:1 -Mythics:1 \ No newline at end of file diff --git a/res/boosterdata/ALL.pack b/res/boosterdata/ALL.pack deleted file mode 100644 index 14cbc517a57..00000000000 --- a/res/boosterdata/ALL.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:8 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/APC.pack b/res/boosterdata/APC.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/APC.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/ARB.pack b/res/boosterdata/ARB.pack deleted file mode 100644 index aa6c3d91492..00000000000 --- a/res/boosterdata/ARB.pack +++ /dev/null @@ -1,4 +0,0 @@ -Commons:10 -Uncommons:3 -Rares:1 -Mythics:1 \ No newline at end of file diff --git a/res/boosterdata/ARN.pack b/res/boosterdata/ARN.pack deleted file mode 100644 index b55e245c40e..00000000000 --- a/res/boosterdata/ARN.pack +++ /dev/null @@ -1,2 +0,0 @@ -Commons:6 -Uncommons:2 \ No newline at end of file diff --git a/res/boosterdata/ATQ.pack b/res/boosterdata/ATQ.pack deleted file mode 100644 index a186cc912b9..00000000000 --- a/res/boosterdata/ATQ.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:5 -Uncommons:2 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/B.pack b/res/boosterdata/B.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/B.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/BOK.pack b/res/boosterdata/BOK.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/BOK.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/CFX.pack b/res/boosterdata/CFX.pack deleted file mode 100644 index aa6c3d91492..00000000000 --- a/res/boosterdata/CFX.pack +++ /dev/null @@ -1,4 +0,0 @@ -Commons:10 -Uncommons:3 -Rares:1 -Mythics:1 \ No newline at end of file diff --git a/res/boosterdata/CHK.pack b/res/boosterdata/CHK.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/CHK.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/CHR.pack b/res/boosterdata/CHR.pack deleted file mode 100644 index 31d40fdb1a5..00000000000 --- a/res/boosterdata/CHR.pack +++ /dev/null @@ -1,2 +0,0 @@ -Commons:9 -Uncommons:3 \ No newline at end of file diff --git a/res/boosterdata/CSP.pack b/res/boosterdata/CSP.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/CSP.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/DIS.pack b/res/boosterdata/DIS.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/DIS.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/DRK.pack b/res/boosterdata/DRK.pack deleted file mode 100644 index 69765682dbc..00000000000 --- a/res/boosterdata/DRK.pack +++ /dev/null @@ -1,2 +0,0 @@ -Commons:6 -Rares:2 \ No newline at end of file diff --git a/res/boosterdata/DST.pack b/res/boosterdata/DST.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/DST.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/EVE.pack b/res/boosterdata/EVE.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/EVE.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/EXO.pack b/res/boosterdata/EXO.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/EXO.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/FEM.pack b/res/boosterdata/FEM.pack deleted file mode 100644 index a186cc912b9..00000000000 --- a/res/boosterdata/FEM.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:5 -Uncommons:2 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/FUT.pack b/res/boosterdata/FUT.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/FUT.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/GPT.pack b/res/boosterdata/GPT.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/GPT.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/HML.pack b/res/boosterdata/HML.pack deleted file mode 100644 index b55e245c40e..00000000000 --- a/res/boosterdata/HML.pack +++ /dev/null @@ -1,2 +0,0 @@ -Commons:6 -Uncommons:2 \ No newline at end of file diff --git a/res/boosterdata/ICE.pack b/res/boosterdata/ICE.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/ICE.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/INV.pack b/res/boosterdata/INV.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/INV.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/JUD.pack b/res/boosterdata/JUD.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/JUD.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/LEA.pack b/res/boosterdata/LEA.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/LEA.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/LEB.pack b/res/boosterdata/LEB.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/LEB.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/LEG.pack b/res/boosterdata/LEG.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/LEG.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/LGN.pack b/res/boosterdata/LGN.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/LGN.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/LRW.pack b/res/boosterdata/LRW.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/LRW.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/M10.pack b/res/boosterdata/M10.pack deleted file mode 100644 index aa6c3d91492..00000000000 --- a/res/boosterdata/M10.pack +++ /dev/null @@ -1,4 +0,0 @@ -Commons:10 -Uncommons:3 -Rares:1 -Mythics:1 \ No newline at end of file diff --git a/res/boosterdata/M11.pack b/res/boosterdata/M11.pack deleted file mode 100644 index aa6c3d91492..00000000000 --- a/res/boosterdata/M11.pack +++ /dev/null @@ -1,4 +0,0 @@ -Commons:10 -Uncommons:3 -Rares:1 -Mythics:1 \ No newline at end of file diff --git a/res/boosterdata/MBS.pack b/res/boosterdata/MBS.pack deleted file mode 100644 index aa6c3d91492..00000000000 --- a/res/boosterdata/MBS.pack +++ /dev/null @@ -1,4 +0,0 @@ -Commons:10 -Uncommons:3 -Rares:1 -Mythics:1 \ No newline at end of file diff --git a/res/boosterdata/MIR.pack b/res/boosterdata/MIR.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/MIR.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/MMQ.pack b/res/boosterdata/MMQ.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/MMQ.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/MOR.pack b/res/boosterdata/MOR.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/MOR.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/MRD.pack b/res/boosterdata/MRD.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/MRD.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/NMS.pack b/res/boosterdata/NMS.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/NMS.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/NPH.pack b/res/boosterdata/NPH.pack deleted file mode 100644 index aa6c3d91492..00000000000 --- a/res/boosterdata/NPH.pack +++ /dev/null @@ -1,4 +0,0 @@ -Commons:10 -Uncommons:3 -Rares:1 -Mythics:1 \ No newline at end of file diff --git a/res/boosterdata/ODY.pack b/res/boosterdata/ODY.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/ODY.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/ONS.pack b/res/boosterdata/ONS.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/ONS.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/P02.pack b/res/boosterdata/P02.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/P02.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/PCY.pack b/res/boosterdata/PCY.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/PCY.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/PLC.pack b/res/boosterdata/PLC.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/PLC.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/PLS.pack b/res/boosterdata/PLS.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/PLS.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/POR.pack b/res/boosterdata/POR.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/POR.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/PTK.pack b/res/boosterdata/PTK.pack deleted file mode 100644 index a186cc912b9..00000000000 --- a/res/boosterdata/PTK.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:5 -Uncommons:2 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/RAV.pack b/res/boosterdata/RAV.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/RAV.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/ROE.pack b/res/boosterdata/ROE.pack deleted file mode 100644 index aa6c3d91492..00000000000 --- a/res/boosterdata/ROE.pack +++ /dev/null @@ -1,4 +0,0 @@ -Commons:10 -Uncommons:3 -Rares:1 -Mythics:1 \ No newline at end of file diff --git a/res/boosterdata/SCG.pack b/res/boosterdata/SCG.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/SCG.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/SHM.pack b/res/boosterdata/SHM.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/SHM.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/SOK.pack b/res/boosterdata/SOK.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/SOK.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/SOM.pack b/res/boosterdata/SOM.pack deleted file mode 100644 index aa6c3d91492..00000000000 --- a/res/boosterdata/SOM.pack +++ /dev/null @@ -1,4 +0,0 @@ -Commons:10 -Uncommons:3 -Rares:1 -Mythics:1 \ No newline at end of file diff --git a/res/boosterdata/STH.pack b/res/boosterdata/STH.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/STH.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/TMP.pack b/res/boosterdata/TMP.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/TMP.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/TOR.pack b/res/boosterdata/TOR.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/TOR.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/TSP.pack b/res/boosterdata/TSP.pack deleted file mode 100644 index f12ca2c55cb..00000000000 --- a/res/boosterdata/TSP.pack +++ /dev/null @@ -1,4 +0,0 @@ -Commons:10 -Uncommons:3 -Rares:1 -Special:1 \ No newline at end of file diff --git a/res/boosterdata/UDS.pack b/res/boosterdata/UDS.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/UDS.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/ULG.pack b/res/boosterdata/ULG.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/ULG.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/USG.pack b/res/boosterdata/USG.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/USG.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/VIS.pack b/res/boosterdata/VIS.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/VIS.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/WTH.pack b/res/boosterdata/WTH.pack deleted file mode 100644 index 1cee958e168..00000000000 --- a/res/boosterdata/WTH.pack +++ /dev/null @@ -1,3 +0,0 @@ -Commons:11 -Uncommons:3 -Rares:1 \ No newline at end of file diff --git a/res/boosterdata/WWK.pack b/res/boosterdata/WWK.pack deleted file mode 100644 index aa6c3d91492..00000000000 --- a/res/boosterdata/WWK.pack +++ /dev/null @@ -1,4 +0,0 @@ -Commons:10 -Uncommons:3 -Rares:1 -Mythics:1 \ No newline at end of file diff --git a/res/boosterdata/ZEN.pack b/res/boosterdata/ZEN.pack deleted file mode 100644 index aa6c3d91492..00000000000 --- a/res/boosterdata/ZEN.pack +++ /dev/null @@ -1,4 +0,0 @@ -Commons:10 -Uncommons:3 -Rares:1 -Mythics:1 \ No newline at end of file diff --git a/res/card-pictures-token.txt b/res/card-pictures-token.txt deleted file mode 100644 index 1386d55fb0e..00000000000 --- a/res/card-pictures-token.txt +++ /dev/null @@ -1,16 +0,0 @@ -[T]b_0_1_Thrull.jpg http://serv1.tcgimages.eu/img/cards/Duel_Decks_Divine_vs._Demonic/thrull_token_black_01.jpg -[T]b_1_1_faerie_rogue.jpg http://www.magickartenmarkt.de/img/cards/Morningtide/faerie_rogue_token.jpg [T]b_1_1_rat.jpg http://www.magickartenmarkt.de/img/cards/Shadowmoor/rat_token_black_11.jpg [T]b_20_20_marit_lage.jpg http://www.magickartenmarkt.de/img/cards/Game_Day_Cards/marit_lage_token.jpg [T]b_2_2_zombie.jpg http://www.magickartenmarkt.de/img/cards/Shards_of_Alara/zombie_token_black_22.jpg -[T]bg_1_1_worm.jpg http://serv4.tcgimages.eu/img/cards/Eventide/worm_token_black_and_green_11.jpg [T]c_0_1_eldrazi_spawn.jpg http://www.mtgmintcard.com/images/products/50/MAGIC-THE-GATHERING-EKDRAZI-SPAWN-1A-ROET001A.jpg [T]c_1_1_shapeshifter.jpg http://www.magickartenmarkt.de/img/cards/Lorwyn/shapeshifter_token.jpg [T]c_1_1_sliver.jpg http://www.magickartenmarkt.de/img/cards/Player_Rewards_Promos/sliver_token.jpg [T]c_1_1_spirit.jpg http://serv3.tcgimages.eu/img/cards/Player_Rewards_Promos/spirit_token_white_112.jpg -[T]c_1_1_wasp.jpg http://www.magickartenmarkt.de/img/cards/Tenth_Edition/wasp_token.jpg [T]c_3_4_gargoyle.jpg http://www.mtgmintcard.com/images/products/458/MAGIC-THE-GATHERING-GARGOYLE-TOKEN-M10C8.jpg [T]c_5_5_tuktuk_the_returned.jpg http://www.mtgmintcard.com/images/products/89/MAGIC-THE-GATHERING-TUKTUK-THE-RETURNED-TOKEN-ROET005.jpg -[T]g_0_1_plant.jpg http://www.mtgmintcard.com/images/products/174/MAGIC-THE-GATHERING-PLANT-TOKEN-WWKC065.jpg -[T]g_1_1_elf_warrior.jpg http://www.magickartenmarkt.de/img/cards/Lorwyn/elf_warrior_token_green_11.jpg [T]g_1_1_insect.jpg http://www.mtgmintcard.com/images/products/413/MAGIC-THE-GATHERING-INSECT-TOKEN-M10C6.jpg [T]g_1_1_saproling.jpg http://www.magickartenmarkt.de/img/cards/Shards_of_Alara/saproling_token_green_11.jpg [T]g_1_1_snake.jpg http://www.mtgmintcard.com/images/products/408/MAGIC-THE-GATHERING-SNAKE-TOKEN-ZENC112.jpg [T]g_1_1_squirrel.jpg http://www.magickartenmarkt.de/img/cards/Player_Rewards_Promos/squirrel_token.jpg [T]g_2_2_bear.jpg http://www.magickartenmarkt.de/img/cards/Player_Rewards_Promos/bear_token1.jpg [T]g_2_2_lizard.jpg http://www.magickartenmarkt.de/img/cards/Alara_Reborn/lizard_token_green_22.jpg [T]g_2_2_wolf.jpg http://www.magickartenmarkt.de/img/cards/Zendikar/wolf_token_green_22.jpg [T]g_2_5_treefolk_shaman.jpg http://www.magickartenmarkt.de/img/cards/Morningtide/treefolk_shaman_token.jpg [T]g_3_3_beast.jpg http://www.magickartenmarkt.de/img/cards/Eventide/beast_token_green_33.jpg [T]g_3_3_elephant.jpg http://www.magickartenmarkt.de/img/cards/Player_Rewards_Promos/elephant_token2.jpg [T]g_4_4_beast.jpg http://www.magickartenmarkt.de/img/cards/Player_Rewards_Promos/beast_token_green_44.jpg [T]g_6_6_wurm.jpg http://www.magickartenmarkt.de/img/cards/Player_Rewards_Promos/wurm_token.jpg [T]gw_1_1_elf_warrior.jpg http://www.mtgmintcard.com/images/products/144/MAGIC-THE-GATHERING-TOKEN-ELF-WARRIOR-TOKEN-SHMC128.jpg -[T]r_1_1_goblin.jpg http://www.magickartenmarkt.de/img/cards/Shards_of_Alara/goblin_token_red_11.jpg [T]r_3_1_elemental.jpg http://www.magickartenmarkt.de/img/cards/Conflux/elemental_token_red_31.jpg [T]r_3_1_elemental_haste.jpg http://www.mtgmintcard.com/images/products/448/MAGIC-THE-GATHERING-TOKEN-ELEMENTAL-TOKEN-SHMC129.jpg -[T]r_4_4_bird.jpg http://serv4.tcgimages.eu/img/cards/Player_Rewards_Promos/rukh_token.jpg -[T]r_4_4_dragon.jpg http://www.magickartenmarkt.de/img/cards/Shards_of_Alara/dragon_token_red_44.jpg [T]r_4_4_hellion.jpg http://www.mtgmintcard.com/images/products/304/MAGIC-THE-GATHERING-HELLION-TOKEN-ROET003.jpg [T]r_5_5_dragon.jpg http://www.magickartenmarkt.de/img/cards/Tenth_Edition/dragon_token.jpg [T]rg_1_1_dragon.jpg http://www.magickartenmarkt.de/img/cards/Alara_Reborn/dragon_token_red_and_green_11.jpg [T]rgw_8_8_beast.jpg http://www.magickartenmarkt.de/img/cards/Shards_of_Alara/beast_token_red_green_and_white_88.jpg [T]rw_1_1_goblin_soldier.jpg http://www.magickartenmarkt.de/img/cards/Eventide/goblin_soldier_token_red_and_white_11.jpg [T]u_1_1_bird.jpg http://www.magickartenmarkt.de/img/cards/Player_Rewards_Promos/bird_token_blue_11.jpg -[T]u_1_1_merfolk_wizard.jpg http://serv2.tcgimages.eu/img/cards/Lorwyn/merfolk_wizard_token.jpg [T]u_1_1_thopter.jpg http://serv3.tcgimages.eu/img/cards/Shards_of_Alara/thopter_token_blue_artifact_11.jpg -[T]ub_1_1_zombie_wizard.jpg http://www.magickartenmarkt.de/img/cards/Alara_Reborn/zombie_wizard_token_blue_and_black_11.jpg [T]w_0_1_goat.jpg http://www.magickartenmarkt.de/img/cards/Eventide/goat_token_white_01.jpg [T]w_1_1_bird.jpg http://www.magickartenmarkt.de/img/cards/Zendikar/bird_token_white_11.jpg [T]w_1_1_kithkin_soldier.jpg http://www.magickartenmarkt.de/img/cards/Lorwyn/kithkin_soldier_token_white_11.jpg [T]w_1_1_kor_soldier.jpg http://www.mtgmintcard.com/images/products/396/MAGIC-THE-GATHERING-KOR-SOLDIER-TOKEN-ZENC103.jpg [T]w_1_1_soldier.jpg http://www.magickartenmarkt.de/img/cards/Shards_of_Alara/soldier_token_white_11.jpg [T]w_1_1_soldier_ally.jpg http://www.mtgmintcard.com/images/products/5/MAGIC-THE-GATHERING-SOLDIER-ALLY-WWKC066.jpg -[T]w_1_1_spirit.jpg http://www.magickartenmarkt.de/img/cards/Shadowmoor/spirit_token_white_11.jpg [T]w_3_3_bird.jpg http://serv1.tcgimages.eu/img/cards/Magic_2011/bird_token_white_33.jpg [T]w_4_4_angel.jpg http://www.magickartenmarkt.de/img/cards/Conflux/angel_token_white_44.jpg [T]w_4_4_elemental.jpg http://www.mtgmintcard.com/images/products/286/MAGIC-THE-GATHERING-TOKEN-ELEMENTAL-TOKEN-LORC130.jpg [T]w_4_4_mirror_sigil_sergeant.jpg http://www.wizards.com/global/images/magic/general/mirror_sigil_sergeant.jpg [T]w_5_5_giant_warrior.jpg http://www.magickartenmarkt.de/img/cards/Morningtide/giant_warrior_token.jpg [T]w_n_n_avatar.jpg http://www.magickartenmarkt.de/img/cards/Lorwyn/avatar_token_white_xx.jpg -[T]b_X_X_minion.jpg http://serv4.tcgimages.eu/img/cards/Duel_Decks_Phyrexia_vs._The_Coalition/minion_token_black_xx.jpg -[T]c_1_1_myr.jpg http://serv3.tcgimages.eu/img/cards/New_Phyrexia/myr_token.jpg -[T]c_3_3_golem.jpg http://serv2.tcgimages.eu/img/cards/New_Phyrexia/golem_token_artifact_33.jpg -[T]r_X_X_elemental.jpg http://serv1.tcgimages.eu/img/cards/Rise_of_the_Eldrazi/elemental_token_red_xx.jpg \ No newline at end of file diff --git a/res/decks/JuzamjediCube.dck b/res/decks/JuzamjediCube.dck deleted file mode 100644 index 085cde43bdb..00000000000 --- a/res/decks/JuzamjediCube.dck +++ /dev/null @@ -1,515 +0,0 @@ -[metadata] -Name=JuzamjediCube -Deck Type=constructed -[main] -1 Akroma's Vengeance|ONS -1 Fulminator Mage|SHM -1 White Knight|M11 -1 Genesis|JUD -1 Pithing Needle|M10 -1 Pilgrim's Eye|WWK -1 Tundra|3ED -1 Opposition|7ED -1 Act of Aggression|NPH -1 Voidslime|DIS -1 Condemn|M11 -1 Honor of the Pure|M11 -1 Soltari Champion|STH -1 Plated Geopede|ZEN -1 Inferno Titan|M11 -1 Martial Coup|CFX -1 Molten Rain|MRD -1 Llanowar Elves|M11 -1 Fireblast|VIS -1 Elesh Norn, Grand Cenobite|NPH -1 Ray of Command|5ED -1 Wooded Foothills|ONS -1 Terramorphic Expanse|M11 -1 Negate|M11 -1 Puncture Blast|EVE -1 Lightning Helix|RAV -1 Sphinx of Jwar Isle|ZEN -1 Burst Lightning|ZEN -1 Library of Alexandria|ARN -1 Squee, Goblin Nabob|10E -1 Day of Judgment|M11 -1 Sylvan Ranger|M11 -1 Rite of Replication|ZEN -1 Cloudgoat Ranger|LRW -1 Vines of Vastwood|ZEN -1 Chainer's Edict|TOR -1 Volcanic Island|3ED -1 Hypnotic Specter|M10 -1 Kargan Dragonlord|ROE -1 Jackal Pup|TMP -1 Kiki-Jiki, Mirror Breaker|CHK -1 Batterskull|NPH -1 City of Brass|ARN -1 Wolfbriar Elemental|WWK -1 Student of Warfare|ROE -1 Skirk Marauder|LGN -1 Nucklavee|EVE -1 Polluted Delta|ONS -1 Blade of the Sixth Pride|FUT -1 Great Sable Stag|M10 -1 Char|RAV -1 Paladin en-Vec|10E -1 Stirring Wildwood|WWK -1 Soltari Priest|TSB -1 Akroma, Angel of Fury|PLC -1 Bribery|8ED -1 Briarhorn|LRW -1 Kitchen Finks|SHM -1 Selesnya Guildmage|RAV -1 Flametongue Kavu|PLS -1 Arid Mesa|ZEN -1 Tezzeret's Gambit|NPH -1 Serra Avenger|TSP -1 Glen Elendra Archmage|EVE -1 Bonehoard|MBS -1 Rift Bolt|TSP -1 Vedalken Shackles|5DN -1 Umezawa's Jitte|BOK -1 Korlash, Heir to Blackblade|FUT -1 Snuff Out|MMQ -1 Steppe Lynx|ZEN -1 Loxodon Warhammer|10E -1 Cloud Spirit|STH -1 Wurmcoil Engine|SOM -1 Goblin Ruinblaster|ZEN -1 Goblin Guide|ZEN -1 Plateau|3ED -1 Nath of the Gilt-Leaf|LRW -1 Thieving Magpie|10E -1 Cultivate|M11 -1 Garruk Wildspeaker|M11 -1 Raging Ravine|WWK -1 Fauna Shaman|M11 -1 Pulse Tracker|WWK -1 Troll Ascetic|10E -1 Vampiric Tutor|6ED -1 Mana Leak|M11 -1 Into the Roil|ZEN -1 Elspeth Tirel|SOM -1 Misty Rainforest|ZEN -1 Goblin Wardriver|MBS -1 Phyrexian Arena|9ED -1 Spectral Procession|SHM -1 Savage Lands|ALA -1 Gelectrode|GPT -1 Spell Pierce|ZEN -1 Compulsive Research|RAV -1 Time Walk|2ED -1 Seaside Citadel|ALA -1 Sword of Feast and Famine|MBS -1 Explore|WWK -1 Keldon Champion|UDS -1 Swans of Bryn Argoll|SHM -1 Rishadan Airship|MMQ -1 Spitemare|EVE -1 Obelisk of Alara|CFX -1 Sphinx of the Steel Wind|ARB -1 Sarkhan the Mad|ROE -1 Ghitu Slinger|ULG -1 Treetop Village|10E -1 Blightning|ALA -1 Wei Ambush Force|PTK -1 Imperious Perfect|LRW -1 Viridian Zealot|DST -1 Zo-Zu the Punisher|CHK -1 Chameleon Colossus|MOR -1 Bloodstained Mire|ONS -1 Lashwrithe|NPH -1 Iwamori of the Open Fist|BOK -1 Silent Specter|ONS -1 Albino Troll|USG -1 River Boa|ZEN -1 Bone Shredder|ULG -1 Kor Sanctifiers|ZEN -1 Karmic Guide|ULG -1 Jungle Lion|POR -1 Ajani Vengeant|ALA -1 Liliana's Specter|M11 -1 Sword of Body and Mind|SOM -1 Intuition|TMP -1 Wild Nacatl|ALA -1 Keldon Marauders|PLC -1 Wretched Anurid|ONS -1 Perilous Myr|SOM -1 Obstinate Baloth|M11 -1 Nantuko Shade|M11 -1 Graveborn Muse|10E -1 Exalted Angel|ONS -1 Knight of Stromgald|5ED -1 Wall of Omens|ROE -1 Razorverge Thicket|SOM -1 Oracle of Mul Daya|ZEN -1 Cold-Eyed Selkie|EVE -1 Celestial Crusader|TSP -1 Solemn Simulacrum|MRD -1 Vengevine|ROE -1 Rampaging Baloths|ZEN -1 Yavimaya Elder|UDS -1 Kird Ape|9ED -1 Demonic Tutor|3ED -1 Darkslick Shores|SOM -1 Viridian Shaman|10E -1 Spectral Force|TSP -1 Savannah Lions|9ED -1 Ob Nixilis, the Fallen|ZEN -1 Soltari Crusader|TMP -1 Grave Titan|M11 -1 Brainstorm|MMQ -1 Urza's Rage|INV -1 Thoughtseize|LRW -1 Vampire Hexmage|ZEN -1 Animate Dead|5ED -1 Serendib Efreet|3ED -1 Squall Line|TSP -1 Phyrexian Obliterator|NPH -1 Savannah|3ED -1 Repulse|INV -1 Sinkhole|2ED -1 Isamaru, Hound of Konda|CHK -1 Deep Analysis|TOR -1 Relic of Progenitus|ALA -1 Juzam Djinn|ARN -1 Control Magic|4ED -1 Blastoderm|NMS -1 Tangle Wire|NMS -1 Damnation|PLC -1 Enlightened Tutor|6ED -1 Arc Lightning|USG -1 Ember Hauler|M11 -1 Dauthi Marauder|TMP -1 Spitting Image|EVE -1 Blood Knight|PLC -1 Rampant Growth|M10 -1 Rolling Earthquake|PTK -1 Bituminous Blast|ARB -1 Nimble Mongoose|ODY -1 Ohran Viper|CSP -1 Gatekeeper of Malakir|ZEN -1 Lu Xun, Scholar General|PTK -1 Blood Crypt|DIS -1 Goblin Patrol|USG -1 Coralhelm Commander|ROE -1 Vampire Nighthawk|ZEN -1 Dwarven Blastminer|ONS -1 Pristine Angel|DST -1 Grafted Wargear|5DN -1 Sphinx of Lost Truths|ZEN -1 Despise|NPH -1 Tendrils of Corruption|M10 -1 Harmonize|PLC -1 Pouncing Jaguar|USG -1 Spreading Seas|ZEN -1 Simic Sky Swallower|DIS -1 Blistering Firecat|ONS -1 Leonin Relic-Warder|MBS -1 Halimar Depths|WWK -1 Grim Lavamancer|TOR -1 Mishra's Factory|4ED -1 Sword of War and Peace|NPH -1 Manic Vandal|M11 -1 Consecrated Sphinx|MBS -1 Venser, the Sojourner|SOM -1 Magus of the Moon|FUT -1 Niv-Mizzet, the Firemind|GPT -1 Boggart Ram-Gang|SHM -1 Gaea's Anthem|PLC -1 Sejiri Merfolk|WWK -1 Overgrown Tomb|RAV -1 Daggerclaw Imp|GPT -1 Giant Solifuge|GPT -1 Keldon Vandals|UDS -1 Thornling|CFX -1 Sign in Blood|M10 -1 Undermine|INV -1 Volt Charge|NPH -1 Isochron Scepter|MRD -1 Thawing Glaciers|ALL -1 Swords to Plowshares|ICE -1 Smash to Smithereens|SHM -1 Thrun, the Last Troll|MBS -1 Emeria Angel|ZEN -1 Fleshbag Marauder|ALA -1 Trinket Mage|SOM -1 Copperline Gorge|SOM -1 Miraculous Recovery|VIS -1 Taiga|3ED -1 Natural Order|POR -1 Noble Hierarch|CFX -1 Psychatog|ODY -1 Flooded Strand|ONS -1 Necropotence|5ED -1 Hammerhead Shark|STH -1 Muddle the Mixture|RAV -1 Inquisition of Kozilek|ROE -1 Soul Manipulation|ARB -1 Woolly Thoctar|ALA -1 Dark Confidant|RAV -1 Watery Grave|RAV -1 Black Knight|M11 -1 Indrik Stomphowler|DIS -1 Behemoth Sledge|ARB -1 Mutavault|MOR -1 Goldmeadow Harrier|LRW -1 AEther Vial|DST -1 Sulfur Elemental|PLC -1 Crumbling Necropolis|ALA -1 Aftershock|TMP -1 Debtors' Knell|GPT -1 Underground Sea|3ED -1 Wall of Reverence|CFX -1 Elite Vanguard|M11 -1 Seal of Cleansing|NMS -1 Scrubland|3ED -1 Wickerbough Elder|EVE -1 Parallax Wave|NMS -1 Firebolt|ODY -1 Siege-Gang Commander|10E -1 Carnophage|EXO -1 Absorb|INV -1 Remand|RAV -1 Sower of Temptation|LRW -1 Tarmogoyf|FUT -1 Flame Slash|ROE -1 Bloodghast|ZEN -1 Eternal Witness|5DN -1 Breeding Pool|DIS -1 Shriekmaw|LRW -1 Dismiss|TMP -1 Armageddon|S99 -1 Balance|4ED -1 Kodama's Reach|CHK -1 Urabrask the Hidden|NPH -1 Massacre Wurm|MBS -1 Riftwing Cloudskate|TSP -1 Wilt-Leaf Liege|SHM -1 Word of Seizing|TSP -1 Waterfront Bouncer|MMQ -1 Seachrome Coast|SOM -1 Griffin Guide|TSP -1 Treasure Mage|MBS -1 Trusty Machete|ZEN -1 Ratchet Bomb|SOM -1 Time Warp|M10 -1 Glorious Anthem|10E -1 Disenchant|TSB -1 Cursed Scroll|TMP -1 Nezumi Cutthroat|CHK -1 Mox Pearl|2ED -1 Rishadan Port|MMQ -1 Tectonic Edge|WWK -1 Journey to Nowhere|ZEN -1 Blade Splicer|NPH -1 Loxodon Hierarch|RAV -1 Sarkhan Vol|ALA -1 Ravenous Skirge|USG -1 Brittle Effigy|M11 -1 Rafiq of the Many|ALA -1 Rain of Tears|10E -1 Avalanche Riders|TSB -1 Rewind|9ED -1 Inkwell Leviathan|CFX -1 Vendilion Clique|MOR -1 Fire Imp|POR -1 Viashino Slaughtermaster|CFX -1 Jace Beleren|M11 -1 Bloodbraid Elf|ARB -1 Skullclamp|DST -1 Wrath of God|10E -1 Ancestral Recall|2ED -1 Dauthi Horror|TMP -1 Spined Thopter|NPH -1 Shadowmage Infiltrator|TSB -1 Regrowth|3ED -1 Birds of Paradise|M11 -1 Psionic Blast|TSB -1 Silent Arbiter|5DN -1 Loam Lion|WWK -1 Man-o'-War|S99 -1 War Priest of Thune|M11 -1 Oblivion Ring|ALA -1 Fireball|M11 -1 Blind Creeper|5DN -1 Wipe Away|TSP -1 Figure of Destiny|EVE -1 Blackcleave Cliffs|SOM -1 Bitterblossom|MOR -1 Dryad Arbor|FUT -1 Reveillark|MOR -1 Academy Ruins|TSP -1 Moltensteel Dragon|NPH -1 Puppeteer Clique|SHM -1 Choking Sands|MIR -1 Hell's Thunder|ALA -1 Bane of the Living|LGN -1 Starstorm|ONS -1 Upheaval|ODY -1 Dismember|NPH -1 Putrefy|RAV -1 Woodfall Primus|SHM -1 Electrolyze|GPT -1 Evolving Wilds|ROE -1 Viridian Emissary|MBS -1 Silver Knight|SCG -1 Creeping Tar Pit|WWK -1 Magma Jet|5DN -1 Angel of Despair|GPT -1 Glissa, the Traitor|MBS -1 Ball Lightning|M10 -1 Temple Garden|RAV -1 Hymn to Tourach|FEM -1 Basilisk Collar|WWK -1 Maelstrom Pulse|ARB -1 Agony Warp|ALA -1 Lightning Bolt|M11 -1 Wake Thrasher|EVE -1 Gush|MMQ -1 Farseek|RAV -1 Kokusho, the Evening Star|CHK -1 Porcelain Legionnaire|NPH -1 Duergar Hedge-Mage|EVE -1 Marsh Flats|ZEN -1 Calciderm|PLC -1 Sakura-Tribe Elder|CHK -1 Treachery|UDS -1 Spikeshot Elder|SOM -1 Krosan Grip|TSP -1 Mulldrifter|LRW -1 Sword of Light and Shadow|DST -1 Fyndhorn Elves|ICE -1 Knight of Meadowgrain|LRW -1 Dissipate|MIR -1 Harrow|ZEN -1 Baneslayer Angel|M11 -1 Broodmate Dragon|ALA -1 Liliana Vess|M11 -1 Ajani Goldmane|M11 -1 Stoneforge Mystic|WWK -1 Nekrataal|10E -1 Dauthi Slayer|TSB -1 Skinrender|SOM -1 Mogg Fanatic|10E -1 Mox Ruby|2ED -1 Tinker|ULG -1 Welkin Tern|ZEN -1 Exclude|INV -1 Bayou|3ED -1 Lightning Greaves|MRD -1 Counterspell|7ED -1 Elspeth, Knight-Errant|ALA -1 Temporal Isolation|TSP -1 Lotus Petal|TMP -1 Arc Trail|SOM -1 Path to Exile|CFX -1 Krosan Tusker|ONS -1 Mitotic Slime|M11 -1 Life's Finale|NPH -1 Stupor|TSB -1 Fact or Fiction|INV -1 Shrine of Burning Rage|NPH -1 Plumeveil|SHM -1 Juggernaut|M11 -1 Mox Jet|2ED -1 Ankh of Mishra|6ED -1 Corrupt|M11 -1 Lodestone Golem|WWK -1 Winter Orb|5ED -1 Moat|LEG -1 Hellspark Elemental|CFX -1 Thirst for Knowledge|MRD -1 Prophetic Bolt|APC -1 Jungle Shrine|ALA -1 Sacred Foundry|RAV -1 Sword of Fire and Ice|DST -1 Cloudthresher|LRW -1 Land Tax|4ED -1 Pillage|7ED -1 Tattermunge Maniac|SHM -1 Earthquake|M10 -1 Dust Bowl|MMQ -1 Smokestack|USG -1 Nicol Bolas, Planeswalker|CFX -1 Plow Under|8ED -1 Wall of Blossoms|STH -1 Frost Titan|M11 -1 Centaur Glade|ONS -1 Steam Vents|GPT -1 Elephant Guide|JUD -1 Dauthi Mercenary|TMP -1 Keiga, the Tide Star|CHK -1 Terminate|ARB -1 Red Sun's Zenith|MBS -1 Forked Bolt|ROE -1 Koth of the Hammer|SOM -1 Air Servant|M11 -1 Trygon Predator|DIS -1 Bonesplitter|MRD -1 Chandra Nalaar|M11 -1 Reanimate|TMP -1 Force Spike|7ED -1 Celestial Colonnade|WWK -1 Mox Emerald|2ED -1 Arcane Sanctum|ALA -1 Sarcomancy|TMP -1 Icequake|ICE -1 Fathom Seer|TSP -1 Hero of Oxid Ridge|MBS -1 Unmake|EVE -1 Scalding Tarn|ZEN -1 Mox Sapphire|2ED -1 Soltari Trooper|TMP -1 Mana Tithe|PLC -1 Vindicate|APC -1 AEther Adept|M11 -1 Master of the Wild Hunt|M10 -1 Accorder Paladin|MBS -1 Stone Rain|9ED -1 Avenger of Zendikar|WWK -1 Volition Reins|SOM -1 Moldervine Cloak|RAV -1 Mirran Crusader|MBS -1 Windswept Heath|ONS -1 Incinerate|10E -1 Deranged Hermit|ULG -1 Soltari Monk|TMP -1 Godless Shrine|GPT -1 Flame Javelin|SHM -1 Lavaclaw Reaches|WWK -1 Hero of Bladehold|MBS -1 Azorius Guildmage|DIS -1 Revoke Existence|SOM -1 Kodama of the North Tree|CHK -1 Sun Titan|M11 -1 Stillmoon Cavalier|EVE -1 Looter il-Kor|TSP -1 Stomping Ground|GPT -1 Tropical Island|3ED -1 Wasteland|TMP -1 Hallowed Fountain|DIS -1 Phantom Centaur|JUD -1 Doom Blade|M11 -1 Badlands|3ED -1 Jace, the Mind Sculptor|WWK -1 Acidic Slime|M11 -1 Nevinyrral's Disk|5ED -1 Pernicious Deed|APC -1 Faerie Trickery|LRW -1 Verdant Catacombs|ZEN -1 Go for the Throat|MBS -1 Duress|M11 -1 Magus of the Disk|TSP -1 Strip Mine|4ED -1 Enclave Cryptologist|ROE -1 Black Vise|4ED -1 Eternal Dragon|SCG -1 Call of the Herd|TSB -1 Fireslinger|TMP -1 Sheoldred, Whispering One|NPH -1 Diabolic Edict|TMP -1 Visara the Dreadful|ONS -1 Rancor|ULG -[sideboard] diff --git a/res/draft/common.txt b/res/draft/common.txt deleted file mode 100644 index 159980b11ee..00000000000 --- a/res/draft/common.txt +++ /dev/null @@ -1,106 +0,0 @@ -Akrasan Squire -Alpha Myr -Anarchist -Aven Squire -Azorius Chancery -Battering Sliver -Blade of the Sixth Pride -Blastoderm -Blightning -Bonesplitter Sliver -Brainstorm -Brilliant Halo -Capsize -Carnophage -Cavern Harpy -Child of Night -Cloud of Faeries -Coiled Tinviper -Colossal Might -Corrupt -Dark Ritual -Darksteel Ingot -Dauthi Marauder -Dauthi Slayer -Deep Analysis -Deft Duelist -Diabolic Edict -Dimir Aqueduct -Disenchant -Divination -Drift of Phantasms -Duress -Elephant Ambush -Elvish Fury -Exclude -Faceless Butcher -False Defeat -Firebolt -Fledgling Djinn -Foul Imp -Frostling -Gemhide Sliver -Giant Spider -Gruul Turf -Guardians of Akrasa -Hymn to Tourach -Imperious Perfect -Impulse -Kindle -Kird Ape -Kitesail -Kodama's Reach -Kor Skyfisher -Lightning Blast -Lightning Bolt -Lignify -Llanowar Elves -Mana Leak -Metallic Sliver -Moaning Spirit -Molten Rain -Mudbutton Torchrunner -Mulldrifter -Multani's Acolyte -Muscle Sliver -Naturalize -Nightguard Patrol -Oblivion Ring -Order of the Ebon Hand -Pacifism -Pestermite -Phyrexian Rager -Plated Geopede -Plated Sliver -Pouncing Jaguar -Qasali Pridemage -Rakdos Carnarium -Rancor -Repulse -Rishadan Airship -River Boa -Selesnya Sanctuary -Serum Visions -Shock -Sign in Blood -Sinew Sliver -Snapping Drake -Sprout Swarm -Steppe Lynx -Stone Rain -Sunlance -Synchronous Sliver -Talruum Minotaur -Tarfire -Tendrils of Corruption -Trinket Mage -Vampire Lacerator -Veteran Armorer -Veteran Armorsmith -Veteran Swordsmith -Viashino Fangtail -Vulshok Morningstar -Vulshok Sorcerer -Wild Nacatl -Winged Sliver -Yavimaya Wurm diff --git a/res/draft/cube_juzamjedi.draft b/res/draft/cube_juzamjedi.draft deleted file mode 100644 index fc2782d42b5..00000000000 --- a/res/draft/cube_juzamjedi.draft +++ /dev/null @@ -1,12 +0,0 @@ -Name:JuzamjediCube -DeckFile:JuzamjediCube -IgnoreRarity:True -LandSetCode:M11 - -NumCards:15 -NumSpecials:0 -NumMythics:1 -NumRares:5 -NumUncommons:5 -NumCommons:5 -NumPacks:3 \ No newline at end of file diff --git a/res/draft/draft.properties b/res/draft/draft.properties deleted file mode 100644 index 5495f0b6aaf..00000000000 --- a/res/draft/draft.properties +++ /dev/null @@ -1,3 +0,0 @@ -common--file=common.txt -uncommon--file=uncommon.txt -rare--file=rare.txt diff --git a/res/draft/rare.txt b/res/draft/rare.txt deleted file mode 100644 index 38354af6a03..00000000000 --- a/res/draft/rare.txt +++ /dev/null @@ -1,68 +0,0 @@ -Absorb -Armageddon -Badlands -Baneslayer Angel -Beacon of Destruction -Birds of Paradise -Bitterblossom -Bloodghast -Bribery -Captain of the Watch -Chameleon Colossus -Chandra Nalaar -Char -Day of Judgment -Dragon Roost -Elspeth, Knight-Errant -Gaea's Anthem -Garruk Wildspeaker -Goblin Guide -Goblin Piledriver -Honor of the Pure -Iona, Shield of Emeria -Jace, the Mind Sculptor -Jeska, Warrior Adept -Juzam Djinn -Keiga, the Tide Star -Knight of the White Orchid -Kokusho, the Evening Star -Liliana Vess -Loxodon Hierarch -Meloku the Clouded Mirror -Morphling -Mycoloth -Nantuko Shade -Nevinyrral's Disk -Noble Hierarch -Ob Nixilis, the Fallen -Paladin en-Vec -Phyrexian Arena -Rakka Mar -Rampaging Baloths -Rolling Earthquake -Rorix Bladewing -Sarkhan Vol -Savannah -Scion of Oona -Serendib Efreet -Shadowmage Infiltrator -Siege-Gang Commander -Solemn Simulacrum -Sower of Temptation -Sphinx of Jwar Isle -Squall Line -Survival of the Fittest -Taiga -Tarmogoyf -Thoughtseize -Time Warp -Troll Ascetic -Tundra -Umezawa's Jitte -Underground Sea -Vampiric Tutor -Vendilion Clique -Visara the Dreadful -Wall of Reverence -Wort, Boggart Auntie -Wrath of God diff --git a/res/draft/uncommon.txt b/res/draft/uncommon.txt deleted file mode 100644 index b8792abedb8..00000000000 --- a/res/draft/uncommon.txt +++ /dev/null @@ -1,60 +0,0 @@ -Air Elemental -Animate Dead -Behemoth Sledge -Bituminous Blast -Blade Sliver -Blaze -Blood Knight -Briarhorn -Calciderm -Centaur Glade -Chainer's Edict -Cloud Djinn -Control Magic -Council of Advisors -Counterspell -Demonic Tutor -Dimir Guildmage -Elite Vanguard -Enlightened Tutor -Eternal Witness -Flame Javelin -Flametongue Kavu -Force of Will -Ghitu Encampment -Harmonize -Honden of Cleansing Fire -Honden of Infinite Rage -Honden of Life's Web -Honden of Night's Reach -Honden of Seeing Winds -Infest -Isochron Scepter -Ivory Tower -Jackal Pup -Keening Banshee -Knight of Meadowgrain -Knight of Stromgald -Magma Jet -Might Sliver -Path to Exile -Pillage -Regrowth -Sejiri Merfolk -Shriekmaw -Skullclamp -Smother -Sol Ring -Soltari Monk -Soltari Priest -Spectral Procession -Spell Snare -Swords to Plowshares -Thieving Magpie -Treetop Village -Twinblade Slasher -Vampire Nighthawk -Viridian Shaman -Volcanic Fallout -Wall of Blossoms -Wall of Denial diff --git a/res/gui/display_layout.xml b/res/gui/display_layout.xml deleted file mode 100644 index e2ed7b156cd..00000000000 --- a/res/gui/display_layout.xml +++ /dev/null @@ -1,519 +0,0 @@ - - - - - - 0 - 0 - 1920 - 1090 - - - - - - - - 0 - 0 - 197 - 1090 - - - - - - - - 0 - 0 - 197 - 212 - - - - info - - - - - - 0.2 - - - - - - - - 0 - 212 - 197 - 5 - - - - - - - - - - - - 0 - 217 - 197 - 288 - - - - compy - - - - - - 0.2 - - - - - - - - 0 - 505 - 197 - 5 - - - - - - - - - - - - 0 - 510 - 197 - 148 - - - - stack - - - - - - 0.2 - - - - - - - - 0 - 658 - 197 - 5 - - - - - - - - - - - - 0 - 663 - 197 - 191 - - - - combat - - - - - - 0.2 - - - - - - - - 0 - 854 - 197 - 5 - - - - - - - - - - - - 0 - 859 - 197 - 231 - - - - human - - - - - - 0.2 - - - - - - - - - - - - false - - - - - - - - 197 - 0 - 5 - 1090 - - - - - - - - - - - - 202 - 0 - 1409 - 1090 - - - - - - - - 202 - 0 - 1409 - 236 - - - - compyLand - - - - - - 0.2 - - - - - - - - 202 - 236 - 1409 - 5 - - - - - - - - - - - - 202 - 241 - 1409 - 195 - - - - compyPlay - - - - - - 0.2 - - - - - - - - 202 - 436 - 1409 - 5 - - - - - - - - - - - - 202 - 441 - 1409 - 236 - - - - humanPlay - - - - - - 0.2 - - - - - - - - 202 - 677 - 1409 - 5 - - - - - - - - - - - - 202 - 682 - 1409 - 229 - - - - humanLand - - - - - - 0.2 - - - - - - - - 202 - 911 - 1409 - 5 - - - - - - - - - - - - 202 - 916 - 1409 - 174 - - - - humanHand - - - - - - 0.2 - - - - - - - - - - - - false - - - 1.0 - - - - - - - - 1611 - 0 - 5 - 1090 - - - - - - - - - - - - 1616 - 0 - 304 - 1090 - - - - - - - - 1616 - 0 - 304 - 540 - - - - detail - - - - - - 0.5 - - - - - - - - 1616 - 540 - 304 - 5 - - - - - - - - - - - - 1616 - 545 - 304 - 545 - - - - picture - - - - - - 0.5 - - - - - - - - - - - - false - - - - - - - - - - - - - - - - - - - - - diff --git a/res/gui/display_new_layout.xml b/res/gui/display_new_layout.xml deleted file mode 100644 index ecfaed06d0f..00000000000 --- a/res/gui/display_new_layout.xml +++ /dev/null @@ -1,447 +0,0 @@ - - - - - - 0 - 0 - 1600 - 1114 - - - - - - - - 0 - 0 - 301 - 1114 - - - - - - - - 0 - 0 - 301 - 182 - - - - info - - - - - - 0.2 - - - - - - - - 0 - 182 - 301 - 5 - - - - - - - - - - - - 0 - 187 - 301 - 263 - - - - compy - - - - - - 0.2 - - - - - - - - 0 - 450 - 301 - 5 - - - - - - - - - - - - 0 - 455 - 301 - 275 - - - - stack - - - - - - 0.2 - - - - - - - - 0 - 730 - 301 - 5 - - - - - - - - - - - - 0 - 735 - 301 - 134 - - - - combat - - - - - - 0.2 - - - - - - - - 0 - 869 - 301 - 5 - - - - - - - - - - - - 0 - 874 - 301 - 240 - - - - human - - - - - - 0.2 - - - - - - - - - - - - false - - - - - - - - 301 - 0 - 5 - 1114 - - - - - - - - - - - - 306 - 0 - 979 - 1114 - - - - - - - - 306 - 0 - 979 - 496 - - - - compyPlay - - - - - - 0.4 - - - - - - - - 306 - 496 - 979 - 5 - - - - - - - - - - - - 306 - 501 - 979 - 399 - - - - humanPlay - - - - - - 0.4 - - - - - - - - 306 - 900 - 979 - 5 - - - - - - - - - - - - 306 - 905 - 979 - 209 - - - - humanHand - - - - - - 0.2 - - - - - - - - - - - - false - - - 1.0 - - - - - - - - 1285 - 0 - 5 - 1114 - - - - - - - - - - - - 1290 - 0 - 310 - 1114 - - - - - - - - 1290 - 0 - 310 - 618 - - - - detail - - - - - - 0.5 - - - - - - - - 1290 - 618 - 310 - 5 - - - - - - - - - - - - 1290 - 623 - 310 - 491 - - - - picture - - - - - - 0.5 - - - - - - - - - - - - false - - - - - - - - - - - - - - - - - - - - - diff --git a/res/gui/gui.properties b/res/gui/gui.properties deleted file mode 100644 index 5234e618edb..00000000000 --- a/res/gui/gui.properties +++ /dev/null @@ -1,3 +0,0 @@ -Display--file=display_layout.xml -Display/new--file=display_new_layout.xml -DeckEditor--file=deck_editor_layout.xml \ No newline at end of file diff --git a/res/images/deckeditor/filter_artifact_n.png b/res/images/deckeditor/filter_artifact_n.png deleted file mode 100755 index 2523d044c0a..00000000000 Binary files a/res/images/deckeditor/filter_artifact_n.png and /dev/null differ diff --git a/res/images/deckeditor/filter_artifact_y.png b/res/images/deckeditor/filter_artifact_y.png deleted file mode 100755 index 0b551e67d93..00000000000 Binary files a/res/images/deckeditor/filter_artifact_y.png and /dev/null differ diff --git a/res/images/deckeditor/filter_black_n.png b/res/images/deckeditor/filter_black_n.png deleted file mode 100755 index 8d01f51581b..00000000000 Binary files a/res/images/deckeditor/filter_black_n.png and /dev/null differ diff --git a/res/images/deckeditor/filter_black_y.png b/res/images/deckeditor/filter_black_y.png deleted file mode 100755 index f8fa18ca86b..00000000000 Binary files a/res/images/deckeditor/filter_black_y.png and /dev/null differ diff --git a/res/images/deckeditor/filter_blue_n.png b/res/images/deckeditor/filter_blue_n.png deleted file mode 100755 index 7fb903c4fc1..00000000000 Binary files a/res/images/deckeditor/filter_blue_n.png and /dev/null differ diff --git a/res/images/deckeditor/filter_blue_y.png b/res/images/deckeditor/filter_blue_y.png deleted file mode 100755 index 900299e677c..00000000000 Binary files a/res/images/deckeditor/filter_blue_y.png and /dev/null differ diff --git a/res/images/deckeditor/filter_colorless_n.png b/res/images/deckeditor/filter_colorless_n.png deleted file mode 100755 index f0706e6a590..00000000000 Binary files a/res/images/deckeditor/filter_colorless_n.png and /dev/null differ diff --git a/res/images/deckeditor/filter_colorless_y.png b/res/images/deckeditor/filter_colorless_y.png deleted file mode 100755 index 71e9e9e121f..00000000000 Binary files a/res/images/deckeditor/filter_colorless_y.png and /dev/null differ diff --git a/res/images/deckeditor/filter_creature_n.png b/res/images/deckeditor/filter_creature_n.png deleted file mode 100755 index d577f01ef08..00000000000 Binary files a/res/images/deckeditor/filter_creature_n.png and /dev/null differ diff --git a/res/images/deckeditor/filter_creature_y.png b/res/images/deckeditor/filter_creature_y.png deleted file mode 100755 index aee035d6445..00000000000 Binary files a/res/images/deckeditor/filter_creature_y.png and /dev/null differ diff --git a/res/images/deckeditor/filter_enchant_n.png b/res/images/deckeditor/filter_enchant_n.png deleted file mode 100755 index b23e3122a68..00000000000 Binary files a/res/images/deckeditor/filter_enchant_n.png and /dev/null differ diff --git a/res/images/deckeditor/filter_enchant_y.png b/res/images/deckeditor/filter_enchant_y.png deleted file mode 100755 index 054bfbdbb47..00000000000 Binary files a/res/images/deckeditor/filter_enchant_y.png and /dev/null differ diff --git a/res/images/deckeditor/filter_green_n.png b/res/images/deckeditor/filter_green_n.png deleted file mode 100755 index e544ca3c339..00000000000 Binary files a/res/images/deckeditor/filter_green_n.png and /dev/null differ diff --git a/res/images/deckeditor/filter_green_y.png b/res/images/deckeditor/filter_green_y.png deleted file mode 100755 index 00e4a63347d..00000000000 Binary files a/res/images/deckeditor/filter_green_y.png and /dev/null differ diff --git a/res/images/deckeditor/filter_instant_n.png b/res/images/deckeditor/filter_instant_n.png deleted file mode 100755 index 7c25dd437a5..00000000000 Binary files a/res/images/deckeditor/filter_instant_n.png and /dev/null differ diff --git a/res/images/deckeditor/filter_instant_y.png b/res/images/deckeditor/filter_instant_y.png deleted file mode 100755 index 83cd0d9a9d3..00000000000 Binary files a/res/images/deckeditor/filter_instant_y.png and /dev/null differ diff --git a/res/images/deckeditor/filter_land_n.png b/res/images/deckeditor/filter_land_n.png deleted file mode 100755 index f54f4f2864d..00000000000 Binary files a/res/images/deckeditor/filter_land_n.png and /dev/null differ diff --git a/res/images/deckeditor/filter_land_y.png b/res/images/deckeditor/filter_land_y.png deleted file mode 100755 index 8cc194c5327..00000000000 Binary files a/res/images/deckeditor/filter_land_y.png and /dev/null differ diff --git a/res/images/deckeditor/filter_planeswalker_n.png b/res/images/deckeditor/filter_planeswalker_n.png deleted file mode 100755 index f7b4c8bd85b..00000000000 Binary files a/res/images/deckeditor/filter_planeswalker_n.png and /dev/null differ diff --git a/res/images/deckeditor/filter_planeswalker_y.png b/res/images/deckeditor/filter_planeswalker_y.png deleted file mode 100755 index 81d204b7756..00000000000 Binary files a/res/images/deckeditor/filter_planeswalker_y.png and /dev/null differ diff --git a/res/images/deckeditor/filter_red_n.png b/res/images/deckeditor/filter_red_n.png deleted file mode 100755 index a3549b2d518..00000000000 Binary files a/res/images/deckeditor/filter_red_n.png and /dev/null differ diff --git a/res/images/deckeditor/filter_red_y.png b/res/images/deckeditor/filter_red_y.png deleted file mode 100755 index c93fbce1a14..00000000000 Binary files a/res/images/deckeditor/filter_red_y.png and /dev/null differ diff --git a/res/images/deckeditor/filter_sorcery_n.png b/res/images/deckeditor/filter_sorcery_n.png deleted file mode 100755 index cbfb904f55a..00000000000 Binary files a/res/images/deckeditor/filter_sorcery_n.png and /dev/null differ diff --git a/res/images/deckeditor/filter_sorcery_y.png b/res/images/deckeditor/filter_sorcery_y.png deleted file mode 100755 index e7b1cf10f76..00000000000 Binary files a/res/images/deckeditor/filter_sorcery_y.png and /dev/null differ diff --git a/res/images/deckeditor/filter_white_n.png b/res/images/deckeditor/filter_white_n.png deleted file mode 100755 index d7c9759dd60..00000000000 Binary files a/res/images/deckeditor/filter_white_n.png and /dev/null differ diff --git a/res/images/deckeditor/filter_white_y.png b/res/images/deckeditor/filter_white_y.png deleted file mode 100755 index cc7c48f3a2f..00000000000 Binary files a/res/images/deckeditor/filter_white_y.png and /dev/null differ diff --git a/res/images/symbols-13/0.png b/res/images/symbols-13/0.png deleted file mode 100644 index 606851b79ad..00000000000 Binary files a/res/images/symbols-13/0.png and /dev/null differ diff --git a/res/images/symbols-13/1.png b/res/images/symbols-13/1.png deleted file mode 100644 index bd9d79c214c..00000000000 Binary files a/res/images/symbols-13/1.png and /dev/null differ diff --git a/res/images/symbols-13/10.png b/res/images/symbols-13/10.png deleted file mode 100644 index c60ae76a1cd..00000000000 Binary files a/res/images/symbols-13/10.png and /dev/null differ diff --git a/res/images/symbols-13/11.png b/res/images/symbols-13/11.png deleted file mode 100644 index 6f053e0c456..00000000000 Binary files a/res/images/symbols-13/11.png and /dev/null differ diff --git a/res/images/symbols-13/12.png b/res/images/symbols-13/12.png deleted file mode 100644 index 5d0459a028b..00000000000 Binary files a/res/images/symbols-13/12.png and /dev/null differ diff --git a/res/images/symbols-13/15.png b/res/images/symbols-13/15.png deleted file mode 100644 index e3209d78aa0..00000000000 Binary files a/res/images/symbols-13/15.png and /dev/null differ diff --git a/res/images/symbols-13/16.png b/res/images/symbols-13/16.png deleted file mode 100644 index 42718656815..00000000000 Binary files a/res/images/symbols-13/16.png and /dev/null differ diff --git a/res/images/symbols-13/2.png b/res/images/symbols-13/2.png deleted file mode 100644 index 1bdfcb9a7e7..00000000000 Binary files a/res/images/symbols-13/2.png and /dev/null differ diff --git a/res/images/symbols-13/20.png b/res/images/symbols-13/20.png deleted file mode 100644 index eee6b54db75..00000000000 Binary files a/res/images/symbols-13/20.png and /dev/null differ diff --git a/res/images/symbols-13/2B.png b/res/images/symbols-13/2B.png deleted file mode 100644 index fcca8a7ad22..00000000000 Binary files a/res/images/symbols-13/2B.png and /dev/null differ diff --git a/res/images/symbols-13/2G.png b/res/images/symbols-13/2G.png deleted file mode 100644 index 331351b633f..00000000000 Binary files a/res/images/symbols-13/2G.png and /dev/null differ diff --git a/res/images/symbols-13/2R.png b/res/images/symbols-13/2R.png deleted file mode 100644 index 52aeee495f9..00000000000 Binary files a/res/images/symbols-13/2R.png and /dev/null differ diff --git a/res/images/symbols-13/2U.png b/res/images/symbols-13/2U.png deleted file mode 100644 index 19a5702d3f5..00000000000 Binary files a/res/images/symbols-13/2U.png and /dev/null differ diff --git a/res/images/symbols-13/2W.png b/res/images/symbols-13/2W.png deleted file mode 100644 index a865cc5a8f2..00000000000 Binary files a/res/images/symbols-13/2W.png and /dev/null differ diff --git a/res/images/symbols-13/3.png b/res/images/symbols-13/3.png deleted file mode 100644 index c56585cbbed..00000000000 Binary files a/res/images/symbols-13/3.png and /dev/null differ diff --git a/res/images/symbols-13/4.png b/res/images/symbols-13/4.png deleted file mode 100644 index 2756fd4e9a8..00000000000 Binary files a/res/images/symbols-13/4.png and /dev/null differ diff --git a/res/images/symbols-13/5.png b/res/images/symbols-13/5.png deleted file mode 100644 index dd3a13f90f4..00000000000 Binary files a/res/images/symbols-13/5.png and /dev/null differ diff --git a/res/images/symbols-13/6.png b/res/images/symbols-13/6.png deleted file mode 100644 index 0ca8be57f0e..00000000000 Binary files a/res/images/symbols-13/6.png and /dev/null differ diff --git a/res/images/symbols-13/7.png b/res/images/symbols-13/7.png deleted file mode 100644 index a9cb80ee9f1..00000000000 Binary files a/res/images/symbols-13/7.png and /dev/null differ diff --git a/res/images/symbols-13/8.png b/res/images/symbols-13/8.png deleted file mode 100644 index 7d3d7528c01..00000000000 Binary files a/res/images/symbols-13/8.png and /dev/null differ diff --git a/res/images/symbols-13/9.png b/res/images/symbols-13/9.png deleted file mode 100644 index b63347d452d..00000000000 Binary files a/res/images/symbols-13/9.png and /dev/null differ diff --git a/res/images/symbols-13/B.png b/res/images/symbols-13/B.png deleted file mode 100644 index d1b07995779..00000000000 Binary files a/res/images/symbols-13/B.png and /dev/null differ diff --git a/res/images/symbols-13/BG.png b/res/images/symbols-13/BG.png deleted file mode 100644 index 19ec6dbd2c9..00000000000 Binary files a/res/images/symbols-13/BG.png and /dev/null differ diff --git a/res/images/symbols-13/BR.png b/res/images/symbols-13/BR.png deleted file mode 100644 index ede19e7471c..00000000000 Binary files a/res/images/symbols-13/BR.png and /dev/null differ diff --git a/res/images/symbols-13/C.png b/res/images/symbols-13/C.png deleted file mode 100644 index 2beb939065c..00000000000 Binary files a/res/images/symbols-13/C.png and /dev/null differ diff --git a/res/images/symbols-13/G.png b/res/images/symbols-13/G.png deleted file mode 100644 index 751d976d92e..00000000000 Binary files a/res/images/symbols-13/G.png and /dev/null differ diff --git a/res/images/symbols-13/GU.png b/res/images/symbols-13/GU.png deleted file mode 100644 index 4a538ba61ca..00000000000 Binary files a/res/images/symbols-13/GU.png and /dev/null differ diff --git a/res/images/symbols-13/GW.png b/res/images/symbols-13/GW.png deleted file mode 100644 index 632018ce91a..00000000000 Binary files a/res/images/symbols-13/GW.png and /dev/null differ diff --git a/res/images/symbols-13/PB.png b/res/images/symbols-13/PB.png deleted file mode 100644 index d94bd5aaf2e..00000000000 Binary files a/res/images/symbols-13/PB.png and /dev/null differ diff --git a/res/images/symbols-13/PG.png b/res/images/symbols-13/PG.png deleted file mode 100644 index 6b98b46de88..00000000000 Binary files a/res/images/symbols-13/PG.png and /dev/null differ diff --git a/res/images/symbols-13/PR.png b/res/images/symbols-13/PR.png deleted file mode 100644 index 33f162b41db..00000000000 Binary files a/res/images/symbols-13/PR.png and /dev/null differ diff --git a/res/images/symbols-13/PU.png b/res/images/symbols-13/PU.png deleted file mode 100644 index ff52cd944bc..00000000000 Binary files a/res/images/symbols-13/PU.png and /dev/null differ diff --git a/res/images/symbols-13/PW.png b/res/images/symbols-13/PW.png deleted file mode 100644 index d4814dcc2ef..00000000000 Binary files a/res/images/symbols-13/PW.png and /dev/null differ diff --git a/res/images/symbols-13/Q.png b/res/images/symbols-13/Q.png deleted file mode 100644 index f3011283d96..00000000000 Binary files a/res/images/symbols-13/Q.png and /dev/null differ diff --git a/res/images/symbols-13/R.png b/res/images/symbols-13/R.png deleted file mode 100644 index 6e1d464fc70..00000000000 Binary files a/res/images/symbols-13/R.png and /dev/null differ diff --git a/res/images/symbols-13/RG.png b/res/images/symbols-13/RG.png deleted file mode 100644 index 0d8e77baeb8..00000000000 Binary files a/res/images/symbols-13/RG.png and /dev/null differ diff --git a/res/images/symbols-13/RW.png b/res/images/symbols-13/RW.png deleted file mode 100644 index b02ab99aae8..00000000000 Binary files a/res/images/symbols-13/RW.png and /dev/null differ diff --git a/res/images/symbols-13/S.png b/res/images/symbols-13/S.png deleted file mode 100644 index e1af805ffa0..00000000000 Binary files a/res/images/symbols-13/S.png and /dev/null differ diff --git a/res/images/symbols-13/T.png b/res/images/symbols-13/T.png deleted file mode 100644 index d4a84049786..00000000000 Binary files a/res/images/symbols-13/T.png and /dev/null differ diff --git a/res/images/symbols-13/U.png b/res/images/symbols-13/U.png deleted file mode 100644 index abfb6c2cd1a..00000000000 Binary files a/res/images/symbols-13/U.png and /dev/null differ diff --git a/res/images/symbols-13/UB.png b/res/images/symbols-13/UB.png deleted file mode 100644 index f57f2b3871c..00000000000 Binary files a/res/images/symbols-13/UB.png and /dev/null differ diff --git a/res/images/symbols-13/UR.png b/res/images/symbols-13/UR.png deleted file mode 100644 index 538ee70a0d2..00000000000 Binary files a/res/images/symbols-13/UR.png and /dev/null differ diff --git a/res/images/symbols-13/W.png b/res/images/symbols-13/W.png deleted file mode 100644 index 27875151367..00000000000 Binary files a/res/images/symbols-13/W.png and /dev/null differ diff --git a/res/images/symbols-13/WB.png b/res/images/symbols-13/WB.png deleted file mode 100644 index d4c44d3ca53..00000000000 Binary files a/res/images/symbols-13/WB.png and /dev/null differ diff --git a/res/images/symbols-13/WU.png b/res/images/symbols-13/WU.png deleted file mode 100644 index bb6359aa5c1..00000000000 Binary files a/res/images/symbols-13/WU.png and /dev/null differ diff --git a/res/images/symbols-13/X.png b/res/images/symbols-13/X.png deleted file mode 100644 index 67451016bc9..00000000000 Binary files a/res/images/symbols-13/X.png and /dev/null differ diff --git a/res/images/symbols-13/Y.png b/res/images/symbols-13/Y.png deleted file mode 100644 index 31c2eaf5324..00000000000 Binary files a/res/images/symbols-13/Y.png and /dev/null differ diff --git a/res/images/symbols-13/Z.png b/res/images/symbols-13/Z.png deleted file mode 100644 index 128137ad69d..00000000000 Binary files a/res/images/symbols-13/Z.png and /dev/null differ diff --git a/res/images/symbols-13/attack.png b/res/images/symbols-13/attack.png deleted file mode 100644 index 49f46cb9de0..00000000000 Binary files a/res/images/symbols-13/attack.png and /dev/null differ diff --git a/res/images/symbols-13/defend.png b/res/images/symbols-13/defend.png deleted file mode 100755 index 977568d1d8b..00000000000 Binary files a/res/images/symbols-13/defend.png and /dev/null differ diff --git a/res/images/symbols-13/slash.png b/res/images/symbols-13/slash.png deleted file mode 100644 index 9e9de65f096..00000000000 Binary files a/res/images/symbols-13/slash.png and /dev/null differ diff --git a/res/images/symbols-13/summonsick.png b/res/images/symbols-13/summonsick.png deleted file mode 100755 index 4be00a912f0..00000000000 Binary files a/res/images/symbols-13/summonsick.png and /dev/null differ diff --git a/res/images/ui/newgame_background.jpg b/res/images/ui/newgame_background.jpg deleted file mode 100644 index 5b3e7ed587d..00000000000 Binary files a/res/images/ui/newgame_background.jpg and /dev/null differ diff --git a/res/lang/de.properties b/res/lang/de.properties deleted file mode 100644 index b608075b1a4..00000000000 --- a/res/lang/de.properties +++ /dev/null @@ -1,176 +0,0 @@ -program/name=Forge - http://cardforge.org - - - -BoosterDraft/close/message=Dein Fortschritt kann nicht gespeichert werden, wirklich schließen? -BoosterDraft/save/message=Willst du dieses Deck Speichern -BoosterDraft/save/title=Deck speichern -BoosterDraft/rename/message=Deck Name -BoosterDraft/rename/title=Deck umbenennen -BoosterDraft/saveDraft/message=Draft Name -BoosterDraft/saveDraft/title=Draft benennen - - - -Display/menu/title=Menü -Display/phase/title=Phase Stop -Display/dev/title=Developer - -Display/human/title=Spieler -Display/human/hand/title=Hand: -Display/human/removed/menu=Spieler - Entfernte Karten ansehen -Display/human/removed/button=Entfernt: -Display/human/removed/title=Deine entfernten Karten -Display/human/library/title=Bibliothek: -Display/human/graveyard/menu=Spieler - Friedhof ansehen -Display/human/graveyard/button=Friedhof: -Display/human/graveyard/title=Dein Friedhof -Display/human/flashback/menu=Karte mit Rückblende spielen -Display/human/flashback/button=Rückblende: -Display/human/flashback/title=Karte mit Rückblende spielen - -Display/combat/title=Kampf - -Display/computer/title=Computer -Display/computer/hand/title=Hand: -Display/computer/removed/menu=Computer - Entfernte Karten ansehen -Display/computer/removed/button=Entfernt: -Display/computer/removed/title=Computer's entfernte Karten -Display/computer/library/title=Bibliothek: -Display/computer/graveyard/menu=Computer - Friedhof ansehen -Display/computer/graveyard/button=Friedhof: -Display/computer/graveyard/title=Computer's Friedhof - -Display/concede/menu=Aufgeben -Display/concede/button=Aufgeben - - - -DownloadPictures/title=Download -DownloadPictures/no-more=Es wurden bereits alle Bilder heruntergeladen! - -#Das sind die Vorgabewerte für Proxyverbindungen -DownloadPictures/proxy/address=Proxy Addresse -DownloadPictures/proxy/port=Proxy Port - -DownloadPictures/proxy/type/none=Kein Proxy -DownloadPictures/proxy/type/http=HTTP Proxy -DownloadPictures/proxy/type/socks=SOCKS Proxy - -DownloadPictures/button/start=Start Download -DownloadPictures/button/cancel=Abbrechen -DownloadPictures/button/close=Schließen - -DownloadPictures/bar/before-start=Proxy konfigurieren, dann Start drücken -DownloadPictures/bar/wait=%d von %d Karten heruntergeladen! Bitte warten! -DownloadPictures/bar/close=%d von %d Karten heruntergeladen! Bitte schließen! - -DownloadPictures/errors/proxy/connect=Proxy-Verbindung konnte nicht hergestellt werden!\n\ - Proxy Addresse: %s\n\ - Proxy Port: %s -DownloadPictures/errors/other=Du musst mit dem Internet Verbunden sein. Fehler beim herunterladen:\n\ - Karte: %s\n\ - URL: %s - - - -ErrorViewer/show=Stack Report -ErrorViewer/title=Crash Report -ErrorViewer/message=Dieses Dokument ist ein "Crash Report". Ein Fehler ist aufgetreten. Bitte speichern Sie den Fehlerbericht in einer Datei.\n\ - Bitte folgen Sie den Anweisungen auf der folgenden Internetseite (leider nur auf Englisch) um diesen Fehler zu melden. \n\ - Bitte schliessen Sie auch ein, wie der Fehler aufgetreten ist.\n\ - \t%s\n\ - Es ist sehr wichtig, dass die Entwickler von Forge solche Information haben. Wir danken Ihnen für Ihre Hilfe.\n\ - \n\ - %s\n\n\n\ - Version:\n\ - %s\n\n\ - OS: %s Version: %s Architecture: %s\n\n\ - Java Version: %s Vendor: %s\n\n\ - Detailed error trace:\n -ErrorViewer/button/save=Speichern... -ErrorViewer/button/close=Schließen -ErrorViewer/button/exit=Programm verlassen - -ErrorViewer/errors/save/message=Entschuldigung, während des Speicherns ist ein Fehler aufgetreten! -ErrorViewer/errors/show/message=Sie haben einen vollständigen Report verlangt - - - -#Das Tutorial ist ziemlich lang, deshalb ist es in einem eigenen File -HowTo--properties=howTo/de.properties - - - -NewGame/menu/title=Menü -NewGame/menu/lookAndFeel=Anzeige-Einstellungen -NewGame/menu/download=Bilder downloaden (HQ) -NewGame/menu/downloadlq=Bilder downloaden (LQ) -NewGame/menu/downloadsetlq=Bilder downloaden (Set LQ) -NewGame/menu/importPicture=Bilder importieren -NewGame/menu/downloadPrice=Preise aktualisieren -NewGame/menu/cardSizes=Kartengröße einstellen -NewGame/menu/cardStack="Stack" größe einstellen -NewGame/menu/cardStackOffset="Stack Offset" einstellen -NewGame/menu/about=Über -NewGame/options/title=Optionen -NewGame/options/font=Benutze LAF Schriften -NewGame/options/cardOverlay=Benutze Mana und Text -NewGame/options/cardScale=Karten vergrössern -NewGame/options/generate/title=Deckgenerator -NewGame/options/generate/removeSmall=1/1 und 0/X Kreaturen entfernen -NewGame/options/generate/removeArtifacts=Artefakte entfernen -NewGame/help/title=Hilfe - -NewGame/gametype=Spieltyp -NewGame/library=Bibliothek -NewGame/settings=Einstellungen -NewGame/new_game=Neues Spiel -NewGame/constructed_text=Konstruiert (Einfach) - Benutze alle Karten um den Computer zu besiegen -NewGame/sealed_text=Sealed Deck (Mittel) - Erstelle dein Deck aus 75 verfügbaren Karten -NewGame/booster_text=Booster Draft (Schwierig) - Wähle immer eine Karte bis du dein Deck erstellt hast -NewGame/yourdeck=Dein Deck -NewGame/opponent=Gegner -NewGame/deckeditor=Deck Editor -NewGame/newgui=New Gui -NewGame/ailand=Stack AI Land -NewGame/devmode=Developer Mode -NewGame/questmode=Quest Mode -NewGame/startgame=Spiel starten -NewGame/savesealed_msg=Please name this sealed deck -NewGame/savesealed_ttl=Save Sealed Deck - -WinLose/won=Siege: -WinLose/lost=, Niederlagen: -WinLose/win=Gewonnen -WinLose/lose=Verloren -WinLose/continue=Weiter -WinLose/restart=Neu Starten -WinLose/quit=Verlassen - -DownloadPrices/title=Preise Aktualisieren -DownloadPrices/startupdate=Starte Update -DownloadPrices/downloading=Downloade -DownloadPrices/compiling=Compiling - -GameAction/heads=Kopf -GameAction/tails=Zahl -GameAction/heads_or_tails=Kopf oder Zahl? -GameAction/coin_toss=Münze werfen -GameAction/human_win=Spieler gewinnt das Münzewerfen -GameAction/computer_win=Computer gewinnt das Münzewerfen -GameAction/human_mana_cost=Human has no cards with a converted mana cost in library. -GameAction/computer_mana_cost=Computer has no cards with a converted mana cost in library. -GameAction/computer_starts=Spieler beginnt -GameAction/human_starts=Computer beginnt -GameAction/computer_cut=Computer cut his / her deck to : -GameAction/human_cut=Human cut his / her deck to : -GameAction/cut_number=Number of times the deck has been cut: -GameAction/resolve_starter=Can't resolve starter by cut: Reverting to Coin Toss\r\n -GameAction/equal_converted_mana=Equal Converted Mana Cost Cut -GameAction/cutting_again=Cutting Again..... -GameAction/yes=Ja -GameAction/no=Nein -GameAction/want_dredge=Do you want to dredge? -GameAction/select_dredge=Select card to dredge -GameAction/choose_2nd_land=Wähle zweites Land diff --git a/res/lang/en.properties b/res/lang/en.properties deleted file mode 100644 index c71feca0d29..00000000000 --- a/res/lang/en.properties +++ /dev/null @@ -1,199 +0,0 @@ -program/name=Forge - http://cardforge.org - - - -BoosterDraft/close/message=Your progress cannot be saved, do you want to exit? -BoosterDraft/save/message=Do you want to save this deck? -BoosterDraft/save/title=Save Deck -BoosterDraft/rename/message=Deck Name -BoosterDraft/rename/title=Rename Deck -BoosterDraft/saveDraft/message=Please name this draft -BoosterDraft/saveDraft/title=Save Draft - - - -Display/menu/title=Menu -Display/phase/title=Phase Stop -Display/dev/title=Developer - -Display/human/title=Player -Display/human/hand/title=Hand: -Display/human/removed/menu=Player - View Exile -Display/human/removed/button=Exile: -Display/human/removed/title=Player's Exile -Display/human/library/menu=Player - View Library -Display/human/library/button=Library: -Display/human/library/title=Player's Library -Display/human/graveyard/menu=Player - View Graveyard -Display/human/graveyard/button=Graveyard: -Display/human/graveyard/title=Player's Graveyard -Display/human/flashback/menu=Play card with Flashback -Display/human/flashback/button=Flashback: -Display/human/flashback/title=Play card with Flashback - -Display/combat/title=Combat - -Display/computer/title=Computer -Display/computer/hand/menu=Computer - View Hand -Display/computer/hand/button=Hand: -Display/computer/hand/title=Computer's Hand -Display/computer/removed/menu=Computer - View Exile -Display/computer/removed/button=Exile: -Display/computer/removed/title=Computer's Exile -Display/computer/library/menu=Computer - View Library -Display/computer/library/button=Library: -Display/computer/library/title=Computer's Library -Display/computer/graveyard/menu=Computer - View Graveyard -Display/computer/graveyard/button=Graveyard: -Display/computer/graveyard/title=Computer's Graveyard - -Display/concede/menu=Concede Game -Display/concede/button=Concede Game - -Display/managen/menu=Generate Mana -Display/managen/button=Generate Mana - -Display/setupbattlefield/menu=Setup Game State -Display/setupbattlefield/button=Setup Game State - -Display/tutor/menu=Tutor for Card -Display/tutor/button=Tutor for Card - -Display/addcounter/menu=Add Counter to Permanent -Display/addcounter/button=Add Counter to Permanent - -Display/tapperm/menu=Tap Permanent -Display/tapperm/button=Tap Permanent - -Display/untapperm/menu=Untap Permanent -Display/untapperm/button=Untap Permanent - -Display/nolandlimit/menu=Play Unlimited Lands This Turn -Display/nolandlimit/button=Play Unlimited Lands This Turn - -DownloadPictures/title=Downloading -DownloadPictures/no-more=All card pictures have been downloaded. - -#These are the default values for the proxy textfields -DownloadPictures/proxy/address=Proxy Address -DownloadPictures/proxy/port=Proxy Port - -DownloadPictures/proxy/type/none=No Proxy -DownloadPictures/proxy/type/http=HTTP Proxy -DownloadPictures/proxy/type/socks=SOCKS Proxy - -DownloadPictures/button/start=Start download -DownloadPictures/button/cancel=Cancel -DownloadPictures/button/close=Close - -DownloadPictures/bar/before-start=Configure Proxy, then press Start -DownloadPictures/bar/wait=%d of %d cards finished! Please wait! -DownloadPictures/bar/close=%d of %d cards finished! Please close! - -DownloadPictures/errors/proxy/connect=Proxy connection could not be established!\n\ - Proxy address: %s\n\ - Proxy port: %s -DownloadPictures/errors/other=You must be connected to the Internet. Error downloading card:\n\ - Card name: %s\n\ - URL: %s - - - -ErrorViewer/show=Stack Report -ErrorViewer/title=Crash Report -ErrorViewer/message=This is a Crash Report. An error has occurred. Please save this message to a file.\n\ - Please follow the instructions at this address to submit this Crash Report, plus what you were doing at the time:\n\ - \t%s\n\ - Reporting bugs in Forge is very important. We thank you for your time.\n\ - \n\ - %s\n\n\n\ - Version:\n\ - %s\n\n\ - OS: %s Version: %s Architecture: %s\n\n\ - Java Version: %s Vendor: %s\n\n\ - Detailed error trace:\n -ErrorViewer/button/save=Save... -ErrorViewer/button/close=Close -ErrorViewer/button/exit=Exit Application - -ErrorViewer/errors/save/message=There was an error during saving, sorry! -ErrorViewer/errors/show/message=You requested a full error report - - - -#The how to text is pretty long, so it's moved to a separate file -HowTo--properties=howTo/en.properties - - -NewGame/menu/title=Menu -NewGame/menu/lookAndFeel=Display Options -NewGame/menu/download=Download Card HQ Pictures -NewGame/menu/downloadlq=Download Card LQ Pictures -NewGame/menu/downloadsetlq=Download Card Set LQ Pictures -NewGame/menu/importPicture=Import Pictures -NewGame/menu/downloadPrice=Update Price -NewGame/menu/cardSizes=Specify Card Size -NewGame/menu/cardStack=Specify Max Stack Size -NewGame/menu/cardStackOffset=Specify Stack Offset -NewGame/menu/about=About -NewGame/options/title=Options -NewGame/options/font=Use LAF Fonts -NewGame/options/cardOverlay=Use mana and text card overlay -NewGame/options/cardScale=Scale card images larger than original -NewGame/options/generate/title=Generate Deck -NewGame/options/generate/removeSmall=Remove 1/1 and 0/X Creatures -NewGame/options/generate/removeArtifacts=Remove Artifacts -NewGame/help/title=Help - -NewGame/gametype=Game Type -NewGame/library=Library -NewGame/settings=Settings -NewGame/new_game=New Game -NewGame/constructed_text=Constructed (Easy) - Use all of the cards to defeat the computer -NewGame/sealed_text=Sealed Deck (Medium) - Create your deck from 75 available cards -NewGame/booster_text=Booster Draft (Hard) - Pick cards 1 at a time to create your deck -NewGame/yourdeck=Your Deck -NewGame/opponent=Opponent -NewGame/deckeditor=Deck Editor -NewGame/newgui=New Gui -NewGame/ailand=Stack AI Land -NewGame/devmode=Developer Mode -NewGame/questmode=Quest Mode -NewGame/startgame=Start Game -NewGame/savesealed_msg=Please name this sealed deck -NewGame/savesealed_txt=Save Sealed Deck - -WinLose/won=Won: -WinLose/lost=, Lost: -WinLose/win=You Win -WinLose/lose=You Lost -WinLose/continue=Continue -WinLose/restart=Restart -WinLose/quit=Quit - -DownloadPrices/title=Update Prices -DownloadPrices/startupdate=Start Update -DownloadPrices/downloading=Downloading -DownloadPrices/compiling=Compiling - -GameAction/heads=Heads -GameAction/tails=Tails -GameAction/heads_or_tails=Heads or Tails? -GameAction/coin_toss=Coin Toss to Start the Game -GameAction/human_win=Human Wins by Coin Toss -GameAction/computer_win=Computer Wins by Coin Toss -GameAction/human_mana_cost=Human has no cards with a converted mana cost in library. -GameAction/computer_mana_cost=Computer has no cards with a converted mana cost in library. -GameAction/computer_starts=Human Starts -GameAction/human_starts=Computer Starts -GameAction/computer_cut=Computer cut his / her deck to : -GameAction/human_cut=Human cut his / her deck to : -GameAction/cut_number=Number of times the deck has been cut: -GameAction/resolve_starter=Can't resolve starter by cut: Reverting to Coin Toss\r\n -GameAction/equal_converted_mana=Equal Converted Mana Cost Cut -GameAction/cutting_again=Cutting Again..... -GameAction/yes=Yes -GameAction/no=No -GameAction/want_dredge=Do you want to dredge? -GameAction/select_dredge=Select card to dredge -GameAction/choose_2nd_land=Choose second land diff --git a/res/lang/howTo/de.properties b/res/lang/howTo/de.properties deleted file mode 100644 index d0548799e2f..00000000000 --- a/res/lang/howTo/de.properties +++ /dev/null @@ -1,68 +0,0 @@ -title=(Wie man spielt) -message=Wie man Spielt - (Revision: September 2009.)\n\n\n\ -Einleitung\n\n\ -1. Dieses Spiel ist ähnlich wie viele andere Sammelkartenspiele. Du startest mit 20 Lebenspunkten und dein Ziel ist es die Lebenspunkte deines Gegners durch einen Angriff mit deinen Kreaturen auf 0 zu bringen. Du spielst einen Match gegen den Computer. Der beste von 2 aus 3 Spielen gewinnt."\n\n\ -2. Du brauchst Länder um deine Zauberkosten zu bezahlen. Du kannst immer nur ein Land pro Zug spielen.\n\n\ -3. Jedes Land erzeugt verschiedenes Mana. Das Mana findest du auf jeder Karte\n\n\ -\ Wald erzeugt G\n\ -\ Sumpf erzeugt B\n\ -\ Ebene erzeugt W\n\ -\ Insel erzeugt U\n\ -\ Gebirge erzeugt R\n\n\ -4. Jede Karte, die kein Land ist hat einen Namen und Kosten. Die Kosten sehen aus wie \"2GG\". Kosten wie zum Beispiel das, brauchen 2 Wälder und 2 andere Länder. Die Nummer 2 kann durch jedes beliebige Land bezahlt werden. Kosten wie \"R\" jedoch, brauchen ein Gebirge.\n\n\ -5. Kreaturenkarten bleiben im Spiel und können im NÄCHSTEN Zug angreifen. Die Angriffs- und Verteidigungsstärke einer Karte steht unten rechts. Wie zum Beispiel 2/4, das bedeutet die Kreatur hat eine Angriffsstärke von 2 und eine Verteidigungsstärke von 4. Wenn diese Kreatur 4 Schadenspunkte erhält kommt sie auf den Friedhof.\n\n\ -6. Wenn du mit deinen Kreaturen angreifst, hat der Gegner die Chance mit seinen Kreaturen zu blocken. Wenn du angreifst, dann \"tappst\" du deine Karte zur Seite. Deine Kreaturen bleiben bis zu deinem nächsten Zug getappt. Du kannst nur mit ungetappten Kreaturen blocken. Normalerweise kann eine Kreatur nicht im selben Zug angreifen und blocken.\n\n\ -7. Hexerei- und Spontanzauberkarten haben einen einfluss auf das Spiel. Nachdem du eine Karte gespielt hast kommt sie auf den Stapel auf der linken Seite, drücke OK und der Stapel wird geleert. Hexereien können nur gespielt werden wenn du an der Reihe bist und der Stapel leer ist. Spontanzauber können immer gespielt werden und sind somit vielseitiger.\n\n\ -8. Wenn eine Karte ein Ziel hat, musst du dieses Wählen. Wenn das Ziel dein Gegener ist, klicke auf seine Lebenspunkte.\n\n\ -9. Wenn du einen Mulligan willst, werden alle Karten in deiner Hand wieder in die Bibliothek gemischt und du erhälst neue Karten, aber eine Karte weniger.\n\n\n\ -Legendäre Karten\n\n\ -Legenäre Karten sind mächtige Karten die entweder Kreaturen, Verzauberungen, Länder, Artefakte oder Planeswalker sein können. Diese Karten können nur einmal auf dem Spielfeld vorkommen. Wenn eine andere legenäre Karte ins Spiel kommt, werden alle Kopien der legendären Karte zerstört und kommen auf den Friedhof.\n\n\n\ -Planeswalker\n\n\ -Es gibt 7 Planswalkers (Ajani Goldmähne; Liliana Vess; Garruk Wildsprecher; Chandra Nalaar; Nicol Bolas; Elspeth, fahrende Ritterin; Nissa Revane). Sie haben alle spezielle Regeln und besondere Fähigkeiten.\n\n\ -Du kannst nur eine Fähigkeit pro Zug nutzen. Ein Planeswalker kann angegriffen werden, aber du kannst ihn mit deinen Kreaturen blocken. Für jeden Schadenspunkt, den der Planswalker erhält verliert er eine Loyalitätsmarke. Wennd der Planswalker keine Loyalitätsmarken mehr besitzt, kommt er auf den Friedhof.\n\n\n\ -Hybrid Mana und mehrfarbige Karten\n\n\ -1. Hybride Mana Karten sind einzigartig in ihrer Manaproduktion. Anstelle von einem, haben diese Karten zwei Manasymbole. Der Spieler kann aussuchen welches Mana er spielen will. Es gibt auch Fälle in denen Nummern und Farben zusammen in einem Manasymbol vorkommen, was bedeutet das entweder fabriges oder farbloses Mana für jedes Symbol bezahlt werden darf.\n\n\ -2. Mehrfarbige Karten sind leicht anders als Hybride Mana Karten, weil sie zwei oder mehr verschiedenfarbiges Mana brauchen. Ein Beispiel ist der Spontanzauber Blitzhelix, welcher ein rotes und ein weisses Mana braucht um gespielt zu werden.\n\n\n\ -Spielarten\n\n\ -1. Im konstruierten Deck Modus kannst du alle Karten brauchen um dein Deck zu bauen. Um ein konstruiertes Deck zu erstllen, wähle vom Deck Editor \"Neues Deck \u2013 Konstruiert\". Eine Liste mit allen Karten wird angezeigt.\n\n\ -2. Im Sealed Deck Modus bekommst du 75 Karten aus denen du dein Deck erstellen musst.\n\n\ -3. Im Booster Draft Modus wählst du immer eine Karte und erstellst daraus dein Deck. Wenn du mit dem drafting fertig bist, gibst du einen Dateinamen ein, dann gehst du zum Deck Editor und wählst vom Menü \"Deck Öffnen - Draft\" und finde den Dateinamen. So kannst du dein Deck konstruieren. Du kannst dann gegen die 7 anderen Computergegner spielen, die mit dir gedraftet haben.\n\n\ -4. Im Quest Modus beginnst du mit 275 Karten, davon sind 200 Länder. Wenn du einen Match beendest hast gewinnst du mehr Karten. Wenn du einfach ausgewählt hast, bekommst du mehr Karten, auch wenn du verloren hast. Dein Ziel ist es Weltmeister zu werden. Nach dem du das Ende deiner Quest erreicht hast kannst du entweder weitere Spiele spielen und mehr Karten gewinnen oder jederzeit eine neue Quest beginnen.\n\n\ -Bei den Quest Einstellungen kannst du aus vier Schwierigkeitsstufen aussuchen. Diese Schwierigkeitsstufen beinhalten:\n\n\ -1) die länge der Quest in der Anzahl Matches,\n\ -2) die Schwierigkeit des Decks der AI,\n\ -3) die Zahl der Siege oder Niederlagen für neue Karten,\n\ -4) die Zahl der Siege um auf den nächsten Rang aufzusteigen.\n\n\n\ -Schnelle Spiele\n\n\ -Manchmal hast du nur wenig Zeit um ein, zwei Spiele zu spielen. Zuoberst beim Startbildschirm findest du drei Auswahlmöglichkeiten. Klick auf den Konstruiert (Einfach) Knopf um ihn auszuwählen.\n\n\ -In der mitte des Startbildschirms findest du zwei Menüs, das eine heisst \"Dein Deck\" und das andere \"Gegner\". Für ein schnelles Spiel solltest du \"Generate Deck\" oder \"Random\" für dich und den Computer wählen.\n\n\ -1. Die \"Generate Deck\" Option erstellt ein zweifarbiges Deck. Diese Option wählt zufällig Karten aus und manchmal kann die Manakurve zu hoch werden.\n\n\ -2. Die \"Random\" Option wählt zufällig eines von den konstruierten Decks aus. Entweder du stellst diese Decks im Deckeditor zusammen oder du importierst eine .deck Datei aus dem Deckeditor.\n\n\ -Wenn du die \"Random\" Option wählst auf den \"Start Game\" Knopf und der Start des Matches scheitert \u2026 das passiert, wenn du alle deine Decks in deine all-decks2 Datei gespeichert hast. Du solltest sattessen die \"Generate Deck\" Option benutzen.\n\n\n\ -Resizable Game Area & Stack AI Land\n\n\ -1. Die \"Resizable Game Area\" Option sollte ausgewählt werden wenn der Bildschirm mehr als 1024 x 768 Pixel unterstützt. Das Fenster mit dem Spielfeld und der Informationsanzeige wird dann den ganzen Bildschirm ausfülllen.\n\n\ -2. Die \"Stack AI Land\" Option führt dazu, dass der Coputer ein wenig schwieriger zu besiegen ist. Der Computer zieht nur Länderkarten, bis er genug Länder bestitzt um die Kosten seiner Zauber zu bezahlen. Wähle die Option um gegen einen schwächeren oder stärkeren Gegner zu spielen.\n\n\ -Manchmal wenn du auf den \"Spiel Starten\" Knopf drückst kann es vorkommen, dass eine Fehlermeldung erscheint. In dem Fall soltest du die \"Stack AI Land\" Option ausschalten.\n\n\n\ -Fähigkeiten\n\n\ -Es gibt drei verschiedene Arten von Fähigkeiten: aktivierte, ausgelöste, und statische.\n\n\ -1. Aktivierte Fähigkeiten haben einen Doppelpunkt, der die Kosten und den Effekt trennt. Diese können immer dann gespielt werden, wenn du auch ein Spontanzauber spielen könntest. Ein Beispiel ist die Fähigkeit des Elfischer Pfeifer's. Diese Kosten besitzen auch ein Tapsymbol. Kreaturen, deren Fähigkeiten ein tap- oder enttap symbol besitzen, können erst nach dem Zug in dem sie ins Spiel kamen gespielt werden. Manchmal musst du deine Kreatur dafür auch opfern. Das machst du, indem du sie auf den Freidhof legst. Solche Fähigkeiten können nur einmal gespielt werden.\n\n\n\ -2. Ausgelöste Fähigkeiten werden nicht gespielt, sie werden ausgelöst wenn bestimmte Dinge passieren. Ein Beispiel ist Engel der Gnade: Du spielst nicht seine Fähigkeit, aber bekommst 3 Leben wenn er ins spiel kommt.\n\n\ -3. Statische Fähigkeiten werden nicht gespielt und auch nicht ausgelöst. Sie gehen niemals auf den Stapel. Sie wirken einfach ab dem Moment, da die bleibende Karte mit dieser Fähigkeit ins Spiel kommt. Statische Fähigkeiten erzeugen fast immer dauerhaft Effekte.\n\n\n\ -Stichwörter der Fähigkeiten\n\n\ -1. Fliegend: Kreaturen die fliegen sind schwieriger zu blocken. Nur Kreaturen die fliegen oder Reichweite besitzen konnen fliegende Kreaturen blocken.\n\n\ -2. Eile: Kreaturen mit Eile können sobald sie gespielt wurden angreifen oder ihre Fähigkeiten einsetzen .\n\n\ -3. Furcht: Eine Kreatur mit der Eigenschaft "Furcht" kann nur von schwarzen oder Artefaktkreaturen geblockt werden.\n\n\ -4. Umwandlung: Wenn Du eine Karte mit "Umwandlung" in der Hand hältst, kannst Du, anstatt sie auszuspielen, die Umwandlungskosten bezahlen und die Karte abwerfen, um eine andere Karte nachzuziehen. Das ist dann sinnvoll, wenn Du die Karte mit Umwandlung im Moment nicht benötigst. \n\n\ -5. Wachsamkeit: "Wachsamkeit" ist ein neues Schlüsselwort für eine alte Fähigkeit. Es bedetet einfach: "Diese Kreatur wird beim Angreifen nicht getappt". Bestimmst du, mit einer Kreatur anzugreifen, die Wachsamkeit hat, wird diese Kreatur dabei nicht getappt.\n\n\ -6. Trampeln: Angreifende Kreaturen mit der Fähigkeit "Trampeln" sind in der Lage, dem verteidigenden Spieler Schaden zuzufügen, obwohl sie geblockt wurden. Wenn eine Kreatur mit Trampeln einer blockenden Kreatur mehr Schaden zufügt, als nötig ist um die blockende Kreatur zu töten, wird der restliche Schaden auf den verteidigenden Spieler umgeleitet. Wenn eine angreifende Kreatur mit 5/3 und "Trampeln" von einer 2/2 Kreatur geblockt wird, so erhält der verteidigende Spieler trotz des Blockens 3 Schaden. Die blockende Kreatur stirbt.\n\n\ -7. Todesberührung: Immer wenn eine Kreatur mit Todesberührung einer anderen Kreatur Schadenzufügt, zerstöre jene Kreatur.\n\n\ -8. Verteidiger: Diese Kreatur kann nicht angreifen.\n\n\ -9. Erstschlag: Im normalen Kampf wird der Schaden der beteiligten Kreaturen gleichzeitig verrechnet. Hat aber eine von beiden Kreaturen Erstschlag, so hat diese einen entscheidenden Vorteil. Zuerst wird der Schaden der Kreatur mit Erstschlag auf die gegnerische Kreatur übertragen. Stirbt die gegnerische Kreatur dabei, so erhält die Kreatur mit Erstschlag keinen Schaden und bleibt somit unversehrt. Haben beide Kreaturen Erstschlag, so hebt sich dieser auf und der Kampfschaden wird "normal" verrechnet.\n\n\ -10. Aufblitzen: Eine Kreatur mit der Fähigkeit Aufblitzen kann zu jedem Zeitpunkt gespielt werden, zu dem man auch einen Spontanzauber spielen könnte.\n\n\ -11. Landtarung: Wenn Du eine Kreatur mit "Landtarung" hast und mit ihr angreifst, ist sie unblockbar, solange dein Gegner ein Land der beschriebenen Sorte im Spiel hat.\n\n\ -12. Lebensverknüpfung: Immer wenn eine deiner Kreaturen mit Lebensverknüpfung Schaden zufügt, erhältst Du ebenso viele Lebenspunkte dazu.\n\n\ -13. Schutz vor: Eine Kreatur mit Schutz ist weitgehend immun gegen Sprüche, Fähigkeiten und bleibende Karten.\n\n\ -14. Reichweite: Eine Kreatur mit der Fähikeit Reichweite kann fliegende Kreaturen blocken\n\n\ -15. Verhüllt: Eine bleibende Karte mit der Fähigkeit Verhüllt kann nicht das Ziel von Zaubersprüchen oder Fähigkeiten sein..\n\n\ -16. Regeneration: Eine Kreaturenfähigkeit, die eine Kreatur vor der Zerstörung rettet. Regenerationseffekte funktionieren wie Schilde. Wenn der Regenerationszauberspruch oder die Fähigkeit verrechnet wurde, wartet der Effekt auf den nächsten Moment, wo die Kreatur zerstört werden soll. Wenn die Kreatur zerstört würde, rettet der Effekt die Kreatur.\n\n\ -17. Morph: Kreaturen mit einer Morph-Fähigkeit sind sehr besondere Kreaturen. Wenn du eine Morph-Kreatur auf der Hand hast kannst du sie für 3 farblose Mana als eine 2/2 Kreatur spielen. Die Kreatur kommt verdeckt ins Spiel, Dein Gegner weiss nicht, was sich darunter verbirgt. Du kannst sie zu einem beliebigen Zeitpunkt für ihre Morph-Kosten aufdecken. diff --git a/res/lang/howTo/en.properties b/res/lang/howTo/en.properties deleted file mode 100644 index ca12037e84f..00000000000 --- a/res/lang/howTo/en.properties +++ /dev/null @@ -1,68 +0,0 @@ -title=How to Play -message=How to Play - (Revised: September 2009.)\n\n\n\ -Introduction\n\n\ -1. This game is similar to many other trading card games. You start out with 20 life and your goal is to reduce your opponents life to zero by attacking with your creatures. The game will end when your life or the computer's life is reduced to zero. You play \"matches\" against the computer as a set of \"best two out of three\" games."\n\n\ -2. You use land to pay for spells. You can play one land a turn.\n\n\ -3. Each land produces a different magical energy. This magical energy is shortened to one letter on cards.\n\n\ -\ Forests make G\n\ -\ Swamps make B\n\ -\ Plains make W\n\ -\ Islands make U\n\ -\ Mountains make R\n\n\ -4. Each non-land card has a name and a cost. The cost looks like this \"2GG\" A cost like that would require two Forest lands and two other lands. The number 2 can be paid for by any land. A cost like \"R\", would require a Mountain land.\n\n\ -5. Creature cards stay in play and can attack on the turn AFTER they are played. A creature's attack and defense is shown like 2/4 meaning that the creature has an attack power of 2 and a defense of 4. If this creature receives 4 damage it is put into the graveyard.\n\n\ -6. When you attack with your creatures the computer has a chance to block with his creatures. When you attack you \"tap\" your creatures by turning them sideways. Your creatures will untap during your next turn. When you block, only untapped creatures can block. Usually a creature cannot attack and block during the same turn.\n\n\ -7. Sorcery and Instant cards have an effect on the game. After you play any card it goes on the stack to the left, click OK and the stack will clear. Sorcery cards can only be played during your turn and when the stack is empty. Instant cards can be played at any time and are more versatile.\n\n\ -8. If a card has a target, you get to choose that target. If the target is a player, click on that player's life points.\n\n\ -9. When you mulligan, the cards in your hand are shuffled into you deck and you are given 1 less card.\n\n\n\ -Legendary Cards\n\n\ -Legendary cards are powerful cards that can be either creatures, enchantments, lands, artifacts or planeswalkers. These cards can only exist once in the battlefield, and if another copy of the legendary card is played, all copies of the card are destroyed and sent to the graveyard.\n\n\n\ -Planeswalkers\n\n\ -There are 7 planeswalkers (Ajani Goldmane; Liliana Vess; Garruk Wildspeaker; Chandra Nalaar; Nicol Bolas; Elspeth, Knight-Errant; Nissa Revane) and they have specific rules for their special abilities.\n\n\ -You can only use one ability a turn. A planeswalker can be attacked, but you can also block with your creatures. For each 1 damage a planeswalker receives, you remove 1 counter. When a planeswalker doesn't have any counters, it goes to the graveyard.\n\n\n\ -Hybrid Mana and Multicolored Cards\n\n\ -1. Hybrid Mana Cards are unique in their casting cost as seen in the card. Instead of seeing a single color per mana symbol, these cards have 2 colors per mana symbol indicating that the player has the choice of playing either of the two. There are also cases where numbers and colors are combined together in one mana symbol, which indicates that either colorless or colored mana can be paid for each symbol. Hybrid cards are treated as two colors and as such can be said to be multicolored.\n\n\ -2. Multicolored Cards are slightly different than hybrid mana cards, as they require two or more different colors of mana, which may or not be in a single mana symbol. An example would be a card like Lightning Helix which requires one red and one white mana to be played.\n\n\n\ -Game Types\n\n\ -1. In Constructed Deck mode you can use any of the cards to make your deck. To make a constructed deck, from the Deck Editor select \"New Deck \u2013 Constructed\". A list of all the cards will be displayed.\n\n\ -2. In Sealed Deck mode you are given 75 cards and you have to make your deck from just those cards.\n\n\ -3. In Booster Draft mode you select 1 card at a time and then make your deck from just those cards. After you are done drafting you have to type in a filename, then go to the Deck Editor and from the menu select \"Open Deck - Draft\" and find the filename. This will allow you to construct your deck. You can then play against the other 7 computer opponents that were drafting with you.\n\n\ -4. In Quest Mode you start out with 275 cards, 200 are Basic Lands. As you complete matches in your quest you will win more cards. In easy mode you get more cards after every game, whether you win or lose. Your goal is to become world champion. Once you reach the end of your quest you can continue to play additional matches and win even more cards or you can start a new quest at anytime.\n\n\ -At the Quest Options screen you will be given a choice of four different difficulty levels. These difficulty levels control:\n\n\ -1) the length of the quest in matches,\n\ -2) the hardness of the AI deck that you will face as an opponent,\n\ -3) the number of wins or loses needed to get more cards,\n\ -4) the number of wins needed to advance a player to the next rank.\n\n\n\ -Quick Games\n\n\ -There may be occasions where you only have a few minutes to play a quick game or two. At the top of the New Game window you will see the three different game types with radio buttons. Click on the Constructed (Easy) button and it will become highlighted.\n\n\ -In the middle area of the New Game window you will see two menus, one labeled \"Your Deck\" and the other \"Opponent\". For a quick game you should select the \"Generate Deck\" or the \"Random\" option for both you and the computer.\n\n\ -1. The \"Generate Deck\" option creates a 2 color deck. This option randomly picks cards and sometimes your mana curve may be too high.\n\n\ -2. The \"Random\" option will randomly select one of the constructed decks that appear in the two deck menus. You either construct these decks in the Deck Editor or you imported a .deck file from the Deck Editor.\n\n\ -If you select the \"Random\" option and click on the \"Start Game\" button and the match fails to begin \u2026 well, this happens if you fail to have any constructed decks saved to your all-decks2 file. You should choose the \"Generate Deck\" option instead.\n\n\n\ -Resizable Game Area & Stack AI Land\n\n\ -1. The \"Resizable Game Area\" check box should be set to on if your monitor will display more than 1024 x 768 pixels. The window containing the Battlefield and the informational displays will fill the entire screen.\n\n\ -2. The \"Stack AI Land\" option will make the computer a more difficult opponent to beat. The computer will draw non-land cards from it's library after it has drawn enough lands to cover the cost of it's spells. Set the check box to on for a stronger opponent and set the check box to off for a weaker opponent.\n\n\ -At times, you may notice that when you click the \"Start Game\" button that the match fails to begin. In this case you should turn the \"Stack AI Land\" option to off.\n\n\n\ -Abilities\n\n\ -There are three kinds of abilities: Activated, Triggered, and Static.\n\n\ -1. Activated abilities contain a colon that separates cost and effect, these can be played any time you could play an instant. An example is Elvish Piper's ability. That cost also contains the tap symbol. For creatures only, abilities containing the tap- or untap symbol can be played starting the turn after the creature came into play. Another common cost for an activated ability is sacrificing the card. You do that by putting it into your graveyard. Such abilities can only be played once.\n\n\n\ -2. Triggered abilities aren't played, they simply trigger when their condition occurs. An example is Angel of Mercy: You don't play the ability, but gain 3 life when it comes into play.\n\n\ -3. Static abilities are neither played, nor do they trigger. They still have an effect for as long as they are in play. An example is Glorious Anthem. There is no condition or cost, your creatures are just stronger.\n\n\n\ -Keyword Abilities\n\n\ -1. Flying: Creatures with flying are harder to block. Only creatures with flying or reach can block other flyers.\n\n\ -2. Haste: Haste lets a creature attack or use any abilities immediately during this turn.\n\n\ -3. Fear: Creatures with fear can only be blocked by artifact or black creatures. Creatures with fear are harder to block.\n\n\ -4. Cycling: When you cycle a card you pay some cost like 2 and then you discard that card, and then draw a new card. Cycling helps make your deck more versatile.\n\n\ -5. Vigilance: This means that the creature will not tap when attacking. This creature can both attack and block during the same turn.\n\n\ -6. Trample: If you use 2/1 creature to block an attacking 3/4 creature with trample, you will still receive 2 damage because the 3/4 trampled over your 2/1 creature. Trample damage is calculated by (attack - blocker's defense), in this case 3-1 which is 2.\n\n\ -7. Deathtouch: When a creatures with deathtouch deals damage to a creature, that creature is destroyed.\n\n\ -8. Defender: Creatures with defender can not attack, they can only block another attacker.\n\n\ -9. First Strike and Double Strike: Creatures with first strike deals their combat damage first. Creatures with double strike deals their combat damage first, and then deals their combat damage a second time during the combat damage step.\n\n\ -10. Flash: You can play a creature with flash anytime that you can play an Instant.\n\n\ -11. Landwalk: Allows your creature to attack without being blocked if your opponent controls the appropriate land type.\n\n\ -12. Lifelink: With lifeline you gain life equal to the amount of damage dealt.\n\n\ -13. Protection: Can not be damaged, blocked or targeted by sources that match the protection type.\n\n\ -14. Reach: Creatures with reach can block flying creatures.\n\n\ -15. Shroud: Permanents with shroud can not be targeted by abilities or spells.\n\n\ -16. Regenerate: Regenerate is an ability that some creatures have which prevents them from being destroyed and put into the graveyard. When you regenerate a creature, it acts like a shield until end of turn.\n\n\ -17. Morph: A creature with morph can be played by usually paying 3 mana of any color and be treated as a 2/2 creature with no abilities rather than playing the creature's actual cost. This creature is placed face down in the battlefield and can be flipped face up anytime as long as you pay its morph cost which is indicated on the card. Once flipped face up the card is treated as the original card, the one that you would normally play with its original-full casting cost. diff --git a/res/lang/lang.properties b/res/lang/lang.properties deleted file mode 100644 index 162b2d4a8fb..00000000000 --- a/res/lang/lang.properties +++ /dev/null @@ -1,6 +0,0 @@ -#the preferred language (a key from the list below) -lang=en - -#the languages available -en--properties=en.properties -de--properties=de.properties diff --git a/res/licenses/multiline-label-license.txt b/res/licenses/multiline-label-license.txt deleted file mode 100644 index 23bc45e4fb1..00000000000 --- a/res/licenses/multiline-label-license.txt +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License - -Copyright (c) 2009 Samuel Sjoberg - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - \ No newline at end of file diff --git a/res/licenses/xpp3-license.txt b/res/licenses/xpp3-license.txt deleted file mode 100644 index 5d28ee1fd54..00000000000 --- a/res/licenses/xpp3-license.txt +++ /dev/null @@ -1,46 +0,0 @@ -Indiana University Extreme! Lab Software License - -Version 1.1.1 - -Copyright (c) 2002 Extreme! Lab, Indiana University. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if any, - must include the following acknowledgment: - - "This product includes software developed by the Indiana University - Extreme! Lab (http://www.extreme.indiana.edu/)." - -Alternately, this acknowledgment may appear in the software itself, -if and wherever such third-party acknowledgments normally appear. - -4. The names "Indiana Univeristy" and "Indiana Univeristy Extreme! Lab" -must not be used to endorse or promote products derived from this -software without prior written permission. For written permission, -please contact http://www.extreme.indiana.edu/. - -5. Products derived from this software may not use "Indiana Univeristy" -name nor may "Indiana Univeristy" appear in their name, without prior -written permission of the Indiana University. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE AUTHORS, COPYRIGHT HOLDERS OR ITS CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/res/licenses/xstream-license.txt b/res/licenses/xstream-license.txt deleted file mode 100644 index 2a8c6669a04..00000000000 --- a/res/licenses/xstream-license.txt +++ /dev/null @@ -1,28 +0,0 @@ -(BSD Style License) - -Copyright (c) 2003-2006, Joe Walnes -Copyright (c) 2006-2007, XStream Committers -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. Redistributions in binary form must reproduce -the above copyright notice, this list of conditions and the following disclaimer in -the documentation and/or other materials provided with the distribution. - -Neither the name of XStream nor the names of its contributors may be used to endorse -or promote products derived from this software without specific prior written -permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY -WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. diff --git a/res/main.properties b/res/main.properties deleted file mode 100644 index db5f645c8b5..00000000000 --- a/res/main.properties +++ /dev/null @@ -1,62 +0,0 @@ -program/howToReportBugsURL=http://tinyurl.com/3zzrnyb -program/version=Forge -- official beta: $Date$, SVN revision: $Revision$ - -showdeck/2color=false -showdeck/3color=false - -tokens--file=AllTokens.txt - -decks--file=all-decks2 -booster-decks--file=booster-deck -decks-dir--file=decks - -card-pictures--file=card-pictures.txt -card-pictures_token_lq--file=card-pictures-token.txt -card-pictures_a--file=pics_link/card-pictures_a.txt -card-pictures_b--file=pics_link/card-pictures_b.txt -card-pictures_c--file=pics_link/card-pictures_c.txt -card-pictures_d--file=pics_link/card-pictures_d.txt -card-pictures_e--file=pics_link/card-pictures_e.txt -card-pictures_f--file=pics_link/card-pictures_f.txt -card-pictures_g--file=pics_link/card-pictures_g.txt -card-pictures_h--file=pics_link/card-pictures_h.txt -card-pictures_i--file=pics_link/card-pictures_i.txt -card-pictures_j--file=pics_link/card-pictures_j.txt -card-pictures_k--file=pics_link/card-pictures_k.txt -card-pictures_l--file=pics_link/card-pictures_l.txt -card-pictures_m--file=pics_link/card-pictures_m.txt -card-pictures_n--file=pics_link/card-pictures_n.txt -card-pictures_o--file=pics_link/card-pictures_o.txt -card-pictures_p--file=pics_link/card-pictures_p.txt -card-pictures_q--file=pics_link/card-pictures_q.txt -card-pictures_r--file=pics_link/card-pictures_r.txt -card-pictures_s--file=pics_link/card-pictures_s.txt -card-pictures_t--file=pics_link/card-pictures_t.txt -card-pictures_u--file=pics_link/card-pictures_u.txt -card-pictures_v--file=pics_link/card-pictures_v.txt -card-pictures_w--file=pics_link/card-pictures_w.txt -card-pictures_x--file=pics_link/card-pictures_x.txt -card-pictures_y--file=pics_link/card-pictures_y.txt -card-pictures_z--file=pics_link/card-pictures_z.txt -card-pictures_other--file=pics_link/card-pictures_other.txt -card-pictures_token_hq--file=pics_link/card-pictures_token.txt -cards--file=cards.txt -cardsfolder--file=cardsfolder -removed-cards--file=removedCards.txt - -regular/common--file=common.txt -regular/uncommon--file=uncommon.txt -regular/rare--file=rare.txt - -name-mutator--file=name-mutator.txt - -gui--properties=gui/gui.properties -quest--properties=quest/quest.properties -draft--properties=draft/draft.properties - -lang--transparent-properties=lang/lang.properties - -image/base--file=pics -image/token--file=pics/tokens -image/icon--file=pics/icons -sound/base--file=sound diff --git a/res/mtg-data.txt b/res/mtg-data.txt deleted file mode 100644 index adc6cb99a12..00000000000 --- a/res/mtg-data.txt +++ /dev/null @@ -1,84666 +0,0 @@ -10E 2007-07-14 Tenth Edition -2ED 1993-12-01 Unlimited Edition -3ED 1994-04-01 Revised Edition -4ED 1995-04-01 Fourth Edition -5DN 2004-06-04 Fifth Dawn -5ED 1997-03-24 Fifth Edition -6ED 1999-04-28 Classic Sixth Edition -7ED 2001-04-11 Seventh Edition -8ED 2003-07-28 Eighth Edition -9ED 2005-07-29 Ninth Edition -ALA 2008-10-03 Shards of Alara -ALL 1996-06-10 Alliances -APC 2001-06-04 Apocalypse -ARB 2009-04-30 Alara Reborn -ARC 2010-06-18 Archenemy -ARN 1993-12-01 Arabian Nights -ASTRAL 1997-04 Astral -ATH 1998-11 Anthologies -ATQ 1994-03-01 Antiquities -BOK 2005-02-04 Betrayers of Kamigawa -BRB 1999-11-12 Battle Royale Box Set -BTD 2000-12 Beatdown Box Set -CHK 2004-10-01 Champions of Kamigawa -CHR 1995-07 Chronicles -COM 2011-06-17 Magic: The Gathering-Commander -CON 2009-02-06 Conflux -CSP 2006-07-21 Coldsnap -DDG 2011-04-01 Duel Decks: Knights vs. Dragons -DIS 2006-05-05 Dissension -DKM 2001-12 Deckmasters -DRK 1994-08-01 The Dark -DST 2004-02-06 Darksteel -DVD 2009-04-10 Duel Decks: Divine vs. Demonic -EVE 2008-07-25 Eventide -EVG 2007-11-16 Duel Decks: Elves vs. Goblins -EVT 2010-09-03 Duel Decks: Elspeth vs. Tezzeret -EXO 1998-06-15 Exodus -FEM 1994-11-01 Fallen Empires -FUT 2007-05-04 Future Sight -FVD 2008-08-29 From the Vault: Dragons -FVE 2009-08-28 From the Vault: Exiled -FVR 2010-08-27 From the Vault: Relics -GPT 2006-02-03 Guildpact -GVL 2009-10-30 Duel Decks: Garruk vs. Liliana -H09 2009-11-20 Premium Deck Series: Slivers -H10 2010-11-19 Premium Deck Series: Fire and Lightning -HML 1995-10-01 Homelands -HOP 2009-09-04 Planechase -ICE 1995-06-01 Ice Age -INV 2000-10-02 Invasion -JUD 2002-05-27 Judgment -JVC 2008-11-07 Duel Decks: Jace vs. Chandra -LEA 1993-08-05 Limited Edition Alpha -LEB 1993-10-01 Limited Edition Beta -LEG 1994-06-01 Legends -LGN 2003-02-03 Legions -LRW 2007-10-12 Lorwyn -M10 2009-07-17 Magic 2010 -M11 2010-07-16 Magic 2011 -M12 2011-07-15 Magic 2012 -MBS 2011-02-04 Mirrodin Besieged -ME2 2008-09-22 Masters Edition II -ME3 2009-09-07 Masters Edition III -ME4 2011-01-10 Masters Edition IV -MED 2007-09-10 Masters Edition -MIR 1996-10-08 Mirage -MMQ 1999-10-04 Mercadian Masques -MOR 2008-02-01 Morningtide -MRD 2003-10-02 Mirrodin -NEM 2000-02-14 Nemesis -NPH 2011-05-13 New Phyrexia -ODY 2001-10-01 Odyssey -ONS 2002-10-07 Onslaught -P02 1998-06 Portal Second Age -PCY 2000-06-05 Prophecy -PLC 2007-02-02 Planar Chaos -PLS 2001-02-05 Planeshift -POR 1997-06 Portal -PRO ? Promo set for Gatherer -PTK 1999-05 Portal Three Kingdoms -PVC 2010-03-19 Duel Decks: Phyrexia vs. the Coalition -RAV 2005-10-07 Ravnica: City of Guilds -ROE 2010-04-23 Rise of the Eldrazi -S00 2000-07 Starter 2000 -S99 1999-07 Starter 1999 -SCG 2003-05-26 Scourge -SDC 2001-06 Dreamcast -SHM 2008-05-02 Shadowmoor -SOK 2005-06-03 Saviors of Kamigawa -SOM 2010-10-01 Scars of Mirrodin -STH 1998-03-02 Stronghold -TMP 1997-10-14 Tempest -TOR 2002-02-04 Torment -TSB 2006-10-06 Time Spiral "Timeshifted" -TSP 2006-10-06 Time Spiral -UDS 1999-06-07 Urza's Destiny -UGL 1998-08-17 Unglued -ULG 1999-02-15 Urza's Legacy -UNH 2004-11-19 Unhinged -USG 1998-10-12 Urza's Saga -VG ? Vanguard -VG1 ? Vanguard Set 1 -VG2 ? Vanguard Set 2 -VG3 ? Vanguard Set 3 -VG4 ? Vanguard Set 4 -VGO ? MTGO Vanguard -VIS 1997-02-03 Visions -WTH 1997-06-09 Weatherlight -WWK 2010-02-05 Worldwake -ZEN 2009-10-02 Zendikar - -A Display of My Dark Power -Scheme -When you set this scheme in motion, until your next turn, whenever a player taps a land for mana, that player adds one mana to his or her mana pool of any type that land produced. -ARC C - -AErathi Berserker -{2}{R}{R}{R} -Creature - Human Berserker -2/4 -Rampage 3 (Whenever this creature becomes blocked, it gets +3/+3 until end of turn for each creature blocking it beyond the first.) -LEG U - -AEther Adept -{1}{U}{U} -Creature - Human Wizard -2/2 -When AEther Adept enters the battlefield, return target creature to its owner's hand. -M11 C, M12 C - -AEther Barrier -{2}{U} -Enchantment -Whenever a player casts a creature spell, that player sacrifices a permanent unless he or she pays {1}. -NEM R - -AEther Burst -{1}{U} -Instant -Return up to X target creatures to their owners' hands, where X is one plus the number of cards named AEther Burst in all graveyards as you cast AEther Burst. -ODY C - -AEther Charge -{4}{R} -Enchantment -Whenever a Beast enters the battlefield under your control, you may have it deal 4 damage to target opponent. -ONS U - -AEther Figment -{1}{U} -Creature - Illusion -1/1 -Kicker {3} (You may pay an additional {3} as you cast this spell.) -AEther Figment is unblockable. -If AEther Figment was kicked, it enters the battlefield with two +1/+1 counters on it. -ZEN U - -AEther Flash -{2}{R}{R} -Enchantment -Whenever a creature enters the battlefield, AEther Flash deals 2 damage to it. -WTH U, 6ED U, 7ED U - -AEther Membrane -{1}{R}{R} -Creature - Wall -0/5 -Defender; reach (This creature can block creatures with flying.) -Whenever AEther Membrane blocks a creature, return that creature to its owner's hand at end of combat. -PLC U - -AEther Mutation -{3}{G}{U} -Sorcery -Return target creature to its owner's hand. Put X 1/1 green Saproling creature tokens onto the battlefield, where X is that creature's converted mana cost. -APC U - -AEther Rift -{1}{R}{G} -Enchantment -At the beginning of your upkeep, discard a card at random. If you discard a creature card this way, return it from your graveyard to the battlefield unless any player pays 5 life. -INV R - -AEther Shockwave -{3}{W} -Instant -Choose one - Tap all Spirits; or tap all non-Spirit creatures. -SOK U - -AEther Snap -{3}{B}{B} -Sorcery -Remove all counters from all permanents and exile all tokens. -DST R - -AEther Spellbomb -{1} -Artifact -{U}, Sacrifice AEther Spellbomb: Return target creature to its owner's hand. -{1}, Sacrifice AEther Spellbomb: Draw a card. -MRD C, ARC C, EVT C - -AEther Sting -{3}{R} -Enchantment -Whenever an opponent casts a creature spell, AEther Sting deals 1 damage to that player. -UDS U - -AEther Storm -{3}{U} -Enchantment -Creature spells can't be cast. -Pay 4 life: Destroy AEther Storm. It can't be regenerated. Any player may activate this ability. -HML U, 5ED U, ME2 U - -AEther Tide -{X}{U} -Sorcery -As an additional cost to cast AEther Tide, discard X creature cards. -Return X target creatures to their owners' hands. -EXO C - -AEther Tradewinds -{2}{U} -Instant -Return target permanent you control and target permanent you don't control to their owners' hands. -WWK C - -AEther Vial -{1} -Artifact -At the beginning of your upkeep, you may put a charge counter on AEther Vial. -{T}: You may put a creature card with converted mana cost equal to the number of charge counters on AEther Vial from your hand onto the battlefield. -DST U, FVR M - -AEther Web -{1}{G} -Enchantment - Aura -Flash (You may cast this spell any time you could cast an instant.) -Enchant creature -Enchanted creature gets +1/+1, has reach, and can block creatures with shadow as though they didn't have shadow. (Creatures with reach can block creatures with flying.) -TSP C - -AEtherflame Wall -{1}{R} -Creature - Wall -0/4 -Defender -AEtherflame Wall can block creatures with shadow as though they didn't have shadow. -{R}: AEtherflame Wall gets +1/+0 until end of turn. -TSP C - -AEthermage's Touch -{2}{W}{U} -Instant -Reveal the top four cards of your library. You may put a creature card from among them onto the battlefield. It has "At the beginning of your end step, return this creature to its owner's hand." Then put the rest of the cards revealed this way on the bottom of your library in any order. -DIS R - -AEtherplasm -{2}{U}{U} -Creature - Illusion -1/1 -Whenever AEtherplasm blocks a creature, you may return AEtherplasm to its owner's hand. If you do, you may put a creature card from your hand onto the battlefield blocking that creature. -GPT U - -AEthersnipe -{5}{U} -Creature - Elemental -4/4 -When AEthersnipe enters the battlefield, return target nonland permanent to its owner's hand. -Evoke {1}{U}{U} (You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield.) -LRW C, JVC C, COM C - -AEthertow -{3}{W/U} -Instant -Put target attacking or blocking creature on top of its owner's library. -Conspire (As you cast this spell, you may tap two untapped creatures you control that share a color with it. When you do, copy it and you may choose a new target for the copy.) -SHM C - -Abandon Hope -{X}{1}{B} -Sorcery -As an additional cost to cast Abandon Hope, discard X cards. -Look at target opponent's hand and choose X cards from it. That player discards those cards. -TMP U - -Abandoned Outpost -Land -Abandoned Outpost enters the battlefield tapped. -{T}: Add {W} to your mana pool. -{T}, Sacrifice Abandoned Outpost: Add one mana of any color to your mana pool. -ODY C - -Abbey Gargoyles -{2}{W}{W}{W} -Creature - Gargoyle -3/4 -Flying, protection from red -HML U, 5ED U, ME2 U - -Abbey Matron -{2}{W} -Creature - Human Cleric -1/3 -{W}, {T}: Abbey Matron gets +0/+3 until end of turn. -HML C (x2) - -Abduction -{2}{U}{U} -Enchantment - Aura -Enchant creature -When Abduction enters the battlefield, untap enchanted creature. -You control enchanted creature. -When enchanted creature dies, return that card to the battlefield under its owner's control. -WTH U, 6ED U - -Abeyance -{1}{W} -Instant -Until end of turn, target player can't cast instant or sorcery spells, and that player can't activate abilities that aren't mana abilities. -Draw a card. -WTH R - -Abjure -{U} -Instant -As an additional cost to cast Abjure, sacrifice a blue permanent. -Counter target spell. -WTH C - -Abolish -{1}{W}{W} -Instant -You may discard a Plains card rather than pay Abolish's mana cost. -Destroy target artifact or enchantment. -PCY U, EVT U - -Abomination -{3}{B}{B} -Creature - Horror -2/6 -Whenever Abomination blocks or becomes blocked by a green or white creature, destroy that creature at end of combat. -LEG U, 4ED U - -Aboroth -{4}{G}{G} -Creature - Elemental -9/9 -Cumulative upkeep-Put a -1/-1 counter on Aboroth. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -WTH R - -Aboshan's Desire -{U} -Enchantment - Aura -Enchant creature -Enchanted creature has flying. -Threshold - Enchanted creature has shroud as long as seven or more cards are in your graveyard. (It can't be the target of spells or abilities.) -ODY C - -Aboshan, Cephalid Emperor -{4}{U}{U} -Legendary Creature - Cephalid -3/3 -Tap an untapped Cephalid you control: Tap target permanent. -{U}{U}{U}: Tap all creatures without flying. -ODY R - -About Face -{R} -Instant -Switch target creature's power and toughness until end of turn. -ULG C - -Absolute Grace -{1}{W} -Enchantment -All creatures have protection from black. -USG U - -Absolute Law -{1}{W} -Enchantment -All creatures have protection from red. -USG U - -Absolver Thrull -{3}{W} -Creature - Thrull Cleric -2/3 -Haunt (When this creature dies, exile it haunting target creature.) -When Absolver Thrull enters the battlefield or the creature it haunts dies, destroy target enchantment. -GPT C - -Absorb -{W}{U}{U} -Instant -Counter target spell. You gain 3 life. -INV R - -Absorb Vis -{6}{B} -Sorcery -Target player loses 4 life and you gain 4 life. -Basic landcycling {1}{B} ({1}{B}, Discard this card: Search your library for a basic land card, reveal it, and put it into your hand. Then shuffle your library.) -CON C - -Abu Ja'far -{W} -Creature - Human -0/1 -When Abu Ja'far dies, destroy all creatures blocking or blocked by it. They can't be regenerated. -ARN U, CHR U - -Abuna Acolyte -{1}{W} -Creature - Cat Cleric -1/1 -{T}: Prevent the next 1 damage that would be dealt to target creature or player this turn. -{T}: Prevent the next 2 damage that would be dealt to target artifact creature this turn. -SOM U - -Abuna's Chant -{3}{W} -Instant -Choose one - You gain 5 life; or prevent the next 5 damage that would be dealt to target creature this turn. -Entwine {2} (Choose both if you pay the entwine cost.) -5DN C - -Abundance -{2}{G}{G} -Enchantment -If you would draw a card, you may instead choose land or nonland and reveal cards from the top of your library until you reveal a card of the chosen kind. Put that card into your hand and put all other cards revealed this way on the bottom of your library in any order. -USG R, 10E R - -Abyssal Gatekeeper -{1}{B} -Creature - Horror -1/1 -When Abyssal Gatekeeper dies, each player sacrifices a creature. -WTH C, DVD C - -Abyssal Horror -{4}{B}{B} -Creature - Horror -2/2 -Flying -When Abyssal Horror enters the battlefield, target player discards two cards. -USG R, S99 R, 7ED R - -Abyssal Hunter -{3}{B} -Creature - Human Assassin -1/1 -{B}, {T}: Tap target creature. Abyssal Hunter deals damage equal to Abyssal Hunter's power to that creature. -MIR R, 6ED R - -Abyssal Nightstalker -{3}{B} -Creature - Nightstalker -2/2 -Whenever Abyssal Nightstalker attacks and isn't blocked, defending player discards a card. -P02 U - -Abyssal Nocturnus -{1}{B}{B} -Creature - Horror -2/2 -Whenever an opponent discards a card, Abyssal Nocturnus gets +2/+2 and gains fear until end of turn. (It can't be blocked except by artifact creatures and/or black creatures.) -GPT R - -Abyssal Persecutor -{2}{B}{B} -Creature - Demon -6/6 -Flying, trample -You can't win the game and your opponents can't lose the game. -WWK M - -Abyssal Specter -{2}{B}{B} -Creature - Specter -2/3 -Flying -Whenever Abyssal Specter deals damage to a player, that player discards a card. -ICE U, 5ED U, 6ED U, BRB U, 7ED U, 8ED U, DVD U - -Academy Rector -{3}{W} -Creature - Human Cleric -1/2 -When Academy Rector dies, you may exile it. If you do, search your library for an enchantment card, put that card onto the battlefield, then shuffle your library. -UDS R - -Academy Researchers -{1}{U}{U} -Creature - Human Wizard -2/2 -When Academy Researchers enters the battlefield, you may put an Aura card from your hand onto the battlefield attached to Academy Researchers. -USG U, 10E U - -Academy Ruins -Legendary Land -{T}: Add {1} to your mana pool. -{1}{U}, {T}: Put target artifact card from your graveyard on top of your library. -TSP R - -Academy at Tolaria West -Plane - Dominaria -At the beginning of your end step, if you have no cards in hand, draw seven cards. -Whenever you roll {C}, discard your hand. -HOP C - -Accelerate -{1}{R} -Instant -Target creature gains haste until end of turn. -Draw a card. -TOR C - -Accelerated Mutation -{3}{G}{G} -Instant -Target creature gets +X/+X until end of turn, where X is the highest converted mana cost among permanents you control. -SCG C - -Acceptable Losses -{3}{R} -Sorcery -As an additional cost to cast Acceptable Losses, discard a card at random. -Acceptable Losses deals 5 damage to target creature. -ODY C - -Accorder Paladin -{1}{W} -Creature - Human Knight -3/1 -Battle cry (Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn.) -MBS U - -Accorder's Shield -{0} -Artifact - Equipment -Equipped creature gets +0/+3 and has vigilance. -Equip {3} -SOM C - -Accumulated Knowledge -{1}{U} -Instant -Draw a card, then draw cards equal to the number of cards named Accumulated Knowledge in all graveyards. -NEM C - -Accursed Centaur -{B} -Creature - Zombie Centaur -2/2 -When Accursed Centaur enters the battlefield, sacrifice a creature. -ONS C - -Acid Rain -{3}{U} -Sorcery -Destroy all Forests. -LEG R, ME4 R - -Acid Web Spider -{3}{G}{G} -Creature - Spider -3/5 -Reach -When Acid Web Spider enters the battlefield, you may destroy target Equipment. -SOM U - -Acidic Dagger -{4} -Artifact -{4}, {T}: Whenever target creature deals combat damage to a non-Wall creature this turn, destroy that non-Wall creature. When the targeted creature leaves the battlefield this turn, sacrifice Acidic Dagger. Activate this ability only during combat before blockers are declared. -MIR R - -Acidic Slime -{3}{G}{G} -Creature - Ooze -2/2 -Deathtouch (Any amount of damage this deals to a creature is enough to destroy it.) -When Acidic Slime enters the battlefield, destroy target artifact, enchantment, or land. -M10 U, M11 U, COM U, M12 U - -Acidic Sliver -{B}{R} -Creature - Sliver -2/2 -All Slivers have "{2}, Sacrifice this permanent: This permanent deals 2 damage to target creature or player." -STH U, H09 U - -Acidic Soil -{2}{R} -Sorcery -Acidic Soil deals damage to each player equal to the number of lands he or she controls. -USG U - -Acolyte of Xathrid -{B} -Creature - Human Cleric -0/1 -{1}{B}, {T}: Target player loses 1 life. -M10 C - -Acorn Catapult -{4} -Artifact -{1}, {T}: Acorn Catapult deals 1 damage to target creature or player. That creature's controller or that player puts a 1/1 green Squirrel creature token onto the battlefield. -COM R - -Acorn Harvest -{3}{G} -Sorcery -Put two 1/1 green Squirrel creature tokens onto the battlefield. -Flashback-{1}{G}, Pay 3 life. (You may cast this card from your graveyard for its flashback cost. Then exile it.) -TOR C - -Acquire -{3}{U}{U} -Sorcery -Search target opponent's library for an artifact card and put that card onto the battlefield under your control. Then that player shuffles his or her library. -5DN R - -Acridian -{1}{G} -Creature - Insect -2/4 -Echo {1}{G} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -USG C - -Act of Aggression -{3}{R/P}{R/P} -Instant -({R/P} can be paid with either {R} or 2 life.) -Gain control of target creature an opponent controls until end of turn. Untap that creature. It gains haste until end of turn. -NPH U - -Act of Treason -{2}{R} -Sorcery -Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. (It can attack and {T} this turn.) -M10 U, M11 C, M12 C - -Active Volcano -{R} -Instant -Choose one - Destroy target blue permanent; or return target Island to its owner's hand. -LEG C, CHR C, ME3 U - -Ad Nauseam -{3}{B}{B} -Instant -Reveal the top card of your library and put that card into your hand. You lose life equal to its converted mana cost. You may repeat this process any number of times. -ALA R - -Adamaro, First to Desire -{1}{R}{R} -Legendary Creature - Spirit -*/* -Adamaro, First to Desire's power and toughness are each equal to the number of cards in the hand of the opponent with the most cards in hand. -SOK R - -Adaptive Automaton -{3} -Artifact Creature - Construct -2/2 -As Adaptive Automaton enters the battlefield, choose a creature type. -Adaptive Automaton is the chosen type in addition to its other types. -Other creatures you control of the chosen type get +1/+1. -M12 R - -Adarkar Sentinel -{5} -Artifact Creature - Soldier -3/3 -{1}: Adarkar Sentinel gets +0/+1 until end of turn. -ICE U, ME2 C - -Adarkar Unicorn -{1}{W}{W} -Creature - Unicorn -2/2 -{T}: Add either {U} or {1}{U} to your mana pool. Spend this mana only to pay cumulative upkeep costs. -ICE C - -Adarkar Valkyrie -{4}{W}{W} -Snow Creature - Angel -4/5 -Flying, vigilance -{T}: When target creature other than Adarkar Valkyrie dies this turn, return that card to the battlefield under your control. -CSP R - -Adarkar Wastes -Land -{T}: Add {1} to your mana pool. -{T}: Add {W} or {U} to your mana pool. Adarkar Wastes deals 1 damage to you. -ICE R, 5ED R, 6ED R, 7ED R, 9ED R, 10E R - -Adarkar Windform -{4}{U} -Snow Creature - Illusion -3/3 -Flying -{1}{S}: Target creature loses flying until end of turn. ({S} can be paid with one mana from a snow permanent.) -CSP U - -Adder-Staff Boggart -{1}{R} -Creature - Goblin Warrior -2/1 -When Adder-Staff Boggart enters the battlefield, clash with an opponent. If you win, put a +1/+1 counter on Adder-Staff Boggart. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -LRW C - -Addle -{1}{B} -Sorcery -Choose a color. Target player reveals his or her hand and you choose a card of that color from it. That player discards that card. -INV U - -Admonition Angel -{3}{W}{W}{W} -Creature - Angel -6/6 -Flying -Landfall - Whenever a land enters the battlefield under your control, you may exile target nonland permanent other than Admonition Angel. -When Admonition Angel leaves the battlefield, return all cards exiled with it to the battlefield under their owners' control. -WWK M - -Adun Oakenshield -{B}{R}{G} -Legendary Creature - Human Knight -1/2 -{B}{R}{G}, {T}: Return target creature card from your graveyard to your hand. -LEG R, MED R - -Advance Scout -{1}{W} -Creature - Human Soldier Scout -1/1 -First strike -{W}: Target creature gains first strike until end of turn. -TMP C, BRB C - -Advanced Hoverguard -{3}{U} -Creature - Drone -2/2 -Flying -{U}: Advanced Hoverguard gains shroud until end of turn. (It can't be the target of spells or abilities.) -5DN C - -Adventurers' Guildhouse -Land -Green legendary creatures you control have "bands with other legendary creatures." (Any legendary creatures can attack in a band as long as at least one has "bands with other legendary creatures." Bands are blocked as a group. If at least two legendary creatures you control, one of which has "bands with other legendary creatures," are blocking or being blocked by the same creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -LEG U - -Adventuring Gear -{1} -Artifact - Equipment -Landfall - Whenever a land enters the battlefield under your control, equipped creature gets +2/+2 until end of turn. -Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) -ZEN C - -Advice from the Fae -{2/U}{2/U}{2/U} -Sorcery -({2/U} can be paid with any two mana or with {U}. This card's converted mana cost is 6.) -Look at the top five cards of your library. If you control more creatures than each other player, put two of those cards into your hand. Otherwise, put one of them into your hand. Then put the rest on the bottom of your library in any order. -SHM U - -Aegis Angel -{4}{W}{W} -Creature - Angel -5/5 -Flying -When Aegis Angel enters the battlefield, another target permanent is indestructible for as long as you control Aegis Angel. (Effects that say "destroy" don't destroy that permanent. An indestructible creature can't be destroyed by damage.) -M12 R - -Aegis of Honor -{W} -Enchantment -{1}: The next time an instant or sorcery spell would deal damage to you this turn, that spell deals that damage to its controller instead. -ODY R - -Aegis of the Meek -{3} -Artifact -{1}, {T}: Target 1/1 creature gets +1/+2 until end of turn. -ICE R - -Aeolipile -{2} -Artifact -{1}, {T}, Sacrifice Aeolipile: Aeolipile deals 2 damage to target creature or player. -FEM R, ME2 C - -Aeon Chronicler -{3}{U}{U} -Creature - Avatar -*/* -Aeon Chronicler's power and toughness are each equal to the number of cards in your hand. -Suspend X-{X}{3}{U}. X can't be 0. (Rather than cast this card from your hand, you may pay {X}{3}{U} and exile it with X time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -Whenever a time counter is removed from Aeon Chronicler while it's exiled, draw a card. -PLC R - -Aerial Caravan -{4}{U}{U} -Creature - Human Soldier -4/3 -Flying -{1}{U}{U}: Exile the top card of your library. Until end of turn, you may play that card. (Reveal the card as you exile it.) -MMQ R - -Aerie Mystics -{4}{W} -Creature - Bird Wizard -3/3 -Flying -{1}{G}{U}: Creatures you control gain shroud until end of turn. -CON U - -Aerie Ouphes -{4}{G} -Creature - Ouphe -3/3 -Sacrifice Aerie Ouphes: Aerie Ouphes deals damage equal to its power to target creature with flying. -Persist (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) -EVE C - -Aesthir Glider -{3} -Artifact Creature - Bird -2/1 -Flying -Aesthir Glider can't block. -ALL C (x2), ME4 C - -Affa Guard Hound -{2}{W} -Creature - Hound -2/2 -Flash -When Affa Guard Hound enters the battlefield, target creature gets +0/+3 until end of turn. -ROE U - -Afflict -{2}{B} -Instant -Target creature gets -1/-1 until end of turn. -Draw a card. -ODY C, 10E C - -Afiya Grove -{1}{G} -Enchantment -Afiya Grove enters the battlefield with three +1/+1 counters on it. -At the beginning of your upkeep, move a +1/+1 counter from Afiya Grove onto target creature. -When Afiya Grove has no +1/+1 counters on it, sacrifice it. -MIR R - -Afterlife -{2}{W} -Instant -Destroy target creature. It can't be regenerated. Its controller puts a 1/1 white Spirit creature token with flying onto the battlefield. -MIR U, MMQ U, COM U - -Aftershock -{2}{R}{R} -Sorcery -Destroy target artifact, creature, or land. Aftershock deals 3 damage to you. -TMP C - -Agadeem Occultist -{2}{B} -Creature - Human Shaman Ally -0/2 -{T}: Put target creature card from an opponent's graveyard onto the battlefield under your control if its converted mana cost is less than or equal to the number of Allies you control. -WWK R - -Ageless Entity -{3}{G}{G} -Creature - Elemental -4/4 -Whenever you gain life, put that many +1/+1 counters on Ageless Entity. -DST R - -Ageless Sentinels -{3}{W} -Creature - Wall -4/4 -Defender (This creature can't attack.) -Flying -When Ageless Sentinels blocks, it becomes a Bird Giant, and it loses defender. (It's no longer a Wall. This effect lasts indefinitely.) -SCG R - -Agent of Masks -{3}{W}{B} -Creature - Human Advisor -2/3 -At the beginning of your upkeep, each opponent loses 1 life. You gain life equal to the life lost this way. -GPT U - -Agent of Shauku -{1}{B} -Creature - Human Mercenary -1/1 -{1}{B}, Sacrifice a land: Target creature gets +2/+0 until end of turn. -PCY C - -Agent of Stromgald -{R} -Creature - Human Knight -1/1 -{R}: Add {B} to your mana pool. -ALL C (x2) - -Aggravated Assault -{2}{R} -Enchantment -{3}{R}{R}: Untap all creatures you control. After this main phase, there is an additional combat phase followed by an additional main phase. Activate this ability only any time you could cast a sorcery. -ONS R - -Aggression -{2}{R} -Enchantment - Aura -Enchant non-Wall creature -Enchanted creature has first strike and trample. -At the beginning of the end step of enchanted creature's controller, destroy that creature if it didn't attack this turn. -ICE U - -Aggressive Urge -{1}{G} -Instant -Target creature gets +1/+1 until end of turn. -Draw a card. -INV C, 10E C - -Agility -{1}{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+1 and has flanking. (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -MIR C - -Agonizing Demise -{3}{B} -Instant -Kicker {1}{R} (You may pay an additional {1}{R} as you cast this spell.) -Destroy target nonblack creature. It can't be regenerated. If Agonizing Demise was kicked, it deals damage equal to that creature's power to the creature's controller. -INV C - -Agonizing Memories -{2}{B}{B} -Sorcery -Look at target player's hand and choose two cards from it. Put them on top of that player's library in any order. -WTH U, 6ED U, 7ED U, 10E U - -Agony Warp -{U}{B} -Instant -Target creature gets -3/-0 until end of turn. -Target creature gets -0/-3 until end of turn. -ALA C, ARC C - -Agrus Kos, Wojek Veteran -{3}{R}{W} -Legendary Creature - Human Soldier -3/3 -Whenever Agrus Kos, Wojek Veteran attacks, attacking red creatures get +2/+0 and attacking white creatures get +0/+2 until end of turn. -RAV R - -Agyrem -Plane - Ravnica -Whenever a white creature dies, return it to the battlefield under its owner's control at the beginning of the next end step. -Whenever a nonwhite creature dies, return it to its owner's hand at the beginning of the next end step. -Whenever you roll {C}, creatures can't attack you until a player planeswalks. -HOP C - -Air Bladder -{U} -Enchantment - Aura -Enchant creature -Enchanted creature has flying. -Enchanted creature can block only creatures with flying. -NEM C - -Air Elemental -{3}{U}{U} -Creature - Elemental -4/4 -Flying -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, P02 U, 6ED U, S99 U, BRB U, BTD U, 7ED U, 8ED U, 9ED U, 10E U, JVC U, M10 U, ME4 U - -Air Servant -{4}{U} -Creature - Elemental -4/3 -Flying -{2}{U}: Tap target creature with flying. -M11 U - -Airborne Aid -{3}{U} -Sorcery -Draw a card for each Bird on the battlefield. -ONS C - -Airdrop Condor -{4}{R} -Creature - Bird -2/2 -Flying -{1}{R}, Sacrifice a Goblin creature: Airdrop Condor deals damage equal to the sacrificed creature's power to target creature or player. -ONS U - -Aisling Leprechaun -{G} -Creature - Faerie -1/1 -Whenever Aisling Leprechaun blocks or becomes blocked by a creature, that creature becomes green. (This effect lasts indefinitely.) -LEG C - -Ajani Goldmane -{2}{W}{W} -Planeswalker - Ajani -4 -[+1] You gain 2 life. -[-1] Put a +1/+1 counter on each creature you control. Those creatures gain vigilance until end of turn. -[-6] Put a white Avatar creature token onto the battlefield. It has "This creature's power and toughness are each equal to your life total." -LRW R, M10 M, M11 M - -Ajani Vengeant -{2}{R}{W} -Planeswalker - Ajani -3 -[+1] Target permanent doesn't untap during its controller's next untap step. -[-2] Ajani Vengeant deals 3 damage to target creature or player and you gain 3 life. -[-7] Destroy all lands target player controls. -ALA M - -Ajani's Mantra -{1}{W} -Enchantment -At the beginning of your upkeep, you may gain 1 life. -M11 C - -Ajani's Pridemate -{1}{W} -Creature - Cat Soldier -2/2 -Whenever you gain life, you may put a +1/+1 counter on Ajani's Pridemate. (For example, if an effect causes you to gain 3 life, you may put one +1/+1 counter on this creature.) -M11 U - -Akki Avalanchers -{R} -Creature - Goblin Warrior -1/1 -Sacrifice a land: Akki Avalanchers gets +2/+0 until end of turn. Activate this ability only once each turn. -CHK C - -Akki Blizzard-Herder -{1}{R} -Creature - Goblin Shaman -1/1 -When Akki Blizzard-Herder dies, each player sacrifices a land. -BOK C - -Akki Coalflinger -{1}{R}{R} -Creature - Goblin Shaman -2/2 -First strike -{R}, {T}: Attacking creatures gain first strike until end of turn. -CHK U, EVG U - -Akki Drillmaster -{2}{R} -Creature - Goblin Shaman -2/2 -{T}: Target creature gains haste until end of turn. -SOK C - -Akki Lavarunner -{3}{R} -Creature - Goblin Warrior -1/1 -Haste -Whenever Akki Lavarunner deals damage to an opponent, flip it. ----- -Tok-Tok, Volcano Born -Legendary Creature - Goblin Shaman -2/2 -Protection from red -If a red source would deal damage to a player, it deals that much damage plus 1 to that player instead. -CHK R - -Akki Raider -{1}{R} -Creature - Goblin Warrior -2/1 -Whenever a land is put into a graveyard from the battlefield, Akki Raider gets +1/+0 until end of turn. -BOK U - -Akki Rockspeaker -{1}{R} -Creature - Goblin Shaman -1/1 -When Akki Rockspeaker enters the battlefield, add {R} to your mana pool. -CHK C - -Akki Underling -{1}{R} -Creature - Goblin Warrior -2/1 -As long as you have seven or more cards in hand, Akki Underling gets +2/+1 and has first strike. -SOK C - -Akki Underminer -{3}{R} -Creature - Goblin Rogue Shaman -1/1 -Whenever Akki Underminer deals combat damage to a player, that player sacrifices a permanent. -CHK U - -Akoum Battlesinger -{1}{R} -Creature - Human Berserker Ally -1/1 -Haste -Whenever Akoum Battlesinger or another Ally enters the battlefield under your control, you may have Ally creatures you control get +1/+0 until end of turn. -WWK C - -Akoum Boulderfoot -{4}{R}{R} -Creature - Giant Warrior -4/5 -When Akoum Boulderfoot enters the battlefield, it deals 1 damage to target creature or player. -ROE U - -Akoum Refuge -Land -Akoum Refuge enters the battlefield tapped. -When Akoum Refuge enters the battlefield, you gain 1 life. -{T}: Add {B} or {R} to your mana pool. -ZEN U, COM U - -Akrasan Squire -{W} -Creature - Human Soldier -1/1 -Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.) -ALA C - -Akroma's Blessing -{2}{W} -Instant -Choose a color. Creatures you control gain protection from the chosen color until end of turn. -Cycling {W} ({W}, Discard this card: Draw a card.) -ONS U - -Akroma's Devoted -{3}{W} -Creature - Human Cleric -2/4 -Cleric creatures have vigilance. -LGN U - -Akroma's Memorial -{7} -Legendary Artifact -Creatures you control have flying, first strike, vigilance, trample, haste, and protection from black and from red. -FUT R - -Akroma's Vengeance -{4}{W}{W} -Sorcery -Destroy all artifacts, creatures, and enchantments. -Cycling {3} ({3}, Discard this card: Draw a card.) -ONS R, HOP R, COM R - -Akroma, Angel of Fury -{5}{R}{R}{R} -Legendary Creature - Angel -6/6 -Akroma, Angel of Fury can't be countered. -Flying, trample, protection from white and from blue -{R}: Akroma, Angel of Fury gets +1/+0 until end of turn. -Morph {3}{R}{R}{R} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -PLC R, COM R - -Akroma, Angel of Wrath -{5}{W}{W}{W} -Legendary Creature - Angel -6/6 -Flying, first strike, vigilance, trample, haste, protection from black and from red -LGN R, TSB S, DVD M - -Akroma, Angel of Wrath Avatar -Vanguard -Hand +1, life +7 -Whenever a creature enters the battlefield under your control, it gains two abilities chosen at random from flying, first strike, trample, haste, protection from black, protection from red, and vigilance. -VG S - -Akron Legionnaire -{6}{W}{W} -Creature - Giant Soldier -8/4 -Except for creatures named Akron Legionnaire and artifact creatures, creatures you control can't attack. -LEG R, CHR R, 5ED R, ME3 R - -Aku Djinn -{3}{B}{B} -Creature - Djinn -5/6 -Trample -At the beginning of your upkeep, put a +1/+1 counter on each creature each opponent controls. -VIS R - -Akuta, Born of Ash -{2}{B}{B} -Legendary Creature - Spirit -3/2 -Haste -At the beginning of your upkeep, if you have more cards in hand than each opponent, you may sacrifice a Swamp. If you do, return Akuta, Born of Ash from your graveyard to the battlefield. -SOK R - -Al-abara's Carpet -{5} -Artifact -{5}, {T}: Prevent all damage that would be dealt to you this turn by attacking creatures without flying. -LEG R, ME4 R - -Alabaster Dragon -{4}{W}{W} -Creature - Dragon -4/4 -Flying -When Alabaster Dragon dies, shuffle it into its owner's library. -POR R, WTH R - -Alabaster Leech -{W} -Creature - Leech -1/3 -White spells you cast cost {W} more to cast. -INV R - -Alabaster Mage -{1}{W} -Creature - Human Wizard -2/1 -{1}{W}: Target creature you control gains lifelink until end of turn. (Damage dealt by the creature also causes its controller to gain that much life.) -M12 U - -Alabaster Potion -{X}{W}{W} -Instant -Choose one - Target player gains X life; or prevent the next X damage that would be dealt to target creature or player this turn. -LEG C, 4ED C, 5ED C, ME3 U - -Alabaster Wall -{2}{W} -Creature - Wall -0/4 -Defender (This creature can't attack.) -{T}: Prevent the next 1 damage that would be dealt to target creature or player this turn. -MMQ C - -Alaborn Cavalier -{2}{W}{W} -Creature - Human Knight -2/2 -Whenever Alaborn Cavalier attacks, you may tap target creature. -P02 U, DDG U - -Alaborn Grenadier -{W}{W} -Creature - Human Soldier -2/2 -Vigilance -P02 C - -Alaborn Musketeer -{1}{W} -Creature - Human Soldier -2/1 -Reach (This creature can block creatures with flying.) -P02 C, ME4 C - -Alaborn Trooper -{2}{W} -Creature - Human Soldier -2/3 -P02 C, ME4 C - -Alaborn Veteran -{2}{W} -Creature - Human Knight -2/2 -{T}: Target creature gets +2/+2 until end of turn. Activate this ability only during your turn, before attackers are declared. -P02 R - -Alaborn Zealot -{W} -Creature - Human Soldier -1/1 -When Alaborn Zealot blocks a creature, destroy that creature and Alaborn Zealot. -P02 U - -Aladdin -{2}{R}{R} -Creature - Human Rogue -1/1 -{1}{R}{R}, {T}: Gain control of target artifact for as long as you control Aladdin. -ARN R, CHR U, ME4 R - -Aladdin's Lamp -{10} -Artifact -{X}, {T}: The next time you would draw a card this turn, instead look at the top X cards of your library, put all but one of them on the bottom of your library in a random order, then draw a card. X can't be 0. -ARN R, 3ED R, 4ED R - -Aladdin's Ring -{8} -Artifact -{8}, {T}: Aladdin's Ring deals 4 damage to target creature or player. -ARN R, 3ED R, 4ED R, 5ED R, 6ED R, 7ED R, 8ED R, 9ED R - -Alarum -{1}{W} -Instant -Untap target nonattacking creature. It gets +1/+3 until end of turn. -MIR C - -Albino Troll -{1}{G} -Creature - Troll -3/3 -Echo {1}{G} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -{1}{G}: Regenerate Albino Troll. -USG U, GVL U - -Alchor's Tomb -{4} -Artifact -{2}, {T}: Target permanent you control becomes the color of your choice. (This effect lasts indefinitely.) -LEG R, ME4 R - -Aleatory -{1}{R} -Instant -Cast Aleatory only during combat after blockers are declared. -Flip a coin. If you win the flip, target creature gets +1/+1 until end of turn. -Draw a card at the beginning of the next turn's upkeep. -MIR U - -Alert Shu Infantry -{2}{W} -Creature - Human Soldier -2/2 -Vigilance -PTK U - -Alexi's Cloak -{1}{U} -Enchantment - Aura -Flash -Enchant creature -Enchanted creature has shroud. (It can't be the target of spells or abilities.) -PCY C - -Alexi, Zephyr Mage -{3}{U}{U} -Legendary Creature - Human Spellshaper -3/3 -{X}{U}, {T}, Discard two cards: Return X target creatures to their owners' hands. -PCY R - -Algae Gharial -{3}{G} -Creature - Crocodile -1/1 -Shroud -Whenever another creature dies, you may put a +1/+1 counter on Algae Gharial. -ALA U - -Ali Baba -{R} -Creature - Human Rogue -1/1 -{R}: Tap target Wall. -ARN U, 4ED U - -Ali from Cairo -{2}{R}{R} -Creature - Human -0/1 -Damage that would reduce your life total to less than 1 reduces it to 1 instead. -ARN R, ME4 R - -Aliban's Tower -{1}{R} -Instant -Target blocking creature gets +3/+1 until end of turn. -HML C (x2) - -All Hallow's Eve -{2}{B}{B} -Sorcery -Exile All Hallow's Eve with two scream counters on it. -At the beginning of your upkeep, if All Hallow's Eve is exiled with a scream counter on it, remove a scream counter from it. If there are no more scream counters on it, put it into your graveyard and each player returns all creature cards from his or her graveyard to the battlefield. -LEG R, ME3 R - -All Is Dust -{7} -Tribal Sorcery - Eldrazi -Each player sacrifices all colored permanents he or she controls. -ROE M - -All Shall Smolder in My Wake -Scheme -When you set this scheme in motion, destroy up to one target artifact, up to one target enchantment, and up to one target nonbasic land. -ARC C - -All Suns' Dawn -{4}{G} -Sorcery -For each color, return up to one target card of that color from your graveyard to your hand. Exile All Suns' Dawn. -5DN R - -All in Good Time -Scheme -When you set this scheme in motion, take an extra turn after this one. Schemes can't be set in motion that turn. -ARC C - -Allay -{1}{W} -Instant -Buyback {3} (You may pay an additional {3} as you cast this spell. If you do, put this card into your hand as it resolves.) -Destroy target enchantment. -EXO C - -Alley Grifters -{1}{B}{B} -Creature - Human Mercenary -2/2 -Whenever Alley Grifters becomes blocked, defending player discards a card. -MMQ C - -Alliance of Arms -{W} -Sorcery -Join forces - Starting with you, each player may pay any amount of mana. Each player puts X 1/1 white Soldier creature tokens onto the battlefield, where X is the total amount of mana paid this way. -COM R - -Allied Strategies -{4}{U} -Sorcery -Domain - Target player draws a card for each basic land type among lands he or she controls. -PLS U, PVC U - -Allosaurus Rider -{5}{G}{G} -Creature - Elf Warrior -1+*/1+* -You may exile two green cards from your hand rather than pay Allosaurus Rider's mana cost. -Allosaurus Rider's power and toughness are each equal to 1 plus the number of lands you control. -CSP R, EVG R - -Alloy Golem -{6} -Artifact Creature - Golem -4/4 -As Alloy Golem enters the battlefield, choose a color. -Alloy Golem is the chosen color. (It's still an artifact.) -INV U - -Alloy Myr -{3} -Artifact Creature - Myr -2/2 -{T}: Add one mana of any color to your mana pool. -NPH U - -Alluring Scent -{1}{G}{G} -Sorcery -All creatures able to block target creature this turn do so. -POR R, P02 R, S99 R, ME4 C - -Alluring Siren -{1}{U} -Creature - Siren -1/1 -{T}: Target creature an opponent controls attacks you this turn if able. -M10 U, M11 U, M12 U - -Alms -{W} -Enchantment -{1}, Exile the top card of your graveyard: Prevent the next 1 damage that would be dealt to target creature this turn. -WTH C - -Alpha Kavu -{2}{G} -Creature - Kavu -2/2 -{1}{G}: Target Kavu creature gets -1/+1 until end of turn. -PLS U - -Alpha Myr -{2} -Artifact Creature - Myr -2/1 -MRD C - -Alpha Status -{2}{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2 for each other creature on the battlefield that shares a creature type with it. -SCG U - -Alpha Tyrranax -{4}{G}{G} -Creature - Beast -6/5 -SOM C - -Altar Golem -{7} -Artifact Creature - Golem -*/* -Trample -Altar Golem's power and toughness are each equal to the number of creatures on the battlefield. -Altar Golem doesn't untap during your untap step. -Tap five untapped creatures you control: Untap Altar Golem. -EVE R - -Altar of Bone -{G}{W} -Sorcery -As an additional cost to cast Altar of Bone, sacrifice a creature. -Search your library for a creature card, reveal that card, and put it into your hand. Then shuffle your library. -ICE R - -Altar of Dementia -{2} -Artifact -Sacrifice a creature: Target player puts a number of cards equal to the sacrificed creature's power from the top of his or her library into his or her graveyard. -TMP R - -Altar of Shadows -{7} -Artifact -At the beginning of your precombat main phase, add {B} to your mana pool for each charge counter on Altar of Shadows. -{7}, {T}: Destroy target creature. Then put a charge counter on Altar of Shadows. -MRD R - -Altar's Light -{2}{W}{W} -Instant -Exile target artifact or enchantment. -MRD U - -Alter Reality -{1}{U} -Instant -Change the text of target spell or permanent by replacing all instances of one color word with another. (This effect lasts indefinitely.) -Flashback {1}{U} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -TOR R - -Aluren -{2}{G}{G} -Enchantment -Any player may play creature cards with converted mana cost 3 or less without paying their mana cost and as though they had flash. -TMP R - -Ambassador Laquatus -{1}{U}{U} -Legendary Creature - Merfolk Wizard -1/3 -{3}: Target player puts the top three cards of his or her library into his or her graveyard. -TOR R, 10E R - -Ambassador Oak -{3}{G} -Creature - Treefolk Warrior -3/3 -When Ambassador Oak enters the battlefield, put a 1/1 green Elf Warrior creature token onto the battlefield. -MOR C - -Amber Prison -{4} -Artifact -You may choose not to untap Amber Prison during your untap step. -{4}, {T}: Tap target artifact, creature, or land. That permanent doesn't untap during its controller's untap step for as long as Amber Prison remains tapped. -MIR R, 6ED R - -Ambition's Cost -{3}{B} -Sorcery -You draw three cards and you lose 3 life. -PTK R, 8ED U - -Ambush -{3}{R} -Instant -Blocking creatures gain first strike until end of turn. -HML C - -Ambush Commander -{3}{G}{G} -Creature - Elf -2/2 -Forests you control are 1/1 green Elf creatures that are still lands. -{1}{G}, Sacrifice an Elf: Target creature gets +3/+3 until end of turn. -SCG R, EVG R - -Ambush Party -{4}{R} -Creature - Human Rogue -3/1 -First strike, haste -HML C (x2), 5ED C, ME2 C - -Amnesia -{3}{U}{U}{U} -Sorcery -Target player reveals his or her hand and discards all nonland cards. -DRK U, MED R - -Amoeboid Changeling -{1}{U} -Creature - Shapeshifter -1/1 -Changeling (This card is every creature type at all times.) -{T}: Target creature gains all creature types until end of turn. -{T}: Target creature loses all creature types until end of turn. -LRW C, H09 C - -Amok -{1}{R} -Enchantment -{1}, Discard a card at random: Put a +1/+1 counter on target creature. -STH R - -Amphibious Kavu -{2}{G} -Creature - Kavu -2/2 -Whenever Amphibious Kavu blocks or becomes blocked by one or more blue and/or black creatures, Amphibious Kavu gets +3/+3 until end of turn. -PLS C - -Amphin Cutthroat -{3}{U} -Creature - Salamander Rogue -2/4 -M12 C - -Amrou Kithkin -{W}{W} -Creature - Kithkin -1/1 -Amrou Kithkin can't be blocked by creatures with power 3 or greater. -LEG C, 4ED C, ME3 C - -Amrou Scout -{1}{W} -Creature - Kithkin Rebel Scout -2/1 -{4}, {T}: Search your library for a Rebel permanent card with converted mana cost 3 or less and put it onto the battlefield. Then shuffle your library. -TSP C - -Amrou Seekers -{2}{W} -Creature - Kithkin Rebel -2/2 -Amrou Seekers can't be blocked except by artifact creatures and/or white creatures. -TSP C - -Amugaba -{5}{U}{U} -Creature - Illusion -6/6 -Flying -{2}{U}, Discard a card: Return Amugaba to its owner's hand. -ODY R - -Amulet of Kroog -{2} -Artifact -{2}, {T}: Prevent the next 1 damage that would be dealt to target creature or player this turn. -ATQ C, 4ED C, 5ED C, ME4 C - -Amulet of Quoz -{6} -Artifact -Remove Amulet of Quoz from your deck before playing if you're not playing for ante. -{T}, Sacrifice Amulet of Quoz: Target opponent may add the top card of his or her library to the ante. If he or she doesn't, you flip a coin. If you win the flip, that player loses the game. If you lose the flip, you lose the game. Activate this ability only during your upkeep. -ICE R - -Amulet of Unmaking -{5} -Artifact -{5}, {T}, Exile Amulet of Unmaking: Exile target artifact, creature, or land. Activate this ability only any time you could cast a sorcery. -MIR R - -Amulet of Vigor -{1} -Artifact -Whenever a permanent enters the battlefield tapped and under your control, untap it. -WWK R - -An-Havva Constable -{1}{G}{G} -Creature - Human -2/1+* -An-Havva Constable's toughness is equal to 1 plus the number of green creatures on the battlefield. -HML R, 5ED R - -An-Havva Inn -{1}{G}{G} -Sorcery -You gain X plus 1 life, where X is the number of green creatures on the battlefield. -HML U - -An-Havva Township -Land -{T}: Add {1} to your mana pool. -{1}, {T}: Add {G} to your mana pool. -{2}, {T}: Add {R} or {W} to your mana pool. -HML U - -An-Zerrin Ruins -{2}{R}{R} -Enchantment -As An-Zerrin Ruins enters the battlefield, choose a creature type. -Creatures of the chosen type don't untap during their controllers' untap steps. -HML R, ME2 R - -Ana Battlemage -{2}{G} -Creature - Human Wizard -2/2 -Kicker {2}{U} and/or {1}{B} (You may pay an additional {2}{U} and/or {1}{B} as you cast this spell.) -When Ana Battlemage enters the battlefield, if it was kicked with its {2}{U} kicker, target player discards three cards. -When Ana Battlemage enters the battlefield, if it was kicked with its {1}{B} kicker, tap target untapped creature and that creature deals damage equal to its power to its controller. -PLC U - -Ana Disciple -{G} -Creature - Human Wizard -1/1 -{U}, {T}: Target creature gains flying until end of turn. -{B}, {T}: Target creature gets -2/-0 until end of turn. -APC C - -Ana Sanctuary -{2}{G} -Enchantment -At the beginning of your upkeep, if you control a blue or black permanent, target creature gets +1/+1 until end of turn. If you control a blue permanent and a black permanent, that creature gets +5/+5 until end of turn instead. -APC U - -Anaba Ancestor -{1}{R} -Creature - Minotaur Spirit -1/1 -{T}: Another target Minotaur creature gets +1/+1 until end of turn. -HML R, ME3 C - -Anaba Bodyguard -{3}{R} -Creature - Minotaur -2/3 -First strike (This creature deals combat damage before creatures without first strike.) -HML C (x2), 6ED C, 10E C - -Anaba Shaman -{3}{R} -Creature - Minotaur Shaman -2/2 -{R}, {T}: Anaba Shaman deals 1 damage to target creature or player. -HML C (x2), 6ED C, 8ED C, 9ED C - -Anaba Spirit Crafter -{2}{R}{R} -Creature - Minotaur Shaman -1/3 -Minotaur creatures get +1/+0. -HML R, ME3 C - -Anaconda -{3}{G} -Creature - Snake -3/3 -Swampwalk (This creature is unblockable as long as defending player controls a Swamp.) -POR U (x2), USG U, 7ED U, 9ED U - -Anarchist -{4}{R} -Creature - Human Wizard -2/2 -When Anarchist enters the battlefield, you may return target sorcery card from your graveyard to your hand. -EXO C, ODY C, 9ED U - -Anarchy -{2}{R}{R} -Sorcery -Destroy all white permanents. -ICE U, ME2 R - -Anathemancer -{1}{B}{R} -Creature - Zombie Wizard -2/2 -When Anathemancer enters the battlefield, it deals damage to target player equal to the number of nonbasic lands that player controls. -Unearth {5}{B}{R} ({5}{B}{R}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) -ARB U - -Anavolver -{3}{G} -Creature - Volver -3/3 -Kicker {1}{U} and/or {B} (You may pay an additional {1}{U} and/or {B} as you cast this spell.) -If Anavolver was kicked with its {1}{U} kicker, it enters the battlefield with two +1/+1 counters on it and with flying. -If Anavolver was kicked with its {B} kicker, it enters the battlefield with a +1/+1 counter on it and with "Pay 3 life: Regenerate Anavolver." -APC R - -Ancestor's Chosen -{5}{W}{W} -Creature - Human Cleric -4/4 -First strike (This creature deals combat damage before creatures without first strike.) -When Ancestor's Chosen enters the battlefield, you gain 1 life for each card in your graveyard. -JUD U, 10E U - -Ancestor's Prophet -{4}{W} -Creature - Human Cleric -1/5 -Tap five untapped Clerics you control: You gain 10 life. -ONS R - -Ancestral Knowledge -{1}{U} -Enchantment -Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -When Ancestral Knowledge enters the battlefield, look at the top ten cards of your library, then exile any number of them and put the rest back on top of your library in any order. -When Ancestral Knowledge leaves the battlefield, shuffle your library. -WTH R - -Ancestral Mask -{2}{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2 for each other enchantment on the battlefield. -MMQ C - -Ancestral Memories -{2}{U}{U}{U} -Sorcery -Look at the top seven cards of your library. Put two of them into your hand and the rest into your graveyard. -MIR R, POR R, 6ED R, 7ED R - -Ancestral Recall -{U} -Instant -Target player draws three cards. -LEA R, LEB R, 2ED R - -Ancestral Tribute -{5}{W}{W} -Sorcery -You gain 2 life for each card in your graveyard. -Flashback {9}{W}{W}{W} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY R - -Ancestral Vision -Sorcery -Ancestral Vision is blue. -Suspend 4-{U} (Rather than cast this card from your hand, pay {U} and exile it with four time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) -Target player draws three cards. -TSP R, JVC R - -Ancient Amphitheater -Land -As Ancient Amphitheater enters the battlefield, you may reveal a Giant card from your hand. If you don't, Ancient Amphitheater enters the battlefield tapped. -{T}: Add {R} or {W} to your mana pool. -LRW R - -Ancient Craving -{3}{B} -Sorcery -You draw three cards and you lose 3 life. -P02 R, S99 R - -Ancient Den -Artifact Land -(Ancient Den isn't a spell.) -{T}: Add {W} to your mana pool. -MRD C, HOP C - -Ancient Grudge -{1}{R} -Instant -Destroy target artifact. -Flashback {G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -TSP C - -Ancient Hellkite -{4}{R}{R}{R} -Creature - Dragon -6/6 -Flying -{R}: Ancient Hellkite deals 1 damage to target creature defending player controls. Activate this ability only if Ancient Hellkite is attacking. -M11 R - -Ancient Hydra -{4}{R} -Creature - Hydra -5/1 -Fading 5 (This creature enters the battlefield with five fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.) -{1}, Remove a fade counter from Ancient Hydra: Ancient Hydra deals 1 damage to target creature or player. -NEM U - -Ancient Kavu -{3}{R} -Creature - Kavu -3/3 -{2}: Ancient Kavu becomes colorless until end of turn. -INV C - -Ancient Ooze -{5}{G}{G} -Creature - Ooze -*/* -Ancient Ooze's power and toughness are each equal to the total converted mana cost of other creatures you control. -SCG R - -Ancient Runes -{2}{R} -Enchantment -At the beginning of each player's upkeep, Ancient Runes deals damage to that player equal to the number of artifacts he or she controls. -TMP U - -Ancient Silverback -{4}{G}{G} -Creature - Ape -6/5 -{G}: Regenerate Ancient Silverback. (The next time this creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.) -UDS R, 7ED R, 9ED R - -Ancient Spider -{2}{G}{W} -Creature - Spider -2/5 -First strike; reach (This creature can block creatures with flying.) -PLS R - -Ancient Spring -Land -Ancient Spring enters the battlefield tapped. -{T}: Add {U} to your mana pool. -{T}, Sacrifice Ancient Spring: Add {W}{B} to your mana pool. -INV C - -Ancient Stirrings -{G} -Sorcery -Look at the top five cards of your library. You may reveal a colorless card from among them and put it into your hand. Then put the rest on the bottom of your library in any order. (Cards with no colored mana in their mana costs are colorless. Lands are also colorless.) -ROE C - -Ancient Tomb -Land -{T}: Add {2} to your mana pool. Ancient Tomb deals 2 damage to you. -TMP U - -Ancient Ziggurat -Land -{T}: Add one mana of any color to your mana pool. Spend this mana only to cast creature spells. -CON U, H09 U - -Andradite Leech -{2}{B} -Creature - Leech -2/2 -Black spells you cast cost {B} more to cast. -{B}: Andradite Leech gets +1/+1 until end of turn. -INV R - -Angel of Despair -{3}{W}{W}{B}{B} -Creature - Angel -5/5 -Flying -When Angel of Despair enters the battlefield, destroy target permanent. -GPT R, COM R - -Angel of Fury -{4}{W}{W} -Creature - Angel -3/5 -Flying -When Angel of Fury is put into your graveyard from the battlefield, you may shuffle it into your library. -P02 R, ME2 R - -Angel of Light -{4}{W} -Creature - Angel -3/3 -Flying, vigilance -S99 U, ME2 U - -Angel of Mercy -{4}{W} -Creature - Angel -3/3 -Flying -When Angel of Mercy enters the battlefield, you gain 3 life. -P02 U, S99 U, INV U, 8ED U, 9ED U, 10E U, DVD U - -Angel of Retribution -{6}{W} -Creature - Angel -5/5 -Flying, first strike -TOR R - -Angel of Salvation -{6}{W}{W} -Creature - Angel -5/5 -Flash; convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.) -Flying -When Angel of Salvation enters the battlefield, prevent the next 5 damage that would be dealt this turn to any number of target creatures and/or players, divided as you choose. -FUT R, EVT R - -Angel's Feather -{2} -Artifact -Whenever a player casts a white spell, you may gain 1 life. -DST U, 9ED U, 10E U, DVD U, M10 U, M11 U, M12 U - -Angel's Grace -{W} -Instant -Split second (As long as this spell is on the stack, players can't cast spells or activate abilities that aren't mana abilities.) -You can't lose the game this turn and your opponents can't win the game this turn. Until end of turn, damage that would reduce your life total to less than 1 reduces it to 1 instead. -TSP R - -Angel's Herald -{W} -Creature - Human Cleric -1/1 -{2}{W}, {T}, Sacrifice a green creature, a white creature, and a blue creature: Search your library for a card named Empyrial Archangel and put it onto the battlefield. Then shuffle your library. -ALA U - -Angel's Mercy -{2}{W}{W} -Instant -You gain 7 life. -M10 C, M12 C - -Angel's Trumpet -{3} -Artifact -All creatures have vigilance. -At the beginning of each player's end step, tap all untapped creatures that player controls that didn't attack this turn. Angel's Trumpet deals damage to the player equal to the number of creatures tapped this way. -ULG U - -Angelfire Crusader -{3}{W} -Creature - Human Soldier Knight -2/3 -{R}: Angelfire Crusader gets +1/+0 until end of turn. -APC C - -Angelheart Vial -{5} -Artifact -Whenever you're dealt damage, you may put that many charge counters on Angelheart Vial. -{2}, {T}, Remove four charge counters from Angelheart Vial: You gain 2 life and draw a card. -ROE R - -Angelic Arbiter -{5}{W}{W} -Creature - Angel -5/6 -Flying -Each opponent who cast a spell this turn can't attack with creatures. -Each opponent who attacked with a creature this turn can't cast spells. -M11 R, COM R - -Angelic Benediction -{3}{W} -Enchantment -Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.) -Whenever a creature you control attacks alone, you may tap target creature. -ALA U, DVD U - -Angelic Blessing -{2}{W} -Sorcery -Target creature gets +3/+3 and gains flying until end of turn. (It can't be blocked except by creatures with flying or reach.) -POR C, P02 C, EXO C, S99 C, S00 C, 9ED C, 10E C - -Angelic Chorus -{3}{W}{W} -Enchantment -Whenever a creature enters the battlefield under your control, you gain life equal to its toughness. -USG R, 10E R - -Angelic Curator -{1}{W} -Creature - Angel Spirit -1/1 -Flying, protection from artifacts -ULG C - -Angelic Destiny -{2}{W}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +4/+4, has flying and first strike, and is an Angel in addition to its other types. -When enchanted creature dies, return Angelic Destiny to its owner's hand. -M12 M - -Angelic Favor -{3}{W} -Instant -If you control a Plains, you may tap an untapped creature you control rather than pay Angelic Favor's mana cost. -Cast Angelic Favor only during combat. -Put a 4/4 white Angel creature token with flying onto the battlefield. Exile it at the beginning of the next end step. -NEM U - -Angelic Page -{1}{W} -Creature - Angel Spirit -1/1 -Flying -{T}: Target attacking or blocking creature gets +1/+1 until end of turn. -USG C, BRB C, 7ED C, 8ED C, DVD C - -Angelic Protector -{3}{W} -Creature - Angel -2/2 -Flying -Whenever Angelic Protector becomes the target of a spell or ability, Angelic Protector gets +0/+3 until end of turn. -TMP U, DVD U - -Angelic Renewal -{1}{W} -Enchantment -Whenever a creature is put into your graveyard from the battlefield, you may sacrifice Angelic Renewal. If you do, return that card to the battlefield. -WTH C - -Angelic Shield -{W}{U} -Enchantment -Creatures you control get +0/+1. -Sacrifice Angelic Shield: Return target creature to its owner's hand. -INV U - -Angelic Voices -{2}{W}{W} -Enchantment -Creatures you control get +1/+1 as long as you control no nonartifact, nonwhite creatures. -LEG R, CHR R, ME4 U - -Angelic Wall -{1}{W} -Creature - Wall -0/4 -Defender, flying (This creature can't attack, and it can block creatures with flying.) -P02 C, ODY C, 10E C - -Angelsong -{1}{W} -Instant -Prevent all combat damage that would be dealt this turn. -Cycling {2} ({2}, Discard this card: Draw a card.) -ALA C, DVD C - -Anger -{3}{R} -Creature - Incarnation -2/2 -Haste -As long as Anger is in your graveyard and you control a Mountain, creatures you control have haste. -JUD U, COM U - -Angry Mob -{2}{W}{W} -Creature - Human -2+*/2+* -Trample -As long as it's your turn, Angry Mob's power and toughness are each equal to 2 plus the number of Swamps your opponents control. As long as it's not your turn, Angry Mob's power and toughness are each 2. -DRK U, 4ED U, 5ED U, MED U - -Angus Mackenzie -{G}{W}{U} -Legendary Creature - Human Cleric -2/2 -{G}{W}{U}, {T}: Prevent all combat damage that would be dealt this turn. Activate this ability only before the combat damage step. -LEG R, ME3 R - -Animal Boneyard -{2}{W} -Enchantment - Aura -Enchant land -Enchanted land has "{T}, Sacrifice a creature: You gain life equal to that creature's toughness." -ODY U - -Animal Magnetism -{4}{G} -Sorcery -Reveal the top five cards of your library. An opponent chooses a creature card from among them. Put that card onto the battlefield and the rest into your graveyard. -ONS R - -Animar, Soul of Elements -{U}{R}{G} -Legendary Creature - Elemental -1/1 -Protection from white and from black -Whenever you cast a creature spell, put a +1/+1 counter on Animar, Soul of Elements. -Creature spells you cast cost {1} less to cast for each +1/+1 counter on Animar. -COM M - -Animate Artifact -{3}{U} -Enchantment - Aura -Enchant artifact -As long as enchanted artifact isn't a creature, it's an artifact creature with power and toughness each equal to its converted mana cost. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, ME4 U - -Animate Dead -{1}{B} -Enchantment - Aura -Enchant creature card in a graveyard -When Animate Dead enters the battlefield, if it's on the battlefield, it loses "enchant creature card in a graveyard" and gains "enchant creature put onto the battlefield with Animate Dead." Return enchanted creature card to the battlefield under your control and attach Animate Dead to it. When Animate Dead leaves the battlefield, that creature's controller sacrifices it. -Enchanted creature gets -1/-0. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, MED U - -Animate Land -{G} -Instant -Until end of turn, target land becomes a 3/3 creature that's still a land. -NEM U - -Animate Wall -{W} -Enchantment - Aura -Enchant Wall -Enchanted Wall can attack as though it didn't have defender. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, 6ED R, MED U - -Ankh of Mishra -{2} -Artifact -Whenever a land enters the battlefield, Ankh of Mishra deals 2 damage to that land's controller. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, 6ED R, MED R - -Annex -{2}{U}{U} -Enchantment - Aura -Enchant land (Target a land as you cast this. This card enters the battlefield attached to that land.) -You control enchanted land. -ONS U, 9ED U - -Annihilate -{3}{B}{B} -Instant -Destroy target nonblack creature. It can't be regenerated. -Draw a card. -INV U - -Annul -{U} -Instant -Counter target artifact or enchantment spell. -USG C, MRD C - -Anodet Lurker -{5} -Artifact Creature - Construct -3/3 -When Anodet Lurker dies, you gain 3 life. -5DN C - -Anoint -{W} -Instant -Buyback {3} (You may pay an additional {3} as you cast this spell. If you do, put this card into your hand as it resolves.) -Prevent the next 3 damage that would be dealt to target creature this turn. -TMP C - -Anowon, the Ruin Sage -{3}{B}{B} -Legendary Creature - Vampire Shaman -4/3 -At the beginning of your upkeep, each player sacrifices a non-Vampire creature. -WWK R - -Ant Queen -{3}{G}{G} -Creature - Insect -5/5 -{1}{G}: Put a 1/1 green Insect creature token onto the battlefield. -M10 R - -Antagonism -{3}{R} -Enchantment -At the beginning of each player's end step, Antagonism deals 2 damage to that player unless one of his or her opponents was dealt damage this turn. -USG R - -Anthem of Rakdos -{2}{B}{R}{R} -Enchantment -Whenever a creature you control attacks, it gets +2/+0 until end of turn and Anthem of Rakdos deals 1 damage to you. -Hellbent - As long as you have no cards in hand, if a source you control would deal damage to a creature or player, it deals double that damage to that creature or player instead. -DIS R - -Anthroplasm -{2}{U}{U} -Creature - Shapeshifter -0/0 -Anthroplasm enters the battlefield with two +1/+1 counters on it. -{X}, {T}: Remove all +1/+1 counters from Anthroplasm and put X +1/+1 counters on it. -ULG R - -Anti-Magic Aura -{2}{U} -Enchantment - Aura -Enchant creature -Enchanted creature can't be the target of spells and can't be enchanted. This effect doesn't remove Anti-Magic Aura. -LEG C, 5ED U - -Antler Skulkin -{5} -Artifact Creature - Scarecrow -3/3 -{2}: Target white creature gains persist until end of turn. (When it dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) -EVE C - -Anurid Barkripper -{1}{G}{G} -Creature - Frog Beast -2/2 -Threshold - Anurid Barkripper gets +2/+2 as long as seven or more cards are in your graveyard. -JUD C - -Anurid Brushhopper -{1}{G}{W} -Creature - Frog Beast -3/4 -Discard two cards: Exile Anurid Brushhopper. Return it to the battlefield under its owner's control at the beginning of the next end step. -JUD R - -Anurid Murkdiver -{4}{B}{B} -Creature - Zombie Frog Beast -4/3 -Swampwalk -ONS C - -Anurid Scavenger -{2}{G} -Creature - Frog Beast -3/3 -Protection from black -At the beginning of your upkeep, sacrifice Anurid Scavenger unless you put a card from your graveyard on the bottom of your library. -TOR U - -Anurid Swarmsnapper -{2}{G} -Creature - Frog Beast -1/4 -Reach (This creature can block creatures with flying.) -{1}{G}: Anurid Swarmsnapper can block an additional creature this turn. -JUD U - -Anvil of Bogardan -{2} -Artifact -Players have no maximum hand size. -At the beginning of each player's draw step, that player draws an additional card, then discards a card. -VIS R - -Apathy -{U} -Enchantment - Aura -Enchant creature -Enchanted creature doesn't untap during its controller's untap step. -At the beginning of the upkeep of enchanted creature's controller, that player may discard a card at random. If he or she does, untap that creature. -WTH C - -Apes of Rath -{2}{G}{G} -Creature - Ape -5/4 -Whenever Apes of Rath attacks, it doesn't untap during its controller's next untap step. -TMP U - -Apex Hawks -{2}{W} -Creature - Bird -2/2 -Multikicker {1}{W} (You may pay an additional {1}{W} any number of times as you cast this spell.) -Flying -Apex Hawks enters the battlefield with a +1/+1 counter on it for each time it was kicked. -WWK C - -Aphetto Alchemist -{1}{U} -Creature - Human Wizard -1/2 -{T}: Untap target artifact or creature. -Morph {U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS U - -Aphetto Dredging -{3}{B} -Sorcery -Return up to three target creature cards of the creature type of your choice from your graveyard to your hand. -ONS C, H09 C - -Aphetto Exterminator -{2}{B} -Creature - Human Wizard -3/1 -Morph {3}{B} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Aphetto Exterminator is turned face up, target creature gets -3/-3 until end of turn. -LGN U - -Aphetto Grifter -{2}{U} -Creature - Human Wizard -1/1 -Tap two untapped Wizards you control: Tap target permanent. -ONS U - -Aphetto Runecaster -{3}{U} -Creature - Human Wizard -2/3 -Whenever a permanent is turned face up, you may draw a card. -SCG U - -Aphetto Vulture -{4}{B}{B} -Creature - Zombie Bird -3/2 -Flying -When Aphetto Vulture dies, you may put target Zombie card from your graveyard on top of your library. -ONS U - -Aphotic Wisps -{B} -Instant -Target creature becomes black and gains fear until end of turn. (It can't be blocked except by artifact creatures and/or black creatures.) -Draw a card. -SHM C - -Apocalypse -{2}{R}{R}{R} -Sorcery -Exile all permanents. You discard your hand. -TMP R - -Apocalypse Chime -{2} -Artifact -{2}, {T}, Sacrifice Apocalypse Chime: Destroy all nontoken permanents from the Homelands expansion. They can't be regenerated. -HML R - -Apocalypse Hydra -{X}{R}{G} -Creature - Hydra -0/0 -Apocalypse Hydra enters the battlefield with X +1/+1 counters on it. If X is 5 or more, it enters the battlefield with an additional X +1/+1 counters on it. -{1}{R}, Remove a +1/+1 counter from Apocalypse Hydra: Apocalypse Hydra deals 1 damage to target creature or player. -CON M - -Apostle's Blessing -{1}{W/P} -Instant -({W/P} can be paid with either {W} or 2 life.) -Target artifact or creature you control gains protection from artifacts or from the color of your choice until end of turn. -NPH C - -Apothecary Initiate -{W} -Creature - Kithkin Cleric -1/1 -Whenever a player casts a white spell, you may pay {1}. If you do, you gain 1 life. -SHM C - -Apprentice Necromancer -{1}{B} -Creature - Zombie Wizard -1/1 -{B}, {T}, Sacrifice Apprentice Necromancer: Return target creature card from your graveyard to the battlefield. That creature gains haste. At the beginning of the next end step, sacrifice it. -UDS R - -Apprentice Sorcerer -{2}{U} -Creature - Human Wizard -1/1 -{T}: Apprentice Sorcerer deals 1 damage to target creature or player. Activate this ability only during your turn, before attackers are declared. -P02 U - -Apprentice Wizard -{1}{U}{U} -Creature - Human Wizard -0/1 -{U}, {T}: Add {3} to your mana pool. -DRK R, 4ED C, MED C - -Approach My Molten Realm -Scheme -When you set this scheme in motion, until your next turn, if a source would deal damage, it deals double that damage instead. -ARC C - -Aquamoeba -{1}{U} -Creature - Elemental Beast -1/3 -Discard a card: Switch Aquamoeba's power and toughness until end of turn. -TOR C - -Aquamorph Entity -{2}{U}{U} -Creature - Shapeshifter -*/* -As Aquamorph Entity enters the battlefield or is turned face up, it becomes your choice of 5/1 or 1/5. -Morph {2}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -PLC C - -Aquastrand Spider -{1}{G} -Creature - Spider Mutant -0/0 -Graft 2 (This creature enters the battlefield with two +1/+1 counters on it. Whenever another creature enters the battlefield, you may move a +1/+1 counter from this creature onto it.) -{G}: Target creature with a +1/+1 counter on it gains reach until end of turn. (It can block creatures with flying.) -DIS C, COM C - -Aquitect's Will -{U} -Tribal Sorcery - Merfolk -Put a flood counter on target land. That land is an Island in addition to its other types for as long as it has a flood counter on it. If you control a Merfolk, draw a card. -LRW C - -Araba Mothrider -{1}{W} -Creature - Human Samurai -1/1 -Flying -Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -SOK C - -Arachnoid -{6} -Artifact Creature - Spider -2/6 -Reach (This creature can block creatures with flying.) -5DN U - -Arachnus Spinner -{5}{G} -Creature - Spider -5/7 -Reach (This creature can block creatures with flying.) -Tap an untapped Spider you control: Search your graveyard and/or library for a card named Arachnus Web and put it onto the battlefield attached to target creature. If you search your library this way, shuffle it. -M12 R - -Arachnus Web -{2}{G} -Enchantment - Aura -Enchant creature -Enchanted creature can't attack or block, and its activated abilities can't be activated. -At the beginning of the end step, if enchanted creature's power is 4 or greater, destroy Arachnus Web. -M12 C - -Arashi, the Sky Asunder -{3}{G}{G} -Legendary Creature - Spirit -5/5 -{X}{G}, {T}: Arashi, the Sky Asunder deals X damage to target creature with flying. -Channel - {X}{G}{G}, Discard Arashi: Arashi deals X damage to each creature with flying. -SOK R - -Arbalest Elite -{2}{W}{W} -Creature - Human Archer -2/3 -{2}{W}, {T}: Arbalest Elite deals 3 damage to target attacking or blocking creature. Arbalest Elite doesn't untap during your next untap step. -M12 U - -Arbiter of Knollridge -{6}{W} -Creature - Giant Wizard -5/5 -Vigilance -When Arbiter of Knollridge enters the battlefield, each player's life total becomes the highest life total among all players. -LRW R, COM R - -Arbor Elf -{G} -Creature - Elf Druid -1/1 -{T}: Untap target Forest. -WWK C - -Arboria -{2}{G}{G} -World Enchantment -Creatures can't attack a player unless that player cast a spell or put a nontoken permanent onto the battlefield during his or her last turn. -LEG U, ME3 R - -Arc Blade -{3}{R}{R} -Sorcery -Arc Blade deals 2 damage to target creature or player. Exile Arc Blade with three time counters on it. -Suspend 3-{2}{R} (Rather than cast this card from your hand, you may pay {2}{R} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) -FUT U - -Arc Lightning -{2}{R} -Sorcery -Arc Lightning deals 3 damage divided as you choose among one, two, or three target creatures and/or players. -USG C, BRB C, HOP C - -Arc Mage -{2}{R} -Creature - Human Spellshaper -2/2 -{2}{R}, {T}, Discard a card: Arc Mage deals 2 damage divided as you choose among one or two target creatures and/or players. -NEM U - -Arc Runner -{2}{R} -Creature - Elemental Ox -5/1 -Haste (This creature can attack and {T} as soon as it comes under your control.) -At the beginning of the end step, sacrifice Arc Runner. -M11 C - -Arc Trail -{1}{R} -Sorcery -Arc Trail deals 2 damage to target creature or player and 1 damage to another target creature or player. -SOM U - -Arc-Slogger -{3}{R}{R} -Creature - Beast -4/5 -{R}, Exile the top ten cards of your library: Arc-Slogger deals 2 damage to target creature or player. -MRD R - -Arcades Sabboth -{2}{G}{G}{W}{W}{U}{U} -Legendary Creature - Elder Dragon -7/7 -Flying -At the beginning of your upkeep, sacrifice Arcades Sabboth unless you pay {G}{W}{U}. -Each untapped creature you control gets +0/+2 as long as it's not attacking. -{W}: Arcades Sabboth gets +0/+1 until end of turn. -LEG R, CHR R, ME3 R - -Arcane Denial -{1}{U} -Instant -Counter target spell. Its controller may draw up to two cards at the beginning of the next turn's upkeep. -You draw a card at the beginning of the next turn's upkeep. -ALL C (x2), MED C - -Arcane Laboratory -{2}{U} -Enchantment -Each player can't cast more than one spell each turn. -USG U, 7ED U - -Arcane Sanctum -Land -Arcane Sanctum enters the battlefield tapped. -{T}: Add {W}, {U}, or {B} to your mana pool. -ALA U - -Arcane Spyglass -{4} -Artifact -{2}, {T}, Sacrifice a land: Draw a card and put a charge counter on Arcane Spyglass. -Remove three charge counters from Arcane Spyglass: Draw a card. -DST C - -Arcane Teachings -{2}{R} -Enchantment - Aura -Enchant creature (Target a creature as you cast this. This card enters the battlefield attached to that creature.) -Enchanted creature gets +2/+2 and has "{T}: This creature deals 1 damage to target creature or player." -JUD C, 10E U - -Arcanis the Omnipotent -{3}{U}{U}{U} -Legendary Creature - Wizard -3/4 -{T}: Draw three cards. -{2}{U}{U}: Return Arcanis the Omnipotent to its owner's hand. -ONS R, 10E R - -Arcanis, the Omnipotent Avatar -Vanguard -Hand +1, life -3 -{X}, Return a creature you control with converted mana cost X to its owner's hand: Draw a number of cards chosen at random between 0 and X. X can't be 0. -VG S - -Arcanum Wings -{1}{U} -Enchantment - Aura -Enchant creature -Enchanted creature has flying. -Aura swap {2}{U} ({2}{U}: Exchange this Aura with an Aura card in your hand.) -FUT U - -Arcbound Bruiser -{5} -Artifact Creature - Golem -0/0 -Modular 3 (This enters the battlefield with three +1/+1 counters on it. When it dies, you may put its +1/+1 counters on target artifact creature.) -DST C - -Arcbound Crusher -{4} -Artifact Creature - Juggernaut -0/0 -Trample -Whenever another artifact enters the battlefield, put a +1/+1 counter on Arcbound Crusher. -Modular 1 (This enters the battlefield with a +1/+1 counter on it. When it dies, you may put its +1/+1 counters on target artifact creature.) -DST U, HOP U - -Arcbound Fiend -{6} -Artifact Creature - Horror -0/0 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -At the beginning of your upkeep, you may move a +1/+1 counter from target creature onto Arcbound Fiend. -Modular 3 (This enters the battlefield with three +1/+1 counters on it. When it dies, you may put its +1/+1 counters on target artifact creature.) -DST U - -Arcbound Hybrid -{4} -Artifact Creature - Beast -0/0 -Haste -Modular 2 (This enters the battlefield with two +1/+1 counters on it. When it dies, you may put its +1/+1 counters on target artifact creature.) -DST C - -Arcbound Lancer -{7} -Artifact Creature - Beast -0/0 -First strike -Modular 4 (This enters the battlefield with four +1/+1 counters on it. When it dies, you may put its +1/+1 counters on target artifact creature.) -DST U - -Arcbound Overseer -{8} -Artifact Creature - Golem -0/0 -At the beginning of your upkeep, put a +1/+1 counter on each creature with modular you control. -Modular 6 (This enters the battlefield with six +1/+1 counters on it. When it dies, you may put its +1/+1 counters on target artifact creature.) -DST R - -Arcbound Overseer Avatar -Vanguard -Hand +0, life +3 -At the beginning of your upkeep, you may put a +1/+1 counter on target creature you control. -At the beginning of your upkeep, you may put a charge counter on target permanent you control. -VG S - -Arcbound Ravager -{2} -Artifact Creature - Beast -0/0 -Sacrifice an artifact: Put a +1/+1 counter on Arcbound Ravager. -Modular 1 (This enters the battlefield with a +1/+1 counter on it. When it dies, you may put its +1/+1 counters on target artifact creature.) -DST R - -Arcbound Reclaimer -{4} -Artifact Creature - Golem -0/0 -Remove a +1/+1 counter from Arcbound Reclaimer: Put target artifact card from your graveyard on top of your library. -Modular 2 (This enters the battlefield with two +1/+1 counters on it. When it dies, you may put its +1/+1 counters on target artifact creature.) -DST R - -Arcbound Slith -{2} -Artifact Creature - Slith -0/0 -Whenever Arcbound Slith deals combat damage to a player, put a +1/+1 counter on it. -Modular 1 (This enters the battlefield with a +1/+1 counter on it. When it dies, you may put its +1/+1 counters on target artifact creature.) -DST U, HOP U - -Arcbound Stinger -{2} -Artifact Creature - Insect -0/0 -Flying -Modular 1 (This enters the battlefield with a +1/+1 counter on it. When it dies, you may put its +1/+1 counters on target artifact creature.) -DST C - -Arcbound Wanderer -{6} -Artifact Creature - Golem -0/0 -Modular-Sunburst (This enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it. When it dies, you may put its +1/+1 counters on target artifact creature.) -5DN U - -Arcbound Worker -{1} -Artifact Creature - Construct -0/0 -Modular 1 (This enters the battlefield with a +1/+1 counter on it. When it dies, you may put its +1/+1 counters on target artifact creature.) -DST C, EVT C - -Archaeological Dig -Land -{T}: Add {1} to your mana pool. -{T}, Sacrifice Archaeological Dig: Add one mana of any color to your mana pool. -INV U - -Archangel -{5}{W}{W} -Creature - Angel -5/5 -Flying, vigilance -VIS R, POR R, P02 R, 6ED R, S99 R - -Archangel of Strife -{5}{W}{W} -Creature - Angel -6/6 -Flying -As Archangel of Strife enters the battlefield, each player chooses war or peace. -Creatures controlled by players who chose war get +3/+0. -Creatures controlled by players who chose peace get +0/+3. -COM R - -Archdemon of Unx -{5}{B}{B} -Creature - Demon -6/6 -Flying, trample -At the beginning of your upkeep, sacrifice a non-Zombie creature, then put a 2/2 black Zombie creature token onto the battlefield. -ALA R - -Archery Training -{W} -Enchantment - Aura -Enchant creature -At the beginning of your upkeep, you may put an arrow counter on Archery Training. -Enchanted creature has "{T}: This creature deals X damage to target attacking or blocking creature, where X is the number of arrow counters on Archery Training." -UDS U - -Architects of Will -{2}{U}{B} -Artifact Creature - Human Wizard -3/3 -When Architects of Will enters the battlefield, look at the top three cards of target player's library, then put them back in any order. -Cycling {U/B} ({U/B}, Discard this card: Draw a card.) -ARB C, ARC C - -Archive Trap -{3}{U}{U} -Instant - Trap -If an opponent searched his or her library this turn, you may pay {0} rather than pay Archive Trap's mana cost. -Target opponent puts the top thirteen cards of his or her library into his or her graveyard. -ZEN R - -Archivist -{2}{U}{U} -Creature - Human Wizard -1/1 -{T}: Draw a card. -ULG R, 7ED R, 8ED R, 9ED R - -Archmage Ascension -{2}{U} -Enchantment -At the beginning of each end step, if you drew two or more cards this turn, you may put a quest counter on Archmage Ascension. -As long as Archmage Ascension has six or more quest counters on it, if you would draw a card, you may instead search your library for a card, put that card into your hand, then shuffle your library. -ZEN R - -Archon of Justice -{3}{W}{W} -Creature - Archon -4/4 -Flying -When Archon of Justice dies, exile target permanent. -EVE R, M12 R - -Archon of Redemption -{3}{W}{W} -Creature - Archon -3/4 -Flying -Whenever Archon of Redemption or another creature with flying enters the battlefield under your control, you may gain life equal to that creature's power. -WWK R - -Arctic Flats -Snow Land -Arctic Flats enters the battlefield tapped. -{T}: Add {G} or {W} to your mana pool. -CSP U - -Arctic Foxes -{1}{W} -Creature - Fox -1/1 -Creatures with power 2 or greater can't block Arctic Foxes as long as defending player controls a snow land. -ICE C - -Arctic Merfolk -{1}{U} -Creature - Merfolk -1/1 -Kicker-Return a creature you control to its owner's hand. (You may return a creature you control to its owner's hand in addition to any other costs as you cast this spell.) -If Arctic Merfolk was kicked, it enters the battlefield with a +1/+1 counter on it. -PLS C - -Arctic Nishoba -{5}{G} -Creature - Cat Warrior -6/6 -Trample -Cumulative upkeep {G} or {W} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -When Arctic Nishoba dies, you gain 2 life for each age counter on it. -CSP U - -Arctic Wolves -{3}{G}{G} -Creature - Wolf -4/5 -Cumulative upkeep {2} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -When Arctic Wolves enters the battlefield, draw a card. -WTH U - -Arcum Dagsson -{3}{U} -Legendary Creature - Human Artificer -2/2 -{T}: Target artifact creature's controller sacrifices it. That player may search his or her library for a noncreature artifact card, put it onto the battlefield, then shuffle his or her library. -CSP R - -Arcum's Sleigh -{1} -Artifact -{2}, {T}: Target creature gains vigilance until end of turn. Activate this ability only during combat and only if defending player controls a snow land. -ICE U - -Arcum's Weathervane -{2} -Artifact -{2}, {T}: Target snow land is no longer snow. -{2}, {T}: Target nonsnow basic land becomes snow. -ICE U - -Arcum's Whistle -{3} -Artifact -{3}, {T}: Choose target non-Wall creature the active player has controlled continuously since the beginning of the turn. That player may pay {X}, where X is that creature's converted mana cost. If he or she doesn't, the creature attacks this turn if able, and at the beginning of the next end step, destroy it if it didn't attack. Activate this ability only before attackers are declared. -ICE U - -Arden Angel -{4}{W}{W} -Creature - Angel -4/4 -Flying -At the beginning of your upkeep, if Arden Angel is in your graveyard, choose a number from 1 to 4 at random. If it's 1, you may return Arden Angel onto the battlefield. -SDC S - -Ardent Militia -{4}{W} -Creature - Human Soldier -2/5 -Vigilance -POR U, WTH C, 6ED U, S99 U, 7ED U, 8ED U - -Ardent Plea -{1}{W}{U} -Enchantment -Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.) -Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.) -ARB U - -Ardent Recruit -{W} -Creature - Human Soldier -1/1 -Metalcraft - Ardent Recruit gets +2/+2 as long as you control three or more artifacts. -MBS C - -Ardent Soldier -{1}{W} -Creature - Human Soldier -1/2 -Kicker {2} (You may pay an additional {2} as you cast this spell.) -Vigilance -If Ardent Soldier was kicked, it enters the battlefield with a +1/+1 counter on it. -INV C - -Arena -Land -{3}, {T}: Tap target creature you control and target creature of an opponent's choice he or she controls. Each of those creatures deals damage equal to its power to the other. -PRO S, TSB S - -Arena of the Ancients -{3} -Artifact -Legendary creatures don't untap during their controllers' untap steps. -When Arena of the Ancients enters the battlefield, tap all legendary creatures. -LEG R, CHR R, ME3 R - -Arenson's Aura -{2}{W} -Enchantment -{W}, Sacrifice an enchantment: Destroy target enchantment. -{3}{U}{U}: Counter target enchantment spell. -ICE C, 5ED U - -Argent Mutation -{2}{U} -Instant -Target permanent becomes an artifact in addition to its other types until end of turn. -Draw a card. -NPH U - -Argent Sphinx -{2}{U}{U} -Creature - Sphinx -4/3 -Flying -Metalcraft - {U}: Exile Argent Sphinx. Return it to the battlefield under your control at the beginning of the next end step. Activate this ability only if you control three or more artifacts. -SOM R - -Argentum Armor -{6} -Artifact - Equipment -Equipped creature gets +6/+6. -Whenever equipped creature attacks, destroy target permanent. -Equip {6} -SOM R - -Argivian Archaeologist -{1}{W}{W} -Creature - Human Artificer -1/1 -{W}{W}, {T}: Return target artifact card from your graveyard to your hand. -ATQ R, MED R - -Argivian Blacksmith -{1}{W}{W} -Creature - Human Artificer -2/2 -{T}: Prevent the next 2 damage that would be dealt to target artifact creature this turn. -ATQ C, ME4 U - -Argivian Find -{W} -Instant -Return target artifact or enchantment card from your graveyard to your hand. -WTH U - -Argivian Restoration -{2}{U}{U} -Sorcery -Return target artifact card from your graveyard to the battlefield. -WTH U, EVT U - -Argothian Elder -{3}{G} -Creature - Elf Druid -2/2 -{T}: Untap two target lands. -USG U, BRB U - -Argothian Enchantress -{1}{G} -Creature - Human Druid -0/1 -Shroud (This permanent can't be the target of spells or abilities.) -Whenever you cast an enchantment spell, draw a card. -USG R - -Argothian Pixies -{1}{G} -Creature - Faerie -2/1 -Argothian Pixies can't be blocked by artifact creatures. -Prevent all damage that would be dealt to Argothian Pixies by artifact creatures. -ATQ C, CHR C, ME4 C - -Argothian Swine -{3}{G} -Creature - Boar -3/3 -Trample -USG C - -Argothian Treefolk -{3}{G}{G} -Creature - Treefolk -3/5 -Prevent all damage that would be dealt to Argothian Treefolk by artifacts. -ATQ C, ME4 U - -Argothian Wurm -{3}{G} -Creature - Wurm -6/6 -Trample -When Argothian Wurm enters the battlefield, any player may sacrifice a land. If a player does, put Argothian Wurm on top of its owner's library. -USG R - -Arid Mesa -Land -{T}, Pay 1 life, Sacrifice Arid Mesa: Search your library for a Mountain or Plains card and put it onto the battlefield. Then shuffle your library. -ZEN R - -Ark of Blight -{2} -Artifact -{3}, {T}, Sacrifice Ark of Blight: Destroy target land. -SCG U - -Arm with AEther -{2}{U} -Sorcery -Until end of turn, creatures you control gain "Whenever this creature deals damage to an opponent, you may return target creature that player controls to its owner's hand." -NPH U - -Armadillo Cloak -{1}{G}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2 and has trample. -Whenever enchanted creature deals damage, you gain that much life. -INV C, PVC C, ARC C - -Armageddon -{3}{W} -Sorcery -Destroy all lands. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, POR R, P02 R, 6ED R, S99 R, MED R, ME4 R - -Armageddon Clock -{6} -Artifact -At the beginning of your upkeep, put a doom counter on Armageddon Clock. -At the beginning of your draw step, Armageddon Clock deals damage equal to the number of doom counters on it to each player. -{4}: Remove a doom counter from Armageddon Clock. Any player may activate this ability but only during any upkeep step. -ATQ U, 3ED R, 4ED R, ME4 R - -Armament Master -{W}{W} -Creature - Kor Soldier -2/2 -Other Kor creatures you control get +2/+2 for each Equipment attached to Armament Master. -ZEN R - -Armed Response -{2}{W} -Instant -Armed Response deals damage to target attacking creature equal to the number of Equipment you control. -5DN C - -Armillary Sphere -{2} -Artifact -{2}, {T}, Sacrifice Armillary Sphere: Search your library for up to two basic land cards, reveal them, and put them into your hand. Then shuffle your library. -CON C, DDG C, COM C - -Armistice -{2}{W} -Enchantment -{3}{W}{W}: You draw a card and target opponent gains 3 life. -MMQ R - -Armor Sliver -{2}{W} -Creature - Sliver -2/2 -All Sliver creatures have "{2}: This creature gets +0/+1 until end of turn." -TMP U, H09 U - -Armor Thrull -{2}{B} -Creature - Thrull -1/3 -{T}, Sacrifice Armor Thrull: Put a +1/+2 counter on target creature. -FEM C (x4), ME2 C - -Armor of Faith -{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+1. -{W}: Enchanted creature gets +0/+1 until end of turn. -ICE C, 5ED C, ME2 C - -Armor of Thorns -{1}{G} -Enchantment - Aura -You may cast Armor of Thorns as though it had flash. If you cast it any time a sorcery couldn't have been cast, the controller of the permanent it becomes sacrifices it at the beginning of the next cleanup step. -Enchant nonblack creature -Enchanted creature gets +2/+2. -MIR C - -Armored Ascension -{3}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+1 for each Plains you control and has flying. -SHM U, M10 U, M11 U - -Armored Cancrix -{4}{U} -Creature - Crab -2/5 -M11 C - -Armored Galleon -{4}{U} -Creature - Human Pirate -5/4 -Armored Galleon can't attack unless defending player controls an Island. -P02 U - -Armored Griffin -{3}{W} -Creature - Griffin -2/3 -Flying, vigilance -P02 U, ME2 C - -Armored Guardian -{3}{W}{U} -Creature - Cat Soldier -2/5 -{1}{W}{W}: Target creature you control gains protection from the color of your choice until end of turn. -{1}{U}{U}: Armored Guardian gains shroud until end of turn. (It can't be the target of spells or abilities.) -INV R - -Armored Pegasus -{1}{W} -Creature - Pegasus -1/2 -Flying -POR C, TMP C, 6ED C, BRB C, S00 C - -Armored Warhorse -{W}{W} -Creature - Horse -2/3 -M12 C - -Armorer Guildmage -{R} -Creature - Human Wizard -1/1 -{B}, {T}: Target creature gets +1/+0 until end of turn. -{G}, {T}: Target creature gets +0/+1 until end of turn. -MIR C - -Arms Dealer -{2}{R} -Creature - Goblin Rogue -1/1 -{1}{R}, Sacrifice a Goblin: Arms Dealer deals 4 damage to target creature. -MMQ U - -Army Ants -{1}{B}{R} -Creature - Insect -1/1 -{T}, Sacrifice a land: Destroy target land. -VIS U - -Army of Allah -{1}{W}{W} -Instant -Attacking creatures get +2/+0 until end of turn. -ARN C (x2) - -Arnjlot's Ascent -{1}{U}{U} -Enchantment -Cumulative upkeep {U} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -{1}: Target creature gains flying until end of turn. -ICE C - -Arrest -{2}{W} -Enchantment - Aura -Enchant creature -Enchanted creature can't attack or block, and its activated abilities can't be activated. -MMQ U, MRD C, SOM C - -Arrogant Bloodlord -{1}{B}{B} -Creature - Vampire Knight -4/4 -Whenever Arrogant Bloodlord blocks or becomes blocked by a creature with power 1 or less, destroy Arrogant Bloodlord at end of combat. -ROE U - -Arrogant Vampire -{3}{B}{B} -Creature - Vampire -4/3 -Flying -POR U - -Arrogant Wurm -{3}{G}{G} -Creature - Wurm -4/4 -Trample -Madness {2}{G} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -TOR U - -Arrow Volley Trap -{3}{W}{W} -Instant - Trap -If four or more creatures are attacking, you may pay {1}{W} rather than pay Arrow Volley Trap's mana cost. -Arrow Volley Trap deals 5 damage divided as you choose among any number of target attacking creatures. -ZEN U - -Arsenal Thresher -{2}{W/B}{U} -Artifact Creature - Construct -2/2 -As Arsenal Thresher enters the battlefield, you may reveal any number of other artifact cards from your hand. Arsenal Thresher enters the battlefield with a +1/+1 counter on it for each card revealed this way. -ARB C, HOP C - -Artifact Blast -{R} -Instant -Counter target artifact spell. -ATQ C, MED C, ME4 C - -Artifact Mutation -{R}{G} -Instant -Destroy target artifact. It can't be regenerated. Put X 1/1 green Saproling creature tokens onto the battlefield, where X is that artifact's converted mana cost. -INV R - -Artifact Possession -{2}{B} -Enchantment - Aura -Enchant artifact -Whenever enchanted artifact becomes tapped or a player activates an ability of enchanted artifact without {T} in its activation cost, Artifact Possession deals 2 damage to that artifact's controller. -ATQ C - -Artifact Ward -{W} -Enchantment - Aura -Enchant creature -Enchanted creature can't be blocked by artifact creatures. -Prevent all damage that would be dealt to enchanted creature by artifact sources. -Enchanted creature can't be the target of abilities from artifact sources. -ATQ C - -Artificer's Intuition -{1}{U} -Enchantment -{U}, Discard an artifact card: Search your library for an artifact card with converted mana cost 1 or less, reveal that card, and put it into your hand. Then shuffle your library. -5DN R - -Artificial Evolution -{U} -Instant -Change the text of target spell or permanent by replacing all instances of one creature type with another. The new creature type can't be Wall. (This effect lasts indefinitely.) -ONS R - -Artillerize -{3}{R} -Instant -As an additional cost to cast Artillerize, sacrifice an artifact or creature. -Artillerize deals 5 damage to target creature or player. -NPH C - -Artisan of Kozilek -{9} -Creature - Eldrazi -10/9 -When you cast Artisan of Kozilek, you may return target creature card from your graveyard to the battlefield. -Annihilator 2 (Whenever this creature attacks, defending player sacrifices two permanents.) -ROE U, ARC U, COM U - -Ascendant Evincar -{4}{B}{B} -Legendary Creature - Vampire -3/3 -Flying (This creature can't be blocked except by creatures with flying or reach.) -Other black creatures get +1/+1. -Nonblack creatures get -1/-1. -NEM R, 10E R, HOP R - -Ascending Aven -{2}{U}{U} -Creature - Bird Soldier -3/2 -Flying -Ascending Aven can block only creatures with flying. -Morph {2}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS C - -Asceticism -{3}{G}{G} -Enchantment -Creatures you control have hexproof. (They can't be the targets of spells or abilities your opponents control.) -{1}{G}: Regenerate target creature. -SOM R - -Asha's Favor -{2}{W} -Enchantment - Aura -Enchant creature -Enchanted creature has flying, first strike, and vigilance. -CON C - -Ashcoat Bear -{1}{G} -Creature - Bear -2/2 -Flash (You may cast this spell any time you could cast an instant.) -TSP C - -Ashen Firebeast -{6}{R}{R} -Creature - Elemental Beast -6/6 -{1}{R}: Ashen Firebeast deals 1 damage to each creature without flying. -ODY R - -Ashen Ghoul -{3}{B} -Creature - Zombie -3/1 -Haste -{B}: Return Ashen Ghoul from your graveyard to the battlefield. Activate this ability only during your upkeep and only if three or more creature cards are above Ashen Ghoul. -ICE U, ME2 U - -Ashen Monstrosity -{5}{R}{R} -Creature - Spirit -7/4 -Haste -Ashen Monstrosity attacks each turn if able. -BOK U - -Ashen Powder -{2}{B}{B} -Sorcery -Put target creature card from an opponent's graveyard onto the battlefield under your control. -MIR R, 6ED R - -Ashen-Skin Zubera -{1}{B} -Creature - Zubera Spirit -1/2 -When Ashen-Skin Zubera dies, target opponent discards a card for each Zubera that died this turn. -CHK C - -Ashenmoor Cohort -{5}{B} -Creature - Elemental Warrior -4/3 -Ashenmoor Cohort gets +1/+1 as long as you control another black creature. -SHM C - -Ashenmoor Gouger -{B/R}{B/R}{B/R} -Creature - Elemental Warrior -4/4 -Ashenmoor Gouger can't block. -SHM U - -Ashenmoor Liege -{1}{B/R}{B/R}{B/R} -Creature - Elemental Knight -4/1 -Other black creatures you control get +1/+1. -Other red creatures you control get +1/+1. -Whenever Ashenmoor Liege becomes the target of a spell or ability an opponent controls, that player loses 4 life. -SHM R - -Ashes of the Fallen -{2} -Artifact -As Ashes of the Fallen enters the battlefield, choose a creature type. -Each creature card in your graveyard has the chosen creature type in addition to its other types. -SOK R - -Ashes to Ashes -{1}{B}{B} -Sorcery -Exile two target nonartifact creatures. Ashes to Ashes deals 5 damage to you. -DRK C, 4ED U, 5ED U, ME3 U - -Ashling the Pilgrim -{1}{R} -Legendary Creature - Elemental Shaman -1/1 -{1}{R}: Put a +1/+1 counter on Ashling the Pilgrim. If this is the third time this ability has resolved this turn, remove all +1/+1 counters from Ashling the Pilgrim, and it deals that much damage to each creature and each player. -LRW R - -Ashling the Pilgrim Avatar -Vanguard -Hand -1, life +6 -{2}: Ashling the Pilgrim Avatar deals 1 damage to each creature and each player. -VG S - -Ashling's Prerogative -{1}{R} -Enchantment -As Ashling's Prerogative enters the battlefield, choose odd or even. (Zero is even.) -Each creature with converted mana cost of the chosen value has haste. -Each creature without converted mana cost of the chosen value enters the battlefield tapped. -LRW R - -Ashling, the Extinguisher -{2}{B}{B} -Legendary Creature - Elemental Shaman -4/4 -Whenever Ashling, the Extinguisher deals combat damage to a player, choose target creature that player controls. He or she sacrifices that creature. -EVE R - -Ashling, the Extinguisher Avatar -Vanguard -Hand +1, life -3 -{5}: Destroy all nonland permanents. Activate this ability only once and only during your turn. -VG S - -Ashnod -Vanguard -Hand +1, life -8 -Whenever a creature deals damage to you, destroy it. -VG S - -Ashnod's Altar -{3} -Artifact -Sacrifice a creature: Add {2} to your mana pool. -ATQ U, CHR C, 5ED U, 6ED U, ME4 R - -Ashnod's Battle Gear -{2} -Artifact -You may choose not to untap Ashnod's Battle Gear during your untap step. -{2}, {T}: Target creature you control gets +2/-2 for as long as Ashnod's Battle Gear remains tapped. -ATQ U, 4ED U - -Ashnod's Cylix -{2} -Artifact -{3}, {T}: Target player looks at the top three cards of his or her library, puts one of them back on top of his or her library, then exiles the rest. -ALL R, ME2 R - -Ashnod's Transmogrant -{1} -Artifact -{T}, Sacrifice Ashnod's Transmogrant: Put a +1/+1 counter on target nonartifact creature. That creature becomes an artifact in addition to its other types. -ATQ U, CHR C, 5ED C, MED C - -Ashuza's Breath -{1}{R} -Sorcery -Ashuza's Breath deals X damage to each creature, where X is a number chosen at random from 0 to 2. -SDC S - -Asmira, Holy Avenger -{2}{G}{W} -Legendary Creature - Human Cleric -2/3 -Flying -At the beginning of each end step, put a +1/+1 counter on Asmira, Holy Avenger for each creature put into your graveyard from the battlefield this turn. -MIR R - -Aspect of Mongoose -{1}{G} -Enchantment - Aura -Enchant creature -Enchanted creature has shroud. (It can't be the target of spells or abilities.) -When Aspect of Mongoose is put into a graveyard from the battlefield, return Aspect of Mongoose to its owner's hand. -TSP U - -Aspect of Wolf -{1}{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +X/+Y, where X is half the number of Forests you control, rounded down, and Y is half the number of Forests you control, rounded up. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R - -Assassin's Blade -{1}{B} -Instant -Cast Assassin's Blade only during the declare attackers step and only if you've been attacked this step. -Destroy target nonblack attacking creature. -POR U - -Assassinate -{2}{B} -Sorcery -Destroy target tapped creature. -TSP C, 10E C, M10 C, M11 C - -Assault -{R} -Sorcery -Assault deals 2 damage to target creature or player. ----- -Battery -{3}{G} -Sorcery -Put a 3/3 green Elephant creature token onto the battlefield. -INV U (x2), TSB S, HOP U - -Assault Griffin -{3}{W} -Creature - Griffin -3/2 -Flying -M11 C, M12 C - -Assault Strobe -{R} -Sorcery -Target creature gains double strike until end of turn. (It deals both first-strike and regular combat damage.) -SOM C - -Assault Zeppelid -{2}{G}{U} -Creature - Beast -3/3 -Flying, trample -DIS C - -Assembly Hall -{5} -Artifact -{4}, {T}: Reveal a creature card in your hand. Search your library for a card with the same name as that card, reveal it, and put it into your hand. Then shuffle your library. -MMQ R - -Assembly-Worker -{3} -Artifact Creature - Assembly-Worker -2/2 -{T}: Target Assembly-Worker creature gets +1/+1 until end of turn. -TSP U, EVT U - -Assert Authority -{5}{U}{U} -Instant -Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -Counter target spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyard. -MRD U - -Astral Slide -{2}{W} -Enchantment -Whenever a player cycles a card, you may exile target creature. If you do, return the exiled card to the battlefield under its owner's control at the beginning of the next end step. -ONS U - -Astral Steel -{2}{W} -Instant -Target creature gets +1/+2 until end of turn. -Storm (When you cast this spell, copy it for each spell cast before it this turn. You may choose new targets for the copies.) -SCG C - -Astrolabe -{3} -Artifact -{1}, {T}, Sacrifice Astrolabe: Add two mana of any one color to your mana pool. Draw a card at the beginning of the next turn's upkeep. -ALL C (x2), ME3 C - -Aswan Jaguar -{1}{G}{G} -Creature - Cat -2/2 -As Aswan Jaguar enters the battlefield, choose a creature type at random from among all creature types that a creature card in target opponent's decklist has. -{G}{G}, {T}: Destroy target creature with the chosen type. It can't be regenerated. -ASTRAL S - -Atalya, Samite Master -{3}{W}{W} -Legendary Creature - Human Cleric -2/3 -{X}, {T}: Choose one - Prevent the next X damage that would be dealt to target creature this turn; or you gain X life. Spend only white mana this way. -INV R - -Atog -{1}{R} -Creature - Atog -1/2 -Sacrifice an artifact: Atog gets +2/+2 until end of turn. -ATQ C, 3ED C, 5ED U, MRD U, ME4 C - -Atogatog -{W}{U}{B}{R}{G} -Legendary Creature - Atog -5/5 -Sacrifice an Atog creature: Atogatog gets +X/+X until end of turn, where X is the sacrificed creature's power. -ODY R - -Attrition -{1}{B}{B} -Enchantment -{B}, Sacrifice a creature: Destroy target nonblack creature. -UDS R, COM R - -Attunement -{2}{U} -Enchantment -Return Attunement to its owner's hand: Draw three cards, then discard four cards. -USG R - -Augur il-Vec -{1}{W} -Creature - Human Cleric -1/3 -Shadow (This creature can block or be blocked by only creatures with shadow.) -Sacrifice Augur il-Vec: You gain 4 life. Activate this ability only during your upkeep. -FUT C - -Augur of Skulls -{1}{B} -Creature - Skeleton Wizard -1/1 -{1}{B}: Regenerate Augur of Skulls. -Sacrifice Augur of Skulls: Target player discards two cards. Activate this ability only during your upkeep. -FUT C - -Augury Adept -{1}{W/U}{W/U} -Creature - Kithkin Wizard -2/2 -Whenever Augury Adept deals combat damage to a player, reveal the top card of your library and put that card into your hand. You gain life equal to its converted mana cost. -SHM R - -Augury Owl -{1}{U} -Creature - Bird -1/1 -Flying -When Augury Owl enters the battlefield, scry 3. (To scry 3, look at the top three cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) -M11 C - -Auntie's Hovel -Land -As Auntie's Hovel enters the battlefield, you may reveal a Goblin card from your hand. If you don't, Auntie's Hovel enters the battlefield tapped. -{T}: Add {B} or {R} to your mana pool. -LRW R - -Auntie's Snitch -{2}{B} -Creature - Goblin Rogue -3/1 -Auntie's Snitch can't block. -Prowl {1}{B} (You may cast this for its prowl cost if you dealt combat damage to a player this turn with a Goblin or Rogue.) -Whenever a Goblin or Rogue you control deals combat damage to a player, if Auntie's Snitch is in your graveyard, you may return Auntie's Snitch to your hand. -MOR R - -Aura Barbs -{2}{R} -Instant - Arcane -Each enchantment deals 2 damage to its controller, then each Aura attached to a creature deals 2 damage to the creature it's attached to. -BOK U - -Aura Blast -{1}{W} -Instant -Destroy target enchantment. -Draw a card. -PLS C - -Aura Extraction -{1}{W} -Instant -Put target enchantment on top of its owner's library. -Cycling {2} ({2}, Discard this card: Draw a card.) -ONS U - -Aura Finesse -{U} -Instant -Attach target Aura you control to target creature. -Draw a card. -ROE C - -Aura Flux -{2}{U} -Enchantment -Other enchantments have "At the beginning of your upkeep, sacrifice this enchantment unless you pay {2}." -ULG C - -Aura Fracture -{2}{W} -Enchantment -Sacrifice a land: Destroy target enchantment. -PCY C - -Aura Gnarlid -{2}{G} -Creature - Beast -2/2 -Creatures with power less than Aura Gnarlid's power can't block it. -Aura Gnarlid gets +1/+1 for each Aura on the battlefield. -ROE C - -Aura Graft -{1}{U} -Instant -Gain control of target Aura that's attached to a permanent. Attach it to another permanent it can enchant. -ODY U, 10E U - -Aura Mutation -{G}{W} -Instant -Destroy target enchantment. Put X 1/1 green Saproling creature tokens onto the battlefield, where X is that enchantment's converted mana cost. -INV R - -Aura Shards -{1}{G}{W} -Enchantment -Whenever a creature enters the battlefield under your control, you may destroy target artifact or enchantment. -INV U, COM U - -Aura Thief -{3}{U} -Creature - Illusion -2/2 -Flying -When Aura Thief dies, you gain control of all enchantments. (You don't get to move Auras.) -UDS R - -Aura of Dominion -{U}{U} -Enchantment - Aura -Enchant creature -{1}, Tap an untapped creature you control: Untap enchanted creature. -CHK U - -Aura of Silence -{1}{W}{W} -Enchantment -Artifact and enchantment spells your opponents cast cost {2} more to cast. -Sacrifice Aura of Silence: Destroy target artifact or enchantment. -WTH U, 10E U - -Auramancer -{2}{W} -Creature - Human Wizard -2/2 -When Auramancer enters the battlefield, you may return target enchantment card from your graveyard to your hand. -ODY C, M12 C - -Auramancer's Guise -{2}{U}{U} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2 for each Aura attached to it and has vigilance. -PLC U - -Auratog -{1}{W} -Creature - Atog -1/2 -Sacrifice an enchantment: Auratog gets +2/+2 until end of turn. -TMP R, TSB S - -Auratouched Mage -{5}{W} -Creature - Human Wizard -3/3 -When Auratouched Mage enters the battlefield, search your library for an Aura card that could enchant it. If Auratouched Mage is still on the battlefield, put that Aura card onto the battlefield attached to it. Otherwise, reveal the Aura card and put it into your hand. Then shuffle your library. -RAV U - -Aurification -{2}{W}{W} -Enchantment -Whenever a creature deals damage to you, put a gold counter on it. -Each creature with a gold counter on it is a Wall in addition to its other creature types and has defender. (Those creatures can't attack.) -When Aurification leaves the battlefield, remove all gold counters from all creatures. -ONS R - -Auriok Bladewarden -{1}{W} -Creature - Human Soldier -1/1 -{T}: Target creature gets +X/+X until end of turn, where X is Auriok Bladewarden's power. -MRD U - -Auriok Champion -{W}{W} -Creature - Human Cleric -1/1 -Protection from black and from red -Whenever another creature enters the battlefield, you may gain 1 life. -5DN R - -Auriok Edgewright -{W}{W} -Creature - Human Soldier -2/2 -Metalcraft - Auriok Edgewright has double strike as long as you control three or more artifacts. -SOM U - -Auriok Glaivemaster -{W} -Creature - Human Soldier -1/1 -As long as Auriok Glaivemaster is equipped, it gets +1/+1 and has first strike. -DST C - -Auriok Replica -{3} -Artifact Creature - Cleric -2/2 -{W}, Sacrifice Auriok Replica: Prevent all damage a source of your choice would deal to you this turn. -SOM C - -Auriok Salvagers -{3}{W} -Creature - Human Soldier -2/4 -{1}{W}: Return target artifact card with converted mana cost 1 or less from your graveyard to your hand. -5DN U - -Auriok Siege Sled -{6} -Artifact Creature - Juggernaut -3/5 -{1}: Target artifact creature blocks Auriok Siege Sled this turn if able. -{1}: Target artifact creature can't block Auriok Siege Sled this turn. -DST U - -Auriok Steelshaper -{1}{W} -Creature - Human Soldier -1/1 -Equip costs you pay cost {1} less. -As long as Auriok Steelshaper is equipped, Soldier and/or Knight creatures you control get +1/+1. -MRD R - -Auriok Sunchaser -{1}{W} -Creature - Human Soldier -1/1 -Metalcraft - As long as you control three or more artifacts, Auriok Sunchaser gets +2/+2 and has flying. -SOM C - -Auriok Survivors -{5}{W} -Creature - Human Soldier -4/6 -When Auriok Survivors enters the battlefield, you may return target Equipment card from your graveyard to the battlefield. If you do, you may attach it to Auriok Survivors. -NPH U - -Auriok Transfixer -{W} -Creature - Human Scout -1/1 -{W}, {T}: Tap target artifact. -MRD C - -Auriok Windwalker -{3}{W} -Creature - Human Wizard -2/3 -Flying -{T}: Attach target Equipment you control to target creature you control. -5DN R - -Aurochs -{3}{G} -Creature - Aurochs -2/3 -Trample -Whenever Aurochs attacks, it gets +1/+0 until end of turn for each other attacking Aurochs. -ICE C, 5ED C, ME2 C - -Aurochs Herd -{5}{G} -Creature - Aurochs -4/4 -Trample -When Aurochs Herd enters the battlefield, you may search your library for an Aurochs card, reveal it, and put it into your hand. If you do, shuffle your library. -Whenever Aurochs Herd attacks, it gets +1/+0 until end of turn for each other attacking Aurochs. -CSP C - -Aurora Eidolon -{3}{W} -Creature - Spirit -2/2 -{W}, Sacrifice Aurora Eidolon: Prevent the next 3 damage that would be dealt to target creature or player this turn. -Whenever you cast a multicolored spell, you may return Aurora Eidolon from your graveyard to your hand. -DIS C - -Aurora Griffin -{3}{W} -Creature - Griffin -2/2 -Flying -{W}: Target permanent becomes white until end of turn. -PLS C - -Auspicious Ancestor -{3}{W} -Creature - Human Cleric -2/3 -When Auspicious Ancestor dies, you gain 3 life. -Whenever a player casts a white spell, you may pay {1}. If you do, you gain 1 life. -MIR R - -Austere Command -{4}{W}{W} -Sorcery -Choose two - Destroy all artifacts; or destroy all enchantments; or destroy all creatures with converted mana cost 3 or less; or destroy all creatures with converted mana cost 4 or greater. -LRW R, COM R - -Autochthon Wurm -{10}{G}{G}{G}{W}{W} -Creature - Wurm -9/14 -Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.) -Trample -RAV R - -Autumn Willow -{4}{G}{G} -Legendary Creature - Avatar -4/4 -Shroud -{G}: Until end of turn, Autumn Willow can be the target of spells and abilities controlled by target player as though it didn't have shroud. -HML R, MED R - -Autumn's Veil -{G} -Instant -Spells you control can't be countered by blue or black spells this turn, and creatures you control can't be the targets of blue or black spells this turn. -M11 U, M12 U - -Avalanche -{X}{2}{R}{R} -Sorcery -Destroy X target snow lands. -ICE U - -Avalanche Riders -{3}{R} -Creature - Human Nomad -2/2 -Haste -Echo {3}{R} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -When Avalanche Riders enters the battlefield, destroy target land. -ULG U, TSB S - -Avarax -{3}{R}{R} -Creature - Beast -3/3 -Haste -When Avarax enters the battlefield, you may search your library for a card named Avarax, reveal it, and put it into your hand. If you do, shuffle your library. -{1}{R}: Avarax gets +1/+0 until end of turn. -ONS U - -Avarice Totem -{1} -Artifact -{5}: Exchange control of Avarice Totem and target nonland permanent. -5DN U - -Avatar of Discord -{B/R}{B/R}{B/R} -Creature - Avatar -5/3 -({B/R} can be paid with either {B} or {R}.) -Flying -When Avatar of Discord enters the battlefield, sacrifice it unless you discard two cards. -DIS R, ARC R - -Avatar of Fury -{6}{R}{R} -Creature - Avatar -6/6 -If an opponent controls seven or more lands, Avatar of Fury costs {6} less to cast. -Flying -{R}: Avatar of Fury gets +1/+0 until end of turn. -PCY R, COM R - -Avatar of Hope -{6}{W}{W} -Creature - Avatar -4/9 -If you have 3 or less life, Avatar of Hope costs {6} less to cast. -Flying -Avatar of Hope can block any number of creatures. -PRO R, PCY R, 8ED R - -Avatar of Might -{6}{G}{G} -Creature - Avatar -8/8 -If an opponent controls at least four more creatures than you, Avatar of Might costs {6} less to cast. -Trample (If this creature would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.) -PCY R, 10E R - -Avatar of Slaughter -{6}{R}{R} -Creature - Avatar -8/8 -All creatures have double strike and attack each turn if able. -COM R - -Avatar of Will -{6}{U}{U} -Creature - Avatar -5/6 -If an opponent has no cards in hand, Avatar of Will costs {6} less to cast. -Flying -PCY R - -Avatar of Woe -{6}{B}{B} -Creature - Avatar -6/5 -If there are ten or more creature cards total in all graveyards, Avatar of Woe costs {6} less to cast. -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -{T}: Destroy target creature. It can't be regenerated. -PCY R, TSB S, ARC R, COM R - -Aven Archer -{3}{W}{W} -Creature - Bird Soldier Archer -2/2 -Flying -{2}{W}, {T}: Aven Archer deals 2 damage to target attacking or blocking creature. -ODY U - -Aven Augur -{3}{U} -Creature - Bird Wizard -2/2 -Flying -Sacrifice Aven Augur: Return up to two target creatures to their owners' hands. Activate this ability only during your upkeep. -FUT C - -Aven Brigadier -{3}{W}{W}{W} -Creature - Bird Soldier -3/5 -Flying -Other Bird creatures get +1/+1. -Other Soldier creatures get +1/+1. -ONS R - -Aven Cloudchaser -{3}{W} -Creature - Bird Soldier -2/2 -Flying (This creature can't be blocked except by creatures with flying or reach.) -When Aven Cloudchaser enters the battlefield, destroy target enchantment. -ODY C, 8ED C, 9ED C, 10E C - -Aven Envoy -{U} -Creature - Bird Soldier -0/2 -Flying -LGN C - -Aven Farseer -{1}{W} -Creature - Bird Soldier -1/1 -Flying -Whenever a permanent is turned face up, put a +1/+1 counter on Aven Farseer. -SCG C - -Aven Fateshaper -{6}{U} -Creature - Bird Wizard -4/5 -Flying -When Aven Fateshaper enters the battlefield, look at the top four cards of your library, then put them back in any order. -{4}{U}: Look at the top four cards of your library, then put them back in any order. -ONS U - -Aven Fisher -{3}{U} -Creature - Bird Soldier -2/2 -Flying (This creature can't be blocked except by creatures with flying or reach.) -When Aven Fisher dies, you may draw a card. -ODY C, 8ED C, 9ED C, 10E C - -Aven Fleetwing -{3}{U} -Creature - Bird Soldier -2/2 -Flying -Hexproof (This creature can't be the target of spells or abilities your opponents control.) -M12 C - -Aven Flock -{4}{W} -Creature - Bird Soldier -2/3 -Flying (This creature can't be blocked except by creatures with flying or reach.) -{W}: Aven Flock gets +0/+1 until end of turn. -ODY C, 8ED C, 9ED C - -Aven Fogbringer -{3}{U} -Creature - Bird Wizard -2/1 -Flying -When Aven Fogbringer enters the battlefield, return target land to its owner's hand. -JUD C - -Aven Liberator -{2}{W}{W} -Creature - Bird Soldier -2/3 -Flying -Morph {3}{W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Aven Liberator is turned face up, target creature you control gains protection from the color of your choice until end of turn. -SCG C - -Aven Mimeomancer -{1}{W}{U} -Creature - Bird Wizard -3/1 -Flying -At the beginning of your upkeep, you may put a feather counter on target creature. If you do, that creature is 3/1 and has flying for as long as it has a feather counter on it. -ARB R - -Aven Mindcensor -{2}{W} -Creature - Bird Wizard -2/1 -Flash (You may cast this spell any time you could cast an instant.) -Flying -If an opponent would search a library, that player searches the top four cards of that library instead. -FUT U - -Aven Redeemer -{3}{W} -Creature - Bird Cleric -2/2 -Flying -{T}: Prevent the next 2 damage that would be dealt to target creature or player this turn. -LGN C - -Aven Riftwatcher -{2}{W} -Creature - Bird Rebel Soldier -2/3 -Flying -Vanishing 3 (This permanent enters the battlefield with three time counters on it. At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.) -When Aven Riftwatcher enters the battlefield or leaves the battlefield, you gain 2 life. -PLC C - -Aven Shrine -{1}{W}{W} -Enchantment -Whenever a player casts a spell, that player gains X life, where X is the number of cards in all graveyards with the same name as that spell. -ODY R - -Aven Smokeweaver -{2}{U}{U} -Creature - Bird Soldier -2/3 -Flying, protection from red -ODY U - -Aven Soulgazer -{3}{W}{W} -Creature - Bird Cleric -3/3 -Flying -{2}{W}: Look at target face-down creature. -ONS U - -Aven Squire -{1}{W} -Creature - Bird Soldier -1/1 -Flying -Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.) -CON C - -Aven Trailblazer -{2}{W} -Creature - Bird Soldier -2/* -Flying -Domain - Aven Trailblazer's toughness is equal to the number of basic land types among lands you control. -CON C - -Aven Trooper -{3}{W} -Creature - Bird Soldier -1/1 -Flying -{2}{W}, Discard a card: Aven Trooper gets +1/+2 until end of turn. -TOR C - -Aven Warcraft -{2}{W} -Instant -Creatures you control get +0/+2 until end of turn. -Threshold - If seven or more cards are in your graveyard, choose a color. Creatures you control also gain protection from the chosen color until end of turn. -JUD U - -Aven Warhawk -{4}{W} -Creature - Bird Soldier -2/2 -Amplify 1 (As this creature enters the battlefield, put a +1/+1 counter on it for each Bird and/or Soldier card you reveal in your hand.) -Flying -LGN U - -Aven Windreader -{3}{U}{U} -Creature - Bird Soldier Wizard -3/3 -Flying (This creature can't be blocked except by creatures with flying or reach.) -{1}{U}: Target player reveals the top card of his or her library. -ODY C, 9ED C, 10E C - -Avenger en-Dal -{1}{W} -Creature - Human Spellshaper -1/1 -{2}{W}, {T}, Discard a card: Exile target attacking creature. Its controller gains life equal to its toughness. -NEM R - -Avenger of Zendikar -{5}{G}{G} -Creature - Elemental -5/5 -When Avenger of Zendikar enters the battlefield, put a 0/1 green Plant creature token onto the battlefield for each land you control. -Landfall - Whenever a land enters the battlefield under your control, you may put a +1/+1 counter on each Plant creature you control. -WWK M - -Avenging Angel -{3}{W}{W} -Creature - Angel -3/3 -Flying -When Avenging Angel dies, you may put it on top of its owner's library. -TMP R - -Avenging Druid -{2}{G} -Creature - Human Druid -1/3 -Whenever Avenging Druid deals damage to an opponent, you may reveal cards from the top of your library until you reveal a land card. If you do, put that card onto the battlefield and put all other cards revealed this way into your graveyard. -EXO C - -Avian Changeling -{2}{W} -Creature - Shapeshifter -2/2 -Changeling (This card is every creature type at all times.) -Flying -LRW C - -Avizoa -{3}{U} -Creature - Jellyfish -2/2 -Flying -{0}: Avizoa gets +2/+2 until end of turn. You skip your next untap step. Activate this ability only once each turn. -WTH R - -Avoid Fate -{G} -Instant -Counter target instant or Aura spell that targets a permanent you control. -LEG C, TSB S - -Awakener Druid -{2}{G} -Creature - Human Druid -1/1 -When Awakener Druid enters the battlefield, target Forest becomes a 4/5 green Treefolk creature for as long as Awakener Druid remains on the battlefield. It's still a land. -M10 U, M11 U - -Awakening -{2}{G}{G} -Enchantment -At the beginning of each upkeep, untap all creatures and lands. -STH R - -Awakening Zone -{2}{G} -Enchantment -At the beginning of your upkeep, you may put a 0/1 colorless Eldrazi Spawn creature token onto the battlefield. It has "Sacrifice this creature: Add {1} to your mana pool." -ROE R, COM R - -Awe Strike -{W} -Instant -The next time target creature would deal damage this turn, prevent that damage. You gain life equal to the damage prevented this way. -MRD C - -Awesome Presence -{U} -Enchantment - Aura -Enchant creature -Enchanted creature can't be blocked unless defending player pays {3} for each creature he or she controls that's blocking it. -ALL C (x2) - -Axegrinder Giant -{4}{R}{R} -Creature - Giant Warrior -6/4 -LRW C - -Axelrod Gunnarson -{4}{B}{B}{R}{R} -Legendary Creature - Giant -5/5 -Trample -Whenever a creature dealt damage by Axelrod Gunnarson this turn dies, you gain 1 life and Axelrod deals 1 damage to target player. -LEG R, CHR R, ME3 U - -Ayesha Tanaka -{W}{W}{U}{U} -Legendary Creature - Human Artificer -2/2 -Banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -{T}: Counter target activated ability from an artifact source unless that ability's controller pays {W}. (Mana abilities can't be targeted.) -LEG R, CHR R - -Aysen Abbey -Land -{T}: Add {1} to your mana pool. -{1}, {T}: Add {W} to your mana pool. -{2}, {T}: Add {G} or {U} to your mana pool. -HML U - -Aysen Bureaucrats -{1}{W} -Creature - Human Advisor -1/1 -{T}: Tap target creature with power 2 or less. -HML C (x2), 5ED C, ME2 C - -Aysen Crusader -{2}{W}{W} -Creature - Human Knight -2+*/2+* -Aysen Crusader's power and toughness are each equal to 2 plus the number of Soldiers and Warriors you control. -HML R, ME2 U - -Aysen Highway -{3}{W}{W}{W} -Enchantment -White creatures have plainswalk. -HML R - -Ayumi, the Last Visitor -{3}{G}{G} -Legendary Creature - Spirit -7/3 -Legendary landwalk -SOK R - -Azami, Lady of Scrolls -{2}{U}{U}{U} -Legendary Creature - Human Wizard -0/2 -Tap an untapped Wizard you control: Draw a card. -CHK R - -Azimaet Drake -{2}{U} -Creature - Drake -1/3 -Flying -{U}: Azimaet Drake gets +1/+0 until end of turn. Activate this ability only once each turn. -MIR C - -Azorius AEthermage -{1}{W}{U} -Creature - Human Wizard -1/1 -Whenever a permanent is returned to your hand, you may pay {1}. If you do, draw a card. -DIS U - -Azorius Chancery -Land -Azorius Chancery enters the battlefield tapped. -When Azorius Chancery enters the battlefield, return a land you control to its owner's hand. -{T}: Add {W}{U} to your mana pool. -DIS C, COM C - -Azorius First-Wing -{W}{U} -Creature - Griffin -2/2 -Flying, protection from enchantments -DIS C - -Azorius Guildmage -{W/U}{W/U} -Creature - Vedalken Wizard -2/2 -{2}{W}: Tap target creature. -{2}{U}: Counter target activated ability. (Mana abilities can't be targeted.) -DIS U, COM U - -Azorius Herald -{2}{W} -Creature - Spirit -2/1 -Azorius Herald is unblockable. -When Azorius Herald enters the battlefield, you gain 4 life. -When Azorius Herald enters the battlefield, sacrifice it unless {U} was spent to cast it. -DIS U - -Azorius Ploy -{1}{W}{W}{U} -Instant -Prevent all combat damage target creature would deal this turn. -Prevent all combat damage that would be dealt to target creature this turn. -DIS U - -Azorius Signet -{2} -Artifact -{1}, {T}: Add {W}{U} to your mana pool. -DIS C, ARC C - -Azure Drake -{3}{U} -Creature - Drake -2/4 -Flying -LEG U, CHR U, 5ED U, BRB U, 9ED U, M11 C - -Azure Mage -{1}{U} -Creature - Human Wizard -2/1 -{3}{U}: Draw a card. -M12 U - -Azusa, Lost but Seeking -{2}{G} -Legendary Creature - Human Monk -1/2 -You may play two additional lands on each of your turns. -CHK R - -Back to Basics -{2}{U} -Enchantment -Nonbasic lands don't untap during their controllers' untap steps. -USG R - -Back to Nature -{1}{G} -Instant -Destroy all enchantments. -M11 U - -Backdraft -{1}{R} -Instant -Choose a player who cast one or more sorcery spells this turn. Backdraft deals damage to that player equal to half the damage dealt by one of those sorcery spells this turn, rounded down. -LEG U - -Backfire -{U} -Enchantment - Aura -Enchant creature -Whenever enchanted creature deals damage to you, Backfire deals that much damage to that creature's controller. -LEG U, 4ED U - -Backlash -{1}{B}{R} -Instant -Tap target untapped creature. That creature deals damage equal to its power to its controller. -INV U - -Backslide -{1}{U} -Instant -Turn target creature with morph face down. -Cycling {U} ({U}, Discard this card: Draw a card.) -ONS C - -Bad Moon -{1}{B} -Enchantment -Black creatures get +1/+1. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, TSB S, GVL R - -Bad River -Land -Bad River enters the battlefield tapped. -{T}, Sacrifice Bad River: Search your library for an Island or Swamp card and put it onto the battlefield. Then shuffle your library. -MIR U - -Badlands -Land - Swamp Mountain -LEA R, LEB R, 2ED R, 3ED R, ME2 R, ME4 R - -Baki's Curse -{2}{U}{U} -Sorcery -Baki's Curse deals 2 damage to each creature for each Aura attached to that creature. -HML R - -Baku Altar -{2} -Artifact -Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Baku Altar. -{2}, {T}, Remove a ki counter from Baku Altar: Put a 1/1 colorless Spirit creature token onto the battlefield. -BOK R - -Bala Ged Scorpion -{3}{B} -Creature - Scorpion -2/3 -When Bala Ged Scorpion enters the battlefield, you may destroy target creature with power 1 or less. -ROE C - -Bala Ged Thief -{3}{B} -Creature - Human Rogue Ally -2/2 -Whenever Bala Ged Thief or another Ally enters the battlefield under your control, target player reveals a number of cards from his or her hand equal to the number of Allies you control. You choose one of them. That player discards that card. -ZEN R - -Balance -{1}{W} -Sorcery -Each player chooses a number of lands he or she controls equal to the number of lands controlled by the player who controls the fewest, then sacrifices the rest. Players discard cards and sacrifice creatures the same way. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, FVE M, ME4 R - -Balance of Power -{3}{U}{U} -Sorcery -If target opponent has more cards in hand than you, draw cards equal to the difference. -POR R, PTK R, 8ED R - -Balancing Act -{2}{W}{W} -Sorcery -Each player chooses a number of permanents he or she controls equal to the number of permanents controlled by the player who controls the fewest, then sacrifices the rest. Each player discards cards the same way. -ODY R - -Balduvian Barbarians -{1}{R}{R} -Creature - Human Barbarian -3/2 -ICE C, 6ED C, 7ED C, 8ED C, 9ED C - -Balduvian Bears -{1}{G} -Creature - Bear -2/2 -ICE C - -Balduvian Conjurer -{1}{U} -Creature - Human Wizard -0/2 -{T}: Target snow land becomes a 2/2 creature until end of turn. It's still a land. -ICE U, ME2 C - -Balduvian Dead -{3}{B} -Creature - Zombie -2/3 -{2}{R}, Exile a creature card from your graveyard: Put a 3/1 black and red Graveborn creature token with haste onto the battlefield. Sacrifice it at the beginning of the next end step. -ALL U, ME2 U - -Balduvian Fallen -{3}{B} -Creature - Zombie -3/5 -Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -Whenever Balduvian Fallen's cumulative upkeep is paid, it gets +1/+0 until end of turn for each {B} or {R} spent this way. -CSP U - -Balduvian Frostwaker -{2}{U} -Creature - Human Wizard -1/1 -{U}, {T}: Target snow land becomes a 2/2 blue Elemental creature with flying. It's still a land. -CSP U - -Balduvian Horde -{2}{R}{R} -Creature - Human Barbarian -5/5 -When Balduvian Horde enters the battlefield, sacrifice it unless you discard a card at random. -ALL R, 6ED R, BTD R, MED R - -Balduvian Hydra -{X}{R}{R} -Creature - Hydra -0/1 -Balduvian Hydra enters the battlefield with X +1/+0 counters on it. -Remove a +1/+0 counter from Balduvian Hydra: Prevent the next 1 damage that would be dealt to Balduvian Hydra this turn. -{R}{R}{R}: Put a +1/+0 counter on Balduvian Hydra. Activate this ability only during your upkeep. -ICE R, ME2 R - -Balduvian Rage -{X}{R} -Instant -Target attacking creature gets +X/+0 until end of turn. -Draw a card at the beginning of the next turn's upkeep. -CSP U - -Balduvian Shaman -{U} -Creature - Human Cleric Shaman -1/1 -{T}: Change the text of target white enchantment you control that doesn't have cumulative upkeep by replacing all instances of one color word with another. (For example, you may change "black creatures can't attack" to "blue creatures can't attack.") That enchantment gains "Cumulative upkeep {1}." (At the beginning of its controller's upkeep, that player puts an age counter on it, then sacrifices it unless he or she pays its upkeep cost for each age counter on it.) -ICE C - -Balduvian Trading Post -Land -If Balduvian Trading Post would enter the battlefield, sacrifice an untapped Mountain instead. If you do, put Balduvian Trading Post onto the battlefield. If you don't, put it into its owner's graveyard. -{T}: Add {1}{R} to your mana pool. -{1}, {T}: Balduvian Trading Post deals 1 damage to target attacking creature. -ALL R, ME2 R - -Balduvian War-Makers -{4}{R} -Creature - Human Barbarian -3/3 -Haste -Rampage 1 (Whenever this creature becomes blocked, it gets +1/+1 until end of turn for each creature blocking it beyond the first.) -ALL C (x2) - -Balduvian Warlord -{3}{R} -Creature - Human Barbarian -3/2 -{T}: Remove target blocking creature from combat. Creatures it was blocking that hadn't become blocked by another creature this combat become unblocked, then it blocks an attacking creature of your choice. Activate this ability only during the declare blockers step. -CSP U - -Balefire Liege -{2}{R/W}{R/W}{R/W} -Creature - Spirit Horror -2/4 -Other red creatures you control get +1/+1. -Other white creatures you control get +1/+1. -Whenever you cast a red spell, Balefire Liege deals 3 damage to target player. -Whenever you cast a white spell, you gain 3 life. -EVE R, HOP R - -Baleful Stare -{2}{U} -Sorcery -Target opponent reveals his or her hand. You draw a card for each Mountain and red card in it. -POR U, 7ED U, 9ED U - -Ball Lightning -{R}{R}{R} -Creature - Elemental -6/1 -Trample (If this creature would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.) -Haste (This creature can attack and {T} as soon as it comes under your control.) -At the beginning of the end step, sacrifice Ball Lightning. -DRK R, 4ED R, 5ED R, BTD R, MED R, M10 R, H10 R - -Ballista Squad -{3}{W} -Creature - Human Rebel -2/2 -{X}{W}, {T}: Ballista Squad deals X damage to target attacking or blocking creature. -MMQ U, 9ED U, 10E U - -Balloon Peddler -{2}{U} -Creature - Human Spellshaper -2/2 -{U}, {T}, Discard a card: Target creature gains flying until end of turn. -MMQ C - -Ballynock Cohort -{2}{W} -Creature - Kithkin Soldier -2/2 -First strike -Ballynock Cohort gets +1/+1 as long as you control another white creature. -SHM C - -Ballynock Trapper -{3}{W} -Creature - Kithkin Soldier -2/2 -{T}: Tap target creature. -Whenever you cast a white spell, you may untap Ballynock Trapper. -EVE C - -Ballyrush Banneret -{1}{W} -Creature - Kithkin Soldier -2/1 -Kithkin spells and Soldier spells you cast cost {1} less to cast. -MOR C - -Balm of Restoration -{2} -Artifact -{1}, {T}, Sacrifice Balm of Restoration: Choose one - You gain 2 life; or prevent the next 2 damage that would be dealt to target creature or player this turn. -FEM R - -Baloth Cage Trap -{3}{G}{G} -Instant - Trap -If an opponent had an artifact enter the battlefield under his or her control this turn, you may pay {1}{G} rather than pay Baloth Cage Trap's mana cost. -Put a 4/4 green Beast creature token onto the battlefield. -ZEN U - -Baloth Woodcrasher -{4}{G}{G} -Creature - Beast -4/4 -Landfall - Whenever a land enters the battlefield under your control, Baloth Woodcrasher gets +4/+4 and gains trample until end of turn. -ZEN U, COM U - -Balshan Beguiler -{2}{U} -Creature - Human Wizard -1/1 -Whenever Balshan Beguiler deals combat damage to a player, that player reveals the top two cards of his or her library. You choose one of those cards and put it into his or her graveyard. -ODY U - -Balshan Collaborator -{3}{U} -Creature - Bird Soldier -2/2 -Flying -{B}: Balshan Collaborator gets +1/+1 until end of turn. -TOR U - -Balshan Griffin -{3}{U}{U} -Creature - Griffin -3/2 -Flying -{1}{U}, Discard a card: Return Balshan Griffin to its owner's hand. -ODY U - -Balthor the Defiled -{2}{B}{B} -Legendary Creature - Zombie Dwarf -2/2 -Minion creatures get +1/+1. -{B}{B}{B}, Exile Balthor the Defiled: Each player returns all black and all red creature cards from his or her graveyard to the battlefield. -JUD R - -Balthor the Stout -{1}{R}{R} -Legendary Creature - Dwarf Barbarian -2/2 -Other Barbarian creatures get +1/+1. -{R}: Another target Barbarian creature gets +1/+0 until end of turn. -TOR R - -Bamboozle -{2}{U} -Sorcery -Target player reveals the top four cards of his or her library. You choose two of those cards and put them into his or her graveyard. Put the rest on top of his or her library in any order. -ODY U - -Bandage -{W} -Instant -Prevent the next 1 damage that would be dealt to target creature or player this turn. -Draw a card. -STH C, 10E C - -Bane of the Living -{2}{B}{B} -Creature - Insect -4/3 -Morph {X}{B}{B} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Bane of the Living is turned face up, all creatures get -X/-X until end of turn. -LGN R - -Banefire -{X}{R} -Sorcery -Banefire deals X damage to target creature or player. -If X is 5 or more, Banefire can't be countered by spells or abilities and the damage can't be prevented. -CON R - -Baneful Omen -{4}{B}{B}{B} -Enchantment -At the beginning of your end step, you may reveal the top card of your library. If you do, each opponent loses life equal to that card's converted mana cost. -ROE R - -Baneslayer Angel -{3}{W}{W} -Creature - Angel -5/5 -Flying, first strike, lifelink, protection from Demons and from Dragons -M10 M, M11 M - -Banewasp Affliction -{1}{B} -Enchantment - Aura -Enchant creature -When enchanted creature dies, that creature's controller loses life equal to its toughness. -ALA C - -Banishing Knack -{U} -Instant -Until end of turn, target creature gains "{T}: Return target nonland permanent to its owner's hand." -EVE C - -Banishment Decree -{3}{W}{W} -Instant -Put target artifact, creature, or enchantment on top of its owner's library. -MBS C - -Banshee -{2}{B}{B} -Creature - Spirit -0/1 -{X}, {T}: Banshee deals half X damage, rounded down, to target creature or player, and half X damage, rounded up, to you. -DRK U, CHR U, ME3 U - -Banshee's Blade -{2} -Artifact - Equipment -Equipped creature gets +1/+1 for each charge counter on Banshee's Blade. -Whenever equipped creature deals combat damage, put a charge counter on Banshee's Blade. -Equip {2} ({2}: Attach to target creature you control. Equip only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.) -MRD U - -Bant -Plane - Alara -All creatures have exalted. (Whenever a creature attacks alone, it gets +1/+1 until end of turn for each instance of exalted among permanents its controller controls.) -Whenever you roll {C}, put a divinity counter on target green, white, or blue creature. That creature is indestructible as long as it has a divinity counter on it. -HOP C - -Bant Battlemage -{2}{W} -Creature - Human Wizard -2/2 -{G}, {T}: Target creature gains trample until end of turn. -{U}, {T}: Target creature gains flying until end of turn. -ALA U - -Bant Charm -{G}{W}{U} -Instant -Choose one - Destroy target artifact; or put target creature on the bottom of its owner's library; or counter target instant spell. -ALA U - -Bant Panorama -Land -{T}: Add {1} to your mana pool. -{1}, {T}, Sacrifice Bant Panorama: Search your library for a basic Forest, Plains, or Island card and put it onto the battlefield tapped. Then shuffle your library. -ALA C - -Bant Sojourners -{1}{G}{W}{U} -Creature - Human Soldier -2/4 -When you cycle Bant Sojourners or it dies, you may put a 1/1 white Soldier creature token onto the battlefield. -Cycling {2}{W} ({2}{W}, Discard this card: Draw a card.) -ARB C - -Bant Sureblade -{G/U}{W} -Creature - Human Soldier -2/1 -As long as you control another multicolored permanent, Bant Sureblade gets +1/+1 and has first strike. -ARB C - -Barbarian Bully -{2}{R} -Creature - Human Barbarian -2/2 -Discard a card at random: Barbarian Bully gets +2/+2 until end of turn unless a player has Barbarian Bully deal 4 damage to him or her. Activate this ability only once each turn. -JUD C - -Barbarian General -{4}{R} -Creature - Human Barbarian Soldier -3/2 -Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -PTK U - -Barbarian Guides -{2}{R} -Creature - Human Barbarian -1/2 -{2}{R}, {T}: Choose a land type. Target creature you control gains snow landwalk of the chosen type until end of turn. Return that creature to its owner's hand at the beginning of the next end step. -ICE C - -Barbarian Horde -{3}{R} -Creature - Human Barbarian Soldier -3/3 -PTK C - -Barbarian Lunatic -{2}{R} -Creature - Human Barbarian -2/1 -{2}{R}, Sacrifice Barbarian Lunatic: Barbarian Lunatic deals 2 damage to target creature. -ODY C - -Barbarian Outcast -{1}{R} -Creature - Human Barbarian Beast -2/2 -When you control no Swamps, sacrifice Barbarian Outcast. -TOR C - -Barbarian Riftcutter -{4}{R} -Creature - Human Barbarian -3/3 -{R}, Sacrifice Barbarian Riftcutter: Destroy target land. -RAV C - -Barbarian Ring -Land -{T}: Add {R} to your mana pool. Barbarian Ring deals 1 damage to you. -Threshold - {R}, {T}, Sacrifice Barbarian Ring: Barbarian Ring deals 2 damage to target creature or player. Activate this ability only if seven or more cards are in your graveyard. -ODY U, H10 U - -Barbary Apes -{1}{G} -Creature - Ape -2/2 -LEG C - -Barbed Battlegear -{3} -Artifact - Equipment -Equipped creature gets +4/-1. -Equip {2} -SOM U - -Barbed Field -{2}{R}{R} -Enchantment - Aura -Enchant land -Enchanted land has "{T}: This land deals 1 damage to target creature or player." -PCY U - -Barbed Foliage -{2}{G}{G} -Enchantment -Whenever a creature attacks you, it loses flanking until end of turn. -Whenever a creature without flying attacks you, Barbed Foliage deals 1 damage to it. -MIR U - -Barbed Lightning -{2}{R} -Instant -Choose one - Barbed Lightning deals 3 damage to target creature; or Barbed Lightning deals 3 damage to target player. -Entwine {2} (Choose both if you pay the entwine cost.) -DST C - -Barbed Sextant -{1} -Artifact -{1}, {T}, Sacrifice Barbed Sextant: Add one mana of any color to your mana pool. Draw a card at the beginning of the next turn's upkeep. -ICE C, 5ED C, ME2 C - -Barbed Shocker -{3}{R} -Creature - Insect -2/2 -Trample, haste -Whenever Barbed Shocker deals damage to a player, that player discards all the cards in his or her hand, then draws that many cards. -TSP U - -Barbed Sliver -{2}{R} -Creature - Sliver -2/2 -All Sliver creatures have "{2}: This creature gets +1/+0 until end of turn." -TMP U, H09 U - -Barbed Wire -{3} -Artifact -At the beginning of each player's upkeep, Barbed Wire deals 1 damage to that player. -{2}: Prevent the next 1 damage that would be dealt by Barbed Wire this turn. -MMQ U - -Barbed-Back Wurm -{4}{B} -Creature - Wurm -4/3 -{B}: Target green creature blocking Barbed-Back Wurm gets -1/-1 until end of turn. -MIR U - -Barbtooth Wurm -{5}{G} -Creature - Wurm -6/4 -P02 C, S99 C - -Bargain -{2}{W} -Sorcery -Target opponent draws a card. -You gain 7 life. -P02 U, S99 U - -Bargaining Table -{5} -Artifact -{X}, {T}: Draw a card. X is the number of cards in an opponent's hand. -MMQ R - -Barishi -{2}{G}{G} -Creature - Elemental -4/3 -When Barishi dies, exile Barishi, then shuffle all creature cards from your graveyard into your library. -WTH U - -Barkhide Mauler -{4}{G} -Creature - Beast -4/4 -Cycling {2} ({2}, Discard this card: Draw a card.) -ONS C - -Barkshell Blessing -{G/W} -Instant -Target creature gets +2/+2 until end of turn. -Conspire (As you cast this spell, you may tap two untapped creatures you control that share a color with it. When you do, copy it and you may choose a new target for the copy.) -SHM C - -Barktooth Warbeard -{4}{B}{R}{R} -Legendary Creature - Human Warrior -6/5 -LEG U, ME3 C - -Barl's Cage -{4} -Artifact -{3}: Target creature doesn't untap during its controller's next untap step. -DRK R, CHR R, 5ED R, ME3 R - -Baron Sengir -{5}{B}{B}{B} -Legendary Creature - Vampire -5/5 -Flying -Whenever a creature dealt damage by Baron Sengir this turn dies, put a +2/+2 counter on Baron Sengir. -{T}: Regenerate another target Vampire. -HML R, MED R - -Barony Vampire -{2}{B} -Creature - Vampire -3/2 -M11 C - -Barrage Ogre -{3}{R}{R} -Creature - Ogre Warrior -3/3 -{T}, Sacrifice an artifact: Barrage Ogre deals 2 damage to target creature or player. -SOM U - -Barrel Down Sokenzan -{2}{R} -Instant - Arcane -Sweep - Return any number of Mountains you control to their owner's hand. Barrel Down Sokenzan deals damage to target creature equal to twice the number of Mountains returned this way. -SOK C - -Barreling Attack -{2}{R}{R} -Instant -Target creature gains trample until end of turn. When that creature becomes blocked this turn, it gets +1/+1 until end of turn for each creature blocking it. -MIR R - -Barren Glory -{4}{W}{W} -Enchantment -At the beginning of your upkeep, if you control no permanents other than Barren Glory and have no cards in hand, you win the game. -FUT R - -Barren Moor -Land -Barren Moor enters the battlefield tapped. -{T}: Add {B} to your mana pool. -Cycling {B} ({B}, Discard this card: Draw a card.) -ONS C, DVD C, ARC C, COM C - -Barrenton Cragtreads -{2}{W/U}{W/U} -Creature - Kithkin Scout -3/3 -Barrenton Cragtreads can't be blocked by red creatures. -SHM C - -Barrenton Medic -{4}{W} -Creature - Kithkin Cleric -0/4 -{T}: Prevent the next 1 damage that would be dealt to target creature or player this turn. -Put a -1/-1 counter on Barrenton Medic: Untap Barrenton Medic. -SHM C - -Barrin -Vanguard -Hand +0, life +6 -Sacrifice a permanent: Return target creature to its owner's hand. -VG S - -Barrin's Codex -{4} -Artifact -At the beginning of your upkeep, you may put a page counter on Barrin's Codex. -{4}, {T}, Sacrifice Barrin's Codex: Draw X cards, where X is the number of page counters on Barrin's Codex. -USG R - -Barrin's Spite -{2}{U}{B} -Sorcery -Choose two target creatures controlled by the same player. Their controller chooses and sacrifices one of them. Return the other to its owner's hand. -INV R - -Barrin's Unmaking -{1}{U} -Instant -Return target permanent to its owner's hand if that permanent shares a color with the most common color among all permanents or a color tied for most common. -INV C - -Barrin, Master Wizard -{1}{U}{U} -Legendary Creature - Human Wizard -1/1 -{2}, Sacrifice a permanent: Return target creature to its owner's hand. -USG R - -Barrow Ghoul -{1}{B} -Creature - Zombie -4/4 -At the beginning of your upkeep, sacrifice Barrow Ghoul unless you exile the top creature card of your graveyard. -WTH C - -Bartel Runeaxe -{3}{B}{R}{G} -Legendary Creature - Giant Warrior -6/5 -Vigilance -Bartel Runeaxe can't be the target of Aura spells. -LEG R, ME3 U - -Barter in Blood -{2}{B}{B} -Sorcery -Each player sacrifices two creatures. -MRD U, DVD U - -Baru, Fist of Krosa -{3}{G}{G} -Legendary Creature - Human Druid -4/4 -Whenever a Forest enters the battlefield, green creatures you control get +1/+1 and gain trample until end of turn. -Grandeur - Discard another card named Baru, Fist of Krosa: Put an X/X green Wurm creature token onto the battlefield, where X is the number of lands you control. -FUT R - -Basal Sliver -{2}{B} -Creature - Sliver -2/2 -All Slivers have "Sacrifice this permanent: Add {B}{B} to your mana pool." -TSP C - -Basal Thrull -{B}{B} -Creature - Thrull -1/2 -{T}, Sacrifice Basal Thrull: Add {B}{B} to your mana pool. -FEM C (x4), MED C - -Basalt Gargoyle -{2}{R} -Creature - Gargoyle -3/2 -Flying -Echo {2}{R} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -{R}: Basalt Gargoyle gets +0/+1 until end of turn. -TSP U - -Basalt Golem -{5} -Artifact Creature - Golem -2/4 -Basalt Golem can't be blocked by artifact creatures. -Whenever Basalt Golem becomes blocked by a creature, that creature's controller sacrifices it at end of combat. If the player does, he or she puts a 0/2 colorless Wall artifact creature token with defender onto the battlefield. -MIR U - -Basalt Monolith -{3} -Artifact -Basalt Monolith doesn't untap during your untap step. -{T}: Add {3} to your mana pool. -{3}: Untap Basalt Monolith. -LEA U, LEB U, 2ED U, 3ED U, ME4 U - -Basandra, Battle Seraph -{3}{R}{W} -Legendary Creature - Angel -4/4 -Flying -Players can't cast spells during combat. -{R}: Target creature attacks this turn if able. -COM R - -Bash to Bits -{3}{R} -Instant -Destroy target artifact. -Flashback {4}{R}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY U - -Basilisk Collar -{1} -Artifact - Equipment -Equipped creature has deathtouch and lifelink. -Equip {2} -WWK R - -Basking Rootwalla -{G} -Creature - Lizard -1/1 -{1}{G}: Basking Rootwalla gets +2/+2 until end of turn. Activate this ability only once each turn. -Madness {0} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -TOR C, GVL C - -Bathe in Light -{1}{W} -Instant -Radiance - Choose a color. Target creature and each other creature that shares a color with it gain protection from the chosen color until end of turn. -RAV U, COM U - -Baton of Courage -{3} -Artifact -Flash -Sunburst (This enters the battlefield with a charge counter on it for each color of mana spent to cast it.) -Remove a charge counter from Baton of Courage: Target creature gets +1/+1 until end of turn. -5DN C - -Baton of Morale -{2} -Artifact -{2}: Target creature gains banding until end of turn. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding a player controls are blocking or being blocked by a creature, that player divides that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -ICE U - -Battered Golem -{3} -Artifact Creature - Golem -3/2 -Battered Golem doesn't untap during your untap step. -Whenever an artifact enters the battlefield, you may untap Battered Golem. -5DN C - -Battering Craghorn -{2}{R}{R} -Creature - Goat Beast -3/1 -First strike -Morph {1}{R}{R} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS C, ARC C - -Battering Ram -{2} -Artifact Creature - Construct -1/1 -At the beginning of combat on your turn, Battering Ram gains banding until end of combat. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's blocking.) -Whenever Battering Ram becomes blocked by a Wall, destroy that Wall at end of combat. -ATQ C, 4ED C, 5ED C - -Battering Sliver -{5}{R} -Creature - Sliver -4/4 -All Sliver creatures have trample. -PLC C - -Battering Wurm -{6}{G} -Creature - Wurm -4/3 -Bloodthirst 1 (If an opponent was dealt damage this turn, this creature enters the battlefield with a +1/+1 counter on it.) -Creatures with power less than Battering Wurm's power can't block it. -GPT U - -Batterskull -{5} -Artifact - Equipment -Living weapon (When this Equipment enters the battlefield, put a 0/0 black Germ creature token onto the battlefield, then attach this to it.) -Equipped creature gets +4/+4 and has vigilance and lifelink. -{3}: Return Batterskull to its owner's hand. -Equip {5} -NPH M - -Battle Cry -{2}{W} -Instant -Untap all white creatures you control. -Whenever a creature blocks this turn, it gets +0/+1 until end of turn. -ICE U - -Battle Frenzy -{2}{R} -Instant -Green creatures you control get +1/+1 until end of turn. -Nongreen creatures you control get +1/+0 until end of turn. -ICE C - -Battle Hurda -{4}{W} -Creature - Giant -3/3 -First strike -WWK C - -Battle Mastery -{2}{W} -Enchantment - Aura -Enchant creature -Enchanted creature has double strike. -LRW U - -Battle Rampart -{2}{R} -Creature - Wall -1/3 -Defender -{T}: Target creature gains haste until end of turn. -MMQ C, ROE C - -Battle Screech -{2}{W}{W} -Sorcery -Put two 1/1 white Bird creature tokens with flying onto the battlefield. -Flashback-Tap three untapped white creatures you control. (You may cast this card from your graveyard for its flashback cost. Then exile it.) -JUD U - -Battle Squadron -{3}{R}{R} -Creature - Goblin -*/* -Flying -Battle Squadron's power and toughness are each equal to the number of creatures you control. -MMQ R - -Battle Strain -{1}{R} -Enchantment -Whenever a creature blocks, Battle Strain deals 1 damage to that creature's controller. -ODY U - -Battle of Wits -{3}{U}{U} -Enchantment -At the beginning of your upkeep, if you have 200 or more cards in your library, you win the game. -ODY R, 9ED R - -Battle-Mad Ronin -{1}{R} -Creature - Human Samurai -1/1 -Bushido 2 (When this blocks or becomes blocked, it gets +2/+2 until end of turn.) -Battle-Mad Ronin attacks each turn if able. -CHK C - -Battle-Rattle Shaman -{3}{R} -Creature - Goblin Shaman -2/2 -At the beginning of combat on your turn, you may have target creature get +2/+0 until end of turn. -ROE C - -Battlefield Forge -Land -{T}: Add {1} to your mana pool. -{T}: Add {R} or {W} to your mana pool. Battlefield Forge deals 1 damage to you. -APC R, 9ED R, 10E R - -Battlefield Medic -{1}{W} -Creature - Human Cleric -1/1 -{T}: Prevent the next X damage that would be dealt to target creature this turn, where X is the number of Clerics on the battlefield. -ONS C - -Battlefield Percher -{3}{B}{B} -Creature - Bird -2/2 -Flying -Battlefield Percher can block only creatures with flying. -{1}{B}: Battlefield Percher gets +1/+1 until end of turn. -NEM U - -Battlefield Scrounger -{3}{G}{G} -Creature - Centaur -3/3 -Threshold - Put three cards from your graveyard on the bottom of your library: Battlefield Scrounger gets +3/+3 until end of turn. Activate this ability only once each turn, and only if seven or more cards are in your graveyard. -JUD C - -Battlegate Mimic -{1}{R/W} -Creature - Shapeshifter -2/1 -Whenever you cast a spell that's both red and white, Battlegate Mimic becomes 4/2 and gains first strike until end of turn. -EVE C, HOP C - -Battlegrace Angel -{3}{W}{W} -Creature - Angel -4/4 -Flying -Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.) -Whenever a creature you control attacks alone, it gains lifelink until end of turn. -ALA R - -Battlegrowth -{G} -Instant -Put a +1/+1 counter on target creature. -MRD C - -Battletide Alchemist -{3}{W}{W} -Creature - Kithkin Cleric -3/4 -If a source would deal damage to a player, you may prevent X of that damage, where X is the number of Clerics you control. -MOR R - -Battlewand Oak -{2}{G} -Creature - Treefolk Warrior -1/3 -Whenever a Forest enters the battlefield under your control, Battlewand Oak gets +2/+2 until end of turn. -Whenever you cast a Treefolk spell, Battlewand Oak gets +2/+2 until end of turn. -LRW C - -Battlewise Aven -{3}{W} -Creature - Bird Soldier -2/2 -Flying -Threshold - As long as seven or more cards are in your graveyard, Battlewise Aven gets +1/+1 and has first strike. -JUD C - -Batwing Brume -{1}{W/B} -Instant -Prevent all combat damage that would be dealt this turn if {W} was spent to cast Batwing Brume. Each player loses 1 life for each attacking creature he or she controls if {B} was spent to cast Batwing Brume. (Do both if {W}{B} was spent.) -EVE U, ARC U - -Bay Falcon -{1}{U} -Creature - Bird -1/1 -Flying, vigilance -MIR C - -Bayou -Land - Swamp Forest -LEA R, LEB R, 2ED R, 3ED R, ME3 R, ME4 R - -Bayou Dragonfly -{1}{G} -Creature - Insect -1/1 -Flying, swampwalk -TMP C - -Bazaar Trader -{1}{R} -Creature - Goblin -1/1 -{T}: Target player gains control of target artifact, creature, or land you control. -WWK R - -Bazaar of Baghdad -Land -{T}: Draw two cards, then discard three cards. -ARN U, ME3 R - -Bazaar of Wonders -{3}{U}{U} -World Enchantment -When Bazaar of Wonders enters the battlefield, exile all cards from all graveyards. -Whenever a player casts a spell, counter it if a card with the same name is in a graveyard or a nontoken permanent with the same name is on the battlefield. -MIR R - -Beacon Behemoth -{3}{G}{G} -Creature - Beast -5/3 -{1}: Target creature with power 5 or greater gains vigilance until end of turn. -CON C - -Beacon Hawk -{1}{W} -Creature - Bird -1/1 -Flying -Whenever Beacon Hawk deals combat damage to a player, you may untap target creature. -{W}: Beacon Hawk gets +0/+1 until end of turn. -DIS C - -Beacon of Creation -{3}{G} -Sorcery -Put a 1/1 green Insect creature token onto the battlefield for each Forest you control. Shuffle Beacon of Creation into its owner's library. -5DN R - -Beacon of Destiny -{1}{W} -Creature - Human Cleric -1/3 -{T}: The next time a source of your choice would deal damage to you this turn, that damage is dealt to Beacon of Destiny instead. -LGN R - -Beacon of Destruction -{3}{R}{R} -Instant -Beacon of Destruction deals 5 damage to target creature or player. Shuffle Beacon of Destruction into its owner's library. -5DN R, 10E R - -Beacon of Immortality -{5}{W} -Instant -Double target player's life total. Shuffle Beacon of Immortality into its owner's library. -5DN R, 10E R - -Beacon of Tomorrows -{6}{U}{U} -Sorcery -Target player takes an extra turn after this one. Shuffle Beacon of Tomorrows into its owner's library. -5DN R - -Beacon of Unrest -{3}{B}{B} -Sorcery -Put target artifact or creature card from a graveyard onto the battlefield under your control. Shuffle Beacon of Unrest into its owner's library. -5DN R, 10E R, HOP R, ARC R - -Bear Cub -{1}{G} -Creature - Bear -2/2 -P02 C - -Bear Umbra -{2}{G}{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2 and has "Whenever this creature attacks, untap all lands you control." -Totem armor (If enchanted creature would be destroyed, instead remove all damage from it and destroy this Aura.) -ROE R - -Bearscape -{1}{G}{G} -Enchantment -{1}{G}, Exile two cards from your graveyard: Put a 2/2 green Bear creature token onto the battlefield. -ODY R - -Beast Attack -{2}{G}{G}{G} -Instant -Put a 4/4 green Beast creature token onto the battlefield. -Flashback {2}{G}{G}{G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY U, GVL U - -Beast Hunt -{3}{G} -Sorcery -Reveal the top three cards of your library. Put all creature cards revealed this way into your hand and the rest into your graveyard. -HOP C, ZEN C - -Beast Walkers -{1}{W}{W} -Creature - Human Beast Soldier -2/2 -{G}: Beast Walkers gains banding until end of turn. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -HML R - -Beast Within -{2}{G} -Instant -Destroy target permanent. Its controller puts a 3/3 green Beast creature token onto the battlefield. -NPH U - -Beast of Burden -{6} -Artifact Creature - Golem -*/* -Beast of Burden's power and toughness are each equal to the number of creatures on the battlefield. -PRO R, ULG R, 7ED R, 8ED R, 9ED R - -Beastbreaker of Bala Ged -{1}{G} -Creature - Human Warrior -2/2 -Level up {2}{G} ({2}{G}: Put a level counter on this. Level up only as a sorcery.) -LEVEL 1-3 -4/4 -LEVEL 4+ -6/6 -Trample -ROE U - -Beastmaster Ascension -{2}{G} -Enchantment -Whenever a creature you control attacks, you may put a quest counter on Beastmaster Ascension. -As long as Beastmaster Ascension has seven or more quest counters on it, creatures you control get +5/+5. -ZEN R - -Beastmaster's Magemark -{2}{G} -Enchantment - Aura -Enchant creature -Creatures you control that are enchanted get +1/+1. -Whenever a creature you control that's enchanted becomes blocked, it gets +1/+1 until end of turn for each creature blocking it. -GPT C - -Beasts of Bogardan -{4}{R} -Creature - Beast -3/3 -Protection from red -Beasts of Bogardan gets +1/+1 as long as an opponent controls a white permanent. -LEG U, CHR U - -Beckon Apparition -{W/B} -Instant -Exile target card from a graveyard. Put a 1/1 white and black Spirit creature token with flying onto the battlefield. -EVE C - -Bedlam -{2}{R}{R} -Enchantment -Creatures can't block. -USG R, 7ED R - -Bee Sting -{3}{G} -Sorcery -Bee Sting deals 2 damage to target creature or player. -POR U, P02 U, ME4 U - -Befoul -{2}{B}{B} -Sorcery -Destroy target land or nonblack creature. It can't be regenerated. -USG C, 7ED U, CHK C - -Behemoth Sledge -{1}{G}{W} -Artifact - Equipment -Equipped creature gets +2/+2 and has lifelink and trample. -Equip {3} -ARB U - -Behemoth's Herald -{G} -Creature - Elf Shaman -1/1 -{2}{G}, {T}, Sacrifice a red creature, a green creature, and a white creature: Search your library for a card named Godsire and put it onto the battlefield. Then shuffle your library. -ALA U - -Behold the Power of Destruction -Scheme -When you set this scheme in motion, destroy all nonland permanents target opponent controls. -ARC C - -Belbe's Armor -{3} -Artifact -{X}, {T}: Target creature gets -X/+X until end of turn. -NEM U - -Belbe's Percher -{2}{B} -Creature - Bird -2/2 -Flying -Belbe's Percher can block only creatures with flying. -NEM C - -Belbe's Portal -{5} -Artifact -As Belbe's Portal enters the battlefield, choose a creature type. -{3}, {T}: You may put a creature card of the chosen type from your hand onto the battlefield. -NEM R - -Belfry Spirit -{3}{W}{W} -Creature - Spirit -1/1 -Flying -Haunt (When this creature dies, exile it haunting target creature.) -When Belfry Spirit enters the battlefield or the creature it haunts dies, put two 1/1 black Bat creature tokens with flying onto the battlefield. -GPT U - -Belligerent Hatchling -{3}{R/W} -Creature - Elemental -6/6 -First strike -Belligerent Hatchling enters the battlefield with four -1/-1 counters on it. -Whenever you cast a red spell, remove a -1/-1 counter from Belligerent Hatchling. -Whenever you cast a white spell, remove a -1/-1 counter from Belligerent Hatchling. -EVE U - -Bellowing Fiend -{4}{B} -Creature - Spirit -3/3 -Flying -Whenever Bellowing Fiend deals damage to a creature, Bellowing Fiend deals 3 damage to that creature's controller and 3 damage to you. -TMP R, 7ED R - -Bellowing Tanglewurm -{3}{G}{G} -Creature - Wurm -4/4 -Intimidate (This creature can't be blocked except by artifact creatures and/or creatures that share a color with it.) -Other green creatures you control have intimidate. -SOM U - -Belltower Sphinx -{4}{U} -Creature - Sphinx -2/5 -Flying -Whenever a source deals damage to Belltower Sphinx, that source's controller puts that many cards from the top of his or her library into his or her graveyard. -RAV U, M12 U - -Beloved Chaplain -{1}{W} -Creature - Human Cleric -1/1 -Protection from creatures -ODY U - -Ben-Ben, Akki Hermit -{2}{R}{R} -Legendary Creature - Goblin Shaman -1/1 -{T}: Ben-Ben, Akki Hermit deals damage to target attacking creature equal to the number of untapped Mountains you control. -CHK R - -Benalish Cavalry -{1}{W} -Creature - Human Knight -2/2 -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -TSP C - -Benalish Commander -{3}{W} -Creature - Human Soldier -*/* -Benalish Commander's power and toughness are each equal to the number of Soldiers you control. -Suspend X-{X}{W}{W}. X can't be 0. (Rather than cast this card from your hand, you may pay {X}{W}{W} and exile it with X time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -Whenever a time counter is removed from Benalish Commander while it's exiled, put a 1/1 white Soldier creature token onto the battlefield. -PLC R - -Benalish Emissary -{2}{W} -Creature - Human Wizard -1/4 -Kicker {1}{G} (You may pay an additional {1}{G} as you cast this spell.) -When Benalish Emissary enters the battlefield, if it was kicked, destroy target land. -INV U - -Benalish Heralds -{3}{W} -Creature - Human Soldier -2/4 -{3}{U}, {T}: Draw a card. -INV U - -Benalish Hero -{W} -Creature - Human Soldier -1/1 -Banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, MED C - -Benalish Infantry -{2}{W} -Creature - Human Soldier -1/3 -Banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -WTH C - -Benalish Knight -{2}{W} -Creature - Human Knight -2/2 -Flash (You may cast this spell any time you could cast an instant.) -First strike (This creature deals combat damage before creatures without first strike.) -WTH C, 10E C - -Benalish Lancer -{2}{W} -Creature - Human Knight -2/2 -Kicker {2}{W} (You may pay an additional {2}{W} as you cast this spell.) -If Benalish Lancer was kicked, it enters the battlefield with two +1/+1 counters on it and with first strike. -INV C, DDG C - -Benalish Missionary -{W} -Creature - Human Cleric -1/1 -{1}{W}, {T}: Prevent all combat damage that would be dealt by target blocked creature this turn. -WTH C - -Benalish Trapper -{1}{W} -Creature - Human Soldier -1/2 -{W}, {T}: Tap target creature. -INV C - -Benalish Veteran -{2}{W} -Creature - Human Soldier -2/2 -Whenever Benalish Veteran attacks, it gets +1/+1 until end of turn. -M12 C - -Bend or Break -{3}{R} -Sorcery -Each player separates all nontoken lands he or she controls into two piles. For each player, one of his or her piles is chosen by one of his or her opponents of his or her choice. Destroy all lands in the chosen piles. Tap all lands in the other piles. -INV R - -Benediction of Moons -{W} -Sorcery -You gain 1 life for each player. -Haunt (When this spell card is put into a graveyard after resolving, exile it haunting target creature.) -When the creature Benediction of Moons haunts dies, you gain 1 life for each player. -GPT C - -Benevolent Ancestor -{2}{W} -Creature - Spirit -0/4 -Defender (This creature can't attack.) -{T}: Prevent the next 1 damage that would be dealt to target creature or player this turn. -RAV C - -Benevolent Bodyguard -{W} -Creature - Human Cleric -1/1 -Sacrifice Benevolent Bodyguard: Target creature you control gains protection from the color of your choice until end of turn. -JUD C - -Benevolent Unicorn -{1}{W} -Creature - Unicorn -1/2 -If a spell would deal damage to a creature or player, it deals that much damage minus 1 to that creature or player instead. -MIR C - -Benthic Behemoth -{5}{U}{U}{U} -Creature - Serpent -7/6 -Islandwalk -TMP R, 7ED R - -Benthic Djinn -{2}{U}{B} -Creature - Djinn -5/3 -Islandwalk -At the beginning of your upkeep, you lose 2 life. -MIR R - -Benthic Explorers -{3}{U} -Creature - Merfolk Scout -2/4 -{T}, Untap a tapped land an opponent controls: Add one mana of any type that land could produce to your mana pool. -ALL C (x2), ME3 C - -Benthicore -{6}{U} -Creature - Elemental -5/5 -When Benthicore enters the battlefield, put two 1/1 blue Merfolk Wizard creature tokens onto the battlefield. -Tap two untapped Merfolk you control: Untap Benthicore. It gains shroud until end of turn. (It can't be the target of spells or abilities.) -LRW U - -Bequeathal -{G} -Enchantment - Aura -Enchant creature -When enchanted creature dies, you draw two cards. -EXO C - -Bereavement -{1}{B} -Enchantment -Whenever a green creature dies, its controller discards a card. -USG U, 7ED U - -Berserk -{G} -Instant -Cast Berserk only before the combat damage step. -Target creature gains trample and gets +X/+0 until end of turn, where X is its power. At the beginning of the next end step, destroy that creature if it attacked this turn. -LEA U, LEB U, 2ED U, MED R, FVE M - -Berserk Murlodont -{4}{G} -Creature - Beast -3/3 -Whenever a Beast becomes blocked, it gets +1/+1 until end of turn for each creature blocking it. -LGN C - -Berserkers of Blood Ridge -{4}{R} -Creature - Human Berserker -4/4 -Berserkers of Blood Ridge attacks each turn if able. -M10 C, M11 C - -Beseech the Queen -{2/B}{2/B}{2/B} -Sorcery -({2/B} can be paid with any two mana or with {B}. This card's converted mana cost is 6.) -Search your library for a card with converted mana cost less than or equal to the number of lands you control, reveal it, and put it into your hand. Then shuffle your library. -SHM U, HOP U - -Bestial Fury -{2}{R} -Enchantment - Aura -Enchant creature -When Bestial Fury enters the battlefield, draw a card at the beginning of the next turn's upkeep. -Whenever enchanted creature becomes blocked, it gets +4/+0 and gains trample until end of turn. -ALL C (x2), MED C - -Bestial Menace -{3}{G}{G} -Sorcery -Put a 1/1 green Snake creature token, a 2/2 green Wolf creature token, and a 3/3 green Elephant creature token onto the battlefield. -WWK U, COM U - -Betrayal -{U} -Enchantment - Aura -Enchant creature an opponent controls -Whenever enchanted creature becomes tapped, you draw a card. -VIS C - -Betrayal of Flesh -{5}{B} -Instant -Choose one - Destroy target creature; or return target creature card from your graveyard to the battlefield. -Entwine-Sacrifice three lands. (Choose both if you pay the entwine cost.) -MRD U - -Betrothed of Fire -{1}{R} -Enchantment - Aura -Enchant creature -Sacrifice an untapped creature: Enchanted creature gets +2/+0 until end of turn. -Sacrifice enchanted creature: Creatures you control get +2/+0 until end of turn. -WTH C - -Bewilder -{2}{U} -Instant -Target creature gets -3/-0 until end of turn. -Draw a card. -TSP C - -Bifurcate -{3}{G} -Sorcery -Search your library for a permanent card with the same name as target nontoken creature and put that card onto the battlefield. Then shuffle your library. -MMQ R - -Big Game Hunter -{1}{B}{B} -Creature - Human Rebel Assassin -1/1 -When Big Game Hunter enters the battlefield, destroy target creature with power 4 or greater. It can't be regenerated. -Madness {B} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -PLC U - -Bile Urchin -{B} -Creature - Spirit -1/1 -Sacrifice Bile Urchin: Target player loses 1 life. -BOK C - -Bind -{1}{G} -Instant -Counter target activated ability. (Mana abilities can't be targeted.) -Draw a card. -INV R - -Binding Agony -{1}{B} -Enchantment - Aura -Enchant creature -Whenever enchanted creature is dealt damage, Binding Agony deals that much damage to that creature's controller. -MIR C - -Binding Grasp -{3}{U} -Enchantment - Aura -Enchant creature -At the beginning of your upkeep, sacrifice Binding Grasp unless you pay {1}{U}. -You control enchanted creature. -Enchanted creature gets +0/+1. -ICE U, 5ED U, ME2 R - -Biomantic Mastery -{4}{G/U}{G/U}{G/U} -Sorcery -({G/U} can be paid with either {G} or {U}.) -Draw a card for each creature target player controls, then draw a card for each creature another target player controls. -DIS R - -Bioplasm -{3}{G}{G} -Creature - Ooze -4/4 -Whenever Bioplasm attacks, exile the top card of your library. If it's a creature card, Bioplasm gets +X/+Y until end of turn, where X is the exiled creature card's power and Y is its toughness. -GPT R - -Biorhythm -{6}{G}{G} -Sorcery -Each player's life total becomes the number of creatures he or she controls. -ONS R, 9ED R - -Birchlore Rangers -{G} -Creature - Elf Druid -1/1 -Tap two untapped Elves you control: Add one mana of any color to your mana pool. -Morph {G} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS C - -Bird Maiden -{2}{R} -Creature - Human Bird -1/2 -Flying -ARN C (x2), 4ED C, 5ED C, ME4 C - -Birds of Paradise -{G} -Creature - Bird -0/1 -Flying -{T}: Add one mana of any color to your mana pool. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, 6ED R, 7ED R, 8ED R, RAV R, 10E R, M10 R, M11 R, M12 R - -Birds of Paradise Avatar -Vanguard -Hand +0, life -3 -Lands you control have "{T}: Add one mana of any color to your mana pool." -VG S (x2) - -Birthing Pod -{3}{G/P} -Artifact -({G/P} can be paid with either {G} or 2 life.) -{1}{G/P}, {T}, Sacrifice a creature: Search your library for a creature card with converted mana cost equal to 1 plus the sacrificed creature's converted mana cost, put that card onto the battlefield, then shuffle your library. Activate this ability only any time you could cast a sorcery. -NPH R - -Biting Tether -{4}{U} -Enchantment - Aura -Enchant creature -You control enchanted creature. -At the beginning of your upkeep, put a -1/-1 counter on enchanted creature. -SHM U - -Bitter Ordeal -{2}{B} -Sorcery -Search target player's library for a card and exile it. Then that player shuffles his or her library. -Gravestorm (When you cast this spell, copy it for each permanent put into a graveyard this turn. You may choose new targets for the copies.) -FUT R - -Bitterblossom -{1}{B} -Tribal Enchantment - Faerie -At the beginning of your upkeep, you lose 1 life and put a 1/1 black Faerie Rogue creature token with flying onto the battlefield. -MOR R - -Bituminous Blast -{3}{B}{R} -Instant -Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.) -Bituminous Blast deals 4 damage to target creature. -ARB U, ARC U - -Black Carriage -{3}{B}{B} -Creature - Horse -4/4 -Trample -Black Carriage doesn't untap during your untap step. -Sacrifice a creature: Untap Black Carriage. Activate this ability only during your upkeep. -HML R - -Black Knight -{B}{B} -Creature - Human Knight -2/2 -First strike (This creature deals combat damage before creatures without first strike.) -Protection from white (This creature can't be blocked, targeted, dealt damage, or enchanted by anything white.) -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, MED U, M10 U, M11 U, ME4 U - -Black Lotus -{0} -Artifact -{T}, Sacrifice Black Lotus: Add three mana of any one color to your mana pool. -LEA R, LEB R, 2ED R - -Black Mana Battery -{4} -Artifact -{2}, {T}: Put a charge counter on Black Mana Battery. -{T}, Remove any number of charge counters from Black Mana Battery: Add {B} to your mana pool, then add an additional {B} to your mana pool for each charge counter removed this way. -LEG U, 4ED R - -Black Market -{3}{B}{B} -Enchantment -Whenever a creature dies, put a charge counter on Black Market. -At the beginning of your precombat main phase, add {B} to your mana pool for each charge counter on Black Market. -MMQ R - -Black Poplar Shaman -{2}{B} -Creature - Treefolk Shaman -1/3 -{2}{B}: Regenerate target Treefolk. -LRW C - -Black Scarab -{W} -Enchantment - Aura -Enchant creature -Enchanted creature can't be blocked by black creatures. -Enchanted creature gets +2/+2 as long as an opponent controls a black permanent. -ICE U - -Black Sun's Zenith -{X}{B}{B} -Sorcery -Put X -1/-1 counters on each creature. Shuffle Black Sun's Zenith into its owner's library. -MBS R - -Black Vise -{1} -Artifact -As Black Vise enters the battlefield, choose an opponent. -At the beginning of the chosen player's upkeep, Black Vise deals X damage to that player, where X is the number of cards in his or her hand minus 4. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, ME3 R, FVR M - -Black Ward -{W} -Enchantment - Aura -Enchant creature -Enchanted creature has protection from black. This effect doesn't remove Black Ward. -LEA U, LEB U, 2ED U, 3ED U, 4ED U - -Blackcleave Cliffs -Land -Blackcleave Cliffs enters the battlefield tapped unless you control two or fewer other lands. -{T}: Add {B} or {R} to your mana pool. -SOM R - -Blackcleave Goblin -{3}{B} -Creature - Goblin Zombie -2/1 -Haste -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -SOM C - -Blackmail -{B} -Sorcery -Target player reveals three cards from his or her hand and you choose one of them. That player discards that card. -ONS U, 9ED U - -Blade Sliver -{2}{R} -Creature - Sliver -2/2 -All Sliver creatures get +1/+0. -LGN U - -Blade Splicer -{2}{W} -Creature - Human Artificer -1/1 -When Blade Splicer enters the battlefield, put a 3/3 colorless Golem artifact creature token onto the battlefield. -Golem creatures you control have first strike. -NPH R - -Blade of the Bloodchief -{1} -Artifact - Equipment -Whenever a creature dies, put a +1/+1 counter on equipped creature. If equipped creature is a Vampire, put two +1/+1 counters on it instead. -Equip {1} -ZEN R - -Blade of the Sixth Pride -{1}{W} -Creature - Cat Rebel -3/1 -FUT C - -Blade-Tribe Berserkers -{3}{R} -Creature - Human Berserker -3/3 -Metalcraft - When Blade-Tribe Berserkers enters the battlefield, if you control three or more artifacts, Blade-Tribe Berserkers gets +3/+3 and gains haste until end of turn. -SOM C - -Bladed Pinions -{2} -Artifact - Equipment -Equipped creature has flying and first strike. -Equip {2} -SOM C - -Bladed Sentinel -{4} -Artifact Creature - Construct -2/4 -{W}: Bladed Sentinel gains vigilance until end of turn. -MBS C - -Blademane Baku -{1}{R} -Creature - Spirit -1/1 -Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Blademane Baku. -{1}, Remove X ki counters from Blademane Baku: For each counter removed, Blademane Baku gets +2/+0 until end of turn. -BOK C - -Blades of Velis Vel -{1}{R} -Tribal Instant - Shapeshifter -Changeling (This card is every creature type at all times.) -Up to two target creatures each get +2/+0 and gain all creature types until end of turn. -LRW C - -Bladetusk Boar -{3}{R} -Creature - Boar -3/2 -Intimidate (This creature can't be blocked except by artifact creatures and/or creatures that share a color with it.) -ZEN C - -Bladewing the Risen -{3}{B}{B}{R}{R} -Legendary Creature - Zombie Dragon -4/4 -Flying -When Bladewing the Risen enters the battlefield, you may return target Dragon permanent card from your graveyard to the battlefield. -{B}{R}: Dragon creatures get +1/+1 until end of turn. -SCG R, FVD R, COM R - -Bladewing's Thrall -{2}{B}{B} -Creature - Zombie -3/3 -Bladewing's Thrall has flying as long as you control a Dragon. -When a Dragon enters the battlefield, you may return Bladewing's Thrall from your graveyard to the battlefield. -SCG U - -Blanchwood Armor -{2}{G} -Enchantment - Aura -Enchant creature (Target a creature as you cast this. This card enters the battlefield attached to that creature.) -Enchanted creature gets +1/+1 for each Forest you control. -USG U, 7ED U, 8ED U, 9ED U, 10E U - -Blanchwood Treefolk -{4}{G} -Creature - Treefolk -4/5 -USG C - -Blanket of Night -{1}{B}{B} -Enchantment -Each land is a Swamp in addition to its other land types. -VIS U - -Blasted Landscape -Land -{T}: Add {1} to your mana pool. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG U - -Blaster Mage -{2}{R} -Creature - Human Spellshaper -2/2 -{R}, {T}, Discard a card: Destroy target Wall. -MMQ C - -Blasting Station -{3} -Artifact -{T}, Sacrifice a creature: Blasting Station deals 1 damage to target creature or player. -Whenever a creature enters the battlefield, you may untap Blasting Station. -5DN U - -Blastoderm -{2}{G}{G} -Creature - Beast -5/5 -Shroud (This permanent can't be the target of spells or abilities.) -Fading 3 (This creature enters the battlefield with three fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.) -NEM C, GVL C - -Blatant Thievery -{4}{U}{U}{U} -Sorcery -For each opponent, gain control of target permanent that player controls. (This effect lasts indefinitely.) -ONS R - -Blaze -{X}{R} -Sorcery -Blaze deals X damage to target creature or player. -POR U (x2), P02 U, 6ED U, PTK U, 7ED U, 8ED U, 9ED U, 10E U, HOP U - -Blaze of Glory -{W} -Instant -Cast Blaze of Glory only during the declare attackers step. -Target creature defending player controls can block any number of creatures this turn. It blocks each attacking creature this turn if able. -LEA R, LEB R, 2ED R, ME4 U - -Blazethorn Scarecrow -{5} -Artifact Creature - Scarecrow -3/3 -Blazethorn Scarecrow has haste as long as you control a red creature. -Blazethorn Scarecrow has wither as long as you control a green creature. (It deals damage to creatures in the form of -1/-1 counters.) -SHM C - -Blazing Archon -{6}{W}{W}{W} -Creature - Archon -5/6 -Flying -Creatures can't attack you. -RAV R - -Blazing Blade Askari -{2}{R} -Creature - Human Knight -2/2 -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -{2}: Blazing Blade Askari becomes colorless until end of turn. -TSP C - -Blazing Effigy -{1}{R} -Creature - Elemental -0/3 -When Blazing Effigy dies, it deals X damage to target creature, where X is 3 plus the amount of damage dealt to Blazing Effigy this turn by other sources named Blazing Effigy. -LEG C - -Blazing Salvo -{R} -Instant -Blazing Salvo deals 3 damage to target creature unless that creature's controller has Blazing Salvo deal 5 damage to him or her. -ODY C - -Blazing Shoal -{X}{R}{R} -Instant - Arcane -You may exile a red card with converted mana cost X from your hand rather than pay Blazing Shoal's mana cost. -Target creature gets +X/+0 until end of turn. -BOK R - -Blazing Specter -{2}{B}{R} -Creature - Specter -2/2 -Flying, haste -Whenever Blazing Specter deals combat damage to a player, that player discards a card. -INV R - -Blazing Torch -{1} -Artifact - Equipment -Equipped creature can't be blocked by Vampires or Zombies. -Equipped creature has "{T}, Sacrifice Blazing Torch: Blazing Torch deals 2 damage to target creature or player." -Equip {1} -ZEN U - -Bleak Coven Vampires -{3}{B}{B} -Creature - Vampire Warrior -4/3 -Metalcraft - When Bleak Coven Vampires enters the battlefield, if you control three or more artifacts, target player loses 4 life and you gain 4 life. -SOM C - -Blessed Breath -{W} -Instant - Arcane -Target creature you control gains protection from the color of your choice until end of turn. -Splice onto Arcane {W} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -CHK C - -Blessed Orator -{3}{W} -Creature - Human Cleric -1/4 -Other creatures you control get +0/+1. -ODY U, 9ED U - -Blessed Reversal -{1}{W} -Instant -You gain 3 life for each creature attacking you. -POR R, ULG R, 7ED R, 8ED R - -Blessed Wind -{7}{W}{W} -Sorcery -Target player's life total becomes 20. -PCY R - -Blessed Wine -{1}{W} -Instant -You gain 1 life. -Draw a card at the beginning of the next turn's upkeep. -ICE C, 5ED C - -Blessing -{W}{W} -Enchantment - Aura -Enchant creature -{W}: Enchanted creature gets +1/+1 until end of turn. -LEA R, LEB R, 2ED R, 3ED R, 4ED R - -Blessing of Leeches -{2}{B} -Enchantment - Aura -Flash -Enchant creature -At the beginning of your upkeep, you lose 1 life. -{0}: Regenerate enchanted creature. -BOK C - -Blessing of the Nephilim -{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+1 for each of its colors. -DIS U - -Blight -{B}{B} -Enchantment - Aura -Enchant land -When enchanted land becomes tapped, destroy it. -LEG U, 4ED U, 5ED U, 6ED U, MED U - -Blight Mamba -{1}{G} -Creature - Snake -1/1 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -{1}{G}: Regenerate Blight Mamba. -SOM C - -Blight Sickle -{2} -Artifact - Equipment -Equipped creature gets +1/+0 and has wither. (It deals damage to creatures in the form of -1/-1 counters.) -Equip {2} -SHM C - -Blighted Agent -{1}{U} -Creature - Human Rogue -1/1 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -Blighted Agent is unblockable. -NPH C - -Blighted Shaman -{1}{B} -Creature - Human Cleric Shaman -1/1 -{T}, Sacrifice a Swamp: Target creature gets +1/+1 until end of turn. -{T}, Sacrifice a creature: Target creature gets +2/+2 until end of turn. -MIR U, 6ED U - -Blightning -{1}{B}{R} -Sorcery -Blightning deals 3 damage to target player. That player discards two cards. -ALA C - -Blightsoil Druid -{1}{B} -Creature - Elf Druid -1/2 -{T}, Pay 1 life: Add {G} to your mana pool. -MOR C - -Blightspeaker -{1}{B} -Creature - Human Rebel Cleric -1/1 -{T}: Target player loses 1 life. -{4}, {T}: Search your library for a Rebel permanent card with converted mana cost 3 or less and put it onto the battlefield. Then shuffle your library. -PLC C - -Blightsteel Colossus -{12} -Artifact Creature - Golem -11/11 -Trample, infect -Blightsteel Colossus is indestructible. -If Blightsteel Colossus would be put into a graveyard from anywhere, reveal Blightsteel Colossus and shuffle it into its owner's library instead. -MBS M - -Blightwidow -{3}{G} -Creature - Spider -2/4 -Reach (This creature can block creatures with flying.) -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -MBS C - -Blind Creeper -{1}{B} -Creature - Zombie Beast -3/3 -Whenever a player casts a spell, Blind Creeper gets -1/-1 until end of turn. -5DN C - -Blind Fury -{2}{R}{R} -Instant -Cast Blind Fury only before the combat damage step. -All creatures lose trample until end of turn. If a creature would deal combat damage to a creature this turn, it deals double that damage to that creature instead. -MIR U - -Blind Hunter -{2}{W}{B} -Creature - Bat -2/2 -Flying -Haunt (When this creature dies, exile it haunting target creature.) -When Blind Hunter enters the battlefield or the creature it haunts dies, target player loses 2 life and you gain 2 life. -GPT C - -Blind Phantasm -{2}{U} -Creature - Illusion -2/3 -FUT C - -Blind Seer -{2}{U}{U} -Legendary Creature - Human Wizard -3/3 -{1}{U}: Target spell or permanent becomes the color of your choice until end of turn. -INV R - -Blind Zealot -{1}{B}{B} -Creature - Human Cleric -2/2 -Intimidate (This creature can't be blocked except by artifact creatures and/or creatures that share a color with it.) -Whenever Blind Zealot deals combat damage to a player, you may sacrifice it. If you do, destroy target creature that player controls. -NPH C - -Blind with Anger -{3}{R} -Instant - Arcane -Untap target nonlegendary creature and gain control of it until end of turn. That creature gains haste until end of turn. -CHK U - -Blind-Spot Giant -{2}{R} -Creature - Giant Warrior -4/3 -Blind-Spot Giant can't attack or block unless you control another Giant. -LRW C - -Blinding Angel -{3}{W}{W} -Creature - Angel -2/4 -Flying (This creature can't be blocked except by creatures with flying or reach.) -Whenever Blinding Angel deals combat damage to a player, that player skips his or her next combat phase. -NEM R, 8ED R, 9ED R - -Blinding Beam -{2}{W} -Instant -Choose one - Tap two target creatures; or creatures don't untap during target player's next untap step. -Entwine {1} (Choose both if you pay the entwine cost.) -MRD C, EVT C - -Blinding Light -{2}{W} -Sorcery -Tap all nonwhite creatures. -MIR U, POR R, S99 R, INV U - -Blinding Mage -{1}{W} -Creature - Human Wizard -1/2 -{W}, {T}: Tap target creature. -M10 C, M11 C - -Blinding Powder -{1} -Artifact - Equipment -Equipped creature has "Unattach Blinding Powder: Prevent all combat damage that would be dealt to this creature this turn." -Equip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) -BOK U - -Blinding Souleater -{3} -Artifact Creature - Cleric -1/3 -{W/P}, {T}: Tap target creature. ({W/P} can be paid with either {W} or 2 life.) -NPH C - -Blinking Spirit -{3}{W} -Creature - Spirit -2/2 -{0}: Return Blinking Spirit to its owner's hand. -ICE R, 5ED R, BRB R, 9ED R - -Blinkmoth Infusion -{12}{U}{U} -Instant -Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -Untap all artifacts. -5DN R - -Blinkmoth Nexus -Land -{T}: Add {1} to your mana pool. -{1}: Blinkmoth Nexus becomes a 1/1 Blinkmoth artifact creature with flying until end of turn. It's still a land. -{1}, {T}: Target Blinkmoth creature gets +1/+1 until end of turn. -DST R - -Blinkmoth Urn -{5} -Artifact -At the beginning of each player's precombat main phase, if Blinkmoth Urn is untapped, that player adds {1} to his or her mana pool for each artifact he or she controls. -MRD R - -Blinkmoth Well -Land -{T}: Add {1} to your mana pool. -{2}, {T}: Tap target noncreature artifact. -MRD U - -Blister Beetle -{1}{B} -Creature - Insect -1/1 -When Blister Beetle enters the battlefield, target creature gets -1/-1 until end of turn. -ALA C - -Blistergrub -{2}{B} -Creature - Horror -2/2 -Swampwalk -When Blistergrub dies, each opponent loses 2 life. -SOM C - -Blistering Barrier -{2}{R} -Creature - Wall -5/2 -Defender (This creature can't attack.) -MIR C - -Blistering Dieflyn -{3}{R} -Creature - Imp -0/1 -Flying -{B/R}: Blistering Dieflyn gets +1/+0 until end of turn. -SHM C - -Blistering Firecat -{1}{R}{R}{R} -Creature - Elemental Cat -7/1 -Trample, haste -At the beginning of the end step, sacrifice Blistering Firecat. -Morph {R}{R} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS R - -Blisterstick Shaman -{2}{R} -Creature - Goblin Shaman -2/1 -When Blisterstick Shaman enters the battlefield, it deals 1 damage to target creature or player. -MBS C - -Blitz Hellion -{3}{R}{G} -Creature - Hellion -7/7 -Trample, haste -At the beginning of the end step, Blitz Hellion's owner shuffles it into his or her library. -ARB R - -Blizzard -{G}{G} -Enchantment -Cast Blizzard only if you control a snow land. -Cumulative upkeep {2} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -Creatures with flying don't untap during their controllers' untap steps. -ICE R - -Blizzard Elemental -{5}{U}{U} -Creature - Elemental -5/5 -Flying -{3}{U}: Untap Blizzard Elemental. -UDS R, BTD R - -Blizzard Specter -{2}{U}{B} -Snow Creature - Specter -2/3 -Flying -Whenever Blizzard Specter deals combat damage to a player, choose one - That player returns a permanent he or she controls to its owner's hand; or that player discards a card. -CSP U - -Bloated Toad -{2}{G} -Creature - Frog -2/2 -Protection from blue -Cycling {2} ({2}, Discard this card: Draw a card.) -ULG U - -Blockade Runner -{3}{U} -Creature - Merfolk -2/2 -{U}: Blockade Runner is unblockable this turn. -MMQ C - -Blockbuster -{3}{R}{R} -Enchantment -{1}{R}, Sacrifice Blockbuster: Blockbuster deals 3 damage to each tapped creature and each player. -RAV U - -Blood Celebrant -{B} -Creature - Human Cleric -1/1 -{B}, Pay 1 life: Add one mana of any color to your mana pool. -LGN C - -Blood Clock -{4} -Artifact -At the beginning of each player's upkeep, that player returns a permanent he or she controls to its owner's hand unless he or she pays 2 life. -SOK R - -Blood Crypt -Land - Swamp Mountain -({T}: Add {B} or {R} to your mana pool.) -As Blood Crypt enters the battlefield, you may pay 2 life. If you don't, Blood Crypt enters the battlefield tapped. -DIS R - -Blood Cultist -{1}{B}{R} -Creature - Human Wizard -1/1 -{T}: Blood Cultist deals 1 damage to target creature. -Whenever a creature dealt damage by Blood Cultist this turn dies, put a +1/+1 counter on Blood Cultist. -ALA U - -Blood Frenzy -{1}{R} -Instant -Cast Blood Frenzy only before the combat damage step. -Target attacking or blocking creature gets +4/+0 until end of turn. Destroy that creature at the beginning of the next end step. -TMP C - -Blood Funnel -{1}{B} -Enchantment -Noncreature spells you cast cost {2} less to cast. -Whenever you cast a noncreature spell, counter that spell unless you sacrifice a creature. -RAV R - -Blood Hound -{2}{R} -Creature - Hound -1/1 -Whenever you're dealt damage, you may put that many +1/+1 counters on Blood Hound. -At the beginning of your end step, remove all +1/+1 counters from Blood Hound. -MMQ R - -Blood Knight -{R}{R} -Creature - Human Knight -2/2 -First strike, protection from white -PLC U - -Blood Lust -{1}{R} -Instant -If target creature has toughness 5 or greater, it gets +4/-4 until end of turn. Otherwise, it gets +4/-X until end of turn, where X is its toughness minus 1. -LEG U, 4ED C, 5ED C, ME3 C - -Blood Moon -{2}{R} -Enchantment -Nonbasic lands are Mountains. -DRK R, CHR R, 8ED R, 9ED R - -Blood Oath -{3}{R} -Instant -Choose a card type. Target opponent reveals his or her hand. Blood Oath deals 3 damage to that player for each card of the chosen type revealed this way. (Artifact, creature, enchantment, instant, land, planeswalker, sorcery, and tribal are card types.) -MMQ R - -Blood Ogre -{2}{R} -Creature - Ogre Warrior -2/2 -Bloodthirst 1 (If an opponent was dealt damage this turn, this creature enters the battlefield with a +1/+1 counter on it.) -First strike (This creature deals combat damage before creatures without first strike.) -M12 C - -Blood Pet -{B} -Creature - Thrull -1/1 -Sacrifice Blood Pet: Add {B} to your mana pool. -TMP C, 6ED C, 7ED C - -Blood Rites -{3}{R}{R} -Enchantment -{1}{R}, Sacrifice a creature: Blood Rites deals 2 damage to target creature or player. -CHK U - -Blood Seeker -{1}{B} -Creature - Vampire Shaman -1/1 -Whenever a creature enters the battlefield under an opponent's control, you may have that player lose 1 life. -ZEN C, M12 C - -Blood Speaker -{3}{B} -Creature - Ogre Shaman -3/2 -At the beginning of your upkeep, you may sacrifice Blood Speaker. If you do, search your library for a Demon card, reveal that card, and put it into your hand. Then shuffle your library. -Whenever a Demon enters the battlefield under your control, return Blood Speaker from your graveyard to your hand. -CHK U - -Blood Tithe -{3}{B} -Sorcery -Each opponent loses 3 life. You gain life equal to the life lost this way. -M11 C - -Blood Tribute -{4}{B}{B} -Sorcery -Kicker-Tap an untapped Vampire you control. (You may tap a Vampire you control in addition to any other costs as you cast this spell.) -Target opponent loses half his or her life, rounded up. If Blood Tribute was kicked, you gain life equal to the life lost this way. -ZEN R - -Blood Tyrant -{4}{U}{B}{R} -Creature - Vampire -5/5 -Flying, trample -At the beginning of your upkeep, each player loses 1 life. Put a +1/+1 counter on Blood Tyrant for each 1 life lost this way. -Whenever a player loses the game, put five +1/+1 counters on Blood Tyrant. -CON R - -Blood Vassal -{2}{B} -Creature - Thrull -2/2 -Sacrifice Blood Vassal: Add {B}{B} to your mana pool. -USG C - -Blood of the Martyr -{W}{W}{W} -Instant -Until end of turn, if damage would be dealt to any creature, you may have that damage dealt to you instead. -DRK U, CHR U - -Bloodbond March -{2}{B}{G} -Enchantment -Whenever a player casts a creature spell, each player returns all cards with the same name as that spell from his or her graveyard to the battlefield. -RAV R - -Bloodbraid Elf -{2}{R}{G} -Creature - Elf Berserker -3/2 -Haste -Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.) -ARB U - -Bloodchief Ascension -{B} -Enchantment -At the beginning of each end step, if an opponent lost 2 or more life this turn, you may put a quest counter on Bloodchief Ascension. (Damage causes loss of life.) -Whenever a card is put into an opponent's graveyard from anywhere, if Bloodchief Ascension has three or more quest counters on it, you may have that player lose 2 life. If you do, you gain 2 life. -ZEN R - -Bloodcrazed Goblin -{R} -Creature - Goblin Berserker -2/2 -Bloodcrazed Goblin can't attack unless an opponent has been dealt damage this turn. -M11 C - -Bloodcurdler -{1}{B} -Creature - Horror -1/1 -Flying -At the beginning of your upkeep, put the top card of your library into your graveyard. -Threshold - As long as seven or more cards are in your graveyard, Bloodcurdler gets +1/+1 and has "At the beginning of your end step, exile two cards from your graveyard." -ODY R - -Bloodcurdling Scream -{X}{B} -Sorcery -Target creature gets +X/+0 until end of turn. -P02 U - -Bloodfire Colossus -{6}{R}{R} -Creature - Giant -6/6 -{R}, Sacrifice Bloodfire Colossus: Bloodfire Colossus deals 6 damage to each creature and each player. -APC R, 9ED R, 10E R - -Bloodfire Dwarf -{R} -Creature - Dwarf -1/1 -{R}, Sacrifice Bloodfire Dwarf: Bloodfire Dwarf deals 1 damage to each creature without flying. -APC C - -Bloodfire Infusion -{2}{R} -Enchantment - Aura -Enchant creature you control -{R}, Sacrifice enchanted creature: Bloodfire Infusion deals damage equal to the sacrificed creature's power to each creature. -APC C - -Bloodfire Kavu -{2}{R}{R} -Creature - Kavu -2/2 -{R}, Sacrifice Bloodfire Kavu: Bloodfire Kavu deals 2 damage to each creature. -APC U - -Bloodghast -{B}{B} -Creature - Vampire Spirit -2/1 -Bloodghast can't block. -Bloodghast has haste as long as an opponent has 10 or less life. -Landfall - Whenever a land enters the battlefield under your control, you may return Bloodghast from your graveyard to the battlefield. -ZEN R - -Bloodhall Ooze -{R} -Creature - Ooze -1/1 -At the beginning of your upkeep, if you control a black permanent, you may put a +1/+1 counter on Bloodhall Ooze. -At the beginning of your upkeep, if you control a green permanent, you may put a +1/+1 counter on Bloodhall Ooze. -CON R - -Bloodhusk Ritualist -{2}{B} -Creature - Vampire Shaman -2/2 -Multikicker {B} (You may pay an additional {B} any number of times as you cast this spell.) -When Bloodhusk Ritualist enters the battlefield, target opponent discards a card for each time it was kicked. -WWK U - -Bloodied Ghost -{1}{W/B}{W/B} -Creature - Spirit -3/3 -Flying -Bloodied Ghost enters the battlefield with a -1/-1 counter on it. -EVE U - -Bloodletter Quill -{3} -Artifact -{2}, {T}, Put a blood counter on Bloodletter Quill: Draw a card, then lose 1 life for each blood counter on Bloodletter Quill. -{U}{B}: Remove a blood counter from Bloodletter Quill. -RAV R - -Bloodline Shaman -{1}{G} -Creature - Elf Wizard Shaman -1/1 -{T}: Choose a creature type. Reveal the top card of your library. If that card is a creature card of the chosen type, put it into your hand. Otherwise, put it into your graveyard. -ONS U - -Bloodlord of Vaasgoth -{3}{B}{B} -Creature - Vampire Warrior -3/3 -Bloodthirst 3 (If an opponent was dealt damage this turn, this creature enters the battlefield with three +1/+1 counters on it.) -Flying -Whenever you cast a Vampire creature spell, it gains bloodthirst 3. -M12 M - -Bloodmark Mentor -{1}{R} -Creature - Goblin Warrior -1/1 -Red creatures you control have first strike. -SHM U, DDG U - -Bloodpyre Elemental -{4}{R} -Creature - Elemental -4/1 -Sacrifice Bloodpyre Elemental: Bloodpyre Elemental deals 4 damage to target creature. Activate this ability only any time you could cast a sorcery. -ALA C - -Bloodrage Vampire -{2}{B} -Creature - Vampire -3/1 -Bloodthirst 1 (If an opponent was dealt damage this turn, this creature enters the battlefield with a +1/+1 counter on it.) -M12 C - -Bloodrite Invoker -{2}{B} -Creature - Vampire Shaman -3/1 -{8}: Target player loses 3 life and you gain 3 life. -ROE C - -Bloodrock Cyclops -{2}{R} -Creature - Cyclops -3/3 -Bloodrock Cyclops attacks each turn if able. -WTH C, BTD C, 10E C - -Bloodscale Prowler -{2}{R} -Creature - Viashino Warrior -3/1 -Bloodthirst 1 (If an opponent was dealt damage this turn, this creature enters the battlefield with a +1/+1 counter on it.) -GPT C - -Bloodscent -{3}{G} -Instant -All creatures able to block target creature this turn do so. -MRD U - -Bloodshed Fever -{R} -Enchantment - Aura -Enchant creature -Enchanted creature attacks each turn if able. -SHM C - -Bloodshot Cyclops -{5}{R} -Creature - Cyclops Giant -4/4 -{T}, Sacrifice a creature: Bloodshot Cyclops deals damage equal to the sacrificed creature's power to target creature or player. -UDS R, 7ED R, 8ED R - -Bloodshot Trainee -{3}{R} -Creature - Goblin Warrior -2/3 -{T}: Bloodshot Trainee deals 4 damage to target creature. Activate this ability only if Bloodshot Trainee's power is 4 or greater. -FUT U, SOM U - -Bloodstained Mire -Land -{T}, Pay 1 life, Sacrifice Bloodstained Mire: Search your library for a Swamp or Mountain card and put it onto the battlefield. Then shuffle your library. -ONS R - -Bloodstoke Howler -{5}{R} -Creature - Beast -3/4 -Morph {6}{R} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Bloodstoke Howler is turned face up, Beast creatures you control get +3/+0 until end of turn. -LGN C - -Bloodstone Cameo -{3} -Artifact -{T}: Add {B} or {R} to your mana pool. -INV U - -Bloodthirsty Ogre -{2}{B} -Creature - Ogre Warrior Shaman -3/1 -{T}: Put a devotion counter on Bloodthirsty Ogre. -{T}: Target creature gets -X/-X until end of turn, where X is the number of devotion counters on Bloodthirsty Ogre. Activate this ability only if you control a Demon. -CHK U - -Bloodthorn Taunter -{1}{R} -Creature - Human Scout -1/1 -Haste -{T}: Target creature with power 5 or greater gains haste until end of turn. -ALA C - -Bloodthrone Vampire -{1}{B} -Creature - Vampire -1/1 -Sacrifice a creature: Bloodthrone Vampire gets +2/+2 until end of turn. -ROE C, M11 C - -Bloom Tender -{1}{G} -Creature - Elf Druid -1/1 -{T}: For each color among permanents you control, add one mana of that color to your mana pool. -EVE R - -Blossoming Wreath -{G} -Instant -You gain life equal to the number of creature cards in your graveyard. -WTH C - -Blowfly Infestation -{2}{B} -Enchantment -Whenever a creature dies, if it had a -1/-1 counter on it, put a -1/-1 counter on target creature. -SHM U - -Bludgeon Brawl -{2}{R} -Enchantment -Each noncreature, non-Equipment artifact is an Equipment with equip {X} and "Equipped creature gets +X/+0," where X is that artifact's converted mana cost. -NPH R - -Blue Elemental Blast -{U} -Instant -Choose one - Counter target red spell; or destroy target red permanent. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, ME4 U - -Blue Mana Battery -{4} -Artifact -{2}, {T}: Put a charge counter on Blue Mana Battery. -{T}, Remove any number of charge counters from Blue Mana Battery: Add {U} to your mana pool, then add an additional {U} to your mana pool for each charge counter removed this way. -LEG U, 4ED R - -Blue Scarab -{W} -Enchantment - Aura -Enchant creature -Enchanted creature can't be blocked by blue creatures. -Enchanted creature gets +2/+2 as long as an opponent controls a blue permanent. -ICE U - -Blue Sun's Zenith -{X}{U}{U}{U} -Instant -Target player draws X cards. Shuffle Blue Sun's Zenith into its owner's library. -MBS R - -Blue Ward -{W} -Enchantment - Aura -Enchant creature -Enchanted creature has protection from blue. This effect doesn't remove Blue Ward. -LEA U, LEB U, 2ED U, 3ED U, 4ED U - -Blunt the Assault -{3}{G} -Instant -You gain 1 life for each creature on the battlefield. Prevent all combat damage that would be dealt this turn. -SOM C - -Blurred Mongoose -{1}{G} -Creature - Mongoose -2/1 -Blurred Mongoose can't be countered. -Shroud (This permanent can't be the target of spells or abilities.) -INV R - -Boa Constrictor -{4}{G} -Creature - Snake -3/3 -{T}: Boa Constrictor gets +3/+3 until end of turn. -MMQ U - -Boar Umbra -{2}{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +3/+3. -Totem armor (If enchanted creature would be destroyed, instead remove all damage from it and destroy this Aura.) -ROE U - -Boartusk Liege -{1}{R/G}{R/G}{R/G} -Creature - Goblin Knight -3/4 -Trample -Other red creatures you control get +1/+1. -Other green creatures you control get +1/+1. -SHM R - -Body Double -{4}{U} -Creature - Shapeshifter -0/0 -You may have Body Double enter the battlefield as a copy of any creature card in a graveyard. -PLC R - -Body Snatcher -{2}{B}{B} -Creature - Minion -2/2 -When Body Snatcher enters the battlefield, exile it unless you discard a creature card. -When Body Snatcher dies, exile Body Snatcher and return target creature card from your graveyard to the battlefield. -UDS R - -Body of Jukai -{7}{G}{G} -Creature - Spirit -8/5 -Trample -Soulshift 8 (When this creature dies, you may return target Spirit card with converted mana cost 8 or less from your graveyard to your hand.) -BOK U - -Bog Down -{2}{B} -Sorcery -Kicker-Sacrifice two lands. (You may sacrifice two lands in addition to any other costs as you cast this spell.) -Target player discards two cards. If Bog Down was kicked, that player discards three cards instead. -PLS C - -Bog Elemental -{3}{B}{B} -Creature - Elemental -5/4 -Protection from white -At the beginning of your upkeep, sacrifice Bog Elemental unless you sacrifice a land. -PCY R - -Bog Glider -{2}{B} -Creature - Human Mercenary -1/1 -Flying -{T}, Sacrifice a land: Search your library for a Mercenary permanent card with converted mana cost 2 or less and put it onto the battlefield. Then shuffle your library. -PCY C - -Bog Gnarr -{4}{G} -Creature - Beast -2/2 -Whenever a player casts a black spell, Bog Gnarr gets +2/+2 until end of turn. -APC C - -Bog Hoodlums -{5}{B} -Creature - Goblin Warrior -4/1 -Bog Hoodlums can't block. -When Bog Hoodlums enters the battlefield, clash with an opponent. If you win, put a +1/+1 counter on Bog Hoodlums. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -LRW C - -Bog Imp -{1}{B} -Creature - Imp -1/1 -Flying (This creature can't be blocked except by creatures with flying or reach.) -DRK C, 4ED C, 5ED C, POR C, 6ED C, S99 C, S00 C, 7ED C, 8ED C, 9ED C - -Bog Initiate -{1}{B} -Creature - Human Wizard -1/1 -{1}: Add {B} to your mana pool. -INV C - -Bog Raiders -{2}{B} -Creature - Zombie -2/2 -Swampwalk (This creature is unblockable as long as defending player controls a Swamp.) -POR C, USG C, S99 C, M11 C - -Bog Rats -{B} -Creature - Rat -1/1 -Bog Rats can't be blocked by Walls. -DRK C, CHR C, 5ED C, 6ED C - -Bog Serpent -{5}{B} -Creature - Serpent -5/5 -Bog Serpent can't attack unless defending player controls a Swamp. -When you control no Swamps, sacrifice Bog Serpent. -PLC C - -Bog Smugglers -{1}{B}{B} -Creature - Human Mercenary -2/2 -Swampwalk -MMQ C - -Bog Tatters -{4}{B} -Creature - Wraith -4/2 -Swampwalk -ZEN C - -Bog Witch -{2}{B} -Creature - Human Spellshaper -1/1 -{B}, {T}, Discard a card: Add {B}{B}{B} to your mana pool. -MMQ C, ARC C - -Bog Wraith -{3}{B} -Creature - Wraith -3/3 -Swampwalk (This creature is unblockable as long as defending player controls a Swamp.) -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, POR U, 6ED U, S99 U, 7ED U, 8ED U, 9ED U, 10E U, M10 U - -Bog Wreckage -Land -Bog Wreckage enters the battlefield tapped. -{T}: Add {B} to your mana pool. -{T}, Sacrifice Bog Wreckage: Add one mana of any color to your mana pool. -ODY C - -Bog-Strider Ash -{3}{G} -Creature - Treefolk Shaman -2/4 -Swampwalk -Whenever a player casts a Goblin spell, you may pay {G}. If you do, you gain 2 life. -LRW C - -Bogardan Firefiend -{2}{R} -Creature - Elemental Spirit -2/1 -When Bogardan Firefiend dies, it deals 2 damage to target creature. -WTH C, 10E C, HOP C - -Bogardan Hellkite -{6}{R}{R} -Creature - Dragon -5/5 -Flash (You may cast this spell any time you could cast an instant.) -Flying -When Bogardan Hellkite enters the battlefield, it deals 5 damage divided as you choose among any number of target creatures and/or players. -TSP R, FVD R, M10 M, DDG M - -Bogardan Lancer -{1}{R} -Creature - Human Knight -1/1 -Bloodthirst 1 (If an opponent was dealt damage this turn, this creature enters the battlefield with a +1/+1 counter on it.) -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -FUT C - -Bogardan Phoenix -{2}{R}{R}{R} -Creature - Phoenix -3/3 -Flying -When Bogardan Phoenix dies, exile it if it had a death counter on it. Otherwise, return it to the battlefield under your control and put a death counter on it. -VIS R - -Bogardan Rager -{5}{R} -Creature - Elemental -3/4 -Flash (You may cast this spell any time you could cast an instant.) -When Bogardan Rager enters the battlefield, target creature gets +4/+0 until end of turn. -TSP C, HOP C, DDG C - -Boggart Arsonists -{2}{R} -Creature - Goblin Rogue -2/1 -Plainswalk -{2}{R}, Sacrifice Boggart Arsonists: Destroy target Scarecrow or Plains. -SHM C - -Boggart Birth Rite -{B} -Tribal Sorcery - Goblin -Return target Goblin card from your graveyard to your hand. -LRW C - -Boggart Forager -{R} -Creature - Goblin Rogue -1/1 -{R}, Sacrifice Boggart Forager: Target player shuffles his or her library. -LRW C - -Boggart Harbinger -{2}{B} -Creature - Goblin Shaman -2/1 -When Boggart Harbinger enters the battlefield, you may search your library for a Goblin card, reveal it, then shuffle your library and put that card on top of it. -LRW U - -Boggart Loggers -{2}{B} -Creature - Goblin Rogue -2/1 -Forestwalk -{2}{B}, Sacrifice Boggart Loggers: Destroy target Treefolk or Forest. -LRW C - -Boggart Mob -{3}{B} -Creature - Goblin Warrior -5/5 -Champion a Goblin (When this enters the battlefield, sacrifice it unless you exile another Goblin you control. When this leaves the battlefield, that card returns to the battlefield.) -Whenever a Goblin you control deals combat damage to a player, you may put a 1/1 black Goblin Rogue creature token onto the battlefield. -LRW R - -Boggart Ram-Gang -{R/G}{R/G}{R/G} -Creature - Goblin Warrior -3/3 -Haste -Wither (This deals damage to creatures in the form of -1/-1 counters.) -SHM U, H10 U - -Boggart Shenanigans -{2}{R} -Tribal Enchantment - Goblin -Whenever another Goblin you control dies, you may have Boggart Shenanigans deal 1 damage to target player. -LRW U, EVG U - -Boggart Sprite-Chaser -{1}{R} -Creature - Goblin Warrior -1/2 -As long as you control a Faerie, Boggart Sprite-Chaser gets +1/+1 and has flying. -LRW C - -Boil -{3}{R} -Instant -Destroy all Islands. -TMP U, 6ED U, 7ED U, 8ED U - -Boiling Blood -{2}{R} -Instant -Target creature attacks this turn if able. -Draw a card. -WTH C - -Boiling Seas -{3}{R} -Sorcery -Destroy all Islands. -POR U, 9ED U - -Bojuka Bog -Land -Bojuka Bog enters the battlefield tapped. -When Bojuka Bog enters the battlefield, exile all cards from target player's graveyard. -{T}: Add {B} to your mana pool. -WWK C, COM C - -Bojuka Brigand -{1}{B} -Creature - Human Warrior Ally -1/1 -Bojuka Brigand can't block. -Whenever Bojuka Brigand or another Ally enters the battlefield under your control, you may put a +1/+1 counter on Bojuka Brigand. -WWK C - -Bola Warrior -{1}{R} -Creature - Human Spellshaper Warrior -1/1 -{R}, {T}, Discard a card: Target creature can't block this turn. -NEM C - -Bold Defense -{2}{W} -Instant -Kicker {3}{W} (You may pay an additional {3}{W} as you cast this spell.) -Creatures you control get +1/+1 until end of turn. If Bold Defense was kicked, instead creatures you control get +2/+2 and gain first strike until end of turn. -ZEN C - -Boldwyr Heavyweights -{2}{R}{R} -Creature - Giant Warrior -8/8 -Trample -When Boldwyr Heavyweights enters the battlefield, each opponent may search his or her library for a creature card and put it onto the battlefield. Then each player who searched his or her library this way shuffles it. -MOR R - -Boldwyr Intimidator -{5}{R}{R} -Creature - Giant Warrior -5/5 -Cowards can't block Warriors. -{R}: Target creature becomes a Coward until end of turn. -{2}{R}: Target creature becomes a Warrior until end of turn. -FUT U, MOR U - -Bomb Squad -{3}{R} -Creature - Dwarf -1/1 -{T}: Put a fuse counter on target creature. -At the beginning of your upkeep, put a fuse counter on each creature with a fuse counter on it. -Whenever a creature has four or more fuse counters on it, remove all fuse counters from it and destroy it. That creature deals 4 damage to its controller. -ODY R - -Bond of Agony -{X}{B} -Sorcery -As an additional cost to cast Bond of Agony, pay X life. -Each other player loses X life. -DIS U - -Bonded Fetch -{2}{U} -Creature - Homunculus -0/2 -Defender, haste -{T}: Draw a card, then discard a card. -FUT U - -Bonds of Quicksilver -{3}{U} -Enchantment - Aura -Flash (You may cast this spell any time you could cast an instant.) -Enchant creature -Enchanted creature doesn't untap during its controller's untap step. -SOM C - -Bone Dancer -{1}{B}{B} -Creature - Zombie -2/2 -Whenever Bone Dancer attacks and isn't blocked, you may put the top creature card of defending player's graveyard onto the battlefield under your control. If you do, Bone Dancer assigns no combat damage this turn. -WTH R - -Bone Flute -{3} -Artifact -{2}, {T}: All creatures get -1/-0 until end of turn. -DRK U, ME3 C - -Bone Harvest -{2}{B} -Instant -Put any number of target creature cards from your graveyard on top of your library. -Draw a card at the beginning of the next turn's upkeep. -MIR C, BTD C - -Bone Mask -{4} -Artifact -{2}, {T}: The next time a source of your choice would deal damage to you this turn, prevent that damage. Exile cards from the top of your library equal to the damage prevented this way. -MIR R - -Bone Saw -{0} -Artifact - Equipment -Equipped creature gets +1/+0. -Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) -CON C - -Bone Shaman -{2}{R}{R} -Creature - Giant Shaman -3/3 -{B}: Until end of turn, Bone Shaman gains "Creatures dealt damage by Bone Shaman this turn can't be regenerated this turn." -ICE C - -Bone Shredder -{2}{B} -Creature - Minion -1/1 -Flying -Echo {2}{B} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -When Bone Shredder enters the battlefield, destroy target nonartifact, nonblack creature. -ULG U, PVC U - -Bone Splinters -{B} -Sorcery -As an additional cost to cast Bone Splinters, sacrifice a creature. -Destroy target creature. -ALA C - -Bonebreaker Giant -{4}{R} -Creature - Giant -4/4 -M12 C - -Bonehoard -{4} -Artifact - Equipment -Living weapon (When this Equipment enters the battlefield, put a 0/0 black Germ creature token onto the battlefield, then attach this to it.) -Equipped creature gets +X/+X, where X is the number of creature cards in all graveyards. -Equip {2} -MBS R - -Boneknitter -{1}{B} -Creature - Zombie Cleric -1/1 -{1}{B}: Regenerate target Zombie. -Morph {2}{B} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS U - -Boneshard Slasher -{1}{B} -Creature - Horror -1/1 -Flying -Threshold - As long as seven or more cards are in your graveyard, Boneshard Slasher gets +2/+2 and has "When Boneshard Slasher becomes the target of a spell or ability, sacrifice it." -TOR U - -Bonesplitter -{1} -Artifact - Equipment -Equipped creature gets +2/+0. -Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.) -MRD C - -Bonesplitter Sliver -{3}{R} -Creature - Sliver -2/2 -All Sliver creatures get +2/+0. -TSP C - -Bonethorn Valesk -{4}{R} -Creature - Beast -4/2 -Whenever a permanent is turned face up, Bonethorn Valesk deals 1 damage to target creature or player. -SCG C - -Booby Trap -{6} -Artifact -As Booby Trap enters the battlefield, name a card other than a basic land card and choose an opponent. -The chosen player reveals each card he or she draws. -When the chosen player draws the named card, sacrifice Booby Trap. If you do, Booby Trap deals 10 damage to that player. -TMP R, 9ED R - -Book Burning -{1}{R} -Sorcery -Any player may have Book Burning deal 6 damage to him or her. If no one does, put the top six cards of target player's library into his or her graveyard. -JUD C - -Book of Rass -{6} -Artifact -{2}, Pay 2 life: Draw a card. -DRK U, CHR R, ME4 U - -Boom -{1}{R} -Sorcery -Destroy target land you control and target land you don't control. ----- -Bust -{5}{R} -Sorcery -Destroy all lands. -PLC R - -Boomerang -{U}{U} -Instant -Return target permanent to its owner's hand. -LEG C, CHR C, MIR C, 5ED C, 6ED C, 7ED C, 8ED C, 9ED C, 10E C, ME3 C - -Boon Reflection -{4}{W} -Enchantment -If you would gain life, you gain twice that much life instead. -SHM R - -Borborygmos -{3}{R}{R}{G}{G} -Legendary Creature - Cyclops -6/7 -Trample -Whenever Borborygmos deals combat damage to a player, put a +1/+1 counter on each creature you control. -GPT R - -Border Guard -{2}{W} -Creature - Human Soldier -1/4 -POR C, S99 C - -Border Patrol -{4}{W} -Creature - Human Nomad -1/6 -Vigilance -JUD C - -Borderland Behemoth -{5}{R}{R} -Creature - Giant Warrior -4/4 -Trample -Borderland Behemoth gets +4/+4 for each other Giant you control. -MOR R - -Borderland Ranger -{2}{G} -Creature - Human Scout -2/2 -When Borderland Ranger enters the battlefield, you may search your library for a basic land card, reveal it, and put it into your hand. If you do, shuffle your library. -M10 C - -Boreal Centaur -{1}{G} -Snow Creature - Centaur Warrior -2/2 -{S}: Boreal Centaur gets +1/+1 until end of turn. Activate this ability only once each turn. ({S} can be paid with one mana from a snow permanent.) -CSP C - -Boreal Druid -{G} -Snow Creature - Elf Druid -1/1 -{T}: Add {1} to your mana pool. -CSP C - -Boreal Griffin -{3}{W}{W} -Snow Creature - Griffin -3/2 -Flying -{S}: Boreal Griffin gains first strike until end of turn. ({S} can be paid with one mana from a snow permanent.) -CSP C - -Boreal Shelf -Snow Land -Boreal Shelf enters the battlefield tapped. -{T}: Add {W} or {U} to your mana pool. -CSP U - -Boris Devilboon -{3}{B}{R} -Legendary Creature - Zombie Wizard -2/2 -{2}{B}{R}, {T}: Put a 1/1 black and red Demon creature token named Minor Demon onto the battlefield. -LEG R, ME3 U - -Boros Fury-Shield -{2}{W} -Instant -Prevent all combat damage that would be dealt by target attacking or blocking creature this turn. If {R} was spent to cast Boros Fury-Shield, it deals damage to that creature's controller equal to the creature's power. -RAV C - -Boros Garrison -Land -Boros Garrison enters the battlefield tapped. -When Boros Garrison enters the battlefield, return a land you control to its owner's hand. -{T}: Add {R}{W} to your mana pool. -RAV C, HOP C, COM C - -Boros Guildmage -{R/W}{R/W} -Creature - Human Wizard -2/2 -{1}{R}: Target creature gains haste until end of turn. -{1}{W}: Target creature gains first strike until end of turn. -RAV U, HOP U, COM U - -Boros Recruit -{R/W} -Creature - Goblin Soldier -1/1 -({R/W} can be paid with either {R} or {W}.) -First strike -RAV C - -Boros Signet -{2} -Artifact -{1}, {T}: Add {R}{W} to your mana pool. -RAV C, HOP C, COM C - -Boros Swiftblade -{R}{W} -Creature - Human Soldier -1/2 -Double strike -RAV U, HOP U - -Borrowing 100,000 Arrows -{2}{U} -Sorcery -Draw a card for each tapped creature target opponent controls. -PTK U, ME3 U - -Borrowing the East Wind -{X}{G}{G} -Sorcery -Borrowing the East Wind deals X damage to each creature with horsemanship and each player. -PTK R - -Boseiju, Who Shelters All -Legendary Land -Boseiju, Who Shelters All enters the battlefield tapped. -{T}, Pay 2 life: Add {1} to your mana pool. If that mana is spent on an instant or sorcery spell, that spell can't be countered by spells or abilities. -CHK R - -Bosh, Iron Golem -{8} -Legendary Artifact Creature - Golem -6/7 -Trample -{3}{R}, Sacrifice an artifact: Bosh, Iron Golem deals damage equal to the sacrificed artifact's converted mana cost to target creature or player. -MRD R, HOP R - -Bosh, Iron Golem Avatar -Vanguard -Hand +0, life -2 -{X}, Sacrifice an artifact with converted mana cost X: Bosh, Iron Golem Avatar deals X damage to target creature or player. -VG S - -Bosium Strip -{3} -Artifact -{3}, {T}: Until end of turn, if the top card of your graveyard is an instant or sorcery card, you may cast that card. If a card cast this way would be put into a graveyard this turn, exile it instead. -WTH R - -Bosk Banneret -{1}{G} -Creature - Treefolk Shaman -1/3 -Treefolk spells and Shaman spells you cast cost {1} less to cast. -MOR C - -Bottle Gnomes -{3} -Artifact Creature - Gnome -1/3 -Sacrifice Bottle Gnomes: You gain 3 life. -TMP U, MRD U, 9ED U, 10E U, JVC U - -Bottle of Suleiman -{4} -Artifact -{1}, Sacrifice Bottle of Suleiman: Flip a coin. If you lose the flip, Bottle of Suleiman deals 5 damage to you. If you win the flip, put a 5/5 colorless Djinn artifact creature token with flying onto the battlefield. -ARN R, 3ED R, 4ED R, 5ED R, 6ED R, ME4 R - -Bottled Cloister -{4} -Artifact -At the beginning of each opponent's upkeep, exile all cards from your hand face down. -At the beginning of your upkeep, return all cards you own exiled with Bottled Cloister to your hand, then draw a card. -RAV R - -Bottomless Pit -{1}{B}{B} -Enchantment -At the beginning of each player's upkeep, that player discards a card at random. -STH U - -Bottomless Vault -Land -Bottomless Vault enters the battlefield tapped. -You may choose not to untap Bottomless Vault during your untap step. -At the beginning of your upkeep, if Bottomless Vault is tapped, put a storage counter on it. -{T}, Remove any number of storage counters from Bottomless Vault: Add {B} to your mana pool for each storage counter removed this way. -FEM R, 5ED R - -Bouncing Beebles -{2}{U} -Creature - Beeble -2/2 -Bouncing Beebles is unblockable as long as defending player controls an artifact. -ULG C - -Bound -{3}{B}{G} -Instant -Sacrifice a creature. Return up to X cards from your graveyard to your hand, where X is the number of colors that creature was. Exile this card. ----- -Determined -{G}{U} -Instant -Other spells you control can't be countered by spells or abilities this turn. -Draw a card. -DIS R - -Bound in Silence -{2}{W} -Tribal Enchantment - Rebel Aura -Enchant creature -Enchanted creature can't attack or block. -FUT U - -Bounteous Kirin -{5}{G}{G} -Legendary Creature - Kirin Spirit -4/4 -Flying -Whenever you cast a Spirit or Arcane spell, you may gain life equal to that spell's converted mana cost. -SOK R - -Bountiful Harvest -{4}{G} -Sorcery -You gain 1 life for each land you control. -M10 C, M12 C - -Bounty Hunter -{2}{B}{B} -Creature - Human Archer Minion -2/2 -{T}: Put a bounty counter on target nonblack creature. -{T}: Destroy target creature with a bounty counter on it. -TMP R - -Bounty of the Hunt -{3}{G}{G} -Instant -You may exile a green card from your hand rather than pay Bounty of the Hunt's mana cost. -Distribute three +1/+1 counters among one, two, or three target creatures. For each +1/+1 counter you put on a creature this way, remove a +1/+1 counter from that creature at the beginning of the next cleanup step. -ALL U, ME2 R - -Brace for Impact -{4}{W} -Instant -Prevent all damage that would be dealt to target multicolored creature this turn. For each 1 damage prevented this way, put a +1/+1 counter on that creature. -DIS U - -Brackwater Elemental -{2}{U} -Creature - Elemental -4/4 -When Brackwater Elemental attacks or blocks, sacrifice it at the beginning of the next end step. -Unearth {2}{U} ({2}{U}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) -CON C - -Braid of Fire -{1}{R} -Enchantment -Cumulative upkeep-Add {R} to your mana pool. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -CSP R - -Braids, Cabal Minion -{2}{B}{B} -Legendary Creature - Human Minion -2/2 -At the beginning of each player's upkeep, that player sacrifices an artifact, creature, or land. -ODY R - -Braids, Conjurer Adept -{2}{U}{U} -Legendary Creature - Human Wizard -2/2 -At the beginning of each player's upkeep, that player may put an artifact, creature, or land card from his or her hand onto the battlefield. -PLC R - -Braids, Conjurer Adept Avatar -Vanguard -Hand +0, life +3 -{2}: Each player may put a land card from his or her hand onto the battlefield tapped. -{3}: Each player may put a noncreature artifact card from his or her hand onto the battlefield. -{4}: Each player may put a creature card from his or her hand onto the battlefield. Activate this ability only any time you could cast a sorcery. -VG S - -Braidwood Cup -{3} -Artifact -{T}: You gain 1 life. -UDS U - -Braidwood Sextant -{1} -Artifact -{2}, {T}, Sacrifice Braidwood Sextant: Search your library for a basic land card, reveal that card, and put it into your hand. Then shuffle your library. -UDS U - -Brain Freeze -{1}{U} -Instant -Target player puts the top three cards of his or her library into his or her graveyard. -Storm (When you cast this spell, copy it for each spell cast before it this turn. You may choose new targets for the copies.) -SCG U - -Brain Gorgers -{3}{B} -Creature - Zombie -4/2 -When you cast Brain Gorgers, any player may sacrifice a creature. If a player does, counter Brain Gorgers. -Madness {1}{B} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -PLC C - -Brain Pry -{1}{B} -Sorcery -Name a nonland card. Target player reveals his or her hand. That player discards a card with that name. If he or she can't, you draw a card. -DIS U - -Brainbite -{2}{U}{B} -Sorcery -Target opponent reveals his or her hand. You choose a card from it. That player discards that card. -Draw a card. -ARB C - -Braingeyser -{X}{U}{U} -Sorcery -Target player draws X cards. -LEA R, LEB R, 2ED R, 3ED R, ME4 R - -Brainspoil -{3}{B}{B} -Sorcery -Destroy target creature that isn't enchanted. It can't be regenerated. -Transmute {1}{B}{B} ({1}{B}{B}, Discard this card: Search your library for a card with the same converted mana cost as this card, reveal it, and put it into your hand. Then shuffle your library. Transmute only as a sorcery.) -RAV C - -Brainstorm -{U} -Instant -Draw three cards, then put two cards from your hand on top of your library in any order. -ICE C, 5ED C, MMQ C, BTD C, ME2 C, COM C - -Brainwash -{W} -Enchantment - Aura -Enchant creature -Enchanted creature can't attack unless its controller pays {3}. -DRK C, 4ED C, 5ED C - -Bramble Creeper -{4}{G} -Creature - Elemental -0/3 -Whenever Bramble Creeper attacks, it gets +5/+0 until end of turn. -M10 C - -Bramble Elemental -{3}{G}{G} -Creature - Elemental -4/4 -Whenever an Aura becomes attached to Bramble Elemental or enters the battlefield attached to Bramble Elemental, put two 1/1 green Saproling creature tokens onto the battlefield. -RAV C - -Bramblesnap -{1}{G} -Creature - Elemental -1/1 -Trample -Tap an untapped creature you control: Bramblesnap gets +1/+1 until end of turn. -ROE U - -Bramblewood Paragon -{1}{G} -Creature - Elf Warrior -2/2 -Each other Warrior creature you control enters the battlefield with an additional +1/+1 counter on it. -Each creature you control with a +1/+1 counter on it has trample. -MOR U - -Branching Bolt -{1}{R}{G} -Instant -Choose one or both - Branching Bolt deals 3 damage to target creature with flying; and/or Branching Bolt deals 3 damage to target creature without flying. -ALA C, HOP C, ARC C - -Branchsnap Lorian -{1}{G}{G} -Creature - Beast -4/1 -Trample -Morph {G} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -LGN U - -Brand -{R} -Instant -Gain control of all permanents you own. (This effect lasts indefinitely.) -Cycling {2} ({2}, Discard this card: Draw a card.) -USG R - -Brand of Ill Omen -{3}{R} -Enchantment - Aura -Enchant creature -Cumulative upkeep {R} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -Enchanted creature's controller can't cast creature spells. -ICE R - -Branded Brawlers -{R} -Creature - Human Soldier -2/2 -Branded Brawlers can't attack if defending player controls an untapped land. -Branded Brawlers can't block if you control an untapped land. -PCY C - -Brass Gnat -{1} -Artifact Creature - Insect -1/1 -Flying -Brass Gnat doesn't untap during your untap step. -At the beginning of your upkeep, you may pay {1}. If you do, untap Brass Gnat. -TSP C - -Brass Herald -{6} -Artifact Creature - Golem -2/2 -As Brass Herald enters the battlefield, choose a creature type. -When Brass Herald enters the battlefield, reveal the top four cards of your library. Put all creature cards of the chosen type revealed this way into your hand and the rest on the bottom of your library in any order. -Creatures of the chosen type get +1/+1. -APC U, 8ED R - -Brass Man -{1} -Artifact Creature - Construct -1/3 -Brass Man doesn't untap during your untap step. -At the beginning of your upkeep, you may pay {1}. If you do, untap Brass Man. -ARN U, 3ED U, 4ED U, ME4 C - -Brass Secretary -{3} -Artifact Creature - Construct -2/1 -{2}, Sacrifice Brass Secretary: Draw a card. -UDS U - -Brass Squire -{3} -Artifact Creature - Myr -1/3 -{T}: Attach target Equipment you control to target creature you control. -MBS U - -Brass-Talon Chimera -{4} -Artifact Creature - Chimera -2/2 -First strike -Sacrifice Brass-Talon Chimera: Put a +2/+2 counter on target Chimera creature. It gains first strike. (This effect lasts indefinitely.) -VIS U - -Brassclaw Orcs -{2}{R} -Creature - Orc -3/2 -Brassclaw Orcs can't block creatures with power 2 or greater. -FEM C (x4), 5ED C, ME2 C - -Bravado -{1}{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+1 for each other creature you control. -USG C - -Brave the Elements -{W} -Instant -Choose a color. White creatures you control gain protection from the chosen color until end of turn. -ZEN U - -Brawl -{3}{R}{R} -Instant -Until end of turn, all creatures gain "{T}: This creature deals damage equal to its power to target creature." -MMQ R - -Brawn -{3}{G} -Creature - Incarnation -3/3 -Trample -As long as Brawn is in your graveyard and you control a Forest, creatures you control have trample. -JUD U, COM U - -Breach -{2}{B} -Instant -Target creature gets +2/+0 and gains fear until end of turn. (It can't be blocked except by artifact creatures and/or black creatures.) -USG C - -Break Asunder -{2}{G}{G} -Sorcery -Destroy target artifact or enchantment. -Cycling {2} ({2}, Discard this card: Draw a card.) -SCG C - -Break Open -{1}{R} -Instant -Turn target face-down creature an opponent controls face up. -ONS C - -Breaking Point -{1}{R}{R} -Sorcery -Any player may have Breaking Point deal 6 damage to him or her. If no one does, destroy all creatures and they can't be regenerated. -JUD R - -Breaking Wave -{2}{U}{U} -Sorcery -You may cast Breaking Wave any time you could cast an instant if you pay {2} more to cast it. -Simultaneously untap all tapped creatures and tap all untapped creatures. -INV R - -Breakthrough -{X}{U} -Sorcery -Draw four cards, then choose X cards in your hand and discard the rest. -TOR U - -Breath of Darigaaz -{1}{R} -Sorcery -Kicker {2} (You may pay an additional {2} as you cast this spell.) -Breath of Darigaaz deals 1 damage to each creature without flying and each player. If Breath of Darigaaz was kicked, it deals 4 damage to each creature without flying and each player instead. -INV U, ARC U, DDG U, COM U - -Breath of Dreams -{2}{U}{U} -Enchantment -Cumulative upkeep {U} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -Green creatures have "Cumulative upkeep {1}." -ICE U - -Breath of Fury -{2}{R}{R} -Enchantment - Aura -Enchant creature you control -When enchanted creature deals combat damage to a player, sacrifice it and attach Breath of Fury to a creature you control. If you do, untap all creatures you control and after this phase, there is an additional combat phase. -RAV R - -Breath of Life -{3}{W} -Sorcery -Return target creature card from your graveyard to the battlefield. -POR C, P02 C, S99 U, S00 U, 7ED U - -Breath of Malfegor -{3}{B}{R} -Instant -Breath of Malfegor deals 5 damage to each opponent. -ARB C - -Breathstealer -{2}{B} -Creature - Nightstalker -2/2 -{B}: Breathstealer gets +1/-1 until end of turn. -MIR C - -Breathstealer's Crypt -{2}{U}{B} -Enchantment -If a player would draw a card, instead he or she draws a card and reveals it. If it's a creature card, that player discards it unless he or she pays 3 life. -VIS R - -Breeding Pit -{3}{B} -Enchantment -At the beginning of your upkeep, sacrifice Breeding Pit unless you pay {B}{B}. -At the beginning of your end step, put a 0/1 black Thrull creature token onto the battlefield. -FEM U, 5ED U, MED U, DVD U - -Breeding Pool -Land - Forest Island -({T}: Add {G} or {U} to your mana pool.) -As Breeding Pool enters the battlefield, you may pay 2 life. If you don't, Breeding Pool enters the battlefield tapped. -DIS R - -Breezekeeper -{3}{U} -Creature - Djinn -4/4 -Flying -Phasing (This phases in or out before you untap during each of your untap steps. While it's phased out, it's treated as though it doesn't exist.) -VIS C - -Briar Patch -{1}{G}{G} -Enchantment -Whenever a creature attacks you, it gets -1/-0 until end of turn. -MMQ U - -Briar Shield -{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+1. -Sacrifice Briar Shield: Enchanted creature gets +3/+3 until end of turn. -WTH C - -Briarberry Cohort -{1}{U} -Creature - Faerie Soldier -1/1 -Flying -Briarberry Cohort gets +1/+1 as long as you control another blue creature. -SHM C - -Briarhorn -{3}{G} -Creature - Elemental -3/3 -Flash -When Briarhorn enters the battlefield, target creature gets +3/+3 until end of turn. -Evoke {1}{G} (You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield.) -LRW U, HOP U - -Briarknit Kami -{3}{G}{G} -Creature - Spirit -3/3 -Whenever you cast a Spirit or Arcane spell, put a +1/+1 counter on target creature. -SOK U - -Bribery -{3}{U}{U} -Sorcery -Search target opponent's library for a creature card and put that card onto the battlefield under your control. Then that player shuffles his or her library. -MMQ R, 8ED R - -Bridge from Below -{B}{B}{B} -Enchantment -Whenever a nontoken creature is put into your graveyard from the battlefield, if Bridge from Below is in your graveyard, put a 2/2 black Zombie creature token onto the battlefield. -When a creature is put into an opponent's graveyard from the battlefield, if Bridge from Below is in your graveyard, exile Bridge from Below. -FUT R - -Brightflame -{X}{R}{R}{W}{W} -Sorcery -Radiance - Brightflame deals X damage to target creature and each other creature that shares a color with it. You gain life equal to the damage dealt this way. -RAV R - -Brighthearth Banneret -{1}{R} -Creature - Elemental Warrior -1/1 -Elemental spells and Warrior spells you cast cost {1} less to cast. -Reinforce 1-{1}{R} ({1}{R}, Discard this card: Put a +1/+1 counter on target creature.) -MOR C - -Brightstone Ritual -{R} -Instant -Add {R} to your mana pool for each Goblin on the battlefield. -ONS C - -Brigid, Hero of Kinsbaile -{2}{W}{W} -Legendary Creature - Kithkin Archer -2/3 -First strike -{T}: Brigid, Hero of Kinsbaile deals 2 damage to each attacking or blocking creature target player controls. -LRW R - -Brilliant Halo -{1}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+2. -When Brilliant Halo is put into a graveyard from the battlefield, return Brilliant Halo to its owner's hand. -USG C - -Brilliant Plan -{4}{U} -Sorcery -Draw three cards. -PTK U, ME3 C - -Brilliant Ultimatum -{W}{W}{U}{U}{U}{B}{B} -Sorcery -Exile the top five cards of your library. An opponent separates those cards into two piles. You may play any number of cards from one of those piles without paying their mana costs. -ALA R - -Brimstone Dragon -{6}{R}{R} -Creature - Dragon -6/6 -Flying, haste -P02 R, ME2 R - -Brimstone Mage -{2}{R} -Creature - Human Shaman -2/2 -Level up {3}{R} ({3}{R}: Put a level counter on this. Level up only as a sorcery.) -LEVEL 1-2 -2/3 -{T}: Brimstone Mage deals 1 damage to target creature or player. -LEVEL 3+ -2/4 -{T}: Brimstone Mage deals 3 damage to target creature or player. -ROE U - -Brindle Boar -{2}{G} -Creature - Boar -2/2 -Sacrifice Brindle Boar: You gain 4 life. -M11 C, M12 C - -Brine Elemental -{4}{U}{U} -Creature - Elemental -5/4 -Morph {5}{U}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Brine Elemental is turned face up, each opponent skips his or her next untap step. -TSP U, JVC U - -Brine Hag -{2}{U}{U} -Creature - Hag -2/2 -When Brine Hag dies, all creatures that dealt damage to it this turn become 0/2. (This effect lasts indefinitely.) -LEG U - -Brine Seer -{3}{U} -Creature - Human Wizard -1/1 -{2}{U}, {T}: Reveal any number of blue cards in your hand. Counter target spell unless its controller pays {1} for each card revealed this way. -UDS U - -Brine Shaman -{1}{B} -Creature - Human Cleric Shaman -1/1 -{T}, Sacrifice a creature: Target creature gets +2/+2 until end of turn. -{1}{U}{U}, Sacrifice a creature: Counter target creature spell. -ICE C, ME2 C - -Bringer of the Black Dawn -{7}{B}{B} -Creature - Bringer -5/5 -You may pay {W}{U}{B}{R}{G} rather than pay Bringer of the Black Dawn's mana cost. -Trample -At the beginning of your upkeep, you may pay 2 life. If you do, search your library for a card, then shuffle your library and put that card on top of it. -5DN R - -Bringer of the Blue Dawn -{7}{U}{U} -Creature - Bringer -5/5 -You may pay {W}{U}{B}{R}{G} rather than pay Bringer of the Blue Dawn's mana cost. -Trample -At the beginning of your upkeep, you may draw two cards. -5DN R - -Bringer of the Green Dawn -{7}{G}{G} -Creature - Bringer -5/5 -You may pay {W}{U}{B}{R}{G} rather than pay Bringer of the Green Dawn's mana cost. -Trample -At the beginning of your upkeep, you may put a 3/3 green Beast creature token onto the battlefield. -5DN R - -Bringer of the Red Dawn -{7}{R}{R} -Creature - Bringer -5/5 -You may pay {W}{U}{B}{R}{G} rather than pay Bringer of the Red Dawn's mana cost. -Trample -At the beginning of your upkeep, you may untap target creature and gain control of it until end of turn. That creature gains haste until end of turn. -5DN R - -Bringer of the White Dawn -{7}{W}{W} -Creature - Bringer -5/5 -You may pay {W}{U}{B}{R}{G} rather than pay Bringer of the White Dawn's mana cost. -Trample -At the beginning of your upkeep, you may return target artifact card from your graveyard to the battlefield. -5DN R - -Brink of Disaster -{2}{B}{B} -Enchantment - Aura -Enchant creature or land -When enchanted permanent becomes tapped, destroy it. -WWK C, M12 C - -Brink of Madness -{2}{B}{B} -Enchantment -At the beginning of your upkeep, if you have no cards in hand, sacrifice Brink of Madness and target opponent discards his or her hand. -ULG R - -Brion Stoutarm -{2}{R}{W} -Legendary Creature - Giant Warrior -4/4 -Lifelink -{R}, {T}, Sacrifice a creature other than Brion Stoutarm: Brion Stoutarm deals damage equal to the sacrificed creature's power to target player. -LRW R, COM R - -Brittle Effigy -{1} -Artifact -{4}, {T}, Exile Brittle Effigy: Exile target creature. -M11 R - -Broken Ambitions -{X}{U} -Instant -Counter target spell unless its controller pays {X}. Clash with an opponent. If you win, that spell's controller puts the top four cards of his or her library into his or her graveyard. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -LRW C - -Broken Dam -{U} -Sorcery -Tap one or two target creatures without horsemanship. -PTK C - -Broken Fall -{2}{G} -Enchantment -Return Broken Fall to its owner's hand: Regenerate target creature. -TMP C, BRB C - -Broken Visage -{4}{B} -Instant -Destroy target nonartifact attacking creature. It can't be regenerated. Put a black Spirit creature token with that creature's power and toughness onto the battlefield. Sacrifice the token at the beginning of the next end step. -HML R, 5ED R, ME2 U - -Brontotherium -{4}{G}{G} -Creature - Beast -5/3 -Trample -Provoke (When this attacks, you may have target creature defending player controls untap and block it if able.) -LGN U - -Bronze Bombshell -{4} -Artifact Creature - Construct -4/1 -When a player other than Bronze Bombshell's owner controls it, that player sacrifices it. If the player does, Bronze Bombshell deals 7 damage to him or her. -DIS R - -Bronze Horse -{7} -Artifact Creature - Horse -4/4 -Trample -As long as you control another creature, prevent all damage that would be dealt to Bronze Horse by spells that target it. -LEG R, CHR R, ME4 U - -Bronze Tablet -{6} -Artifact -Remove Bronze Tablet from your deck before playing if you're not playing for ante. -Bronze Tablet enters the battlefield tapped. -{4}, {T}: Exile Bronze Tablet and target nontoken permanent an opponent owns. That player may pay 10 life. If he or she does, put Bronze Tablet into its owner's graveyard. Otherwise, that player owns Bronze Tablet and you own the other exiled card. -ATQ R, 4ED R - -Brood Birthing -{1}{R} -Sorcery -If you control an Eldrazi Spawn, put three 0/1 colorless Eldrazi Spawn creature tokens onto the battlefield. They have "Sacrifice this creature: Add {1} to your mana pool." Otherwise, put one of those tokens onto the battlefield. -ROE C - -Brood Sliver -{4}{G} -Creature - Sliver -3/3 -Whenever a Sliver deals combat damage to a player, its controller may put a 1/1 colorless Sliver creature token onto the battlefield. -LGN R, H09 R - -Brood of Cockroaches -{1}{B} -Creature - Insect -1/1 -When Brood of Cockroaches is put into your graveyard from the battlefield, at the beginning of the next end step, you lose 1 life and return Brood of Cockroaches to your hand. -VIS U - -Broodhatch Nantuko -{1}{G} -Creature - Insect Druid -1/1 -Whenever Broodhatch Nantuko is dealt damage, you may put that many 1/1 green Insect creature tokens onto the battlefield. -Morph {2}{G} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS U - -Brooding Saurian -{2}{G}{G} -Creature - Lizard -4/4 -At the beginning of each end step, each player gains control of all nontoken permanents he or she owns. -CSP R - -Broodmate Dragon -{3}{B}{R}{G} -Creature - Dragon -4/4 -Flying -When Broodmate Dragon enters the battlefield, put a 4/4 red Dragon creature token with flying onto the battlefield. -ALA R - -Broodstar -{8}{U}{U} -Creature - Beast -*/* -Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -Flying -Broodstar's power and toughness are each equal to the number of artifacts you control. -MRD R, HOP R - -Broodwarden -{3}{G}{G} -Creature - Eldrazi Drone -4/4 -Eldrazi Spawn creatures you control get +2/+1. -ROE U - -Brothers Yamazaki -{2}{R} -Legendary Creature - Human Samurai -2/1 -Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -If there are exactly two permanents named Brothers Yamazaki on the battlefield, the "legend rule" doesn't apply to them. -Each other creature named Brothers Yamazaki gets +2/+2 and has haste. -CHK U (x2) - -Brothers of Fire -{1}{R}{R} -Creature - Human Shaman -2/2 -{1}{R}{R}: Brothers of Fire deals 1 damage to target creature or player and 1 damage to you. -DRK U, 4ED C, 5ED C, MED C - -Browbeat -{2}{R} -Sorcery -Any player may have Browbeat deal 5 damage to him or her. If no one does, target player draws three cards. -JUD U, TSB S, HOP U, H10 U - -Brown Ouphe -{G} -Creature - Ouphe -1/1 -{1}{G}, {T}: Counter target activated ability from an artifact source. (Mana abilities can't be targeted.) -ICE C, MRD U - -Browse -{2}{U}{U} -Enchantment -{2}{U}{U}: Look at the top five cards of your library, put one of them into your hand, and exile the rest. -ALL U, 6ED U, ME2 U - -Brush with Death -{2}{B} -Sorcery -Buyback {2}{B}{B} (You may pay an additional {2}{B}{B} as you cast this spell. If you do, put this card into your hand as it resolves.) -Target opponent loses 2 life. You gain 2 life. -STH C - -Brushland -Land -{T}: Add {1} to your mana pool. -{T}: Add {G} or {W} to your mana pool. Brushland deals 1 damage to you. -ICE R, 5ED R, 6ED R, 7ED R, 9ED R, 10E R - -Brushwagg -{1}{G}{G} -Creature - Brushwagg -3/2 -Whenever Brushwagg blocks or becomes blocked, it gets -2/+2 until end of turn. -MIR R - -Brutal Deceiver -{2}{R} -Creature - Spirit -2/2 -{1}: Look at the top card of your library. -{2}: Reveal the top card of your library. If it's a land card, Brutal Deceiver gets +1/+0 and gains first strike until end of turn. Activate this ability only once each turn. -CHK C - -Brutal Nightstalker -{3}{B}{B} -Creature - Nightstalker -3/2 -When Brutal Nightstalker enters the battlefield, you may have target opponent discard a card. -P02 U - -Brutal Suppression -{R} -Enchantment -Activated abilities of nontoken Rebels cost an additional "Sacrifice a land" to activate. -PCY U - -Brutalizer Exarch -{5}{G} -Creature - Cleric -3/3 -When Brutalizer Exarch enters the battlefield, choose one - Search your library for a creature card, reveal it, then shuffle your library and put that card on top of it; or put target noncreature permanent on the bottom of its owner's library. -NPH U - -Brute Force -{R} -Instant -Target creature gets +3/+3 until end of turn. -PLC C - -Bubble Matrix -{4} -Artifact -Prevent all damage that would be dealt to creatures. -WTH R - -Bubbling Beebles -{4}{U} -Creature - Beeble -3/3 -Bubbling Beebles is unblockable as long as defending player controls an enchantment. -UDS C - -Bubbling Muck -{B} -Sorcery -Until end of turn, whenever a player taps a Swamp for mana, that player adds {B} to his or her mana pool (in addition to the mana the land produces). -UDS C - -Budoka Gardener -{1}{G} -Creature - Human Monk -2/1 -{T}: You may put a land card from your hand onto the battlefield. If you control ten or more lands, flip Budoka Gardener. ----- -Dokai, Weaver of Life -Legendary Creature - Human Monk -3/3 -{4}{G}{G}, {T}: Put an X/X green Elemental creature token onto the battlefield, where X is the number of lands you control. -CHK R - -Budoka Pupil -{1}{G}{G} -Creature - Human Monk -2/2 -Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Budoka Pupil. -At the beginning of the end step, if there are two or more ki counters on Budoka Pupil, you may flip it. ----- -Ichiga, Who Topples Oaks -Legendary Creature - Spirit -4/3 -Trample -Remove a ki counter from Ichiga, Who Topples Oaks: Target creature gets +2/+2 until end of turn. -BOK U - -Builder's Bane -{X}{X}{R} -Sorcery -Destroy X target artifacts. Builder's Bane deals damage to each player equal to the number of artifacts he or she controlled destroyed this way. -MIR C - -Bull Aurochs -{1}{G} -Creature - Aurochs -2/1 -Trample -Whenever Bull Aurochs attacks, it gets +1/+0 until end of turn for each other attacking Aurochs. -CSP C - -Bull Cerodon -{4}{R}{W} -Creature - Beast -5/5 -Vigilance, haste -ALA U, HOP U - -Bull Elephant -{3}{G} -Creature - Elephant -4/4 -When Bull Elephant enters the battlefield, sacrifice it unless you return two Forests you control to their owner's hand. -VIS C - -Bull Hippo -{3}{G} -Creature - Hippo -3/3 -Islandwalk -POR U, USG U, S99 U, 7ED U - -Bull Rush -{R} -Instant -Target creature gets +2/+0 until end of turn. -WWK C - -Bullwhip -{4} -Artifact -{2}, {T}: Bullwhip deals 1 damage to target creature. That creature attacks this turn if able. -STH U - -Bulwark -{3}{R}{R} -Enchantment -At the beginning of your upkeep, Bulwark deals X damage to target opponent, where X is the number of cards in your hand minus the number of cards in that player's hand. -USG R - -Buoyancy -{1}{U} -Enchantment - Aura -Flash -Enchant creature -Enchanted creature has flying. -MMQ C - -Burden of Greed -{3}{B} -Instant -Target player loses 1 life for each tapped artifact he or she controls. -DST C - -Burgeoning -{G} -Enchantment -Whenever an opponent plays a land, you may put a land card from your hand onto the battlefield. -STH R - -Buried Alive -{2}{B} -Sorcery -Search your library for up to three creature cards and put them into your graveyard. Then shuffle your library. -WTH U, ODY U, COM U - -Buried Ruin -Land -{T}: Add {1} to your mana pool. -{2}, {T}, Sacrifice Buried Ruin: Return target artifact card from your graveyard to your hand. -M12 U - -Burn Trail -{3}{R} -Sorcery -Burn Trail deals 3 damage to target creature or player. -Conspire (As you cast this spell, you may tap two untapped creatures you control that share a color with it. When you do, copy it and you may choose a new target for the copy.) -SHM C - -Burn the Impure -{1}{R} -Instant -Burn the Impure deals 3 damage to target creature. If that creature has infect, Burn the Impure deals 3 damage to that creature's controller. -MBS C - -Burning Cloak -{R} -Sorcery -Target creature gets +2/+0 until end of turn. Burning Cloak deals 2 damage to that creature. -POR C - -Burning Fields -{4}{R} -Sorcery -Burning Fields deals 5 damage to target opponent. -PTK C - -Burning Inquiry -{R} -Sorcery -Each player draws three cards, then discards three cards at random. -M10 C - -Burning Palm Efreet -{2}{R}{R} -Creature - Efreet -2/2 -{1}{R}{R}: Burning Palm Efreet deals 2 damage to target creature with flying and that creature loses flying until end of turn. -MIR U - -Burning Sands -{3}{R}{R} -Enchantment -Whenever a creature dies, that creature's controller sacrifices a land. -ODY R - -Burning Shield Askari -{2}{R} -Creature - Human Knight -2/2 -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -{R}{R}: Burning Shield Askari gains first strike until end of turn. -MIR C - -Burning Wish -{1}{R} -Sorcery -You may choose a sorcery card you own from outside the game, reveal that card, and put it into your hand. Exile Burning Wish. -JUD R - -Burning of Xinye -{4}{R}{R} -Sorcery -You destroy four lands you control, then target opponent destroys four lands he or she controls. Then Burning of Xinye deals 4 damage to each creature. -PTK R, ME3 R - -Burning-Eye Zubera -{2}{R}{R} -Creature - Zubera Spirit -3/3 -When Burning-Eye Zubera dies, if 4 or more damage was dealt to it this turn, Burning-Eye Zubera deals 3 damage to target creature or player. -SOK U - -Burning-Tree Bloodscale -{2}{R}{G} -Creature - Viashino Berserker -2/2 -Bloodthirst 1 (If an opponent was dealt damage this turn, this creature enters the battlefield with a +1/+1 counter on it.) -{2}{R}: Target creature can't block Burning-Tree Bloodscale this turn. -{2}{G}: Target creature blocks Burning-Tree Bloodscale this turn if able. -GPT C - -Burning-Tree Shaman -{1}{R}{G} -Creature - Centaur Shaman -3/4 -Whenever a player activates an ability that isn't a mana ability, Burning-Tree Shaman deals 1 damage to that player. -GPT R - -Burnout -{1}{R} -Instant -Counter target instant spell if it's blue. -Draw a card at the beginning of the next turn's upkeep. -ALL U, ME2 U - -Burnt Offering -{B} -Instant -As an additional cost to cast Burnt Offering, sacrifice a creature. -Add X mana in any combination of {B} and/or {R} to your mana pool, where X is the sacrificed creature's converted mana cost. -ICE C - -Burr Grafter -{3}{G} -Creature - Spirit -2/2 -Sacrifice Burr Grafter: Target creature gets +2/+2 until end of turn. -Soulshift 3 (When this creature dies, you may return target Spirit card with converted mana cost 3 or less from your graveyard to your hand.) -CHK C - -Burrenton Bombardier -{2}{W} -Creature - Kithkin Soldier -2/2 -Flying -Reinforce 2-{2}{W} ({2}{W}, Discard this card: Put two +1/+1 counters on target creature.) -MOR C, EVT C - -Burrenton Forge-Tender -{W} -Creature - Kithkin Wizard -1/1 -Protection from red -Sacrifice Burrenton Forge-Tender: Prevent all damage a red source of your choice would deal this turn. -LRW U - -Burrenton Shield-Bearers -{4}{W} -Creature - Kithkin Soldier -3/3 -Whenever Burrenton Shield-Bearers attacks, target creature gets +0/+3 until end of turn. -MOR C - -Burrowing -{R} -Enchantment - Aura -Enchant creature -Enchanted creature has mountainwalk. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 6ED U - -Burst Lightning -{R} -Instant -Kicker {4} (You may pay an additional {4} as you cast this spell.) -Burst Lightning deals 2 damage to target creature or player. If Burst Lightning was kicked, it deals 4 damage to that creature or player instead. -ZEN C - -Burst of Energy -{W} -Instant -Untap target permanent. -ULG C - -Burst of Speed -{R} -Sorcery -Creatures you control gain haste until end of turn. (They can attack and {T} even if they just came under your control.) -M10 C - -Bushi Tenderfoot -{W} -Creature - Human Soldier -1/1 -When a creature dealt damage by Bushi Tenderfoot this turn dies, flip Bushi Tenderfoot. ----- -Kenzo the Hardhearted -Legendary Creature - Human Samurai -3/4 -Double strike; bushido 2 (When this blocks or becomes blocked, it gets +2/+2 until end of turn.) -CHK U - -Butcher Orgg -{4}{R}{R}{R} -Creature - Orgg -6/6 -You may assign Butcher Orgg's combat damage divided as you choose among defending player and/or any number of creatures he or she controls. -ONS R - -Butcher of Malakir -{5}{B}{B} -Creature - Vampire Warrior -5/4 -Flying -Whenever Butcher of Malakir or another creature you control dies, each opponent sacrifices a creature. -WWK R, COM R - -Cabal Archon -{2}{B} -Creature - Human Cleric -2/2 -{B}, Sacrifice a Cleric: Target player loses 2 life and you gain 2 life. -ONS U - -Cabal Coffers -Land -{2}, {T}: Add {B} to your mana pool for each Swamp you control. -TOR U, HOP U - -Cabal Conditioning -{6}{B} -Sorcery -Any number of target players each discard a number of cards equal to the highest converted mana cost among permanents you control. -SCG R - -Cabal Executioner -{2}{B}{B} -Creature - Human Cleric -2/2 -Whenever Cabal Executioner deals combat damage to a player, that player sacrifices a creature. -Morph {3}{B}{B} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS U - -Cabal Inquisitor -{1}{B} -Creature - Human Minion -1/1 -Threshold - {1}{B}, {T}, Exile two cards from your graveyard: Target player discards a card. Activate this ability only any time you could cast a sorcery, and only if seven or more cards are in your graveyard. -ODY C - -Cabal Interrogator -{1}{B} -Creature - Zombie Wizard -1/1 -{X}{B}, {T}: Target player reveals X cards from his or her hand and you choose one of them. That player discards that card. Activate this ability only any time you could cast a sorcery. -SCG U - -Cabal Patriarch -{3}{B}{B}{B} -Legendary Creature - Human Wizard -5/5 -{2}{B}, Sacrifice a creature: Target creature gets -2/-2 until end of turn. -{2}{B}, Exile a creature card from your graveyard: Target creature gets -2/-2 until end of turn. -ODY R - -Cabal Pit -Land -{T}: Add {B} to your mana pool. Cabal Pit deals 1 damage to you. -Threshold - {B}, {T}, Sacrifice Cabal Pit: Target creature gets -2/-2 until end of turn. Activate this ability only if seven or more cards are in your graveyard. -ODY U - -Cabal Ritual -{1}{B} -Instant -Add {B}{B}{B} to your mana pool. -Threshold - Add {B}{B}{B}{B}{B} to your mana pool instead if seven or more cards are in your graveyard. -TOR C - -Cabal Shrine -{1}{B}{B} -Enchantment -Whenever a player casts a spell, that player discards X cards, where X is the number of cards in all graveyards with the same name as that spell. -ODY R - -Cabal Slaver -{2}{B} -Creature - Human Cleric -2/1 -Whenever a Goblin deals combat damage to a player, that player discards a card. -ONS U - -Cabal Surgeon -{2}{B}{B} -Creature - Human Minion -2/1 -{2}{B}{B}, {T}, Exile two cards from your graveyard: Return target creature card from your graveyard to your hand. -TOR C - -Cabal Therapy -{B} -Sorcery -Name a nonland card. Target player reveals his or her hand and discards all cards with that name. -Flashback-Sacrifice a creature. (You may cast this card from your graveyard for its flashback cost. Then exile it.) -JUD U - -Cabal Torturer -{1}{B}{B} -Creature - Human Minion -1/1 -{B}, {T}: Target creature gets -1/-1 until end of turn. -Threshold - {3}{B}{B}, {T}: Target creature gets -2/-2 until end of turn. Activate this ability only if seven or more cards are in your graveyard. -TOR C - -Cabal Trainee -{B} -Creature - Human Minion -1/1 -Sacrifice Cabal Trainee: Target creature gets -2/-0 until end of turn. -JUD C - -Cache Raiders -{3}{U}{U} -Creature - Merfolk Rogue -4/4 -At the beginning of your upkeep, return a permanent you control to its owner's hand. -EVE U - -Cackling Fiend -{2}{B}{B} -Creature - Zombie -2/1 -When Cackling Fiend enters the battlefield, each opponent discards a card. -USG C, BRB C - -Cackling Flames -{3}{R} -Instant -Cackling Flames deals 3 damage to target creature or player. -Hellbent - Cackling Flames deals 5 damage to that creature or player instead if you have no cards in hand. -DIS C - -Cackling Imp -{2}{B}{B} -Creature - Imp -2/2 -Flying -{T}: Target player loses 1 life. -5DN C, DVD C - -Cackling Witch -{1}{B} -Creature - Human Spellshaper -1/1 -{X}{B}, {T}, Discard a card: Target creature gets +X/+0 until end of turn. -MMQ U - -Cadaver Imp -{1}{B}{B} -Creature - Imp -1/1 -Flying -When Cadaver Imp enters the battlefield, you may return target creature card from your graveyard to your hand. -ROE C - -Cadaverous Bloom -{3}{B}{G} -Enchantment -Exile a card from your hand: Add {B}{B} or {G}{G} to your mana pool. -MIR R - -Cadaverous Knight -{2}{B} -Creature - Zombie Knight -2/2 -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -{1}{B}{B}: Regenerate Cadaverous Knight. -MIR C, HOP C - -Cage of Hands -{2}{W} -Enchantment - Aura -Enchant creature -Enchanted creature can't attack or block. -{1}{W}: Return Cage of Hands to its owner's hand. -CHK C - -Caged Sun -{6} -Artifact -As Caged Sun enters the battlefield, choose a color. -Creatures you control of the chosen color get +1/+1. -Whenever a land's ability adds one or more mana of the chosen color to your mana pool, add one additional mana of that color to your mana pool. -NPH R - -Cagemail -{1}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2 and can't attack. -JUD C - -Cairn Wanderer -{4}{B} -Creature - Shapeshifter -4/4 -Changeling (This card is every creature type at all times.) -As long as a creature card with flying is in a graveyard, Cairn Wanderer has flying. The same is true for fear, first strike, double strike, deathtouch, haste, landwalk, lifelink, protection, reach, trample, shroud, and vigilance. -LRW R - -Calciderm -{2}{W}{W} -Creature - Beast -5/5 -Shroud (This permanent can't be the target of spells or abilities.) -Vanishing 4 (This permanent enters the battlefield with four time counters on it. At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.) -PLC U - -Calciform Pools -Land -{T}: Add {1} to your mana pool. -{1}, {T}: Put a storage counter on Calciform Pools. -{1}, Remove X storage counters from Calciform Pools: Add X mana in any combination of {W} and/or {U} to your mana pool. -TSP U - -Calcite Snapper -{1}{U}{U} -Creature - Turtle -1/4 -Shroud (This creature can't be the target of spells or abilities.) -Landfall - Whenever a land enters the battlefield under your control, you may switch Calcite Snapper's power and toughness until end of turn. -WWK C - -Caldera Hellion -{3}{R}{R} -Creature - Hellion -3/3 -Devour 1 (As this enters the battlefield, you may sacrifice any number of creatures. This creature enters the battlefield with that many +1/+1 counters on it.) -When Caldera Hellion enters the battlefield, it deals 3 damage to each creature. -ALA R - -Caldera Kavu -{2}{R} -Creature - Kavu -2/2 -{1}{B}: Caldera Kavu gets +1/+1 until end of turn. -{G}: Caldera Kavu becomes the color of your choice until end of turn. -PLS C - -Caldera Lake -Land -Caldera Lake enters the battlefield tapped. -{T}: Add {1} to your mana pool. -{T}: Add {U} or {R} to your mana pool. Caldera Lake deals 1 damage to you. -TMP R - -Call for Blood -{4}{B} -Instant - Arcane -As an additional cost to cast Call for Blood, sacrifice a creature. -Target creature gets -X/-X until end of turn, where X is the sacrificed creature's power. -BOK C - -Call from the Grave -{2}{B} -Sorcery -Choose a player at random. Choose a creature card in that player's graveyard at random and put it onto the battlefield under your control. Call from the Grave deals damage equal to that creature card's converted mana cost to you. -ASTRAL S - -Call of the Herd -{2}{G} -Sorcery -Put a 3/3 green Elephant creature token onto the battlefield. -Flashback {3}{G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY R, TSB S - -Call of the Wild -{2}{G}{G} -Enchantment -{2}{G}{G}: Reveal the top card of your library. If it's a creature card, put it onto the battlefield. Otherwise, put it into your graveyard. -WTH R, 6ED R, 8ED R - -Call the Skybreaker -{5}{U/R}{U/R} -Sorcery -Put a 5/5 blue and red Elemental creature token with flying onto the battlefield. -Retrace (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) -EVE R, COM R - -Call to Arms -{1}{W} -Enchantment -As Call to Arms enters the battlefield, choose a color and an opponent. -White creatures get +1/+1 as long as the chosen color is the most common color among nontoken permanents the chosen player controls but isn't tied for most common. -When the chosen color isn't the most common color among nontoken permanents the chosen player controls or is tied for most common, sacrifice Call to Arms. -ICE R, ME3 U - -Call to Glory -{1}{W} -Instant -Untap all creatures you control. Samurai creatures you control get +1/+1 until end of turn. -CHK C - -Call to Heel -{1}{U} -Instant -Return target creature to its owner's hand. Its controller draws a card. -ALA C - -Call to Mind -{2}{U} -Sorcery -Return target instant or sorcery card from your graveyard to your hand. -M11 U - -Call to the Grave -{4}{B} -Enchantment -At the beginning of each player's upkeep, that player sacrifices a non-Zombie creature. -At the beginning of the end step, if no creatures are on the battlefield, sacrifice Call to the Grave. -SCG R, M12 R - -Call to the Netherworld -{B} -Sorcery -Return target black creature card from your graveyard to your hand. -Madness {0} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -TSP C - -Caller of Gales -{U} -Creature - Merfolk Wizard -1/1 -{1}{U}, {T}: Target creature gains flying until end of turn. -ZEN C - -Caller of the Claw -{2}{G} -Creature - Elf -2/2 -Flash -When Caller of the Claw enters the battlefield, put a 2/2 green Bear creature token onto the battlefield for each nontoken creature put into your graveyard from the battlefield this turn. -LGN R - -Caller of the Hunt -{2}{G} -Creature - Human -*/* -As an additional cost to cast Caller of the Hunt, choose a creature type. -Caller of the Hunt's power and toughness are each equal to the number of creatures of the chosen type on the battlefield. -MMQ R - -Callous Deceiver -{2}{U} -Creature - Spirit -1/3 -{1}: Look at the top card of your library. -{2}: Reveal the top card of your library. If it's a land card, Callous Deceiver gets +1/+0 and gains flying until end of turn. Activate this ability only once each turn. -CHK C - -Callous Giant -{4}{R}{R} -Creature - Giant -4/4 -If a source would deal 3 or less damage to Callous Giant, prevent that damage. -INV R - -Callous Oppressor -{1}{U}{U} -Creature - Cephalid -1/2 -You may choose not to untap Callous Oppressor during your untap step. -As Callous Oppressor enters the battlefield, an opponent chooses a creature type. -{T}: Gain control of target creature that isn't of the chosen type for as long as Callous Oppressor remains tapped. -ONS R - -Callow Jushi -{1}{U}{U} -Creature - Human Wizard -2/2 -Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Callow Jushi. -At the beginning of the end step, if there are two or more ki counters on Callow Jushi, you may flip it. ----- -Jaraku the Interloper -Legendary Creature - Spirit -3/4 -Remove a ki counter from Jaraku the Interloper: Counter target spell unless its controller pays {2}. -BOK U - -Calming Licid -{2}{W} -Creature - Licid -2/2 -{W}, {T}: Calming Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {W} to end this effect. -Enchanted creature can't attack. -STH U - -Calming Verse -{3}{G} -Sorcery -Destroy all enchantments you don't control. Then, if you control an untapped land, destroy all enchantments you control. -PCY C - -Caltrops -{3} -Artifact -Whenever a creature attacks, Caltrops deals 1 damage to it. -UDS U, 7ED U - -Camato Scout -{1}{U}{U} -Creature - Merfolk Scout -2/3 -When Camato Scout enters the battlefield, it gains landwalk of a basic land type chosen at random. (This effect lasts indefinitely.) -SDC S - -Camel -{W} -Creature - Camel -0/1 -Banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -Prevent all damage that would be dealt to Camel or to creatures banded with Camel by Deserts. -ARN C - -Camouflage -{G} -Instant -Cast Camouflage only during your declare attackers step. -This turn, instead of declaring blockers, each defending player chooses any number of creatures he or she controls and divides them into a number of piles equal to the number of attacking creatures for whom that player is the defending player. Creatures he or she controls that can block additional creatures may likewise be put into additional piles. Assign each pile to a different one of those attacking creatures at random. Each creature in a pile that can block the creature that pile is assigned to does so. (Piles can be empty.) -LEA U, LEB U, 2ED U - -Cancel -{1}{U}{U} -Instant -Counter target spell. -TSP C, 10E C, ALA C, M10 C, ZEN C, M11 C, M12 C - -Candelabra of Tawnos -{1} -Artifact -{X}, {T}: Untap X target lands. -ATQ R, ME4 R - -Candles of Leng -{2} -Artifact -{4}, {T}: Reveal the top card of your library. If it has the same name as a card in your graveyard, put it into your graveyard. Otherwise, draw a card. -TSP R - -Candles' Glow -{1}{W} -Instant - Arcane -Prevent the next 3 damage that would be dealt to target creature or player this turn. You gain life equal to the damage prevented this way. -Splice onto Arcane {1}{W} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -CHK U - -Canker Abomination -{2}{B/G}{B/G} -Creature - Treefolk Horror -6/6 -As Canker Abomination enters the battlefield, choose an opponent. Canker Abomination enters the battlefield with a -1/-1 counter on it for each creature that player controls. -EVE U - -Cankerous Thirst -{3}{B/G} -Instant -If {B} was spent to cast Cankerous Thirst, you may have target creature get -3/-3 until end of turn. If {G} was spent to cast Cankerous Thirst, you may have target creature get +3/+3 until end of turn. (Do both if {B}{G} was spent.) -EVE U - -Cannibalize -{1}{B} -Sorcery -Choose two target creatures controlled by the same player. Exile one of those creatures and put two +1/+1 counters on the other. -STH C - -Canopy Claws -{G} -Instant -Target creature loses flying until end of turn. -Flashback {G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -JUD C - -Canopy Cover -{1}{G} -Enchantment - Aura -Enchant creature -Enchanted creature can't be blocked except by creatures with flying or reach. -Enchanted creature can't be the target of spells or abilities your opponents control. -WWK U - -Canopy Crawler -{3}{G} -Creature - Beast -2/2 -Amplify 1 (As this creature enters the battlefield, put a +1/+1 counter on it for each Beast card you reveal in your hand.) -{T}: Target creature gets +1/+1 until end of turn for each +1/+1 counter on Canopy Crawler. -LGN U - -Canopy Dragon -{4}{G}{G} -Creature - Dragon -4/4 -Trample -{1}{G}: Canopy Dragon gains flying and loses trample until end of turn. -MIR R - -Canopy Spider -{1}{G} -Creature - Spider -1/3 -Reach (This creature can block creatures with flying.) -TMP C, 7ED C, 8ED C, 10E C - -Canopy Surge -{1}{G} -Sorcery -Kicker {2} (You may pay an additional {2} as you cast this spell.) -Canopy Surge deals 1 damage to each creature with flying and each player. If Canopy Surge was kicked, it deals 4 damage to each creature with flying and each player instead. -INV U - -Cantivore -{1}{W}{W} -Creature - Lhurgoyf -*/* -Vigilance -Cantivore's power and toughness are each equal to the number of enchantment cards in all graveyards. -ODY R - -Canyon Drake -{2}{R}{R} -Creature - Drake -1/2 -Flying -{1}, Discard a card at random: Canyon Drake gets +2/+0 until end of turn. -TMP R - -Canyon Minotaur -{3}{R} -Creature - Minotaur Warrior -3/3 -CON C, M10 C, M11 C - -Canyon Wildcat -{1}{R} -Creature - Cat -2/1 -Mountainwalk -TMP C, 8ED C - -Cao Cao, Lord of Wei -{3}{B}{B} -Legendary Creature - Human Soldier -3/3 -{T}: Target opponent discards two cards. Activate this ability only during your turn, before attackers are declared. -PTK R - -Cao Ren, Wei Commander -{2}{B}{B} -Legendary Creature - Human Soldier Warrior -3/3 -Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -When Cao Ren, Wei Commander enters the battlefield, you lose 3 life. -PTK R - -Capashen Knight -{1}{W} -Creature - Human Knight -1/1 -First strike -{1}{W}: Capashen Knight gets +1/+0 until end of turn. -UDS C - -Capashen Standard -{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+1. -{2}, Sacrifice Capashen Standard: Draw a card. -UDS C - -Capashen Templar -{2}{W} -Creature - Human Knight -2/2 -{W}: Capashen Templar gets +0/+1 until end of turn. -UDS C - -Capashen Unicorn -{1}{W} -Creature - Unicorn -1/2 -{1}{W}, {T}, Sacrifice Capashen Unicorn: Destroy target artifact or enchantment. -INV C - -Capricious Efreet -{4}{R}{R} -Creature - Efreet -6/4 -At the beginning of your upkeep, choose target nonland permanent you control and up to two target nonland permanents you don't control. Destroy one of them at random. -M10 R - -Capricious Sorcerer -{2}{U} -Creature - Human Wizard -1/1 -{T}: Capricious Sorcerer deals 1 damage to target creature or player. Activate this ability only during your turn, before attackers are declared. -POR R - -Capsize -{1}{U}{U} -Instant -Buyback {3} (You may pay an additional {3} as you cast this spell. If you do, put this card into your hand as it resolves.) -Return target permanent to its owner's hand. -TMP C - -Captain Sisay -{2}{G}{W} -Legendary Creature - Human Soldier -2/2 -{T}: Search your library for a legendary card, reveal that card, and put it into your hand. Then shuffle your library. -INV R - -Captain of the Watch -{4}{W}{W} -Creature - Human Soldier -3/3 -Vigilance (Attacking doesn't cause this creature to tap.) -Other Soldier creatures you control get +1/+1 and have vigilance. -When Captain of the Watch enters the battlefield, put three 1/1 white Soldier creature tokens onto the battlefield. -M10 R - -Captain's Maneuver -{X}{R}{W} -Instant -The next X damage that would be dealt to target creature or player this turn is dealt to another target creature or player instead. -APC U, HOP U - -Captivating Glance -{2}{U} -Enchantment - Aura -Enchant creature -At the beginning of your end step, clash with an opponent. If you win, gain control of enchanted creature. Otherwise, that player gains control of enchanted creature. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -LRW U - -Captivating Vampire -{1}{B}{B} -Creature - Vampire -2/2 -Other Vampire creatures you control get +1/+1. -Tap five untapped Vampires you control: Gain control of target creature. It becomes a Vampire in addition to its other types. -M11 R - -Captive Flame -{2}{R} -Enchantment -{R}: Target creature gets +1/+0 until end of turn. -SOK U, DDG U - -Capture of Jingzhou -{3}{U}{U} -Sorcery -Take an extra turn after this one. -PTK R, ME3 R - -Captured Sunlight -{2}{G}{W} -Sorcery -Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.) -You gain 4 life. -ARB C - -Carapace -{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +0/+2. -Sacrifice Carapace: Regenerate enchanted creature. -HML C (x2), 5ED C, ME2 C - -Carapace Forger -{1}{G} -Creature - Elf Artificer -2/2 -Metalcraft - Carapace Forger gets +2/+2 as long as you control three or more artifacts. -SOM C - -Caravan Escort -{W} -Creature - Human Knight -1/1 -Level up {2} ({2}: Put a level counter on this. Level up only as a sorcery.) -LEVEL 1-4 -2/2 -LEVEL 5+ -5/5 -First strike -ROE C, DDG C - -Caravan Hurda -{4}{W} -Creature - Giant -1/5 -Lifelink (Damage dealt by this creature also causes you to gain that much life.) -ZEN C - -Carbonize -{2}{R} -Instant -Carbonize deals 3 damage to target creature or player. That creature can't be regenerated this turn. If the creature would die this turn, exile it instead. -SCG U - -Careful Consideration -{2}{U}{U} -Instant -Target player draws four cards, then discards three cards. If you cast this spell during your main phase, instead that player draws four cards, then discards two cards. -TSP U - -Careful Study -{U} -Sorcery -Draw two cards, then discard two cards. -ODY C - -Caregiver -{W} -Creature - Human Cleric -1/1 -{W}, Sacrifice a creature: Prevent the next 1 damage that would be dealt to target creature or player this turn. -RAV C - -Caress of Phyrexia -{3}{B}{B} -Sorcery -Target player draws three cards, loses 3 life, and gets three poison counters. -NPH U - -Caribou Range -{2}{W}{W} -Enchantment - Aura -Enchant land you control -Enchanted land has "{W}{W}, {T}: Put a 0/1 white Caribou creature token onto the battlefield." -Sacrifice a Caribou token: You gain 1 life. -ICE R, 5ED R, ME2 R - -Carnage Altar -{2} -Artifact -{3}, Sacrifice a creature: Draw a card. -ZEN U - -Carnage Wurm -{6}{G} -Creature - Wurm -6/6 -Bloodthirst 3 (If an opponent was dealt damage this turn, this creature enters the battlefield with three +1/+1 counters on it.) -Trample (If this creature would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.) -M12 U - -Carnassid -{4}{G}{G} -Creature - Beast -5/4 -Trample -{1}{G}: Regenerate Carnassid. -STH R - -Carnifex Demon -{4}{B}{B} -Creature - Demon -6/6 -Flying -Carnifex Demon enters the battlefield with two -1/-1 counters on it. -{B}, Remove a -1/-1 counter from Carnifex Demon: Put a -1/-1 counter on each other creature. -SOM R - -Carnival of Souls -{1}{B} -Enchantment -Whenever a creature enters the battlefield, you lose 1 life and add {B} to your mana pool. -UDS R - -Carnivorous Plant -{3}{G} -Creature - Plant Wall -4/5 -Defender -DRK C, 4ED C, MED U - -Carnophage -{B} -Creature - Zombie -2/2 -At the beginning of your upkeep, tap Carnophage unless you pay 1 life. -EXO C - -Carom -{1}{W} -Instant -The next 1 damage that would be dealt to target creature this turn is dealt to another target creature instead. -Draw a card. -DIS C - -Carpet of Flowers -{G} -Enchantment -At the beginning of each of your main phases, if you haven't added mana to your mana pool with this ability this turn, you may add up to X mana of any one color to your mana pool, where X is the number of Islands target opponent controls. -USG U - -Carrier Pigeons -{3}{W} -Creature - Bird -1/1 -Flying -When Carrier Pigeons enters the battlefield, draw a card at the beginning of the next turn's upkeep. -ALL C (x2) - -Carrion -{1}{B}{B} -Instant -As an additional cost to cast Carrion, sacrifice a creature. -Put X 0/1 black Insect creature tokens onto the battlefield, where X is the sacrificed creature's power. -MIR R - -Carrion Ants -{2}{B}{B} -Creature - Insect -0/1 -{1}: Carrion Ants gets +1/+1 until end of turn. -LEG R, 4ED U, 5ED U, ME3 U - -Carrion Beetles -{B} -Creature - Insect -1/1 -{2}{B}, {T}: Exile up to three target cards from a single graveyard. -USG C - -Carrion Call -{3}{G} -Instant -Put two 1/1 green Insect creature tokens with infect onto the battlefield. (They deal damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -SOM U - -Carrion Feeder -{B} -Creature - Zombie -1/1 -Carrion Feeder can't block. -Sacrifice a creature: Put a +1/+1 counter on Carrion Feeder. -SCG C, PVC C - -Carrion Howler -{3}{B} -Creature - Zombie Wolf -2/2 -Pay 1 life: Carrion Howler gets +2/-1 until end of turn. -RAV U - -Carrion Rats -{B} -Creature - Rat -2/1 -Whenever Carrion Rats attacks or blocks, any player may exile a card from his or her graveyard. If a player does, Carrion Rats assigns no combat damage this turn. -TOR C - -Carrion Thrash -{2}{B}{R}{G} -Creature - Viashino Warrior -4/4 -When Carrion Thrash dies, you may pay {2}. If you do, return another target creature card from your graveyard to your hand. -ALA C - -Carrion Wall -{1}{B}{B} -Creature - Wall -3/2 -Defender (This creature can't attack.) -{1}{B}: Regenerate Carrion Wall. -NEM U, 8ED U - -Carrion Wurm -{3}{B}{B} -Creature - Zombie Wurm -6/5 -Whenever Carrion Wurm attacks or blocks, any player may exile three cards from his or her graveyard. If a player does, Carrion Wurm assigns no combat damage this turn. -TOR U - -Carrionette -{1}{B} -Creature - Skeleton -1/1 -{2}{B}{B}: Exile Carrionette and target creature unless that creature's controller pays {2}. Activate this ability only if Carrionette is in your graveyard. -TMP R - -Carry Away -{U}{U} -Enchantment - Aura -Enchant Equipment -When Carry Away enters the battlefield, unattach enchanted Equipment. -You control enchanted Equipment. -DST U - -Cartographer -{2}{G} -Creature - Human -2/2 -When Cartographer enters the battlefield, you may return target land card from your graveyard to your hand. -EXO U, ODY C - -Carven Caryatid -{1}{G}{G} -Creature - Spirit -2/5 -Defender (This creature can't attack.) -When Carven Caryatid enters the battlefield, draw a card. -RAV U - -Cascade Bluffs -Land -{T}: Add {1} to your mana pool. -{U/R}, {T}: Add {U}{U}, {U}{R}, or {R}{R} to your mana pool. -EVE R - -Cast Through Time -{4}{U}{U}{U} -Enchantment -Instant and sorcery spells you control have rebound. (Exile the spell as it resolves if you cast it from your hand. At the beginning of your next upkeep, you may cast that card from exile without paying its mana cost.) -ROE M - -Castigate -{W}{B} -Sorcery -Target opponent reveals his or her hand. You choose a nonland card from it and exile that card. -GPT C - -Casting of Bones -{2}{B} -Enchantment - Aura -Enchant creature -When enchanted creature dies, draw three cards, then discard one of them. -ALL C (x2) - -Castle -{3}{W} -Enchantment -Untapped creatures you control get +0/+2. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, 6ED U, 7ED U - -Castle Raptors -{4}{W} -Creature - Bird Soldier -3/3 -Flying -As long as Castle Raptors is untapped, it gets +0/+2. -TSP C - -Castle Sengir -Land -{T}: Add {1} to your mana pool. -{1}, {T}: Add {B} to your mana pool. -{2}, {T}: Add {U} or {R} to your mana pool. -HML U - -Cat Burglar -{3}{B} -Creature - Kor Rogue Minion -2/2 -{2}{B}, {T}: Target player discards a card. Activate this ability only any time you could cast a sorcery. -EXO C - -Cat Warriors -{1}{G}{G} -Creature - Cat Warrior -2/2 -Forestwalk -LEG C, CHR C, 5ED C, 6ED C - -Cataclysm -{2}{W}{W} -Sorcery -Each player chooses from the permanents he or she controls an artifact, a creature, an enchantment, and a land, then sacrifices the rest. -EXO R - -Catacomb Dragon -{4}{B}{B} -Creature - Dragon -4/4 -Flying -Whenever Catacomb Dragon becomes blocked by a nonartifact, non-Dragon creature, that creature gets -X/-0 until end of turn, where X is half the creature's power, rounded down. -MIR R - -Catalog -{2}{U} -Instant -Draw two cards, then discard a card. -USG C, 8ED C - -Catalyst Stone -{2} -Artifact -Flashback costs you pay cost up to {2} less. -Flashback costs your opponents pay cost {2} more. -ODY R - -Catapult Master -{3}{W}{W} -Creature - Human Soldier -3/3 -Tap five untapped Soldiers you control: Exile target creature. -ONS R, EVT R - -Catapult Squad -{1}{W} -Creature - Human Soldier -2/1 -Tap two untapped Soldiers you control: Catapult Squad deals 2 damage to target attacking or blocking creature. -ONS U - -Catastrophe -{4}{W}{W} -Sorcery -Destroy all lands or all creatures. Creatures destroyed this way can't be regenerated. -USG R, BRB R - -Cateran Brute -{2}{B} -Creature - Horror Mercenary -2/2 -{2}, {T}: Search your library for a Mercenary permanent card with converted mana cost 2 or less and put it onto the battlefield. Then shuffle your library. -MMQ C - -Cateran Enforcer -{3}{B}{B} -Creature - Horror Mercenary -4/3 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -{4}, {T}: Search your library for a Mercenary permanent card with converted mana cost 4 or less and put it onto the battlefield. Then shuffle your library. -MMQ U - -Cateran Kidnappers -{2}{B}{B} -Creature - Human Mercenary -4/2 -{3}, {T}: Search your library for a Mercenary permanent card with converted mana cost 3 or less and put it onto the battlefield. Then shuffle your library. -MMQ U - -Cateran Overlord -{4}{B}{B}{B} -Creature - Horror Mercenary -7/5 -Sacrifice a creature: Regenerate Cateran Overlord. -{6}, {T}: Search your library for a Mercenary permanent card with converted mana cost 6 or less and put it onto the battlefield. Then shuffle your library. -MMQ R - -Cateran Persuader -{B}{B} -Creature - Human Mercenary -2/1 -{1}, {T}: Search your library for a Mercenary permanent card with converted mana cost 1 or less and put it onto the battlefield. Then shuffle your library. -MMQ C - -Cateran Slaver -{4}{B}{B} -Creature - Horror Mercenary -5/5 -Swampwalk -{5}, {T}: Search your library for a Mercenary permanent card with converted mana cost 5 or less and put it onto the battlefield. Then shuffle your library. -MMQ R - -Cateran Summons -{B} -Sorcery -Search your library for a Mercenary card, reveal that card, and put it into your hand. Then shuffle your library. -MMQ U - -Caterwauling Boggart -{3}{R} -Creature - Goblin Shaman -2/2 -Each Goblin you control can't be blocked except by two or more creatures. -Each Elemental you control can't be blocked except by two or more creatures. -LRW C - -Cathartic Adept -{U} -Creature - Human Wizard -1/1 -{T}: Target player puts the top card of his or her library into his or her graveyard. -ALA C - -Cathedral Membrane -{1}{W/P} -Artifact Creature - Wall -0/3 -({W/P} can be paid with either {W} or 2 life.) -Defender -When Cathedral Membrane dies during combat, it deals 6 damage to each creature it blocked this combat. -NPH U - -Cathedral of Serra -Land -White legendary creatures you control have "bands with other legendary creatures." (Any legendary creatures can attack in a band as long as at least one has "bands with other legendary creatures." Bands are blocked as a group. If at least two legendary creatures you control, one of which has "bands with other legendary creatures," are blocking or being blocked by the same creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -LEG U - -Cathodion -{3} -Artifact Creature - Construct -3/3 -When Cathodion dies, add {3} to your mana pool. -USG U, MRD U - -Cauldron Dance -{4}{B}{R} -Instant -Cast Cauldron Dance only during combat. -Return target creature card from your graveyard to the battlefield. That creature gains haste. Return it to your hand at the beginning of the next end step. -You may put a creature card from your hand onto the battlefield. That creature gains haste. Its controller sacrifices it at the beginning of the next end step. -INV U - -Cauldron Haze -{1}{W/B} -Instant -Choose any number of target creatures. Each of those creatures gains persist until end of turn. (When it dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) -EVE U - -Cauldron of Souls -{5} -Artifact -{T}: Choose any number of target creatures. Each of those creatures gains persist until end of turn. (When it dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) -SHM R - -Caustic Crawler -{3}{B}{B} -Creature - Insect -4/3 -Landfall - Whenever a land enters the battlefield under your control, you may have target creature get -1/-1 until end of turn. -WWK U - -Caustic Hound -{5}{B} -Creature - Hound -4/4 -When Caustic Hound dies, each player loses 4 life. -MBS C - -Caustic Rain -{2}{B}{B} -Sorcery -Exile target land. -GPT U - -Caustic Tar -{4}{B}{B} -Enchantment - Aura -Enchant land -Enchanted land has "{T}: Target player loses 3 life." -ODY U - -Caustic Wasps -{2}{G} -Creature - Insect -1/1 -Flying -Whenever Caustic Wasps deals combat damage to a player, you may destroy target artifact that player controls. -MMQ U - -Cautery Sliver -{R}{W} -Creature - Sliver -2/2 -All Slivers have "{1}, Sacrifice this permanent: This permanent deals 1 damage to target creature or player." -All Slivers have "{1}, Sacrifice this permanent: Prevent the next 1 damage that would be dealt to target Sliver creature or player this turn." -PLC U - -Cavalry Master -{2}{W}{W} -Creature - Human Knight -3/3 -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -Other creatures you control with flanking have flanking. (Each instance of flanking triggers separately.) -TSP U - -Cave People -{1}{R}{R} -Creature - Human -1/4 -Whenever Cave People attacks, it gets +1/-2 until end of turn. -{1}{R}{R}, {T}: Target creature gains mountainwalk until end of turn. -DRK U, 4ED U, 5ED U - -Cave Sense -{1}{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+1 and has mountainwalk. -MMQ C - -Cave Tiger -{2}{G} -Creature - Cat -2/2 -Whenever Cave Tiger becomes blocked by a creature, Cave Tiger gets +1/+1 until end of turn. -USG C - -Cave-In -{3}{R}{R} -Sorcery -You may exile a red card from your hand rather than pay Cave-In's mana cost. -Cave-In deals 2 damage to each creature and each player. -MMQ R - -Cavern Crawler -{2}{R} -Creature - Insect -0/3 -Mountainwalk -{R}: Cavern Crawler gets +1/-1 until end of turn. -MMQ C - -Cavern Harpy -{U}{B} -Creature - Harpy Beast -2/1 -Flying -When Cavern Harpy enters the battlefield, return a blue or black creature you control to its owner's hand. -Pay 1 life: Return Cavern Harpy to its owner's hand. -PLS C - -Cavern Thoctar -{5}{G} -Creature - Beast -5/5 -{1}{R}: Cavern Thoctar gets +1/+0 until end of turn. -ALA C - -Caverns of Despair -{2}{R}{R} -World Enchantment -No more than two creatures can attack each combat. -No more than two creatures can block each combat. -LEG R - -Caves of Koilos -Land -{T}: Add {1} to your mana pool. -{T}: Add {W} or {B} to your mana pool. Caves of Koilos deals 1 damage to you. -APC R, 9ED R, 10E R - -Cease-Fire -{2}{W} -Instant -Target player can't cast creature spells this turn. -Draw a card. -ODY C - -Ceaseless Searblades -{3}{R} -Creature - Elemental Warrior -2/4 -Whenever you activate an ability of an Elemental, Ceaseless Searblades gets +1/+0 until end of turn. -LRW U - -Celestial Ancient -{3}{W}{W} -Creature - Elemental -3/3 -Flying -Whenever you cast an enchantment spell, put a +1/+1 counter on each creature you control. -DIS R - -Celestial Colonnade -Land -Celestial Colonnade enters the battlefield tapped. -{T}: Add {W} or {U} to your mana pool. -{3}{W}{U}: Until end of turn, Celestial Colonnade becomes a 4/4 white and blue Elemental creature with flying and vigilance. It's still a land. -WWK R - -Celestial Convergence -{2}{W}{W} -Enchantment -Celestial Convergence enters the battlefield with seven omen counters on it. -At the beginning of your upkeep, remove an omen counter from Celestial Convergence. If there are no omen counters on Celestial Convergence, the player with the highest life total wins the game. If two or more players are tied for highest life total, the game is a draw. -PCY R - -Celestial Crusader -{2}{W}{W} -Creature - Spirit -2/2 -Flash (You may cast this spell any time you could cast an instant.) -Split second (As long as this spell is on the stack, players can't cast spells or activate abilities that aren't mana abilities.) -Flying -Other white creatures get +1/+1. -TSP U, EVT U - -Celestial Dawn -{1}{W}{W} -Enchantment -Lands you control are Plains. -Nonland cards you own that aren't on the battlefield, spells you control, and nonland permanents you control are white. -You may spend white mana as though it were mana of any color. You may spend other mana only as though it were colorless mana. -MIR R, 6ED R, TSB S - -Celestial Force -{5}{W}{W}{W} -Creature - Elemental -7/7 -At the beginning of each upkeep, you gain 3 life. -COM R - -Celestial Gatekeeper -{3}{W}{W} -Creature - Bird Cleric -2/2 -Flying -When Celestial Gatekeeper dies, exile it, then return up to two target Bird and/or Cleric permanent cards from your graveyard to the battlefield. -LGN R - -Celestial Kirin -{2}{W}{W} -Legendary Creature - Kirin Spirit -3/3 -Flying -Whenever you cast a Spirit or Arcane spell, destroy all permanents with that spell's converted mana cost. -SOK R - -Celestial Mantle -{3}{W}{W}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +3/+3. -Whenever enchanted creature deals combat damage to a player, double its controller's life total. -ZEN R - -Celestial Prism -{3} -Artifact -{2}, {T}: Add one mana of any color to your mana pool. -LEA U, LEB U, 2ED U, 3ED U, 4ED U - -Celestial Purge -{1}{W} -Instant -Exile target black or red permanent. -CON U, M10 U, M11 U, M12 U - -Celestial Sword -{6} -Artifact -{3}, {T}: Target creature you control gets +3/+3 until end of turn. Its controller sacrifices it at the beginning of the next end step. -ICE R, ME4 U - -Celestine Reef -Plane - Luvion -Creatures without flying or islandwalk can't attack. -Whenever you roll {C}, until a player planeswalks, you can't lose the game and your opponents can't win the game. -HOP P - -Cemetery Gate -{2}{B} -Creature - Wall -0/5 -Defender (This creature can't attack.) -Protection from black -HML C (x2) - -Cemetery Puca -{1}{U/B}{U/B} -Creature - Shapeshifter -1/2 -Whenever a creature dies, you may pay {1}. If you do, Cemetery Puca becomes a copy of that creature and gains this ability. -SHM R - -Cemetery Reaper -{1}{B}{B} -Creature - Zombie -2/2 -Other Zombie creatures you control get +1/+1. -{2}{B}, {T}: Exile target creature card from a graveyard. Put a 2/2 black Zombie creature token onto the battlefield. -M10 R, ARC R, M12 R - -Cenn's Enlistment -{3}{W} -Sorcery -Put two 1/1 white Kithkin Soldier creature tokens onto the battlefield. -Retrace (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) -EVE C - -Cenn's Heir -{1}{W} -Creature - Kithkin Soldier -1/1 -Whenever Cenn's Heir attacks, it gets +1/+1 until end of turn for each other attacking Kithkin. -LRW C - -Cenn's Tactician -{W} -Creature - Kithkin Soldier -1/1 -{W}, {T}: Put a +1/+1 counter on target Soldier creature. -Each creature you control with a +1/+1 counter on it can block an additional creature. -MOR U - -Centaur Archer -{1}{R}{G} -Creature - Centaur Archer -3/2 -{T}: Centaur Archer deals 1 damage to target creature with flying. -ICE U, MED U - -Centaur Chieftain -{3}{G} -Creature - Centaur -3/3 -Haste -Threshold - As long as seven or more cards are in your graveyard, Centaur Chieftain has "When Centaur Chieftain enters the battlefield, creatures you control get +1/+1 and gain trample until end of turn." -TOR U - -Centaur Courser -{2}{G} -Creature - Centaur Warrior -3/3 -M10 C - -Centaur Garden -Land -{T}: Add {G} to your mana pool. Centaur Garden deals 1 damage to you. -Threshold - {G}, {T}, Sacrifice Centaur Garden: Target creature gets +3/+3 until end of turn. Activate this ability only if seven or more cards are in your graveyard. -ODY U - -Centaur Glade -{3}{G}{G} -Enchantment -{2}{G}{G}: Put a 3/3 green Centaur creature token onto the battlefield. -ONS U - -Centaur Omenreader -{3}{G} -Snow Creature - Centaur Shaman -3/3 -As long as Centaur Omenreader is tapped, creature spells you cast cost {2} less to cast. -FUT U - -Centaur Rootcaster -{3}{G} -Creature - Centaur Druid -2/2 -Whenever Centaur Rootcaster deals combat damage to a player, you may search your library for a basic land card and put that card onto the battlefield tapped. If you do, shuffle your library. -JUD C - -Centaur Safeguard -{2}{G/W} -Creature - Centaur Warrior -3/1 -({G/W} can be paid with either {G} or {W}.) -When Centaur Safeguard dies, you may gain 3 life. -RAV C - -Centaur Veteran -{5}{G} -Creature - Centaur -3/3 -Trample -{G}, Discard a card: Regenerate Centaur Veteran. -TOR C - -Cephalid Aristocrat -{4}{U} -Creature - Cephalid -3/3 -Whenever Cephalid Aristocrat becomes the target of a spell or ability, put the top two cards of your library into your graveyard. -TOR C - -Cephalid Broker -{3}{U} -Creature - Cephalid -2/2 -{T}: Target player draws two cards, then discards two cards. -ODY U - -Cephalid Coliseum -Land -{T}: Add {U} to your mana pool. Cephalid Coliseum deals 1 damage to you. -Threshold - {U}, {T}, Sacrifice Cephalid Coliseum: Target player draws three cards, then discards three cards. Activate this ability only if seven or more cards are in your graveyard. -ODY U - -Cephalid Constable -{1}{U}{U} -Creature - Cephalid Wizard -1/1 -Whenever Cephalid Constable deals combat damage to a player, return up to that many target permanents that player controls to their owners' hands. -JUD R, 10E R - -Cephalid Illusionist -{1}{U} -Creature - Cephalid Wizard -1/1 -Whenever Cephalid Illusionist becomes the target of a spell or ability, put the top three cards of your library into your graveyard. -{2}{U}, {T}: Prevent all combat damage that would be dealt to and dealt by target creature you control this turn. -TOR U - -Cephalid Inkshrouder -{2}{U} -Creature - Cephalid -2/1 -Discard a card: Cephalid Inkshrouder gains shroud until end of turn and is unblockable this turn. (A permanent with shroud can't be the target of spells or abilities.) -JUD U - -Cephalid Looter -{2}{U} -Creature - Cephalid Rogue -2/1 -{T}: Target player draws a card, then discards a card. -ODY C - -Cephalid Pathmage -{2}{U} -Creature - Cephalid Wizard -1/2 -Cephalid Pathmage is unblockable. -{T}, Sacrifice Cephalid Pathmage: Target creature is unblockable this turn. -LGN C - -Cephalid Retainer -{2}{U}{U} -Creature - Cephalid -2/3 -{U}{U}: Tap target creature without flying. -ODY R - -Cephalid Sage -{3}{U} -Creature - Cephalid -2/3 -Threshold - As long as seven or more cards are in your graveyard, Cephalid Sage has "When Cephalid Sage enters the battlefield, draw three cards, then discard two cards." -TOR U - -Cephalid Scout -{1}{U} -Creature - Cephalid Wizard Scout -1/1 -Flying -{2}{U}, Sacrifice a land: Draw a card. -ODY C - -Cephalid Shrine -{1}{U}{U} -Enchantment -Whenever a player casts a spell, counter that spell unless that player pays {X}, where X is the number of cards in all graveyards with the same name as the spell. -ODY R - -Cephalid Snitch -{1}{U} -Creature - Cephalid Wizard -1/1 -Sacrifice Cephalid Snitch: Target creature loses protection from black until end of turn. -TOR C - -Cephalid Vandal -{1}{U} -Creature - Cephalid Rogue -1/1 -At the beginning of your upkeep, put a shred counter on Cephalid Vandal. Then put the top card of your library into your graveyard for each shred counter on Cephalid Vandal. -TOR R - -Cerebral Eruption -{2}{R}{R} -Sorcery -Target opponent reveals the top card of his or her library. Cerebral Eruption deals damage equal to the revealed card's converted mana cost to that player and each creature he or she controls. If a land card is revealed this way, return Cerebral Eruption to its owner's hand. -SOM R - -Cerebral Vortex -{1}{U}{R} -Instant -Target player draws two cards, then Cerebral Vortex deals damage to that player equal to the number of cards he or she has drawn this turn. -GPT R - -Ceremonial Guard -{2}{R} -Creature - Human Soldier -3/4 -When Ceremonial Guard attacks or blocks, destroy it at end of combat. -MMQ C - -Cerodon Yearling -{R}{W} -Creature - Beast -2/2 -Vigilance, haste -ARB C, HOP C - -Cerulean Sphinx -{4}{U}{U} -Creature - Sphinx -5/5 -Flying -{U}: Cerulean Sphinx's owner shuffles it into his or her library. -RAV R - -Cerulean Wisps -{U} -Instant -Target creature becomes blue until end of turn. Untap that creature. -Draw a card. -SHM C - -Cerulean Wyvern -{4}{U} -Creature - Drake -3/3 -Flying, protection from green -MIR U - -Cessation -{2}{W} -Enchantment - Aura -Enchant creature -Enchanted creature can't attack. -When Cessation is put into a graveyard from the battlefield, return Cessation to its owner's hand. -ULG C - -Ceta Disciple -{U} -Creature - Merfolk Wizard -1/1 -{R}, {T}: Target creature gets +2/+0 until end of turn. -{G}, {T}: Add one mana of any color to your mana pool. -APC C - -Ceta Sanctuary -{2}{U} -Enchantment -At the beginning of your upkeep, if you control a red or green permanent, draw a card, then discard a card. If you control a red permanent and a green permanent, instead draw two cards, then discard a card. -APC U - -Cetavolver -{1}{U} -Creature - Volver -1/1 -Kicker {1}{R} and/or {G} (You may pay an additional {1}{R} and/or {G} as you cast this spell.) -If Cetavolver was kicked with its {1}{R} kicker, it enters the battlefield with two +1/+1 counters on it and with first strike. -If Cetavolver was kicked with its {G} kicker, it enters the battlefield with a +1/+1 counter on it and with trample. -APC R - -Chain Lightning -{R} -Sorcery -Chain Lightning deals 3 damage to target creature or player. Then that player or that creature's controller may pay {R}{R}. If the player does, he or she may copy this spell and may choose a new target for that copy. -LEG C, ME3 C, H10 C - -Chain Reaction -{2}{R}{R} -Sorcery -Chain Reaction deals X damage to each creature, where X is the number of creatures on the battlefield. -WWK R, COM R - -Chain Stasis -{U} -Instant -You may tap or untap target creature. Then that creature's controller may pay {2}{U}. If the player does, he or she may copy this spell and may choose a new target for that copy. -HML R - -Chain of Acid -{3}{G} -Sorcery -Destroy target noncreature permanent. Then that permanent's controller may copy this spell and may choose a new target for that copy. -ONS U - -Chain of Plasma -{1}{R} -Instant -Chain of Plasma deals 3 damage to target creature or player. Then that player or that creature's controller may discard a card. If the player does, he or she may copy this spell and may choose a new target for that copy. -ONS U - -Chain of Silence -{1}{W} -Instant -Prevent all damage target creature would deal this turn. That creature's controller may sacrifice a land. If the player does, he or she may copy this spell and may choose a new target for that copy. -ONS U - -Chain of Smog -{1}{B} -Sorcery -Target player discards two cards. That player may copy this spell and may choose a new target for that copy. -ONS U - -Chain of Vapor -{U} -Instant -Return target nonland permanent to its owner's hand. Then that permanent's controller may sacrifice a land. If the player does, he or she may copy this spell and may choose a new target for that copy. -ONS U - -Chainbreaker -{2} -Artifact Creature - Scarecrow -3/3 -Chainbreaker enters the battlefield with two -1/-1 counters on it. -{3}, {T}: Remove a -1/-1 counter from target creature. -SHM C - -Chained Throatseeker -{5}{U} -Creature - Horror -5/5 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -Chained Throatseeker can't attack unless defending player is poisoned. -NPH C - -Chainer's Edict -{1}{B} -Sorcery -Target player sacrifices a creature. -Flashback {5}{B}{B} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -TOR U - -Chainer, Dementia Master -{3}{B}{B} -Legendary Creature - Human Minion -3/3 -Nightmare creatures get +1/+1. -{B}{B}{B}, Pay 3 life: Put target creature card from a graveyard onto the battlefield under your control. That creature is black and is a Nightmare in addition to its other creature types. -When Chainer, Dementia Master leaves the battlefield, exile all Nightmares. -TOR R - -Chainflinger -{3}{R} -Creature - Beast -2/2 -{1}{R}, {T}: Chainflinger deals 1 damage to target creature or player. -Threshold - {2}{R}, {T}: Chainflinger deals 2 damage to target creature or player. Activate this ability only if seven or more cards are in your graveyard. -ODY C - -Chains of Mephistopheles -{1}{B} -Enchantment -If a player would draw a card except the first one he or she draws in his or her draw step each turn, that player discards a card instead. If the player discards a card this way, he or she draws a card. If the player doesn't discard a card this way, he or she puts the top card of his or her library into his or her graveyard. -LEG R, MED R - -Chalice of the Void -{X}{X} -Artifact -Chalice of the Void enters the battlefield with X charge counters on it. -Whenever a player casts a spell with converted mana cost equal to the number of charge counters on Chalice of the Void, counter that spell. -MRD R - -Chamber of Manipulation -{2}{U}{U} -Enchantment - Aura -Enchant land -Enchanted land has "{T}, Discard a card: Gain control of target creature until end of turn." -ODY U - -Chambered Nautilus -{2}{U} -Creature - Nautilus Beast -2/2 -Whenever Chambered Nautilus becomes blocked, you may draw a card. -MMQ U - -Chameleon Blur -{3}{G} -Instant -Prevent all damage that creatures would deal to players this turn. -TSP C - -Chameleon Colossus -{2}{G}{G} -Creature - Shapeshifter -4/4 -Changeling (This card is every creature type at all times.) -Protection from black -{2}{G}{G}: Chameleon Colossus gets +X/+X until end of turn, where X is its power. -MOR R, ARC R - -Chameleon Spirit -{3}{U} -Creature - Illusion Spirit -*/* -As Chameleon Spirit enters the battlefield, choose a color. -Chameleon Spirit's power and toughness are each equal to the number of permanents of the chosen color your opponents control. -MMQ U - -Champion Lancer -{4}{W}{W} -Creature - Human Knight -3/3 -Prevent all damage that would be dealt to Champion Lancer by creatures. -S99 R, ME4 R - -Champion's Drake -{1}{U} -Creature - Drake -1/1 -Flying -Champion's Drake gets +3/+3 as long as you control a creature with three or more level counters on it. -ROE C - -Champion's Helm -{3} -Artifact - Equipment -Equipped creature gets +2/+2. -As long as equipped creature is legendary, it has hexproof. (It can't be the target of spells or abilities your opponents control.) -Equip {1} -COM R - -Champion's Victory -{U} -Instant -Cast Champion's Victory only during the declare attackers step and only if you've been attacked this step. -Return target attacking creature to its owner's hand. -PTK U - -Chance Encounter -{2}{R}{R} -Enchantment -Whenever you win a coin flip, put a luck counter on Chance Encounter. -At the beginning of your upkeep, if Chance Encounter has ten or more luck counters on it, you win the game. -ODY R - -Chancellor of the Annex -{4}{W}{W}{W} -Creature - Angel -5/6 -You may reveal this card from your opening hand. If you do, when each opponent casts his or her first spell of the game, counter that spell unless that player pays {1}. -Flying -Whenever an opponent casts a spell, counter it unless that player pays {1}. -NPH R - -Chancellor of the Dross -{4}{B}{B}{B} -Creature - Vampire -6/6 -You may reveal this card from your opening hand. If you do, at the beginning of the first upkeep, each opponent loses 3 life, then you gain life equal to the life lost this way. -Flying, lifelink -NPH R - -Chancellor of the Forge -{4}{R}{R}{R} -Creature - Giant -5/5 -You may reveal this card from your opening hand. If you do, at the beginning of the first upkeep, put a 1/1 red Goblin creature token with haste onto the battlefield. -When Chancellor of the Forge enters the battlefield, put X 1/1 red Goblin creature tokens with haste onto the battlefield, where X is the number of creatures you control. -NPH R - -Chancellor of the Spires -{4}{U}{U}{U} -Creature - Sphinx -5/7 -You may reveal this card from your opening hand. If you do, at the beginning of the first upkeep, each opponent puts the top seven cards of his or her library into his or her graveyard. -Flying -When Chancellor of the Spires enters the battlefield, you may cast target instant or sorcery card from an opponent's graveyard without paying its mana cost. -NPH R - -Chancellor of the Tangle -{4}{G}{G}{G} -Creature - Beast -6/7 -You may reveal this card from your opening hand. If you do, at the beginning of your first main phase, add {G} to your mana pool. -Vigilance, reach -NPH R - -Chandler -{4}{R} -Legendary Creature - Human Rogue -3/3 -{R}{R}{R}, {T}: Destroy target artifact creature. -HML C - -Chandra Ablaze -{4}{R}{R} -Planeswalker - Chandra -5 -[+1] Discard a card. If a red card is discarded this way, Chandra Ablaze deals 4 damage to target creature or player. -[-2] Each player discards his or her hand, then draws three cards. -[-7] Cast any number of red instant and/or sorcery cards from your graveyard without paying their mana costs. -ZEN M - -Chandra Nalaar -{3}{R}{R} -Planeswalker - Chandra -6 -[+1] Chandra Nalaar deals 1 damage to target player. --X: Chandra Nalaar deals X damage to target creature. -[-8] Chandra Nalaar deals 10 damage to target player and each creature he or she controls. -LRW R, JVC M, M10 M, M11 M - -Chandra's Outrage -{2}{R}{R} -Instant -Chandra's Outrage deals 4 damage to target creature and 2 damage to that creature's controller. -ARC C, M11 C, M12 C - -Chandra's Phoenix -{1}{R}{R} -Creature - Phoenix -2/2 -Flying -Haste (This creature can attack and {T} as soon as it comes under your control.) -Whenever an opponent is dealt damage by a red instant or sorcery spell you control or by a red planeswalker you control, return Chandra's Phoenix from your graveyard to your hand. -M12 R - -Chandra's Spitfire -{2}{R} -Creature - Elemental -1/3 -Flying -Whenever an opponent is dealt noncombat damage, Chandra's Spitfire gets +3/+0 until end of turn. -M11 U - -Chandra, the Firebrand -{3}{R} -Planeswalker - Chandra -3 -[+1] Chandra, the Firebrand deals 1 damage to target creature or player. -[-2] When you cast your next instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy. -[-6] Chandra, the Firebrand deals 6 damage to each of up to six target creatures and/or players. -M12 M - -Change of Heart -{W} -Instant -Buyback {3} (You may pay an additional {3} as you cast this spell. If you do, put this card into your hand as it resolves.) -Target creature can't attack this turn. -STH C - -Changeling Berserker -{3}{R} -Creature - Shapeshifter -5/3 -Changeling (This card is every creature type at all times.) -Haste -Champion a creature (When this enters the battlefield, sacrifice it unless you exile another creature you control. When this leaves the battlefield, that card returns to the battlefield.) -LRW U - -Changeling Hero -{4}{W} -Creature - Shapeshifter -4/4 -Changeling (This card is every creature type at all times.) -Champion a creature (When this enters the battlefield, sacrifice it unless you exile another creature you control. When this leaves the battlefield, that card returns to the battlefield.) -Lifelink (Damage dealt by this creature also causes you to gain that much life.) -LRW U - -Changeling Sentinel -{3}{W} -Creature - Shapeshifter -3/2 -Changeling (This card is every creature type at all times.) -Vigilance -MOR C - -Changeling Titan -{4}{G} -Creature - Shapeshifter -7/7 -Changeling (This card is every creature type at all times.) -Champion a creature (When this enters the battlefield, sacrifice it unless you exile another creature you control. When this leaves the battlefield, that card returns to the battlefield.) -LRW U - -Channel -{G}{G} -Sorcery -Until end of turn, any time you could activate a mana ability, you may pay 1 life. If you do, add {1} to your mana pool. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, FVE M, ME4 R - -Channel the Suns -{3}{G} -Sorcery -Add {W}{U}{B}{R}{G} to your mana pool. -5DN U - -Chant of Vitu-Ghazi -{6}{W}{W} -Instant -Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.) -Prevent all damage that would be dealt by creatures this turn. You gain life equal to the damage prevented this way. -RAV U - -Chaos Charm -{R} -Instant -Choose one - Destroy target Wall; or Chaos Charm deals 1 damage to target creature; or target creature gains haste until end of turn. -MIR C - -Chaos Harlequin -{2}{R}{R} -Creature - Human -2/4 -{R}: Exile the top card of your library. If that card is a land card, Chaos Harlequin gets -4/-0 until end of turn. Otherwise, Chaos Harlequin gets +2/+0 until end of turn. -ALL R - -Chaos Lord -{4}{R}{R}{R} -Creature - Human -7/7 -First strike -At the beginning of your upkeep, target opponent gains control of Chaos Lord if the number of permanents is even. -Chaos Lord can attack as though it had haste unless it entered the battlefield this turn. -ICE R - -Chaos Moon -{3}{R} -Enchantment -At the beginning of each upkeep, count the number of permanents. If the number is odd, until end of turn, red creatures get +1/+1 and whenever a player taps a Mountain for mana, that player adds {R} to his or her mana pool (in addition to the mana the land produces). If the number is even, until end of turn, red creatures get -1/-1 and if a player taps a Mountain for mana, that Mountain produces colorless mana instead of any other type. -ICE R - -Chaos Orb -{2} -Artifact -{1}, {T}: If Chaos Orb is on the battlefield, flip Chaos Orb onto the battlefield from a height of at least one foot. If Chaos Orb turns over completely at least once during the flip, destroy all permanents it touches. Then destroy Chaos Orb. -LEA R, LEB R, 2ED R - -Chaos Warp -{2}{R} -Instant -The owner of target permanent shuffles it into his or her library, then reveals the top card of his or her library. If it's a permanent card, he or she puts it onto the battlefield. -COM R - -Chaoslace -{R} -Instant -Target spell or permanent becomes red. (Its mana symbols remain unchanged.) -LEA R, LEB R, 2ED R, 3ED R, 4ED R - -Chaosphere -{2}{R} -World Enchantment -Creatures with flying can block only creatures with flying. -Creatures without flying have reach. (They can block creatures with flying.) -MIR R - -Chaotic Backlash -{4}{R} -Instant -Chaotic Backlash deals damage to target player equal to twice the number of white and/or blue permanents he or she controls. -EVE U - -Chaotic Goo -{2}{R}{R} -Creature - Ooze -0/0 -Chaotic Goo enters the battlefield with three +1/+1 counters on it. -At the beginning of your upkeep, you may flip a coin. If you win the flip, put a +1/+1 counter on Chaotic Goo. If you lose the flip, remove a +1/+1 counter from Chaotic Goo. -TMP R - -Chaotic Strike -{1}{R} -Instant -Cast Chaotic Strike only during combat after blockers are declared. -Flip a coin. If you win the flip, target creature gets +1/+1 until end of turn. -Draw a card. -INV U - -Char -{2}{R} -Instant -Char deals 4 damage to target creature or player and 2 damage to you. -RAV R - -Char-Rumbler -{2}{R}{R} -Creature - Elemental --1/3 -Double strike -{R}: Char-Rumbler gets +1/+0 until end of turn. -FUT U - -Charcoal Diamond -{2} -Artifact -Charcoal Diamond enters the battlefield tapped. -{T}: Add {B} to your mana pool. -MIR U, 6ED U, 7ED U - -Charge Across the Araba -{4}{W} -Instant - Arcane -Sweep - Return any number of Plains you control to their owner's hand. Creatures you control get +1/+1 until end of turn for each Plains returned this way. -SOK U - -Charging Bandits -{4}{B} -Creature - Human Rogue -3/3 -Whenever Charging Bandits attacks, it gets +2/+0 until end of turn. -POR U - -Charging Paladin -{2}{W} -Creature - Human Knight -2/2 -Whenever Charging Paladin attacks, it gets +0/+3 until end of turn. -POR U, EXO C, S99 U, DVD C - -Charging Rhino -{3}{G}{G} -Creature - Rhino -4/4 -Charging Rhino can't be blocked by more than one creature. -POR R, TMP U - -Charging Slateback -{4}{R} -Creature - Beast -4/3 -Charging Slateback can't block. -Morph {4}{R} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS C - -Charging Troll -{2}{G}{W} -Creature - Troll -3/3 -Vigilance -{G}: Regenerate Charging Troll. -INV U, PVC U - -Chariot of the Sun -{3} -Artifact -{2}, {T}: Until end of turn, target creature you control gains flying and its toughness becomes 1. -MIR U - -Charisma -{U}{U}{U} -Enchantment - Aura -Enchant creature -Whenever enchanted creature deals damage to a creature, gain control of the other creature for as long as Charisma remains on the battlefield. -MMQ R - -Charm Peddler -{W} -Creature - Human Spellshaper -1/1 -{W}, {T}, Discard a card: The next time a source of your choice would deal damage to target creature this turn, prevent that damage. -MMQ C - -Charmed Griffin -{3}{W} -Creature - Griffin -3/3 -Flying -When Charmed Griffin enters the battlefield, each other player may put an artifact or enchantment card onto the battlefield from his or her hand. -MMQ U - -Charmed Pendant -{4} -Artifact -{T}, Put the top card of your library into your graveyard: For each colored mana symbol in that card's mana cost, add one mana of that color to your mana pool. Activate this ability only any time you could cast an instant. (For example, if the card's mana cost is {3}{U}{U}{B}, you add {U}{U}{B} to your mana pool.) -ODY R - -Charnelhoard Wurm -{4}{B}{R}{G} -Creature - Wurm -6/6 -Trample -Whenever Charnelhoard Wurm deals damage to an opponent, you may return target card from your graveyard to your hand. -CON R - -Chartooth Cougar -{5}{R} -Creature - Cat Beast -4/4 -{R}: Chartooth Cougar gets +1/+0 until end of turn. -Mountaincycling {2} ({2}, Discard this card: Search your library for a Mountain card, reveal it, and put it into your hand. Then shuffle your library.) -SCG C, JVC C, COM C - -Chasm Drake -{4}{U} -Creature - Drake -3/3 -Flying -Whenever Chasm Drake attacks, target creature you control gains flying until end of turn. -M12 C - -Chastise -{3}{W} -Instant -Destroy target attacking creature. You gain life equal to its power. -JUD U, 8ED U, 9ED U - -Chatter of the Squirrel -{G} -Sorcery -Put a 1/1 green Squirrel creature token onto the battlefield. -Flashback {1}{G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY C - -Chieftain en-Dal -{1}{W}{W} -Creature - Human Knight -2/2 -Whenever Chieftain en-Dal attacks, attacking creatures gain first strike until end of turn. -NEM U - -Child of Alara -{W}{U}{B}{R}{G} -Legendary Creature - Avatar -6/6 -Trample -When Child of Alara dies, destroy all nonland permanents. They can't be regenerated. -CON M - -Child of Gaea -{3}{G}{G}{G} -Creature - Elemental -7/7 -Trample -At the beginning of your upkeep, sacrifice Child of Gaea unless you pay {G}{G}. -{1}{G}: Regenerate Child of Gaea. -USG R - -Child of Night -{1}{B} -Creature - Vampire -2/1 -Lifelink (Damage dealt by this creature also causes you to gain that much life.) -M10 C, M11 C, M12 C - -Child of Thorns -{G} -Creature - Spirit -1/1 -Sacrifice Child of Thorns: Target creature gets +1/+1 until end of turn. -BOK C - -Childhood Horror -{3}{B} -Creature - Horror -2/2 -Flying -Threshold - As long as seven or more cards are in your graveyard, Childhood Horror gets +2/+2 and can't block. -ODY U - -Children of Korlis -{W} -Creature - Human Rebel Cleric -1/1 -Sacrifice Children of Korlis: You gain life equal to the life you've lost this turn. (Damage causes loss of life.) -TSP C - -Chill -{1}{U} -Enchantment -Red spells cost {2} more to cast. -TMP U, 6ED U - -Chill Haunting -{1}{B} -Instant -As an additional cost to cast Chill Haunting, exile X creature cards from your graveyard. -Target creature gets -X/-X until end of turn. -SCG U - -Chill to the Bone -{3}{B} -Instant -Destroy target nonsnow creature. -CSP C - -Chilling Apparition -{2}{B} -Creature - Spirit -1/1 -{B}: Regenerate Chilling Apparition. -Whenever Chilling Apparition deals combat damage to a player, that player discards a card. -PCY U - -Chilling Shade -{2}{B} -Snow Creature - Shade -1/1 -Flying -{S}: Chilling Shade gets +1/+1 until end of turn. ({S} can be paid with one mana from a snow permanent.) -CSP C - -Chime of Night -{1}{B} -Enchantment - Aura -Enchant creature -When Chime of Night is put into a graveyard from the battlefield, destroy target nonblack creature. -UDS C - -Chimeric Coils -{1} -Artifact -{X}{1}: Chimeric Coils becomes an X/X Construct artifact creature. Sacrifice it at the beginning of the next end step. -5DN U - -Chimeric Egg -{3} -Artifact -Whenever an opponent casts a nonartifact spell, put a charge counter on Chimeric Egg. -Remove three charge counters from Chimeric Egg: Chimeric Egg becomes a 6/6 Construct artifact creature with trample until end of turn. -DST U - -Chimeric Idol -{3} -Artifact -{0}: Tap all lands you control. Chimeric Idol becomes a 3/3 Turtle artifact creature until end of turn. -PCY U - -Chimeric Mass -{X} -Artifact -Chimeric Mass enters the battlefield with X charge counters on it. -{1}: Until end of turn, Chimeric Mass becomes a Construct artifact creature with "This creature's power and toughness are each equal to the number of charge counters on it." -SOM R - -Chimeric Sphere -{3} -Artifact -{2}: Until end of turn, Chimeric Sphere becomes a 2/1 Construct artifact creature with flying. -{2}: Until end of turn, Chimeric Sphere becomes a 3/2 Construct artifact creature without flying. -WTH U - -Chimeric Staff -{4} -Artifact -{X}: Chimeric Staff becomes an X/X Construct artifact creature until end of turn. -USG R, 10E R - -Chimney Imp -{4}{B} -Creature - Imp -1/2 -Flying -When Chimney Imp dies, target opponent puts a card from his or her hand on top of his or her library. -MRD C - -Chisei, Heart of Oceans -{2}{U}{U} -Legendary Creature - Spirit -4/4 -Flying -At the beginning of your upkeep, sacrifice Chisei, Heart of Oceans unless you remove a counter from a permanent you control. -BOK R - -Chittering Rats -{1}{B}{B} -Creature - Rat -2/2 -When Chittering Rats enters the battlefield, target opponent puts a card from his or her hand on top of his or her library. -DST C - -Chlorophant -{G}{G}{G} -Creature - Elemental -1/1 -At the beginning of your upkeep, you may put a +1/+1 counter on Chlorophant. -Threshold - As long as seven or more cards are in your graveyard, Chlorophant has "At the beginning of your upkeep, you may put another +1/+1 counter on Chlorophant." -ODY R - -Cho-Arrim Alchemist -{W} -Creature - Human Spellshaper -1/1 -{1}{W}{W}, {T}, Discard a card: The next time a source of your choice would deal damage to you this turn, prevent that damage. You gain life equal to the damage prevented this way. -MMQ R - -Cho-Arrim Bruiser -{5}{W} -Creature - Ogre Rebel -3/4 -Whenever Cho-Arrim Bruiser attacks, you may tap up to two target creatures. -MMQ R - -Cho-Arrim Legate -{2}{W} -Creature - Human Soldier -1/2 -Protection from black -If an opponent controls a Swamp and you control a Plains, you may cast Cho-Arrim Legate without paying its mana cost. -MMQ U - -Cho-Manno's Blessing -{W}{W} -Enchantment - Aura -Flash -Enchant creature -As Cho-Manno's Blessing enters the battlefield, choose a color. -Enchanted creature has protection from the chosen color. This effect doesn't remove Cho-Manno's Blessing. -MMQ C - -Cho-Manno, Revolutionary -{2}{W}{W} -Legendary Creature - Human Rebel -2/2 -Prevent all damage that would be dealt to Cho-Manno, Revolutionary. -MMQ R, 10E R - -Choice of Damnations -{5}{B} -Sorcery - Arcane -Target opponent chooses a number. You may have that player lose that much life. If you don't, that player sacrifices all but that many permanents. -SOK R - -Choke -{2}{G} -Enchantment -Islands don't untap during their controllers' untap steps. -TMP U, 8ED U - -Choking Fumes -{2}{W} -Instant -Put a -1/-1 counter on each attacking creature. -MBS U - -Choking Sands -{1}{B}{B} -Sorcery -Destroy target non-Swamp land. If that land was nonbasic, Choking Sands deals 2 damage to the land's controller. -MIR C - -Choking Tethers -{3}{U} -Instant -Tap up to four target creatures. -Cycling {1}{U} ({1}{U}, Discard this card: Draw a card.) -When you cycle Choking Tethers, you may tap target creature. -ONS C - -Choking Vines -{X}{G} -Instant -Cast Choking Vines only during the declare blockers step. -X target attacking creatures become blocked. Choking Vines deals 1 damage to each of those creatures. (This spell works on unblockable creatures.) -WTH C - -Choose Your Champion -Scheme -When you set this scheme in motion, target opponent chooses a player. Until your next turn, only you and the chosen player can cast spells and attack with creatures. -ARC C - -Chord of Calling -{X}{G}{G}{G} -Instant -Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.) -Search your library for a creature card with converted mana cost X or less and put it onto the battlefield. Then shuffle your library. -RAV R - -Chorus of Woe -{B} -Sorcery -Creatures you control get +1/+0 until end of turn. -P02 C, S99 C - -Chorus of the Conclave -{4}{G}{G}{W}{W} -Legendary Creature - Dryad -3/8 -Forestwalk -As an additional cost to cast creature spells, you may pay any amount of mana. If you do, that creature enters the battlefield with that many additional +1/+1 counters on it. -RAV R, COM R - -Chromatic Armor -{1}{W}{U} -Enchantment - Aura -Enchant creature -As Chromatic Armor enters the battlefield, choose a color. -Chromatic Armor enters the battlefield with a sleight counter on it. -Prevent all damage that would be dealt to enchanted creature by a source of the last chosen color. -{X}: Put a sleight counter on Chromatic Armor and choose a color. X is the number of sleight counters on Chromatic Armor. -ICE R - -Chromatic Sphere -{1} -Artifact -{1}, {T}, Sacrifice Chromatic Sphere: Add one mana of any color to your mana pool. Draw a card. -INV U, MRD C - -Chromatic Star -{1} -Artifact -{1}, {T}, Sacrifice Chromatic Star: Add one mana of any color to your mana pool. -When Chromatic Star is put into a graveyard from the battlefield, draw a card. -TSP C, 10E U - -Chrome Mox -{0} -Artifact -Imprint - When Chrome Mox enters the battlefield, you may exile a nonartifact, nonland card from your hand. -{T}: Add one mana of any of the exiled card's colors to your mana pool. -MRD R - -Chrome Steed -{4} -Artifact Creature - Horse -2/2 -Metalcraft - Chrome Steed gets +2/+2 as long as you control three or more artifacts. -SOM C - -Chromescale Drake -{6}{U}{U}{U} -Creature - Drake -3/4 -Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -Flying -When Chromescale Drake enters the battlefield, reveal the top three cards of your library. Put all artifact cards revealed this way into your hand and the rest into your graveyard. -DST R - -Chromeshell Crab -{4}{U} -Creature - Crab Beast -3/3 -Morph {4}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Chromeshell Crab is turned face up, you may exchange control of target creature you control and target creature an opponent controls. -LGN R, COM R - -Chromium -{2}{W}{W}{U}{U}{B}{B} -Legendary Creature - Elder Dragon -7/7 -Flying -Rampage 2 (Whenever this creature becomes blocked, it gets +2/+2 until end of turn for each creature blocking it beyond the first.) -At the beginning of your upkeep, sacrifice Chromium unless you pay {W}{U}{B}. -LEG R, CHR R, ME3 R - -Chronatog -{1}{U} -Creature - Atog -1/2 -{0}: Chronatog gets +3/+3 until end of turn. You skip your next turn. Activate this ability only once each turn. -VIS R - -Chronatog Avatar -Vanguard -Hand -1, life +1 -You have no maximum hand size. -{0}: Draw three cards. You skip your next turn. Activate this ability only once each turn. -VG S - -Chronatog Totem -{3} -Artifact -{T}: Add {U} to your mana pool. -{1}{U}: Chronatog Totem becomes a 1/2 blue Atog artifact creature until end of turn. -{0}: Chronatog Totem gets +3/+3 until end of turn. You skip your next turn. Activate this ability only once each turn and only if Chronatog Totem is a creature. -TSP U - -Chronomantic Escape -{4}{W}{W} -Sorcery -Until your next turn, creatures can't attack you. Exile Chronomantic Escape with three time counters on it. -Suspend 3-{2}{W} (Rather than cast this card from your hand, you may pay {2}{W} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) -FUT U - -Chronosavant -{5}{W} -Creature - Giant -5/5 -{1}{W}: Return Chronosavant from your graveyard to the battlefield tapped. You skip your next turn. -TSP R - -Chronozoa -{3}{U} -Creature - Illusion -3/3 -Flying -Vanishing 3 (This permanent enters the battlefield with three time counters on it. At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.) -When Chronozoa dies, if it had no time counters on it, put two tokens that are copies of it onto the battlefield. -PLC R - -Chub Toad -{2}{G} -Creature - Frog -1/1 -Whenever Chub Toad blocks or becomes blocked, it gets +2/+2 until end of turn. -ICE C, 5ED C, MED C - -Churning Eddy -{3}{U} -Sorcery -Return target creature and target land to their owners' hands. -TOR C - -Cinder Cloud -{3}{R}{R} -Instant -Destroy target creature. If a white creature dies this way, Cinder Cloud deals damage to that creature's controller equal to the creature's power. -MIR U - -Cinder Crawler -{1}{R} -Creature - Salamander -1/2 -{R}: Cinder Crawler gets +1/+0 until end of turn. Activate this ability only if Cinder Crawler is blocked. -EXO C - -Cinder Elemental -{3}{R} -Creature - Elemental -2/2 -{X}{R}, {T}, Sacrifice Cinder Elemental: Cinder Elemental deals X damage to target creature or player. -MMQ U, HOP U - -Cinder Giant -{3}{R} -Creature - Giant -5/3 -At the beginning of your upkeep, Cinder Giant deals 2 damage to each other creature you control. -WTH U - -Cinder Marsh -Land -{T}: Add {1} to your mana pool. -{T}: Add {B} or {R} to your mana pool. Cinder Marsh doesn't untap during your next untap step. -TMP U, BRB U - -Cinder Pyromancer -{2}{R} -Creature - Elemental Shaman -0/1 -{T}: Cinder Pyromancer deals 1 damage to target player. -Whenever you cast a red spell, you may untap Cinder Pyromancer. -EVE C, H10 C - -Cinder Seer -{3}{R} -Creature - Human Wizard -1/1 -{2}{R}, {T}: Reveal any number of red cards in your hand. Cinder Seer deals X damage to target creature or player, where X is the number of cards revealed this way. -UDS U - -Cinder Shade -{1}{B}{R} -Creature - Shade -1/1 -{B}: Cinder Shade gets +1/+1 until end of turn. -{R}, Sacrifice Cinder Shade: Cinder Shade deals damage equal to its power to target creature. -INV U - -Cinder Storm -{6}{R} -Sorcery -Cinder Storm deals 7 damage to target creature or player. -S99 U, ME3 U - -Cinder Wall -{R} -Creature - Wall -3/3 -Defender (This creature can't attack.) -When Cinder Wall blocks, destroy it at end of combat. -WTH C, 8ED C, DDG C - -Cinderbones -{2}{B} -Creature - Elemental Skeleton -1/1 -Wither (This deals damage to creatures in the form of -1/-1 counters.) -{1}{B}: Regenerate Cinderbones. -SHM C - -Cinderhaze Wretch -{4}{B} -Creature - Elemental Shaman -3/2 -{T}: Target player discards a card. Activate this ability only during your turn. -Put a -1/-1 counter on Cinderhaze Wretch: Untap Cinderhaze Wretch. -SHM C - -Circle of Affliction -{1}{B} -Enchantment -As Circle of Affliction enters the battlefield, choose a color. -Whenever a source of the chosen color deals damage to you, you may pay {1}. If you do, target player loses 1 life and you gain 1 life. -PLC U - -Circle of Despair -{1}{W}{B} -Enchantment -{1}, Sacrifice a creature: The next time a source of your choice would deal damage to target creature or player this turn, prevent that damage. -MIR R - -Circle of Flame -{1}{R} -Enchantment -Whenever a creature without flying attacks you or a planeswalker you control, Circle of Flame deals 1 damage to that creature. -M12 U - -Circle of Protection: Artifacts -{1}{W} -Enchantment -{2}: The next time an artifact source of your choice would deal damage to you this turn, prevent that damage. -ATQ U, 4ED U, 5ED U, 5DN U - -Circle of Protection: Black -{1}{W} -Enchantment -{1}: The next time a black source of your choice would deal damage to you this turn, prevent that damage. -LEB C, 2ED C, 3ED C, 4ED C, ICE C, 5ED C, TMP C, 6ED C, 7ED C, 8ED U, 9ED U - -Circle of Protection: Blue -{1}{W} -Enchantment -{1}: The next time a blue source of your choice would deal damage to you this turn, prevent that damage. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, ICE C, 5ED C, TMP C, 6ED C, 7ED C, 8ED U - -Circle of Protection: Green -{1}{W} -Enchantment -{1}: The next time a green source of your choice would deal damage to you this turn, prevent that damage. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, ICE C, 5ED C, TMP C, 6ED C, 7ED C, 8ED U - -Circle of Protection: Red -{1}{W} -Enchantment -{1}: The next time a red source of your choice would deal damage to you this turn, prevent that damage. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, ICE C, 5ED C, TMP C, 6ED C, 7ED C, 8ED U, 9ED U - -Circle of Protection: Shadow -{1}{W} -Enchantment -{1}: The next time a creature of your choice with shadow would deal damage to you this turn, prevent that damage. -TMP C - -Circle of Protection: White -{1}{W} -Enchantment -{1}: The next time a white source of your choice would deal damage to you this turn, prevent that damage. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, ICE C, 5ED C, TMP C, 6ED C, 7ED C, 8ED U - -Circle of Solace -{3}{W} -Enchantment -As Circle of Solace enters the battlefield, choose a creature type. -{1}{W}: The next time a creature of the chosen type would deal damage to you this turn, prevent that damage. -ONS R - -Circling Vultures -{B} -Creature - Bird -3/2 -Flying -You may discard Circling Vultures any time you could cast an instant. -At the beginning of your upkeep, sacrifice Circling Vultures unless you exile the top creature card of your graveyard. -WTH U - -Circu, Dimir Lobotomist -{2}{U}{B} -Legendary Creature - Human Wizard -2/3 -Whenever you cast a blue spell, exile the top card of target library. -Whenever you cast a black spell, exile the top card of target library. -Your opponents can't cast nonland cards with the same name as a card exiled with Circu, Dimir Lobotomist. -RAV R - -Circular Logic -{2}{U} -Instant -Counter target spell unless its controller pays {1} for each card in your graveyard. -Madness {U} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -TOR U - -Citadel of Pain -{2}{R} -Enchantment -At the beginning of each player's end step, Citadel of Pain deals X damage to that player, where X is the number of untapped lands he or she controls. -PCY U - -Citanul Centaurs -{3}{G} -Creature - Centaur -6/3 -Shroud (This permanent can't be the target of spells or abilities.) -Echo {3}{G} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -USG R - -Citanul Druid -{1}{G} -Creature - Human Druid -1/1 -Whenever an opponent casts an artifact spell, put a +1/+1 counter on Citanul Druid. -ATQ U, ME4 C - -Citanul Flute -{5} -Artifact -{X}, {T}: Search your library for a creature card with converted mana cost X or less, reveal it, and put it into your hand. Then shuffle your library. -USG R, 10E R - -Citanul Hierophants -{3}{G} -Creature - Human Druid -3/2 -Creatures you control have "{T}: Add {G} to your mana pool." -USG R - -Citanul Woodreaders -{2}{G} -Creature - Human Druid -1/4 -Kicker {2}{G} (You may pay an additional {2}{G} as you cast this spell.) -When Citanul Woodreaders enters the battlefield, if it was kicked, draw two cards. -PLC C - -City in a Bottle -{2} -Artifact -Whenever a nontoken permanent from the Arabian Nights expansion other than City in a Bottle is on the battlefield, its controller sacrifices it. -Players can't play cards from the Arabian Nights expansion. -ARN R - -City of Brass -Land -Whenever City of Brass becomes tapped, it deals 1 damage to you. -{T}: Add one mana of any color to your mana pool. -ARN U, CHR R, 5ED R, 6ED R, 7ED R, 8ED R, ME4 R - -City of Shadows -Land -{T}, Exile a creature you control: Put a storage counter on City of Shadows. -{T}: Add {X} to your mana pool, where X is the number of storage counters on City of Shadows. -DRK R, ME3 R - -City of Solitude -{2}{G} -Enchantment -Players can cast spells and activate abilities only during their own turns. -VIS R - -City of Traitors -Land -When you play another land, sacrifice City of Traitors. -{T}: Add {2} to your mana pool. -EXO R - -Civic Guildmage -{W} -Creature - Human Wizard -1/1 -{G}, {T}: Target creature gets +0/+1 until end of turn. -{U}, {T}: Put target creature you control on top of its owner's library. -MIR C - -Civic Wayfinder -{2}{G} -Creature - Elf Warrior Druid -2/2 -When Civic Wayfinder enters the battlefield, you may search your library for a basic land card, reveal it, and put it into your hand. If you do, shuffle your library. -RAV C, 10E C - -Clairvoyance -{U} -Instant -Look at target player's hand. -Draw a card at the beginning of the next turn's upkeep. -ICE C - -Clarion Ultimatum -{G}{G}{W}{W}{W}{U}{U} -Sorcery -Choose five permanents you control. For each of those permanents, you may search your library for a card with the same name as that permanent. Put those cards onto the battlefield tapped, then shuffle your library. -ALA R - -Clash of Realities -{3}{R} -Enchantment -All Spirits have "When this permanent enters the battlefield, you may have it deal 3 damage to target non-Spirit creature." -Non-Spirit creatures have "When this creature enters the battlefield, you may have it deal 3 damage to target Spirit creature." -BOK R - -Claws of Gix -{0} -Artifact -{1}, Sacrifice a permanent: You gain 1 life. -USG U, TSB S - -Claws of Valakut -{1}{R}{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+0 for each Mountain you control and has first strike. -WWK C, DDG C - -Claws of Wirewood -{3}{G} -Sorcery -Claws of Wirewood deals 3 damage to each creature with flying and each player. -Cycling {2} ({2}, Discard this card: Draw a card.) -SCG U - -Clay Statue -{4} -Artifact Creature - Golem -3/1 -{2}: Regenerate Clay Statue. -ATQ C, 4ED C, 5ED C, ME4 U - -Cleanfall -{2}{W} -Sorcery - Arcane -Destroy all enchantments. -CHK U - -Cleanse -{2}{W}{W} -Sorcery -Destroy all black creatures. -LEG R, ME3 R - -Cleansing -{W}{W}{W} -Sorcery -For each land, destroy that land unless any player pays 1 life. -DRK R - -Cleansing Beam -{4}{R} -Instant -Radiance - Cleansing Beam deals 2 damage to target creature and each other creature that shares a color with it. -RAV U, COM U - -Cleansing Meditation -{1}{W}{W} -Sorcery -Destroy all enchantments. -Threshold - If seven or more cards are in your graveyard, instead destroy all enchantments, then return all cards in your graveyard destroyed this way to the battlefield. -TOR U - -Clear -{1}{W} -Instant -Destroy target enchantment. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG U - -Clear the Land -{2}{G} -Sorcery -Each player reveals the top five cards of his or her library, puts all land cards revealed this way onto the battlefield tapped, and exiles the rest. -MMQ R - -Clearwater Goblet -{5} -Artifact -Sunburst (This enters the battlefield with a charge counter on it for each color of mana spent to cast it.) -At the beginning of your upkeep, you may gain life equal to the number of charge counters on Clearwater Goblet. -5DN R - -Clergy en-Vec -{1}{W} -Creature - Human Cleric -1/1 -{T}: Prevent the next 1 damage that would be dealt to target creature or player this turn. -TMP C - -Clergy of the Holy Nimbus -{W} -Creature - Human Cleric -1/1 -If Clergy of the Holy Nimbus would be destroyed, regenerate it. -{1}: Clergy of the Holy Nimbus can't be regenerated this turn. Only any opponent may activate this ability. -LEG C - -Clickslither -{1}{R}{R}{R} -Creature - Insect -3/3 -Haste -Sacrifice a Goblin: Clickslither gets +2/+2 and gains trample until end of turn. -LGN R, EVG R - -Cliff Threader -{1}{W} -Creature - Kor Scout -2/1 -Mountainwalk -ZEN C - -Cliffrunner Behemoth -{3}{G} -Creature - Rhino Beast -5/3 -Cliffrunner Behemoth has haste as long as you control a red permanent. -Cliffrunner Behemoth has lifelink as long as you control a white permanent. -CON R - -Cliffside Market -Plane - Mercadia -When you planeswalk to Cliffside Market or at the beginning of your upkeep, you may exchange life totals with target player. -Whenever you roll {C}, exchange control of two target permanents that share a card type. -HOP C - -Clinging Darkness -{1}{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets -4/-1. -RAV C - -Cloak and Dagger -{2} -Tribal Artifact - Rogue Equipment -Equipped creature gets +2/+0 and has shroud. (It can't be the target of spells or abilities.) -Whenever a Rogue creature enters the battlefield, you may attach Cloak and Dagger to it. -Equip {3} -MOR U - -Cloak of Confusion -{1}{B} -Enchantment - Aura -Enchant creature you control -Whenever enchanted creature attacks and isn't blocked, you may have it assign no combat damage this turn. If you do, defending player discards a card at random. -ICE C, 5ED C, ME2 C - -Cloak of Feathers -{U} -Sorcery -Target creature gains flying until end of turn. -Draw a card. -POR C - -Cloak of Invisibility -{U} -Enchantment - Aura -Enchant creature -Enchanted creature has phasing and can't be blocked except by Walls. (It phases in or out before its controller untaps during each of his or her untap steps. While it's phased out, it's treated as though it doesn't exist.) -MIR C - -Cloak of Mists -{1}{U} -Enchantment - Aura -Enchant creature -Enchanted creature is unblockable. -USG C - -Clock of Omens -{4} -Artifact -Tap two untapped artifacts you control: Untap target artifact. -5DN U - -Clockspinning -{U} -Instant -Buyback {3} (You may pay an additional {3} as you cast this spell. If you do, put this card into your hand as it resolves.) -Choose a counter on target permanent or suspended card. Remove that counter from that permanent or card or put another of those counters on it. -TSP C - -Clockwork Avian -{5} -Artifact Creature - Bird -0/4 -Flying -Clockwork Avian enters the battlefield with four +1/+0 counters on it. -At end of combat, if Clockwork Avian attacked or blocked this combat, remove a +1/+0 counter from it. -{X}, {T}: Put up to X +1/+0 counters on Clockwork Avian. This ability can't cause the total number of +1/+0 counters on Clockwork Avian to be greater than four. Activate this ability only during your upkeep. -ATQ R, 4ED R, BTD R, ME4 U - -Clockwork Beast -{6} -Artifact Creature - Beast -0/4 -Clockwork Beast enters the battlefield with seven +1/+0 counters on it. -At end of combat, if Clockwork Beast attacked or blocked this combat, remove a +1/+0 counter from it. -{X}, {T}: Put up to X +1/+0 counters on Clockwork Beast. This ability can't cause the total number of +1/+0 counters on Clockwork Beast to be greater than seven. Activate this ability only during your upkeep. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, BTD R, MED U - -Clockwork Beetle -{1} -Artifact Creature - Insect -0/0 -Clockwork Beetle enters the battlefield with two +1/+1 counters on it. -Whenever Clockwork Beetle attacks or blocks, remove a +1/+1 counter from it at end of combat. -MRD C - -Clockwork Condor -{4} -Artifact Creature - Bird -0/0 -Flying -Clockwork Condor enters the battlefield with three +1/+1 counters on it. -Whenever Clockwork Condor attacks or blocks, remove a +1/+1 counter from it at end of combat. -MRD C, EVT C - -Clockwork Dragon -{7} -Artifact Creature - Dragon -0/0 -Flying -Clockwork Dragon enters the battlefield with six +1/+1 counters on it. -Whenever Clockwork Dragon attacks or blocks, remove a +1/+1 counter from it at end of combat. -{3}: Put a +1/+1 counter on Clockwork Dragon. -MRD R - -Clockwork Gnomes -{4} -Artifact Creature - Gnome -2/2 -{3}, {T}: Regenerate target artifact creature. -HML C, ME4 U - -Clockwork Hydra -{5} -Artifact Creature - Hydra -0/0 -Clockwork Hydra enters the battlefield with four +1/+1 counters on it. -Whenever Clockwork Hydra attacks or blocks, remove a +1/+1 counter from it. If you do, Clockwork Hydra deals 1 damage to target creature or player. -{T}: Put a +1/+1 counter on Clockwork Hydra. -TSP U, EVT U - -Clockwork Steed -{4} -Artifact Creature - Horse -0/3 -Clockwork Steed enters the battlefield with four +1/+0 counters on it. -Clockwork Steed can't be blocked by artifact creatures. -At end of combat, if Clockwork Steed attacked or blocked this combat, remove a +1/+0 counter from it. -{X}, {T}: Put up to X +1/+0 counters on Clockwork Steed. This ability can't cause the total number of +1/+0 counters on Clockwork Steed to be greater than four. Activate this ability only during your upkeep. -HML C, 5ED U, ME2 U - -Clockwork Swarm -{4} -Artifact Creature - Insect -0/3 -Clockwork Swarm enters the battlefield with four +1/+0 counters on it. -Clockwork Swarm can't be blocked by Walls. -At end of combat, if Clockwork Swarm attacked or blocked this combat, remove a +1/+0 counter from it. -{X}, {T}: Put up to X +1/+0 counters on Clockwork Swarm. This ability can't cause the total number of +1/+0 counters on Clockwork Swarm to be greater than four. Activate this ability only during your upkeep. -HML C, ME4 C - -Clockwork Vorrac -{5} -Artifact Creature - Boar Beast -0/0 -Trample -Clockwork Vorrac enters the battlefield with four +1/+1 counters on it. -Whenever Clockwork Vorrac attacks or blocks, remove a +1/+1 counter from it at end of combat. -{T}: Put a +1/+1 counter on Clockwork Vorrac. -MRD U - -Clone -{3}{U} -Creature - Shapeshifter -0/0 -You may have Clone enter the battlefield as a copy of any creature on the battlefield. -LEA U, LEB U, 2ED U, 3ED U, ONS R, 9ED R, 10E R, M10 R, M11 R - -Clone Shell -{5} -Artifact Creature - Shapeshifter -2/2 -Imprint - When Clone Shell enters the battlefield, look at the top four cards of your library, exile one face down, then put the rest on the bottom of your library in any order. -When Clone Shell dies, turn the exiled card face up. If it's a creature card, put it onto the battlefield under your control. -SOM U - -Close Quarters -{2}{R}{R} -Enchantment -Whenever a creature you control becomes blocked, Close Quarters deals 1 damage to target creature or player. -MMQ U - -Clot Sliver -{1}{B} -Creature - Sliver -1/1 -All Slivers have "{2}: Regenerate this permanent." -TMP C, H09 C - -Cloud Cover -{2}{W}{U} -Enchantment -Whenever another permanent you control becomes the target of a spell or ability an opponent controls, you may return that permanent to its owner's hand. -PLS R - -Cloud Crusader -{2}{W}{W} -Creature - Human Knight -2/3 -Flying -First strike (This creature deals combat damage before creatures without first strike.) -M11 C - -Cloud Djinn -{5}{U} -Creature - Djinn -5/4 -Flying -Cloud Djinn can block only creatures with flying. -WTH U, BTD U - -Cloud Dragon -{5}{U} -Creature - Illusion Dragon -5/4 -Flying -Cloud Dragon can block only creatures with flying. -POR R, ME4 R - -Cloud Elemental -{2}{U} -Creature - Elemental -2/3 -Flying -Cloud Elemental can block only creatures with flying. -VIS C, BTD C, 10E C, M11 C - -Cloud Key -{3} -Artifact -As Cloud Key enters the battlefield, choose artifact, creature, enchantment, instant, or sorcery. -Spells you cast of the chosen type cost {1} less to cast. -FUT R - -Cloud Pirates -{U} -Creature - Human Pirate -1/1 -Flying -Cloud Pirates can block only creatures with flying. -POR C - -Cloud Spirit -{2}{U} -Creature - Spirit -3/1 -Flying -Cloud Spirit can block only creatures with flying. -POR U, STH C, ME4 C - -Cloud Sprite -{U} -Creature - Faerie -1/1 -Flying (This creature can't be blocked except by creatures with flying or reach.) -Cloud Sprite can block only creatures with flying. -MMQ C, 10E C - -Cloud of Faeries -{1}{U} -Creature - Faerie -1/1 -Flying -When Cloud of Faeries enters the battlefield, untap up to two lands. -Cycling {2} ({2}, Discard this card: Draw a card.) -ULG C - -Cloudchaser Eagle -{3}{W} -Creature - Bird -2/2 -Flying -When Cloudchaser Eagle enters the battlefield, destroy target enchantment. -TMP C, 7ED C - -Cloudchaser Kestrel -{1}{W}{W} -Creature - Bird -2/2 -Flying -When Cloudchaser Kestrel enters the battlefield, destroy target enchantment. -{W}: Target permanent becomes white until end of turn. -TSP C - -Cloudcrest Lake -Land -{T}: Add {1} to your mana pool. -{T}: Add {W} or {U} to your mana pool. Cloudcrest Lake doesn't untap during your next untap step. -CHK U - -Cloudcrown Oak -{2}{G}{G} -Creature - Treefolk Warrior -3/4 -Reach (This can block creatures with flying.) -LRW C - -Cloudgoat Ranger -{3}{W}{W} -Creature - Giant Warrior -3/3 -When Cloudgoat Ranger enters the battlefield, put three 1/1 white Kithkin Soldier creature tokens onto the battlefield. -Tap three untapped Kithkin you control: Cloudgoat Ranger gets +2/+0 and gains flying until end of turn. -LRW U - -Cloudheath Drake -{4}{U} -Artifact Creature - Drake -3/3 -Flying -{1}{W}: Cloudheath Drake gains vigilance until end of turn. -ALA C - -Cloudhoof Kirin -{3}{U}{U} -Legendary Creature - Kirin Spirit -4/4 -Flying -Whenever you cast a Spirit or Arcane spell, you may put the top X cards of target player's library into his or her graveyard, where X is that spell's converted mana cost. -SOK R - -Cloudpost -Land - Locus -Cloudpost enters the battlefield tapped. -{T}: Add {1} to your mana pool for each Locus on the battlefield. -MRD C - -Cloudreach Cavalry -{1}{W} -Creature - Human Soldier -1/1 -As long as you control a Bird, Cloudreach Cavalry gets +2/+2 and has flying. -LGN U - -Cloudseeder -{1}{U} -Creature - Faerie Spellshaper -1/1 -Flying -{U}, {T}, Discard a card: Put a 1/1 blue Faerie creature token named Cloud Sprite onto the battlefield. It has flying and "Cloud Sprite can block only creatures with flying." -FUT U - -Cloudskate -{1}{U} -Creature - Illusion -2/2 -Flying -Fading 3 (This creature enters the battlefield with three fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.) -NEM C - -Cloudstone Curio -{3} -Artifact -Whenever a nonartifact permanent enters the battlefield under your control, you may return another permanent you control that shares a card type with it to its owner's hand. -RAV R - -Cloudthresher -{2}{G}{G}{G}{G} -Creature - Elemental -7/7 -Flash -Reach (This can block creatures with flying.) -When Cloudthresher enters the battlefield, it deals 2 damage to each creature with flying and each player. -Evoke {2}{G}{G} (You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield.) -LRW R - -Clout of the Dominus -{U/R} -Enchantment - Aura -Enchant creature -As long as enchanted creature is blue, it gets +1/+1 and has shroud. (It can't be the target of spells or abilities.) -As long as enchanted creature is red, it gets +1/+1 and has haste. -EVE C - -Cloven Casting -{5}{U}{R} -Enchantment -Whenever you cast a multicolored instant or sorcery spell, you may pay {1}. If you do, copy that spell. You may choose new targets for the copy. -ARB R - -Clutch of Undeath -{3}{B}{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets +3/+3 as long as it's a Zombie. Otherwise, it gets -3/-3. -SCG C - -Clutch of the Undercity -{1}{U}{U}{B} -Instant -Return target permanent to its owner's hand. Its controller loses 3 life. -Transmute {1}{U}{B} ({1}{U}{B}, Discard this card: Search your library for a card with the same converted mana cost as this card, reveal it, and put it into your hand. Then shuffle your library. Transmute only as a sorcery.) -RAV U - -Coal Golem -{5} -Artifact Creature - Golem -3/3 -{3}, Sacrifice Coal Golem: Add {R}{R}{R} to your mana pool. -DRK U, ME3 C - -Coal Stoker -{3}{R} -Creature - Elemental -3/3 -When Coal Stoker enters the battlefield, if you cast it from your hand, add {R}{R}{R} to your mana pool. -TSP C - -Coalhauler Swine -{4}{R}{R} -Creature - Boar Beast -4/4 -Whenever Coalhauler Swine is dealt damage, it deals that much damage to each player. -RAV C - -Coalition Flag -{W} -Enchantment - Aura -Enchant creature you control -Enchanted creature is a Flagbearer. -While choosing targets as part of casting a spell or activating an ability, your opponents must choose at least one Flagbearer on the battlefield if able. -APC U - -Coalition Honor Guard -{3}{W} -Creature - Human Flagbearer -2/4 -While choosing targets as part of casting a spell or activating an ability, your opponents must choose at least one Flagbearer on the battlefield if able. -APC C - -Coalition Relic -{3} -Artifact -{T}: Add one mana of any color to your mana pool. -{T}: Put a charge counter on Coalition Relic. -At the beginning of your precombat main phase, remove all charge counters from Coalition Relic. Add one mana of any color to your mana pool for each charge counter removed this way. -FUT R, PVC R - -Coalition Victory -{3}{W}{U}{B}{R}{G} -Sorcery -You win the game if you control a land of each basic land type and a creature of each color. -INV R, TSB S - -Coast Watcher -{1}{U} -Creature - Bird Soldier -1/1 -Flying, protection from green -SCG C - -Coastal Drake -{2}{U} -Creature - Drake -2/1 -Flying -{1}{U}, {T}: Return target Kavu to its owner's hand. -APC C - -Coastal Hornclaw -{4}{U} -Creature - Bird -3/3 -Sacrifice a land: Coastal Hornclaw gains flying until end of turn. -PCY C, 8ED C - -Coastal Piracy -{2}{U}{U} -Enchantment -Whenever a creature you control deals combat damage to an opponent, you may draw a card. -MMQ U, 8ED R - -Coastal Tower -Land -Coastal Tower enters the battlefield tapped. -{T}: Add {W} or {U} to your mana pool. -INV U, 8ED U - -Coastal Wizard -{2}{U}{U} -Creature - Human Wizard -1/1 -{T}: Return Coastal Wizard and another target creature to their owners' hands. Activate this ability only during your turn, before attackers are declared. -P02 R - -Coat of Arms -{5} -Artifact -Each creature gets +1/+1 for each other creature on the battlefield that shares at least one creature type with it. (For example, if two Goblin Warriors and a Goblin Shaman are on the battlefield, each gets +2/+2.) -EXO R, 7ED R, 8ED R, 9ED R, 10E R, M10 R, H09 R - -Cobalt Golem -{4} -Artifact Creature - Golem -2/3 -{1}{U}: Cobalt Golem gains flying until end of turn. -MRD C - -Cobra Trap -{4}{G}{G} -Instant - Trap -If a noncreature permanent under your control was destroyed this turn by a spell or ability an opponent controlled, you may pay {G} rather than pay Cobra Trap's mana cost. -Put four 1/1 green Snake creature tokens onto the battlefield. -ZEN U, COM U - -Cockatrice -{3}{G}{G} -Creature - Cockatrice -2/4 -Flying -Whenever Cockatrice blocks or becomes blocked by a non-Wall creature, destroy that creature at end of combat. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, TSB S - -Cocoon -{G} -Enchantment - Aura -Enchant creature you control -Enchanted creature doesn't untap during your untap step if Cocoon has a pupa counter on it. -When Cocoon enters the battlefield, tap enchanted creature and put three pupa counters on Cocoon. -At the beginning of your upkeep, remove a pupa counter from Cocoon. If you can't, sacrifice it, put a +1/+1 counter on enchanted creature, and that creature gains flying. (This effect lasts indefinitely.) -LEG U, CHR U - -Coercion -{2}{B} -Sorcery -Target opponent reveals his or her hand. You choose a card from it. That player discards that card. -VIS C, TMP C, P02 U, 6ED C, PTK U, S99 U, S00 C, BTD C, 8ED C, 9ED C - -Coffin Puppets -{3}{B}{B} -Creature - Zombie -3/3 -Sacrifice two lands: Return Coffin Puppets from your graveyard to the battlefield. Activate this ability only during your upkeep and only if you control a Swamp. -PCY R - -Coffin Purge -{B} -Instant -Exile target card from a graveyard. -Flashback {B} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY C - -Coffin Queen -{2}{B} -Creature - Zombie Wizard -1/1 -You may choose not to untap Coffin Queen during your untap step. -{2}{B}, {T}: Put target creature card from a graveyard onto the battlefield under your control. When Coffin Queen becomes untapped or you lose control of Coffin Queen, exile that creature. -TMP R - -Cognivore -{6}{U}{U} -Creature - Lhurgoyf -*/* -Flying -Cognivore's power and toughness are each equal to the number of instant cards in all graveyards. -ODY R - -Coiled Tinviper -{3} -Artifact Creature - Snake -2/1 -First strike -TMP C - -Coiling Oracle -{G}{U} -Creature - Snake Elf Druid -1/1 -When Coiling Oracle enters the battlefield, reveal the top card of your library. If it's a land card, put it onto the battlefield. Otherwise, put that card into your hand. -DIS C - -Coiling Woodworm -{2}{G} -Creature - Insect Worm -*/1 -Coiling Woodworm's power is equal to the number of Forests on the battlefield. -NEM U - -Coils of the Medusa -{1}{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/-1. -Sacrifice Coils of the Medusa: Destroy all non-Wall creatures blocking enchanted creature. -WTH C - -Cold Snap -{2}{W} -Enchantment -Cumulative upkeep {2} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -At the beginning of each player's upkeep, Cold Snap deals damage to that player equal to the number of snow lands he or she controls. -ICE U - -Cold Storage -{4} -Artifact -{3}: Exile target creature you control. -Sacrifice Cold Storage: Return each creature card exiled with Cold Storage to the battlefield under your control. -TMP R - -Cold-Eyed Selkie -{1}{G/U}{G/U} -Creature - Merfolk Rogue -1/1 -Islandwalk -Whenever Cold-Eyed Selkie deals combat damage to a player, you may draw that many cards. -EVE R - -Coldsteel Heart -{2} -Snow Artifact -Coldsteel Heart enters the battlefield tapped. -As Coldsteel Heart enters the battlefield, choose a color. -{T}: Add one mana of the chosen color to your mana pool. -CSP U - -Colfenor's Plans -{2}{B}{B} -Enchantment -When Colfenor's Plans enters the battlefield, exile the top seven cards of your library face down. -You may look at and play cards exiled with Colfenor's Plans. -Skip your draw step. -You can't cast more than one spell each turn. -LRW R - -Colfenor's Urn -{3} -Artifact -Whenever a creature with toughness 4 or greater is put into your graveyard from the battlefield, you may exile it. -At the beginning of the end step, if three or more cards have been exiled with Colfenor's Urn, sacrifice it. If you do, return those cards to the battlefield under their owner's control. -LRW R - -Collapsing Borders -{3}{R} -Enchantment -Domain - At the beginning of each player's upkeep, that player gains 1 life for each basic land type among lands he or she controls. Then Collapsing Borders deals 3 damage to him or her. -INV R - -Collective Restraint -{3}{U} -Enchantment -Domain - Creatures can't attack you unless their controller pays {X} for each creature he or she controls that's attacking you, where X is the number of basic land types among lands you control. -INV R - -Collective Unconscious -{4}{G}{G} -Sorcery -Draw a card for each creature you control. -MMQ R, 8ED R - -Collective Voyage -{G} -Sorcery -Join forces - Starting with you, each player may pay any amount of mana. Each player searches his or her library for up to X basic land cards, where X is the total amount of mana paid this way, puts them onto the battlefield tapped, then shuffles his or her library. -COM R - -Colos Yearling -{2}{R} -Creature - Goat Beast -1/1 -Mountainwalk -{R}: Colos Yearling gets +1/+0 until end of turn. -UDS C - -Colossal Might -{R}{G} -Instant -Target creature gets +4/+2 and gains trample until end of turn. -ARB C, ARC C, COM C - -Colossus of Sardia -{9} -Artifact Creature - Golem -9/9 -Trample (If this creature would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.) -Colossus of Sardia doesn't untap during your untap step. -{9}: Untap Colossus of Sardia. Activate this ability only during your upkeep. -ATQ R, 4ED R, 5ED R, 10E R, ME4 R - -Coma Veil -{4}{U} -Enchantment - Aura -Enchant artifact or creature -Enchanted permanent doesn't untap during its controller's untap step. -ALA C - -Combat Medic -{2}{W} -Creature - Human Cleric Soldier -0/2 -{1}{W}: Prevent the next 1 damage that would be dealt to target creature or player this turn. -FEM C (x4), ME2 C - -Combust -{1}{R} -Instant -Combust can't be countered by spells or abilities. -Combust deals 5 damage to target white or blue creature. The damage can't be prevented. -M11 U, M12 U - -Comet Storm -{X}{R}{R} -Instant -Multikicker {1} (You may pay an additional {1} any number of times as you cast this spell.) -Choose target creature or player, then choose another target creature or player for each time Comet Storm was kicked. Comet Storm deals X damage to each of them. -WWK M, COM M - -Command Tower -Land -{T}: Add to your mana pool one mana of any color in your commander's color identity. -COM C - -Command of Unsummoning -{2}{U} -Instant -Cast Command of Unsummoning only during the declare attackers step and only if you've been attacked this step. -Return one or two target attacking creatures to their owner's hand. -POR U - -Commandeer -{5}{U}{U} -Instant -You may exile two blue cards from your hand rather than pay Commandeer's mana cost. -Gain control of target noncreature spell. You may choose new targets for it. (If that spell is an artifact, enchantment, or planeswalker, the permanent enters the battlefield under your control.) -CSP R - -Commander Eesha -{2}{W}{W} -Legendary Creature - Bird Soldier -2/4 -Flying, protection from creatures -JUD R - -Commander Greven il-Vec -{3}{B}{B}{B} -Legendary Creature - Human Warrior -7/5 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -When Commander Greven il-Vec enters the battlefield, sacrifice a creature. -TMP R - -Commando Raid -{2}{R} -Instant -Until end of turn, target creature you control gains "When this creature deals combat damage to a player, you may have it deal damage equal to its power to target creature that player controls." -ONS U - -Common Cause -{2}{W} -Enchantment -Nonartifact creatures get +2/+2 as long as they all share a color. -MMQ R - -Commune with Nature -{G} -Sorcery -Look at the top five cards of your library. You may reveal a creature card from among them and put it into your hand. Put the rest on the bottom of your library in any order. -CHK C, 10E C - -Complex Automaton -{4} -Artifact Creature - Golem -4/4 -At the beginning of your upkeep, if you control seven or more permanents, return Complex Automaton to its owner's hand. -NEM R - -Complicate -{2}{U} -Instant -Counter target spell unless its controller pays {3}. -Cycling {2}{U} ({2}{U}, Discard this card: Draw a card.) -When you cycle Complicate, you may counter target spell unless its controller pays {1}. -ONS U - -Composite Golem -{6} -Artifact Creature - Golem -4/4 -Sacrifice Composite Golem: Add {W}{U}{B}{R}{G} to your mana pool. -5DN U, 10E U - -Compost -{1}{G} -Enchantment -Whenever a black card is put into an opponent's graveyard from anywhere, you may draw a card. -UDS U, 7ED U - -Compulsion -{1}{U} -Enchantment -{1}{U}, Discard a card: Draw a card. -{1}{U}, Sacrifice Compulsion: Draw a card. -TOR U - -Compulsive Research -{2}{U} -Sorcery -Target player draws three cards. Then that player discards two cards unless he or she discards a land card. -RAV C - -Concentrate -{2}{U}{U} -Sorcery -Draw three cards. -ODY U, 8ED U - -Concerted Effort -{2}{W}{W} -Enchantment -At the beginning of each upkeep, all creatures you control gain flying until end of turn if a creature you control has flying. The same is true for fear, first strike, double strike, landwalk, protection, trample, and vigilance. -RAV R - -Conch Horn -{2} -Artifact -{1}, {T}, Sacrifice Conch Horn: Draw two cards, then put a card from your hand on top of your library. -FEM R - -Conclave Equenaut -{4}{W}{W} -Creature - Human Soldier -3/3 -Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.) -Flying -RAV C, EVT C - -Conclave Phalanx -{4}{W} -Creature - Human Soldier -2/4 -Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.) -When Conclave Phalanx enters the battlefield, you gain 1 life for each creature you control. -RAV U, EVT U - -Conclave's Blessing -{3}{W} -Enchantment - Aura -Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.) -Enchant creature -Enchanted creature gets +0/+2 for each other creature you control. -RAV C - -Concordant Crossroads -{G} -World Enchantment -All creatures have haste. -LEG R, CHR R, ME3 R - -Concussive Bolt -{3}{R}{R} -Sorcery -Concussive Bolt deals 4 damage to target player. -Metalcraft - If you control three or more artifacts, creatures that player controls can't block this turn. -MBS C - -Condemn -{W} -Instant -Put target attacking creature on the bottom of its owner's library. Its controller gains life equal to its toughness. -DIS U, 10E U, M11 U - -Condescend -{X}{U} -Instant -Counter target spell unless its controller pays {X}. -Scry 2. (To scry 2, look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) -5DN C, JVC C - -Cone of Flame -{3}{R}{R} -Sorcery -Cone of Flame deals 1 damage to target creature or player, 2 damage to another target creature or player, and 3 damage to a third target creature or player. -WTH U, 10E U, JVC U, HOP U, DDG U - -Confessor -{W} -Creature - Human Cleric -1/1 -Whenever a player discards a card, you may gain 1 life. -ODY C - -Confiscate -{4}{U}{U} -Enchantment - Aura -Enchant permanent (Target a permanent as you cast this. This card enters the battlefield attached to that permanent.) -You control enchanted permanent. -USG U, 7ED U, 8ED U, 9ED U - -Conflagrate -{X}{X}{R} -Sorcery -Conflagrate deals X damage divided as you choose among any number of target creatures and/or players. -Flashback-{R}{R}, Discard X cards. (You may cast this card from your graveyard for its flashback cost. Then exile it.) -TSP U - -Conflux -{3}{W}{U}{B}{R}{G} -Sorcery -Search your library for a white card, a blue card, a black card, a red card, and a green card. Reveal those cards and put them into your hand. Then shuffle your library. -CON M - -Confound -{1}{U} -Instant -Counter target spell that targets one or more creatures. -Draw a card. -PLS C - -Confusion in the Ranks -{3}{R}{R} -Enchantment -Whenever an artifact, creature, or enchantment enters the battlefield, its controller chooses target permanent another player controls that shares a card type with it. Exchange control of those permanents. -MRD R - -Congregate -{3}{W} -Instant -Target player gains 2 life for each creature on the battlefield. -USG C, HOP C, COM C - -Congregation at Dawn -{G}{G}{W} -Instant -Search your library for up to three creature cards and reveal them. Shuffle your library, then put those cards on top of it in any order. -RAV U - -Conjurer's Ban -{W}{B} -Sorcery -Name a card. Until your next turn, the named card can't be played. -Draw a card. -GPT U - -Conjurer's Bauble -{1} -Artifact -{T}, Sacrifice Conjurer's Bauble: Put up to one target card from your graveyard on the bottom of your library. Draw a card. -5DN C - -Conquer -{3}{R}{R} -Enchantment - Aura -Enchant land -You control enchanted land. -ICE U, 5ED U, 6ED U, ME2 U - -Conquering Manticore -{4}{R}{R} -Creature - Manticore -5/5 -Flying -When Conquering Manticore enters the battlefield, gain control of target creature an opponent controls until end of turn. Untap that creature. It gains haste until end of turn. -ROE R - -Conqueror's Pledge -{2}{W}{W}{W} -Sorcery -Kicker {6} (You may pay an additional {6} as you cast this spell.) -Put six 1/1 white Kor Soldier creature tokens onto the battlefield. If Conqueror's Pledge was kicked, put twelve of those tokens onto the battlefield instead. -ZEN R - -Consecrate Land -{W} -Enchantment - Aura -Enchant land -Enchanted land is indestructible and can't be enchanted by other Auras. -LEA U, LEB U, 2ED U, TSB S - -Consecrated Sphinx -{4}{U}{U} -Creature - Sphinx -4/6 -Flying -Whenever an opponent draws a card, you may draw two cards. -MBS M - -Conservator -{4} -Artifact -{3}, {T}: Prevent the next 2 damage that would be dealt to you this turn. -LEA U, LEB U, 2ED U, 3ED U, 4ED U - -Consign to Dream -{2}{U} -Instant -Return target permanent to its owner's hand. If that permanent is red or green, put it on top of its owner's library instead. -SHM C - -Conspiracy -{3}{B}{B} -Enchantment -As Conspiracy enters the battlefield, choose a creature type. -Creature cards you own that aren't on the battlefield, creature spells you control, and creatures you control are the chosen type. -MMQ R, TSB S - -Constant Mists -{1}{G} -Instant -Buyback-Sacrifice a land. (You may sacrifice a land in addition to any other costs as you cast this spell. If you do, put this card into your hand as it resolves.) -Prevent all combat damage that would be dealt this turn. -STH U - -Constricting Tendrils -{U} -Instant -Target creature gets -3/-0 until end of turn. -Cycling {2} ({2}, Discard this card: Draw a card.) -CON C - -Consult the Necrosages -{1}{U}{B} -Sorcery -Choose one - Target player draws two cards; or target player discards two cards. -RAV C - -Consume Spirit -{X}{1}{B} -Sorcery -Spend only black mana on X. -Consume Spirit deals X damage to target creature or player and you gain X life. -MRD C, 9ED U, 10E U, DVD U, M10 U, HOP U, M12 U - -Consume Strength -{1}{B}{G} -Instant -Target creature gets +2/+2 until end of turn. Another target creature gets -2/-2 until end of turn. -APC C - -Consume the Meek -{3}{B}{B} -Instant -Destroy each creature with converted mana cost 3 or less. They can't be regenerated. -ROE R - -Consuming Bonfire -{3}{R}{R} -Tribal Sorcery - Elemental -Choose one - Consuming Bonfire deals 4 damage to target non-Elemental creature; or Consuming Bonfire deals 7 damage to target Treefolk creature. -LRW C - -Consuming Ferocity -{1}{R} -Enchantment - Aura -Enchant non-Wall creature -Enchanted creature gets +1/+0. -At the beginning of your upkeep, put a +1/+0 counter on enchanted creature. If that creature has three or more +1/+0 counters on it, it deals damage equal to its power to its controller, then destroy that creature and it can't be regenerated. -MIR U - -Consuming Vapors -{3}{B} -Sorcery -Target player sacrifices a creature. You gain life equal to that creature's toughness. -Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -ROE R - -Consuming Vortex -{1}{U} -Instant - Arcane -Return target creature to its owner's hand. -Splice onto Arcane {3}{U} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -CHK C - -Consumptive Goo -{B}{B} -Creature - Ooze -1/1 -{2}{B}{B}: Target creature gets -1/-1 until end of turn. Put a +1/+1 counter on Consumptive Goo. -SCG R - -Contagion -{3}{B}{B} -Instant -You may pay 1 life and exile a black card from your hand rather than pay Contagion's mana cost. -Distribute two -2/-1 counters among one or two target creatures. -ALL U, MED R - -Contagion Clasp -{2} -Artifact -When Contagion Clasp enters the battlefield, put a -1/-1 counter on target creature. -{4}, {T}: Proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.) -EVT U, SOM U - -Contagion Engine -{6} -Artifact -When Contagion Engine enters the battlefield, put a -1/-1 counter on each creature target player controls. -{4}, {T}: Proliferate, then proliferate again. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there. Then do it again.) -SOM R - -Contagious Nim -{2}{B} -Creature - Zombie -2/2 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -SOM C - -Contaminated Bond -{1}{B} -Enchantment - Aura -Enchant creature (Target a creature as you cast this. This card enters the battlefield attached to that creature.) -Whenever enchanted creature attacks or blocks, its controller loses 3 life. -MRD C, 9ED C, 10E C - -Contaminated Ground -{1}{B} -Enchantment - Aura -Enchant land -Enchanted land is a Swamp. -Whenever enchanted land becomes tapped, its controller loses 2 life. -ROE C - -Contamination -{2}{B} -Enchantment -At the beginning of your upkeep, sacrifice Contamination unless you sacrifice a creature. -If a land is tapped for mana, it produces {B} instead of any other type and amount. -USG R - -Contemplation -{1}{W}{W} -Enchantment -Whenever you cast a spell, you gain 1 life. -STH U - -Contempt -{1}{U} -Enchantment - Aura -Enchant creature -Whenever enchanted creature attacks, return it and Contempt to their owners' hands at end of combat. -STH C - -Contested Cliffs -Land -{T}: Add {1} to your mana pool. -{R}{G}, {T}: Choose target Beast creature you control and target creature an opponent controls. Each of those creatures deals damage equal to its power to the other. -ONS R - -Contested War Zone -Land -Whenever a creature deals combat damage to you, that creature's controller gains control of Contested War Zone. -{T}: Add {1} to your mana pool. -{1}, {T}: Attacking creatures get +1/+0 until end of turn. -MBS R - -Contract from Below -{B} -Sorcery -Remove Contract from Below from your deck before playing if you're not playing for ante. -Discard your hand, add the top card of your library to the ante, then draw seven cards. -LEA R, LEB R, 2ED R, 3ED R - -Control Magic -{2}{U}{U} -Enchantment - Aura -Enchant creature -You control enchanted creature. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, BRB U, ME4 R - -Control of the Court -{1}{R} -Sorcery -Draw four cards, then discard three cards at random. -PTK U - -Controlled Instincts -{U} -Enchantment - Aura -Enchant red or green creature -Enchanted creature doesn't untap during its controller's untap step. -CON U - -Controvert -{2}{U}{U} -Instant -Counter target spell. -Recover {2}{U}{U} (When a creature is put into your graveyard from the battlefield, you may pay {2}{U}{U}. If you do, return this card from your graveyard to your hand. Otherwise, exile this card.) -CSP U - -Conundrum Sphinx -{2}{U}{U} -Creature - Sphinx -4/4 -Flying -Whenever Conundrum Sphinx attacks, each player names a card. Then each player reveals the top card of his or her library. If the card a player revealed is the card he or she named, that player puts it into his or her hand. If it's not, that player puts it on the bottom of his or her library. -M11 R, COM R - -Convalescence -{1}{W} -Enchantment -At the beginning of your upkeep, if you have 10 or less life, you gain 1 life. -EXO R - -Convalescent Care -{1}{W}{W} -Enchantment -At the beginning of your upkeep, if you have 5 or less life, you gain 3 life and draw a card. -ONS R - -Conversion -{2}{W}{W} -Enchantment -At the beginning of your upkeep, sacrifice Conversion unless you pay {W}{W}. -All Mountains are Plains. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, ME4 R - -Conversion Chamber -{3} -Artifact -{2}, {T}: Exile target artifact card from a graveyard. Put a charge counter on Conversion Chamber. -{2}, {T}, Remove a charge counter from Conversion Chamber: Put a 3/3 colorless Golem artifact creature token onto the battlefield. -NPH U - -Conviction -{1}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+3. -{W}: Return Conviction to its owner's hand. -STH C - -Convincing Mirage -{1}{U} -Enchantment - Aura -Enchant land -As Convincing Mirage enters the battlefield, choose a basic land type. -Enchanted land is the chosen type. -M10 C - -Convolute -{2}{U} -Instant -Counter target spell unless its controller pays {4}. -RAV C - -Convulsing Licid -{2}{R} -Creature - Licid -2/2 -{R}, {T}: Convulsing Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {R} to end this effect. -Enchanted creature can't block. -STH U - -Cooperation -{2}{W} -Enchantment - Aura -Enchant creature -Enchanted creature has banding. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding a player controls are blocking or being blocked by a creature, that player divides that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -ICE C - -Coordinated Barrage -{W} -Instant -Choose a creature type. Coordinated Barrage deals damage to target attacking or blocking creature equal to the number of permanents you control of the chosen type. -MOR C - -Copper Carapace -{1} -Artifact - Equipment -Equipped creature gets +2/+2 and can't block. -Equip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) -MBS C - -Copper Gnomes -{2} -Artifact Creature - Gnome -1/1 -{4}, Sacrifice Copper Gnomes: You may put an artifact card from your hand onto the battlefield. -USG R - -Copper Myr -{2} -Artifact Creature - Myr -1/1 -{T}: Add {G} to your mana pool. -MRD C, HOP C, SOM C - -Copper Tablet -{2} -Artifact -At the beginning of each player's upkeep, Copper Tablet deals 1 damage to that player. -LEA U, LEB U, 2ED U, MED U - -Copper-Leaf Angel -{5} -Artifact Creature - Angel -2/2 -Flying -{T}, Sacrifice X lands: Put X +1/+1 counters on Copper-Leaf Angel. -PCY R - -Copperhoof Vorrac -{3}{G}{G} -Creature - Boar Beast -2/2 -Copperhoof Vorrac gets +1/+1 for each untapped permanent your opponents control. -MRD R - -Copperhorn Scout -{G} -Creature - Elf Scout -1/1 -Whenever Copperhorn Scout attacks, untap each other creature you control. -SOM C - -Copperline Gorge -Land -Copperline Gorge enters the battlefield tapped unless you control two or fewer other lands. -{T}: Add {R} or {G} to your mana pool. -SOM R - -Copy Artifact -{1}{U} -Enchantment -You may have Copy Artifact enter the battlefield as a copy of any artifact on the battlefield, except it's an enchantment in addition to its other types. -LEA R, LEB R, 2ED R, 3ED R, ME4 R - -Copy Enchantment -{2}{U} -Enchantment -You may have Copy Enchantment enter the battlefield as a copy of any enchantment on the battlefield. -RAV R - -Coral Atoll -Land -Coral Atoll enters the battlefield tapped. -When Coral Atoll enters the battlefield, sacrifice it unless you return an untapped Island you control to its owner's hand. -{T}: Add {1}{U} to your mana pool. -VIS U - -Coral Eel -{1}{U} -Creature - Fish -2/1 -POR C, S99 C, 8ED C, 9ED C - -Coral Fighters -{1}{U} -Creature - Merfolk Soldier -1/1 -Whenever Coral Fighters attacks and isn't blocked, look at the top card of defending player's library. You may put that card on the bottom of that player's library. -MIR U - -Coral Helm -{3} -Artifact -{3}, Discard a card at random: Target creature gets +2/+2 until end of turn. -ATQ R, 4ED R, 5ED R, ME4 U - -Coral Merfolk -{1}{U} -Creature - Merfolk -2/1 -USG C, 7ED C, M10 C, M12 C - -Coral Net -{U} -Enchantment - Aura -Enchant green or white creature -Enchanted creature has "At the beginning of your upkeep, sacrifice this creature unless you discard a card." -TOR C - -Coral Reef -{U}{U} -Enchantment -Coral Reef enters the battlefield with four polyp counters on it. -Sacrifice an Island: Put two polyp counters on Coral Reef. -{U}, Tap an untapped blue creature you control, Remove a polyp counter from Coral Reef: Put a +0/+1 counter on target creature. -HML C - -Coral Trickster -{1}{U} -Creature - Merfolk Rogue -2/1 -Morph {U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Coral Trickster is turned face up, you may tap or untap target permanent. -TSP C - -Coralhelm Commander -{U}{U} -Creature - Merfolk Soldier -2/2 -Level up {1} ({1}: Put a level counter on this. Level up only as a sorcery.) -LEVEL 2-3 -3/3 -Flying -LEVEL 4+ -4/4 -Flying -Other Merfolk creatures you control get +1/+1. -ROE R - -Core Prowler -{4} -Artifact Creature - Horror -2/2 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -When Core Prowler dies, proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.) -MBS U - -Coretapper -{2} -Artifact Creature - Myr -1/1 -{T}: Put a charge counter on target artifact. -Sacrifice Coretapper: Put two charge counters on target artifact. -DST U - -Cornered Market -{2}{W} -Enchantment -Players can't cast spells with the same name as a nontoken permanent. -Players can't play nonbasic lands with the same name as a nontoken permanent. -MMQ R - -Corpse Connoisseur -{4}{B} -Creature - Zombie Wizard -3/3 -When Corpse Connoisseur enters the battlefield, you may search your library for a creature card and put that card into your graveyard. If you do, shuffle your library. -Unearth {3}{B} ({3}{B}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) -ALA U, ARC U - -Corpse Cur -{4} -Artifact Creature - Hound -2/2 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -When Corpse Cur enters the battlefield, you may return target creature card with infect from your graveyard to your hand. -SOM C - -Corpse Dance -{2}{B} -Instant -Buyback {2} (You may pay an additional {2} as you cast this spell. If you do, put this card into your hand as it resolves.) -Return the top creature card of your graveyard to the battlefield. That creature gains haste until end of turn. Exile it at the beginning of the next end step. -TMP R - -Corpse Harvester -{3}{B}{B} -Creature - Zombie Wizard -3/3 -{1}{B}, {T}, Sacrifice a creature: Search your library for a Zombie card and a Swamp card, reveal them, and put them into your hand. Then shuffle your library. -LGN U, HOP U - -Corpsehatch -{3}{B}{B} -Sorcery -Destroy target nonblack creature. Put two 0/1 colorless Eldrazi Spawn creature tokens onto the battlefield. They have "Sacrifice this creature: Add {1} to your mana pool." -ROE U - -Corpulent Corpse -{5}{B} -Creature - Zombie -3/3 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -Suspend 5-{B} (Rather than cast this card from your hand, you may pay {B} and exile it with five time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -TSP C - -Corrosion -{1}{B}{R} -Enchantment -Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -At the beginning of your upkeep, put a rust counter on each artifact target opponent controls. Then destroy each artifact with converted mana cost less than or equal to the number of rust counters on it. Artifacts destroyed this way can't be regenerated. -When Corrosion leaves the battlefield, remove all rust counters from all permanents. -VIS R - -Corrosive Gale -{X}{G/P} -Sorcery -({G/P} can be paid with either {G} or 2 life.) -Corrosive Gale deals X damage to each creature with flying. -NPH U - -Corrosive Mentor -{2}{B} -Creature - Elemental Rogue -1/3 -Black creatures you control have wither. (They deal damage to creatures in the form of -1/-1 counters.) -SHM U - -Corrupt -{5}{B} -Sorcery -Corrupt deals damage equal to the number of Swamps you control to target creature or player. You gain life equal to the damage dealt this way. -USG C, 7ED C, SHM U, DVD U, GVL U, M11 U - -Corrupt Court Official -{1}{B} -Creature - Human Advisor -1/1 -When Corrupt Court Official enters the battlefield, target opponent discards a card. -PTK U - -Corrupt Eunuchs -{3}{R} -Creature - Human Advisor -2/2 -When Corrupt Eunuchs enters the battlefield, it deals 2 damage to target creature. -PTK U, ME3 U - -Corrupt Official -{4}{B} -Creature - Human Minion -3/1 -{2}{B}: Regenerate Corrupt Official. -Whenever Corrupt Official becomes blocked, defending player discards a card at random. -MMQ R - -Corrupted Conscience -{3}{U}{U} -Enchantment - Aura -Enchant creature -You control enchanted creature. -Enchanted creature has infect. (It deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -MBS U - -Corrupted Harvester -{4}{B}{B} -Creature - Horror -6/3 -{B}, Sacrifice a creature: Regenerate Corrupted Harvester. -SOM U - -Corrupted Resolve -{1}{U} -Instant -Counter target spell if its controller is poisoned. -NPH U - -Corrupted Roots -{B} -Enchantment - Aura -Enchant Forest or Plains -Whenever enchanted land becomes tapped, its controller loses 2 life. -CON U - -Corrupted Zendikon -{1}{B} -Enchantment - Aura -Enchant land -Enchanted land is a 3/3 black Ooze creature. It's still a land. -When enchanted land dies, return that card to its owner's hand. -WWK C - -Corrupting Licid -{2}{B} -Creature - Licid -2/2 -{B}, {T}: Corrupting Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {B} to end this effect. -Enchanted creature has fear. (It can't be blocked except by artifact creatures and/or black creatures.) -STH U - -Cosi's Ravager -{3}{R} -Creature - Elemental -2/2 -Landfall - Whenever a land enters the battlefield under your control, you may have Cosi's Ravager deal 1 damage to target player. -WWK C - -Cosi's Trickster -{U} -Creature - Merfolk Wizard -1/1 -Whenever an opponent shuffles his or her library, you may put a +1/+1 counter on Cosi's Trickster. -ZEN R - -Cosmic Horror -{3}{B}{B}{B} -Creature - Horror -7/7 -First strike -At the beginning of your upkeep, destroy Cosmic Horror unless you pay {3}{B}{B}{B}. If Cosmic Horror is destroyed this way, it deals 7 damage to you. -LEG R, 4ED R, ME3 R - -Cosmic Larva -{1}{R}{R} -Creature - Beast -7/6 -Trample -At the beginning of your upkeep, sacrifice Cosmic Larva unless you sacrifice two lands. -5DN R - -Council of Advisors -{2}{U} -Creature - Human Advisor -1/1 -When Council of Advisors enters the battlefield, draw a card. -PTK U - -Counsel of the Soratami -{2}{U} -Sorcery -Draw two cards. -CHK C, 9ED C, 10E C - -Counterbalance -{U}{U} -Enchantment -Whenever an opponent casts a spell, you may reveal the top card of your library. If you do, counter that spell if it has the same converted mana cost as the revealed card. -CSP U - -Counterbore -{3}{U}{U} -Instant -Counter target spell. Search its controller's graveyard, hand, and library for all cards with the same name as that spell and exile them. Then that player shuffles his or her library. -SHM R - -Counterintelligence -{2}{U}{U} -Sorcery -Return one or two target creatures to their owners' hands. -PTK U - -Counterspell -{U}{U} -Instant -Counter target spell. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, ICE C, 5ED C, TMP C, 6ED C, S99 U, MMQ C, BRB C, S00 C, BTD C, 7ED C, ME2 U, JVC C, ME4 C - -Countersquall -{U}{B} -Instant -Counter target noncreature spell. Its controller loses 2 life. -CON U - -Countryside Crusher -{1}{R}{R} -Creature - Giant Warrior -3/3 -At the beginning of your upkeep, reveal the top card of your library. If it's a land card, put it into your graveyard and repeat this process. -Whenever a land card is put into your graveyard from anywhere, put a +1/+1 counter on Countryside Crusher. -MOR R - -Courier Hawk -{1}{W} -Creature - Bird -1/2 -Flying, vigilance -RAV C - -Courier's Capsule -{1}{U} -Artifact -{1}{U}, {T}, Sacrifice Courier's Capsule: Draw two cards. -ALA C - -Court Archers -{2}{G} -Creature - Human Archer -1/3 -Reach (This can block creatures with flying.) -Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.) -ALA C - -Court Homunculus -{W} -Artifact Creature - Homunculus -1/1 -Court Homunculus gets +1/+1 as long as you control another artifact. -CON C - -Court Hussar -{2}{U} -Creature - Vedalken Knight -1/3 -Vigilance -When Court Hussar enters the battlefield, look at the top three cards of your library, then put one of them into your hand and the rest on the bottom of your library in any order. -When Court Hussar enters the battlefield, sacrifice it unless {W} was spent to cast it. -DIS U, COM U - -Covenant of Minds -{4}{U} -Sorcery -Reveal the top three cards of your library. Target opponent may choose to put those cards into your hand. If he or she doesn't, put those cards into your graveyard and draw five cards. -ALA R - -Cover of Darkness -{1}{B} -Enchantment -As Cover of Darkness enters the battlefield, choose a creature type. -Creatures of the chosen type have fear. (They can't be blocked except by artifact creatures and/or black creatures.) -ONS R - -Cover of Winter -{2}{W} -Snow Enchantment -Cumulative upkeep {S} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it. {S} can be paid with one mana from a snow permanent.) -If a creature would deal combat damage to you and/or one or more creatures you control, prevent X of that damage, where X is the number of age counters on Cover of Winter. -{S}: Put an age counter on Cover of Winter. -CSP R - -Covert Operative -{4}{U} -Creature - Human Wizard -3/2 -Covert Operative is unblockable. -LGN C - -Covetous Dragon -{4}{R} -Creature - Dragon -6/5 -Flying -When you control no artifacts, sacrifice Covetous Dragon. -UDS R - -Cowardice -{3}{U}{U} -Enchantment -Whenever a creature becomes the target of a spell or ability, return that creature to its owner's hand. (It won't be affected by the spell or ability.) -MMQ R, 8ED R, 9ED R - -Cowed by Wisdom -{W} -Enchantment - Aura -Enchant creature -Enchanted creature can't attack or block unless its controller pays {1} for each card in your hand. -SOK C - -Crab Umbra -{U} -Enchantment - Aura -Enchant creature -{2}{U}: Untap enchanted creature. -Totem armor (If enchanted creature would be destroyed, instead remove all damage from it and destroy this Aura.) -ROE U - -Crabapple Cohort -{4}{G} -Creature - Treefolk Warrior -4/4 -Crabapple Cohort gets +1/+1 as long as you control another green creature. -SHM C - -Crack the Earth -{R} -Sorcery - Arcane -Each player sacrifices a permanent. -BOK C - -Crackdown -{2}{W} -Enchantment -Nonwhite creatures with power 3 or greater don't untap during their controllers' untap steps. -MMQ R - -Crackleburr -{1}{U/R}{U/R} -Creature - Elemental -2/2 -{U/R}{U/R}, {T}, Tap two untapped red creatures you control: Crackleburr deals 3 damage to target creature or player. -{U/R}{U/R}, {Q}, Untap two tapped blue creatures you control: Return target creature to its owner's hand. ({Q} is the untap symbol.) -EVE R - -Crackling Club -{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+0. -Sacrifice Crackling Club: Crackling Club deals 1 damage to target creature. -TOR C - -Cradle Guard -{1}{G}{G} -Creature - Treefolk -4/4 -Trample -Echo {1}{G}{G} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -USG U - -Cradle of Vitality -{3}{W} -Enchantment -Whenever you gain life, you may pay {1}{W}. If you do, put a +1/+1 counter on target creature for each 1 life you gained. -ALA R - -Cradle to Grave -{1}{B} -Instant -Destroy target nonblack creature that entered the battlefield this turn. -PLC C - -Crafty Pathmage -{2}{U} -Creature - Human Wizard -1/1 -{T}: Target creature with power 2 or less is unblockable this turn. -ONS C, 9ED C, 10E C - -Crag Puca -{U/R}{U/R}{U/R} -Creature - Shapeshifter -2/4 -{U/R}: Switch Crag Puca's power and toughness until end of turn. -EVE U - -Crag Saurian -{R}{R}{R} -Creature - Lizard -4/4 -Whenever a source deals damage to Crag Saurian, that source's controller gains control of Crag Saurian. -MMQ R - -Cragganwick Cremator -{2}{R}{R} -Creature - Giant Shaman -5/4 -When Cragganwick Cremator enters the battlefield, discard a card at random. If you discard a creature card this way, Cragganwick Cremator deals damage equal to that card's power to target player. -SHM R - -Cranial Extraction -{3}{B} -Sorcery - Arcane -Name a nonland card. Search target player's graveyard, hand, and library for all cards with that name and exile them. Then that player shuffles his or her library. -CHK R - -Cranial Plating -{2} -Artifact - Equipment -Equipped creature gets +1/+0 for each artifact you control. -{B}{B}: Attach Cranial Plating to target creature you control. -Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) -5DN C, HOP C - -Crash -{2}{R} -Instant -You may sacrifice a Mountain rather than pay Crash's mana cost. -Destroy target artifact. -MMQ C - -Crash Landing -{2}{G} -Instant -Target creature with flying loses flying until end of turn. Crash Landing deals damage to that creature equal to the number of Forests you control. -GPT U - -Crash of Rhinos -{6}{G}{G} -Creature - Rhino -8/4 -Trample -MIR C, BTD C - -Crashing Boars -{3}{G}{G} -Creature - Boar -4/4 -Whenever Crashing Boars attacks, defending player chooses an untapped creature he or she controls. That creature blocks Crashing Boars this turn if able. -EXO U, BTD U - -Crashing Centaur -{4}{G}{G} -Creature - Centaur -3/4 -{G}, Discard a card: Crashing Centaur gains trample until end of turn. -Threshold - As long as seven or more cards are in your graveyard, Crashing Centaur gets +2/+2 and has shroud. (It can't be the target of spells or abilities.) -ODY U - -Crater Hellion -{4}{R}{R} -Creature - Hellion Beast -6/6 -Echo {4}{R}{R} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -When Crater Hellion enters the battlefield, it deals 4 damage to each other creature. -USG R - -Craven Giant -{2}{R} -Creature - Giant -4/1 -Craven Giant can't block. -POR C, STH C - -Craven Knight -{1}{B} -Creature - Human Knight -2/2 -Craven Knight can't block. -POR C - -Craw Giant -{3}{G}{G}{G}{G} -Creature - Giant -6/4 -Trample -Rampage 2 (Whenever this creature becomes blocked, it gets +2/+2 until end of turn for each creature blocking it beyond the first.) -LEG U, CHR U, 5ED U, TSB S - -Craw Wurm -{4}{G}{G} -Creature - Wurm -6/4 -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, 8ED C, 9ED C, 10E C, M10 C - -Crawling Filth -{5}{B} -Creature - Spirit -2/2 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -Soulshift 5 (When this creature dies, you may return target Spirit card with converted mana cost 5 or less from your graveyard to your hand.) -BOK C - -Crawlspace -{3} -Artifact -No more than two creatures can attack you each combat. -ULG R - -Crazed Armodon -{2}{G}{G} -Creature - Elephant -3/3 -{G}: Crazed Armodon gets +3/+0 and gains trample until end of turn. Destroy Crazed Armodon at the beginning of the next end step. Activate this ability only once each turn. -TMP R - -Crazed Firecat -{5}{R}{R} -Creature - Elemental Cat -4/4 -When Crazed Firecat enters the battlefield, flip a coin until you lose a flip. Put a +1/+1 counter on Crazed Firecat for each flip you win. -TOR U - -Crazed Goblin -{R} -Creature - Goblin Warrior -1/1 -Crazed Goblin attacks each turn if able. -DST C - -Crazed Skirge -{3}{B} -Creature - Imp -2/2 -Flying, haste -USG U, BRB U - -Creakwood Ghoul -{4}{B} -Creature - Plant Zombie -3/3 -{B/G}{B/G}: Exile target card from a graveyard. You gain 1 life. -EVE U - -Creakwood Liege -{1}{B/G}{B/G}{B/G} -Creature - Horror -2/2 -Other black creatures you control get +1/+1. -Other green creatures you control get +1/+1. -At the beginning of your upkeep, you may put a 1/1 black and green Worm creature token onto the battlefield. -EVE R - -Cream of the Crop -{1}{G} -Enchantment -Whenever a creature enters the battlefield under your control, you may look at the top X cards of your library, where X is that creature's power. If you do, put one of those cards on top of your library and the rest on the bottom of your library in any order. -MOR R - -Creature Bond -{1}{U} -Enchantment - Aura -Enchant creature -When enchanted creature dies, Creature Bond deals damage equal to that creature's toughness to the creature's controller. -LEA C, LEB C, 2ED C, 3ED C, 4ED C - -Credit Voucher -{2} -Artifact -{2}, {T}, Sacrifice Credit Voucher: Shuffle any number of cards from your hand into your library, then draw that many cards. -MMQ U - -Creeping Corrosion -{2}{G}{G} -Sorcery -Destroy all artifacts. -MBS R - -Creeping Mold -{2}{G}{G} -Sorcery -Destroy target artifact, enchantment, or land. -VIS U, 6ED U, 7ED U, 8ED U, MRD U, 9ED U, 10E U - -Creeping Tar Pit -Land -Creeping Tar Pit enters the battlefield tapped. -{T}: Add {U} or {B} to your mana pool. -{1}{U}{B}: Until end of turn, Creeping Tar Pit becomes a 3/2 blue and black Elemental creature and is unblockable. It's still a land. -WWK R - -Cremate -{B} -Instant -Exile target card from a graveyard. -Draw a card. -INV U, GPT C - -Crenellated Wall -{4} -Artifact Creature - Wall -0/4 -Defender (This creature can't attack.) -{T}: Target creature gets +0/+4 until end of turn. -MMQ U - -Crescendo of War -{3}{W} -Enchantment -At the beginning of each upkeep, put a strife counter on Crescendo of War. -Attacking creatures get +1/+0 for each strife counter on Crescendo of War. -Blocking creatures you control get +1/+0 for each strife counter on Crescendo of War. -COM R - -Crested Craghorn -{4}{R} -Creature - Goat Beast -4/1 -Haste -Provoke (When this attacks, you may have target creature defending player controls untap and block it if able.) -LGN C - -Crevasse -{2}{R} -Enchantment -Creatures with mountainwalk can be blocked as though they didn't have mountainwalk. -LEG U - -Crib Swap -{2}{W} -Tribal Instant - Shapeshifter -Changeling (This card is every creature type at all times.) -Exile target creature. Its controller puts a 1/1 colorless Shapeshifter creature token with changeling onto the battlefield. -LRW U - -Crime -{3}{W}{B} -Sorcery -Put target creature or enchantment card from an opponent's graveyard onto the battlefield under your control. ----- -Punishment -{X}{B}{G} -Sorcery -Destroy each artifact, creature, and enchantment with converted mana cost X. -DIS R - -Crimson Acolyte -{1}{W} -Creature - Human Cleric -1/1 -Protection from red -{W}: Target creature gains protection from red until end of turn. -INV C - -Crimson Hellkite -{6}{R}{R}{R} -Creature - Dragon -6/6 -Flying -{X}, {T}: Crimson Hellkite deals X damage to target creature. Spend only red mana this way. -MIR R, 6ED R, 7ED R - -Crimson Kobolds -{0} -Creature - Kobold -0/1 -Crimson Kobolds is red. -LEG C, ME3 C - -Crimson Mage -{1}{R} -Creature - Human Shaman -2/1 -{R}: Target creature you control gains haste until end of turn. (It can attack and {T} this turn.) -M12 U - -Crimson Manticore -{2}{R}{R} -Creature - Manticore -2/2 -Flying -{R}, {T}: Crimson Manticore deals 1 damage to target attacking or blocking creature. -LEG R, 4ED R, 5ED R, ME3 U - -Crimson Roc -{4}{R} -Creature - Bird -2/2 -Flying -Whenever Crimson Roc blocks a creature without flying, Crimson Roc gets +1/+0 and gains first strike until end of turn. -MIR U - -Crimson Wisps -{R} -Instant -Target creature becomes red and gains haste until end of turn. -Draw a card. -SHM C - -Crippling Fatigue -{1}{B}{B} -Sorcery -Target creature gets -2/-2 until end of turn. -Flashback-{1}{B}, Pay 3 life. (You may cast this card from your graveyard for its flashback cost. Then exile it.) -TOR C - -Cromat -{W}{U}{B}{R}{G} -Legendary Creature - Illusion -5/5 -{W}{B}: Destroy target creature blocking or blocked by Cromat. -{U}{R}: Cromat gains flying until end of turn. -{B}{G}: Regenerate Cromat. -{R}{W}: Cromat gets +1/+1 until end of turn. -{G}{U}: Put Cromat on top of its owner's library. -APC R - -Crookclaw Elder -{5}{U} -Creature - Bird Wizard -3/2 -Flying -Tap two untapped Birds you control: Draw a card. -Tap two untapped Wizards you control: Target creature gains flying until end of turn. -LGN U - -Crookclaw Transmuter -{3}{U} -Creature - Bird Wizard -3/1 -Flash (You may cast this spell any time you could cast an instant.) -Flying -When Crookclaw Transmuter enters the battlefield, switch target creature's power and toughness until end of turn. -TSP C - -Crooked Scales -{4} -Artifact -{4}, {T}: Flip a coin. If you win the flip, destroy target creature an opponent controls. If you lose the flip, destroy target creature you control unless you pay {3} and repeat this process. -MMQ R - -Crookshank Kobolds -{0} -Creature - Kobold -0/1 -Crookshank Kobolds is red. -LEG C, MED C - -Crop Rotation -{G} -Instant -As an additional cost to cast Crop Rotation, sacrifice a land. -Search your library for a land card and put that card onto the battlefield. Then shuffle your library. -ULG C - -Crosis's Attendant -{5} -Artifact Creature - Golem -3/3 -{1}, Sacrifice Crosis's Attendant: Add {U}{B}{R} to your mana pool. -INV U - -Crosis's Catacombs -Land - Lair -When Crosis's Catacombs enters the battlefield, sacrifice it unless you return a non-Lair land you control to its owner's hand. -{T}: Add {U}, {B}, or {R} to your mana pool. -PLS U - -Crosis's Charm -{U}{B}{R} -Instant -Choose one - Return target permanent to its owner's hand; or destroy target nonblack creature, and it can't be regenerated; or destroy target artifact. -PLS U - -Crosis, the Purger -{3}{U}{B}{R} -Legendary Creature - Dragon -6/6 -Flying -Whenever Crosis, the Purger deals combat damage to a player, you may pay {2}{B}. If you do, choose a color, then that player reveals his or her hand and discards all cards of that color. -INV R - -Crossbow Ambush -{G} -Instant -Creatures you control gain reach until end of turn. (They can block creatures with flying.) -STH C - -Crossbow Infantry -{1}{W} -Creature - Human Soldier Archer -1/1 -{T}: Crossbow Infantry deals 1 damage to target attacking or blocking creature. -MMQ C, 7ED C, 8ED C, 9ED C - -Crosswinds -{1}{G} -Enchantment -Creatures with flying get -2/-0. -USG U - -Crovax -Vanguard -Hand +2, life +0 -Whenever a creature you control deals damage to a creature or player, you gain 1 life. -VG S - -Crovax the Cursed -{2}{B}{B} -Legendary Creature - Vampire -0/0 -Crovax the Cursed enters the battlefield with four +1/+1 counters on it. -At the beginning of your upkeep, you may sacrifice a creature. If you do, put a +1/+1 counter on Crovax. If you don't, remove a +1/+1 counter from Crovax. -{B}: Crovax gains flying until end of turn. -STH R - -Crovax, Ascendant Hero -{4}{W}{W} -Legendary Creature - Human -4/4 -Other white creatures get +1/+1. -Nonwhite creatures get -1/-1. -Pay 2 life: Return Crovax, Ascendant Hero to its owner's hand. -PLC R - -Crowd Favorites -{6}{W} -Creature - Human Soldier -4/4 -{3}{W}: Tap target creature. -{3}{W}: Crowd Favorites gets +0/+5 until end of turn. -ONS U - -Crowd of Cinders -{3}{B} -Creature - Elemental -*/* -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -Crowd of Cinders's power and toughness are each equal to the number of black permanents you control. -SHM U - -Crown of Ascension -{1}{U} -Enchantment - Aura -Enchant creature -Enchanted creature has flying. -Sacrifice Crown of Ascension: Enchanted creature and other creatures that share a creature type with it gain flying until end of turn. -ONS C - -Crown of Awe -{1}{W} -Enchantment - Aura -Enchant creature -Enchanted creature has protection from black and from red. -Sacrifice Crown of Awe: Enchanted creature and other creatures that share a creature type with it gain protection from black and from red until end of turn. -ONS C - -Crown of Convergence -{2} -Artifact -Play with the top card of your library revealed. -As long as the top card of your library is a creature card, creatures you control that share a color with that card get +1/+1. -{G}{W}: Put the top card of your library on the bottom of your library. -RAV R - -Crown of Empires -{2} -Artifact -{3}, {T}: Tap target creature. Gain control of that creature instead if you control artifacts named Scepter of Empires and Throne of Empires. -M12 U - -Crown of Flames -{R} -Enchantment - Aura -Enchant creature -{R}: Enchanted creature gets +1/+0 until end of turn. -{R}: Return Crown of Flames to its owner's hand. -TMP C, INV C - -Crown of Fury -{1}{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+0 and has first strike. -Sacrifice Crown of Fury: Enchanted creature and other creatures that share a creature type with it get +1/+0 and gain first strike until end of turn. -ONS C - -Crown of Suspicion -{1}{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/-1. -Sacrifice Crown of Suspicion: Enchanted creature and other creatures that share a creature type with it get +2/-1 until end of turn. -ONS C - -Crown of Vigor -{1}{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+1. -Sacrifice Crown of Vigor: Enchanted creature and other creatures that share a creature type with it get +1/+1 until end of turn. -ONS C - -Crown of the Ages -{2} -Artifact -{4}, {T}: Attach target Aura attached to a creature to another creature. -ICE R, 5ED R - -Crucible of Fire -{3}{R} -Enchantment -Dragon creatures you control get +3/+3. -ALA R - -Crucible of Worlds -{3} -Artifact -You may play land cards from your graveyard. -5DN R, 10E R - -Crude Rampart -{3}{W} -Creature - Wall -4/5 -Defender (This creature can't attack.) -Morph {4}{W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS U - -Cruel Bargain -{B}{B}{B} -Sorcery -Draw four cards. You lose half your life, rounded up. -POR R - -Cruel Deceiver -{1}{B} -Creature - Spirit -2/1 -{1}: Look at the top card of your library. -{2}: Reveal the top card of your library. If it's a land card, Cruel Deceiver gains "Whenever Cruel Deceiver deals damage to a creature, destroy that creature" until end of turn. Activate this ability only once each turn. -CHK C - -Cruel Edict -{1}{B} -Sorcery -Target opponent sacrifices a creature. -P02 C, 9ED U, 10E U, DVD U - -Cruel Fate -{4}{U} -Sorcery -Look at the top five cards of target opponent's library. Put one of those cards into that player's graveyard, and the rest on top of his or her library in any order. -POR R - -Cruel Revival -{4}{B} -Instant -Destroy target non-Zombie creature. It can't be regenerated. Return up to one target Zombie card from your graveyard to your hand. -ONS C, HOP C - -Cruel Tutor -{2}{B} -Sorcery -Search your library for a card, then shuffle your library and put that card on top of it. You lose 2 life. -POR R - -Cruel Ultimatum -{U}{U}{B}{B}{B}{R}{R} -Sorcery -Target opponent sacrifices a creature, discards three cards, then loses 5 life. You return a creature card from your graveyard to your hand, draw three cards, then gain 5 life. -ALA R - -Crumble -{G} -Instant -Destroy target artifact. It can't be regenerated. That artifact's controller gains life equal to its converted mana cost. -ATQ C, 3ED U, 4ED U, 5ED U, ME4 C - -Crumbling Ashes -{1}{B} -Enchantment -At the beginning of your upkeep, destroy target creature with a -1/-1 counter on it. -EVE U - -Crumbling Colossus -{5} -Artifact Creature - Golem -7/4 -Trample (If this creature would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.) -When Crumbling Colossus attacks, sacrifice it at end of combat. -M12 U - -Crumbling Necropolis -Land -Crumbling Necropolis enters the battlefield tapped. -{T}: Add {U}, {B}, or {R} to your mana pool. -ALA U - -Crumbling Sanctuary -{5} -Artifact -If damage would be dealt to a player, that player exiles that many cards from the top of his or her library instead. -MMQ R - -Crusade -{W}{W} -Enchantment -White creatures get +1/+1. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, 6ED R, MED R, EVT R - -Crusading Knight -{2}{W}{W} -Creature - Human Knight -2/2 -Protection from black -Crusading Knight gets +1/+1 for each Swamp your opponents control. -INV R - -Crush -{R} -Instant -Destroy target noncreature artifact. -MBS C - -Crush Underfoot -{1}{R} -Tribal Instant - Giant -Choose a Giant creature you control. It deals damage equal to its power to target creature. -LRW U - -Crush of Wurms -{6}{G}{G}{G} -Sorcery -Put three 6/6 green Wurm creature tokens onto the battlefield. -Flashback {9}{G}{G}{G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -JUD R - -Crusher Zendikon -{2}{R} -Enchantment - Aura -Enchant land -Enchanted land is a 4/2 red Beast creature with trample. It's still a land. -When enchanted land dies, return that card to its owner's hand. -WWK C - -Crushing Pain -{1}{R} -Instant - Arcane -Crushing Pain deals 6 damage to target creature that was dealt damage this turn. -CHK C - -Cry of Contrition -{B} -Sorcery -Target player discards a card. -Haunt (When this spell card is put into a graveyard after resolving, exile it haunting target creature.) -When the creature Cry of Contrition haunts dies, target player discards a card. -GPT C - -Cryoclasm -{2}{R} -Sorcery -Destroy target Plains or Island. Cryoclasm deals 3 damage to that land's controller. -CSP U, 10E U - -Crypt Angel -{4}{B} -Creature - Angel -3/3 -Flying, protection from white -When Crypt Angel enters the battlefield, return target blue or red creature card from your graveyard to your hand. -INV R - -Crypt Champion -{3}{B} -Creature - Zombie -2/2 -Double strike -When Crypt Champion enters the battlefield, each player puts a creature card with converted mana cost 3 or less from his or her graveyard onto the battlefield. -When Crypt Champion enters the battlefield, sacrifice it unless {R} was spent to cast it. -DIS U - -Crypt Cobra -{3}{B} -Creature - Snake -3/3 -Whenever Crypt Cobra attacks and isn't blocked, defending player gets a poison counter. (A player with ten or more poison counters loses the game.) -MIR U - -Crypt Creeper -{1}{B} -Creature - Zombie -2/1 -Sacrifice Crypt Creeper: Exile target card from a graveyard. -ODY C - -Crypt Rats -{2}{B} -Creature - Rat -1/1 -{X}: Crypt Rats deals X damage to each creature and each player. Spend only black mana this way. -VIS C, 7ED U - -Crypt Ripper -{2}{B}{B} -Creature - Shade -2/2 -Haste -{B}: Crypt Ripper gets +1/+1 until end of turn. -ZEN C - -Crypt Sliver -{1}{B} -Creature - Sliver -1/1 -All Slivers have "{T}: Regenerate target Sliver." -LGN C - -Crypt of Agadeem -Land -Crypt of Agadeem enters the battlefield tapped. -{T}: Add {B} to your mana pool. -{2}, {T}: Add {B} to your mana pool for each black creature card in your graveyard. -ZEN R - -Cryptic Annelid -{3}{U} -Creature - Worm Beast -1/4 -When Cryptic Annelid enters the battlefield, scry 1, then scry 2, then scry 3. (To scry X, look at the top X cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) -FUT U - -Cryptic Command -{1}{U}{U}{U} -Instant -Choose two - Counter target spell; or return target permanent to its owner's hand; or tap all creatures your opponents control; or draw a card. -LRW R - -Cryptic Gateway -{5} -Artifact -Tap two untapped creatures you control: You may put a creature card from your hand that shares a creature type with each creature tapped this way onto the battlefield. -ONS R - -Cryptoplasm -{1}{U}{U} -Creature - Shapeshifter -2/2 -At the beginning of your upkeep, you may have Cryptoplasm become a copy of another target creature. If you do, Cryptoplasm gains this ability. -MBS R - -Cryptwailing -{3}{B} -Enchantment -{1}, Exile two creature cards from your graveyard: Target player discards a card. Activate this ability only any time you could cast a sorcery. -GPT U - -Crystal Ball -{3} -Artifact -{1}, {T}: Scry 2. (To scry 2, look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) -M11 U - -Crystal Chimes -{3} -Artifact -{3}, {T}, Sacrifice Crystal Chimes: Return all enchantment cards from your graveyard to your hand. -USG U - -Crystal Golem -{4} -Artifact Creature - Golem -3/3 -At the beginning of your end step, Crystal Golem phases out. (While it's phased out, it's treated as though it doesn't exist. It phases in before you untap during your next untap step.) -MIR U - -Crystal Quarry -Land -{T}: Add {1} to your mana pool. -{5}, {T}: Add {W}{U}{B}{R}{G} to your mana pool. -ODY R - -Crystal Rod -{1} -Artifact -Whenever a player casts a blue spell, you may pay {1}. If you do, you gain 1 life. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, 6ED U, 7ED U, 8ED U - -Crystal Seer -{4}{U} -Creature - Vedalken Wizard -2/2 -When Crystal Seer enters the battlefield, look at the top four cards of your library, then put them back in any order. -{4}{U}: Return Crystal Seer to its owner's hand. -GPT C - -Crystal Shard -{3} -Artifact -{3}, {T} or {U}, {T}: Return target creature to its owner's hand unless its controller pays {1}. -MRD U - -Crystal Spray -{2}{U} -Instant -Change the text of target spell or permanent by replacing all instances of one color word or basic land type with another until end of turn. -Draw a card. -INV R - -Crystal Vein -Land -{T}: Add {1} to your mana pool. -{T}, Sacrifice Crystal Vein: Add {2} to your mana pool. -MIR U, 6ED U - -Crystalline Sliver -{W}{U} -Creature - Sliver -2/2 -All Slivers have shroud. (They can't be the targets of spells or abilities.) -STH U, H09 U - -Crystallization -{G/U}{W} -Enchantment - Aura -Enchant creature -Enchanted creature can't attack or block. -When enchanted creature becomes the target of a spell or ability, exile that creature. -ARB C - -Cudgel Troll -{2}{G}{G} -Creature - Troll -4/3 -{G}: Regenerate Cudgel Troll. (The next time this creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.) -M10 U, M11 U, M12 U - -Culling Dais -{2} -Artifact -{T}, Sacrifice a creature: Put a charge counter on Culling Dais. -{1}, Sacrifice Culling Dais: Draw a card for each charge counter on Culling Dais. -SOM U - -Culling Scales -{3} -Artifact -At the beginning of your upkeep, destroy target nonland permanent with the lowest converted mana cost. (If two or more permanents are tied for lowest cost, target any one of them.) -MRD R - -Culling Sun -{2}{W}{W}{B} -Sorcery -Destroy each creature with converted mana cost 3 or less. -GPT R - -Culling the Weak -{B} -Instant -As an additional cost to cast Culling the Weak, sacrifice a creature. -Add {B}{B}{B}{B} to your mana pool. -EXO C - -Cultbrand Cinder -{4}{B/R} -Creature - Elemental Shaman -3/3 -When Cultbrand Cinder enters the battlefield, put a -1/-1 counter on target creature. -SHM C - -Cultivate -{2}{G} -Sorcery -Search your library for up to two basic land cards, reveal those cards, and put one onto the battlefield tapped and the other into your hand. Then shuffle your library. -M11 C, COM C - -Cultural Exchange -{4}{U}{U} -Sorcery -Choose any number of creatures target player controls. Choose the same number of creatures another target player controls. Those players exchange control of those creatures. (This effect lasts indefinitely.) -ODY R - -Cumber Stone -{3}{U} -Artifact -Creatures your opponents control get -1/-0. -CON U - -Cunning -{1}{U} -Enchantment - Aura -Enchant creature -Enchanted creature gets +3/+3. -When enchanted creature attacks or blocks, sacrifice Cunning at the beginning of the next cleanup step. -EXO C - -Cunning Advisor -{3}{B} -Creature - Human Advisor -1/1 -{T}: Target opponent discards a card. Activate this ability only during your turn, before attackers are declared. -PTK U - -Cunning Bandit -{1}{R}{R} -Creature - Human Warrior -2/2 -Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Cunning Bandit. -At the beginning of the end step, if there are two or more ki counters on Cunning Bandit, you may flip it. ----- -Azamuki, Treachery Incarnate -Legendary Creature - Spirit -5/2 -Remove a ki counter from Azamuki, Treachery Incarnate: Gain control of target creature until end of turn. -BOK U - -Cunning Giant -{5}{R} -Creature - Giant -4/4 -If Cunning Giant is unblocked, you may have it assign its combat damage to a creature defending player controls. -P02 R - -Cunning Lethemancer -{2}{B} -Creature - Human Wizard -2/2 -At the beginning of your upkeep, each player discards a card. -ALA R - -Cunning Sparkmage -{2}{R} -Creature - Human Shaman -0/1 -Haste -{T}: Cunning Sparkmage deals 1 damage to target creature or player. -WWK U - -Cunning Wish -{2}{U} -Instant -You may choose an instant card you own from outside the game, reveal that card, and put it into your hand. Exile Cunning Wish. -JUD R - -Cuombajj Witches -{B}{B} -Creature - Human Wizard -1/3 -{T}: Cuombajj Witches deals 1 damage to target creature or player and 1 damage to target creature or player of an opponent's choice. -ARN C, CHR C, MED C - -Curfew -{U} -Instant -Each player returns a creature he or she controls to its owner's hand. -USG C, BRB C - -Curiosity -{U} -Enchantment - Aura -Enchant creature -Whenever enchanted creature deals damage to an opponent, you may draw a card. -EXO U, 8ED U - -Curse Artifact -{2}{B}{B} -Enchantment - Aura -Enchant artifact -At the beginning of the upkeep of enchanted artifact's controller, Curse Artifact deals 2 damage to that player unless he or she sacrifices that artifact. -DRK U - -Curse of Chains -{1}{W/U} -Enchantment - Aura -Enchant creature -At the beginning of each upkeep, tap enchanted creature. -SHM C - -Curse of Marit Lage -{3}{R}{R} -Enchantment -When Curse of Marit Lage enters the battlefield, tap all Islands. -Islands don't untap during their controllers' untap steps. -ICE R - -Curse of Wizardry -{2}{B}{B} -Enchantment -As Curse of Wizardry enters the battlefield, choose a color. -Whenever a player casts a spell of the chosen color, that player loses 1 life. -ROE U - -Curse of the Cabal -{9}{B} -Sorcery -Target player sacrifices half the permanents he or she controls, rounded down. -Suspend 2-{2}{B}{B} (Rather than cast this card from your hand, you may pay {2}{B}{B} and exile it with two time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) -At the beginning of each player's upkeep, if Curse of the Cabal is suspended, that player may sacrifice a permanent. If he or she does, put two time counters on Curse of the Cabal. -TSP R - -Cursecatcher -{U} -Creature - Merfolk Wizard -1/1 -Sacrifice Cursecatcher: Counter target instant or sorcery spell unless its controller pays {1}. -SHM U - -Cursed Flesh -{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets -1/-1 and has fear. (It can't be blocked except by artifact creatures and/or black creatures.) -EXO C, INV C - -Cursed Land -{2}{B}{B} -Enchantment - Aura -Enchant land -At the beginning of the upkeep of enchanted land's controller, Cursed Land deals 1 damage to that player. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U - -Cursed Monstrosity -{4}{B} -Creature - Horror -4/3 -Flying -Whenever Cursed Monstrosity becomes the target of a spell or ability, sacrifice it unless you discard a land card. -ODY R - -Cursed Rack -{4} -Artifact -As Cursed Rack enters the battlefield, choose an opponent. -The chosen player's maximum hand size is four. -ATQ U, 4ED U, MED U - -Cursed Ronin -{3}{B} -Creature - Human Samurai -1/1 -Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -{B}: Cursed Ronin gets +1/+1 until end of turn. -CHK C - -Cursed Scroll -{1} -Artifact -{3}, {T}: Name a card. Reveal a card at random from your hand. If it's the named card, Cursed Scroll deals 2 damage to target creature or player. -TMP R - -Cursed Totem -{2} -Artifact -Activated abilities of creatures can't be activated. -MIR R, 6ED R - -Curtain of Light -{1}{W} -Instant -Cast Curtain of Light only during combat after blockers are declared. -Target unblocked attacking creature becomes blocked. (This spell works on unblockable creatures.) -Draw a card. -SOK C - -Custody Battle -{1}{R} -Enchantment - Aura -Enchant creature -Enchanted creature has "At the beginning of your upkeep, target opponent gains control of this creature unless you sacrifice a land." -ONS U - -Customs Depot -{1}{U} -Enchantment -Whenever you cast a creature spell, you may pay {1}. If you do, draw a card, then discard a card. -MMQ U - -Cut the Earthly Bond -{U} -Instant - Arcane -Return target enchanted permanent to its owner's hand. -SOK C - -Cut the Tethers -{2}{U}{U} -Sorcery -For each Spirit, return it to its owner's hand unless that player pays {3}. -CHK U - -Cutthroat il-Dal -{3}{B} -Creature - Human Rogue -4/1 -Hellbent - Cutthroat il-Dal has shadow as long as you have no cards in hand. (It can block or be blocked by only creatures with shadow.) -FUT C - -Cycle of Life -{1}{G}{G} -Enchantment -Return Cycle of Life to its owner's hand: Target creature you cast this turn becomes 0/1 until your next upkeep. At the beginning of your next upkeep, put a +1/+1 counter on that creature. -MIR R - -Cyclical Evolution -{3}{G}{G} -Sorcery -Target creature gets +3/+3 until end of turn. Exile Cyclical Evolution with three time counters on it. -Suspend 3-{2}{G} (Rather than cast this card from your hand, you may pay {2}{G} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) -FUT U - -Cyclone -{2}{G}{G} -Enchantment -At the beginning of your upkeep, put a wind counter on Cyclone, then sacrifice Cyclone unless you pay {G} for each wind counter on it. If you pay, Cyclone deals damage equal to the number of wind counters on it to each creature and each player. -ARN U, CHR R, ME4 R - -Cyclopean Giant -{2}{B}{B} -Creature - Zombie Giant -4/2 -When Cyclopean Giant dies, target land becomes a Swamp. Exile Cyclopean Giant. -TSP C - -Cyclopean Mummy -{1}{B} -Creature - Zombie -2/1 -When Cyclopean Mummy dies, exile it. -LEG C, 4ED C, ME4 C - -Cyclopean Snare -{2} -Artifact -{3}, {T}: Tap target creature, then return Cyclopean Snare to its owner's hand. -RAV U - -Cyclopean Tomb -{4} -Artifact -{2}, {T}: Put a mire counter on target non-Swamp land. That land is a Swamp for as long as it has a mire counter on it. Activate this ability only during your upkeep. -When Cyclopean Tomb is put into a graveyard from the battlefield, at the beginning of each of your upkeeps for the rest of the game, remove all mire counters from a land that a mire counter was put onto with Cyclopean Tomb but that a mire counter has not been removed from with Cyclopean Tomb. -LEA R, LEB R, 2ED R, ME4 R - -Cyclops Gladiator -{1}{R}{R}{R} -Creature - Cyclops Warrior -4/4 -Whenever Cyclops Gladiator attacks, you may have it deal damage equal to its power to target creature defending player controls. If you do, that creature deals damage equal to its power to Cyclops Gladiator. -M11 R - -Cylian Elf -{1}{G} -Creature - Elf Scout -2/2 -ALA C - -Cylian Sunsinger -{1}{G} -Creature - Elf Shaman -2/2 -{R}{G}{W}: Cylian Sunsinger and each other creature with the same name as it get +3/+3 until end of turn. -CON R - -Cystbearer -{2}{G} -Creature - Beast -2/3 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -SOM C - -Cytoplast Manipulator -{2}{U}{U} -Creature - Human Wizard Mutant -0/0 -Graft 2 (This creature enters the battlefield with two +1/+1 counters on it. Whenever another creature enters the battlefield, you may move a +1/+1 counter from this creature onto it.) -{U}, {T}: Gain control of target creature with a +1/+1 counter on it for as long as Cytoplast Manipulator remains on the battlefield. -DIS R - -Cytoplast Root-Kin -{2}{G}{G} -Creature - Elemental Mutant -0/0 -Graft 4 (This creature enters the battlefield with four +1/+1 counters on it. Whenever another creature enters the battlefield, you may move a +1/+1 counter from this creature onto it.) -When Cytoplast Root-Kin enters the battlefield, put a +1/+1 counter on each other creature you control that has a +1/+1 counter on it. -{2}: Move a +1/+1 counter from target creature you control onto Cytoplast Root-Kin. -DIS R - -Cytoshape -{1}{G}{U} -Instant -Choose a nonlegendary creature on the battlefield. Target creature becomes a copy of that creature until end of turn. -DIS R - -Cytospawn Shambler -{6}{G} -Creature - Elemental Mutant -0/0 -Graft 6 (This creature enters the battlefield with six +1/+1 counters on it. Whenever another creature enters the battlefield, you may move a +1/+1 counter from this creature onto it.) -{G}: Target creature with a +1/+1 counter on it gains trample until end of turn. -DIS C - -D'Avenant Archer -{2}{W} -Creature - Human Soldier Archer -1/2 -{T}: D'Avenant Archer deals 1 damage to target attacking or blocking creature. -LEG C, CHR C, 5ED C, 6ED C, ME3 C - -D'Avenant Healer -{1}{W}{W} -Creature - Human Cleric Archer -1/2 -{T}: D'Avenant Healer deals 1 damage to target attacking or blocking creature. -{T}: Prevent the next 1 damage that would be dealt to target creature or player this turn. -TSP C - -Daggerback Basilisk -{2}{G} -Creature - Basilisk -2/2 -Deathtouch -ROE C - -Daggerclaw Imp -{2}{B} -Creature - Imp -3/1 -Flying -Daggerclaw Imp can't block. -GPT U, DVD U - -Daily Regimen -{W} -Enchantment - Aura -Enchant creature -{1}{W}: Put a +1/+1 counter on enchanted creature. -MOR U - -Dakkon Blackblade -{2}{W}{U}{U}{B} -Legendary Creature - Human Warrior -*/* -Dakkon Blackblade's power and toughness are each equal to the number of lands you control. -LEG R, CHR R, MED R - -Dakkon Blackblade Avatar -Vanguard -Hand +1, life +0 -You may play any colored card from your hand as a copy of a basic land card chosen at random that can produce mana of one of the card's colors. -VG S - -Dakmor Bat -{1}{B} -Creature - Bat -1/1 -Flying -P02 C - -Dakmor Ghoul -{2}{B}{B} -Creature - Zombie -2/2 -When Dakmor Ghoul enters the battlefield, target opponent loses 2 life and you gain 2 life. -S99 U - -Dakmor Lancer -{4}{B}{B} -Creature - Human Knight -3/3 -When Dakmor Lancer enters the battlefield, destroy target nonblack creature. -S99 R, 7ED U - -Dakmor Plague -{3}{B}{B} -Sorcery -Dakmor Plague deals 3 damage to each creature and each player. -P02 U, S99 U, ME4 U - -Dakmor Salvage -Land -Dakmor Salvage enters the battlefield tapped. -{T}: Add {B} to your mana pool. -Dredge 2 (If you would draw a card, instead you may put exactly two cards from the top of your library into your graveyard. If you do, return this card from your graveyard to your hand. Otherwise, draw a card.) -FUT U - -Dakmor Scorpion -{1}{B} -Creature - Scorpion -2/1 -P02 C, S99 C - -Dakmor Sorceress -{5}{B} -Creature - Human Wizard -*/4 -Dakmor Sorceress's power is equal to the number of Swamps you control. -P02 R, S99 R - -Damia, Sage of Stone -{4}{G}{U}{B} -Legendary Creature - Gorgon Wizard -4/4 -Deathtouch -Skip your draw step. -At the beginning of your upkeep, if you have fewer than seven cards in hand, draw cards equal to the difference. -COM M - -Damnation -{2}{B}{B} -Sorcery -Destroy all creatures. They can't be regenerated. -PLC R - -Dampen Thought -{1}{U} -Instant - Arcane -Target player puts the top four cards of his or her library into his or her graveyard. -Splice onto Arcane {1}{U} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -CHK U - -Damping Engine -{4} -Artifact -A player who controls more permanents than each other player can't play lands or cast artifact, creature, or enchantment spells. That player may sacrifice a permanent for that player to ignore this effect until end of turn. -ULG R - -Damping Field -{2}{W} -Enchantment -Players can't untap more than one artifact during their untap steps. -ATQ U - -Damping Matrix -{3} -Artifact -Activated abilities of artifacts and creatures can't be activated unless they're mana abilities. -MRD R - -Dance of Many -{U}{U} -Enchantment -When Dance of Many enters the battlefield, put a token that's a copy of target nontoken creature onto the battlefield. -When Dance of Many leaves the battlefield, exile the token. -When the token leaves the battlefield, sacrifice Dance of Many. -At the beginning of your upkeep, sacrifice Dance of Many unless you pay {U}{U}. -DRK R, CHR R, 5ED R, ME3 U - -Dance of Shadows -{3}{B}{B} -Sorcery - Arcane -Creatures you control get +1/+0 and gain fear until end of turn. (They can't be blocked except by artifact creatures and/or black creatures.) -CHK U - -Dance of the Dead -{1}{B} -Enchantment - Aura -Enchant creature card in a graveyard -When Dance of the Dead enters the battlefield, if it's on the battlefield, it loses "enchant creature card in a graveyard" and gains "enchant creature put onto the battlefield with Dance of the Dead." Return enchanted creature card to the battlefield tapped under your control and attach Dance of the Dead to it. When Dance of the Dead leaves the battlefield, that creature's controller sacrifices it. -Enchanted creature gets +1/+1 and doesn't untap during its controller's untap step. -At the beginning of the upkeep of enchanted creature's controller, that player may pay {1}{B}. If he or she does, untap that creature. -ICE U, ME2 U - -Dance, Pathetic Marionette -Scheme -When you set this scheme in motion, each opponent reveals cards from the top of his or her library until he or she reveals a creature card. Choose one of the revealed creature cards and put it onto the battlefield under your control. Put all other cards revealed this way into their owners' graveyards. -ARC C - -Dancing Scimitar -{4} -Artifact Creature - Spirit -1/5 -Flying (This creature can't be blocked except by creatures with flying or reach.) -ARN R, 3ED R, 4ED R, 5ED R, 6ED R, 9ED U - -Dandan -{U}{U} -Creature - Fish -4/1 -Dandan can't attack unless defending player controls an Island. -When you control no Islands, sacrifice Dandan. -ARN C, CHR C, 5ED C, TSB S - -Daraja Griffin -{3}{W} -Creature - Griffin -2/2 -Flying -Sacrifice Daraja Griffin: Destroy target black creature. -VIS U, 6ED U - -Darba -{3}{G} -Creature - Bird Beast -5/4 -At the beginning of your upkeep, sacrifice Darba unless you pay {G}{G}. -PCY U - -Darien, King of Kjeldor -{4}{W}{W} -Legendary Creature - Human Soldier -3/3 -Whenever you're dealt damage, you may put that many 1/1 white Soldier creature tokens onto the battlefield. -CSP R - -Darigaaz's Attendant -{5} -Artifact Creature - Golem -3/3 -{1}, Sacrifice Darigaaz's Attendant: Add {B}{R}{G} to your mana pool. -INV U - -Darigaaz's Caldera -Land - Lair -When Darigaaz's Caldera enters the battlefield, sacrifice it unless you return a non-Lair land you control to its owner's hand. -{T}: Add {B}, {R}, or {G} to your mana pool. -PLS U - -Darigaaz's Charm -{B}{R}{G} -Instant -Choose one - Return target creature card from your graveyard to your hand; or Darigaaz's Charm deals 3 damage to target creature or player; or target creature gets +3/+3 until end of turn. -PLS U, PVC U - -Darigaaz, the Igniter -{3}{B}{R}{G} -Legendary Creature - Dragon -6/6 -Flying -Whenever Darigaaz, the Igniter deals combat damage to a player, you may pay {2}{R}. If you do, choose a color, then that player reveals his or her hand and Darigaaz deals damage to the player equal to the number of cards of that color revealed this way. -INV R, PVC R - -Daring Apprentice -{1}{U}{U} -Creature - Human Wizard -1/1 -{T}, Sacrifice Daring Apprentice: Counter target spell. -MIR R, 6ED R, 7ED R, 8ED R, 9ED R - -Daring Leap -{1}{W}{U} -Instant -Target creature gets +1/+1 and gains flying and first strike until end of turn. -PLS C - -Dark Banishing -{2}{B} -Instant -Destroy target nonblack creature. It can't be regenerated. -ICE C, MIR C, TMP C, 7ED C, 8ED C, 9ED C, ME2 C, DVD C - -Dark Confidant -{1}{B} -Creature - Human Wizard -2/1 -At the beginning of your upkeep, reveal the top card of your library and put that card into your hand. You lose life equal to its converted mana cost. -RAV R - -Dark Depths -Legendary Snow Land -Dark Depths enters the battlefield with ten ice counters on it. -{3}: Remove an ice counter from Dark Depths. -When Dark Depths has no ice counters on it, sacrifice it. If you do, put a legendary 20/20 black Avatar creature token with flying and "This creature is indestructible" named Marit Lage onto the battlefield. -CSP R - -Dark Favor -{1}{B} -Enchantment - Aura -Enchant creature -When Dark Favor enters the battlefield, you lose 1 life. -Enchanted creature gets +3/+1. -M12 C - -Dark Hatchling -{4}{B}{B} -Creature - Horror -3/3 -Flying -When Dark Hatchling enters the battlefield, destroy target nonblack creature. It can't be regenerated. -USG R, COM R - -Dark Heart of the Wood -{B}{G} -Enchantment -Sacrifice a Forest: You gain 3 life. -DRK C, RAV U - -Dark Maze -{4}{U} -Creature - Wall -4/5 -Defender (This creature can't attack.) -{0}: Dark Maze can attack this turn as though it didn't have defender. Exile it at the beginning of the next end step. -HML C (x2), 5ED C - -Dark Offering -{4}{B}{B} -Sorcery -Destroy target nonblack creature. You gain 3 life. -P02 U, S99 U - -Dark Privilege -{1}{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+1. -Sacrifice a creature: Regenerate enchanted creature. -VIS C - -Dark Ritual -{B} -Instant -Add {B}{B}{B} to your mana pool. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, ICE C, MIR C, 5ED C, TMP C, USG C, MMQ C, BRB C, BTD C, DVD C, HOP C, PVC C, ME4 C - -Dark Sphere -{0} -Artifact -{T}, Sacrifice Dark Sphere: The next time a source of your choice would deal damage to you this turn, it deals half that damage, rounded up, to you instead. -DRK U - -Dark Supplicant -{B} -Creature - Human Cleric -1/1 -{T}, Sacrifice three Clerics: Search your graveyard, hand, and/or library for a card named Scion of Darkness and put it onto the battlefield. If you search your library this way, shuffle it. -LGN U - -Dark Suspicions -{2}{B}{B} -Enchantment -At the beginning of each opponent's upkeep, that player loses X life, where X is the number of cards in that player's hand minus the number of cards in your hand. -PLS R - -Dark Temper -{2}{R} -Instant -Dark Temper deals 2 damage to target creature. If you control a black permanent, destroy the creature instead. -CON C - -Dark Triumph -{4}{B} -Instant -If you control a Swamp, you may sacrifice a creature rather than pay Dark Triumph's mana cost. -Creatures you control get +2/+0 until end of turn. -NEM U - -Dark Tutelage -{2}{B} -Enchantment -At the beginning of your upkeep, reveal the top card of your library and put that card into your hand. You lose life equal to its converted mana cost. -M11 R - -Dark Withering -{4}{B}{B} -Instant -Destroy target nonblack creature. -Madness {B} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -TSP C - -Darkblast -{B} -Instant -Target creature gets -1/-1 until end of turn. -Dredge 3 (If you would draw a card, instead you may put exactly three cards from the top of your library into your graveyard. If you do, return this card from your graveyard to your hand. Otherwise, draw a card.) -RAV U - -Darkest Hour -{B} -Enchantment -All creatures are black. -USG R, 7ED R - -Darkheart Sliver -{B}{G} -Creature - Sliver -2/2 -All Slivers have "Sacrifice this permanent: You gain 3 life." -PLC U - -Darkling Stalker -{3}{B} -Creature - Shade Spirit -1/1 -{B}: Regenerate Darkling Stalker. -{B}: Darkling Stalker gets +1/+1 until end of turn. -TMP C - -Darklit Gargoyle -{1}{W} -Artifact Creature - Gargoyle -1/2 -Flying -{B}: Darklit Gargoyle gets +2/-1 until end of turn. -CON C - -Darkness -{B} -Instant -Prevent all combat damage that would be dealt this turn. -LEG C, TSB S - -Darkpact -{B}{B}{B} -Sorcery -Remove Darkpact from your deck before playing if you're not playing for ante. -You own target card in the ante. Exchange that card with the top card of your library. -LEA R, LEB R, 2ED R, 3ED R - -Darkslick Drake -{2}{U}{U} -Creature - Drake -2/4 -Flying -When Darkslick Drake dies, draw a card. -SOM U - -Darkslick Shores -Land -Darkslick Shores enters the battlefield tapped unless you control two or fewer other lands. -{T}: Add {U} or {B} to your mana pool. -SOM R - -Darksteel Axe -{1} -Artifact - Equipment -Darksteel Axe is indestructible. (Effects that say "destroy" don't destroy it.) -Equipped creature gets +2/+0. -Equip {2} -SOM U - -Darksteel Brute -{2} -Artifact -Darksteel Brute is indestructible. ("Destroy" effects and lethal damage don't destroy it.) -{3}: Darksteel Brute becomes a 2/2 Beast artifact creature until end of turn. -DST U - -Darksteel Citadel -Artifact Land -Darksteel Citadel is indestructible. ("Destroy" effects and lethal damage don't destroy it.) -{T}: Add {1} to your mana pool. -DST C, EVT C - -Darksteel Colossus -{11} -Artifact Creature - Golem -11/11 -Trample -Darksteel Colossus is indestructible. -If Darksteel Colossus would be put into a graveyard from anywhere, reveal Darksteel Colossus and shuffle it into its owner's library instead. -DST R, M10 M - -Darksteel Forge -{9} -Artifact -Artifacts you control are indestructible. ("Destroy" effects and lethal damage don't destroy them.) -DST R, HOP R - -Darksteel Gargoyle -{7} -Artifact Creature - Gargoyle -3/3 -Flying -Darksteel Gargoyle is indestructible. ("Destroy" effects and lethal damage don't destroy it.) -DST U - -Darksteel Garrison -{2} -Artifact - Fortification -Fortified land is indestructible. -Whenever fortified land becomes tapped, target creature gets +1/+1 until end of turn. -Fortify {3} ({3}: Attach to target land you control. Fortify only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the land leaves.) -FUT R - -Darksteel Ingot -{3} -Artifact -Darksteel Ingot is indestructible. ("Destroy" effects and lethal damage don't destroy it.) -{T}: Add one mana of any color to your mana pool. -DST C, COM C - -Darksteel Juggernaut -{5} -Artifact Creature - Juggernaut -*/* -Darksteel Juggernaut's power and toughness are each equal to the number of artifacts you control. -Darksteel Juggernaut is indestructible and attacks each turn if able. -SOM R - -Darksteel Myr -{3} -Artifact Creature - Myr -0/1 -Darksteel Myr is indestructible. (Lethal damage and effects that say "destroy" don't destroy it. If its toughness is 0 or less, it's still put into its owner's graveyard.) -SOM U - -Darksteel Pendant -{2} -Artifact -Darksteel Pendant is indestructible. ("Destroy" effects and lethal damage don't destroy it.) -{1}, {T}: Look at the top card of your library. You may put that card on the bottom of your library. -DST C - -Darksteel Plate -{3} -Artifact - Equipment -Darksteel Plate is indestructible. -Equipped creature is indestructible. -Equip {2} -MBS R - -Darksteel Reactor -{4} -Artifact -Darksteel Reactor is indestructible. ("Destroy" effects and lethal damage don't destroy it.) -At the beginning of your upkeep, you may put a charge counter on Darksteel Reactor. -When Darksteel Reactor has twenty or more charge counters on it, you win the game. -DST R - -Darksteel Relic -{0} -Artifact -Darksteel Relic is indestructible. (Effects that say "destroy" don't destroy it.) -NPH U - -Darksteel Sentinel -{6} -Artifact Creature - Golem -3/3 -Flash (You may cast this spell any time you could cast an instant.) -Vigilance -Darksteel Sentinel is indestructible. (Lethal damage and effects that say "destroy" don't destroy it. If its toughness is 0 or less, it's still put into its owner's graveyard.) -SOM U - -Darkwatch Elves -{2}{G} -Creature - Elf -2/2 -Protection from black -Cycling {2} ({2}, Discard this card: Draw a card.) -ULG U - -Darkwater Catacombs -Land -{1}, {T}: Add {U}{B} to your mana pool. -ODY R - -Darkwater Egg -{1} -Artifact -{2}, {T}, Sacrifice Darkwater Egg: Add {U}{B} to your mana pool. Draw a card. -ODY U - -Darting Merfolk -{1}{U} -Creature - Merfolk -1/1 -{U}: Return Darting Merfolk to its owner's hand. -MMQ C - -Daru Cavalier -{3}{W} -Creature - Human Soldier -2/2 -First strike -When Daru Cavalier enters the battlefield, you may search your library for a card named Daru Cavalier, reveal it, and put it into your hand. If you do, shuffle your library. -ONS C - -Daru Encampment -Land -{T}: Add {1} to your mana pool. -{W}, {T}: Target Soldier creature gets +1/+1 until end of turn. -ONS U, EVT U - -Daru Healer -{2}{W} -Creature - Human Cleric -1/2 -{T}: Prevent the next 1 damage that would be dealt to target creature or player this turn. -Morph {W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS C - -Daru Lancer -{4}{W}{W} -Creature - Human Soldier -3/4 -First strike -Morph {2}{W}{W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS C - -Daru Mender -{W} -Creature - Human Cleric -1/1 -Morph {W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Daru Mender is turned face up, regenerate target creature. -LGN U - -Daru Sanctifier -{3}{W} -Creature - Human Cleric -1/4 -Morph {1}{W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Daru Sanctifier is turned face up, destroy target enchantment. -LGN C - -Daru Spiritualist -{1}{W} -Creature - Human Cleric -1/1 -Whenever a Cleric creature you control becomes the target of a spell or ability, it gets +0/+2 until end of turn. -SCG C - -Daru Stinger -{3}{W} -Creature - Human Soldier -1/1 -Amplify 1 (As this creature enters the battlefield, put a +1/+1 counter on it for each Human and/or Soldier card you reveal in your hand.) -{T}: Daru Stinger deals damage equal to the number of +1/+1 counters on it to target attacking or blocking creature. -LGN C - -Daru Warchief -{2}{W}{W} -Creature - Human Soldier -1/1 -Soldier spells you cast cost {1} less to cast. -Soldier creatures you control get +1/+2. -SCG U - -Dash Hopes -{B}{B} -Instant -When you cast Dash Hopes, any player may pay 5 life. If a player does, counter Dash Hopes. -Counter target spell. -PLC C - -Daughter of Autumn -{2}{G}{G} -Legendary Creature - Avatar -2/4 -{W}: The next 1 damage that would be dealt to target white creature this turn is dealt to Daughter of Autumn instead. -HML R - -Daunting Defender -{4}{W} -Creature - Human Cleric -3/3 -If a source would deal damage to a Cleric creature you control, prevent 1 of that damage. -ONS C - -Dauntless Dourbark -{3}{G} -Creature - Treefolk Warrior -*/* -Dauntless Dourbark's power and toughness are each equal to the number of Forests you control plus the number of Treefolk you control. -Dauntless Dourbark has trample as long as you control another Treefolk. -LRW R - -Dauntless Escort -{1}{G}{W} -Creature - Rhino Soldier -3/3 -Sacrifice Dauntless Escort: Creatures you control are indestructible this turn. -ARB R - -Dauntless Escort Avatar -Vanguard -Hand +1, life +1 -Creatures you control have exalted. (Whenever a creature you control attacks alone, it gets +1/+1 until end of turn for each instance of exalted among permanents you control.) -VG S - -Dauthi Cutthroat -{1}{B} -Creature - Dauthi Minion -1/1 -Shadow (This creature can block or be blocked by only creatures with shadow.) -{1}{B}, {T}: Destroy target creature with shadow. -EXO U - -Dauthi Embrace -{2}{B} -Enchantment -{B}{B}: Target creature gains shadow until end of turn. (It can block or be blocked by only creatures with shadow.) -TMP U - -Dauthi Ghoul -{1}{B} -Creature - Dauthi Zombie -1/1 -Shadow (This creature can block or be blocked by only creatures with shadow.) -Whenever a creature with shadow dies, put a +1/+1 counter on Dauthi Ghoul. -TMP U - -Dauthi Horror -{1}{B} -Creature - Dauthi Horror -2/1 -Shadow (This creature can block or be blocked by only creatures with shadow.) -Dauthi Horror can't be blocked by white creatures. -TMP C - -Dauthi Jackal -{2}{B} -Creature - Dauthi Hound -2/1 -Shadow (This creature can block or be blocked by only creatures with shadow.) -{B}{B}, Sacrifice Dauthi Jackal: Destroy target blocking creature. -EXO C - -Dauthi Marauder -{2}{B} -Creature - Dauthi Minion -3/1 -Shadow (This creature can block or be blocked by only creatures with shadow.) -TMP C - -Dauthi Mercenary -{2}{B} -Creature - Dauthi Knight Mercenary -2/1 -Shadow (This creature can block or be blocked by only creatures with shadow.) -{1}{B}: Dauthi Mercenary gets +1/+0 until end of turn. -TMP U - -Dauthi Mindripper -{3}{B} -Creature - Dauthi Minion -2/1 -Shadow (This creature can block or be blocked by only creatures with shadow.) -Whenever Dauthi Mindripper attacks and isn't blocked, you may sacrifice it. If you do, defending player discards three cards. -TMP U - -Dauthi Slayer -{B}{B} -Creature - Dauthi Soldier -2/2 -Shadow (This creature can block or be blocked by only creatures with shadow.) -Dauthi Slayer attacks each turn if able. -TMP C, TSB S - -Dauthi Trapper -{2}{B} -Creature - Dauthi Minion -1/1 -{T}: Target creature gains shadow until end of turn. (It can block or be blocked by only creatures with shadow.) -STH U - -Dauthi Warlord -{1}{B} -Creature - Dauthi Soldier -*/1 -Shadow (This creature can block or be blocked by only creatures with shadow.) -Dauthi Warlord's power is equal to the number of creatures with shadow on the battlefield. -EXO U - -Dawn Charm -{1}{W} -Instant -Choose one - Prevent all combat damage that would be dealt this turn; or regenerate target creature; or counter target spell that targets you. -PLC C - -Dawn Elemental -{W}{W}{W}{W} -Creature - Elemental -3/3 -Flying -Prevent all damage that would be dealt to Dawn Elemental. -SCG R - -Dawn of the Dead -{2}{B}{B}{B} -Enchantment -At the beginning of your upkeep, you lose 1 life. -At the beginning of your upkeep, you may return target creature card from your graveyard to the battlefield. That creature gains haste until end of turn. Exile it at the beginning of the next end step. -TOR R - -Dawn's Reflection -{3}{G} -Enchantment - Aura -Enchant land -Whenever enchanted land is tapped for mana, its controller adds two mana in any combination of colors to his or her mana pool (in addition to the mana the land produces). -5DN C - -Dawnfluke -{3}{W} -Creature - Elemental -0/3 -Flash -When Dawnfluke enters the battlefield, prevent the next 3 damage that would be dealt to target creature or player this turn. -Evoke {W} (You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield.) -LRW C - -Dawnglare Invoker -{2}{W} -Creature - Kor Wizard -2/1 -Flying -{8}: Tap all creatures target player controls. -ROE C - -Dawnglow Infusion -{X}{G/W} -Sorcery -You gain X life if {G} was spent to cast Dawnglow Infusion and X life if {W} was spent to cast it. (Do both if {G}{W} was spent.) -SHM U - -Dawning Purist -{2}{W} -Creature - Human Cleric -2/2 -Whenever Dawning Purist deals combat damage to a player, you may destroy target enchantment that player controls. -Morph {1}{W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS U - -Dawnray Archer -{2}{U} -Creature - Human Archer -1/1 -Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.) -{W}, {T}: Dawnray Archer deals 1 damage to target attacking or blocking creature. -ALA U - -Dawnstrider -{1}{G} -Creature - Dryad Spellshaper -1/1 -{G}, {T}, Discard a card: Prevent all combat damage that would be dealt this turn. -MMQ R - -Day of Destiny -{3}{W} -Legendary Enchantment -Legendary creatures you control get +2/+2. -BOK R - -Day of Judgment -{2}{W}{W} -Sorcery -Destroy all creatures. -ZEN R, M11 R, M12 R - -Day of the Dragons -{4}{U}{U}{U} -Enchantment -When Day of the Dragons enters the battlefield, exile all creatures you control. Then put that many 5/5 red Dragon creature tokens with flying onto the battlefield. -When Day of the Dragons leaves the battlefield, sacrifice all Dragons you control. Then return the exiled cards to the battlefield under your control. -SCG R - -Daybreak Coronet -{W}{W} -Enchantment - Aura -Enchant creature with another Aura attached to it -Enchanted creature gets +3/+3 and has first strike, vigilance, and lifelink. (Damage dealt by the creature also causes its controller to gain that much life.) -FUT R - -Daze -{1}{U} -Instant -You may return an Island you control to its owner's hand rather than pay Daze's mana cost. -Counter target spell unless its controller pays {1}. -NEM C, JVC C - -Dazzling Beauty -{2}{W} -Instant -Cast Dazzling Beauty only during the declare blockers step. -Target unblocked attacking creature becomes blocked. (This spell works on unblockable creatures.) -Draw a card at the beginning of the next turn's upkeep. -MIR C - -Dead -{R} -Instant -Dead deals 2 damage to target creature. ----- -Gone -{2}{R} -Instant -Return target creature you don't control to its owner's hand. -PLC C - -Dead Reckoning -{1}{B}{B} -Sorcery -You may put target creature card from your graveyard on top of your library. If you do, Dead Reckoning deals damage equal to that card's power to target creature. -WWK C - -Dead Ringers -{4}{B} -Sorcery -Destroy two target nonblack creatures unless either one is a color the other isn't. They can't be regenerated. -APC C - -Dead-Iron Sledge -{1} -Artifact - Equipment -Whenever equipped creature blocks or becomes blocked by a creature, destroy both creatures. -Equip {2} ({2}: Attach to target creature you control. Equip only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.) -MRD U - -Deadapult -{2}{R} -Enchantment -{R}, Sacrifice a Zombie: Deadapult deals 2 damage to target creature or player. -PLS R - -Deadfall -{2}{G} -Enchantment -Creatures with forestwalk can be blocked as though they didn't have forestwalk. -LEG U - -Deadly Grub -{2}{B} -Creature - Insect -3/1 -Vanishing 3 (This permanent enters the battlefield with three time counters on it. At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.) -When Deadly Grub dies, if it had no time counters on it, put a 6/1 green Insect creature token with shroud onto the battlefield. (It can't be the target of spells or abilities.) -PLC C - -Deadly Insect -{4}{G} -Creature - Insect -6/1 -Shroud (This permanent can't be the target of spells or abilities.) -ALL C (x2), MMQ C, BTD C - -Deadly Recluse -{1}{G} -Creature - Spider -1/2 -Reach (This creature can block creatures with flying.) -Deathtouch (Any amount of damage this deals to a creature is enough to destroy it.) -M10 C, COM C - -Deadshot -{3}{R} -Sorcery -Tap target creature. It deals damage equal to its power to another target creature. -TMP R - -Deadshot Minotaur -{3}{R}{G} -Creature - Minotaur -3/4 -When Deadshot Minotaur enters the battlefield, it deals 3 damage to target creature with flying. -Cycling {R/G} ({R/G}, Discard this card: Draw a card.) -ARB C - -Deadwood Treefolk -{5}{G} -Creature - Treefolk -3/6 -Vanishing 3 (This permanent enters the battlefield with three time counters on it. At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.) -When Deadwood Treefolk enters the battlefield or leaves the battlefield, return another target creature card from your graveyard to your hand. -PLC U, COM U - -Death Baron -{1}{B}{B} -Creature - Zombie Wizard -2/2 -Skeleton creatures you control and other Zombie creatures you control get +1/+1 and have deathtouch. -ALA R, HOP R - -Death Bomb -{3}{B} -Instant -As an additional cost to cast Death Bomb, sacrifice a creature. -Destroy target nonblack creature. It can't be regenerated. Its controller loses 2 life. -PLS C - -Death Charmer -{2}{B} -Creature - Worm Mercenary -2/2 -Whenever Death Charmer deals combat damage to a creature, that creature's controller loses 2 life unless he or she pays {2}. -PCY C - -Death Cloud -{X}{B}{B}{B} -Sorcery -Each player loses X life, then discards X cards, then sacrifices X creatures, then sacrifices X lands. -DST R - -Death Cultist -{B} -Creature - Human Wizard -1/1 -Sacrifice Death Cultist: Target player loses 1 life and you gain 1 life. -ROE C - -Death Denied -{X}{B}{B} -Instant - Arcane -Return X target creature cards from your graveyard to your hand. -SOK C - -Death Grasp -{X}{W}{B} -Sorcery -Death Grasp deals X damage to target creature or player. You gain X life. -APC R - -Death Match -{3}{B} -Enchantment -Whenever a creature enters the battlefield, that creature's controller may have target creature of his or her choice get -3/-3 until end of turn. -ONS R - -Death Mutation -{6}{B}{G} -Sorcery -Destroy target nonblack creature. It can't be regenerated. Put X 1/1 green Saproling creature tokens onto the battlefield, where X is that creature's converted mana cost. -APC U, COM U - -Death Pit Offering -{2}{B}{B} -Enchantment -When Death Pit Offering enters the battlefield, sacrifice all creatures you control. -Creatures you control get +2/+2. -NEM R, 8ED R - -Death Pits of Rath -{3}{B}{B} -Enchantment -Whenever a creature is dealt damage, destroy it. It can't be regenerated. -TMP R, 8ED R, 9ED R - -Death Pulse -{2}{B}{B} -Instant -Target creature gets -4/-4 until end of turn. -Cycling {1}{B}{B} ({1}{B}{B}, Discard this card: Draw a card.) -When you cycle Death Pulse, you may have target creature get -1/-1 until end of turn. -ONS U - -Death Rattle -{5}{B} -Instant -Delve (You may exile any number of cards from your graveyard as you cast this spell. It costs {1} less to cast for each card exiled this way.) -Destroy target nongreen creature. It can't be regenerated. -FUT C - -Death Spark -{R} -Instant -Death Spark deals 1 damage to target creature or player. -At the beginning of your upkeep, if Death Spark is in your graveyard with a creature card directly above it, you may pay {1}. If you do, return Death Spark to your hand. -ALL U, ME2 C - -Death Speakers -{W} -Creature - Human Cleric -1/1 -Protection from black -HML U, 5ED C, MED C - -Death Stroke -{B}{B} -Sorcery -Destroy target tapped creature. -STH C, BTD C - -Death Ward -{W} -Instant -Regenerate target creature. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, ICE C, 5ED C, MED C - -Death Watch -{B} -Enchantment - Aura -Enchant creature -When enchanted creature dies, its controller loses life equal to its power and you gain life equal to its toughness. -VIS C - -Death Wish -{1}{B}{B} -Sorcery -You may choose a card you own from outside the game and put it into your hand. You lose half your life, rounded up. Exile Death Wish. -JUD R - -Death by Dragons -{4}{R}{R} -Sorcery -Each player other than target player puts a 5/5 red Dragon creature token with flying onto the battlefield. -COM U - -Death of a Thousand Stings -{4}{B} -Instant - Arcane -Target player loses 1 life and you gain 1 life. -At the beginning of your upkeep, if you have more cards in hand than each opponent, you may return Death of a Thousand Stings from your graveyard to your hand. -SOK C - -Death or Glory -{4}{W} -Sorcery -Separate all creature cards in your graveyard into two piles. Exile the pile of an opponent's choice and return the other to the battlefield. -INV R - -Death's Duet -{2}{B} -Sorcery -Return two target creature cards from your graveyard to your hand. -EXO C - -Death's Shadow -{B} -Creature - Avatar -13/13 -Death's Shadow gets -X/-X, where X is your life total. -WWK R - -Death's-Head Buzzard -{1}{B}{B} -Creature - Bird -2/1 -Flying -When Death's-Head Buzzard dies, all creatures get -1/-1 until end of turn. -SCG C - -Death-Hood Cobra -{1}{G} -Creature - Snake -2/2 -{1}{G}: Death-Hood Cobra gains reach until end of turn. (It can block creatures with flying.) -{1}{G}: Death-Hood Cobra gains deathtouch until end of turn. (Any amount of damage it deals to a creature is enough to destroy it.) -NPH C - -Death-Mask Duplicant -{7} -Artifact Creature - Shapeshifter -5/5 -Imprint - {1}: Exile target creature card from your graveyard. -As long as a card exiled with Death-Mask Duplicant has flying, Death-Mask Duplicant has flying. The same is true for fear, first strike, double strike, haste, landwalk, protection, and trample. -DST U - -Deathbringer Liege -{2}{W/B}{W/B}{W/B} -Creature - Horror -3/4 -Other white creatures you control get +1/+1. -Other black creatures you control get +1/+1. -Whenever you cast a white spell, you may tap target creature. -Whenever you cast a black spell, you may destroy target creature if it's tapped. -EVE R - -Deathbringer Thoctar -{4}{B}{R} -Creature - Zombie Beast -3/3 -Whenever another creature dies, you may put a +1/+1 counter on Deathbringer Thoctar. -Remove a +1/+1 counter from Deathbringer Thoctar: Deathbringer Thoctar deals 1 damage to target creature or player. -ARB R - -Deathcoil Wurm -{6}{G}{G} -Creature - Wurm -7/6 -You may have Deathcoil Wurm assign its combat damage as though it weren't blocked. -P02 R, ME4 R - -Deathcurse Ogre -{5}{B} -Creature - Ogre Warrior -3/3 -When Deathcurse Ogre dies, each player loses 3 life. -CHK C - -Deathforge Shaman -{4}{R} -Creature - Ogre Shaman -4/3 -Multikicker {R} (You may pay an additional {R} any number of times as you cast this spell.) -When Deathforge Shaman enters the battlefield, it deals damage to target player equal to twice the number of times it was kicked. -WWK U - -Deathgazer -{3}{B} -Creature - Lizard -2/2 -Whenever Deathgazer blocks or becomes blocked by a nonblack creature, destroy that creature at end of combat. -MMQ U, 8ED U, 9ED U - -Deathgreeter -{B} -Creature - Human Shaman -1/1 -Whenever another creature dies, you may gain 1 life. -ALA C, GVL C - -Deathgrip -{B}{B} -Enchantment -{B}{B}: Counter target green spell. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, ME4 R - -Deathknell Kami -{1}{B} -Creature - Spirit -0/1 -Flying -{2}: Deathknell Kami gets +1/+1 until end of turn. Sacrifice it at the beginning of the next end step. -Soulshift 1 (When this creature dies, you may return target Spirit card with converted mana cost 1 or less from your graveyard to your hand.) -SOK C - -Deathlace -{B} -Instant -Target spell or permanent becomes black. (Mana symbols on that permanent remain unchanged.) -LEA R, LEB R, 2ED R, 3ED R, 4ED R - -Deathless Angel -{4}{W}{W} -Creature - Angel -5/7 -Flying -{W}{W}: Target creature is indestructible this turn. -ROE R - -Deathmark -{B} -Sorcery -Destroy target green or white creature. -CSP U, 10E U, M10 U, M11 U, M12 U - -Deathmark Prelate -{3}{B} -Creature - Human Cleric -2/3 -{2}{B}, {T}, Sacrifice a Zombie: Destroy target non-Zombie creature. It can't be regenerated. Activate this ability only any time you could cast a sorcery. -LGN U - -Deathmask Nezumi -{2}{B} -Creature - Rat Shaman -2/2 -As long as you have seven or more cards in hand, Deathmask Nezumi gets +2/+1 and has fear. (It can't be blocked except by artifact creatures and/or black creatures.) -SOK C - -Deathrender -{4} -Artifact - Equipment -Equipped creature gets +2/+2. -Whenever equipped creature dies, you may put a creature card from your hand onto the battlefield and attach Deathrender to it. -Equip {2} -LRW R - -Deathspore Thallid -{1}{B} -Creature - Zombie Fungus -1/1 -At the beginning of your upkeep, put a spore counter on Deathspore Thallid. -Remove three spore counters from Deathspore Thallid: Put a 1/1 green Saproling creature token onto the battlefield. -Sacrifice a Saproling: Target creature gets -1/-1 until end of turn. -TSP C - -Debt of Loyalty -{1}{W}{W} -Instant -Regenerate target creature. You gain control of that creature if it regenerates this way. -WTH R - -Debtors' Knell -{4}{W/B}{W/B}{W/B} -Enchantment -({W/B} can be paid with either {W} or {B}.) -At the beginning of your upkeep, put target creature card from a graveyard onto the battlefield under your control. -GPT R - -Decaying Soil -{1}{B}{B} -Enchantment -At the beginning of your upkeep, exile a card from your graveyard. -Threshold - As long as seven or more cards are in your graveyard, Decaying Soil has "Whenever a nontoken creature is put into your graveyard from the battlefield, you may pay {1}. If you do, return that card to your hand." -ODY R - -Deceiver Exarch -{2}{U} -Creature - Cleric -1/4 -Flash (You may cast this spell any time you could cast an instant.) -When Deceiver Exarch enters the battlefield, choose one - Untap target permanent you control; or tap target permanent an opponent controls. -NPH U - -Deception -{2}{B} -Sorcery -Target opponent discards two cards. -PTK C - -Decimate -{2}{R}{G} -Sorcery -Destroy target artifact, target creature, target enchantment, and target land. -ODY R - -Decimator Web -{4} -Artifact -{4}, {T}: Target opponent loses 2 life, gets a poison counter, then puts the top six cards of his or her library into his or her graveyard. -MBS R - -Declaration of Naught -{U}{U} -Enchantment -As Declaration of Naught enters the battlefield, name a card. -{U}: Counter target spell with the chosen name. -MOR R - -Decompose -{1}{B} -Sorcery -Exile up to three target cards from a single graveyard. -ODY U - -Decomposition -{1}{G} -Enchantment - Aura -Enchant black creature -Enchanted creature has "Cumulative upkeep-Pay 1 life." (At the beginning of its controller's upkeep, that player puts an age counter on it, then sacrifices it unless he or she pays its upkeep cost for each age counter on it.) -When enchanted creature dies, its controller loses 2 life. -MIR U - -Deconstruct -{2}{G} -Sorcery -Destroy target artifact. Add {G}{G}{G} to your mana pool. -MRD C - -Decree of Annihilation -{8}{R}{R} -Sorcery -Exile all artifacts, creatures, and lands from the battlefield, all cards from all graveyards, and all cards from all hands. -Cycling {5}{R}{R} ({5}{R}{R}, Discard this card: Draw a card.) -When you cycle Decree of Annihilation, destroy all lands. -SCG R - -Decree of Justice -{X}{X}{2}{W}{W} -Sorcery -Put X 4/4 white Angel creature tokens with flying onto the battlefield. -Cycling {2}{W} ({2}{W}, Discard this card: Draw a card.) -When you cycle Decree of Justice, you may pay {X}. If you do, put X 1/1 white Soldier creature tokens onto the battlefield. -SCG R - -Decree of Pain -{6}{B}{B} -Sorcery -Destroy all creatures. They can't be regenerated. Draw a card for each creature destroyed this way. -Cycling {3}{B}{B} ({3}{B}{B}, Discard this card: Draw a card.) -When you cycle Decree of Pain, all creatures get -2/-2 until end of turn. -SCG R - -Decree of Savagery -{7}{G}{G} -Instant -Put four +1/+1 counters on each creature you control. -Cycling {4}{G}{G} ({4}{G}{G}, Discard this card: Draw a card.) -When you cycle Decree of Savagery, you may put four +1/+1 counters on target creature. -SCG R - -Decree of Silence -{6}{U}{U} -Enchantment -Whenever an opponent casts a spell, counter that spell and put a depletion counter on Decree of Silence. If there are three or more depletion counters on Decree of Silence, sacrifice it. -Cycling {4}{U}{U} ({4}{U}{U}, Discard this card: Draw a card.) -When you cycle Decree of Silence, you may counter target spell. -SCG R - -Dedicated Martyr -{W} -Creature - Human Cleric -1/1 -{W}, Sacrifice Dedicated Martyr: You gain 3 life. -ODY C - -Deep Analysis -{3}{U} -Sorcery -Target player draws two cards. -Flashback-{1}{U}, Pay 3 life. (You may cast this card from your graveyard for its flashback cost. Then exile it.) -TOR C - -Deep Reconnaissance -{2}{G} -Sorcery -Search your library for a basic land card and put that card onto the battlefield tapped. Then shuffle your library. -Flashback {4}{G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY U - -Deep Spawn -{5}{U}{U}{U} -Creature - Homarid -6/6 -Trample -At the beginning of your upkeep, sacrifice Deep Spawn unless you put the top two cards of your library into your graveyard. -{U}: Deep Spawn gains shroud until end of turn and doesn't untap during your next untap step. Tap Deep Spawn. (A permanent with shroud can't be the target of spells or abilities.) -FEM U, ME2 R - -Deep Water -{U}{U} -Enchantment -{U}: Until end of turn, if you tap a land you control for mana, it produces {U} instead of any other type. -DRK C - -Deep Wood -{1}{G} -Instant -Cast Deep Wood only during the declare attackers step and only if you've been attacked this step. -Prevent all damage that would be dealt to you this turn by attacking creatures. -POR U, P02 U - -Deep-Sea Kraken -{7}{U}{U}{U} -Creature - Kraken -6/6 -Deep-Sea Kraken is unblockable. -Suspend 9-{2}{U} (Rather than cast this card from your hand, you may pay {2}{U} and exile it with nine time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -Whenever an opponent casts a spell, if Deep-Sea Kraken is suspended, remove a time counter from it. -TSP R - -Deep-Sea Serpent -{4}{U}{U} -Creature - Serpent -5/5 -Deep-Sea Serpent can't attack unless defending player controls an Island. -POR U - -Deep-Slumber Titan -{2}{R}{R} -Creature - Giant Warrior -7/7 -Deep-Slumber Titan enters the battlefield tapped. -Deep-Slumber Titan doesn't untap during your untap step. -Whenever Deep-Slumber Titan is dealt damage, untap it. -SHM R - -Deepcavern Imp -{2}{B} -Creature - Imp Rebel -2/2 -Flying, haste -Echo-Discard a card. (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -FUT C - -Deepchannel Mentor -{5}{U} -Creature - Merfolk Rogue -2/2 -Blue creatures you control are unblockable. -SHM U - -Deepfire Elemental -{4}{B}{R} -Creature - Elemental -4/4 -{X}{X}{1}: Destroy target artifact or creature with converted mana cost X. -CSP U - -Deeptread Merrow -{1}{U} -Creature - Merfolk Rogue -2/1 -{U}: Deeptread Merrow gains islandwalk until end of turn. -LRW C - -Deepwood Drummer -{1}{G} -Creature - Human Spellshaper -1/1 -{G}, {T}, Discard a card: Target creature gets +2/+2 until end of turn. -MMQ C - -Deepwood Elder -{G}{G} -Creature - Dryad Spellshaper -2/2 -{X}{G}{G}, {T}, Discard a card: X target lands become Forests until end of turn. -MMQ R - -Deepwood Ghoul -{2}{B} -Creature - Zombie -2/1 -Pay 2 life: Regenerate Deepwood Ghoul. -MMQ C, 8ED C - -Deepwood Legate -{3}{B} -Creature - Shade -1/1 -If an opponent controls a Forest and you control a Swamp, you may cast Deepwood Legate without paying its mana cost. -{B}: Deepwood Legate gets +1/+1 until end of turn. -MMQ U - -Deepwood Tantiv -{4}{G} -Creature - Beast -2/4 -Whenever Deepwood Tantiv becomes blocked, you gain 2 life. -MMQ U - -Deepwood Wolverine -{G} -Creature - Wolverine -1/1 -Whenever Deepwood Wolverine becomes blocked, it gets +2/+0 until end of turn. -MMQ C - -Defender en-Vec -{3}{W} -Creature - Human Cleric -2/4 -Fading 4 (This creature enters the battlefield with four fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.) -Remove a fade counter from Defender en-Vec: Prevent the next 2 damage that would be dealt to target creature or player this turn. -NEM C - -Defender of Chaos -{2}{R} -Creature - Human Knight -2/1 -Flash -Protection from white -ULG C - -Defender of Law -{2}{W} -Creature - Human Knight -2/1 -Flash -Protection from red -ULG C - -Defender of the Order -{3}{W} -Creature - Human Cleric -2/4 -Morph {W}{W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Defender of the Order is turned face up, creatures you control get +0/+2 until end of turn. -LGN R - -Defense Grid -{2} -Artifact -Each spell costs {3} more to cast except during its controller's turn. -ULG R, 8ED R, 9ED R - -Defense of the Heart -{3}{G} -Enchantment -At the beginning of your upkeep, if an opponent controls three or more creatures, sacrifice Defense of the Heart, search your library for up to two creature cards, and put those cards onto the battlefield. Then shuffle your library. -ULG R - -Defensive Formation -{W} -Enchantment -Rather than the attacking player, you assign the combat damage of each creature attacking you. You can divide that creature's combat damage as you choose among any of the creatures blocking it. -USG U - -Defensive Maneuvers -{3}{W} -Instant -Creatures of the creature type of your choice get +0/+4 until end of turn. -ONS C - -Defensive Stance -{U} -Enchantment - Aura -Enchant creature -Enchanted creature gets -1/+1. -NPH C - -Defiant Elf -{G} -Creature - Elf -1/1 -Trample -LGN C - -Defiant Falcon -{1}{W} -Creature - Rebel Bird -1/1 -Flying -{4}, {T}: Search your library for a Rebel permanent card with converted mana cost 3 or less and put it onto the battlefield. Then shuffle your library. -NEM C - -Defiant Stand -{1}{W} -Instant -Cast Defiant Stand only during the declare attackers step and only if you've been attacked this step. -Target creature gets +1/+3 until end of turn. Untap that creature. -POR U - -Defiant Vanguard -{2}{W} -Creature - Human Rebel -2/2 -When Defiant Vanguard blocks, at end of combat, destroy it and all creatures it blocked this turn. -{5}, {T}: Search your library for a Rebel permanent card with converted mana cost 4 or less and put it onto the battlefield. Then shuffle your library. -NEM U, TSB S - -Defiler of Souls -{3}{B}{B}{R} -Creature - Demon -5/5 -Flying -At the beginning of each player's upkeep, that player sacrifices a monocolored creature. -ARB M - -Defiling Tears -{2}{B} -Instant -Until end of turn, target creature becomes black, gets +1/-1, and gains "{B}: Regenerate this creature." -INV U - -Deflection -{3}{U} -Instant -Change the target of target spell with a single target. -ICE R, 5ED R, 6ED R, 7ED R, 8ED R - -Deft Duelist -{W}{U} -Creature - Human Rogue -2/1 -First strike -Shroud (This creature can't be the target of spells or abilities.) -ALA C - -Deftblade Elite -{W} -Creature - Human Soldier -1/1 -Provoke (When this attacks, you may have target creature defending player controls untap and block it if able.) -{1}{W}: Prevent all combat damage that would be dealt to and dealt by Deftblade Elite this turn. -LGN C - -Defy Gravity -{U} -Instant -Target creature gains flying until end of turn. -Flashback {U} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -JUD C - -Dega Disciple -{W} -Creature - Human Wizard -1/1 -{B}, {T}: Target creature gets -2/-0 until end of turn. -{R}, {T}: Target creature gets +2/+0 until end of turn. -APC C - -Dega Sanctuary -{2}{W} -Enchantment -At the beginning of your upkeep, if you control a black or red permanent, you gain 2 life. If you control a black permanent and a red permanent, you gain 4 life instead. -APC U - -Degavolver -{1}{W} -Creature - Volver -1/1 -Kicker {1}{B} and/or {R} (You may pay an additional {1}{B} and/or {R} as you cast this spell.) -If Degavolver was kicked with its {1}{B} kicker, it enters the battlefield with two +1/+1 counters on it and with "Pay 3 life: Regenerate Degavolver." -If Degavolver was kicked with its {R} kicker, it enters the battlefield with a +1/+1 counter on it and with first strike. -APC R - -Deglamer -{1}{G} -Instant -Choose target artifact or enchantment. Its owner shuffles it into his or her library. -MOR C - -Dehydration -{3}{U} -Enchantment - Aura -Enchant creature (Target a creature as you cast this. This card enters the battlefield attached to that creature.) -Enchanted creature doesn't untap during its controller's untap step. -MMQ C, 8ED C, 9ED C, 10E C - -Deity of Scars -{B/G}{B/G}{B/G}{B/G}{B/G} -Creature - Spirit Avatar -7/7 -Trample -Deity of Scars enters the battlefield with two -1/-1 counters on it. -{B/G}, Remove a -1/-1 counter from Deity of Scars: Regenerate Deity of Scars. -EVE R - -Deja Vu -{2}{U} -Sorcery -Return target sorcery card from your graveyard to your hand. -POR C, P02 C - -Delay -{1}{U} -Instant -Counter target spell. If the spell is countered this way, exile it with three time counters on it instead of putting it into its owner's graveyard. If it doesn't have suspend, it gains suspend. (At the beginning of its owner's upkeep, remove a counter from that card. When the last is removed, the player plays it without paying its mana cost. If it's a creature, it has haste.) -FUT U - -Delaying Shield -{3}{W} -Enchantment -If damage would be dealt to you, put that many delay counters on Delaying Shield instead. -At the beginning of your upkeep, remove all delay counters from Delaying Shield. For each delay counter removed this way, you lose 1 life unless you pay {1}{W}. -ODY R - -Delif's Cone -{0} -Artifact -{T}, Sacrifice Delif's Cone: This turn, when target creature you control attacks and isn't blocked, you may gain life equal to its power. If you do, it assigns no combat damage this turn. -FEM C - -Delif's Cube -{1} -Artifact -{2}, {T}: This turn, when target creature you control attacks and isn't blocked, it assigns no combat damage this turn and you put a cube counter on Delif's Cube. -{2}, Remove a cube counter from Delif's Cube: Regenerate target creature. -FEM R - -Delirium -{1}{B}{R} -Instant -Cast Delirium only during an opponent's turn. -Tap target creature that player controls. That creature deals damage equal to its power to the player. Prevent all combat damage that would be dealt to and dealt by the creature this turn. -MIR U - -Delirium Skeins -{2}{B} -Sorcery -Each player discards three cards. -DIS C - -Delraich -{6}{B} -Creature - Horror -6/6 -Trample -You may sacrifice three black creatures rather than pay Delraich's mana cost. -MMQ R - -Deluge -{2}{U} -Instant -Tap all creatures without flying. -ODY U, 10E U - -Delusions of Mediocrity -{3}{U} -Enchantment -When Delusions of Mediocrity enters the battlefield, you gain 10 life. -When Delusions of Mediocrity leaves the battlefield, you lose 10 life. -ULG R, 7ED R - -Dematerialize -{3}{U} -Sorcery -Return target permanent to its owner's hand. -Flashback {5}{U}{U} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY C - -Dementia Bat -{4}{B} -Creature - Bat -2/2 -Flying -{4}{B}, Sacrifice Dementia Bat: Target player discards two cards. -NPH C - -Dementia Sliver -{3}{U}{B} -Creature - Sliver -3/3 -All Slivers have "{T}: Name a card. Target opponent reveals a card at random from his or her hand. If it's the named card, that player discards it. Activate this ability only during your turn." -TSP U - -Demigod of Revenge -{B/R}{B/R}{B/R}{B/R}{B/R} -Creature - Spirit Avatar -5/4 -Flying, haste -When you cast Demigod of Revenge, return all cards named Demigod of Revenge from your graveyard to the battlefield. -SHM R - -Demolish -{3}{R} -Sorcery -Destroy target artifact or land. -ODY U, 8ED U, 9ED U, 10E C, ZEN C, M11 C - -Demon of Death's Gate -{6}{B}{B}{B} -Creature - Demon -9/9 -You may pay 6 life and sacrifice three black creatures rather than pay Demon of Death's Gate's mana cost. -Flying, trample -M11 M - -Demon's Herald -{B} -Creature - Human Wizard -1/1 -{2}{B}, {T}, Sacrifice a blue creature, a black creature, and a red creature: Search your library for a card named Prince of Thralls and put it onto the battlefield. Then shuffle your library. -ALA U - -Demon's Horn -{2} -Artifact -Whenever a player casts a black spell, you may gain 1 life. -DST U, 9ED U, 10E U, DVD U, M10 U, M11 U, M12 U - -Demon's Jester -{3}{B} -Creature - Imp -2/2 -Flying -Hellbent - Demon's Jester gets +2/+1 as long as you have no cards in hand. -DIS C, DVD C - -Demonfire -{X}{R} -Sorcery -Demonfire deals X damage to target creature or player. If a creature dealt damage this way would die this turn, exile it instead. -Hellbent - If you have no cards in hand, Demonfire can't be countered by spells or abilities and the damage can't be prevented. -DIS R, JVC R - -Demonic Appetite -{B} -Enchantment - Aura -Enchant creature you control -Enchanted creature gets +3/+3. -At the beginning of your upkeep, sacrifice a creature. -ROE C - -Demonic Attorney -{1}{B}{B} -Sorcery -Remove Demonic Attorney from your deck before playing if you're not playing for ante. -Each player antes the top card of his or her library. -LEA R, LEB R, 2ED R, 3ED R - -Demonic Collusion -{3}{B}{B} -Sorcery -Buyback-Discard two cards. (You may discard two cards in addition to any other costs as you cast this spell. If you do, put this card into your hand as it resolves.) -Search your library for a card and put that card into your hand. Then shuffle your library. -TSP R - -Demonic Consultation -{B} -Instant -Name a card. Exile the top six cards of your library, then reveal cards from the top of your library until you reveal the named card. Put that card into your hand and exile all other cards revealed this way. -ICE U, ME2 U - -Demonic Dread -{1}{B}{R} -Sorcery -Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.) -Target creature can't block this turn. -ARB C - -Demonic Hordes -{3}{B}{B}{B} -Creature - Demon -5/5 -{T}: Destroy target land. -At the beginning of your upkeep, unless you pay {B}{B}{B}, tap Demonic Hordes and sacrifice a land of an opponent's choice. -LEA R, LEB R, 2ED R, 3ED R, ME4 R - -Demonic Torment -{2}{B} -Enchantment - Aura -Enchant creature -Enchanted creature can't attack. -Prevent all combat damage that would be dealt by enchanted creature. -LEG U, ME3 C - -Demonic Tutor -{1}{B} -Sorcery -Search your library for a card and put that card into your hand. Then shuffle your library. -LEA U, LEB U, 2ED U, 3ED U, DVD U, ME4 R - -Demonspine Whip -{B}{R} -Artifact - Equipment -{X}: Equipped creature gets +X/+0 until end of turn. -Equip {1} -ARB U - -Demoralize -{2}{R} -Instant -Each creature can't be blocked this turn except by two or more creatures. -Threshold - If seven or more cards are in your graveyard, creatures can't block this turn. -ODY C - -Demystify -{W} -Instant -Destroy target enchantment. -ONS C, 8ED C, 9ED C, 10E C, ROE C, M12 C - -Denizen of the Deep -{6}{U}{U} -Creature - Serpent -11/11 -When Denizen of the Deep enters the battlefield, return each other creature you control to its owner's hand. -P02 R, S99 R, 10E R - -Dense Canopy -{1}{G} -Enchantment -Creatures with flying can block only creatures with flying. -SOK U - -Dense Foliage -{2}{G} -Enchantment -Creatures can't be the targets of spells. -WTH R, 6ED R - -Deny Reality -{3}{U}{B} -Sorcery -Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.) -Return target permanent to its owner's hand. -ARB C - -Denying Wind -{7}{U}{U} -Sorcery -Search target player's library for up to seven cards and exile them. Then that player shuffles his or her library. -PCY R - -Deprive -{U}{U} -Instant -As an additional cost to cast Deprive, return a land you control to its owner's hand. -Counter target spell. -ROE C - -Deranged Hermit -{3}{G}{G} -Creature - Elf -1/1 -Echo {3}{G}{G} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -When Deranged Hermit enters the battlefield, put four 1/1 green Squirrel creature tokens onto the battlefield. -Squirrel creatures get +1/+1. -ULG R - -Derelor -{3}{B} -Creature - Thrull -4/4 -Black spells you cast cost {B} more to cast. -FEM R, 5ED R, 6ED R, MED U - -Dermoplasm -{2}{U} -Creature - Shapeshifter -1/1 -Flying -Morph {2}{U}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Dermoplasm is turned face up, you may put a creature card with morph from your hand onto the battlefield face up. If you do, return Dermoplasm to its owner's hand. -LGN R - -Descendant of Kiyomaro -{1}{W}{W} -Creature - Human Soldier -2/3 -As long as you have more cards in hand than each opponent, Descendant of Kiyomaro gets +1/+2 and has "Whenever this creature deals combat damage, you gain 3 life." -SOK U - -Descendant of Masumaro -{2}{G} -Creature - Human Monk -1/1 -At the beginning of your upkeep, put a +1/+1 counter on Descendant of Masumaro for each card in your hand, then remove a +1/+1 counter from Descendant of Masumaro for each card in target opponent's hand. -SOK U - -Descendant of Soramaro -{3}{U} -Creature - Human Wizard -2/3 -{1}{U}: Look at the top X cards of your library, where X is the number of cards in your hand, then put them back in any order. -SOK C - -Desecrated Earth -{4}{B} -Sorcery -Destroy target land. Its controller discards a card. -ZEN C - -Desecration Elemental -{3}{B} -Creature - Elemental -8/8 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -Whenever a player casts a spell, sacrifice a creature. -5DN R - -Desecrator Hag -{2}{B/G}{B/G} -Creature - Hag -2/2 -When Desecrator Hag enters the battlefield, return to your hand the creature card in your graveyard with the greatest power. If two or more cards are tied for greatest power, you choose one of them. -EVE C, COM C - -Desert -Land - Desert -{T}: Add {1} to your mana pool. -{T}: Desert deals 1 damage to target attacking creature. Activate this ability only during the end of combat step. -ARN C, TSB S - -Desert Drake -{3}{R} -Creature - Drake -2/2 -Flying -POR U - -Desert Nomads -{2}{R} -Creature - Human Nomad -2/2 -Desertwalk -Prevent all damage that would be dealt to Desert Nomads by Deserts. -ARN C - -Desert Sandstorm -{2}{R} -Sorcery -Desert Sandstorm deals 1 damage to each creature. -PTK C - -Desert Twister -{4}{G}{G} -Sorcery -Destroy target permanent. -ARN U, 3ED U, 4ED U, 5ED U, MMQ U, ME3 U - -Deserted Temple -Land -{T}: Add {1} to your mana pool. -{1}, {T}: Untap target land. -ODY R - -Desertion -{3}{U}{U} -Instant -Counter target spell. If an artifact or creature spell is countered this way, put that card onto the battlefield under your control instead of into its owner's graveyard. -VIS R, 6ED R - -Desolation -{1}{B}{B} -Enchantment -At the beginning of each end step, each player who tapped a land for mana this turn sacrifices a land. If a Plains is sacrificed this way, Desolation deals 2 damage to that Plains's controller. -VIS U - -Desolation Angel -{3}{B}{B} -Creature - Angel -5/4 -Kicker {W}{W} (You may pay an additional {W}{W} as you cast this spell.) -Flying -When Desolation Angel enters the battlefield, destroy all lands you control. If it was kicked, destroy all lands instead. -APC R - -Desolation Giant -{2}{R}{R} -Creature - Giant -3/3 -Kicker {W}{W} (You may pay an additional {W}{W} as you cast this spell.) -When Desolation Giant enters the battlefield, destroy all other creatures you control. If it was kicked, destroy all other creatures instead. -APC R, TSB S - -Desperate Charge -{2}{B} -Sorcery -Creatures you control get +2/+0 until end of turn. -PTK U, ME3 C - -Desperate Gambit -{R} -Instant -Choose a source you control and flip a coin. If you win the flip, the next time that source would deal damage this turn, it deals double that damage instead. If you lose the flip, the next time it would deal damage this turn, prevent that damage. -WTH U - -Desperate Research -{1}{B} -Sorcery -Name a card other than a basic land card. Then reveal the top seven cards of your library and put all of them with that name into your hand. Exile the rest. -INV R - -Desperate Ritual -{1}{R} -Instant - Arcane -Add {R}{R}{R} to your mana pool. -Splice onto Arcane {1}{R} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -CHK C - -Despise -{B} -Sorcery -Target opponent reveals his or her hand. You choose a creature or planeswalker card from it. That player discards that card. -NPH U - -Despoil -{3}{B} -Sorcery -Destroy target land. Its controller loses 2 life. -PCY C - -Despondency -{1}{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets -2/-0. -When Despondency is put into a graveyard from the battlefield, return Despondency to its owner's hand. -USG C - -Despotic Scepter -{1} -Artifact -{T}: Destroy target permanent you own. It can't be regenerated. -ICE R, ME2 R - -Destructive Flow -{B}{R}{G} -Enchantment -At the beginning of each player's upkeep, that player sacrifices a nonbasic land. -PLS R - -Destructive Force -{5}{R}{R} -Sorcery -Each player sacrifices five lands. Destructive Force deals 5 damage to each creature. -M11 R - -Destructive Urge -{1}{R}{R} -Enchantment - Aura -Enchant creature -Whenever enchanted creature deals combat damage to a player, that player sacrifices a land. -USG U - -Detainment Spell -{W} -Enchantment - Aura -Enchant creature -Enchanted creature's activated abilities can't be activated. -{1}{W}: Attach Detainment Spell to target creature. -TSP C - -Detonate -{X}{R} -Sorcery -Destroy target artifact with converted mana cost X. It can't be regenerated. Detonate deals X damage to that artifact's controller. -ATQ U, 4ED U, 5ED U, MRD U, ME4 U - -Detritivore -{2}{R}{R} -Creature - Lhurgoyf -*/* -Detritivore's power and toughness are each equal to the number of nonbasic land cards in your opponents' graveyards. -Suspend X-{X}{3}{R}. X can't be 0. (Rather than cast this card from your hand, you may pay {X}{3}{R} and exile it with X time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -Whenever a time counter is removed from Detritivore while it's exiled, destroy target nonbasic land. -PLC R - -Deus of Calamity -{R/G}{R/G}{R/G}{R/G}{R/G} -Creature - Spirit Avatar -6/6 -Trample -Whenever Deus of Calamity deals 6 or more damage to an opponent, destroy target land that player controls. -SHM R - -Devastate -{3}{R}{R} -Sorcery -Destroy target land. Devastate deals 1 damage to each creature and each player. -PCY C - -Devastating Dreams -{R}{R} -Sorcery -As an additional cost to cast Devastating Dreams, discard X cards at random. -Each player sacrifices X lands. Devastating Dreams deals X damage to each creature. -TOR R - -Devastating Summons -{R} -Sorcery -As an additional cost to cast Devastating Summons, sacrifice X lands. -Put two X/X red Elemental creature tokens onto the battlefield. -ROE R - -Devastation -{5}{R}{R} -Sorcery -Destroy all creatures and lands. -POR R, S99 R, ME4 R - -Devoted Caretaker -{W} -Creature - Human Cleric -1/2 -{W}, {T}: Target permanent you control gains protection from instant spells and from sorcery spells until end of turn. -ODY R - -Devoted Druid -{1}{G} -Creature - Elf Druid -0/2 -{T}: Add {G} to your mana pool. -Put a -1/-1 counter on Devoted Druid: Untap Devoted Druid. -SHM C - -Devoted Hero -{W} -Creature - Elf Soldier -1/2 -POR C, S99 C - -Devoted Retainer -{W} -Creature - Human Samurai -1/1 -Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -CHK C - -Devour in Shadow -{B}{B} -Instant -Destroy target creature. It can't be regenerated. You lose life equal to that creature's toughness. -5DN U - -Devouring Deep -{2}{U} -Creature - Fish -1/2 -Islandwalk -LEG C - -Devouring Greed -{2}{B}{B} -Sorcery - Arcane -As an additional cost to cast Devouring Greed, you may sacrifice any number of Spirits. -Target player loses 2 life plus 2 life for each Spirit sacrificed this way. You gain that much life. -CHK C - -Devouring Light -{1}{W}{W} -Instant -Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.) -Exile target attacking or blocking creature. -RAV U - -Devouring Rage -{4}{R} -Instant - Arcane -As an additional cost to cast Devouring Rage, you may sacrifice any number of Spirits. -Target creature gets +3/+0 until end of turn. For each Spirit sacrificed this way, that creature gets an additional +3/+0 until end of turn. -CHK C - -Devouring Strossus -{5}{B}{B}{B} -Creature - Horror -9/9 -Flying, trample -At the beginning of your upkeep, sacrifice a creature. -Sacrifice a creature: Regenerate Devouring Strossus. -INV R - -Devouring Swarm -{1}{B}{B} -Creature - Insect -2/1 -Flying -Sacrifice a creature: Devouring Swarm gets +1/+1 until end of turn. -M12 C - -Devout Harpist -{W} -Creature - Human -1/1 -{T}: Destroy target Aura attached to a creature. -ULG C - -Devout Lightcaster -{W}{W}{W} -Creature - Kor Cleric -2/2 -Protection from black -When Devout Lightcaster enters the battlefield, exile target black permanent. -ZEN R - -Devout Monk -{W} -Creature - Human Monk Cleric -1/1 -When Devout Monk enters the battlefield, you gain 1 life. -S99 C - -Devout Witness -{2}{W} -Creature - Human Spellshaper -2/2 -{1}{W}, {T}, Discard a card: Destroy target artifact or enchantment. -MMQ C - -Dewdrop Spy -{1}{U}{U} -Creature - Faerie Rogue -2/2 -Flash -Flying -When Dewdrop Spy enters the battlefield, look at the top card of target player's library. -MOR C - -Diabolic Edict -{1}{B} -Instant -Target player sacrifices a creature. -TMP C, BTD C - -Diabolic Intent -{1}{B} -Sorcery -As an additional cost to cast Diabolic Intent, sacrifice a creature. -Search your library for a card and put that card into your hand. Then shuffle your library. -PLS R - -Diabolic Machine -{7} -Artifact Creature - Construct -4/4 -{3}: Regenerate Diabolic Machine. -DRK U, 4ED U, 5ED U, ME4 U - -Diabolic Servitude -{3}{B} -Enchantment -When Diabolic Servitude enters the battlefield, return target creature card from your graveyard to the battlefield. -When the creature put onto the battlefield with Diabolic Servitude dies, exile it and return Diabolic Servitude to its owner's hand. -When Diabolic Servitude leaves the battlefield, exile the creature put onto the battlefield with Diabolic Servitude. -USG U - -Diabolic Tutor -{2}{B}{B} -Sorcery -Search your library for a card and put that card into your hand. Then shuffle your library. -ODY U, 8ED U, 9ED U, 10E U, M10 U, M11 U, COM U, M12 U - -Diabolic Vision -{U}{B} -Sorcery -Look at the top five cards of your library. Put one of them into your hand and the rest on top of your library in any order. -ICE U, BTD U, ME2 U - -Diamond Faerie -{2}{G}{W}{U} -Snow Creature - Faerie -3/3 -Flying -{1}{S}: Snow creatures you control get +1/+1 until end of turn. ({S} can be paid with one mana from a snow permanent.) -CSP R - -Diamond Faerie Avatar -Vanguard -Hand +0, life +5 -{S}: Target creature you control gets +1/+1 until end of turn. -VG S - -Diamond Kaleidoscope -{4} -Artifact -{3}, {T}: Put a 0/1 colorless Prism artifact creature token onto the battlefield. -Sacrifice a Prism token: Add one mana of any color to your mana pool. -VIS R - -Diamond Valley -Land -{T}, Sacrifice a creature: You gain life equal to the sacrificed creature's toughness. -ARN U, MED R - -Diaochan, Artful Beauty -{3}{R} -Legendary Creature - Human Advisor -1/1 -{T}: Destroy target creature of your choice, then destroy target creature of an opponent's choice. Activate this ability only during your turn, before attackers are declared. -PTK R - -Dichotomancy -{7}{U}{U} -Sorcery -For each tapped nonland permanent target opponent controls, search that player's library for a card with the same name as that permanent and put it onto the battlefield under your control. Then that player shuffles his or her library. -Suspend 3-{1}{U}{U} (Rather than cast this card from your hand, you may pay {1}{U}{U} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) -PLC R - -Didgeridoo -{1} -Artifact -{3}: You may put a Minotaur permanent card from your hand onto the battlefield. -HML R, ME3 U - -Diligent Farmhand -{G} -Creature - Human Druid -1/1 -{1}{G}, Sacrifice Diligent Farmhand: Search your library for a basic land card and put that card onto the battlefield tapped. Then shuffle your library. -If Diligent Farmhand is in a graveyard, effects from spells named Muscle Burst count it as a card named Muscle Burst. -ODY C - -Dimensional Breach -{5}{W}{W} -Sorcery -Exile all permanents. For as long as any of those cards remain exiled, at the beginning of each player's upkeep, that player returns one of the exiled cards he or she owns to the battlefield. -SCG R - -Diminish -{U} -Instant -Target creature becomes 1/1 until end of turn. -M11 C - -Diminishing Returns -{2}{U}{U} -Sorcery -Each player shuffles his or her hand and graveyard into his or her library. You exile the top ten cards of your library. Then each player draws up to seven cards. -ALL R, 6ED R, MED R - -Dimir Aqueduct -Land -Dimir Aqueduct enters the battlefield tapped. -When Dimir Aqueduct enters the battlefield, return a land you control to its owner's hand. -{T}: Add {U}{B} to your mana pool. -RAV C, COM C - -Dimir Cutpurse -{1}{U}{B} -Creature - Spirit -2/2 -Whenever Dimir Cutpurse deals combat damage to a player, that player discards a card and you draw a card. -RAV R - -Dimir Doppelganger -{1}{U}{B} -Creature - Shapeshifter -0/2 -{1}{U}{B}: Exile target creature card from a graveyard. Dimir Doppelganger becomes a copy of that card and gains this ability. -RAV R - -Dimir Guildmage -{U/B}{U/B} -Creature - Human Wizard -2/2 -({U/B} can be paid with either {U} or {B}.) -{3}{U}: Target player draws a card. Activate this ability only any time you could cast a sorcery. -{3}{B}: Target player discards a card. Activate this ability only any time you could cast a sorcery. -RAV U - -Dimir House Guard -{3}{B} -Creature - Skeleton -2/3 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -Sacrifice a creature: Regenerate Dimir House Guard. -Transmute {1}{B}{B} ({1}{B}{B}, Discard this card: Search your library for a card with the same converted mana cost as this card, reveal it, and put it into your hand. Then shuffle your library. Transmute only as a sorcery.) -RAV C - -Dimir Infiltrator -{U}{B} -Creature - Spirit -1/3 -Dimir Infiltrator is unblockable. -Transmute {1}{U}{B} ({1}{U}{B}, Discard this card: Search your library for a card with the same converted mana cost as this card, reveal it, and put it into your hand. Then shuffle your library. Transmute only as a sorcery.) -RAV C - -Dimir Machinations -{2}{B} -Sorcery -Look at the top three cards of target player's library. Exile any number of those cards, then put the rest back in any order. -Transmute {1}{B}{B} ({1}{B}{B}, Discard this card: Search your library for a card with the same converted mana cost as this card, reveal it, and put it into your hand. Then shuffle your library. Transmute only as a sorcery.) -RAV U - -Dimir Signet -{2} -Artifact -{1}, {T}: Add {U}{B} to your mana pool. -RAV C, ARC C, COM C - -Din of the Fireherd -{5}{B/R}{B/R}{B/R} -Sorcery -Put a 5/5 black and red Elemental creature token onto the battlefield. Target opponent sacrifices a creature for each black creature you control, then sacrifices a land for each red creature you control. -SHM R - -Dingus Egg -{4} -Artifact -Whenever a land is put into a graveyard from the battlefield, Dingus Egg deals 2 damage to that land's controller. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, 6ED R, 7ED R, 8ED R - -Dingus Staff -{4} -Artifact -Whenever a creature dies, Dingus Staff deals 2 damage to that creature's controller. -WTH U - -Diplomatic Escort -{1}{U} -Creature - Human Spellshaper -1/1 -{U}, {T}, Discard a card: Counter target spell or ability that targets a creature. -MMQ U - -Diplomatic Immunity -{1}{U} -Enchantment - Aura -Enchant creature -Shroud (This permanent can't be the target of spells or abilities.) -Enchanted creature has shroud. -MMQ C - -Dire Undercurrents -{3}{U/B}{U/B} -Enchantment -Whenever a blue creature enters the battlefield under your control, you may have target player draw a card. -Whenever a black creature enters the battlefield under your control, you may have target player discard a card. -SHM R - -Dire Wolves -{2}{G} -Creature - Wolf -2/2 -Dire Wolves has banding as long as you control a Plains. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -ICE C - -Dirge of Dread -{2}{B} -Sorcery -All creatures gain fear until end of turn. (They can't be blocked except by artifact creatures and/or black creatures.) -Cycling {1}{B} ({1}{B}, Discard this card: Draw a card.) -When you cycle Dirge of Dread, you may have target creature gain fear until end of turn. -ONS C - -Dirtcowl Wurm -{4}{G} -Creature - Wurm -3/4 -Whenever an opponent plays a land, put a +1/+1 counter on Dirtcowl Wurm. -PRO R, TMP R, BRB R - -Dirtwater Wraith -{3}{B} -Creature - Wraith -1/3 -Swampwalk -{B}: Dirtwater Wraith gets +1/+0 until end of turn. -MIR C - -Dirty Wererat -{3}{B} -Creature - Human Rat Minion -2/3 -{B}, Discard a card: Regenerate Dirty Wererat. -Threshold - As long as seven or more cards are in your graveyard, Dirty Wererat gets +2/+2 and can't block. -ODY C - -Disappear -{2}{U}{U} -Enchantment - Aura -Enchant creature -{U}: Return enchanted creature and Disappear to their owners' hands. -UDS U - -Disarm -{U} -Instant -Unattach all Equipment from target creature. -MRD C - -Disaster Radius -{5}{R}{R} -Sorcery -As an additional cost to cast Disaster Radius, reveal a creature card from your hand. -Disaster Radius deals X damage to each creature your opponents control, where X is the revealed card's converted mana cost. -ROE R, COM R - -Disciple of Grace -{1}{W} -Creature - Human Cleric -1/2 -Protection from black -Cycling {2} ({2}, Discard this card: Draw a card.) -USG C, ONS C - -Disciple of Kangee -{2}{W} -Creature - Human Wizard -2/2 -{U}, {T}: Target creature gains flying and becomes blue until end of turn. -PLS C - -Disciple of Law -{1}{W} -Creature - Human Cleric -1/2 -Protection from red -Cycling {2} ({2}, Discard this card: Draw a card.) -USG C - -Disciple of Malice -{1}{B} -Creature - Human Cleric -1/2 -Protection from white -Cycling {2} ({2}, Discard this card: Draw a card.) -ONS C - -Disciple of Tevesh Szat -{2}{B}{B} -Creature - Human Cleric -3/1 -{T}: Target creature gets -1/-1 until end of turn. -{4}{B}{B}, {T}, Sacrifice Disciple of Tevesh Szat: Target creature gets -6/-6 until end of turn. -CSP C - -Disciple of the Vault -{B} -Creature - Human Cleric -1/1 -Whenever an artifact is put into a graveyard from the battlefield, you may have target opponent lose 1 life. -MRD C - -Discombobulate -{2}{U}{U} -Instant -Counter target spell. Look at the top four cards of your library, then put them back in any order. -ONS U, 10E U - -Discordant Dirge -{3}{B}{B} -Enchantment -At the beginning of your upkeep, you may put a verse counter on Discordant Dirge. -{B}, Sacrifice Discordant Dirge: Look at target opponent's hand and choose up to X cards from it, where X is the number of verse counters on Discordant Dirge. That player discards those cards. -USG R - -Discordant Spirit -{2}{B}{R} -Creature - Spirit -2/2 -At the beginning of each end step, if it's an opponent's turn, put a +1/+1 counter on Discordant Spirit for each 1 damage dealt to you this turn. -At the beginning of your end step, remove all +1/+1 counters from Discordant Spirit. -MIR R - -Disease Carriers -{2}{B}{B} -Creature - Rat -2/2 -When Disease Carriers dies, target creature gets -2/-2 until end of turn. -UDS C - -Diseased Vermin -{2}{B} -Creature - Rat -1/1 -Whenever Diseased Vermin deals combat damage to a player, put an infection counter on it. -At the beginning of your upkeep, Diseased Vermin deals X damage to target opponent previously dealt damage by it, where X is the number of infection counters on it. -ALL U - -Disembowel -{X}{B} -Instant -Destroy target creature with converted mana cost X. -RAV C - -Disempower -{1}{W} -Instant -Put target artifact or enchantment on top of its owner's library. -MIR C - -Disenchant -{1}{W} -Instant -Destroy target artifact or enchantment. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, ICE C, MIR C, 5ED C, TMP C, USG C, 6ED C, MMQ C, BRB C, S00 C, 7ED C, TSB S, ME2 C, ME3 C - -Disentomb -{B} -Sorcery -Return target creature card from your graveyard to your hand. -M10 C, M11 C, M12 C - -Disfigure -{B} -Instant -Target creature gets -2/-2 until end of turn. -ZEN C - -Disharmony -{2}{R} -Instant -Cast Disharmony only during combat before blockers are declared. -Untap target attacking creature and remove it from combat. Gain control of that creature until end of turn. -LEG R, ME3 U - -Disintegrate -{X}{R} -Sorcery -Disintegrate deals X damage to target creature or player. That creature can't be regenerated this turn. If the creature would die this turn, exile it instead. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, TSB S - -Dismal Failure -{2}{U}{U} -Instant -Counter target spell. Its controller discards a card. -PLC U - -Dismantle -{2}{R} -Sorcery -Destroy target artifact. If that artifact had counters on it, put that many +1/+1 counters or charge counters on an artifact you control. -DST U - -Dismantling Blow -{2}{W} -Instant -Kicker {2}{U} (You may pay an additional {2}{U} as you cast this spell.) -Destroy target artifact or enchantment. -If Dismantling Blow was kicked, draw two cards. -INV C - -Dismember -{1}{B/P}{B/P} -Instant -({B/P} can be paid with either {B} or 2 life.) -Target creature gets -5/-5 until end of turn. -NPH U - -Dismiss -{2}{U}{U} -Instant -Counter target spell. -Draw a card. -TMP U - -Disorder -{1}{R} -Sorcery -Disorder deals 2 damage to each white creature and each player who controls a white creature. -USG U, 7ED U - -Disorient -{3}{U} -Instant -Target creature gets -7/-0 until end of turn. -M10 C - -Dispatch -{W} -Instant -Tap target creature. -Metalcraft - If you control three or more artifacts, exile that creature. -NPH U - -Dispel -{U} -Instant -Counter target instant spell. -WWK C - -Dispeller's Capsule -{W} -Artifact -{2}{W}, {T}, Sacrifice Dispeller's Capsule: Destroy target artifact or enchantment. -ALA C - -Dispense Justice -{2}{W} -Instant -Target player sacrifices an attacking creature. -Metalcraft - That player sacrifices two attacking creatures instead if you control three or more artifacts. -SOM U - -Dispersal Shield -{1}{U} -Instant -Counter target spell if its converted mana cost is less than or equal to the highest converted mana cost among permanents you control. -SCG C - -Disperse -{1}{U} -Instant -Return target nonland permanent to its owner's hand. -MOR C, SOM C - -Dispersing Orb -{3}{U}{U} -Enchantment -{3}{U}, Sacrifice a permanent: Return target permanent to its owner's hand. -ONS U - -Disrupt -{U} -Instant -Counter target instant or sorcery spell unless its controller pays {1}. -Draw a card. -WTH C, INV U - -Disrupting Scepter -{3} -Artifact -{3}, {T}: Target player discards a card. Activate this ability only during your turn. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, 6ED R, 7ED R, 8ED R, 9ED R - -Disrupting Shoal -{X}{U}{U} -Instant - Arcane -You may exile a blue card with converted mana cost X from your hand rather than pay Disrupting Shoal's mana cost. -Counter target spell if its converted mana cost is X. -BOK R - -Disruption Aura -{2}{U} -Enchantment - Aura -Enchant artifact -Enchanted artifact has "At the beginning of your upkeep, sacrifice this artifact unless you pay its mana cost." -5DN U - -Disruptive Pitmage -{2}{U} -Creature - Human Wizard -1/1 -{T}: Counter target spell unless its controller pays {1}. -Morph {U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS C - -Disruptive Student -{2}{U} -Creature - Human Wizard -1/1 -{T}: Counter target spell unless its controller pays {1}. -USG C, BRB C - -Dissipate -{1}{U}{U} -Instant -Counter target spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyard. -MIR U - -Dissipation Field -{2}{U}{U} -Enchantment -Whenever a permanent deals damage to you, return it to its owner's hand. -SOM R - -Distant Melody -{3}{U} -Sorcery -Choose a creature type. Draw a card for each permanent you control of that type. -MOR C, H09 C - -Distant Memories -{2}{U}{U} -Sorcery -Search your library for a card, exile it, then shuffle your library. Any opponent may have you put that card into your hand. If no player does, you draw three cards. -MBS R - -Distorting Lens -{2} -Artifact -{T}: Target permanent becomes the color of your choice until end of turn. -MMQ R, 8ED R - -Distorting Wake -{X}{U}{U}{U} -Sorcery -Return X target nonland permanents to their owners' hands. -INV R - -Distortion Strike -{U} -Sorcery -Target creature gets +1/+0 until end of turn and is unblockable this turn. -Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -ROE C - -Distress -{B}{B} -Sorcery -Target player reveals his or her hand. You choose a nonland card from it. That player discards that card. -CHK C, 10E C, M12 C - -Disturbed Burial -{1}{B} -Sorcery -Buyback {3} (You may pay an additional {3} as you cast this spell. If you do, put this card into your hand as it resolves.) -Return target creature card from your graveyard to your hand. -TMP C - -Disturbing Plot -{1}{B} -Sorcery -Return target creature card from a graveyard to its owner's hand. -Conspire (As you cast this spell, you may tap two untapped creatures you control that share a color with it. When you do, copy it and you may choose a new target for the copy.) -SHM C - -Dive Bomber -{3}{W} -Creature - Bird Soldier -2/2 -Flying -{T}, Sacrifice Dive Bomber: Dive Bomber deals 2 damage to target attacking or blocking creature. -ONS C - -Divebomber Griffin -{3}{W}{W} -Creature - Griffin -3/2 -Flying -{T}, Sacrifice Divebomber Griffin: Divebomber Griffin deals 3 damage to target attacking or blocking creature. -RAV U - -Divergent Growth -{G} -Instant -Until end of turn, lands you control gain "{T}: Add one mana of any color to your mana pool." -SCG C - -Diversionary Tactics -{3}{W} -Enchantment -Tap two untapped creatures you control: Tap target creature. -APC U - -Divert -{U} -Instant -Change the target of target spell with a single target unless that spell's controller pays {2}. -ODY R - -Divination -{2}{U} -Sorcery -Draw two cards. -M10 C, M12 C - -Divine Congregation -{3}{W} -Sorcery -You gain 2 life for each creature target player controls. -Suspend 5-{1}{W} (Rather than cast this card from your hand, you may pay {1}{W} and exile it with five time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) -TSP C - -Divine Favor -{1}{W} -Enchantment - Aura -Enchant creature -When Divine Favor enters the battlefield, you gain 3 life. -Enchanted creature gets +1/+3. -M12 C - -Divine Intervention -{6}{W}{W} -Enchantment -Divine Intervention enters the battlefield with two intervention counters on it. -At the beginning of your upkeep, remove an intervention counter from Divine Intervention. -When you remove the last intervention counter from Divine Intervention, the game is a draw. -LEG R, ME3 R - -Divine Light -{W} -Sorcery -Prevent all damage that would be dealt this turn to creatures you control. -APC C - -Divine Offering -{1}{W} -Instant -Destroy target artifact. You gain life equal to its converted mana cost. -LEG C, CHR C, MIR C, 5ED C, ME4 C, MBS C - -Divine Presence -{2}{W} -Enchantment -If a source would deal 4 or more damage to a creature or player, that source deals 3 damage to that creature or player instead. -INV R - -Divine Retribution -{1}{W} -Instant -Divine Retribution deals damage to target attacking creature equal to the number of attacking creatures. -MIR R - -Divine Sacrament -{1}{W}{W} -Enchantment -White creatures get +1/+1. -Threshold - White creatures get an additional +1/+1 as long as seven or more cards are in your graveyard. -ODY R - -Divine Transformation -{2}{W}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +3/+3. -LEG R, 4ED U, 5ED U, 6ED U, MED U - -Divine Verdict -{3}{W} -Instant -Destroy target attacking or blocking creature. -M10 C - -Diviner's Wand -{3} -Tribal Artifact - Wizard Equipment -Equipped creature has "Whenever you draw a card, this creature gets +1/+1 and gains flying until end of turn" and "{4}: Draw a card." -Whenever a Wizard creature enters the battlefield, you may attach Diviner's Wand to it. -Equip {3} -MOR U - -Diving Griffin -{1}{W}{W} -Creature - Griffin -2/2 -Flying, vigilance -PCY C, 8ED C - -Divining Witch -{1}{B} -Creature - Human Spellshaper -1/1 -{1}{B}, {T}, Discard a card: Name a card. Exile the top six cards of your library. Reveal cards from the top of your library until you reveal the named card, then put that card into your hand. Exile all other cards revealed this way. -NEM R - -Divinity of Pride -{W/B}{W/B}{W/B}{W/B}{W/B} -Creature - Spirit Avatar -4/4 -Flying, lifelink -Divinity of Pride gets +4/+4 as long as you have 25 or more life. -EVE R - -Dizzy Spell -{U} -Instant -Target creature gets -3/-0 until end of turn. -Transmute {1}{U}{U} ({1}{U}{U}, Discard this card: Search your library for a card with the same converted mana cost as this card, reveal it, and put it into your hand. Then shuffle your library. Transmute only as a sorcery.) -RAV C - -Dizzying Gaze -{R} -Enchantment - Aura -Enchant creature you control -{R}: Enchanted creature deals 1 damage to target creature with flying. -EXO C - -Djinn Illuminatus -{5}{U/R}{U/R} -Creature - Djinn -3/5 -({U/R} can be paid with either {U} or {R}.) -Flying -Each instant and sorcery spell you cast has replicate. The replicate cost is equal to its mana cost. (When you cast it, copy it for each time you paid its replicate cost. You may choose new targets for the copies.) -GPT R - -Djinn of Wishes -{3}{U}{U} -Creature - Djinn -4/4 -Flying -Djinn of Wishes enters the battlefield with three wish counters on it. -{2}{U}{U}, Remove a wish counter from Djinn of Wishes: Reveal the top card of your library. You may play that card without paying its mana cost. If you don't, exile it. -M10 R, M12 R - -Djinn of the Lamp -{5}{U}{U} -Creature - Djinn -5/6 -Flying -POR R - -Do or Die -{1}{B} -Sorcery -Separate all creatures target player controls into two piles. Destroy all creatures in the pile of that player's choice. They can't be regenerated. -INV R - -Dodecapod -{4} -Artifact Creature - Golem -3/3 -If a spell or ability an opponent controls causes you to discard Dodecapod, put it onto the battlefield with two +1/+1 counters on it instead of putting it into your graveyard. -APC U, TSB S - -Dogged Hunter -{2}{W} -Creature - Human Nomad -1/1 -{T}: Destroy target creature token. -ODY R - -Dogpile -{3}{R} -Instant -Dogpile deals damage to target creature or player equal to the number of attacking creatures you control. -RAV C - -Dolmen Gate -{2} -Artifact -Prevent all combat damage that would be dealt to attacking creatures you control. -LRW R - -Domestication -{2}{U}{U} -Enchantment - Aura -Enchant creature -You control enchanted creature. -At the beginning of your end step, if enchanted creature's power is 4 or greater, sacrifice Domestication. -ROE U - -Dominaria's Judgment -{2}{W} -Instant -Until end of turn, creatures you control gain protection from white if you control a Plains, from blue if you control an Island, from black if you control a Swamp, from red if you control a Mountain, and from green if you control a Forest. -PLS R - -Dominate -{X}{1}{U}{U} -Instant -Gain control of target creature with converted mana cost X or less. (This effect lasts indefinitely.) -NEM U - -Dominating Licid -{1}{U}{U} -Creature - Licid -1/1 -{1}{U}{U}, {T}: Dominating Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {U} to end this effect. -You control enchanted creature. -EXO R - -Domineer -{1}{U}{U} -Enchantment - Aura -Enchant artifact creature -You control enchanted artifact creature. -MRD U - -Dominus of Fealty -{U/R}{U/R}{U/R}{U/R}{U/R} -Creature - Spirit Avatar -4/4 -Flying -At the beginning of your upkeep, you may gain control of target permanent until end of turn. If you do, untap it and it gains haste until end of turn. -EVE R, COM R - -Donate -{2}{U} -Sorcery -Target player gains control of target permanent you control. -UDS R - -Dong Zhou, the Tyrant -{4}{R} -Legendary Creature - Human Soldier -3/3 -When Dong Zhou, the Tyrant enters the battlefield, target creature an opponent controls deals damage equal to its power to that player. -PTK R, ME3 R - -Doom Blade -{1}{B} -Instant -Destroy target nonblack creature. -M10 C, M11 C, COM C, M12 C - -Doom Cannon -{6} -Artifact -As Doom Cannon enters the battlefield, choose a creature type. -{3}, {T}, Sacrifice a creature of the chosen type: Doom Cannon deals 3 damage to target creature or player. -ONS R - -Doomed Necromancer -{2}{B} -Creature - Human Cleric Mercenary -2/2 -{B}, {T}, Sacrifice Doomed Necromancer: Return target creature card from your graveyard to the battlefield. -ONS R, 10E R - -Doomgape -{4}{B/G}{B/G}{B/G} -Creature - Elemental -10/10 -Trample -At the beginning of your upkeep, sacrifice a creature. You gain life equal to that creature's toughness. -EVE R - -Doomsday -{B}{B}{B} -Sorcery -Search your library and graveyard for five cards and exile the rest. Put the chosen cards on top of your library in any order. You lose half your life, rounded up. -WTH R, 6ED R - -Doomsday Specter -{2}{U}{B} -Creature - Specter -2/3 -Flying -When Doomsday Specter enters the battlefield, return a blue or black creature you control to its owner's hand. -Whenever Doomsday Specter deals combat damage to a player, look at that player's hand and choose a card from it. The player discards that card. -PLS R - -Door of Destinies -{4} -Artifact -As Door of Destinies enters the battlefield, choose a creature type. -Whenever you cast a spell of the chosen type, put a charge counter on Door of Destinies. -Creatures you control of the chosen type get +1/+1 for each charge counter on Door of Destinies. -MOR R - -Door to Nothingness -{5} -Artifact -Door to Nothingness enters the battlefield tapped. -{W}{W}{U}{U}{B}{B}{R}{R}{G}{G}, {T}, Sacrifice Door to Nothingness: Target player loses the game. -5DN R, HOP R - -Doran, the Siege Tower -{B}{G}{W} -Legendary Creature - Treefolk Shaman -0/5 -Each creature assigns combat damage equal to its toughness rather than its power. -LRW R - -Dormant Gomazoa -{1}{U}{U} -Creature - Jellyfish -5/5 -Flying -Dormant Gomazoa enters the battlefield tapped. -Dormant Gomazoa doesn't untap during your untap step. -Whenever you become the target of a spell, you may untap Dormant Gomazoa. -ROE R - -Dormant Sliver -{2}{G}{U} -Creature - Sliver -2/2 -All Sliver creatures have defender. -All Slivers have "When this permanent enters the battlefield, draw a card." -PLC U - -Dormant Volcano -Land -Dormant Volcano enters the battlefield tapped. -When Dormant Volcano enters the battlefield, sacrifice it unless you return an untapped Mountain you control to its owner's hand. -{T}: Add {1}{R} to your mana pool. -VIS U - -Dosan the Falling Leaf -{1}{G}{G} -Legendary Creature - Human Monk -2/2 -Players can cast spells only during their own turns. -CHK R - -Dosan's Oldest Chant -{4}{G} -Sorcery -You gain 6 life. -Draw a card. -SOK C - -Double Cleave -{1}{R/W} -Instant -Target creature gains double strike until end of turn. (It deals both first-strike and regular combat damage.) -EVE C, HOP C - -Double Negative -{U}{U}{R} -Instant -Counter up to two target spells. -ARB U - -Doubling Chant -{5}{G} -Sorcery -For each creature you control, you may search your library for a creature card with the same name as that creature. Put those cards onto the battlefield, then shuffle your library. -M12 R - -Doubling Cube -{2} -Artifact -{3}, {T}: Double the amount of each type of mana in your mana pool. -5DN R, 10E R - -Doubling Season -{4}{G} -Enchantment -If an effect would put one or more tokens onto the battlefield under your control, it puts twice that many of those tokens onto the battlefield instead. -If an effect would place one or more counters on a permanent you control, it places twice that many of those counters on that permanent instead. -RAV R - -Doubtless One -{3}{W} -Creature - Cleric Avatar -*/* -Doubtless One's power and toughness are each equal to the number of Clerics on the battlefield. -Whenever Doubtless One deals damage, you gain that much life. -ONS U - -Douse -{2}{U} -Enchantment -{1}{U}: Counter target red spell. -USG U - -Douse in Gloom -{2}{B} -Instant -Douse in Gloom deals 2 damage to target creature and you gain 2 life. -GPT C - -Dovescape -{3}{W/U}{W/U}{W/U} -Enchantment -({W/U} can be paid with either {W} or {U}.) -Whenever a player casts a noncreature spell, counter that spell. That player puts X 1/1 white and blue Bird creature tokens with flying onto the battlefield, where X is the spell's converted mana cost. -DIS R - -Downdraft -{2}{G} -Enchantment -{G}: Target creature loses flying until end of turn. -Sacrifice Downdraft: Downdraft deals 2 damage to each creature with flying. -WTH U - -Downhill Charge -{2}{R} -Instant -You may sacrifice a Mountain rather than pay Downhill Charge's mana cost. -Target creature gets +X/+0 until end of turn, where X is the number of Mountains you control. -NEM C - -Dowsing Shaman -{4}{G} -Creature - Centaur Shaman -3/4 -{2}{G}, {T}: Return target enchantment card from your graveyard to your hand. -RAV U - -Draco -{16} -Artifact Creature - Dragon -9/9 -Domain - Draco costs {2} less to cast for each basic land type among lands you control. -Flying -Domain - At the beginning of your upkeep, sacrifice Draco unless you pay {10}. This cost is reduced by {2} for each basic land type among lands you control. -PLS R, FVD R - -Draconian Cylix -{3} -Artifact -{2}, {T}, Discard a card at random: Regenerate target creature. -FEM R - -Dracoplasm -{U}{R} -Creature - Shapeshifter -0/0 -Flying -As Dracoplasm enters the battlefield, sacrifice any number of creatures. Dracoplasm's power becomes the total power of those creatures and its toughness becomes their total toughness. -{R}: Dracoplasm gets +1/+0 until end of turn. -TMP R - -Drafna's Restoration -{U} -Sorcery -Return any number of target artifact cards from target player's graveyard to the top of his or her library in any order. -ATQ C - -Drag Down -{2}{B} -Instant -Domain - Target creature gets -1/-1 until end of turn for each basic land type among lands you control. -CON C - -Dragon Appeasement -{3}{B}{R}{G} -Enchantment -Skip your draw step. -Whenever you sacrifice a creature, you may draw a card. -ARB U - -Dragon Arch -{5} -Artifact -{2}, {T}: You may put a multicolored creature card from your hand onto the battlefield. -APC U - -Dragon Blood -{3} -Artifact -{3}, {T}: Put a +1/+1 counter on target creature. -USG U, MRD U - -Dragon Breath -{1}{R} -Enchantment - Aura -Enchant creature -Enchanted creature has haste. -{R}: Enchanted creature gets +1/+0 until end of turn. -When a creature with converted mana cost 6 or greater enters the battlefield, you may return Dragon Breath from your graveyard to the battlefield attached to that creature. -SCG C, ARC C - -Dragon Broodmother -{2}{R}{R}{R}{G} -Creature - Dragon -4/4 -Flying -At the beginning of each upkeep, put a 1/1 red and green Dragon creature token with flying and devour 2 onto the battlefield. (As the token enters the battlefield, you may sacrifice any number of creatures. It enters the battlefield with twice that many +1/+1 counters on it.) -ARB M - -Dragon Engine -{3} -Artifact Creature - Construct -1/3 -{2}: Dragon Engine gets +1/+0 until end of turn. -ATQ C, 3ED R, 4ED R, 5ED R, 6ED R, MED C, ME4 C - -Dragon Fangs -{1}{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+1 and has trample. -When a creature with converted mana cost 6 or greater enters the battlefield, you may return Dragon Fangs from your graveyard to the battlefield attached to that creature. -SCG C - -Dragon Fodder -{1}{R} -Sorcery -Put two 1/1 red Goblin creature tokens onto the battlefield. -ALA C, ARC C, DDG C - -Dragon Mage -{5}{R}{R} -Creature - Dragon Wizard -5/5 -Flying -Whenever Dragon Mage deals combat damage to a player, each player discards his or her hand and draws seven cards. -SCG R - -Dragon Mask -{3} -Artifact -{3}, {T}: Target creature you control gets +2/+2 until end of turn. Return it to its owner's hand at the beginning of the next end step. (Return it only if it's on the battlefield.) -VIS U, 6ED U - -Dragon Roost -{4}{R}{R} -Enchantment -{5}{R}{R}: Put a 5/5 red Dragon creature token with flying onto the battlefield. (It can't be blocked except by creatures with flying or reach.) -ONS R, 10E R - -Dragon Scales -{1}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+2 and has vigilance. -When a creature with converted mana cost 6 or greater enters the battlefield, you may return Dragon Scales from your graveyard to the battlefield attached to that creature. -SCG C - -Dragon Shadow -{1}{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+0 and has fear. (It can't be blocked except by artifact creatures and/or black creatures.) -When a creature with converted mana cost 6 or greater enters the battlefield, you may return Dragon Shadow from your graveyard to the battlefield attached to that creature. -SCG C - -Dragon Tyrant -{8}{R}{R} -Creature - Dragon -6/6 -Flying, trample -Double strike (This creature deals both first-strike and regular combat damage.) -At the beginning of your upkeep, sacrifice Dragon Tyrant unless you pay {R}{R}{R}{R}. -{R}: Dragon Tyrant gets +1/+0 until end of turn. -SCG R - -Dragon Whelp -{2}{R}{R} -Creature - Dragon -2/3 -Flying -{R}: Dragon Whelp gets +1/+0 until end of turn. If this ability has been activated four or more times this turn, sacrifice Dragon Whelp at the beginning of the next end step. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, TSB S, FVD R, M10 U, ARC U, DDG U, COM U - -Dragon Wings -{1}{U} -Enchantment - Aura -Enchant creature -Enchanted creature has flying. -Cycling {1}{U} ({1}{U}, Discard this card: Draw a card.) -When a creature with converted mana cost 6 or greater enters the battlefield, you may return Dragon Wings from your graveyard to the battlefield attached to that creature. -SCG C - -Dragon's Claw -{2} -Artifact -Whenever a player casts a red spell, you may gain 1 life. -DST U, 9ED U, 10E U, M10 U, M11 U, DDG U, M12 U - -Dragon's Herald -{R} -Creature - Goblin Shaman -1/1 -{2}{R}, {T}, Sacrifice a black creature, a red creature, and a green creature: Search your library for a card named Hellkite Overlord and put it onto the battlefield. Then shuffle your library. -ALA U - -Dragonmaster Outcast -{R} -Creature - Human Shaman -1/1 -At the beginning of your upkeep, if you control six or more lands, put a 5/5 red Dragon creature token with flying onto the battlefield. -WWK M - -Dragonskull Summit -Land -Dragonskull Summit enters the battlefield tapped unless you control a Swamp or a Mountain. -{T}: Add {B} or {R} to your mana pool. -M10 R, M11 R, M12 R - -Dragonsoul Knight -{2}{R} -Creature - Human Knight -2/2 -First strike -{W}{U}{B}{R}{G}: Until end of turn, Dragonsoul Knight becomes a Dragon, gets +5/+3, and gains flying and trample. -CON U - -Dragonspeaker Shaman -{1}{R}{R} -Creature - Human Barbarian Shaman -2/2 -Dragon spells you cast cost {2} less to cast. -SCG U, ARC U, DDG U - -Dragonstalker -{4}{W} -Creature - Bird Soldier -3/3 -Flying, protection from Dragons -SCG U - -Dragonstorm -{8}{R} -Sorcery -Search your library for a Dragon permanent card and put it onto the battlefield. Then shuffle your library. -Storm (When you cast this spell, copy it for each spell cast before it this turn.) -SCG R, TSB S, FVD R - -Drain Life -{X}{1}{B} -Sorcery -Spend only black mana on X. -Drain Life deals X damage to target creature or player. You gain life equal to the damage dealt, but not more life than the player's life total before Drain Life dealt damage or the creature's toughness. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, MIR C, 5ED C, BTD C - -Drain Power -{U}{U} -Sorcery -Target player activates a mana ability of each land he or she controls. Then put all mana from that player's mana pool into yours. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, ME4 R - -Drain the Well -{2}{B/G}{B/G} -Sorcery -Destroy target land. You gain 2 life. -EVE C - -Draining Whelk -{4}{U}{U} -Creature - Illusion -1/1 -Flash (You may cast this spell any time you could cast an instant.) -Flying -When Draining Whelk enters the battlefield, counter target spell. Put X +1/+1 counters on Draining Whelk, where X is that spell's converted mana cost. -TSP R - -Drake Familiar -{1}{U} -Creature - Drake -2/1 -Flying -When Drake Familiar enters the battlefield, sacrifice it unless you return an enchantment to its owner's hand. -RAV C - -Drake Hatchling -{2}{U} -Creature - Drake -1/3 -Flying -{U}: Drake Hatchling gets +1/+0 until end of turn. Activate this ability only once each turn. -MMQ C - -Drake Umbra -{4}{U} -Enchantment - Aura -Enchant creature -Enchanted creature gets +3/+3 and has flying. -Totem armor (If enchanted creature would be destroyed, instead remove all damage from it and destroy this Aura.) -ROE U - -Drake-Skull Cameo -{3} -Artifact -{T}: Add {U} or {B} to your mana pool. -INV U - -Dralnu's Crusade -{1}{B}{R} -Enchantment -Goblin creatures get +1/+1. -All Goblins are black and are Zombies in addition to their other creature types. -PLS R - -Dralnu's Pet -{1}{U}{U} -Creature - Shapeshifter -2/2 -Kicker-{2}{B}, Discard a creature card. (You may pay {2}{B} and discard a creature card in addition to any other costs as you cast this spell.) -If Dralnu's Pet was kicked, it enters the battlefield with flying and with X +1/+1 counters on it, where X is the discarded card's converted mana cost. -PLS R - -Dralnu, Lich Lord -{3}{U}{B} -Legendary Creature - Zombie Wizard -3/3 -If damage would be dealt to Dralnu, Lich Lord, sacrifice that many permanents instead. -{T}: Target instant or sorcery card in your graveyard gains flashback until end of turn. The flashback cost is equal to its mana cost. (You may cast that card from your graveyard for its flashback cost. Then exile it.) -TSP R - -Dramatic Entrance -{3}{G}{G} -Instant -You may put a green creature card from your hand onto the battlefield. -SHM R - -Drana, Kalastria Bloodchief -{3}{B}{B} -Legendary Creature - Vampire Shaman -4/4 -Flying -{X}{B}{B}: Target creature gets -0/-X until end of turn and Drana, Kalastria Bloodchief gets +X/+0 until end of turn. -ROE R - -Drastic Revelation -{2}{U}{B}{R} -Sorcery -Discard your hand. Draw seven cards, then discard three cards at random. -ARB U - -Dread -{3}{B}{B}{B} -Creature - Elemental Incarnation -6/6 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -Whenever a creature deals damage to you, destroy it. -When Dread is put into a graveyard from anywhere, shuffle it into its owner's library. -LRW R - -Dread Cacodemon -{7}{B}{B}{B} -Creature - Demon -8/8 -When Dread Cacodemon enters the battlefield, if you cast it from your hand, destroy all creatures your opponents control, then tap all other creatures you control. -COM R - -Dread Charge -{3}{B} -Sorcery -Until end of turn, black creatures you control can be blocked only by black creatures. -POR R - -Dread Drone -{4}{B} -Creature - Eldrazi Drone -4/1 -When Dread Drone enters the battlefield, put two 0/1 colorless Eldrazi Spawn creature tokens onto the battlefield. They have "Sacrifice this creature: Add {1} to your mana pool." -ROE C - -Dread Reaper -{3}{B}{B}{B} -Creature - Horror -6/5 -Flying -When Dread Reaper enters the battlefield, you lose 5 life. -POR R, S99 R, ME4 R - -Dread Return -{2}{B}{B} -Sorcery -Return target creature card from your graveyard to the battlefield. -Flashback-Sacrifice three creatures. (You may cast this card from your graveyard for its flashback cost. Then exile it.) -TSP U - -Dread Slag -{3}{B}{R} -Creature - Horror -9/9 -Trample -Dread Slag gets -4/-4 for each card in your hand. -DIS R - -Dread Specter -{3}{B} -Creature - Specter -2/2 -Whenever Dread Specter blocks or becomes blocked by a nonblack creature, destroy that creature at end of combat. -MIR U - -Dread Statuary -Land -{T}: Add {1} to your mana pool. -{4}: Dread Statuary becomes a 4/2 Golem artifact creature until end of turn. It's still a land. -WWK U - -Dread Warlock -{1}{B}{B} -Creature - Human Wizard -2/2 -Dread Warlock can't be blocked except by black creatures. -M10 C - -Dread Wight -{3}{B}{B} -Creature - Zombie -3/4 -At end of combat, put a paralyzation counter on each creature blocking or blocked by Dread Wight and tap those creatures. Each of those creatures doesn't untap during its controller's untap step for as long as it has a paralyzation counter on it. Each of those creatures gains "{4}: Remove a paralyzation counter from this creature." -ICE R, ME4 U - -Dread of Night -{B} -Enchantment -White creatures get -1/-1. -TMP U, 6ED U - -Dreadship Reef -Land -{T}: Add {1} to your mana pool. -{1}, {T}: Put a storage counter on Dreadship Reef. -{1}, Remove X storage counters from Dreadship Reef: Add X mana in any combination of {U} and/or {B} to your mana pool. -TSP U, COM U - -Dreadwing -{B} -Creature - Zombie -1/1 -{1}{U}{R}: Dreadwing gets +3/+0 and gains flying until end of turn. -CON U - -Dream Cache -{2}{U} -Sorcery -Draw three cards, then put two cards from your hand both on top of your library or both on the bottom of your library. -MIR C, TMP C, 6ED C - -Dream Chisel -{2} -Artifact -Face-down creature spells you cast cost {1} less to cast. -ONS R - -Dream Coat -{U} -Enchantment - Aura -Enchant creature -{0}: Enchanted creature becomes the color or colors of your choice. Activate this ability only once each turn. -LEG U - -Dream Fighter -{2}{U} -Creature - Human Soldier -1/1 -Whenever Dream Fighter blocks or becomes blocked by a creature, Dream Fighter and that creature phase out. (While they're phased out, they're treated as though they don't exist. Each one phases in before its controller untaps during his or her next untap step.) -MIR C - -Dream Fracture -{1}{U}{U} -Instant -Counter target spell. Its controller draws a card. -Draw a card. -EVE U - -Dream Halls -{3}{U}{U} -Enchantment -Rather than pay the mana cost for a spell, its controller may discard a card that shares a color with that spell. -STH R - -Dream Leash -{3}{U}{U} -Enchantment - Aura -Enchant permanent -You can't choose an untapped permanent as Dream Leash's target as you cast Dream Leash. -You control enchanted permanent. -RAV R - -Dream Prowler -{2}{U}{U} -Creature - Illusion -1/5 -Dream Prowler is unblockable as long as it's attacking alone. -STH C, 9ED U - -Dream Salvage -{U/B} -Instant -Draw cards equal to the number of cards target opponent discarded this turn. -SHM U - -Dream Stalker -{1}{U} -Creature - Illusion -1/5 -When Dream Stalker enters the battlefield, return a permanent you control to its owner's hand. -TSP C - -Dream Thief -{2}{U} -Creature - Faerie Rogue -2/1 -Flying -When Dream Thief enters the battlefield, draw a card if you've cast another blue spell this turn. -EVE C - -Dream Thrush -{1}{U} -Creature - Bird -1/1 -Flying -{T}: Target land becomes the basic land type of your choice until end of turn. -INV C - -Dream Tides -{2}{U}{U} -Enchantment -Creatures don't untap during their controllers' untap steps. -At the beginning of each player's upkeep, that player may choose any number of tapped nongreen creatures he or she controls and pay {2} for each creature chosen this way. If the player does, untap those creatures. -VIS U - -Dream's Grip -{U} -Instant -Choose one - Tap target permanent; or untap target permanent. -Entwine {1} (Choose both if you pay the entwine cost.) -MRD C - -Dreamborn Muse -{2}{U}{U} -Creature - Spirit -2/2 -At the beginning of each player's upkeep, that player puts the top X cards of his or her library into his or her graveyard, where X is the number of cards in his or her hand. -LGN R, 10E R, COM R - -Dreamcatcher -{U} -Creature - Spirit -1/1 -Whenever you cast a Spirit or Arcane spell, you may sacrifice Dreamcatcher. If you do, draw a card. -SOK C - -Dreams of the Dead -{3}{U} -Enchantment -{1}{U}: Return target white or black creature card from your graveyard to the battlefield. That creature gains "Cumulative upkeep {2}." If the creature would leave the battlefield, exile it instead of putting it anywhere else. (At the beginning of its controller's upkeep, that player puts an age counter on it, then sacrifices it unless he or she pays its upkeep cost for each age counter on it.) -ICE U, ME2 R - -Dreamscape Artist -{1}{U} -Creature - Human Spellshaper -1/1 -{2}{U}, {T}, Discard a card, Sacrifice a land: Search your library for up to two basic land cards and put them onto the battlefield. Then shuffle your library. -PLC C - -Dreamspoiler Witches -{3}{B} -Creature - Faerie Wizard -2/2 -Flying -Whenever you cast a spell during an opponent's turn, you may have target creature get -1/-1 until end of turn. -LRW C - -Dreamstone Hedron -{6} -Artifact -{T}: Add {3} to your mana pool. -{3}, {T}, Sacrifice Dreamstone Hedron: Draw three cards. -ROE U, ARC U, COM U - -Dreamwinder -{3}{U} -Creature - Serpent -4/3 -Dreamwinder can't attack unless defending player controls an Island. -{U}, Sacrifice an Island: Target land becomes an Island until end of turn. -ODY C - -Dredge -{B} -Instant -Sacrifice a creature or land. -Draw a card. -INV U - -Dreg Reaver -{4}{B} -Creature - Zombie Beast -4/3 -ALA C - -Dregs of Sorrow -{X}{4}{B} -Sorcery -Destroy X target nonblack creatures. Draw X cards. -TMP R, 7ED R - -Dregscape Zombie -{1}{B} -Creature - Zombie -2/1 -Unearth {B} ({B}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) -ALA C, HOP C, ARC C - -Drekavac -{1}{B} -Creature - Beast -3/3 -When Drekavac enters the battlefield, sacrifice it unless you discard a noncreature card. -DIS U - -Drelnoch -{4}{U} -Creature - Yeti Mutant -3/3 -Whenever Drelnoch becomes blocked, you may draw two cards. -CSP C - -Drench the Soil in Their Blood -Scheme -When you set this scheme in motion, after the main phase, there is an additional combat phase followed by an additional main phase. Creatures you control gain vigilance until end of turn. -ARC P - -Drift of Phantasms -{2}{U} -Creature - Spirit -0/5 -Defender (This creature can't attack.) -Flying -Transmute {1}{U}{U} ({1}{U}{U}, Discard this card: Search your library for a card with the same converted mana cost as this card, reveal it, and put it into your hand. Then shuffle your library. Transmute only as a sorcery.) -RAV C - -Drift of the Dead -{3}{B} -Creature - Wall -*/* -Defender (This creature can't attack.) -Drift of the Dead's power and toughness are each equal to the number of snow lands you control. -ICE U, ME2 C - -Drifter il-Dal -{U} -Creature - Human Wizard -2/1 -Shadow (This creature can block or be blocked by only creatures with shadow.) -At the beginning of your upkeep, sacrifice Drifter il-Dal unless you pay {U}. -TSP C - -Drifting Djinn -{4}{U}{U} -Creature - Djinn -5/5 -Flying -At the beginning of your upkeep, sacrifice Drifting Djinn unless you pay {1}{U}. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG R - -Drifting Meadow -Land -Drifting Meadow enters the battlefield tapped. -{T}: Add {W} to your mana pool. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG C, BRB C - -Drifting Shade -{3}{B} -Creature - Shade -1/1 -Flying -{B}: Drifting Shade gets +1/+1 until end of turn. -M12 C - -Drill-Skimmer -{4} -Artifact Creature - Thopter -2/1 -Flying -Drill-Skimmer has shroud as long as you control another artifact creature. (It can't be the target of spells or abilities.) -DST C - -Drinker of Sorrow -{2}{B} -Creature - Horror -5/3 -Drinker of Sorrow can't block. -Whenever Drinker of Sorrow deals combat damage, sacrifice a permanent. -LGN R - -Dripping Dead -{4}{B}{B} -Creature - Zombie -4/1 -Dripping Dead can't block. -Whenever Dripping Dead deals combat damage to a creature, destroy that creature. It can't be regenerated. -LGN C - -Dripping-Tongue Zubera -{1}{G} -Creature - Zubera Spirit -1/2 -When Dripping-Tongue Zubera dies, put a 1/1 colorless Spirit creature token onto the battlefield for each Zubera that died this turn. -CHK C - -Dromad Purebred -{4}{W} -Creature - Camel Beast -1/5 -Whenever Dromad Purebred is dealt damage, you gain 1 life. -RAV C - -Dromar's Attendant -{5} -Artifact Creature - Golem -3/3 -{1}, Sacrifice Dromar's Attendant: Add {W}{U}{B} to your mana pool. -INV U - -Dromar's Cavern -Land - Lair -When Dromar's Cavern enters the battlefield, sacrifice it unless you return a non-Lair land you control to its owner's hand. -{T}: Add {W}, {U}, or {B} to your mana pool. -PLS U - -Dromar's Charm -{W}{U}{B} -Instant -Choose one - You gain 5 life; or counter target spell; or target creature gets -2/-2 until end of turn. -PLS U - -Dromar, the Banisher -{3}{W}{U}{B} -Legendary Creature - Dragon -6/6 -Flying -Whenever Dromar, the Banisher deals combat damage to a player, you may pay {2}{U}. If you do, choose a color, then return all creatures of that color to their owners' hands. -INV R - -Dromosaur -{2}{R} -Creature - Lizard -2/3 -Whenever Dromosaur blocks or becomes blocked, it gets +2/-2 until end of turn. -USG C - -Droning Bureaucrats -{3}{W} -Creature - Human Advisor -1/4 -{X}, {T}: Each creature with converted mana cost X can't attack or block this turn. -GPT U - -Drooling Groodion -{3}{B}{B}{G} -Creature - Beast -4/3 -{2}{B}{G}, Sacrifice a creature: Target creature gets +2/+2 until end of turn. Another target creature gets -2/-2 until end of turn. -RAV U - -Drooling Ogre -{1}{R} -Creature - Ogre -3/3 -Whenever a player casts an artifact spell, that player gains control of Drooling Ogre. (This effect lasts indefinitely.) -DST C - -Drop of Honey -{G} -Enchantment -At the beginning of your upkeep, destroy the creature with the least power. It can't be regenerated. If two or more creatures are tied for least power, you choose one of them. -When there are no creatures on the battlefield, sacrifice Drop of Honey. -ARN R, ME4 R - -Dross Crocodile -{3}{B} -Creature - Zombie Crocodile -5/1 -5DN C, 10E C - -Dross Golem -{5} -Artifact Creature - Golem -3/2 -Affinity for Swamps (This spell costs {1} less to cast for each Swamp you control.) -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -DST C - -Dross Harvester -{1}{B}{B} -Creature - Horror -4/4 -Protection from white -At the beginning of your end step, you lose 4 life. -Whenever a creature dies, you gain 2 life. -MRD R - -Dross Hopper -{1}{B} -Creature - Insect Horror -2/1 -Sacrifice a creature: Dross Hopper gains flying until end of turn. -SOM C - -Dross Prowler -{2}{B} -Creature - Zombie -2/1 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -MRD C - -Dross Ripper -{4} -Artifact Creature - Hound -3/3 -{2}{B}: Dross Ripper gets +1/+1 until end of turn. -MBS C - -Dross Scorpion -{4} -Artifact Creature - Scorpion -3/1 -Whenever Dross Scorpion or another artifact creature dies, you may untap target artifact. -MRD C - -Drought -{2}{W}{W} -Enchantment -At the beginning of your upkeep, sacrifice Drought unless you pay {W}{W}. -Spells cost an additional "Sacrifice a Swamp" to cast for each black mana symbol in their mana costs. -Activated abilities cost an additional "Sacrifice a Swamp" to activate for each black mana symbol in their activation costs. -ICE U - -Drove of Elves -{3}{G} -Creature - Elf -*/* -Hexproof (This creature can't be the target of spells or abilities your opponents control.) -Drove of Elves's power and toughness are each equal to the number of green permanents you control. -SHM U - -Drowned -{1}{U} -Creature - Zombie -1/1 -{B}: Regenerate Drowned. -DRK C, ME4 C - -Drowned Catacomb -Land -Drowned Catacomb enters the battlefield tapped unless you control an Island or a Swamp. -{T}: Add {U} or {B} to your mana pool. -M10 R, M11 R, M12 R - -Drowned Rusalka -{U} -Creature - Spirit -1/1 -{U}, Sacrifice a creature: Discard a card, then draw a card. -GPT U - -Drowner Initiate -{U} -Creature - Merfolk Wizard -1/1 -Whenever a player casts a blue spell, you may pay {1}. If you do, target player puts the top two cards of his or her library into his or her graveyard. -SHM C - -Drowner of Secrets -{2}{U} -Creature - Merfolk Wizard -1/3 -Tap an untapped Merfolk you control: Target player puts the top card of his or her library into his or her graveyard. -LRW U - -Drudge Reavers -{3}{B} -Creature - Skeleton -2/1 -Flash (You may cast this spell any time you could cast an instant.) -{B}: Regenerate Drudge Reavers. -TSP C - -Drudge Skeletons -{1}{B} -Creature - Skeleton -1/1 -{B}: Regenerate Drudge Skeletons. (The next time this creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.) -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, 6ED C, S00 C, 7ED C, 8ED C, 9ED U, 10E U, M10 C, GVL C - -Drudge Spell -{B}{B} -Enchantment -{B}, Exile two creature cards from your graveyard: Put a 1/1 black Skeleton creature token onto the battlefield. It has "{B}: Regenerate this creature." -When Drudge Spell leaves the battlefield, destroy all Skeleton tokens. They can't be regenerated. -HML U - -Druid Lyrist -{G} -Creature - Human Druid -1/1 -{G}, {T}, Sacrifice Druid Lyrist: Destroy target enchantment. -ODY C - -Druid of the Anima -{1}{G} -Creature - Elf Druid -1/1 -{T}: Add {R}, {G}, or {W} to your mana pool. -ALA C - -Druid's Call -{1}{G} -Enchantment - Aura -Enchant creature -Whenever enchanted creature is dealt damage, its controller puts that many 1/1 green Squirrel creature tokens onto the battlefield. -ODY U - -Druidic Satchel -{3} -Artifact -{2}, {T}: Reveal the top card of your library. If it's a creature card, put a 1/1 green Saproling creature token onto the battlefield. If it's a land card, put that card onto the battlefield under your control. If it's a noncreature, nonland card, you gain 2 life. -M12 R - -Drumhunter -{3}{G} -Creature - Human Druid Warrior -2/2 -At the beginning of your end step, if you control a creature with power 5 or greater, you may draw a card. -{T}: Add {1} to your mana pool. -ALA U - -Dry Spell -{1}{B} -Sorcery -Dry Spell deals 1 damage to each creature and each player. -HML C (x2), POR U, 6ED C, ME2 C - -Dryad Arbor -Land Creature - Forest Dryad -1/1 -(Dryad Arbor isn't a spell, it's affected by summoning sickness, and it has "{T}: Add {G} to your mana pool.") -Dryad Arbor is green. -FUT U - -Dryad Sophisticate -{1}{G} -Creature - Dryad -2/1 -Nonbasic landwalk -GPT U - -Dryad's Caress -{4}{G}{G} -Instant -You gain 1 life for each creature on the battlefield. If {W} was spent to cast Dryad's Caress, untap all creatures you control. -RAV C - -Dryad's Favor -{G} -Enchantment - Aura -Enchant creature -Enchanted creature has forestwalk. (It's unblockable as long as defending player controls a Forest.) -M11 C - -Dual Nature -{4}{G}{G} -Enchantment -Whenever a nontoken creature enters the battlefield, its controller puts a token that's a copy of that creature onto the battlefield. -Whenever a nontoken creature leaves the battlefield, exile all tokens with the same name as that creature. -When Dual Nature leaves the battlefield, exile all tokens put onto the battlefield with Dual Nature. -PCY R - -Duct Crawler -{R} -Creature - Insect -1/1 -{1}{R}: Target creature can't block Duct Crawler this turn. -STH C, 10E C - -Due Respect -{1}{W} -Instant -Permanents enter the battlefield tapped this turn. -Draw a card. -NPH U - -Dueling Grounds -{1}{G}{W} -Enchantment -No more than one creature can attack each turn. -No more than one creature can block each turn. -INV R - -Duergar Assailant -{R/W} -Creature - Dwarf Soldier -1/1 -Sacrifice Duergar Assailant: Duergar Assailant deals 1 damage to target attacking or blocking creature. -EVE C - -Duergar Cave-Guard -{3}{R} -Creature - Dwarf Warrior -1/3 -Wither (This deals damage to creatures in the form of -1/-1 counters.) -{R/W}: Duergar Cave-Guard gets +1/+0 until end of turn. -EVE U - -Duergar Hedge-Mage -{2}{R/W} -Creature - Dwarf Shaman -2/2 -When Duergar Hedge-Mage enters the battlefield, if you control two or more Mountains, you may destroy target artifact. -When Duergar Hedge-Mage enters the battlefield, if you control two or more Plains, you may destroy target enchantment. -EVE U, HOP U, COM U - -Duergar Mine-Captain -{2}{R/W} -Creature - Dwarf Soldier -2/1 -{1}{R/W}, {Q}: Attacking creatures get +1/+0 until end of turn. ({Q} is the untap symbol.) -EVE U - -Dune-Brood Nephilim -{B}{R}{G}{W} -Creature - Nephilim -3/3 -Whenever Dune-Brood Nephilim deals combat damage to a player, put a 1/1 colorless Sand creature token onto the battlefield for each land you control. -GPT R - -Dunerider Outlaw -{B}{B} -Creature - Human Rebel Rogue -1/1 -Protection from green -At the beginning of each end step, if Dunerider Outlaw dealt damage to an opponent this turn, put a +1/+1 counter on it. -PLC U - -Dungeon Shade -{3}{B} -Creature - Shade Spirit -1/1 -Flying -{B}: Dungeon Shade gets +1/+1 until end of turn. -STH C - -Dungrove Elder -{2}{G} -Creature - Treefolk -*/* -Hexproof (This creature can't be the target of spells or abilities your opponents control.) -Dungrove Elder's power and toughness are each equal to the number of Forests you control. -M12 R - -Duplicant -{6} -Artifact Creature - Shapeshifter -2/4 -Imprint - When Duplicant enters the battlefield, you may exile target nontoken creature. -As long as the exiled card is a creature card, Duplicant has that card's power, toughness, and creature types. It's still a Shapeshifter. -MRD R, ARC R - -Duplicity -{3}{U}{U} -Enchantment -When Duplicity enters the battlefield, exile the top five cards of your library face down. -At the beginning of your upkeep, you may exile all cards from your hand face down. If you do, put all other cards you own exiled with Duplicity into your hand. -At the beginning of your end step, discard a card. -When you lose control of Duplicity, put all cards exiled with Duplicity into their owner's graveyard. -TMP R - -Duress -{B} -Sorcery -Target opponent reveals his or her hand. You choose a noncreature, nonland card from it. That player discards that card. -USG C, 7ED C, DVD C, M10 C, M11 C - -Durkwood Baloth -{4}{G}{G} -Creature - Beast -5/5 -Suspend 5-{G} (Rather than cast this card from your hand, you may pay {G} and exile it with five time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -TSP C - -Durkwood Boars -{4}{G} -Creature - Boar -4/4 -LEG C, 4ED C, 5ED C, S99 C, S00 C - -Durkwood Tracker -{4}{G} -Creature - Giant -4/3 -{1}{G}, {T}: If Durkwood Tracker is on the battlefield, it deals damage equal to its power to target attacking creature. That creature deals damage equal to its power to Durkwood Tracker. -TSP U - -Dusk Imp -{2}{B} -Creature - Imp -2/1 -Flying -ODY C, 8ED C, 10E C, DVD C - -Dusk Urchins -{2}{B} -Creature - Ouphe -4/3 -Whenever Dusk Urchins attacks or blocks, put a -1/-1 counter on it. -When Dusk Urchins dies, draw a card for each -1/-1 counter on it. -SHM R - -Duskdale Wurm -{5}{G}{G} -Creature - Wurm -7/7 -Trample (If this creature would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.) -EVE U, M11 U - -Duskhunter Bat -{1}{B} -Creature - Bat -1/1 -Bloodthirst 1 (If an opponent was dealt damage this turn, this creature enters the battlefield with a +1/+1 counter on it.) -Flying -M12 C - -Duskmantle, House of Shadow -Land -{T}: Add {1} to your mana pool. -{U}{B}, {T}: Target player puts the top card of his or her library into his or her graveyard. -RAV U - -Duskrider Falcon -{1}{W} -Creature - Bird -1/1 -Flying, protection from black -WTH C - -Duskrider Peregrine -{5}{W} -Creature - Bird -3/3 -Flying, protection from black -Suspend 3-{1}{W} (Rather than cast this card from your hand, you may pay {1}{W} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -TSP U - -Duskwalker -{B} -Creature - Human Minion -1/1 -Kicker {3}{B} (You may pay an additional {3}{B} as you cast this spell.) -If Duskwalker was kicked, it enters the battlefield with two +1/+1 counters on it and with fear. (It can't be blocked except by artifact creatures and/or black creatures.) -INV C - -Duskworker -{4} -Artifact Creature - Construct -2/2 -Whenever Duskworker becomes blocked, regenerate it. -{3}: Duskworker gets +1/+0 until end of turn. -MRD U - -Dust Bowl -Land -{T}: Add {1} to your mana pool. -{3}, {T}, Sacrifice a land: Destroy target nonbasic land. -MMQ R - -Dust Corona -{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+0 and can't be blocked by creatures with flying. -PLC C - -Dust Elemental -{2}{W}{W} -Creature - Elemental -6/6 -Flash (You may cast this spell any time you could cast an instant.) -Flying; fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -When Dust Elemental enters the battlefield, return three creatures you control to their owner's hand. -PLC R - -Dust of Moments -{2}{W} -Instant -Choose one - Remove two time counters from each permanent and each suspended card; or put two time counters on each permanent with a time counter on it and each suspended card. -FUT U - -Dust to Dust -{1}{W}{W} -Sorcery -Exile two target artifacts. -DRK C, 5ED U, MED C, ME4 U - -Dwarven Armorer -{R} -Creature - Dwarf -0/2 -{R}, {T}, Discard a card: Put a +0/+1 counter or a +1/+0 counter on target creature. -FEM R - -Dwarven Armory -{2}{R}{R} -Enchantment -{2}, Sacrifice a land: Put a +2/+2 counter on target creature. Activate this ability only during any upkeep step. -ICE R - -Dwarven Berserker -{1}{R} -Creature - Dwarf Berserker -1/1 -Whenever Dwarven Berserker becomes blocked, it gets +3/+0 and gains trample until end of turn. -WTH C - -Dwarven Blastminer -{1}{R} -Creature - Dwarf -1/1 -{2}{R}, {T}: Destroy target nonbasic land. -Morph {R} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS U - -Dwarven Bloodboiler -{R}{R}{R} -Creature - Dwarf -2/2 -Tap an untapped Dwarf you control: Target creature gets +2/+0 until end of turn. -JUD R - -Dwarven Catapult -{X}{R} -Instant -Dwarven Catapult deals X damage divided evenly, rounded down, among all creatures target opponent controls. -FEM U, 5ED U, MED U - -Dwarven Demolition Team -{2}{R} -Creature - Dwarf -1/1 -{T}: Destroy target Wall. -LEA U, LEB U, 2ED U, 8ED U - -Dwarven Driller -{3}{R} -Creature - Dwarf -2/2 -{T}: Destroy target land unless its controller has Dwarven Driller deal 2 damage to him or her. -JUD U - -Dwarven Grunt -{R} -Creature - Dwarf -1/1 -Mountainwalk -ODY C - -Dwarven Hold -Land -Dwarven Hold enters the battlefield tapped. -You may choose not to untap Dwarven Hold during your untap step. -At the beginning of your upkeep, if Dwarven Hold is tapped, put a storage counter on it. -{T}, Remove any number of storage counters from Dwarven Hold: Add {R} to your mana pool for each storage counter removed this way. -FEM R, 5ED R - -Dwarven Landslide -{3}{R} -Sorcery -Kicker-{2}{R}, Sacrifice a land. (You may pay {2}{R} and sacrifice a land in addition to any other costs as you cast this spell.) -Destroy target land. If Dwarven Landslide was kicked, destroy another target land. -APC C - -Dwarven Lieutenant -{R}{R} -Creature - Dwarf Soldier -1/2 -{1}{R}: Target Dwarf creature gets +1/+0 until end of turn. -FEM U - -Dwarven Miner -{1}{R} -Creature - Dwarf -1/2 -{2}{R}, {T}: Destroy target nonbasic land. -MIR U - -Dwarven Nomad -{2}{R} -Creature - Dwarf Nomad -1/1 -{T}: Target creature with power 2 or less is unblockable this turn. -MIR C - -Dwarven Patrol -{2}{R} -Creature - Dwarf -4/2 -Dwarven Patrol doesn't untap during your untap step. -Whenever you cast a nonred spell, untap Dwarven Patrol. -APC U - -Dwarven Pony -{R} -Creature - Horse -1/1 -{1}{R}, {T}: Target Dwarf creature gains mountainwalk until end of turn. -HML R - -Dwarven Recruiter -{2}{R} -Creature - Dwarf -2/2 -When Dwarven Recruiter enters the battlefield, search your library for any number of Dwarf cards and reveal those cards. Shuffle your library, then put them on top of it in any order. -ODY U - -Dwarven Ruins -Land -Dwarven Ruins enters the battlefield tapped. -{T}: Add {R} to your mana pool. -{T}, Sacrifice Dwarven Ruins: Add {R}{R} to your mana pool. -FEM U, 5ED U, 6ED U, BTD U, ME2 U - -Dwarven Scorcher -{R} -Creature - Dwarf -1/1 -Sacrifice Dwarven Scorcher: Dwarven Scorcher deals 1 damage to target creature unless that creature's controller has Dwarven Scorcher deal 2 damage to him or her. -JUD C - -Dwarven Sea Clan -{2}{R} -Creature - Dwarf -1/1 -{T}: Choose target attacking or blocking creature whose controller controls an Island. Dwarven Sea Clan deals 2 damage to that creature at end of combat. Activate this ability only before the end of combat step. -HML R - -Dwarven Shrine -{1}{R}{R} -Enchantment -Whenever a player casts a spell, Dwarven Shrine deals X damage to that player, where X is twice the number of cards in all graveyards with the same name as that spell. -ODY R - -Dwarven Soldier -{1}{R} -Creature - Dwarf Soldier -2/1 -Whenever Dwarven Soldier blocks or becomes blocked by one or more Orcs, Dwarven Soldier gets +0/+2 until end of turn. -FEM C (x3), 5ED C, MED C - -Dwarven Song -{R} -Instant -Any number of target creatures become red until end of turn. -LEG U - -Dwarven Strike Force -{4}{R} -Creature - Dwarf Berserker -4/3 -Discard a card at random: Dwarven Strike Force gains first strike and haste until end of turn. -ODY U - -Dwarven Thaumaturgist -{2}{R} -Creature - Dwarf Shaman -1/2 -{T}: Switch target creature's power and toughness until end of turn. -WTH R - -Dwarven Trader -{R} -Creature - Dwarf -1/1 -HML C (x2) - -Dwarven Vigilantes -{2}{R} -Creature - Dwarf -2/2 -Whenever Dwarven Vigilantes attacks and isn't blocked, you may have it deal damage equal to its power to target creature. If you do, Dwarven Vigilantes assigns no combat damage this turn. -VIS C - -Dwarven Warriors -{2}{R} -Creature - Dwarf Warrior -1/1 -{T}: Target creature with power 2 or less is unblockable this turn. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C - -Dwarven Weaponsmith -{1}{R} -Creature - Dwarf Artificer -1/1 -{T}, Sacrifice an artifact: Put a +1/+1 counter on target creature. Activate this ability only during your upkeep. -ATQ U, 3ED U - -Dwell on the Past -{G} -Sorcery -Target player shuffles up to four target cards from his or her graveyard into his or her library. -TOR U - -Dying Wail -{1}{B} -Enchantment - Aura -Enchant creature -When enchanted creature dies, target player discards two cards. -UDS C - -Dystopia -{1}{B}{B} -Enchantment -Cumulative upkeep-Pay 1 life. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -At the beginning of each player's upkeep, that player sacrifices a green or white permanent. -ALL R, ME2 R - -Eager Cadet -{W} -Creature - Human Soldier -1/1 -S99 C, S00 C, 7ED C, 8ED C, 9ED C - -Early Frost -{1}{U} -Instant -Tap up to three target lands. -5DN C - -Early Harvest -{1}{G}{G} -Instant -Target player untaps all basic lands he or she controls. -MIR R, 6ED R, 7ED R, 9ED R - -Earnest Fellowship -{1}{W} -Enchantment -Each creature has protection from its colors. -ODY R - -Earsplitting Rats -{3}{B} -Creature - Rat -2/1 -When Earsplitting Rats enters the battlefield, each player discards a card. -Discard a card: Regenerate Earsplitting Rats. -JUD C - -Earth Elemental -{3}{R}{R} -Creature - Elemental -4/5 -LEA U, LEB U, 2ED U, 3ED U, 4ED U, S99 U, 10E U - -Earth Rift -{3}{R} -Sorcery -Destroy target land. -Flashback {5}{R}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY C - -Earth Servant -{5}{R} -Creature - Elemental -4/4 -Earth Servant gets +0/+1 for each Mountain you control. -M11 U - -Earth Surge -{3}{G} -Enchantment -Each land gets +2/+2 as long as it's a creature. -GPT R - -Earthbind -{R} -Enchantment - Aura -Enchant creature -When Earthbind enters the battlefield, if enchanted creature has flying, Earthbind deals 2 damage to that creature and Earthbind gains "Enchanted creature loses flying." -LEA C, LEB C, 2ED C, 3ED C - -Earthblighter -{1}{B} -Creature - Human Cleric -1/1 -{2}{B}, {T}, Sacrifice a Goblin: Destroy target land. -LGN U - -Earthbrawn -{1}{G} -Instant -Target creature gets +3/+3 until end of turn. -Reinforce 1-{1}{G} ({1}{G}, Discard this card: Put a +1/+1 counter on target creature.) -MOR C - -Earthcraft -{1}{G} -Enchantment -Tap an untapped creature you control: Untap target basic land. -TMP R - -Earthen Goo -{2}{R} -Creature - Ooze -2/2 -Trample -Cumulative upkeep {R} or {G} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -Earthen Goo gets +1/+1 for each age counter on it. -CSP U - -Earthlink -{3}{B}{R}{G} -Enchantment -At the beginning of your upkeep, sacrifice Earthlink unless you pay {2}. -Whenever a creature dies, that creature's controller sacrifices a land. -ICE R, ME2 R - -Earthlore -{G} -Enchantment - Aura -Enchant land you control -Enchanted land has "{T}: Target blocking creature gets +1/+2 until end of turn." -ICE C - -Earthquake -{X}{R} -Sorcery -Earthquake deals X damage to each creature without flying and each player. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, POR R, P02 R, 6ED R, 7ED R, M10 R, COM R - -Earthshaker -{4}{R}{R} -Creature - Spirit -4/5 -Whenever you cast a Spirit or Arcane spell, Earthshaker deals 2 damage to each creature without flying. -CHK U - -Earwig Squad -{3}{B}{B} -Creature - Goblin Rogue -5/3 -Prowl {2}{B} (You may cast this for its prowl cost if you dealt combat damage to a player this turn with a Goblin or Rogue.) -When Earwig Squad enters the battlefield, if its prowl cost was paid, search target opponent's library for three cards and exile them. Then that player shuffles his or her library. -MOR R - -Eastern Paladin -{2}{B}{B} -Creature - Zombie Knight -3/3 -{B}{B}, {T}: Destroy target green creature. -USG R, 7ED R, 8ED R - -Eater of Days -{4} -Artifact Creature - Leviathan -9/8 -Flying, trample -When Eater of Days enters the battlefield, you skip your next two turns. -DST R - -Eater of the Dead -{4}{B} -Creature - Horror -3/4 -{0}: If Eater of the Dead is tapped, exile target creature card from a graveyard and untap Eater of the Dead. -DRK U, MED U - -Ebon Dragon -{5}{B}{B} -Creature - Dragon -5/4 -Flying -When Ebon Dragon enters the battlefield, you may have target opponent discard a card. -POR R, FVD R, ME4 R - -Ebon Drake -{2}{B} -Creature - Drake -3/3 -Flying -Whenever a player casts a spell, you lose 1 life. -5DN U - -Ebon Praetor -{4}{B}{B} -Creature - Avatar Praetor -5/5 -First strike, trample -At the beginning of your upkeep, put a -2/-2 counter on Ebon Praetor. -Sacrifice a creature: Remove a -2/-2 counter from Ebon Praetor. If the sacrificed creature was a Thrull, put a +1/+0 counter on Ebon Praetor. Activate this ability only during your upkeep and only once each turn. -FEM R, ME2 R - -Ebon Stronghold -Land -Ebon Stronghold enters the battlefield tapped. -{T}: Add {B} to your mana pool. -{T}, Sacrifice Ebon Stronghold: Add {B}{B} to your mana pool. -FEM U, 5ED U, 6ED U, BTD U, ME2 U - -Ebonblade Reaper -{2}{B} -Creature - Human Cleric -1/1 -Whenever Ebonblade Reaper attacks, you lose half your life, rounded up. -Whenever Ebonblade Reaper deals combat damage to a player, that player loses half his or her life, rounded up. -Morph {3}{B}{B} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS R - -Ebony Charm -{B} -Instant -Choose one - Target opponent loses 1 life and you gain 1 life; or exile up to three target cards from a single graveyard; or target creature gains fear until end of turn. (It can't be blocked except by artifact creatures and/or black creatures.) -MIR C - -Ebony Horse -{3} -Artifact -{2}, {T}: Untap target attacking creature you control. Prevent all combat damage that would be dealt to and dealt by that creature this turn. -ARN R, 3ED R, 4ED R, ME4 C - -Ebony Owl Netsuke -{2} -Artifact -At the beginning of each opponent's upkeep, if that player has seven or more cards in hand, Ebony Owl Netsuke deals 4 damage to him or her. -SOK U - -Ebony Rhino -{7} -Artifact Creature - Rhino -4/5 -Trample -HML C, ME4 C - -Ebony Treefolk -{1}{B}{G} -Creature - Treefolk -3/3 -{B}{G}: Ebony Treefolk gets +1/+1 until end of turn. -APC U - -Echo Chamber -{4} -Artifact -{4}, {T}: An opponent chooses target creature he or she controls. Put a token that's a copy of that creature onto the battlefield. That token gains haste until end of turn. Exile the token at the beginning of the next end step. Activate this ability only any time you could cast a sorcery. -TMP R - -Echo Circlet -{2} -Artifact - Equipment -Equipped creature can block an additional creature. -Equip {1} -SOM C - -Echo Mage -{1}{U}{U} -Creature - Human Wizard -2/3 -Level up {1}{U} ({1}{U}: Put a level counter on this. Level up only as a sorcery.) -LEVEL 2-3 -2/4 -{U}{U}, {T}: Copy target instant or sorcery spell. You may choose new targets for the copy. -LEVEL 4+ -2/5 -{U}{U}, {T}: Copy target instant or sorcery spell twice. You may choose new targets for the copies. -ROE R - -Echo Tracer -{2}{U} -Creature - Human Wizard -2/2 -Morph {2}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Echo Tracer is turned face up, return target creature to its owner's hand. -LGN C - -Echoing Calm -{1}{W} -Instant -Destroy target enchantment and all other enchantments with the same name as that enchantment. -DST C - -Echoing Courage -{1}{G} -Instant -Target creature and all other creatures with the same name as that creature get +2/+2 until end of turn. -DST C - -Echoing Decay -{1}{B} -Instant -Target creature and all other creatures with the same name as that creature get -2/-2 until end of turn. -DST C - -Echoing Ruin -{1}{R} -Sorcery -Destroy target artifact and all other artifacts with the same name as that artifact. -DST C - -Echoing Truth -{1}{U} -Instant -Return target nonland permanent and all other permanents with the same name as that permanent to their owners' hands. -DST C, EVT C - -Edge of Autumn -{1}{G} -Sorcery -If you control four or fewer lands, search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. -Cycling-Sacrifice a land. (Sacrifice a land, Discard this card: Draw a card.) -FUT C, DDG C - -Edge of the Divinity -{W/B} -Enchantment - Aura -Enchant creature -As long as enchanted creature is white, it gets +1/+2. -As long as enchanted creature is black, it gets +2/+1. -EVE C - -Edgewalker -{1}{W}{B} -Creature - Human Cleric -2/2 -Cleric spells you cast cost {W}{B} less to cast. This effect reduces only the amount of colored mana you pay. (For example, if you cast a Cleric spell with mana cost {1}{W}, it costs {1} to cast.) -SCG U - -Edric, Spymaster of Trest -{1}{G}{U} -Legendary Creature - Elf Rogue -2/2 -Whenever a creature deals combat damage to one of your opponents, its controller may draw a card. -COM R - -Eel Umbra -{1}{U} -Enchantment - Aura -Flash (You may cast this spell any time you could cast an instant.) -Enchant creature -Enchanted creature gets +1/+1. -Totem armor (If enchanted creature would be destroyed, instead remove all damage from it and destroy this Aura.) -ROE C - -Eerie Procession -{2}{U} -Sorcery - Arcane -Search your library for an Arcane card, reveal that card, and put it into your hand. Then shuffle your library. -CHK U - -Ego Erasure -{2}{U} -Tribal Instant - Shapeshifter -Changeling (This card is every creature type at all times.) -Creatures target player controls get -2/-0 and lose all creature types until end of turn. -LRW U - -Eiganjo Castle -Legendary Land -{T}: Add {W} to your mana pool. -{W}, {T}: Prevent the next 2 damage that would be dealt to target legendary creature this turn. -CHK R - -Eiganjo Free-Riders -{3}{W} -Creature - Human Soldier -3/4 -Flying -At the beginning of your upkeep, return a white creature you control to its owner's hand. -SOK U - -Eight-and-a-Half-Tails -{W}{W} -Legendary Creature - Fox Cleric -2/2 -{1}{W}: Target permanent you control gains protection from white until end of turn. -{1}: Target spell or permanent becomes white until end of turn. -CHK R - -Eight-and-a-Half-Tails Avatar -Vanguard -Hand +2, life -3 -{1}: Until end of turn, target permanent you control gains protection from a color chosen at random from colors it doesn't have protection from. -VG S - -Eightfold Maze -{2}{W} -Instant -Cast Eightfold Maze only during the declare attackers step and only if you've been attacked this step. -Destroy target attacking creature. -PTK R, ME3 U - -Ekundu Cyclops -{3}{R} -Creature - Cyclops -3/4 -If a creature you control attacks, Ekundu Cyclops also attacks if able. -MIR C - -Ekundu Griffin -{3}{W} -Creature - Griffin -2/2 -Flying, first strike -MIR C, 6ED C - -El-Hajjaj -{1}{B}{B} -Creature - Human Wizard -1/1 -Whenever El-Hajjaj deals damage, you gain that much life. -ARN R, 3ED R, 4ED R - -Eladamri -Vanguard -Hand -1, life +15 -{0}: The next 1 damage that would be dealt to target creature you control is dealt to you instead. -VG S - -Eladamri's Call -{G}{W} -Instant -Search your library for a creature card, reveal that card, and put it into your hand. Then shuffle your library. -PLS R - -Eladamri's Vineyard -{G} -Enchantment -At the beginning of each player's precombat main phase, add {G}{G} to that player's mana pool. -TMP R - -Eladamri, Lord of Leaves -{G}{G} -Legendary Creature - Elf Warrior -2/2 -Other Elf creatures have forestwalk. -Other Elves have shroud. (They can't be the targets of spells or abilities.) -TMP R - -Eladamri, Lord of Leaves Avatar -Vanguard -Hand -1, life +2 -At the beginning of each player's precombat main phase, that player adds {G}{G} to his or her mana pool. -VG S - -Eland Umbra -{1}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +0/+4. -Totem armor (If enchanted creature would be destroyed, instead remove all damage from it and destroy this Aura.) -ROE C - -Elder Druid -{3}{G} -Creature - Elf Cleric Druid -2/2 -{3}{G}, {T}: You may tap or untap target artifact, creature, or land. -ICE R, 5ED R, 6ED R, 7ED R - -Elder Land Wurm -{4}{W}{W}{W} -Creature - Dragon Wurm -5/5 -Defender, trample -When Elder Land Wurm blocks, it loses defender. -LEG R, 4ED R, MED U - -Elder Mastery -{3}{U}{B}{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +3/+3 and has flying. -Whenever enchanted creature deals damage to a player, that player discards two cards. -CON U - -Elder Pine of Jukai -{2}{G} -Creature - Spirit -2/1 -Whenever you cast a Spirit or Arcane spell, reveal the top three cards of your library. Put all land cards revealed this way into your hand and the rest on the bottom of your library in any order. -Soulshift 2 (When this creature dies, you may return target Spirit card with converted mana cost 2 or less from your graveyard to your hand.) -SOK C - -Elder Spawn -{4}{U}{U}{U} -Creature - Elemental -6/6 -At the beginning of your upkeep, unless you sacrifice an Island, sacrifice Elder Spawn and it deals 6 damage to you. -Elder Spawn can't be blocked by red creatures. -LEG R - -Eldrazi Conscription -{8} -Tribal Enchantment - Eldrazi Aura -Enchant creature -Enchanted creature gets +10/+10 and has trample and annihilator 2. (Whenever it attacks, defending player sacrifices two permanents.) -ROE R - -Eldrazi Monument -{5} -Artifact -Creatures you control get +1/+1, have flying, and are indestructible. -At the beginning of your upkeep, sacrifice a creature. If you can't, sacrifice Eldrazi Monument. -ZEN M - -Eldrazi Temple -Land -{T}: Add {1} to your mana pool. -{T}: Add {2} to your mana pool. Spend this mana only to cast colorless Eldrazi spells or activate abilities of colorless Eldrazi. -ROE R - -Electric Eel -{U} -Creature - Fish -1/1 -When Electric Eel enters the battlefield, it deals 1 damage to you. -{R}{R}: Electric Eel gets +2/+0 until end of turn and deals 1 damage to you. -DRK U - -Electrolyze -{1}{U}{R} -Instant -Electrolyze deals 2 damage divided as you choose among one or two target creatures and/or players. -Draw a card. -GPT U, COM U - -Electropotence -{2}{R} -Enchantment -Whenever a creature enters the battlefield under your control, you may pay {2}{R}. If you do, that creature deals damage equal to its power to target creature or player. -ZEN R - -Electrostatic Bolt -{R} -Instant -Electrostatic Bolt deals 2 damage to target creature. If it's an artifact creature, Electrostatic Bolt deals 4 damage to it instead. -MRD C - -Electryte -{3}{R}{R} -Creature - Beast -3/3 -Whenever Electryte deals combat damage to defending player, it deals damage equal to its power to each blocking creature. -USG R - -Elemental Appeal -{R}{R}{R}{R} -Sorcery -Kicker {5} (You may pay an additional {5} as you cast this spell.) -Put a 7/1 red Elemental creature token with trample and haste onto the battlefield. Exile it at the beginning of the next end step. If Elemental Appeal was kicked, that creature gets +7/+0 until end of turn. -ZEN R - -Elemental Augury -{U}{B}{R} -Enchantment -{3}: Look at the top three cards of target player's library, then put them back in any order. -ICE R, ME2 R - -Elemental Mastery -{3}{R} -Enchantment - Aura -Enchant creature -Enchanted creature has "{T}: Put X 1/1 red Elemental creature tokens with haste onto the battlefield, where X is this creature's power. Exile them at the beginning of the next end step." -SHM R - -Elemental Resonance -{2}{G}{G} -Enchantment - Aura -Enchant permanent -At the beginning of your precombat main phase, add mana equal to enchanted permanent's mana cost to your mana pool. (Mana cost includes color. If a mana symbol has multiple colors, choose one.) -DIS R - -Elephant Ambush -{2}{G}{G} -Instant -Put a 3/3 green Elephant creature token onto the battlefield. -Flashback {6}{G}{G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY C - -Elephant Grass -{G} -Enchantment -Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -Black creatures can't attack you. -Nonblack creatures can't attack you unless their controller pays {2} for each creature he or she controls that's attacking you. -VIS U - -Elephant Graveyard -Land -{T}: Add {1} to your mana pool. -{T}: Regenerate target Elephant. -ARN R, ME4 U - -Elephant Guide -{2}{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +3/+3. -When enchanted creature dies, put a 3/3 green Elephant creature token onto the battlefield. -JUD U, GVL U - -Elephant Resurgence -{1}{G} -Sorcery -Each player puts a green Elephant creature token onto the battlefield. Those creatures have "This creature's power and toughness are each equal to the number of creature cards in its controller's graveyard." -PCY R - -Elesh Norn, Grand Cenobite -{5}{W}{W} -Legendary Creature - Praetor -4/7 -Vigilance -Other creatures you control get +2/+2. -Creatures your opponents control get -2/-2. -NPH M - -Elf Replica -{3} -Artifact Creature - Elf -2/2 -{1}{G}, Sacrifice Elf Replica: Destroy target enchantment. -MRD C - -Elfhame Palace -Land -Elfhame Palace enters the battlefield tapped. -{T}: Add {G} or {W} to your mana pool. -INV U, 8ED U, PVC U - -Elfhame Sanctuary -{1}{G} -Enchantment -At the beginning of your upkeep, you may search your library for a basic land card, reveal that card, and put it into your hand. If you do, you skip your draw step this turn and shuffle your library. -INV U - -Elite Archers -{5}{W} -Creature - Human Soldier Archer -3/3 -{T}: Elite Archers deals 3 damage to target attacking or blocking creature. -USG R, 7ED R, 8ED R - -Elite Cat Warrior -{2}{G} -Creature - Cat Warrior -2/3 -Forestwalk -POR C (x2), ME4 C - -Elite Javelineer -{2}{W} -Creature - Human Soldier -2/2 -Whenever Elite Javelineer blocks, it deals 1 damage to target attacking creature. -TMP C, 8ED U - -Elite Vanguard -{W} -Creature - Human Soldier -2/1 -M10 U, M11 U, EVT U, M12 U - -Elixir of Immortality -{1} -Artifact -{2}, {T}: You gain 5 life. Shuffle Elixir of Immortality and your graveyard into their owner's library. -M11 U, EVT U, M12 U - -Elixir of Vitality -{4} -Artifact -Elixir of Vitality enters the battlefield tapped. -{T}, Sacrifice Elixir of Vitality: You gain 4 life. -{8}, {T}, Sacrifice Elixir of Vitality: You gain 8 life. -MIR U - -Elkin Bottle -{3} -Artifact -{3}, {T}: Exile the top card of your library. Until the beginning of your next upkeep, you may play that card. -ICE R, 5ED R, ME2 R - -Elkin Lair -{3}{R} -World Enchantment -At the beginning of each player's upkeep, that player exiles a card at random from his or her hand. The player may play that card this turn. At the beginning of the next end step, if the player hasn't played the card, he or she puts it into his or her graveyard. -VIS R - -Eloren Wilds -Plane - Shandalar -Whenever a player taps a permanent for mana, that player adds one mana to his or her mana pool of any type that permanent produced. -Whenever you roll {C}, target player can't cast spells until a player planeswalks. -HOP C - -Elsewhere Flask -{2} -Artifact -When Elsewhere Flask enters the battlefield, draw a card. -Sacrifice Elsewhere Flask: Choose a basic land type. Each land you control becomes that type until end of turn. -SHM C - -Elspeth Tirel -{3}{W}{W} -Planeswalker - Elspeth -4 -[+2] You gain 1 life for each creature you control. -[-2] Put three 1/1 white Soldier creature tokens onto the battlefield. -[-5] Destroy all other permanents except for lands and tokens. -SOM M - -Elspeth, Knight-Errant -{2}{W}{W} -Planeswalker - Elspeth -4 -[+1] Put a 1/1 white Soldier creature token onto the battlefield. -[+1] Target creature gets +3/+3 and gains flying until end of turn. -[-8] You get an emblem with "Artifacts, creatures, enchantments, and lands you control are indestructible." -ALA M, EVT M - -Elven Cache -{2}{G}{G} -Sorcery -Return target card from your graveyard to your hand. -VIS C, POR C, 6ED C - -Elven Fortress -{G} -Enchantment -{1}{G}: Target blocking creature gets +0/+1 until end of turn. -FEM C (x4) - -Elven Lyre -{2} -Artifact -{1}, {T}, Sacrifice Elven Lyre: Target creature gets +2/+2 until end of turn. -FEM R, ME2 C - -Elven Palisade -{G} -Enchantment -Sacrifice a Forest: Target attacking creature gets -3/-0 until end of turn. -EXO U - -Elven Riders -{3}{G}{G} -Creature - Elf -3/3 -Elven Riders can't be blocked except by Walls and/or creatures with flying. -LEG R, 4ED U, 5ED U, 6ED U, ONS U, 10E U - -Elven Rite -{1}{G} -Sorcery -Distribute two +1/+1 counters among one or two target creatures. -STH U - -Elven Warhounds -{3}{G} -Creature - Hound -2/2 -Whenever Elven Warhounds becomes blocked by a creature, put that creature on top of its owner's library. -TMP R - -Elves of Deep Shadow -{G} -Creature - Elf Druid -1/1 -{T}: Add {B} to your mana pool. Elves of Deep Shadow deals 1 damage to you. -DRK U, RAV C, ME3 C - -Elvish Aberration -{5}{G} -Creature - Elf Mutant -4/5 -{T}: Add {G}{G}{G} to your mana pool. -Forestcycling {2} ({2}, Discard this card: Search your library for a Forest card, reveal it, and put it into your hand. Then shuffle your library.) -SCG U, COM U - -Elvish Archdruid -{1}{G}{G} -Creature - Elf Druid -2/2 -Other Elf creatures you control get +1/+1. -{T}: Add {G} to your mana pool for each Elf you control. -M10 R, M11 R, M12 R - -Elvish Archers -{1}{G} -Creature - Elf Archer -2/1 -First strike -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, 6ED R, 7ED R - -Elvish Bard -{3}{G}{G} -Creature - Elf Shaman -2/4 -All creatures able to block Elvish Bard do so. -ALL U, 9ED U - -Elvish Berserker -{G} -Creature - Elf Berserker -1/1 -Whenever Elvish Berserker becomes blocked, it gets +1/+1 until end of turn for each creature blocking it. -EXO C, 9ED C, 10E C - -Elvish Branchbender -{2}{G} -Creature - Elf Druid -2/2 -{T}: Until end of turn, target Forest becomes an X/X Treefolk creature in addition to its other types, where X is the number of Elves you control. -LRW C - -Elvish Champion -{1}{G}{G} -Creature - Elf -2/2 -Other Elf creatures get +1/+1 and have forestwalk. (They're unblockable as long as defending player controls a Forest.) -INV R, 7ED R, 8ED R, 9ED R, 10E R - -Elvish Champion Avatar -Vanguard -Hand +0, life -5 -You begin the game with a 1/1 green Elf creature token on the battlefield. It has "{T}: Add {G} to your mana pool." -VG S - -Elvish Eulogist -{G} -Creature - Elf Shaman -1/1 -Sacrifice Elvish Eulogist: You gain 1 life for each Elf card in your graveyard. -LRW C, EVG C - -Elvish Farmer -{1}{G} -Creature - Elf -0/2 -At the beginning of your upkeep, put a spore counter on Elvish Farmer. -Remove three spore counters from Elvish Farmer: Put a 1/1 green Saproling creature token onto the battlefield. -Sacrifice a Saproling: You gain 2 life. -FEM R, ME2 R - -Elvish Fury -{G} -Instant -Buyback {4} (You may pay an additional {4} as you cast this spell. If you do, put this card into your hand as it resolves.) -Target creature gets +2/+2 until end of turn. -TMP C - -Elvish Guidance -{2}{G} -Enchantment - Aura -Enchant land -Whenever enchanted land is tapped for mana, its controller adds {G} to his or her mana pool for each Elf on the battlefield (in addition to the mana the land produces). -ONS C - -Elvish Handservant -{G} -Creature - Elf Warrior -1/1 -Whenever a player casts a Giant spell, you may put a +1/+1 counter on Elvish Handservant. -LRW C - -Elvish Harbinger -{2}{G} -Creature - Elf Druid -1/2 -When Elvish Harbinger enters the battlefield, you may search your library for an Elf card, reveal it, then shuffle your library and put that card on top of it. -{T}: Add one mana of any color to your mana pool. -LRW U, EVG U - -Elvish Healer -{2}{W} -Creature - Elf Cleric -1/2 -{T}: Prevent the next 1 damage that would be dealt to target creature or player this turn. If that creature is green, prevent the next 2 damage instead. -ICE C - -Elvish Herder -{G} -Creature - Elf -1/1 -{G}: Target creature gains trample until end of turn. -USG C - -Elvish Hexhunter -{G/W} -Creature - Elf Shaman -1/1 -{G/W}, {T}, Sacrifice Elvish Hexhunter: Destroy target enchantment. -SHM C - -Elvish Hunter -{1}{G} -Creature - Elf Archer -1/1 -{1}{G}, {T}: Target creature doesn't untap during its controller's next untap step. -FEM C (x3), ME2 C - -Elvish Lookout -{G} -Creature - Elf -1/1 -Shroud (This permanent can't be the target of spells or abilities.) -UDS C - -Elvish Lyrist -{G} -Creature - Elf -1/1 -{G}, {T}, Sacrifice Elvish Lyrist: Destroy target enchantment. -USG C, BRB U, 7ED U, 8ED U - -Elvish Pathcutter -{3}{G} -Creature - Elf Scout -1/2 -{2}{G}: Target Elf creature gains forestwalk until end of turn. -ONS C - -Elvish Pioneer -{G} -Creature - Elf Druid -1/1 -When Elvish Pioneer enters the battlefield, you may put a basic land card from your hand onto the battlefield tapped. -ONS C, 8ED C - -Elvish Piper -{3}{G} -Creature - Elf Shaman -1/1 -{G}, {T}: You may put a creature card from your hand onto the battlefield. -UDS R, 7ED R, 8ED R, 9ED R, 10E R, M10 R - -Elvish Promenade -{3}{G} -Tribal Sorcery - Elf -Put a 1/1 green Elf Warrior creature token onto the battlefield for each Elf you control. -LRW U, EVG U - -Elvish Ranger -{2}{G} -Creature - Elf -4/1 -ALL C (x2), POR C, ME2 C - -Elvish Scout -{G} -Creature - Elf Scout -1/1 -{G}, {T}: Untap target attacking creature you control. Prevent all combat damage that would be dealt to and dealt by it this turn. -FEM C (x3) - -Elvish Scrapper -{G} -Creature - Elf -1/1 -{G}, {T}, Sacrifice Elvish Scrapper: Destroy target artifact. -ONS U, 8ED U - -Elvish Skysweeper -{G} -Creature - Elf Warrior -1/1 -{4}{G}, Sacrifice a creature: Destroy target creature with flying. -RAV C - -Elvish Soultiller -{3}{G}{G} -Creature - Elf Mutant -5/4 -When Elvish Soultiller dies, choose a creature type. Shuffle all creature cards of that type from your graveyard into your library. -LGN R - -Elvish Spirit Guide -{2}{G} -Creature - Elf Spirit -2/2 -Exile Elvish Spirit Guide from your hand: Add {G} to your mana pool. -ALL U, ME2 U - -Elvish Vanguard -{1}{G} -Creature - Elf Warrior -1/1 -Whenever another Elf enters the battlefield, put a +1/+1 counter on Elvish Vanguard. -ONS R - -Elvish Visionary -{1}{G} -Creature - Elf Shaman -1/1 -When Elvish Visionary enters the battlefield, draw a card. -ALA C, M10 C - -Elvish Warrior -{G}{G} -Creature - Elf Warrior -2/3 -ONS C, 9ED C, EVG C, MOR C - -Embalmed Brawler -{2}{B} -Creature - Zombie -2/2 -Amplify 1 (As this creature enters the battlefield, put a +1/+1 counter on it for each Zombie card you reveal in your hand.) -Whenever Embalmed Brawler attacks or blocks, you lose 1 life for each +1/+1 counter on it. -LGN C - -Embargo -{3}{U} -Enchantment -Nonland permanents don't untap during their controllers' untap steps. -At the beginning of your upkeep, you lose 2 life. -MMQ R - -Ember Beast -{2}{R} -Creature - Beast -3/4 -Ember Beast can't attack or block alone. -ODY C - -Ember Gale -{3}{R} -Sorcery -Creatures target player controls can't block this turn. Ember Gale deals 1 damage to each white and/or blue creature that player controls. -SHM C - -Ember Hauler -{R}{R} -Creature - Goblin -2/2 -{1}, Sacrifice Ember Hauler: Ember Hauler deals 2 damage to target creature or player. -M11 U - -Ember Shot -{6}{R} -Instant -Ember Shot deals 3 damage to target creature or player. -Draw a card. -JUD C - -Ember Weaver -{2}{G} -Creature - Spider -2/3 -Reach (This can block creatures with flying.) -As long as you control a red permanent, Ember Weaver gets +1/+0 and has first strike. -CON C - -Ember-Fist Zubera -{1}{R} -Creature - Zubera Spirit -1/2 -When Ember-Fist Zubera dies, it deals damage to target creature or player equal to the number of Zubera that died this turn. -CHK C - -Embermage Goblin -{3}{R} -Creature - Goblin Wizard -1/1 -When Embermage Goblin enters the battlefield, you may search your library for a card named Embermage Goblin, reveal it, and put it into your hand. If you do, shuffle your library. -{T}: Embermage Goblin deals 1 damage to target creature or player. -ONS U - -Embersmith -{1}{R} -Creature - Human Artificer -2/1 -Whenever you cast an artifact spell, you may pay {1}. If you do, Embersmith deals 1 damage to target creature or player. -SOM U - -Emberstrike Duo -{1}{B/R} -Creature - Elemental Warrior Shaman -1/1 -Whenever you cast a black spell, Emberstrike Duo gets +1/+1 until end of turn. -Whenever you cast a red spell, Emberstrike Duo gains first strike until end of turn. -SHM C - -Emberwilde Augur -{1}{R} -Creature - Goblin Shaman -2/1 -Sacrifice Emberwilde Augur: Emberwilde Augur deals 3 damage to target player. Activate this ability only during your upkeep. -FUT C, EVG C - -Emberwilde Caliph -{2}{U}{R} -Creature - Djinn -4/4 -Flying, trample -Emberwilde Caliph attacks each turn if able. -Whenever Emberwilde Caliph deals damage, you lose that much life. -MIR R - -Emberwilde Djinn -{2}{R}{R} -Creature - Djinn -5/4 -Flying -At the beginning of each player's upkeep, that player may pay {R}{R} or 2 life. If he or she does, the player gains control of Emberwilde Djinn. -MIR R - -Emblazoned Golem -{2} -Artifact Creature - Golem -1/2 -Kicker {X} (You may pay an additional {X} as you cast this spell.) -Spend only colored mana on X. No more than one mana of each color may be spent this way. -If Emblazoned Golem was kicked, it enters the battlefield with X +1/+1 counters on it. -APC U - -Emblem of the Warmind -{1}{R} -Enchantment - Aura -Enchant creature you control -Creatures you control have haste. -FUT U - -Embolden -{2}{W} -Instant -Prevent the next 4 damage that would be dealt this turn to any number of target creatures and/or players, divided as you choose. -Flashback {1}{W} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY C - -Embrace My Diabolical Vision -Scheme -When you set this scheme in motion, each player shuffles his or her hand and graveyard into his or her library. You draw seven cards, then each other player draws four cards. -ARC C - -Emerald Charm -{G} -Instant -Choose one - Untap target permanent; or destroy target non-Aura enchantment; or target creature loses flying until end of turn. -VIS C - -Emerald Dragonfly -{1}{G} -Creature - Insect -1/1 -Flying -{G}{G}: Emerald Dragonfly gains first strike until end of turn. -LEG C, CHR C - -Emerald Medallion -{2} -Artifact -Green spells you cast cost {1} less to cast. -TMP R - -Emerald Oryx -{3}{G} -Creature - Antelope -2/3 -Forestwalk (This creature is unblockable as long as defending player controls a Forest.) -M10 C - -Emerge Unscathed -{W} -Instant -Target creature you control gains protection from the color of your choice until end of turn. -Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -ROE U - -Emeria Angel -{2}{W}{W} -Creature - Angel -3/3 -Flying -Landfall - Whenever a land enters the battlefield under your control, you may put a 1/1 white Bird creature token with flying onto the battlefield. -ZEN R - -Emeria, the Sky Ruin -Land -Emeria, the Sky Ruin enters the battlefield tapped. -At the beginning of your upkeep, if you control seven or more Plains, you may return target creature card from your graveyard to the battlefield. -{T}: Add {W} to your mana pool. -ZEN R - -Emissary of Despair -{1}{B}{B} -Creature - Spirit -2/1 -Flying -Whenever Emissary of Despair deals combat damage to a player, that player loses 1 life for each artifact he or she controls. -DST U - -Emissary of Hope -{1}{W}{W} -Creature - Spirit -2/1 -Flying -Whenever Emissary of Hope deals combat damage to a player, you gain 1 life for each artifact that player controls. -DST U - -Emmessi Tome -{4} -Artifact -{5}, {T}: Draw two cards, then discard a card. -TMP R - -Emperor Crocodile -{3}{G} -Creature - Crocodile -5/5 -When you control no other creatures, sacrifice Emperor Crocodile. -UDS R, 8ED R, 9ED R - -Empress Galina -{3}{U}{U} -Legendary Creature - Merfolk -1/3 -{U}{U}, {T}: Gain control of target legendary permanent. (This effect lasts indefinitely.) -INV R - -Empty City Ruse -{W} -Sorcery -Target opponent skips all combat phases of his or her next turn. -PTK U - -Empty the Catacombs -{3}{B} -Sorcery -Each player returns all creature cards from his or her graveyard to his or her hand. -RAV R - -Empty the Warrens -{3}{R} -Sorcery -Put two 1/1 red Goblin creature tokens onto the battlefield. -Storm (When you cast this spell, copy it for each spell cast before it this turn.) -TSP C - -Empty-Shrine Kannushi -{W} -Creature - Human Cleric -1/1 -Empty-Shrine Kannushi has protection from the colors of permanents you control. -BOK U - -Empyrial Archangel -{4}{G}{W}{W}{U} -Creature - Angel -5/8 -Flying, shroud -All damage that would be dealt to you is dealt to Empyrial Archangel instead. -ALA M - -Empyrial Armor -{1}{W}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+1 for each card in your hand. -WTH C - -Empyrial Plate -{2} -Artifact - Equipment -Equipped creature gets +1/+1 for each card in your hand. -Equip {2} ({2}: Attach to target creature you control. Equip only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.) -MRD R - -Emrakul's Hatcher -{4}{R} -Creature - Eldrazi Drone -3/3 -When Emrakul's Hatcher enters the battlefield, put three 0/1 colorless Eldrazi Spawn creature tokens onto the battlefield. They have "Sacrifice this creature: Add {1} to your mana pool." -ROE C - -Emrakul, the Aeons Torn -{15} -Legendary Creature - Eldrazi -15/15 -Emrakul, the Aeons Torn can't be countered. -When you cast Emrakul, take an extra turn after this one. -Flying, protection from colored spells, annihilator 6 -When Emrakul is put into a graveyard from anywhere, its owner shuffles his or her graveyard into his or her library. -ROE M - -Enatu Golem -{6} -Artifact Creature - Golem -3/5 -When Enatu Golem dies, you gain 4 life. -ROE U - -Enchanted Being -{1}{W}{W} -Creature - Human -2/2 -Prevent all combat damage that would be dealt to Enchanted Being by enchanted creatures. -LEG C - -Enchanted Evening -{3}{W/U}{W/U} -Enchantment -All permanents are enchantments in addition to their other types. -SHM R - -Enchantment Alteration -{U} -Instant -Attach target Aura attached to a creature or land to another permanent of that type. -LEG C, CHR U, USG U - -Enchantress's Presence -{2}{G} -Enchantment -Whenever you cast an enchantment spell, draw a card. -ONS R - -Enclave Cryptologist -{U} -Creature - Merfolk Wizard -0/1 -Level up {1}{U} ({1}{U}: Put a level counter on this. Level up only as a sorcery.) -LEVEL 1-2 -0/1 -{T}: Draw a card, then discard a card. -LEVEL 3+ -0/1 -{T}: Draw a card. -ROE U - -Enclave Elite -{2}{U} -Creature - Merfolk Soldier -2/2 -Multikicker {1}{U} (You may pay an additional {1}{U} any number of times as you cast this spell.) -Islandwalk -Enclave Elite enters the battlefield with a +1/+1 counter on it for each time it was kicked. -WWK C - -Encroach -{B} -Sorcery -Target player reveals his or her hand. You choose a nonbasic land card from it. That player discards that card. -UDS U - -Endangered Armodon -{2}{G}{G} -Creature - Elephant -4/5 -When you control a creature with toughness 2 or less, sacrifice Endangered Armodon. -STH C - -Endbringer's Revel -{2}{B} -Enchantment -{4}: Return target creature card from a graveyard to its owner's hand. Any player may activate this ability but only any time he or she could cast a sorcery. -PCY U - -Endemic Plague -{3}{B} -Sorcery -As an additional cost to cast Endemic Plague, sacrifice a creature. -Destroy all creatures that share a creature type with the sacrificed creature. They can't be regenerated. -ONS R - -Endless Cockroaches -{1}{B}{B} -Creature - Insect -1/1 -When Endless Cockroaches dies, return it to its owner's hand. -POR R - -Endless Horizons -{3}{W} -Enchantment -When Endless Horizons enters the battlefield, search your library for any number of Plains cards and exile them. Then shuffle your library. -At the beginning of your upkeep, you may put a card you own exiled with Endless Horizons into your hand. -EVE R - -Endless Scream -{X}{B} -Enchantment - Aura -Enchant creature -Endless Scream enters the battlefield with X scream counters on it. -Enchanted creature gets +1/+0 for each scream counter on Endless Scream. -TMP C - -Endless Swarm -{5}{G}{G}{G} -Sorcery -Put a 1/1 green Snake creature token onto the battlefield for each card in your hand. -Epic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability.) -SOK R - -Endless Whispers -{2}{B}{B} -Enchantment -Each creature has "When this creature dies, choose target opponent. That player returns this card from that graveyard to the battlefield under his or her control at the beginning of the next end step." -5DN R - -Endless Wurm -{3}{G}{G} -Creature - Wurm -9/9 -Trample -At the beginning of your upkeep, sacrifice Endless Wurm unless you sacrifice an enchantment. -USG R - -Endoskeleton -{2} -Artifact -You may choose not to untap Endoskeleton during your untap step. -{2}, {T}: Target creature gets +0/+3 for as long as Endoskeleton remains tapped. -USG U - -Endrek Sahr, Master Breeder -{4}{B} -Legendary Creature - Human Wizard -2/2 -Whenever you cast a creature spell, put X 1/1 black Thrull creature tokens onto the battlefield, where X is that spell's converted mana cost. -When you control seven or more Thrulls, sacrifice Endrek Sahr, Master Breeder. -TSP R - -Endure -{3}{W}{W} -Instant -Prevent all damage that would be dealt to you and permanents you control this turn. -EVE U - -Enduring Ideal -{5}{W}{W} -Sorcery -Search your library for an enchantment card and put it onto the battlefield. Then shuffle your library. -Epic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability.) -SOK R - -Enduring Renewal -{2}{W}{W} -Enchantment -Play with your hand revealed. -If you would draw a card, reveal the top card of your library instead. If it's a creature card, put it into your graveyard. Otherwise, draw a card. -Whenever a creature is put into your graveyard from the battlefield, return it to your hand. -ICE R, TSB S - -Enemy of the Guildpact -{4}{B} -Creature - Spirit -4/2 -Protection from multicolored -DIS C - -Energizer -{4} -Artifact Creature - Juggernaut -2/2 -{2}, {T}: Put a +1/+1 counter on Energizer. -TMP R - -Energy Arc -{W}{U} -Instant -Untap any number of target creatures. Prevent all combat damage that would be dealt to and dealt by those creatures this turn. -ALL U, MED U - -Energy Bolt -{X}{R}{W} -Sorcery -Choose one - Energy Bolt deals X damage to target player; or target player gains X life. -MIR R - -Energy Chamber -{2} -Artifact -At the beginning of your upkeep, choose one - Put a +1/+1 counter on target artifact creature; or put a charge counter on target noncreature artifact. -5DN U, EVT U - -Energy Field -{1}{U} -Enchantment -Prevent all damage that would be dealt to you by sources you don't control. -When a card is put into your graveyard from anywhere, sacrifice Energy Field. -USG R - -Energy Flux -{2}{U} -Enchantment -All artifacts have "At the beginning of your upkeep, sacrifice this artifact unless you pay {2}." -ATQ U, 3ED U, 4ED U, 5ED U, MMQ U, ME4 U - -Energy Storm -{1}{W} -Enchantment -Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -Prevent all damage that would be dealt by instant and sorcery spells. -Creatures with flying don't untap during their controllers' untap steps. -ICE R, ME2 R - -Energy Tap -{U} -Sorcery -Tap target untapped creature you control. If you do, add {X} to your mana pool, where X is that creature's converted mana cost. -LEG C, 4ED C - -Energy Vortex -{3}{U}{U} -Enchantment -As Energy Vortex enters the battlefield, choose an opponent. -At the beginning of your upkeep, remove all energy counters from Energy Vortex. -At the beginning of the chosen player's upkeep, Energy Vortex deals 3 damage to that player unless he or she pays {1} for each energy counter on Energy Vortex. -{X}: Put X energy counters on Energy Vortex. Activate this ability only during your upkeep. -MIR R - -Enervate -{1}{U} -Instant -Tap target artifact, creature, or land. -Draw a card at the beginning of the next turn's upkeep. -ICE C, 5ED C, ME2 C - -Enfeeblement -{B}{B} -Enchantment - Aura -Enchant creature (Target a creature as you cast this. This card enters the battlefield attached to that creature.) -Enchanted creature gets -2/-2. -MIR C, TMP C, 6ED C, 9ED C - -Engineered Explosives -{X} -Artifact -Sunburst (This enters the battlefield with a charge counter on it for each color of mana spent to cast it.) -{2}, Sacrifice Engineered Explosives: Destroy each nonland permanent with converted mana cost equal to the number of charge counters on Engineered Explosives. -5DN R - -Engineered Plague -{2}{B} -Enchantment -As Engineered Plague enters the battlefield, choose a creature type. -All creatures of the chosen type get -1/-1. -ULG U, 7ED U - -Engulfing Flames -{R} -Instant -Engulfing Flames deals 1 damage to target creature. It can't be regenerated this turn. -Flashback {3}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY U - -Engulfing Slagwurm -{5}{G}{G} -Creature - Wurm -7/7 -Whenever Engulfing Slagwurm blocks or becomes blocked by a creature, destroy that creature. You gain life equal to that creature's toughness. -SOM R - -Enigma Eidolon -{3}{U} -Creature - Spirit -2/2 -{U}, Sacrifice Enigma Eidolon: Target player puts the top three cards of his or her library into his or her graveyard. -Whenever you cast a multicolored spell, you may return Enigma Eidolon from your graveyard to your hand. -DIS C - -Enigma Sphinx -{4}{W}{U}{B} -Artifact Creature - Sphinx -5/4 -Flying -When Enigma Sphinx is put into your graveyard from the battlefield, put it into your library third from the top. -Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.) -ARB R - -Enigma Sphinx Avatar -Vanguard -Hand +0, life +5 -Whenever you cast a colored artifact spell for the first time in a turn, search your library for a colored artifact card chosen at random whose converted mana cost is less than that spell's converted mana cost. You may play that card without paying its mana cost. If you don't, put that card on the bottom of your library. -VG S - -Enlightened Tutor -{W} -Instant -Search your library for an artifact or enchantment card and reveal that card. Shuffle your library, then put the card on top of it. -MIR U, 6ED U - -Enlisted Wurm -{4}{G}{W} -Creature - Wurm -5/5 -Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.) -ARB U - -Enlistment Officer -{3}{W} -Creature - Human Soldier -2/3 -First strike -When Enlistment Officer enters the battlefield, reveal the top four cards of your library. Put all Soldier cards revealed this way into your hand and the rest on the bottom of your library in any order. -APC U - -Enormous Baloth -{6}{G} -Creature - Beast -7/7 -LGN U, 8ED U, 9ED U, 10E U, M10 U - -Enrage -{X}{R} -Instant -Target creature gets +X/+0 until end of turn. -SCG U, 8ED U, 9ED U - -Enraging Licid -{1}{R} -Creature - Licid -1/1 -{R}, {T}: Enraging Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {R} to end this effect. -Enchanted creature has haste. -TMP U - -Enshrined Memories -{X}{G} -Sorcery -Reveal the top X cards of your library. Put all creature cards revealed this way into your hand and the rest on the bottom of your library in any order. -BOK R - -Enslave -{4}{B}{B} -Enchantment - Aura -Enchant creature -You control enchanted creature. -At the beginning of your upkeep, enchanted creature deals 1 damage to its owner. -PLC U, GVL U, NPH U - -Enslaved Dwarf -{R} -Creature - Dwarf -1/1 -{R}, Sacrifice Enslaved Dwarf: Target black creature gets +1/+0 and gains first strike until end of turn. -TOR C - -Enslaved Horror -{3}{B} -Creature - Horror -4/4 -When Enslaved Horror enters the battlefield, each other player may return a creature card from his or her graveyard to the battlefield. -MMQ U - -Enslaved Scout -{2}{R} -Creature - Goblin Scout -2/2 -{2}: Enslaved Scout gains mountainwalk until end of turn. -ALL C (x2) - -Ensnare -{3}{U} -Instant -You may return two Islands you control to their owner's hand rather than pay Ensnare's mana cost. -Tap all creatures. -NEM U - -Ensnaring Bridge -{3} -Artifact -Creatures with power greater than the number of cards in your hand can't attack. -STH R, 7ED R, 8ED R - -Ensouled Scimitar -{3} -Artifact - Equipment -{3}: Ensouled Scimitar becomes a 1/5 Spirit artifact creature with flying until end of turn. (Equipment that's a creature can't equip a creature.) -Equipped creature gets +1/+5. -Equip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) -5DN U - -Entangler -{2}{W}{W} -Enchantment - Aura -Enchant creature -Enchanted creature can block any number of creatures. -PCY U - -Entangling Trap -{1}{W} -Enchantment -Whenever you clash, tap target creature an opponent controls. If you won, that creature doesn't untap during its controller's next untap step. (This ability triggers after the clash ends.) -LRW U - -Entangling Vines -{3}{G} -Enchantment - Aura -Enchant tapped creature -Enchanted creature doesn't untap during its controller's untap step. -M10 C - -Entomb -{B} -Instant -Search your library for a card and put that card into your graveyard. Then shuffle your library. -ODY R - -Entomber Exarch -{2}{B}{B} -Creature - Cleric -2/2 -When Entomber Exarch enters the battlefield, choose one - Return target creature card from your graveyard to your hand; or target opponent reveals his or her hand, you choose a noncreature card from it, then that player discards that card. -NPH U - -Entrails Feaster -{B} -Creature - Zombie Cat -1/1 -At the beginning of your upkeep, you may exile a creature card from a graveyard. If you do, put a +1/+1 counter on Entrails Feaster. If you don't, tap Entrails Feaster. -ONS R - -Entropic Eidolon -{3}{B} -Creature - Spirit -2/2 -{B}, Sacrifice Entropic Eidolon: Target player loses 1 life and you gain 1 life. -Whenever you cast a multicolored spell, you may return Entropic Eidolon from your graveyard to your hand. -DIS C - -Entropic Specter -{3}{B}{B} -Creature - Specter Spirit -*/* -Flying -As Entropic Specter enters the battlefield, choose an opponent. -Entropic Specter's power and toughness are each equal to the number of cards in the chosen player's hand. -Whenever Entropic Specter deals damage to a player, that player discards a card. -EXO R - -Envelop -{U} -Instant -Counter target sorcery spell. -JUD C - -Eon Hub -{5} -Artifact -Players skip their upkeep steps. -5DN R - -Ephemeron -{4}{U}{U} -Creature - Illusion -4/4 -Flying -Discard a card: Return Ephemeron to its owner's hand. -EXO R - -Epic Proportions -{4}{G}{G} -Enchantment - Aura -Flash -Enchant creature -Enchanted creature gets +5/+5 and has trample. -LRW R - -Epic Struggle -{2}{G}{G} -Enchantment -At the beginning of your upkeep, if you control twenty or more creatures, you win the game. -JUD R - -Epicenter -{4}{R} -Sorcery -Target player sacrifices a land. -Threshold - All players sacrifice all lands instead if seven or more cards are in your graveyard. -ODY R - -Epochrasite -{2} -Artifact Creature - Construct -1/1 -Epochrasite enters the battlefield with three +1/+1 counters on it if you didn't cast it from your hand. -When Epochrasite dies, exile it with three time counters on it and it gains suspend. (At the beginning of your upkeep, remove a time counter. When the last is removed, cast this card without paying its mana cost. It has haste.) -FUT R - -Equal Treatment -{1}{W} -Instant -If any source would deal 1 or more damage to a creature or player this turn, it deals 2 damage to that creature or player instead. -Draw a card. -TOR U - -Equilibrium -{1}{U}{U} -Enchantment -Whenever you cast a creature spell, you may pay {1}. If you do, return target creature to its owner's hand. -EXO R, 7ED R - -Equinox -{W} -Enchantment - Aura -Enchant land -Enchanted land has "{T}: Counter target spell if it would destroy a land you control." -LEG C - -Equipoise -{2}{W} -Enchantment -At the beginning of your upkeep, for each land target player controls in excess of the number you control, choose a land he or she controls, then the chosen permanents phase out. Repeat this process for artifacts and creatures. (While they're phased out, they're treated as though they don't exist. They phase in before that player untaps during his or her next untap step.) -VIS R - -Eradicate -{2}{B}{B} -Sorcery -Exile target nonblack creature. Search its controller's graveyard, hand, and library for all cards with the same name as that creature and exile them. Then that player shuffles his or her library. -UDS U, BOK U - -Erase -{W} -Instant -Exile target enchantment. -ULG C - -Erayo, Soratami Ascendant -{1}{U} -Legendary Creature - Moonfolk Monk -1/1 -Flying -Whenever the fourth spell of a turn is cast, flip Erayo, Soratami Ascendant. ----- -Erayo's Essence -Legendary Enchantment -Whenever an opponent casts a spell for the first time in a turn, counter that spell. -SOK R - -Erg Raiders -{1}{B} -Creature - Human Warrior -2/3 -At the beginning of your end step, if Erg Raiders didn't attack this turn, Erg Raiders deals 2 damage to you unless it came under your control this turn. -ARN C (x2), 3ED C, 4ED C, 5ED C, MED C - -Erhnam Djinn -{3}{G} -Creature - Djinn -4/5 -At the beginning of your upkeep, target non-Wall creature an opponent controls gains forestwalk until your next upkeep. -ARN R, CHR U, BTD U, JUD R - -Erhnam Djinn Avatar -Vanguard -Hand +0, life +3 -Whenever you cast a creature spell, put a 1/1 green Saproling creature token onto the battlefield. -VG S (x2) - -Erithizon -{2}{G}{G} -Creature - Beast -4/4 -Whenever Erithizon attacks, put a +1/+1 counter on target creature of defending player's choice. -MMQ R - -Eron the Relentless -{3}{R}{R} -Legendary Creature - Human Rogue -5/2 -Haste -{R}{R}{R}: Regenerate Eron the Relentless. -HML U, TSB S - -Erosion -{U}{U}{U} -Enchantment - Aura -Enchant land -At the beginning of the upkeep of enchanted land's controller, destroy that land unless that player pays {1} or 1 life. -DRK C, 4ED C - -Errand of Duty -{1}{W} -Instant -Put a 1/1 white Knight creature token with banding onto the battlefield. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -ALL C (x2), ME2 U - -Errant Doomsayers -{1}{W} -Creature - Human Rebel -1/1 -{T}: Tap target creature with toughness 2 or less. -TSP C - -Errant Ephemeron -{6}{U} -Creature - Illusion -4/4 -Flying -Suspend 4-{1}{U} (Rather than cast this card from your hand, you may pay {1}{U} and exile it with four time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -TSP C, JVC C - -Errant Minion -{2}{U} -Enchantment - Aura -Enchant creature -At the beginning of the upkeep of enchanted creature's controller, that player may pay any amount of mana. Errant Minion deals 2 damage to that player. Prevent X of that damage, where X is the amount of mana that player paid this way. -ICE C - -Errantry -{1}{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +3/+0 and can only attack alone. -ICE C, 5ED C, ME2 C - -Erratic Explosion -{2}{R} -Sorcery -Choose target creature or player. Reveal cards from the top of your library until you reveal a nonland card. Erratic Explosion deals damage equal to that card's converted mana cost to that creature or player. Put the revealed cards on the bottom of your library in any order. -ONS C - -Erratic Mutation -{2}{U} -Instant -Choose target creature. Reveal cards from the top of your library until you reveal a nonland card. That creature gets +X/-X until end of turn, where X is that card's converted mana cost. Put all cards revealed this way on the bottom of your library in any order. -PLC C - -Erratic Portal -{4} -Artifact -{1}, {T}: Return target creature to its owner's hand unless its controller pays {1}. -EXO R - -Ersatz Gnomes -{3} -Artifact Creature - Gnome -1/1 -{T}: Target spell becomes colorless. -{T}: Target permanent becomes colorless until end of turn. -MIR U - -Ertai -Vanguard -Hand -1, life +4 -Creatures you control have hexproof. (They can't be the targets of spells or abilities your opponents control.) -VG S - -Ertai's Familiar -{1}{U} -Creature - Illusion -2/2 -Phasing (This phases in or out before you untap during each of your untap steps. While it's phased out, it's treated as though it doesn't exist.) -When Ertai's Familiar phases out or leaves the battlefield, put the top three cards of your library into your graveyard. -{U}: Until your next upkeep, Ertai's Familiar can't phase out. -WTH R - -Ertai's Meddling -{X}{U} -Instant -X can't be 0. -Target spell's controller exiles it with X delay counters on it. -At the beginning of each of that player's upkeeps, if that card is exiled, remove a delay counter from it. If the card has no delay counters on it, he or she puts it onto the stack as a copy of the original spell. -TMP R - -Ertai's Trickery -{U} -Instant -Counter target spell if it was kicked. -PLS U - -Ertai, Wizard Adept -{2}{U} -Legendary Creature - Human Wizard -1/1 -{2}{U}{U}, {T}: Counter target spell. -EXO R - -Ertai, the Corrupted -{2}{W}{U}{B} -Legendary Creature - Human Wizard -3/4 -{U}, {T}, Sacrifice a creature or enchantment: Counter target spell. -PLS R (x2) - -Escape Artist -{1}{U} -Creature - Human Wizard -1/1 -Escape Artist is unblockable. -{U}, Discard a card: Return Escape Artist to its owner's hand. -ODY C - -Escape Routes -{2}{U} -Enchantment -{2}{U}: Return target white or black creature you control to its owner's hand. -PLS C - -Escaped Null -{3}{B} -Creature - Zombie Berserker -1/2 -Lifelink -Whenever Escaped Null blocks or becomes blocked, it gets +5/+0 until end of turn. -ROE U - -Escaped Shapeshifter -{3}{U}{U} -Creature - Shapeshifter -3/4 -As long as an opponent controls a creature with flying not named Escaped Shapeshifter, Escaped Shapeshifter has flying. The same is true for first strike, trample, and protection from any color. -TMP R - -Esper Battlemage -{2}{U} -Artifact Creature - Human Wizard -2/2 -{W}, {T}: Prevent the next 2 damage that would be dealt to you this turn. -{B}, {T}: Target creature gets -1/-1 until end of turn. -ALA U - -Esper Charm -{W}{U}{B} -Instant -Choose one - Destroy target enchantment; or draw two cards; or target player discards two cards. -ALA U - -Esper Cormorants -{2}{W}{U} -Artifact Creature - Bird -3/3 -Flying -CON C - -Esper Panorama -Land -{T}: Add {1} to your mana pool. -{1}, {T}, Sacrifice Esper Panorama: Search your library for a basic Plains, Island, or Swamp card and put it onto the battlefield tapped. Then shuffle your library. -ALA C - -Esper Sojourners -{W}{U}{B} -Artifact Creature - Vedalken Wizard -2/3 -When you cycle Esper Sojourners or it dies, you may tap or untap target permanent. -Cycling {2}{U} ({2}{U}, Discard this card: Draw a card.) -ARB C - -Esper Stormblade -{W/B}{U} -Artifact Creature - Vedalken Wizard -2/1 -As long as you control another multicolored permanent, Esper Stormblade gets +1/+1 and has flying. -ARB C - -Esperzoa -{2}{U} -Artifact Creature - Jellyfish -4/3 -Flying -At the beginning of your upkeep, return an artifact you control to its owner's hand. -CON U, EVT U - -Essence Bottle -{2} -Artifact -{3}, {T}: Put an elixir counter on Essence Bottle. -{T}, Remove all elixir counters from Essence Bottle: You gain 2 life for each elixir counter removed this way. -TMP U - -Essence Drain -{4}{B} -Sorcery -Essence Drain deals 3 damage to target creature or player and you gain 3 life. -DST C, 10E C - -Essence Feed -{5}{B} -Sorcery -Target player loses 3 life. You gain 3 life and put three 0/1 colorless Eldrazi Spawn creature tokens onto the battlefield. They have "Sacrifice this creature: Add {1} to your mana pool." -ROE C - -Essence Filter -{1}{G}{G} -Sorcery -Destroy all enchantments or all nonwhite enchantments. -ICE C, ME2 U - -Essence Flare -{U} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+0. -At the beginning of the upkeep of enchanted creature's controller, put a -0/-1 counter on that creature. -ICE C, ME2 C - -Essence Fracture -{3}{U}{U} -Sorcery -Return two target creatures to their owners' hands. -Cycling {2}{U} ({2}{U}, Discard this card: Draw a card.) -ONS U - -Essence Leak -{U} -Enchantment - Aura -Enchant permanent -As long as enchanted permanent is red or green, it has "At the beginning of your upkeep, sacrifice this permanent unless you pay its mana cost." -INV U - -Essence Scatter -{1}{U} -Instant -Counter target creature spell. -M10 C - -Essence Sliver -{3}{W} -Creature - Sliver -3/3 -Whenever a Sliver deals damage, its controller gains that much life. -LGN R, TSB S - -Essence Vortex -{1}{U}{B} -Instant -Destroy target creature unless its controller pays life equal to its toughness. A creature destroyed this way can't be regenerated. -ICE U - -Essence Warden -{G} -Creature - Elf Shaman -1/1 -Whenever another creature enters the battlefield, you gain 1 life. -PLC C - -Etched Champion -{3} -Artifact Creature - Soldier -2/2 -Metalcraft - Etched Champion has protection from all colors as long as you control three or more artifacts. -SOM R - -Etched Monstrosity -{5} -Artifact Creature - Golem -10/10 -Etched Monstrosity enters the battlefield with five -1/-1 counters on it. -{W}{U}{B}{R}{G}, Remove five -1/-1 counters from Etched Monstrosity: Target player draws three cards. -NPH M - -Etched Oracle -{4} -Artifact Creature - Wizard -0/0 -Sunburst (This enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.) -{1}, Remove four +1/+1 counters from Etched Oracle: Target player draws three cards. -5DN U, HOP U - -Etched Oracle Avatar -Vanguard -Hand +1, life -4 -You may pay {W}{U}{B}{R}{G} rather than pay the mana cost for spells that you cast. -VG S - -Eternal Dominion -{7}{U}{U}{U} -Sorcery -Search target opponent's library for an artifact, creature, enchantment, or land card. Put that card onto the battlefield under your control. Then that player shuffles his or her library. -Epic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability. You may choose a new target for the copy.) -SOK R - -Eternal Dragon -{5}{W}{W} -Creature - Dragon Spirit -5/5 -Flying -{3}{W}{W}: Return Eternal Dragon from your graveyard to your hand. Activate this ability only during your upkeep. -Plainscycling {2} ({2}, Discard this card: Search your library for a Plains card, reveal it, and put it into your hand. Then shuffle your library.) -SCG R - -Eternal Flame -{2}{R}{R} -Sorcery -Eternal Flame deals X damage to target opponent, where X is the number of Mountains you control. It deals half X damage, rounded up, to you. -DRK R - -Eternal Warrior -{R} -Enchantment - Aura -Enchant creature -Enchanted creature has vigilance. -LEG U, 4ED C, 5ED C - -Eternal Witness -{1}{G}{G} -Creature - Human Shaman -2/1 -When Eternal Witness enters the battlefield, you may return target card from your graveyard to your hand. -5DN U, COM U - -Eternity Snare -{5}{U} -Enchantment - Aura -Enchant creature -When Eternity Snare enters the battlefield, draw a card. -Enchanted creature doesn't untap during its controller's untap step. -TSP C - -Eternity Vessel -{6} -Artifact -Eternity Vessel enters the battlefield with X charge counters on it, where X is your life total. -Landfall - Whenever a land enters the battlefield under your control, you may have your life total become the number of charge counters on Eternity Vessel. -ZEN M - -Ether Well -{3}{U} -Instant -Put target creature on top of its owner's library. If that creature is red, you may put it on the bottom of its owner's library instead. -MIR U - -Ethercaste Knight -{W}{U} -Artifact Creature - Human Knight -1/3 -Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.) -ARB C - -Ethereal Champion -{2}{W}{W}{W} -Creature - Avatar -3/4 -Pay 1 life: Prevent the next 1 damage that would be dealt to Ethereal Champion this turn. -MIR R, 6ED R - -Ethereal Haze -{W} -Instant - Arcane -Prevent all damage that would be dealt by creatures this turn. -CHK C - -Ethereal Usher -{5}{U} -Creature - Spirit -2/3 -{U}, {T}: Target creature is unblockable this turn. -Transmute {1}{U}{U} ({1}{U}{U}, Discard this card: Search your library for a card with the same converted mana cost as this card, reveal it, and put it into your hand. Then shuffle your library. Transmute only as a sorcery.) -RAV U - -Ethereal Whiskergill -{3}{U} -Creature - Elemental -4/3 -Flying -Ethereal Whiskergill can't attack unless defending player controls an Island. -LRW U - -Etherium Abomination -{3}{U}{B} -Artifact Creature - Horror -4/3 -Unearth {1}{U}{B} ({1}{U}{B}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) -ARB C - -Etherium Astrolabe -{2}{U} -Artifact -Flash -{B}, {T}, Sacrifice an artifact: Draw a card. -ALA U - -Etherium Sculptor -{1}{U} -Artifact Creature - Vedalken Artificer -1/2 -Artifact spells you cast cost {1} less to cast. -ALA C - -Ethersworn Adjudicator -{4}{U} -Artifact Creature - Vedalken Knight -4/4 -Flying -{1}{W}{B}, {T}: Destroy target creature or enchantment. -{2}{U}: Untap Ethersworn Adjudicator. -CON M - -Ethersworn Canonist -{1}{W} -Artifact Creature - Human Cleric -2/2 -Each player who has cast a nonartifact spell this turn can't cast additional nonartifact spells. -ALA R - -Ethersworn Shieldmage -{1}{W}{U} -Artifact Creature - Vedalken Wizard -2/2 -Flash -When Ethersworn Shieldmage enters the battlefield, prevent all damage that would be dealt to artifact creatures this turn. -ARB C, ARC C - -Etherwrought Page -{1}{W}{U}{B} -Artifact -At the beginning of your upkeep, choose one - You gain 2 life; or look at the top card of your library, then you may put that card into your graveyard; or each opponent loses 1 life. -ARB U - -Eunuchs' Intrigues -{2}{R} -Sorcery -Target opponent chooses a creature he or she controls. Other creatures he or she controls can't block this turn. -PTK U - -Eureka -{2}{G}{G} -Sorcery -Starting with you, each player may put a permanent card from his or her hand onto the battlefield. Repeat this process until no one puts a card onto the battlefield. -LEG R, MED R - -Evacuation -{3}{U}{U} -Instant -Return all creatures to their owners' hands. -STH R, 7ED R, 8ED R, 9ED R, 10E R - -Evangelize -{4}{W} -Sorcery -Buyback {2}{W}{W} (You may pay an additional {2}{W}{W} as you cast this spell. If you do, put this card into your hand as it resolves.) -Gain control of target creature of an opponent's choice that he or she controls. -TSP R - -Evaporate -{2}{R} -Sorcery -Evaporate deals 1 damage to each white and/or blue creature. -HML U - -Evasive Action -{1}{U} -Instant -Domain - Counter target spell unless its controller pays {1} for each basic land type among lands you control. -APC U, PVC U - -Even the Odds -{2}{W} -Instant -Cast Even the Odds only if you control fewer creatures than each opponent. -Put three 1/1 white Soldier creature tokens onto the battlefield. -FUT U - -Everbark Shaman -{4}{G} -Creature - Treefolk Shaman -3/5 -{T}, Exile a Treefolk card from your graveyard: Search your library for two Forest cards and put them onto the battlefield tapped. Then shuffle your library. -MOR C - -Everflowing Chalice -{0} -Artifact -Multikicker {2} (You may pay an additional {2} any number of times as you cast this spell.) -Everflowing Chalice enters the battlefield with a charge counter on it for each time it was kicked. -{T}: Add {1} to your mana pool for each charge counter on Everflowing Chalice. -WWK U, ARC U, EVT U - -Everglades -Land -Everglades enters the battlefield tapped. -When Everglades enters the battlefield, sacrifice it unless you return an untapped Swamp you control to its owner's hand. -{T}: Add {1}{B} to your mana pool. -VIS U - -Everglove Courier -{2}{G} -Creature - Elf -2/1 -You may choose not to untap Everglove Courier during your untap step. -{2}{G}, {T}: Target Elf creature gets +2/+2 and has trample for as long as Everglove Courier remains tapped. -ONS U - -Everlasting Torment -{2}{B/R} -Enchantment -Players can't gain life. -Damage can't be prevented. -All damage is dealt as though its source had wither. (A source with wither deals damage to creatures in the form of -1/-1 counters.) -SHM R - -Evermind -Instant - Arcane -(Nonexistent mana costs can't be paid.) -Draw a card. -Evermind is blue. -Splice onto Arcane {1}{U} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -SOK U - -Evershrike -{3}{W/B}{W/B} -Creature - Elemental Spirit -2/2 -Flying -Evershrike gets +2/+2 for each Aura attached to it. -{X}{W/B}{W/B}: Return Evershrike from your graveyard to the battlefield. You may put an Aura card with converted mana cost X or less from your hand onto the battlefield attached to it. If you don't, exile Evershrike. -EVE R - -Every Hope Shall Vanish -Scheme -When you set this scheme in motion, each opponent reveals his or her hand. Choose a nonland card from each of those hands. Those players discard those cards. -ARC C - -Every Last Vestige Shall Rot -Scheme -When you set this scheme in motion, you may pay {X}. If you do, put each nonland permanent target player controls with converted mana cost X or less on the bottom of its owner's library. -ARC C - -Evil Comes to Fruition -Scheme -When you set this scheme in motion, put seven 0/1 green Plant creature tokens onto the battlefield. If you control ten or more lands, put seven 3/3 green Elemental creature tokens onto the battlefield instead. -ARC C - -Evil Eye of Orms-by-Gore -{4}{B} -Creature - Eye -3/6 -Non-Eye creatures you control can't attack. -Evil Eye of Orms-by-Gore can't be blocked except by Walls. -LEG U, 5ED U, 6ED U, TSB S - -Evil Eye of Urborg -{4}{B} -Creature - Eye -6/3 -Non-Eye creatures you control can't attack. -Whenever Evil Eye of Urborg becomes blocked by a creature, destroy that creature. -TSP U - -Evil Presence -{B} -Enchantment - Aura -Enchant land -Enchanted land is a Swamp. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, ME3 C, NPH C - -Evincar's Justice -{2}{B}{B} -Sorcery -Buyback {3} (You may pay an additional {3} as you cast this spell. If you do, put this card into your hand as it resolves.) -Evincar's Justice deals 2 damage to each creature and each player. -TMP C, COM C - -Eviscerator -{3}{B}{B} -Creature - Horror -5/5 -Protection from white -When Eviscerator enters the battlefield, you lose 5 life. -ULG R - -Evolution Charm -{1}{G} -Instant -Choose one - Search your library for a basic land card, reveal it, put it into your hand, then shuffle your library; or return target creature card from your graveyard to your hand; or target creature gains flying until end of turn. -PLC C - -Evolution Vat -{3} -Artifact -{3}, {T}: Tap target creature and put a +1/+1 counter on it. Until end of turn, that creature gains "{2}{G}{U}: Double the number of +1/+1 counters on this creature." -DIS R - -Evolving Wilds -Land -{T}, Sacrifice Evolving Wilds: Search your library for a basic land card and put it onto the battlefield tapped. Then shuffle your library. -ROE C, COM C - -Exalted Angel -{4}{W}{W} -Creature - Angel -4/5 -Flying -Whenever Exalted Angel deals damage, you gain that much life. -Morph {2}{W}{W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS R - -Exalted Dragon -{4}{W}{W} -Creature - Dragon -5/5 -Flying -Exalted Dragon can't attack unless you sacrifice a land. -EXO R - -Excavation -{1}{U} -Enchantment -{1}, Sacrifice a land: Draw a card. Any player may activate this ability. -PCY U - -Excavator -{2} -Artifact -{T}, Sacrifice a basic land: Target creature gains landwalk of each of the land types of the sacrificed land until end of turn. -TMP U - -Excise -{X}{W} -Instant -Exile target attacking creature unless its controller pays {X}. -PCY C - -Exclude -{2}{U} -Instant -Counter target creature spell. -Draw a card. -INV C - -Exclusion Ritual -{4}{W}{W} -Enchantment -Imprint - When Exclusion Ritual enters the battlefield, exile target nonland permanent. -Players can't cast spells with the same name as the exiled card. -NPH U - -Excommunicate -{2}{W} -Sorcery -Put target creature on top of its owner's library. -ALA C, M10 C, M11 C - -Excruciator -{6}{R}{R} -Creature - Avatar -7/7 -Damage that would be dealt by Excruciator can't be prevented. -RAV R - -Execute -{2}{B} -Instant -Destroy target white creature. It can't be regenerated. -Draw a card. -ODY U, 8ED U, 9ED U - -Executioner's Capsule -{B} -Artifact -{1}{B}, {T}, Sacrifice Executioner's Capsule: Destroy target nonblack creature. -ALA C - -Exhaustion -{2}{U} -Sorcery -Creatures and lands target opponent controls don't untap during his or her next untap step. -POR R, P02 R, USG U, PTK R, S99 U, 9ED U - -Exhume -{1}{B} -Sorcery -Each player puts a creature card from his or her graveyard onto the battlefield. -USG C, BRB C - -Exhumer Thrull -{5}{B} -Creature - Thrull -3/3 -Haunt (When this creature dies, exile it haunting target creature.) -When Exhumer Thrull enters the battlefield or the creature it haunts dies, return target creature card from your graveyard to your hand. -GPT U - -Exile -{2}{W} -Instant -Exile target nonwhite attacking creature. You gain life equal to its toughness. -ALL R, 6ED R, MED C - -Exile into Darkness -{4}{B} -Sorcery -Target player sacrifices a creature with converted mana cost 3 or less. -At the beginning of your upkeep, if you have more cards in hand than each opponent, you may return Exile into Darkness from your graveyard to your hand. -SOK U - -Exiled Boggart -{1}{B} -Creature - Goblin Rogue -2/2 -When Exiled Boggart dies, discard a card. -LRW C - -Exiled Doomsayer -{1}{W} -Creature - Human Cleric -1/2 -All morph costs cost {2} more. (This doesn't affect the cost to cast creature spells face down.) -SCG R - -Exorcist -{W}{W} -Creature - Human Cleric -1/1 -{1}{W}, {T}: Destroy target black creature. -DRK R, ME3 U - -Exoskeletal Armor -{1}{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +X/+X, where X is the number of creature cards in all graveyards. -JUD U - -Exotic Curse -{2}{B} -Enchantment - Aura -Enchant creature -Domain - Enchanted creature gets -1/-1 for each basic land type among lands you control. -INV C, PVC C - -Exotic Disease -{4}{B} -Sorcery -Domain - Target player loses X life and you gain X life, where X is the number of basic land types among lands you control. -PLS U - -Exotic Orchard -Land -{T}: Add to your mana pool one mana of any color that a land an opponent controls could produce. -CON R - -Expedition Map -{1} -Artifact -{2}, {T}, Sacrifice Expedition Map: Search your library for a land card, reveal it, and put it into your hand. Then shuffle your library. -ZEN C - -Expendable Troops -{1}{W} -Creature - Human Soldier -2/1 -{T}, Sacrifice Expendable Troops: Expendable Troops deals 2 damage to target attacking or blocking creature. -ULG C - -Experiment Kraj -{2}{G}{G}{U}{U} -Legendary Creature - Ooze Mutant -4/6 -Experiment Kraj has all activated abilities of each other creature with a +1/+1 counter on it. -{T}: Put a +1/+1 counter on target creature. -DIS R - -Exploding Borders -{2}{R}{G} -Sorcery -Domain - Search your library for a basic land card, put that card onto the battlefield tapped, then shuffle your library. Exploding Borders deals X damage to target player, where X is the number of basic land types among lands you control. -CON C - -Exploration -{G} -Enchantment -You may play an additional land on each of your turns. -USG R - -Explore -{1}{G} -Sorcery -You may play an additional land this turn. -Draw a card. -WWK C - -Explorer's Scope -{1} -Artifact - Equipment -Whenever equipped creature attacks, look at the top card of your library. If it's a land card, you may put it onto the battlefield tapped. -Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) -ZEN C - -Explosive Growth -{G} -Instant -Kicker {5} (You may pay an additional {5} as you cast this spell.) -Target creature gets +2/+2 until end of turn. If Explosive Growth was kicked, that creature gets +5/+5 until end of turn instead. -INV C - -Explosive Revelation -{3}{R}{R} -Sorcery -Choose target creature or player. Reveal cards from the top of your library until you reveal a nonland card. Explosive Revelation deals damage equal to that card's converted mana cost to that creature or player. Put the nonland card into your hand and the rest on the bottom of your library in any order. -ROE U - -Explosive Vegetation -{3}{G} -Sorcery -Search your library for up to two basic land cards and put them onto the battlefield tapped. Then shuffle your library. -ONS U, HOP U, COM U - -Expunge -{2}{B} -Instant -Destroy target nonartifact, nonblack creature. It can't be regenerated. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG C - -Exsanguinate -{X}{B}{B} -Sorcery -Each opponent loses X life. You gain life equal to the life lost this way. -SOM U - -Extinction -{4}{B} -Sorcery -Destroy all creatures of the creature type of your choice. -TMP R - -Extinguish -{1}{U} -Instant -Counter target sorcery spell. -P02 C, PTK C, S99 C - -Extirpate -{B} -Instant -Split second (As long as this spell is on the stack, players can't cast spells or activate abilities that aren't mana abilities.) -Choose target card in a graveyard other than a basic land card. Search its owner's graveyard, hand, and library for all cards with the same name as that card and exile them. Then that player shuffles his or her library. -PLC R - -Extortion -{3}{B}{B} -Sorcery -Look at target player's hand and choose up to two cards from it. That player discards those cards. -MMQ R - -Extra Arms -{4}{R} -Enchantment - Aura -Enchant creature -Whenever enchanted creature attacks, it deals 2 damage to target creature or player. -SCG U - -Extract -{U} -Sorcery -Search target player's library for a card and exile it. Then that player shuffles his or her library. -ODY R - -Extractor Demon -{4}{B}{B} -Creature - Demon -5/5 -Flying -Whenever another creature leaves the battlefield, you may have target player put the top two cards of his or her library into his or her graveyard. -Unearth {2}{B} ({2}{B}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) -CON R, ARC R, COM R - -Extraplanar Lens -{3} -Artifact -Imprint - When Extraplanar Lens enters the battlefield, you may exile target land you control. -Whenever a land with the same name as the exiled card is tapped for mana, its controller adds one mana to his or her mana pool of any type that land produced. -MRD R - -Extravagant Spirit -{3}{U} -Creature - Spirit -4/4 -Flying -At the beginning of your upkeep, sacrifice Extravagant Spirit unless you pay {1} for each card in your hand. -MMQ R - -Extruder -{4} -Artifact Creature - Juggernaut -4/3 -Echo {4} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -Sacrifice an artifact: Put a +1/+1 counter on target creature. -UDS U - -Exuberant Firestoker -{2}{R} -Creature - Human Druid Shaman -1/1 -At the beginning of your end step, if you control a creature with power 5 or greater, you may have Exuberant Firestoker deal 2 damage to target player. -{T}: Add {1} to your mana pool. -ALA U - -Eye Spy -{U} -Sorcery -Look at the top card of target player's library. You may put that card into his or her graveyard. -P02 U, S99 U - -Eye for an Eye -{W}{W} -Instant -The next time a source of your choice would deal damage to you this turn, instead that source deals that much damage to you and Eye for an Eye deals that much damage to that source's controller. -ARN U, 3ED R, 4ED R, 5ED R, ME4 R - -Eye of Nowhere -{U}{U} -Sorcery - Arcane -Return target permanent to its owner's hand. -CHK C - -Eye of Ramos -{3} -Artifact -{T}: Add {U} to your mana pool. -Sacrifice Eye of Ramos: Add {U} to your mana pool. -MMQ R - -Eye of Singularity -{3}{W} -World Enchantment -When Eye of Singularity enters the battlefield, destroy each permanent with the same name as another permanent, except for basic lands. They can't be regenerated. -Whenever a permanent other than a basic land enters the battlefield, destroy all other permanents with that name. They can't be regenerated. -VIS R - -Eye of Ugin -Legendary Land -Colorless Eldrazi spells you cast cost {2} less to cast. -{7}, {T}: Search your library for a colorless creature card, reveal it, and put it into your hand. Then shuffle your library. -WWK M - -Eye of Yawgmoth -{3} -Artifact -{3}, {T}, Sacrifice a creature: Reveal a number of cards from the top of your library equal to the sacrificed creature's power. Put one into your hand and exile the rest. -NEM R - -Eye of the Storm -{5}{U}{U} -Enchantment -Whenever a player casts an instant or sorcery card, exile it. Then that player copies each instant or sorcery card exiled with Eye of the Storm. For each copy, the player may cast the copy without paying its mana cost. -RAV R - -Eyeblight's Ending -{2}{B} -Tribal Instant - Elf -Destroy target non-Elf creature. -LRW C - -Eyes of the Watcher -{2}{U} -Enchantment -Whenever you cast an instant or sorcery spell, you may pay {1}. If you do, scry 2. (To scry 2, look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) -5DN U - -Eyes of the Wisent -{1}{G} -Tribal Enchantment - Elemental -Whenever an opponent casts a blue spell during your turn, you may put a 4/4 green Elemental creature token onto the battlefield. -LRW R - -Ezuri's Archers -{G} -Creature - Elf Archer -1/2 -Reach (This creature can block creatures with flying.) -Whenever Ezuri's Archers blocks a creature with flying, Ezuri's Archers gets +3/+0 until end of turn. -SOM C - -Ezuri's Brigade -{2}{G}{G} -Creature - Elf Warrior -4/4 -Metalcraft - As long as you control three or more artifacts, Ezuri's Brigade gets +4/+4 and has trample. -SOM R - -Ezuri, Renegade Leader -{1}{G}{G} -Legendary Creature - Elf Warrior -2/2 -{G}: Regenerate another target Elf. -{2}{G}{G}{G}: Elf creatures you control get +3/+3 and gain trample until end of turn. -SOM R - -Fa'adiyah Seer -{1}{G} -Creature - Human Shaman -1/1 -{T}: Draw a card and reveal it. If it isn't a land card, discard it. -PLC C - -Fable of Wolf and Owl -{3}{G/U}{G/U}{G/U} -Enchantment -Whenever you cast a green spell, you may put a 2/2 green Wolf creature token onto the battlefield. -Whenever you cast a blue spell, you may put a 1/1 blue Bird creature token with flying onto the battlefield. -EVE R - -Fabricate -{2}{U} -Sorcery -Search your library for an artifact card, reveal it, and put it into your hand. Then shuffle your library. -MRD U, M10 U, HOP U - -Face of Fear -{5}{B} -Creature - Horror -3/4 -{2}{B}, Discard a card: Face of Fear gains fear until end of turn. (It can't be blocked except by artifact creatures and/or black creatures.) -ODY U - -Faceless Butcher -{2}{B}{B} -Creature - Nightmare Horror -2/3 -When Faceless Butcher enters the battlefield, exile target creature other than Faceless Butcher. -When Faceless Butcher leaves the battlefield, return the exiled card to the battlefield under its owner's control. -TOR C, TSB S - -Faceless Devourer -{2}{B} -Creature - Nightmare Horror -2/1 -Shadow (This creature can block or be blocked by only creatures with shadow.) -When Faceless Devourer enters the battlefield, exile another target creature with shadow. -When Faceless Devourer leaves the battlefield, return the exiled card to the battlefield under its owner's control. -TSP U - -Faces of the Past -{2}{U} -Enchantment -Whenever a creature dies, tap all untapped creatures that share a creature type with it or untap all tapped creatures that share a creature type with it. -SCG R - -Facevaulter -{B} -Creature - Goblin Warrior -1/1 -{B}, Sacrifice a Goblin: Facevaulter gets +2/+2 until end of turn. -LRW C - -Fact or Fiction -{3}{U} -Instant -Reveal the top five cards of your library. An opponent separates those cards into two piles. Put one pile into your hand and the other into your graveyard. -INV U, JVC U, COM U - -Fade Away -{2}{U} -Sorcery -For each creature, its controller sacrifices a permanent unless he or she pays {1}. -EXO C - -Fade from Memory -{B} -Instant -Exile target card from a graveyard. -Cycling {B} ({B}, Discard this card: Draw a card.) -ONS U - -Faerie Conclave -Land -Faerie Conclave enters the battlefield tapped. -{T}: Add {U} to your mana pool. -{1}{U}: Faerie Conclave becomes a 2/1 blue Faerie creature with flying until end of turn. It's still a land. (It can't be blocked except by creatures with flying or reach.) -ULG U, 10E U - -Faerie Dragon -{2}{G}{G} -Creature - Dragon -1/3 -Flying -{1}{G}{G}: Perform a random action from the following list: -A creature chosen at random gains trample and gets +X/+0 until end of turn, where X is its power. At the beginning of the next end step, destroy that creature if it attacked this turn. -You may tap or untap an artifact, creature, or land chosen at random. -If a creature chosen at random has toughness 5 or greater, it gets +4/-4 until end of turn. Otherwise, it gets +4/-X until end of turn, where X is its toughness minus 1. -A spell or permanent chosen at random becomes green. (Mana symbols on that permanent remain unchanged.) -A spell or permanent chosen at random becomes white. (Mana symbols on that permanent remain unchanged.) -A spell or permanent chosen at random becomes red. (Mana symbols on that permanent remain unchanged.) -Faerie Dragon deals 3 damage to a creature or player chosen at random. -A creature chosen at random gains flying until end of turn. -A creature chosen at random gets +3/+3 until end of turn. -A creature chosen at random gains banding until end of turn. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding a player controls are blocking or being blocked by a creature, that player divides that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -A spell or permanent chosen at random becomes black. (Mana symbols on that permanent remain unchanged.) -A spell or permanent chosen at random becomes blue. (Mana symbols on that permanent remain unchanged.) -A creature chosen at random can't be regenerated this turn. -If a creature chosen at random has power 2 or less, it is unblockable this turn. -A creature chosen at random gets -2/-0 until end of turn. -Return a creature chosen at random to its owner's hand. -Faerie Dragon deals 1 damage to a creature or player chosen at random. -A creature other than Faerie Dragon chosen at random becomes 0/2 until end of turn. -Exile a creature chosen at random. Its controller gains life equal to its power. -Randomly distribute X -0/-1 counters among a random number of creatures chosen at random. -ASTRAL S - -Faerie Harbinger -{3}{U} -Creature - Faerie Wizard -2/2 -Flash -Flying -When Faerie Harbinger enters the battlefield, you may search your library for a Faerie card, reveal it, then shuffle your library and put that card on top of it. -LRW U - -Faerie Macabre -{1}{B}{B} -Creature - Faerie Rogue -2/2 -Flying -Discard Faerie Macabre: Exile up to two target cards from graveyards. -SHM C, GVL C - -Faerie Mechanist -{3}{U} -Artifact Creature - Faerie Artificer -2/2 -Flying -When Faerie Mechanist enters the battlefield, look at the top three cards of your library. You may reveal an artifact card from among them and put it into your hand. Put the rest on the bottom of your library in any order. -CON C, EVT C - -Faerie Noble -{2}{G} -Creature - Faerie -1/2 -Flying -Other Faerie creatures you control get +0/+1. -{T}: Other Faerie creatures you control get +1/+0 until end of turn. -HML R, ME3 U - -Faerie Squadron -{U} -Creature - Faerie -1/1 -Kicker {3}{U} (You may pay an additional {3}{U} as you cast this spell.) -If Faerie Squadron was kicked, it enters the battlefield with two +1/+1 counters on it and with flying. -INV C - -Faerie Swarm -{3}{U} -Creature - Faerie -*/* -Flying -Faerie Swarm's power and toughness are each equal to the number of blue permanents you control. -SHM U - -Faerie Tauntings -{2}{B} -Tribal Enchantment - Faerie -Whenever you cast a spell during an opponent's turn, you may have each opponent lose 1 life. -LRW U - -Faerie Trickery -{1}{U}{U} -Tribal Instant - Faerie -Counter target non-Faerie spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyard. -LRW C - -Faith Healer -{1}{W} -Creature - Human Cleric -1/1 -Sacrifice an enchantment: You gain life equal to the sacrificed enchantment's converted mana cost. -USG R - -Faith's Fetters -{3}{W} -Enchantment - Aura -Enchant permanent -When Faith's Fetters enters the battlefield, you gain 4 life. -Enchanted permanent's activated abilities can't be activated unless they're mana abilities. If enchanted permanent is a creature, it can't attack or block. -RAV C, DVD C - -Faithful Squire -{1}{W}{W} -Creature - Human Soldier -2/2 -Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Faithful Squire. -At the beginning of the end step, if there are two or more ki counters on Faithful Squire, you may flip it. ----- -Kaiso, Memory of Loyalty -Legendary Creature - Spirit -3/4 -Flying -Remove a ki counter from Kaiso, Memory of Loyalty: Prevent all damage that would be dealt to target creature this turn. -BOK U - -Fallen Angel -{3}{B}{B} -Creature - Angel -3/3 -Flying -Sacrifice a creature: Fallen Angel gets +2/+1 until end of turn. -LEG U, CHR U, 5ED U, 6ED R, BTD R, 7ED R, 8ED R, DVD R, COM R - -Fallen Angel Avatar -Vanguard -Hand +0, life -5 -Whenever a creature you control dies, target opponent loses 1 life and you gain 1 life. -VG S - -Fallen Askari -{1}{B} -Creature - Human Knight -2/2 -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -Fallen Askari can't block. -VIS C - -Fallen Cleric -{4}{B} -Creature - Zombie Cleric -4/2 -Protection from Clerics -Morph {4}{B} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS C - -Fallen Ferromancer -{3}{R} -Creature - Human Shaman -1/1 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -{1}{R}, {T}: Fallen Ferromancer deals 1 damage to target creature or player. -NPH U - -Fallen Ideal -{2}{B} -Enchantment - Aura -Enchant creature -Enchanted creature has flying and "Sacrifice a creature: This creature gets +2/+1 until end of turn." -When Fallen Ideal is put into a graveyard from the battlefield, return Fallen Ideal to its owner's hand. -TSP U - -Falling Star -{2}{R} -Sorcery -Flip Falling Star onto the playing area from a height of at least one foot. Falling Star deals 3 damage to each creature it lands on. Tap all creatures dealt damage by Falling Star. If Falling Star doesn't turn completely over at least once during the flip, it has no effect. -LEG R - -Falling Timber -{2}{G} -Instant -Kicker-Sacrifice a land. (You may sacrifice a land in addition to any other costs as you cast this spell.) -Prevent all combat damage target creature would deal this turn. If Falling Timber was kicked, prevent all combat damage another target creature would deal this turn. -PLS C - -Fallow Earth -{2}{G} -Sorcery -Put target land on top of its owner's library. -MIR U, 6ED U - -Fallow Wurm -{2}{G} -Creature - Wurm -4/4 -When Fallow Wurm enters the battlefield, sacrifice it unless you discard a land card. -WTH U - -Fallowsage -{3}{U} -Creature - Merfolk Wizard -2/2 -Whenever Fallowsage becomes tapped, you may draw a card. -LRW U - -False Cure -{B}{B} -Instant -Until end of turn, whenever a player gains life, that player loses 2 life for each 1 life he or she gained. -ONS R - -False Dawn -{1}{W} -Sorcery -Until end of turn, spells and abilities you control that would add colored mana to your mana pool add that much white mana instead. Until end of turn, you may spend white mana as though it were mana of any color. -Draw a card. -APC R - -False Defeat -{3}{W} -Sorcery -Return target creature card from your graveyard to the battlefield. -PTK C, ME3 U - -False Demise -{2}{U} -Enchantment - Aura -Enchant creature -When enchanted creature dies, return that card to the battlefield under your control. -ALL C (x2), MMQ U - -False Memories -{1}{U} -Instant -Put the top seven cards of your library into your graveyard. At the beginning of the next end step, exile seven cards from your graveyard. -TOR R - -False Mourning -{G} -Sorcery -Put target card from your graveyard on top of your library. -PTK U - -False Orders -{R} -Instant -Cast False Orders only during the declare blockers step. -Remove target creature defending player controls from combat. Creatures it was blocking that had become blocked by only that creature this combat become unblocked. You may have it block an attacking creature of your choice. -LEA C, LEB C, 2ED C - -False Peace -{W} -Sorcery -Target player skips all combat phases of his or her next turn. -POR C, S99 U - -False Prophet -{2}{W}{W} -Creature - Human Cleric -2/2 -When False Prophet dies, exile all creatures. -PRO R, UDS R, COM R - -False Summoning -{1}{U} -Instant -Counter target creature spell. -P02 C, ME4 C - -Falter -{1}{R} -Instant -Creatures without flying can't block this turn. -USG C - -Familiar Ground -{2}{G} -Enchantment -Each creature you control can't be blocked by more than one creature. -WTH U, 6ED U, 7ED U - -Familiar's Ruse -{U}{U} -Instant -As an additional cost to cast Familiar's Ruse, return a creature you control to its owner's hand. -Counter target spell. -LRW U - -Famine -{3}{B}{B} -Sorcery -Famine deals 3 damage to each creature and each player. -PTK U, ME3 U - -Famished Ghoul -{3}{B} -Creature - Zombie -3/2 -{1}{B}, Sacrifice Famished Ghoul: Exile up to two target cards from a single graveyard. -ODY U - -Fanatical Devotion -{2}{W} -Enchantment -Sacrifice a creature: Regenerate target creature. -NEM C - -Fanatical Fever -{2}{G}{G} -Instant -Target creature gets +3/+0 and gains trample until end of turn. -ICE U - -Fang Skulkin -{2} -Artifact Creature - Scarecrow -2/1 -{2}: Target black creature gains wither until end of turn. (It deals damage to creatures in the form of -1/-1 counters.) -EVE C - -Fangren Firstborn -{1}{G}{G}{G} -Creature - Beast -4/2 -Whenever Fangren Firstborn attacks, put a +1/+1 counter on each attacking creature. -DST R - -Fangren Hunter -{3}{G}{G} -Creature - Beast -4/4 -Trample -MRD C - -Fangren Marauder -{5}{G} -Creature - Beast -5/5 -Whenever an artifact is put into a graveyard from the battlefield, you may gain 5 life. -MBS C - -Fangren Pathcutter -{4}{G}{G} -Creature - Beast -4/6 -Whenever Fangren Pathcutter attacks, attacking creatures gain trample until end of turn. -5DN U - -Fanning the Flames -{X}{R}{R} -Sorcery -Buyback {3} (You may pay an additional {3} as you cast this spell. If you do, put this card into your hand as it resolves.) -Fanning the Flames deals X damage to target creature or player. -STH U - -Far Wanderings -{2}{G} -Sorcery -Search your library for a basic land card and put that card onto the battlefield tapped. Then shuffle your library. -Threshold - If seven or more cards are in your graveyard, instead search your library for three basic land cards and put them onto the battlefield tapped. Then shuffle your library. -TOR C - -Farhaven Elf -{2}{G} -Creature - Elf Druid -1/1 -When Farhaven Elf enters the battlefield, you may search your library for a basic land card and put it onto the battlefield tapped. If you do, shuffle your library. -SHM C - -Farmstead -{W}{W}{W} -Enchantment - Aura -Enchant land -Enchanted land has "At the beginning of your upkeep, you may pay {W}{W}. If you do, you gain 1 life." -LEA R, LEB R, 2ED R, 3ED R - -Farrel's Mantle -{2}{W} -Enchantment - Aura -Enchant creature -Whenever enchanted creature attacks and isn't blocked, its controller may have it deal damage equal to its power plus 2 to target creature. If that player does, the attacking creature assigns no combat damage this turn. -FEM U, ME2 U - -Farrel's Zealot -{1}{W}{W} -Creature - Human -2/2 -Whenever Farrel's Zealot attacks and isn't blocked, you may have it deal 3 damage to target creature. If you do, Farrel's Zealot assigns no combat damage this turn. -FEM C (x3), ME2 U - -Farrelite Priest -{1}{W}{W} -Creature - Human Cleric -1/3 -{1}: Add {W} to your mana pool. If this ability has been activated four or more times this turn, sacrifice Farrelite Priest at the beginning of the next end step. -FEM U - -Farseek -{1}{G} -Sorcery -Search your library for a Plains, Island, Swamp, or Mountain card and put it onto the battlefield tapped. Then shuffle your library. -RAV C - -Farsight Mask -{5} -Artifact -Whenever a source an opponent controls deals damage to you, if Farsight Mask is untapped, you may draw a card. -MRD U - -Fastbond -{G} -Enchantment -You may play any number of additional lands on each of your turns. -Whenever you play a land, if it wasn't the first land you played this turn, Fastbond deals 1 damage to you. -LEA R, LEB R, 2ED R, 3ED R, ME4 R - -Fasting -{W} -Enchantment -At the beginning of your upkeep, put a hunger counter on Fasting. Then destroy Fasting if it has five or more hunger counters on it. -If you would begin your draw step, you may skip that step instead. If you do, you gain 2 life. -When you draw a card, destroy Fasting. -DRK U - -Fatal Attraction -{2}{R} -Enchantment - Aura -Enchant creature -When Fatal Attraction enters the battlefield, it deals 2 damage to enchanted creature. -At the beginning of your upkeep, Fatal Attraction deals 4 damage to enchanted creature. -FUT C - -Fatal Blow -{B} -Instant -Destroy target creature that was dealt damage this turn. It can't be regenerated. -WTH C, 6ED C - -Fatal Frenzy -{2}{R} -Instant -Until end of turn, target creature you control gains trample and gets +X/+0, where X is its power. Sacrifice it at the beginning of the next end step. -PLC R - -Fatal Lore -{2}{B}{B} -Sorcery -An opponent chooses one - You draw three cards; or you destroy up to two target creatures that opponent controls and that player draws up to three cards. Those creatures can't be regenerated. -ALL R - -Fatal Mutation -{B} -Enchantment - Aura -Enchant creature -When enchanted creature is turned face up, destroy it. It can't be regenerated. -SCG U - -Fate Transfer -{1}{U/B} -Instant -Move all counters from target creature onto another target creature. -SHM C - -Fatespinner -{1}{U}{U} -Creature - Human Wizard -1/2 -At the beginning of each opponent's upkeep, that player chooses draw step, main phase, or combat phase. The player skips each instance of the chosen step or phase this turn. -MRD R - -Fatestitcher -{3}{U} -Creature - Zombie Wizard -1/2 -{T}: You may tap or untap another target permanent. -Unearth {U} ({U}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) -ALA U - -Fathom Seer -{1}{U} -Creature - Illusion -1/3 -Morph-Return two Islands you control to their owner's hand. (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Fathom Seer is turned face up, draw two cards. -TSP C, JVC C - -Fathom Trawl -{3}{U}{U} -Sorcery -Reveal cards from the top of your library until you reveal three nonland cards. Put the nonland cards revealed this way into your hand, then put the rest of the revealed cards on the bottom of your library in any order. -LRW R - -Fatigue -{1}{U} -Sorcery -Target player skips his or her next draw step. -UDS C - -Fault Line -{X}{R}{R} -Instant -Fault Line deals X damage to each creature without flying and each player. -USG R - -Fault Riders -{2}{R} -Creature - Human Soldier -2/2 -Sacrifice a land: Fault Riders gets +2/+0 and gains first strike until end of turn. Activate this ability only once each turn. -PCY C - -Faultgrinder -{6}{R} -Creature - Elemental -4/4 -Trample -When Faultgrinder enters the battlefield, destroy target land. -Evoke {4}{R} (You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield.) -LRW C, COM C - -Fauna Shaman -{1}{G} -Creature - Elf Shaman -2/2 -{G}, {T}, Discard a creature card: Search your library for a creature card, reveal it, and put it into your hand. Then shuffle your library. -M11 R - -Favor of the Mighty -{1}{W} -Tribal Enchantment - Giant -Each creature with the highest converted mana cost has protection from all colors. -LRW R - -Favor of the Overbeing -{1}{G/U} -Enchantment - Aura -Enchant creature -As long as enchanted creature is green, it gets +1/+1 and has vigilance. -As long as enchanted creature is blue, it gets +1/+1 and has flying. -EVE C - -Favorable Destiny -{1}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+2 as long as it's white. -Enchanted creature has shroud as long as its controller controls another creature. (It can't be the target of spells or abilities.) -MIR U - -Fear -{B}{B} -Enchantment - Aura -Enchant creature (Target a creature as you cast this. This card enters the battlefield attached to that creature.) -Enchanted creature has fear. (It can't be blocked except by artifact creatures and/or black creatures.) -LEA C, LEB C, 2ED C, 3ED C, 4ED C, ICE C, 5ED C, 6ED C, 7ED C, 8ED C, 9ED C, 10E C - -Feast of Blood -{1}{B} -Sorcery -Cast Feast of Blood only if you control two or more Vampires. -Destroy target creature. You gain 4 life. -ZEN U - -Feast of Flesh -{B} -Sorcery -Feast of Flesh deals X damage to target creature and you gain X life, where X is 1 plus the number of cards named Feast of Flesh in all graveyards. -CSP C - -Feast of Worms -{3}{G}{G} -Sorcery - Arcane -Destroy target land. If that land was legendary, its controller sacrifices another land. -CHK U - -Feast of the Unicorn -{3}{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets +4/+0. -HML C (x2), 6ED C - -Feast or Famine -{3}{B} -Instant -Choose one - Put a 2/2 black Zombie creature token onto the battlefield; or destroy target nonartifact, nonblack creature and it can't be regenerated. -ALL C (x2), MED C - -Fecundity -{2}{G} -Enchantment -Whenever a creature dies, that creature's controller may draw a card. -USG U, BRB U, 8ED U - -Feebleness -{1}{B} -Enchantment - Aura -Flash (You may cast this spell any time you could cast an instant.) -Enchant creature -Enchanted creature gets -2/-1. -TSP C - -Feed the Machine -Scheme -When you set this scheme in motion, target opponent chooses self or others. If that player chooses self, he or she sacrifices two creatures. If the player chooses others, each of your other opponents sacrifices a creature. -ARC C - -Feedback -{2}{U} -Enchantment - Aura -Enchant enchantment -At the beginning of the upkeep of enchanted enchantment's controller, Feedback deals 1 damage to that player. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U - -Feedback Bolt -{4}{R} -Instant -Feedback Bolt deals damage to target player equal to the number of artifacts you control. -5DN U - -Feeding Frenzy -{2}{B} -Instant -Target creature gets -X/-X until end of turn, where X is the number of Zombies on the battlefield. -ONS U - -Feeding Grounds -Plane - Muraganda -Red spells cost {1} less to cast. -Green spells cost {1} less to cast. -Whenever you roll {C}, put X +1/+1 counters on target creature, where X is that creature's converted mana cost. -HOP C - -Feint -{R} -Instant -Tap all creatures blocking target attacking creature. Prevent all combat damage that would be dealt this turn by that creature and each creature blocking it. -LEG C - -Feldon's Cane -{1} -Artifact -{T}, Exile Feldon's Cane: Shuffle your graveyard into your library. -ATQ U, CHR C, 5ED U, TSB S - -Felidar Sovereign -{4}{W}{W} -Creature - Cat Beast -4/6 -Vigilance, lifelink -At the beginning of your upkeep, if you have 40 or more life, you win the game. -ZEN M - -Fellwar Stone -{2} -Artifact -{T}: Add to your mana pool one mana of any color that a land an opponent controls could produce. -DRK U, 4ED U, 5ED U, 9ED U, ME3 C, COM U - -Femeref Archers -{2}{G} -Creature - Human Archer -2/2 -{T}: Femeref Archers deals 4 damage to target attacking creature with flying. -MIR U, 6ED U, 7ED U, 10E U - -Femeref Enchantress -{G}{W} -Creature - Human Druid -1/2 -Whenever an enchantment is put into a graveyard from the battlefield, draw a card. -VIS R - -Femeref Healer -{1}{W} -Creature - Human Cleric -1/1 -{T}: Prevent the next 1 damage that would be dealt to target creature or player this turn. -MIR C - -Femeref Knight -{2}{W} -Creature - Human Knight -2/2 -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -{W}: Femeref Knight gains vigilance until end of turn. -MIR C - -Femeref Scouts -{2}{W} -Creature - Human Scout -1/4 -MIR C - -Fen Stalker -{3}{B} -Creature - Nightstalker -3/2 -Fen Stalker has fear as long as you control no untapped lands. (It can't be blocked except by artifact creatures and/or black creatures.) -PCY C - -Fencer Clique -{2}{U}{U} -Creature - Faerie Soldier -3/2 -Flying -{U}: Put Fencer Clique on top of its owner's library. -MOR C - -Fencer's Magemark -{2}{R} -Enchantment - Aura -Enchant creature -Creatures you control that are enchanted get +1/+1 and have first strike. -GPT C - -Fend Off -{1}{W} -Instant -Prevent all combat damage that would be dealt by target creature this turn. -Cycling {2} ({2}, Discard this card: Draw a card.) -UDS C - -Fendeep Summoner -{4}{B} -Creature - Treefolk Shaman -3/5 -{T}: Up to two target Swamps each become 3/5 Treefolk Warrior creatures in addition to their other types until end of turn. -MOR R - -Feral Animist -{1}{R}{G} -Creature - Goblin Shaman -2/1 -{3}: Feral Animist gets +X/+0 until end of turn, where X is its power. -GPT U - -Feral Contest -{3}{G} -Sorcery -Put a +1/+1 counter on target creature you control. Another target creature blocks it this turn if able. -WWK C - -Feral Deceiver -{3}{G} -Creature - Spirit -3/2 -{1}: Look at the top card of your library. -{2}: Reveal the top card of your library. If it's a land card, Feral Deceiver gets +2/+2 and gains trample until end of turn. Activate this ability only once each turn. -CHK C - -Feral Hydra -{X}{G} -Creature - Hydra Beast -0/0 -Feral Hydra enters the battlefield with X +1/+1 counters on it. -{3}: Put a +1/+1 counter on Feral Hydra. Any player may activate this ability. -ALA R, ARC R - -Feral Instinct -{1}{G} -Instant -Target creature gets +1/+1 until end of turn. -Draw a card at the beginning of the next turn's upkeep. -VIS C - -Feral Lightning -{3}{R}{R}{R} -Sorcery -Put three 3/1 red Elemental creature tokens with haste onto the battlefield. Exile them at the beginning of the next end step. -SOK U - -Feral Shadow -{2}{B} -Creature - Nightstalker -2/1 -Flying -MIR C, POR C, 6ED C, S99 C, BTD C - -Feral Thallid -{3}{G}{G}{G} -Creature - Fungus -6/3 -At the beginning of your upkeep, put a spore counter on Feral Thallid. -Remove three spore counters from Feral Thallid: Regenerate Feral Thallid. -FEM U, ME2 C - -Feral Throwback -{4}{G}{G} -Creature - Beast -3/3 -Amplify 2 (As this creature enters the battlefield, put two +1/+1 counters on it for each Beast card you reveal in your hand.) -Provoke (When this attacks, you may have target creature defending player controls untap and block it if able.) -PRO R, LGN R - -Ferocious Charge -{2}{G} -Instant -Target creature gets +4/+4 until end of turn. -Scry 2. (To scry 2, look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) -5DN C - -Ferocity -{1}{G} -Enchantment - Aura -Enchant creature -Whenever enchanted creature blocks or becomes blocked, you may put a +1/+1 counter on it. -MMQ C - -Feroz's Ban -{6} -Artifact -Creature spells cost {2} more to cast. -HML R, 5ED R, 7ED R - -Ferropede -{3} -Artifact Creature - Insect -1/1 -Ferropede is unblockable. -Whenever Ferropede deals combat damage to a player, you may remove a counter from target permanent. -5DN U - -Ferrovore -{2}{R} -Creature - Beast -2/2 -{R}, Sacrifice an artifact: Ferrovore gets +3/+0 until end of turn. -SOM C - -Fertile Ground -{1}{G} -Enchantment - Aura -Enchant land -Whenever enchanted land is tapped for mana, its controller adds one mana of any color to his or her mana pool (in addition to the mana the land produces). -USG C, BRB C, INV C, 8ED C, LRW C, HOP C, PVC C - -Fertile Imagination -{2}{G}{G} -Sorcery -Choose a card type. Target opponent reveals his or her hand. Put two 1/1 green Saproling creature tokens onto the battlefield for each card of the chosen type revealed this way. (Artifact, creature, enchantment, instant, land, planeswalker, sorcery, and tribal are card types.) -DIS U - -Fertilid -{2}{G} -Creature - Elemental -0/0 -Fertilid enters the battlefield with two +1/+1 counters on it. -{1}{G}, Remove a +1/+1 counter from Fertilid: Target player searches his or her library for a basic land card and puts it onto the battlefield tapped. Then that player shuffles his or her library. -MOR C, HOP C, ARC C, COM C - -Fervent Charge -{1}{W}{B}{R} -Enchantment -Whenever a creature you control attacks, it gets +2/+2 until end of turn. -APC R - -Fervent Denial -{3}{U}{U} -Instant -Counter target spell. -Flashback {5}{U}{U} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY U - -Fervor -{2}{R} -Enchantment -Creatures you control have haste. -WTH R, 6ED R, 7ED R - -Festercreep -{1}{B} -Creature - Elemental -0/0 -Festercreep enters the battlefield with a +1/+1 counter on it. -{1}{B}, Remove a +1/+1 counter from Festercreep: All other creatures get -1/-1 until end of turn. -MOR C - -Festering Evil -{3}{B}{B} -Enchantment -At the beginning of your upkeep, Festering Evil deals 1 damage to each creature and each player. -{B}{B}, Sacrifice Festering Evil: Festering Evil deals 3 damage to each creature and each player. -WTH U - -Festering Goblin -{B} -Creature - Zombie Goblin -1/1 -When Festering Goblin dies, target creature gets -1/-1 until end of turn. -ONS C, 9ED C, 10E C, HOP C, ARC C - -Festering March -{3}{B}{B} -Sorcery -Creatures your opponents control get -1/-1 until end of turn. Exile Festering March with three time counters on it. -Suspend 3-{2}{B} (Rather than cast this card from your hand, you may pay {2}{B} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) -FUT U - -Festering Wound -{1}{B} -Enchantment - Aura -Enchant creature -At the beginning of your upkeep, you may put an infection counter on Festering Wound. -At the beginning of the upkeep of enchanted creature's controller, Festering Wound deals X damage to that player, where X is the number of infection counters on Festering Wound. -UDS U - -Festival -{W} -Instant -Cast Festival only during an opponent's upkeep. -Creatures can't attack this turn. -DRK C - -Festival of Trokin -{W} -Sorcery -You gain 2 life for each creature you control. -P02 C - -Festival of the Guildpact -{X}{W} -Instant -Prevent the next X damage that would be dealt to you this turn. -Draw a card. -RAV U - -Fetid Heath -Land -{T}: Add {1} to your mana pool. -{W/B}, {T}: Add {W}{W}, {W}{B}, or {B}{B} to your mana pool. -EVE R - -Fetid Horror -{3}{B} -Creature - Shade Horror -1/2 -{B}: Fetid Horror gets +1/+1 until end of turn. -MIR C - -Feudkiller's Verdict -{4}{W}{W} -Tribal Sorcery - Giant -You gain 10 life. Then if you have more life than an opponent, put a 5/5 white Giant Warrior creature token onto the battlefield. -MOR R - -Fever Charm -{R} -Instant -Choose one - Target creature gains haste until end of turn; or target creature gets +2/+0 until end of turn; or Fever Charm deals 3 damage to target Wizard creature. -ONS C - -Fevered Convulsions -{B}{B} -Enchantment -{2}{B}{B}: Put a -1/-1 counter on target creature. -TMP R - -Fevered Strength -{2}{B} -Instant -Target creature gets +2/+0 until end of turn. -Draw a card at the beginning of the next turn's upkeep. -ALL C (x2), ME3 C - -Fickle Efreet -{3}{R} -Creature - Efreet -5/2 -Whenever Fickle Efreet attacks or blocks, flip a coin at end of combat. If you lose the flip, an opponent gains control of Fickle Efreet. -PCY R - -Fiddlehead Kami -{4}{G} -Creature - Spirit -3/3 -Whenever you cast a Spirit or Arcane spell, regenerate Fiddlehead Kami. -SOK C - -Field Marshal -{1}{W}{W} -Creature - Human Soldier -2/2 -Other Soldier creatures get +1/+1 and have first strike. (They deal combat damage before creatures without first strike.) -CSP R, 10E R - -Field Surgeon -{1}{W} -Creature - Human Cleric -1/1 -Tap an untapped creature you control: Prevent the next 1 damage that would be dealt to target creature this turn. -UDS C - -Field of Dreams -{U} -World Enchantment -Players play with the top card of their libraries revealed. -LEG R - -Field of Reality -{2}{U} -Enchantment - Aura -Enchant creature -Enchanted creature can't be blocked by Spirits. -{1}{U}: Return Field of Reality to its owner's hand. -CHK C - -Field of Souls -{2}{W}{W} -Enchantment -Whenever a nontoken creature is put into your graveyard from the battlefield, put a 1/1 white Spirit creature token with flying onto the battlefield. -TMP R - -Fieldmist Borderpost -{1}{W}{U} -Artifact -You may pay {1} and return a basic land you control to its owner's hand rather than pay Fieldmist Borderpost's mana cost. -Fieldmist Borderpost enters the battlefield tapped. -{T}: Add {W} or {U} to your mana pool. -ARB C, ARC C - -Fields of Summer -Plane - Moag -Whenever a player casts a spell, that player may gain 2 life. -Whenever you roll {C}, you may gain 10 life. -HOP C - -Fierce Empath -{2}{G} -Creature - Elf -1/1 -When Fierce Empath enters the battlefield, you may search your library for a creature card with converted mana cost 6 or greater, reveal it, put it into your hand, then shuffle your library. -SCG C, ARC C, COM C - -Fiery Bombardment -{1}{R} -Enchantment -Chroma - {2}, Sacrifice a creature: Fiery Bombardment deals damage to target creature or player equal to the number of red mana symbols in the sacrificed creature's mana cost. -EVE R - -Fiery Conclusion -{1}{R} -Instant -As an additional cost to cast Fiery Conclusion, sacrifice a creature. -Fiery Conclusion deals 5 damage to target creature. -RAV C - -Fiery Fall -{5}{R} -Instant -Fiery Fall deals 5 damage to target creature. -Basic landcycling {1}{R} ({1}{R}, Discard this card: Search your library for a basic land card, reveal it, and put it into your hand. Then shuffle your library.) -CON C, DDG C - -Fiery Gambit -{2}{R} -Sorcery -Flip a coin until you lose a flip or choose to stop flipping. If you lose a flip, Fiery Gambit has no effect. If you win one or more flips, Fiery Gambit deals 3 damage to target creature. If you win two or more flips, Fiery Gambit deals 6 damage to each opponent. If you win three or more flips, draw nine cards and untap all lands you control. -MRD R - -Fiery Hellhound -{1}{R}{R} -Creature - Elemental Hound -2/2 -{R}: Fiery Hellhound gets +1/+0 until end of turn. -M10 C, M11 C, M12 C - -Fiery Justice -{R}{G}{W} -Sorcery -Fiery Justice deals 5 damage divided as you choose among any number of target creatures and/or players. Target opponent gains 5 life. -ICE R, TSB S - -Fiery Mantle -{1}{R} -Enchantment - Aura -Enchant creature -{R}: Enchanted creature gets +1/+0 until end of turn. -When Fiery Mantle is put into a graveyard from the battlefield, return Fiery Mantle to its owner's hand. -USG C - -Fiery Temper -{1}{R}{R} -Instant -Fiery Temper deals 3 damage to target creature or player. -Madness {R} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -TOR C, TSB S - -Fight or Flight -{3}{W} -Enchantment -At the beginning of each opponent's combat, separate all creatures that player controls into two piles. Only creatures in the pile of his or her choice can attack this turn. -INV R - -Fight to the Death -{R}{W} -Instant -Destroy all blocking creatures and all blocked creatures. -ARB R - -Fighting Chance -{R} -Instant -For each blocking creature, flip a coin. If you win the flip, prevent all combat damage that would be dealt by that creature this turn. -EXO R - -Fighting Drake -{2}{U}{U} -Creature - Drake -2/4 -Flying -TMP U, 7ED U, 8ED U - -Figure of Destiny -{R/W} -Creature - Kithkin -1/1 -{R/W}: Figure of Destiny becomes a 2/2 Kithkin Spirit. -{R/W}{R/W}{R/W}: If Figure of Destiny is a Spirit, it becomes a 4/4 Kithkin Spirit Warrior. -{R/W}{R/W}{R/W}{R/W}{R/W}{R/W}: If Figure of Destiny is a Warrior, it becomes an 8/8 Kithkin Spirit Warrior Avatar with flying and first strike. -EVE R, H10 R - -Figure of Destiny Avatar -Vanguard -Hand +0, life +3 -{X}: Put a +1/+1 counter on target creature with fewer than X +1/+1 counters on it. -VG S - -Filigree Angel -{5}{W}{W}{U} -Artifact Creature - Angel -4/4 -Flying -When Filigree Angel enters the battlefield, you gain 3 life for each artifact you control. -ARB R - -Filigree Fracture -{2}{G} -Instant -Destroy target artifact or enchantment. If that permanent was blue or black, draw a card. -CON U - -Filigree Sages -{3}{U} -Artifact Creature - Vedalken Wizard -2/3 -{2}{U}: Untap target artifact. -ALA U - -Fill with Fright -{3}{B} -Sorcery -Target player discards two cards. -Scry 2. (To scry 2, look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) -5DN C - -Filth -{3}{B} -Creature - Incarnation -2/2 -Swampwalk -As long as Filth is in your graveyard and you control a Swamp, creatures you control have swampwalk. -JUD U - -Filthy Cur -{1}{B} -Creature - Hound -2/2 -Whenever Filthy Cur is dealt damage, you lose that much life. -ODY C - -Final Fortune -{R}{R} -Instant -Take an extra turn after this one. At the beginning of that turn's end step, you lose the game. -MIR R, 6ED R, 7ED R - -Final Judgment -{4}{W}{W} -Sorcery -Exile all creatures. -BOK R - -Final Punishment -{3}{B}{B} -Sorcery -Target player loses life equal to the damage already dealt to him or her this turn. -SCG R, 9ED R - -Final Revels -{4}{B} -Sorcery -Choose one - All creatures get +2/+0 until end of turn; or all creatures get -0/-2 until end of turn. -LRW U - -Final Strike -{2}{B}{B} -Sorcery -As an additional cost to cast Final Strike, sacrifice a creature. -Final Strike deals damage to target opponent equal to the sacrificed creature's power. -POR R - -Final-Sting Faerie -{3}{B} -Creature - Faerie Assassin -2/2 -Flying -When Final-Sting Faerie enters the battlefield, destroy target creature that was dealt damage this turn. -MOR C - -Finest Hour -{2}{G}{W}{U} -Enchantment -Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.) -Whenever a creature you control attacks alone, if it's the first combat phase of the turn, untap that creature. After this phase, there is an additional combat phase. -ARB R - -Fire -{1}{R} -Instant -Fire deals 2 damage divided as you choose among one or two target creatures and/or players. ----- -Ice -{1}{U} -Instant -Tap target permanent. -Draw a card. -APC U (x2), COM U - -Fire Ambush -{1}{R} -Sorcery -Fire Ambush deals 3 damage to target creature or player. -PTK C, ME3 C - -Fire Ants -{2}{R} -Creature - Insect -2/1 -{T}: Fire Ants deals 1 damage to each other creature without flying. -USG U, BRB U - -Fire Bowman -{R} -Creature - Human Soldier Archer -1/1 -Sacrifice Fire Bowman: Fire Bowman deals 1 damage to target creature or player. Activate this ability only during your turn, before attackers are declared. -PTK U - -Fire Covenant -{1}{B}{R} -Instant -As an additional cost to cast Fire Covenant, pay X life. -Fire Covenant deals X damage divided as you choose among any number of target creatures. -ICE U, MED U - -Fire Diamond -{2} -Artifact -Fire Diamond enters the battlefield tapped. -{T}: Add {R} to your mana pool. -MIR U, 6ED U, 7ED U - -Fire Dragon -{6}{R}{R}{R} -Creature - Dragon -6/6 -Flying -When Fire Dragon enters the battlefield, it deals damage equal to the number of Mountains you control to target creature. -POR R, ME2 R - -Fire Drake -{1}{R}{R} -Creature - Drake -1/2 -Flying -{R}: Fire Drake gets +1/+0 until end of turn. Activate this ability only once each turn. -DRK U, CHR U, 5ED U, ME3 C - -Fire Elemental -{3}{R}{R} -Creature - Elemental -5/4 -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 6ED U, S99 U, 7ED U - -Fire Imp -{2}{R} -Creature - Imp -2/1 -When Fire Imp enters the battlefield, it deals 2 damage to target creature. -POR U, ME4 U - -Fire Juggler -{2}{R} -Creature - Goblin Shaman -2/2 -Whenever Fire Juggler becomes blocked, clash with an opponent. If you win, Fire Juggler deals 4 damage to each creature blocking it. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -MOR C - -Fire Servant -{3}{R}{R} -Creature - Elemental -4/3 -If a red instant or sorcery spell you control would deal damage, it deals double that damage instead. -M11 U, H10 U - -Fire Snake -{4}{R} -Creature - Snake -3/1 -When Fire Snake dies, destroy target land. -POR C - -Fire Sprites -{1}{G} -Creature - Faerie -1/1 -Flying -{G}, {T}: Add {R} to your mana pool. -LEG C, ME3 C - -Fire Tempest -{5}{R}{R} -Sorcery -Fire Tempest deals 6 damage to each creature and each player. -POR R, S99 R, ME4 R - -Fire Whip -{1}{R} -Enchantment - Aura -Enchant creature you control -Enchanted creature has "{T}: This creature deals 1 damage to target creature or player." -Sacrifice Fire Whip: Fire Whip deals 1 damage to target creature or player. -WTH C, TSB S - -Fire and Brimstone -{3}{W}{W} -Instant -Fire and Brimstone deals 4 damage to target player who declared an attacking creature this turn and 4 damage to you. -DRK U - -Fire at Will -{R/W}{R/W}{R/W} -Instant -Fire at Will deals 3 damage divided as you choose among one, two, or three target attacking or blocking creatures. -EVE C - -Fire-Belly Changeling -{1}{R} -Creature - Shapeshifter -1/1 -Changeling (This card is every creature type at all times.) -{R}: Fire-Belly Changeling gets +1/+0 until end of turn. Activate this ability no more than twice each turn. -LRW C, DDG C - -Fire-Field Ogre -{1}{U}{B}{R} -Creature - Ogre Mutant -4/2 -First strike -Unearth {U}{B}{R} ({U}{B}{R}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) -ALA U - -Fire-Lit Thicket -Land -{T}: Add {1} to your mana pool. -{R/G}, {T}: Add {R}{R}, {R}{G}, or {G}{G} to your mana pool. -SHM R - -Fireball -{X}{R} -Sorcery -Fireball deals X damage divided evenly, rounded down, among any number of target creatures and/or players. -Fireball costs {1} more to cast for each target beyond the first. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, BTD C, DST U, JVC U, M10 U, ARC U, M11 U, H10 U, ME4 U, M12 U - -Fireblast -{4}{R}{R} -Instant -You may sacrifice two Mountains rather than pay Fireblast's mana cost. -Fireblast deals 4 damage to target creature or player. -VIS C, JVC C, H10 C - -Firebolt -{R} -Sorcery -Firebolt deals 2 damage to target creature or player. -Flashback {4}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY C, JVC C - -Firebrand Ranger -{1}{R} -Creature - Human Soldier -2/1 -{G}, {T}: You may put a basic land card from your hand onto the battlefield. -INV U - -Firebreathing -{R} -Enchantment - Aura -Enchant creature -{R}: Enchanted creature gets +1/+0 until end of turn. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, MIR C, 5ED C, 6ED C, 9ED C, 10E C, M10 C, M12 C - -Firecat Blitz -{X}{R}{R} -Sorcery -Put X 1/1 red Elemental Cat creature tokens with haste onto the battlefield. Exile them at the beginning of the next end step. -Flashback-{R}{R}, Sacrifice X Mountains. (You may cast this card from your graveyard for its flashback cost. Then exile it.) -JUD U - -Firefly -{3}{R} -Creature - Insect -1/1 -Flying -{R}: Firefly gets +1/+0 until end of turn. -TMP U - -Firefright Mage -{R} -Creature - Goblin Spellshaper -1/1 -{1}{R}, {T}, Discard a card: Target creature can't be blocked this turn except by artifact creatures and/or red creatures. -PLC C - -Firemane Angel -{3}{R}{W}{W} -Creature - Angel -4/3 -Flying, first strike -At the beginning of your upkeep, if Firemane Angel is in your graveyard or on the battlefield, you may gain 1 life. -{6}{R}{R}{W}{W}: Return Firemane Angel from your graveyard to the battlefield. Activate this ability only during your upkeep. -RAV R - -Firemaw Kavu -{5}{R} -Creature - Kavu -4/2 -Echo {5}{R} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -When Firemaw Kavu enters the battlefield, it deals 2 damage to target creature. -When Firemaw Kavu leaves the battlefield, it deals 4 damage to target creature. -TSP U - -Fires of Yavimaya -{1}{R}{G} -Enchantment -Creatures you control have haste. -Sacrifice Fires of Yavimaya: Target creature gets +2/+2 until end of turn. -INV U, HOP U, ARC U - -Firescreamer -{3}{B} -Creature - Kavu -2/2 -{R}: Firescreamer gets +1/+0 until end of turn. -INV C - -Fireshrieker -{3} -Artifact - Equipment -Equipped creature has double strike. (It deals both first-strike and regular combat damage.) -Equip {2} ({2}: Attach to target creature you control. Equip only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.) -MRD U - -Fireslinger -{1}{R} -Creature - Human Wizard -1/1 -{T}: Fireslinger deals 1 damage to target creature or player and 1 damage to you. -TMP C, JVC C - -Firespout -{2}{R/G} -Sorcery -Firespout deals 3 damage to each creature without flying if {R} was spent to cast Firespout and 3 damage to each creature with flying if {G} was spent to cast it. (Do both if {R}{G} was spent.) -SHM U, COM U - -Firestorm -{R} -Instant -As an additional cost to cast Firestorm, discard X cards. -Firestorm deals X damage to each of X target creatures and/or players. -WTH R - -Firestorm Hellkite -{4}{U}{R} -Creature - Dragon -6/6 -Flying, trample -Cumulative upkeep {U}{R} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -VIS R - -Firestorm Phoenix -{4}{R}{R} -Creature - Phoenix -3/2 -Flying -If Firestorm Phoenix would die, return Firestorm Phoenix to its owner's hand instead. Until that player's next turn, that player plays with that card revealed in his or her hand and can't play it. -LEG R, ME3 R - -Firewake Sliver -{1}{R}{G} -Creature - Sliver -1/1 -All Sliver creatures have haste. -All Slivers have "{1}, Sacrifice this permanent: Target Sliver creature gets +2/+2 until end of turn." -TSP U - -Firewild Borderpost -{1}{R}{G} -Artifact -You may pay {1} and return a basic land you control to its owner's hand rather than pay Firewild Borderpost's mana cost. -Firewild Borderpost enters the battlefield tapped. -{T}: Add {R} or {G} to your mana pool. -ARB C - -First Volley -{1}{R} -Instant - Arcane -First Volley deals 1 damage to target creature and 1 damage to that creature's controller. -BOK C - -Fishliver Oil -{1}{U} -Enchantment - Aura -Enchant creature (Target a creature as you cast this. This card enters the battlefield attached to that creature.) -Enchanted creature has islandwalk. (This creature is unblockable as long as defending player controls an Island.) -ARN C (x2), CHR C, 9ED C - -Fissure -{3}{R}{R} -Instant -Destroy target creature or land. It can't be regenerated. -DRK C, 4ED C, MED C - -Fissure Vent -{3}{R}{R} -Sorcery -Choose one or both - Destroy target artifact; and/or destroy target nonbasic land. -ROE C - -Fist of Suns -{3} -Artifact -You may pay {W}{U}{B}{R}{G} rather than pay the mana cost for spells that you cast. -5DN R - -Fistful of Force -{1}{G} -Instant -Target creature gets +2/+2 until end of turn. Clash with an opponent. If you win, that creature gets an additional +2/+2 and gains trample until end of turn. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -LRW C - -Fists of Ironwood -{1}{G} -Enchantment - Aura -Enchant creature -When Fists of Ironwood enters the battlefield, put two 1/1 green Saproling creature tokens onto the battlefield. -Enchanted creature has trample. -RAV C, COM C - -Fists of the Anvil -{1}{R} -Instant -Target creature gets +4/+0 until end of turn. -MRD C, 10E C - -Fists of the Demigod -{1}{B/R} -Enchantment - Aura -Enchant creature -As long as enchanted creature is black, it gets +1/+1 and has wither. (It deals damage to creatures in the form of -1/-1 counters.) -As long as enchanted creature is red, it gets +1/+1 and has first strike. -SHM C - -Fit of Rage -{1}{R} -Sorcery -Target creature gets +3/+3 and gains first strike until end of turn. -WTH C, 6ED C - -Flagstones of Trokair -Legendary Land -{T}: Add {W} to your mana pool. -When Flagstones of Trokair is put into a graveyard from the battlefield, you may search your library for a Plains card and put it onto the battlefield tapped. If you do, shuffle your library. -TSP R - -Flailing Drake -{3}{G} -Creature - Drake -2/3 -Flying -Whenever Flailing Drake blocks or becomes blocked by a creature, that creature gets +1/+1 until end of turn. -TMP U - -Flailing Manticore -{3}{R} -Creature - Manticore -3/3 -Flying, first strike -{1}: Flailing Manticore gets +1/+1 until end of turn. Any player may activate this ability. -{1}: Flailing Manticore gets -1/-1 until end of turn. Any player may activate this ability. -MMQ R - -Flailing Ogre -{2}{R} -Creature - Ogre -3/3 -{1}: Flailing Ogre gets +1/+1 until end of turn. Any player may activate this ability. -{1}: Flailing Ogre gets -1/-1 until end of turn. Any player may activate this ability. -MMQ U - -Flailing Soldier -{R} -Creature - Human Soldier -2/2 -{1}: Flailing Soldier gets +1/+1 until end of turn. Any player may activate this ability. -{1}: Flailing Soldier gets -1/-1 until end of turn. Any player may activate this ability. -MMQ C - -Flame Burst -{1}{R} -Instant -Flame Burst deals X damage to target creature or player, where X is 2 plus the number of cards named Flame Burst in all graveyards. -ODY C - -Flame Elemental -{2}{R}{R} -Creature - Elemental -3/2 -{R}, {T}, Sacrifice Flame Elemental: Flame Elemental deals damage equal to its power to target creature. -MIR U - -Flame Fusillade -{3}{R} -Sorcery -Until end of turn, permanents you control gain "{T}: This permanent deals 1 damage to target creature or player." -RAV R - -Flame Jab -{R} -Sorcery -Flame Jab deals 1 damage to target creature or player. -Retrace (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) -EVE C - -Flame Javelin -{2/R}{2/R}{2/R} -Instant -({2/R} can be paid with any two mana or with {R}. This card's converted mana cost is 6.) -Flame Javelin deals 4 damage to target creature or player. -SHM U, JVC U - -Flame Jet -{1}{R} -Sorcery -Flame Jet deals 3 damage to target player. -Cycling {2} ({2}, Discard this card: Draw a card.) -UDS C - -Flame Rift -{1}{R} -Sorcery -Flame Rift deals 4 damage to each player. -NEM C - -Flame Slash -{R} -Sorcery -Flame Slash deals 4 damage to target creature. -ROE C - -Flame Spirit -{4}{R} -Creature - Elemental Spirit -2/3 -{R}: Flame Spirit gets +1/+0 until end of turn. -ICE U, 5ED U, 6ED C, S00 C, ME2 U - -Flame Wave -{3}{R}{R}{R}{R} -Sorcery -Flame Wave deals 4 damage to target player and each creature he or she controls. -STH U, 9ED U - -Flame-Kin War Scout -{3}{R} -Creature - Elemental Scout -2/4 -When another creature enters the battlefield, sacrifice Flame-Kin War Scout. If you do, Flame-Kin War Scout deals 4 damage to that creature. -DIS U - -Flame-Kin Zealot -{1}{R}{R}{W} -Creature - Elemental Berserker -2/2 -When Flame-Kin Zealot enters the battlefield, creatures you control get +1/+1 and gain haste until end of turn. -RAV U - -Flameblast Dragon -{4}{R}{R} -Creature - Dragon -5/5 -Flying -Whenever Flameblast Dragon attacks, you may pay {X}{R}. If you do, Flameblast Dragon deals X damage to target creature or player. -ALA R, ARC R, M12 R - -Flameborn Hellion -{5}{R} -Creature - Hellion -5/4 -Haste -Flameborn Hellion attacks each turn if able. -SOM C - -Flameborn Viron -{4}{R}{R} -Creature - Insect -6/4 -NPH C - -Flamebreak -{R}{R}{R} -Sorcery -Flamebreak deals 3 damage to each creature without flying and each player. Creatures dealt damage this way can't be regenerated this turn. -DST R - -Flamecore Elemental -{2}{R}{R} -Creature - Elemental -5/4 -Echo {2}{R}{R} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -TSP C - -Flamekin Bladewhirl -{R} -Creature - Elemental Warrior -2/1 -As an additional cost to cast Flamekin Bladewhirl, reveal an Elemental card from your hand or pay {3}. -LRW U - -Flamekin Brawler -{R} -Creature - Elemental Warrior -0/2 -{R}: Flamekin Brawler gets +1/+0 until end of turn. -LRW C, JVC C - -Flamekin Harbinger -{R} -Creature - Elemental Shaman -1/1 -When Flamekin Harbinger enters the battlefield, you may search your library for an Elemental card, reveal it, then shuffle your library and put that card on top of it. -LRW U, HOP U - -Flamekin Spitfire -{1}{R} -Creature - Elemental Shaman -1/1 -{3}{R}: Flamekin Spitfire deals 1 damage to target creature or player. -LRW U - -Flames of the Blood Hand -{2}{R} -Instant -Flames of the Blood Hand deals 4 damage to target player. The damage can't be prevented. If that player would gain life this turn, that player gains no life instead. -BOK U, H10 U - -Flameshot -{3}{R} -Sorcery -You may discard a Mountain card rather than pay Flameshot's mana cost. -Flameshot deals 3 damage divided as you choose among one, two, or three target creatures. -PCY U - -Flamestick Courier -{2}{R} -Creature - Goblin -2/1 -You may choose not to untap Flamestick Courier during your untap step. -{2}{R}, {T}: Target Goblin creature gets +2/+2 and has haste for as long as Flamestick Courier remains tapped. -ONS U - -Flametongue Kavu -{3}{R} -Creature - Kavu -4/2 -When Flametongue Kavu enters the battlefield, it deals 4 damage to target creature. -PLS U, JVC U, HOP U, COM U - -Flametongue Kavu Avatar -Vanguard -Hand +0, life -6 -Whenever a nontoken creature enters the battlefield under your control, that creature deals X damage to target creature, where X is a number chosen at random from 0 to 4. -VG S - -Flamewave Invoker -{2}{R} -Creature - Goblin Mutant -2/2 -{7}{R}: Flamewave Invoker deals 5 damage to target player. -LGN C, 10E U, EVG U, JVC U - -Flaming Gambit -{X}{R} -Instant -Flaming Gambit deals X damage to target player. That player may choose a creature he or she controls and have Flaming Gambit deal that damage to it instead. -Flashback {X}{R}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -TOR U - -Flaming Sword -{1}{R} -Enchantment - Aura -Flash -Enchant creature -Enchanted creature gets +1/+0 and has first strike. -MMQ C - -Flanking Troops -{2}{W}{W} -Creature - Human Soldier -2/2 -Whenever Flanking Troops attacks, you may tap target creature. -PTK U - -Flare -{2}{R} -Instant -Flare deals 1 damage to target creature or player. -Draw a card at the beginning of the next turn's upkeep. -ICE C, MIR C, 5ED C - -Flaring Flame-Kin -{2}{R} -Creature - Elemental Warrior -2/2 -As long as Flaring Flame-Kin is enchanted, it gets +2/+2, has trample, and has "{R}: Flaring Flame-Kin gets +1/+0 until end of turn." -DIS U - -Flaring Pain -{1}{R} -Instant -Damage can't be prevented this turn. -Flashback {R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -JUD C - -Flash -{1}{U} -Instant -You may put a creature card from your hand onto the battlefield. If you do, sacrifice it unless you pay its mana cost reduced by up to {2}. -MIR R, 6ED R - -Flash Conscription -{5}{R} -Instant -Untap target creature and gain control of it until end of turn. That creature gains haste until end of turn. If {W} was spent to cast Flash Conscription, the creature gains "Whenever this creature deals combat damage, you gain that much life" until end of turn. -RAV U - -Flash Counter -{1}{U} -Instant -Counter target instant spell. -LEG C, 8ED C - -Flash Flood -{U} -Instant -Choose one - Destroy target red permanent; or return target Mountain to its owner's hand. -LEG C, CHR C, ME3 U - -Flash Foliage -{2}{G} -Instant -Cast Flash Foliage only during combat after blockers are declared. -Put a 1/1 green Saproling creature token onto the battlefield blocking target creature attacking you. -Draw a card. -DIS U - -Flash of Defiance -{1}{R} -Sorcery -Green creatures and white creatures can't block this turn. -Flashback-{1}{R}, Pay 3 life. (You may cast this card from your graveyard for its flashback cost. Then exile it.) -TOR C - -Flash of Insight -{X}{1}{U} -Instant -Look at the top X cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order. -Flashback-{1}{U}, Exile X blue cards from your graveyard. (You may cast this card from your graveyard for its flashback cost, then exile it. You can't exile Flash of Insight to pay for its own flashback cost.) -JUD U - -Flashfires -{3}{R} -Sorcery -Destroy all Plains. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, POR U, 6ED U, 8ED U, 9ED U - -Flashfreeze -{1}{U} -Instant -Counter target red or green spell. -CSP U, 10E U, M10 U, M11 U, M12 U - -Flay -{3}{B} -Sorcery -Target player discards a card at random. Then that player discards another card at random unless he or she pays {1}. -PCY C - -Flayed Nim -{3}{B} -Creature - Skeleton -2/2 -Whenever Flayed Nim deals combat damage to a creature, that creature's controller loses that much life. -{2}{B}: Regenerate Flayed Nim. -MRD U - -Flayer Husk -{1} -Artifact - Equipment -Living weapon (When this Equipment enters the battlefield, put a 0/0 black Germ creature token onto the battlefield, then attach this to it.) -Equipped creature gets +1/+1. -Equip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) -MBS C - -Fledgling Djinn -{1}{B} -Creature - Djinn -2/2 -Flying -At the beginning of your upkeep, Fledgling Djinn deals 1 damage to you. -WTH C - -Fledgling Dragon -{2}{R}{R} -Creature - Dragon -2/2 -Flying -Threshold - As long as seven or more cards are in your graveyard, Fledgling Dragon gets +3/+3 and has "{R}: Fledgling Dragon gets +1/+0 until end of turn." -JUD R - -Fledgling Griffin -{1}{W} -Creature - Griffin -2/2 -Landfall - Whenever a land enters the battlefield under your control, Fledgling Griffin gains flying until end of turn. -WWK C - -Fledgling Imp -{2}{B} -Creature - Imp -2/2 -{B}, Discard a card: Fledgling Imp gains flying until end of turn. -ODY C - -Fledgling Mawcor -{3}{U} -Creature - Beast -2/2 -Flying -{T}: Fledgling Mawcor deals 1 damage to target creature or player. -Morph {U}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -TSP U, JVC U - -Fledgling Osprey -{U} -Creature - Bird -1/1 -Fledgling Osprey has flying as long as it's enchanted. -UDS C - -Fleet-Footed Monk -{1}{W} -Creature - Human Monk -1/1 -Fleet-Footed Monk can't be blocked by creatures with power 2 or greater. -POR C - -Fleetfoot Panther -{1}{G}{W} -Creature - Cat -3/4 -Flash -When Fleetfoot Panther enters the battlefield, return a green or white creature you control to its owner's hand. -PLS U - -Fleeting Aven -{1}{U}{U} -Creature - Bird Wizard -2/2 -Flying -Whenever a player cycles a card, return Fleeting Aven to its owner's hand. -ONS U - -Fleeting Distraction -{U} -Instant -Target creature gets -1/-0 until end of turn. -Draw a card. -ROE C - -Fleeting Image -{2}{U} -Creature - Illusion -2/1 -Flying (This creature can't be blocked except by creatures with flying or reach.) -{1}{U}: Return Fleeting Image to its owner's hand. -ULG R, 7ED R, 8ED R, 9ED R - -Flensermite -{1}{B} -Creature - Gremlin -1/1 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -Lifelink (Damage dealt by this creature also causes you to gain that much life.) -MBS C - -Flesh Allergy -{2}{B}{B} -Sorcery -As an additional cost to cast Flesh Allergy, sacrifice a creature. -Destroy target creature. Its controller loses life equal to the number of creatures that died this turn. -SOM U - -Flesh Reaver -{1}{B} -Creature - Horror -4/4 -Whenever Flesh Reaver deals damage to a creature or opponent, Flesh Reaver deals that much damage to you. -USG U - -Flesh-Eater Imp -{3}{B} -Creature - Imp -2/2 -Flying -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -Sacrifice a creature: Flesh-Eater Imp gets +1/+1 until end of turn. -MBS U - -Fleshbag Marauder -{2}{B} -Creature - Zombie Warrior -3/1 -When Fleshbag Marauder enters the battlefield, each player sacrifices a creature. -ALA U, GVL U, COM U - -Fleshformer -{2}{B} -Creature - Human Wizard -2/2 -{W}{U}{B}{R}{G}: Fleshformer gets +2/+2 and gains fear until end of turn. Target creature gets -2/-2 until end of turn. Activate this ability only during your turn. (A creature with fear can't be blocked except by artifact creatures and/or black creatures.) -CON U - -Fleshgrafter -{2}{B} -Creature - Human Warrior -2/2 -Discard an artifact card: Fleshgrafter gets +2/+2 until end of turn. -5DN C - -Fleshwrither -{2}{B}{B} -Creature - Horror -3/3 -Transfigure {1}{B}{B} ({1}{B}{B}, Sacrifice this creature: Search your library for a creature card with the same converted mana cost as this creature and put that card onto the battlefield. Then shuffle your library. Transfigure only as a sorcery.) -FUT U - -Flicker -{1}{W} -Sorcery -Exile target nontoken permanent, then return it to the battlefield under its owner's control. -UDS R - -Flickerform -{1}{W} -Enchantment - Aura -Enchant creature -{2}{W}{W}: Exile enchanted creature and all Auras attached to it. At the beginning of the next end step, return that card to the battlefield under its owner's control. If you do, return those Auras to the battlefield under their owners' control attached to that creature. -RAV R - -Flickering Spirit -{3}{W} -Creature - Spirit -2/2 -Flying -{3}{W}: Exile Flickering Spirit, then return it to the battlefield under its owner's control. -TSP C - -Flickering Ward -{W} -Enchantment - Aura -Enchant creature -As Flickering Ward enters the battlefield, choose a color. -Enchanted creature has protection from the chosen color. This effect doesn't remove Flickering Ward. -{W}: Return Flickering Ward to its owner's hand. -TMP U - -Flickerwisp -{1}{W}{W} -Creature - Elemental -3/1 -Flying -When Flickerwisp enters the battlefield, exile another target permanent. Return that card to the battlefield under its owner's control at the beginning of the next end step. -EVE U - -Flight -{U} -Enchantment - Aura -Enchant creature -Enchanted creature has flying. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, 6ED C, S00 C, 7ED C, 8ED C, 9ED C, M12 C - -Flight Spellbomb -{1} -Artifact -{T}, Sacrifice Flight Spellbomb: Target creature gains flying until end of turn. -When Flight Spellbomb is put into a graveyard from the battlefield, you may pay {U}. If you do, draw a card. -SOM C - -Flight of Fancy -{3}{U} -Enchantment - Aura -Enchant creature -When Flight of Fancy enters the battlefield, draw two cards. -Enchanted creature has flying. -RAV C - -Fling -{1}{R} -Instant -As an additional cost to cast Fling, sacrifice a creature. -Fling deals damage equal to the sacrificed creature's power to target creature or player. -STH C, M11 C, M12 C - -Flint Golem -{4} -Artifact Creature - Golem -2/3 -Whenever Flint Golem becomes blocked, defending player puts the top three cards of his or her library into his or her graveyard. -NEM U - -Floating Shield -{2}{W} -Enchantment - Aura -Enchant creature -As Floating Shield enters the battlefield, choose a color. -Enchanted creature has protection from the chosen color. This effect doesn't remove Floating Shield. -Sacrifice Floating Shield: Target creature gains protection from the chosen color until end of turn. -TOR C - -Floating-Dream Zubera -{1}{U} -Creature - Zubera Spirit -1/2 -When Floating-Dream Zubera dies, draw a card for each Zubera that died this turn. -CHK C - -Flood -{U} -Enchantment -{U}{U}: Tap target creature without flying. -DRK U, 4ED C, 5ED C, BRB C - -Flood Plain -Land -Flood Plain enters the battlefield tapped. -{T}, Sacrifice Flood Plain: Search your library for a Plains or Island card and put it onto the battlefield. Then shuffle your library. -MIR U - -Floodbringer -{1}{U} -Creature - Moonfolk Wizard -1/2 -Flying -{2}, Return a land you control to its owner's hand: Tap target land. -BOK C - -Floodchaser -{5}{U} -Creature - Elemental -0/0 -Floodchaser enters the battlefield with six +1/+1 counters on it. -Floodchaser can't attack unless defending player controls an Island. -{U}, Remove a +1/+1 counter from Floodchaser: Target land becomes an Island until end of turn. -MOR C - -Flooded Grove -Land -{T}: Add {1} to your mana pool. -{G/U}, {T}: Add {G}{G}, {G}{U}, or {U}{U} to your mana pool. -EVE R - -Flooded Shoreline -{U}{U} -Enchantment -{U}{U}, Return two Islands you control to their owner's hand: Return target creature to its owner's hand. -VIS R - -Flooded Strand -Land -{T}, Pay 1 life, Sacrifice Flooded Strand: Search your library for a Plains or Island card and put it onto the battlefield. Then shuffle your library. -ONS R - -Flooded Woodlands -{2}{U}{B} -Enchantment -Green creatures can't attack unless their controller sacrifices a land for each green creature he or she controls that's attacking. -ICE R - -Floodgate -{3}{U} -Creature - Wall -0/5 -Defender (This creature can't attack.) -When Floodgate has flying, sacrifice it. -When Floodgate leaves the battlefield, it deals damage equal to half the number of Islands you control, rounded down, to each nonblue creature without flying. -MIR U - -Floodwater Dam -{3} -Artifact -{X}{X}{1}, {T}: Tap X target lands. -ALL R, ME4 R - -Floral Spuzzem -{3}{G} -Creature - Elemental -2/2 -Whenever Floral Spuzzem attacks and isn't blocked, you may destroy target artifact defending player controls. If you do, Floral Spuzzem assigns no combat damage this turn. -LEG U - -Flourishing Defenses -{4}{G} -Enchantment -Whenever a -1/-1 counter is placed on a creature, you may put a 1/1 green Elf Warrior creature token onto the battlefield. -SHM U - -Flow of Ideas -{5}{U} -Sorcery -Draw a card for each Island you control. -RAV U, SHM U - -Flow of Maggots -{2}{B} -Creature - Insect -2/2 -Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -Flow of Maggots can't be blocked by non-Wall creatures. -ICE R - -Flowering Field -{1}{W} -Enchantment - Aura -Enchant land -Enchanted land has "{T}: Prevent the next 1 damage that would be dealt to target creature or player this turn." -PCY U - -Flowstone Armor -{3} -Artifact -You may choose not to untap Flowstone Armor during your untap step. -{3}, {T}: Target creature gets +1/-1 for as long as Flowstone Armor remains tapped. -NEM U - -Flowstone Blade -{R} -Enchantment - Aura -Enchant creature -{R}: Enchanted creature gets +1/-1 until end of turn. -STH C - -Flowstone Channeler -{2}{R} -Creature - Human Spellshaper -2/2 -{1}{R}, {T}, Discard a card: Target creature gets +1/-1 and gains haste until end of turn. -TSP C - -Flowstone Charger -{2}{R}{W} -Creature - Beast -2/5 -Whenever Flowstone Charger attacks, it gets +3/-3 until end of turn. -APC U - -Flowstone Crusher -{3}{R}{R} -Creature - Beast -4/4 -{R}: Flowstone Crusher gets +1/-1 until end of turn. -NEM C, 9ED U - -Flowstone Embrace -{1}{R} -Enchantment - Aura -Enchant creature -{T}: Enchanted creature gets +2/-2 until end of turn. -FUT C - -Flowstone Flood -{3}{R} -Sorcery -Buyback-Pay 3 life, Discard a card at random. (You may pay 3 life and discard a card at random in addition to any other costs as you cast this spell. If you do, put this card into your hand as it resolves.) -Destroy target land. -EXO U - -Flowstone Giant -{2}{R}{R} -Creature - Giant -3/3 -{R}: Flowstone Giant gets +2/-2 until end of turn. -TMP C - -Flowstone Hellion -{4}{R} -Creature - Hellion Beast -3/3 -Haste -{0}: Flowstone Hellion gets +1/-1 until end of turn. -STH U - -Flowstone Mauler -{4}{R}{R} -Creature - Beast -4/5 -Trample -{R}: Flowstone Mauler gets +1/-1 until end of turn. -STH R - -Flowstone Overseer -{2}{R}{R}{R} -Creature - Beast -4/4 -{R}{R}: Target creature gets +1/-1 until end of turn. -NEM R - -Flowstone Salamander -{3}{R}{R} -Creature - Salamander -3/4 -{R}: Flowstone Salamander deals 1 damage to target creature blocking it. -TMP U - -Flowstone Sculpture -{6} -Artifact Creature - Shapeshifter -4/4 -{2}, Discard a card: Put a +1/+1 counter on Flowstone Sculpture or Flowstone Sculpture gains flying, first strike, or trample. (This effect lasts indefinitely.) -TMP R - -Flowstone Shambler -{2}{R} -Creature - Beast -2/2 -{R}: Flowstone Shambler gets +1/-1 until end of turn. -STH C, 9ED C - -Flowstone Slide -{X}{2}{R}{R} -Sorcery -All creatures get +X/-X until end of turn. -NEM R, 9ED R, 10E R - -Flowstone Strike -{1}{R} -Instant -Target creature gets +1/-1 and gains haste until end of turn. -NEM C - -Flowstone Surge -{1}{R} -Enchantment -Creatures you control get +1/-1. -NEM U - -Flowstone Thopter -{7} -Artifact Creature - Thopter -4/4 -{1}: Flowstone Thopter gets +1/-1 and gains flying until end of turn. -NEM U - -Flowstone Wall -{2}{R} -Creature - Wall -0/6 -Defender (This creature can't attack.) -{R}: Flowstone Wall gets +1/-1 until end of turn. -NEM C - -Flowstone Wyvern -{3}{R}{R} -Creature - Drake -3/3 -Flying -{R}: Flowstone Wyvern gets +2/-2 until end of turn. -TMP R - -Fluctuator -{2} -Artifact -Cycling abilities you activate cost you up to {2} less to activate. -USG R - -Flurry of Wings -{G}{W}{U} -Instant -Put X 1/1 white Bird Soldier creature tokens with flying onto the battlefield, where X is the number of attacking creatures. -ARB U - -Flusterstorm -{U} -Instant -Counter target instant or sorcery spell unless its controller pays {1}. -Storm (When you cast this spell, copy it for each spell cast before it this turn. You may choose new targets for the copies.) -COM R - -Flux -{2}{U} -Sorcery -Each player discards any number of cards, then draws that many cards. -Draw a card. -POR U, WTH C - -Flying Carpet -{4} -Artifact -{2}, {T}: Target creature gains flying until end of turn. -ARN U, 3ED R, 4ED R, 5ED R, 6ED R, 7ED R, 8ED R, ME4 C - -Flying Men -{U} -Creature - Human -1/1 -Flying -ARN C, TSB S - -Fodder Cannon -{4} -Artifact -{4}, {T}, Sacrifice a creature: Fodder Cannon deals 4 damage to target creature. -UDS U, 8ED U - -Fodder Launch -{3}{B} -Tribal Sorcery - Goblin -As an additional cost to cast Fodder Launch, sacrifice a Goblin. -Target creature gets -5/-5 until end of turn. Fodder Launch deals 5 damage to that creature's controller. -LRW U - -Fog -{G} -Instant -Prevent all combat damage that would be dealt this turn. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, MIR C, 5ED C, 6ED C, BTD C, 7ED C, M10 C, ARC C, M11 C, ME4 C, M12 C - -Fog Bank -{1}{U} -Creature - Wall -0/2 -Defender, flying -Prevent all combat damage that would be dealt to and dealt by Fog Bank. -USG U, COM U - -Fog Elemental -{2}{U} -Creature - Elemental -4/4 -Flying (This creature can't be blocked except by creatures with flying or reach.) -When Fog Elemental attacks or blocks, sacrifice it at end of combat. -WTH C, 6ED C, BTD C, 10E U - -Fog Patch -{1}{G} -Instant -Cast Fog Patch only during the declare blockers step. -Attacking creatures become blocked. (This spell works on unblockable creatures.) -NEM C - -Fog of Gnats -{B}{B} -Creature - Insect -1/1 -Flying -{B}: Regenerate Fog of Gnats. -ULG C - -Foil -{2}{U}{U} -Instant -You may discard an Island card and another card rather than pay Foil's mana cost. -Counter target spell. -PCY U, EVT U - -Fold into AEther -{2}{U}{U} -Instant -Counter target spell. If that spell is countered this way, its controller may put a creature card from his or her hand onto the battlefield. -5DN U - -Folk Medicine -{2}{G} -Instant -You gain 1 life for each creature you control. -Flashback {1}{W} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -JUD C - -Folk of An-Havva -{G} -Creature - Human -1/1 -Whenever Folk of An-Havva blocks, it gets +2/+0 until end of turn. -HML C (x2) - -Folk of the Pines -{4}{G} -Creature - Dryad -2/5 -{1}{G}: Folk of the Pines gets +1/+0 until end of turn. -ICE C, ME2 C - -Followed Footsteps -{3}{U}{U} -Enchantment - Aura -Enchant creature -At the beginning of your upkeep, put a token that's a copy of enchanted creature onto the battlefield. -RAV R - -Fomori Nomad -{4}{R} -Creature - Nomad Giant -4/4 -FUT C - -Font of Mythos -{4} -Artifact -At the beginning of each player's draw step, that player draws two additional cards. -CON R - -Food Chain -{2}{G} -Enchantment -Exile a creature you control: Add X mana of any one color to your mana pool, where X is the exiled creature's converted mana cost plus one. Spend this mana only to cast creature spells. -MMQ R - -Fool's Demise -{4}{U} -Enchantment - Aura -Enchant creature -When enchanted creature dies, return that card to the battlefield under your control. -When Fool's Demise is put into a graveyard from the battlefield, return Fool's Demise to its owner's hand. -TSP U - -Fool's Tome -{4} -Artifact -{2}, {T}: Draw a card. Activate this ability only if you have no cards in hand. -TMP R - -Foot Soldiers -{3}{W} -Creature - Human Soldier -2/4 -POR C, S99 C, 9ED C - -Footbottom Feast -{2}{B} -Instant -Put any number of target creature cards from your graveyard on top of your library. -Draw a card. -LRW C, COM C - -Foothill Guide -{W} -Creature - Human Cleric -1/1 -Protection from Goblins -Morph {W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS C - -Footsteps of the Goryo -{2}{B} -Sorcery - Arcane -Return target creature card from your graveyard to the battlefield. Sacrifice that creature at the beginning of the next end step. -SOK U - -Foratog -{2}{G} -Creature - Atog -1/2 -{G}, Sacrifice a Forest: Foratog gets +2/+2 until end of turn. -MIR U, 8ED U - -Forbid -{1}{U}{U} -Instant -Buyback-Discard two cards. (You may discard two cards in addition to any other costs as you cast this spell. If you do, put this card into your hand as it resolves.) -Counter target spell. -EXO U - -Forbidden Crypt -{3}{B}{B} -Enchantment -If you would draw a card, return a card from your graveyard to your hand instead. If you can't, you lose the game. -If a card would be put into your graveyard from anywhere, exile that card instead. -MIR R, 6ED R - -Forbidden Lore -{2}{G} -Enchantment - Aura -Enchant land -Enchanted land has "{T}: Target creature gets +2/+1 until end of turn." -ICE R, ME2 U - -Forbidden Orchard -Land -{T}: Add one mana of any color to your mana pool. -Whenever you tap Forbidden Orchard for mana, put a 1/1 colorless Spirit creature token onto the battlefield under target opponent's control. -CHK R - -Forbidden Ritual -{2}{B}{B} -Sorcery -Sacrifice a nontoken permanent. If you do, target opponent loses 2 life unless he or she sacrifices a permanent or discards a card. You may repeat this process any number of times. -VIS R - -Forbidding Watchtower -Land -Forbidding Watchtower enters the battlefield tapped. -{T}: Add {W} to your mana pool. -{1}{W}: Forbidding Watchtower becomes a 1/5 white Soldier creature until end of turn. It's still a land. -ULG U, 10E U - -Force Bubble -{2}{W}{W} -Enchantment -If damage would be dealt to you, put that many depletion counters on Force Bubble instead. -When there are four or more depletion counters on Force Bubble, sacrifice it. -At the beginning of each end step, remove all depletion counters from Force Bubble. -SCG R - -Force Spike -{U} -Instant -Counter target spell unless its controller pays {1}. -LEG C, 5ED C, 7ED C, ME3 C - -Force Void -{2}{U} -Instant -Counter target spell unless its controller pays {1}. -Draw a card at the beginning of the next turn's upkeep. -ICE U - -Force of Nature -{2}{G}{G}{G}{G} -Creature - Elemental -8/8 -Trample (If this creature would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.) -At the beginning of your upkeep, Force of Nature deals 8 damage to you unless you pay {G}{G}{G}{G}. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, BTD R, 9ED R, ME4 R - -Force of Savagery -{2}{G} -Creature - Elemental -8/0 -Trample -FUT R - -Force of Will -{3}{U}{U} -Instant -You may pay 1 life and exile a blue card from your hand rather than pay Force of Will's mana cost. -Counter target spell. -ALL U, MED R - -Forced Fruition -{4}{U}{U} -Enchantment -Whenever an opponent casts a spell, that player draws seven cards. -LRW R - -Forced March -{X}{B}{B}{B} -Sorcery -Destroy all creatures with converted mana cost X or less. -MMQ R - -Forced Retreat -{2}{U} -Sorcery -Put target creature on top of its owner's library. -PTK C, ME3 C - -Forced Worship -{1}{W} -Enchantment - Aura -Enchant creature -Enchanted creature can't attack. -{2}{W}: Return Forced Worship to its owner's hand. -NPH C - -Forcefield -{3} -Artifact -{1}: The next time an unblocked creature of your choice would deal combat damage to you this turn, prevent all but 1 of that damage. -LEA R, LEB R, 2ED R, MED R - -Forcemage Advocate -{1}{G} -Creature - Centaur Shaman -2/1 -{T}: Return target card from an opponent's graveyard to his or her hand. Put a +1/+1 counter on target creature. -JUD U - -Foresee -{3}{U} -Sorcery -Scry 4, then draw two cards. (To scry 4, look at the top four cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) -FUT C, M11 C - -Foreshadow -{1}{U} -Instant -Name a card, then put the top card of target opponent's library into his or her graveyard. If that card is the named card, you draw a card. -Draw a card at the beginning of the next turn's upkeep. -VIS U - -Foresight -{1}{U} -Sorcery -Search your library for three cards, exile them, then shuffle your library. -Draw a card at the beginning of the next turn's upkeep. -ALL C (x2) - -Forest -Basic Land - Forest -G -LEA L (x2), LEB L (x3), 2ED L (x3), 3ED L (x3), 4ED L (x3), ICE L (x3), MIR L (x4), 5ED L (x4), POR L (x4), TMP L (x4), P02 L (x3), UGL C, USG L (x4), 6ED L (x4), PTK L (x3), S99 L (x4), MMQ L (x4), BRB L (x9), S00 L (x2), INV L (x4), BTD L (x3), 7ED L (x4), ODY L (x4), ONS L (x4), 8ED L (x4), MRD L (x4), CHK L (x4), UNH L, 9ED L (x4), RAV L (x4), TSP L (x4), 10E L (x4), MED L (x3), LRW L (x4), EVG L (x4), SHM L (x4), ALA L (x4), M10 L (x4), HOP L (x5), ME3 L (x3), ZEN L (x8), GVL L (x4), H09 L, PVC L (x2), ROE L (x4), ARC L (x3), M11 L (x4), SOM L (x4), MBS L (x2), DDG L (x4), NPH L (x2), COM L (x4), M12 L (x4) - -Forest Bear -{1}{G} -Creature - Bear -2/2 -PTK C - -Forethought Amulet -{5} -Artifact -At the beginning of your upkeep, sacrifice Forethought Amulet unless you pay {3}. -If an instant or sorcery source would deal 3 or more damage to you, it deals 2 damage to you instead. -LEG R - -Forfend -{1}{W} -Instant -Prevent all damage that would be dealt to creatures this turn. -MOR C - -Forge Armor -{4}{R} -Instant -As an additional cost to cast Forge Armor, sacrifice an artifact. -Put X +1/+1 counters on target creature, where X is the sacrificed artifact's converted mana cost. -MRD U - -Forget -{U}{U} -Sorcery -Target player discards two cards, then draws as many cards as he or she discarded this way. -HML R, 5ED R, 6ED R - -Forgotten Ancient -{3}{G} -Creature - Elemental -0/3 -Whenever a player casts a spell, you may put a +1/+1 counter on Forgotten Ancient. -At the beginning of your upkeep, you may move any number of +1/+1 counters from Forgotten Ancient onto other creatures. -SCG R, HOP R, ARC R - -Forgotten Cave -Land -Forgotten Cave enters the battlefield tapped. -{T}: Add {R} to your mana pool. -Cycling {R} ({R}, Discard this card: Draw a card.) -ONS C, EVG C, COM C - -Forgotten Harvest -{1}{G} -Enchantment -At the beginning of your upkeep, you may exile a land card from your graveyard. If you do, put a +1/+1 counter on target creature. -PCY R - -Forgotten Lore -{G} -Sorcery -Target opponent chooses a card in your graveyard. You may pay {G}. If you do, repeat this process except that opponent can't choose a card already chosen for Forgotten Lore. Then put the last chosen card into your hand. -ICE U, ME2 U - -Foriysian Brigade -{3}{W} -Creature - Human Soldier -2/4 -Foriysian Brigade can block an additional creature. -WTH U - -Foriysian Interceptor -{3}{W} -Creature - Human Soldier -0/5 -Flash (You may cast this spell any time you could cast an instant.) -Defender -Foriysian Interceptor can block an additional creature. -TSP C - -Foriysian Totem -{3} -Artifact -{T}: Add {R} to your mana pool. -{4}{R}: Foriysian Totem becomes a 4/4 red Giant artifact creature with trample until end of turn. -As long as Foriysian Totem is a creature, it can block an additional creature. -TSP U - -Fork -{R}{R} -Instant -Copy target instant or sorcery spell, except that the copy is red. You may choose new targets for the copy. -LEA R, LEB R, 2ED R, 3ED R, ME4 R - -Forked Bolt -{R} -Sorcery -Forked Bolt deals 2 damage divided as you choose among one or two target creatures and/or players. -ROE U - -Forked Lightning -{3}{R} -Sorcery -Forked Lightning deals 4 damage divided as you choose among one, two, or three target creatures. -POR R, ME3 U - -Forked-Branch Garami -{3}{G}{G} -Creature - Spirit -4/4 -Soulshift 4, soulshift 4 (When this creature dies, you may return up to two target Spirit cards with converted mana cost 4 or less from your graveyard to your hand.) -BOK U - -Form of the Dragon -{4}{R}{R}{R} -Enchantment -At the beginning of your upkeep, Form of the Dragon deals 5 damage to target creature or player. -At the beginning of each end step, your life total becomes 5. -Creatures without flying can't attack you. -SCG R, 9ED R, FVD R - -Formation -{1}{W} -Instant -Target creature gains banding until end of turn. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding a player controls are blocking or being blocked by a creature, that player divides that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -Draw a card at the beginning of the next turn's upkeep. -ICE R - -Forsaken City -Land -Forsaken City doesn't untap during your untap step. -At the beginning of your upkeep, you may exile a card from your hand. If you do, untap Forsaken City. -{T}: Add one mana of any color to your mana pool. -PLS R - -Forsaken Wastes -{2}{B} -World Enchantment -Players can't gain life. -At the beginning of each player's upkeep, that player loses 1 life. -Whenever Forsaken Wastes becomes the target of a spell, that spell's controller loses 5 life. -MIR R - -Fortified Area -{1}{W}{W} -Enchantment -Wall creatures you control get +1/+0 and have banding. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -LEG U, 4ED C - -Fortify -{2}{W} -Instant -Choose one - Creatures you control get +2/+0 until end of turn; or creatures you control get +0/+2 until end of turn. -TSP C - -Fortitude -{1}{G} -Enchantment - Aura -Enchant creature -Sacrifice a Forest: Regenerate enchanted creature. -When Fortitude is put into a graveyard from the battlefield, return Fortitude to its owner's hand. -USG C - -Fortune Thief -{4}{R} -Creature - Human Rogue -0/1 -Damage that would reduce your life total to less than 1 reduces it to 1 instead. -Morph {R}{R} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -TSP R - -Fossil Find -{R/G} -Sorcery -Return a card at random from your graveyard to your hand, then reorder your graveyard as you choose. -SHM U - -Foster -{2}{G}{G} -Enchantment -Whenever a creature you control dies, you may pay {1}. If you do, reveal cards from the top of your library until you reveal a creature card. Put that card into your hand and the rest into your graveyard. -MMQ R - -Foul Familiar -{2}{B} -Creature - Spirit -3/1 -Foul Familiar can't block. -{B}, Pay 1 life: Return Foul Familiar to its owner's hand. -ICE C, ME2 C - -Foul Imp -{B}{B} -Creature - Imp -2/2 -Flying -When Foul Imp enters the battlefield, you lose 2 life. -STH C, 7ED U, 9ED C, DVD C - -Foul Presence -{2}{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets -1/-1 and has "{T}: Target creature gets -1/-1 until end of turn." -APC U - -Foul Spirit -{2}{B} -Creature - Spirit -3/2 -Flying -When Foul Spirit enters the battlefield, sacrifice a land. -P02 U, ME4 C - -Fountain Watch -{3}{W}{W} -Creature - Human Cleric -2/4 -Artifacts and enchantments you control have shroud. (They can't be the targets of spells or abilities.) -MMQ R - -Fountain of Cho -Land -Fountain of Cho enters the battlefield tapped. -{T}: Put a storage counter on Fountain of Cho. -{T}, Remove any number of storage counters from Fountain of Cho: Add {W} to your mana pool for each storage counter removed this way. -MMQ U - -Fountain of Youth -{0} -Artifact -{2}, {T}: You gain 1 life. -DRK U, CHR C, 5ED U, 6ED U, 10E U - -Foxfire -{2}{G} -Instant -Untap target attacking creature. Prevent all combat damage that would be dealt to and dealt by that creature this turn. -Draw a card at the beginning of the next turn's upkeep. -ICE C, 5ED C - -Foxfire Oak -{5}{G} -Creature - Treefolk Shaman -3/6 -{R/G}{R/G}{R/G}: Foxfire Oak gets +3/+0 until end of turn. -SHM C - -Fractured Loyalty -{1}{R} -Enchantment - Aura -Enchant creature -Whenever enchanted creature becomes the target of a spell or ability, that spell or ability's controller gains control of that creature. (This effect lasts indefinitely.) -MRD U - -Fracturing Gust -{2}{G/W}{G/W}{G/W} -Instant -Destroy all artifacts and enchantments. You gain 2 life for each permanent destroyed this way. -SHM R - -Frankenstein's Monster -{X}{B}{B} -Creature - Zombie -0/1 -As Frankenstein's Monster enters the battlefield, exile X creature cards from your graveyard. If you can't, put Frankenstein's Monster into its owner's graveyard instead of onto the battlefield. For each creature card exiled this way, Frankenstein's Monster enters the battlefield with a +2/+0, +1/+1, or +0/+2 counter on it. -DRK R - -Frantic Purification -{2}{W} -Instant -Destroy target enchantment. -Madness {W} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -TOR C - -Frantic Salvage -{3}{W} -Instant -Put any number of target artifact cards from your graveyard on top of your library. -Draw a card. -MBS C - -Frantic Search -{2}{U} -Instant -Draw two cards, then discard two cards. Untap up to three lands. -ULG C - -Frazzle -{3}{U} -Instant -Counter target nonblue spell. -GPT U - -Freed from the Real -{2}{U} -Enchantment - Aura -Enchant creature -{U}: Tap enchanted creature. -{U}: Untap enchanted creature. -SOK C - -Freewind Equenaut -{2}{W} -Creature - Human Archer -2/2 -Flying -As long as Freewind Equenaut is enchanted, it has "{T}: Freewind Equenaut deals 2 damage to target attacking or blocking creature." -DIS C - -Freewind Falcon -{1}{W} -Creature - Bird -1/1 -Flying, protection from red -VIS C - -Frenetic Efreet -{1}{U}{R} -Creature - Efreet -2/1 -Flying -{0}: Flip a coin. If you win the flip, Frenetic Efreet phases out. If you lose the flip, sacrifice Frenetic Efreet. (While it's phased out, it's treated as though it doesn't exist. It phases in before you untap during your next untap step.) -MIR R - -Frenetic Efreet Avatar -Vanguard -Hand -1, life -3 -Each permanent you control has phasing. (It phases in or out before you untap during each of your untap steps. While it's phased out, it's treated as though it doesn't exist.) -At the beginning of your end step, flip a coin. If you win the flip, take an extra turn after this one. -VG S - -Frenetic Ogre -{4}{R} -Creature - Ogre -2/3 -{R}, Discard a card at random: Frenetic Ogre gets +3/+0 until end of turn. -ODY U - -Frenetic Raptor -{5}{R} -Creature - Lizard Beast -6/6 -Beasts can't block. -LGN U - -Frenetic Sliver -{1}{U}{R} -Creature - Sliver -2/2 -All Slivers have "{0}: If this permanent is on the battlefield, flip a coin. If you win the flip, exile this permanent and return it to the battlefield under its owner's control at the beginning of the next end step. If you lose the flip, sacrifice it." -PLC U - -Frenzied Goblin -{R} -Creature - Goblin Berserker -1/1 -Whenever Frenzied Goblin attacks, you may pay {R}. If you do, target creature can't block this turn. -RAV U - -Frenzied Tilling -{3}{R}{G} -Sorcery -Destroy target land. Search your library for a basic land card and put that card onto the battlefield tapped. Then shuffle your library. -INV C - -Frenzy Sliver -{1}{B} -Creature - Sliver -1/1 -All Sliver creatures have frenzy 1. (Whenever a Sliver attacks and isn't blocked, it gets +1/+0 until end of turn.) -FUT C, H09 C - -Fresh Meat -{3}{G} -Instant -Put a 3/3 green Beast creature token onto the battlefield for each creature put into your graveyard from the battlefield this turn. -NPH R - -Fresh Volunteers -{1}{W} -Creature - Human Rebel -2/2 -MMQ C - -Freyalise Supplicant -{1}{G} -Creature - Human Cleric -1/1 -{T}, Sacrifice a red or white creature: Freyalise Supplicant deals damage to target creature or player equal to half the sacrificed creature's power, rounded down. -ICE U - -Freyalise's Charm -{G}{G} -Enchantment -Whenever an opponent casts a black spell, you may pay {G}{G}. If you do, you draw a card. -{G}{G}: Return Freyalise's Charm to its owner's hand. -ICE U - -Freyalise's Radiance -{1}{G} -Enchantment -Cumulative upkeep {2} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -Snow permanents don't untap during their controllers' untap steps. -CSP U - -Freyalise's Winds -{2}{G}{G} -Enchantment -Whenever a permanent becomes tapped, put a wind counter on it. -If a permanent with a wind counter on it would untap during its controller's untap step, remove all wind counters from it instead. -ICE R, ME3 R - -Frightcrawler -{1}{B} -Creature - Horror -1/1 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -Threshold - As long as seven or more cards are in your graveyard, Frightcrawler gets +2/+2 and can't block. -ODY C - -Frightshroud Courier -{2}{B} -Creature - Zombie -2/1 -You may choose not to untap Frightshroud Courier during your untap step. -{2}{B}, {T}: Target Zombie creature gets +2/+2 and has fear for as long as Frightshroud Courier remains tapped. (It can't be blocked except by artifact creatures and/or black creatures.) -ONS U - -Frog Tongue -{G} -Enchantment - Aura -Enchant creature -When Frog Tongue enters the battlefield, draw a card. -Enchanted creature has reach. (It can block creatures with flying.) -TMP C - -Frogmite -{4} -Artifact Creature - Frog -2/2 -Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -MRD C, EVT C - -Frogtosser Banneret -{1}{B} -Creature - Goblin Rogue -1/1 -Haste -Goblin spells and Rogue spells you cast cost {1} less to cast. -MOR C - -Frontier Guide -{1}{G} -Creature - Elf Scout -1/1 -{3}{G}, {T}: Search your library for a basic land card and put it onto the battlefield tapped. Then shuffle your library. -ZEN U - -Frontline Sage -{2}{U} -Creature - Human Wizard -0/1 -Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.) -{U}, {T}: Draw a card, then discard a card. -CON C - -Frontline Strategist -{W} -Creature - Human Soldier -1/1 -Morph {W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Frontline Strategist is turned face up, prevent all combat damage non-Soldier creatures would deal this turn. -SCG C - -Frost Breath -{2}{U} -Instant -Tap up to two target creatures. Those creatures don't untap during their controller's next untap step. -M12 C - -Frost Giant -{3}{R}{R}{R} -Creature - Giant -4/4 -Rampage 2 (Whenever this creature becomes blocked, it gets +2/+2 until end of turn for each creature blocking it beyond the first.) -LEG U, ME3 U - -Frost Marsh -Snow Land -Frost Marsh enters the battlefield tapped. -{T}: Add {U} or {B} to your mana pool. -CSP U - -Frost Ogre -{3}{R}{R} -Creature - Ogre Warrior -5/3 -BOK C - -Frost Raptor -{2}{U} -Snow Creature - Bird -2/2 -Flying -{S}{S}: Frost Raptor gains shroud until end of turn. ({S} can be paid with one mana from a snow permanent.) -CSP C - -Frost Titan -{4}{U}{U} -Creature - Giant -6/6 -Whenever Frost Titan becomes the target of a spell or ability an opponent controls, counter that spell or ability unless its controller pays {2}. -Whenever Frost Titan enters the battlefield or attacks, tap target permanent. It doesn't untap during its controller's next untap step. -M11 M, M12 M - -Frostling -{R} -Creature - Spirit -1/1 -Sacrifice Frostling: Frostling deals 1 damage to target creature. -BOK C - -Frostweb Spider -{2}{G} -Snow Creature - Spider -1/3 -Reach (This creature can block creatures with flying.) -Whenever Frostweb Spider blocks a creature with flying, put a +1/+1 counter on Frostweb Spider at end of combat. -CSP C - -Frostwielder -{2}{R}{R} -Creature - Human Shaman -1/2 -{T}: Frostwielder deals 1 damage to target creature or player. -If a creature dealt damage by Frostwielder this turn would die, exile it instead. -CHK C - -Frostwind Invoker -{4}{U} -Creature - Merfolk Wizard -3/3 -Flying -{8}: Creatures you control gain flying until end of turn. -ROE C - -Frozen AEther -{3}{U} -Enchantment -Artifacts, creatures, and lands your opponents control enter the battlefield tapped. -PLC U - -Frozen Shade -{2}{B} -Creature - Shade -0/1 -{B}: Frozen Shade gets +1/+1 until end of turn. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C - -Frozen Solid -{1}{U}{U} -Enchantment - Aura -Enchant creature -Enchanted creature doesn't untap during its controller's untap step. -When enchanted creature is dealt damage, destroy it. -SCG C, CSP C - -Fruition -{G} -Sorcery -You gain 1 life for each Forest on the battlefield. -POR C - -Fuel for the Cause -{2}{U}{U} -Instant -Counter target spell, then proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.) -MBS C - -Fugitive Druid -{3}{G} -Creature - Human Druid -3/2 -Whenever Fugitive Druid becomes the target of an Aura spell, you draw a card. -TMP R - -Fugitive Wizard -{U} -Creature - Human Wizard -1/1 -LGN C, 8ED C, 9ED C, 10E C - -Fugue -{3}{B}{B} -Sorcery -Target player discards three cards. -EXO U, 7ED U - -Fulgent Distraction -{2}{W} -Instant -Choose two target creatures. Tap those creatures, then unattach all Equipment from them. -SOM C - -Fulminator Mage -{1}{B/R}{B/R} -Creature - Elemental Shaman -2/2 -Sacrifice Fulminator Mage: Destroy target nonbasic land. -SHM R - -Fumarole -{3}{B}{R} -Sorcery -As an additional cost to cast Fumarole, pay 3 life. -Destroy target creature and target land. -ICE U, ME2 U - -Fume Spitter -{B} -Creature - Horror -1/1 -Sacrifice Fume Spitter: Put a -1/-1 counter on target creature. -SOM C - -Fumiko the Lowblood -{2}{R}{R} -Legendary Creature - Human Samurai -3/2 -Fumiko the Lowblood has bushido X, where X is the number of attacking creatures. (When this blocks or becomes blocked, it gets +X/+X until end of turn.) -Creatures your opponents control attack each turn if able. -BOK R - -Funeral Charm -{B} -Instant -Choose one - Target player discards a card; or target creature gets +2/-1 until end of turn; or target creature gains swampwalk until end of turn. -VIS C, TSB S - -Funeral March -{1}{B}{B} -Enchantment - Aura -Enchant creature -When enchanted creature leaves the battlefield, its controller sacrifices a creature. -HML C, 5ED C, ME2 C - -Funeral Pyre -{W} -Instant -Exile target card from a graveyard. Its owner puts a 1/1 white Spirit creature token with flying onto the battlefield. -JUD C - -Fungal Behemoth -{3}{G} -Creature - Fungus -*/* -Fungal Behemoth's power and toughness are each equal to the number of +1/+1 counters on creatures you control. -Suspend X-{X}{G}{G}. X can't be 0. (Rather than cast this card from your hand, you may pay {X}{G}{G} and exile it with X time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -Whenever a time counter is removed from Fungal Behemoth while it's exiled, you may put a +1/+1 counter on target creature. -PLC R - -Fungal Bloom -{G}{G} -Enchantment -{G}{G}: Put a spore counter on target Fungus. -FEM R, ME2 R - -Fungal Reaches -Land -{T}: Add {1} to your mana pool. -{1}, {T}: Put a storage counter on Fungal Reaches. -{1}, Remove X storage counters from Fungal Reaches: Add X mana in any combination of {R} and/or {G} to your mana pool. -TSP U, COM U - -Fungal Shambler -{4}{G}{U}{B} -Creature - Fungus Beast -6/4 -Trample -Whenever Fungal Shambler deals damage to an opponent, you draw a card and that opponent discards a card. -PRO R, APC R - -Fungus Elemental -{3}{G} -Creature - Fungus Elemental -3/3 -{G}, Sacrifice a Forest: Put a +2/+2 counter on Fungus Elemental. Activate this ability only if Fungus Elemental entered the battlefield this turn. -WTH R - -Fungus Sliver -{3}{G} -Creature - Fungus Sliver -2/2 -All Sliver creatures have "Whenever this creature is dealt damage, put a +1/+1 counter on it." (The damage is dealt before the counter is put on.) -TSP R, H09 R - -Fungusaur -{3}{G} -Creature - Fungus Lizard -2/2 -Whenever Fungusaur is dealt damage, put a +1/+1 counter on it. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, 8ED R - -Furious Assault -{2}{R} -Enchantment -Whenever you cast a creature spell, Furious Assault deals 1 damage to target player. -MMQ C - -Furnace Brood -{3}{R} -Creature - Elemental -3/3 -{R}: Target creature can't be regenerated this turn. -EXO C - -Furnace Celebration -{1}{R}{R} -Enchantment -Whenever you sacrifice another permanent, you may pay {2}. If you do, Furnace Celebration deals 2 damage to target creature or player. -SOM U - -Furnace Dragon -{6}{R}{R}{R} -Creature - Dragon -5/5 -Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -Flying -When Furnace Dragon enters the battlefield, if you cast it from your hand, exile all artifacts. -DST R - -Furnace Scamp -{R} -Creature - Beast -1/1 -Whenever Furnace Scamp deals combat damage to a player, you may sacrifice it. If you do, Furnace Scamp deals 3 damage to that player. -NPH C - -Furnace Spirit -{2}{R} -Creature - Spirit -1/1 -Haste -{R}: Furnace Spirit gets +1/+0 until end of turn. -STH C - -Furnace Whelp -{2}{R}{R} -Creature - Dragon -2/2 -Flying -{R}: Furnace Whelp gets +1/+0 until end of turn. -5DN U, 10E U, JVC U, ARC U, COM U - -Furnace of Rath -{1}{R}{R}{R} -Enchantment -If a source would deal damage to a creature or player, it deals double that damage to that creature or player instead. -TMP R, 8ED R, 9ED R, 10E R, HOP R - -Fury Charm -{1}{R} -Instant -Choose one - Destroy target artifact; or target creature gets +1/+1 and gains trample until end of turn; or remove two time counters from target permanent or suspended card. -PLC C - -Fury Sliver -{5}{R} -Creature - Sliver -3/3 -All Sliver creatures have double strike. -TSP U, H09 U - -Fury of the Horde -{5}{R}{R} -Sorcery -You may exile two red cards from your hand rather than pay Fury of the Horde's mana cost. -Untap all creatures that attacked this turn. After this main phase, there is an additional combat phase followed by an additional main phase. -CSP R - -Furyborn Hellkite -{4}{R}{R}{R} -Creature - Dragon -6/6 -Bloodthirst 6 (If an opponent was dealt damage this turn, this creature enters the battlefield with six +1/+1 counters on it.) -Flying -M12 M - -Furystoke Giant -{3}{R}{R} -Creature - Giant Warrior -3/3 -When Furystoke Giant enters the battlefield, other creatures you control gain "{T}: This creature deals 2 damage to target creature or player" until end of turn. -Persist (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) -SHM R - -Fusion Elemental -{W}{U}{B}{R}{G} -Creature - Elemental -8/8 -CON U - -Future Sight -{2}{U}{U}{U} -Enchantment -Play with the top card of your library revealed. -You may play the top card of your library. -ONS R - -Fylamarid -{1}{U}{U} -Creature - Squid Beast -1/3 -Flying -Fylamarid can't be blocked by blue creatures. -{U}: Target creature becomes blue until end of turn. -TMP U - -Fylgja -{W} -Enchantment - Aura -Enchant creature -Fylgja enters the battlefield with four healing counters on it. -Remove a healing counter from Fylgja: Prevent the next 1 damage that would be dealt to enchanted creature this turn. -{2}{W}: Put a healing counter on Fylgja. -ICE C - -Fyndhorn Bow -{2} -Artifact -{3}, {T}: Target creature gains first strike until end of turn. -ICE U - -Fyndhorn Brownie -{2}{G} -Creature - Ouphe -1/1 -{2}{G}, {T}: Untap target creature. -ICE C, 6ED C - -Fyndhorn Druid -{2}{G} -Creature - Elf Druid -2/2 -When Fyndhorn Druid dies, if it was blocked this turn, you gain 4 life. -ALL C (x2) - -Fyndhorn Elder -{2}{G} -Creature - Elf Druid -1/1 -{T}: Add {G}{G} to your mana pool. -ICE U, 5ED U, 6ED U, 7ED U, 8ED U - -Fyndhorn Elves -{G} -Creature - Elf Druid -1/1 -{T}: Add {G} to your mana pool. -ICE C, MED C - -Fyndhorn Pollen -{2}{G} -Enchantment -Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -All creatures get -1/-0. -{1}{G}: All creatures get -1/-0 until end of turn. -ICE R, ME2 R - -Gabriel Angelfire -{3}{G}{G}{W}{W} -Legendary Creature - Angel -4/4 -At the beginning of your upkeep, choose flying, first strike, trample, or rampage 3. Gabriel Angelfire gains that ability until your next upkeep. (Whenever a creature with rampage 3 becomes blocked, it gets +3/+3 until end of turn for each creature blocking it beyond the first.) -LEG R, CHR R, ME3 R - -Gaddock Teeg -{G}{W} -Legendary Creature - Kithkin Advisor -2/2 -Noncreature spells with converted mana cost 4 or greater can't be cast. -Noncreature spells with {X} in their mana costs can't be cast. -LRW R - -Gaea's Anthem -{1}{G}{G} -Enchantment -Creatures you control get +1/+1. -PLC R - -Gaea's Avenger -{1}{G}{G} -Creature - Treefolk -1+*/1+* -Gaea's Avenger's power and toughness are each equal to 1 plus the number of artifacts your opponents control. -ATQ R, ME4 U - -Gaea's Balance -{3}{G} -Sorcery -As an additional cost to cast Gaea's Balance, sacrifice five lands. -Search your library for a land card of each basic land type and put them onto the battlefield. Then shuffle your library. -APC U - -Gaea's Blessing -{1}{G} -Sorcery -Target player shuffles up to three target cards from his or her graveyard into his or her library. -Draw a card. -When Gaea's Blessing is put into your graveyard from your library, shuffle your graveyard into your library. -WTH U, TSB S - -Gaea's Bounty -{2}{G} -Sorcery -Search your library for up to two Forest cards, reveal those cards, and put them into your hand. Then shuffle your library. -USG C - -Gaea's Cradle -Legendary Land -{T}: Add {G} to your mana pool for each creature you control. -USG R - -Gaea's Embrace -{2}{G}{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +3/+3 and has trample. -{G}: Regenerate enchanted creature. -USG U - -Gaea's Herald -{1}{G} -Creature - Elf -1/1 -Creature spells can't be countered. -PLS R, 8ED R, 10E R - -Gaea's Liege -{3}{G}{G}{G} -Creature - Avatar -*/* -As long as Gaea's Liege isn't attacking, its power and toughness are each equal to the number of Forests you control. As long as Gaea's Liege is attacking, its power and toughness are each equal to the number of Forests defending player controls. -{T}: Target land becomes a Forest until Gaea's Liege leaves the battlefield. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, TSB S - -Gaea's Might -{G} -Instant -Domain - Target creature gets +1/+1 until end of turn for each basic land type among lands you control. -PLS C - -Gaea's Revenge -{5}{G}{G} -Creature - Elemental -8/5 -Gaea's Revenge can't be countered. -Haste -Gaea's Revenge can't be the target of nongreen spells or abilities from nongreen sources. -M11 M - -Gaea's Skyfolk -{G}{U} -Creature - Elf Merfolk -2/2 -Flying -APC C - -Gaea's Touch -{G}{G} -Enchantment -You may play an additional land during your turn if that land is a basic Forest. -Sacrifice Gaea's Touch: Add {G}{G} to your mana pool. -DRK C, ME3 U - -Gainsay -{1}{U} -Instant -Counter target blue spell. -PLS U - -Gale Force -{4}{G} -Sorcery -Gale Force deals 5 damage to each creature with flying. -CHK U - -Galepowder Mage -{3}{W} -Creature - Kithkin Wizard -3/3 -Flying -Whenever Galepowder Mage attacks, exile another target creature. Return that card to the battlefield under its owner's control at the beginning of the next end step. -LRW R - -Galina's Knight -{W}{U} -Creature - Merfolk Knight -2/2 -Protection from red -INV C - -Gallantry -{1}{W} -Instant -Target blocking creature gets +4/+4 until end of turn. -Draw a card. -TMP U, ODY U - -Gallowbraid -{3}{B}{B} -Legendary Creature - Horror -5/5 -Trample -Cumulative upkeep-Pay 1 life. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -WTH R - -Galvanic Arc -{2}{R} -Enchantment - Aura -Enchant creature -When Galvanic Arc enters the battlefield, it deals 3 damage to target creature or player. -Enchanted creature has first strike. -RAV C - -Galvanic Blast -{R} -Instant -Galvanic Blast deals 2 damage to target creature or player. -Metalcraft - Galvanic Blast deals 4 damage to that creature or player instead if you control three or more artifacts. -SOM C - -Galvanic Key -{2} -Artifact -Flash -{3}, {T}: Untap target artifact. -MRD C - -Galvanoth -{3}{R}{R} -Creature - Beast -3/3 -At the beginning of your upkeep, you may look at the top card of your library. If it's an instant or sorcery card, you may cast it without paying its mana cost. -MBS R - -Gamble -{R} -Sorcery -Search your library for a card, put that card into your hand, discard a card at random, then shuffle your library. -USG R - -Game Preserve -{2}{G} -Enchantment -At the beginning of your upkeep, each player reveals the top card of his or her library. If all cards revealed this way are creature cards, put those cards onto the battlefield under their owners' control. -MMQ R - -Game of Chaos -{R}{R}{R} -Sorcery -Flip a coin. If you win the flip, you gain 1 life and target opponent loses 1 life, and you decide whether to flip again. If you lose the flip, you lose 1 life and that opponent gains 1 life, and that player decides whether to flip again. Double the life stakes with each flip. -ICE R, 5ED R - -Game-Trail Changeling -{3}{G}{G} -Creature - Shapeshifter -4/4 -Changeling (This card is every creature type at all times.) -Trample -MOR C - -Gamekeeper -{3}{G} -Creature - Elf -2/2 -When Gamekeeper dies, you may exile it. If you do, reveal cards from the top of your library until you reveal a creature card. Put that card onto the battlefield and put all other cards revealed this way into your graveyard. -UDS U - -Gang of Elk -{5}{G} -Creature - Elk Beast -5/4 -Whenever Gang of Elk becomes blocked, it gets +2/+2 until end of turn for each creature blocking it. -ULG U, 7ED U - -Gangrenous Goliath -{3}{B}{B} -Creature - Zombie Giant -4/4 -Tap three untapped Clerics you control: Return Gangrenous Goliath from your graveyard to your hand. -ONS R - -Gangrenous Zombies -{1}{B}{B} -Creature - Zombie -2/2 -{T}, Sacrifice Gangrenous Zombies: Gangrenous Zombies deals 1 damage to each creature and each player. If you control a snow Swamp, Gangrenous Zombies deals 2 damage to each creature and each player instead. -ICE C, ME2 C - -Gargantuan Gorilla -{4}{G}{G}{G} -Creature - Ape -7/7 -At the beginning of your upkeep, you may sacrifice a Forest. If you sacrifice a snow Forest this way, Gargantuan Gorilla gains trample until end of turn. If you don't sacrifice a Forest, sacrifice Gargantuan Gorilla and it deals 7 damage to you. -{T}: Gargantuan Gorilla deals damage equal to its power to another target creature. That creature deals damage equal to its power to Gargantuan Gorilla. -ALL R, MED R - -Gargoyle Castle -Land -{T}: Add {1} to your mana pool. -{5}, {T}, Sacrifice Gargoyle Castle: Put a 3/4 colorless Gargoyle artifact creature token with flying onto the battlefield. -M10 R - -Gargoyle Sentinel -{3} -Artifact Creature - Gargoyle -3/3 -Defender (This creature can't attack.) -{3}: Until end of turn, Gargoyle Sentinel loses defender and gains flying. -M11 U - -Garruk Wildspeaker -{2}{G}{G} -Planeswalker - Garruk -3 -[+1] Untap two target lands. -[-1] Put a 3/3 green Beast creature token onto the battlefield. -[-4] Creatures you control get +3/+3 and gain trample until end of turn. -LRW R, M10 M, GVL M, M11 M, COM M - -Garruk's Companion -{G}{G} -Creature - Beast -3/2 -Trample (If this creature would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.) -M11 C, M12 C - -Garruk's Horde -{5}{G}{G} -Creature - Beast -7/7 -Trample -Play with the top card of your library revealed. -You may cast the top card of your library if it's a creature card. (Do this only any time you could cast that creature card. You still pay the spell's costs.) -M12 R - -Garruk's Packleader -{4}{G} -Creature - Beast -4/4 -Whenever another creature with power 3 or greater enters the battlefield under your control, you may draw a card. -M11 U - -Garruk, Primal Hunter -{2}{G}{G}{G} -Planeswalker - Garruk -3 -[+1] Put a 3/3 green Beast creature token onto the battlefield. -[-3] Draw cards equal to the greatest power among creatures you control. -[-6] Put a 6/6 green Wurm creature token onto the battlefield for each land you control. -M12 M - -Garza Zol, Plague Queen -{4}{U}{B}{R} -Legendary Creature - Vampire -5/5 -Flying, haste -Whenever a creature dealt damage by Garza Zol, Plague Queen this turn dies, put a +1/+1 counter on Garza Zol. -Whenever Garza Zol deals combat damage to a player, you may draw a card. -CSP R - -Garza's Assassin -{B}{B}{B} -Creature - Human Assassin -2/2 -Sacrifice Garza's Assassin: Destroy target nonblack creature. -Recover-Pay half your life, rounded up. (When another creature is put into your graveyard from the battlefield, you may pay half your life, rounded up. If you do, return this card from your graveyard to your hand. Otherwise, exile this card.) -CSP R - -Gaseous Form -{2}{U} -Enchantment - Aura -Enchant creature -Prevent all combat damage that would be dealt to and dealt by enchanted creature. -LEG C, 4ED C, 5ED C, TMP C, 6ED C, BTD C - -Gate Hound -{2}{W} -Creature - Hound -1/1 -Creatures you control have vigilance as long as Gate Hound is enchanted. -RAV C - -Gate to Phyrexia -{B}{B} -Enchantment -Sacrifice a creature: Destroy target artifact. Activate this ability only during your upkeep and only once each turn. -ATQ U, ME4 U - -Gate to the AEther -{6} -Artifact -At the beginning of each player's upkeep, that player reveals the top card of his or her library. If it's an artifact, creature, enchantment, or land card, the player may put it onto the battlefield. -MRD R - -Gatekeeper of Malakir -{B}{B} -Creature - Vampire Warrior -2/2 -Kicker {B} (You may pay an additional {B} as you cast this spell.) -When Gatekeeper of Malakir enters the battlefield, if it was kicked, target player sacrifices a creature. -ZEN U - -Gathan Raiders -{3}{R}{R} -Creature - Human Warrior -3/3 -Hellbent - Gathan Raiders gets +2/+2 if you have no cards in hand. -Morph-Discard a card. (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -FUT C, ARC C - -Gather Courage -{G} -Instant -Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.) -Target creature gets +2/+2 until end of turn. -RAV C - -Gather Specimens -{3}{U}{U}{U} -Instant -If a creature would enter the battlefield under an opponent's control this turn, it enters the battlefield under your control instead. -ALA R - -Gatherer of Graces -{1}{G} -Creature - Human Druid -1/2 -Gatherer of Graces gets +1/+1 for each Aura attached to it. -Sacrifice an Aura: Regenerate Gatherer of Graces. -GPT U - -Gauntlet of Might -{4} -Artifact -Red creatures get +1/+1. -Whenever a Mountain is tapped for mana, its controller adds {R} to his or her mana pool (in addition to the mana the land produces). -LEA R, LEB R, 2ED R, ME4 R - -Gauntlet of Power -{5} -Artifact -As Gauntlet of Power enters the battlefield, choose a color. -Creatures of the chosen color get +1/+1. -Whenever a basic land is tapped for mana of the chosen color, its controller adds one mana of that color to his or her mana pool (in addition to the mana the land produces). -TSP R - -Gauntlets of Chaos -{5} -Artifact -{5}, Sacrifice Gauntlets of Chaos: Exchange control of target artifact, creature, or land you control and target permanent an opponent controls that shares one of those types with it. If those permanents are exchanged this way, destroy all Auras attached to them. -LEG R, CHR R, 5ED R, ME3 R - -Gaze of Adamaro -{2}{R}{R} -Instant - Arcane -Gaze of Adamaro deals damage equal to the number of cards in target player's hand to that player. -SOK U - -Gaze of Justice -{W} -Sorcery -As an additional cost to cast Gaze of Justice, tap three untapped white creatures you control. -Exile target creature. -Flashback {5}{W} (You may cast this card from your graveyard for its flashback cost and any additional costs. Then exile it.) -TSP C - -Gaze of Pain -{1}{B} -Sorcery -Until end of turn, whenever a creature you control attacks and isn't blocked, you may choose to have it deal damage equal to its power to a target creature. If you do, it assigns no combat damage this turn. -ICE C - -Gaze of the Gorgon -{3}{B/G} -Instant -({B/G} can be paid with either {B} or {G}.) -Regenerate target creature. At end of combat, destroy all creatures that blocked or were blocked by that creature this turn. -RAV C - -Gelatinous Genesis -{X}{X}{G} -Sorcery -Put X X/X green Ooze creature tokens onto the battlefield. -ROE R - -Gelectrode -{1}{U}{R} -Creature - Weird -0/1 -{T}: Gelectrode deals 1 damage to target creature or player. -Whenever you cast an instant or sorcery spell, you may untap Gelectrode. -GPT U - -Gelid Shackles -{W} -Snow Enchantment - Aura -Enchant creature -Enchanted creature can't block, and its activated abilities can't be activated. -{S}: Enchanted creature gains defender until end of turn. ({S} can be paid with one mana from a snow permanent.) -CSP C - -Gem Bazaar -Land -As Gem Bazaar enters the battlefield, choose a color at random. -{T}: Add one mana of the last chosen color to your mana pool. Then choose a color at random. -ASTRAL S - -Gemhide Sliver -{1}{G} -Creature - Sliver -1/1 -All Slivers have "{T}: Add one mana of any color to your mana pool." -TSP C, H09 C - -Gemini Engine -{6} -Artifact Creature - Construct -3/4 -Whenever Gemini Engine attacks, put a colorless Construct artifact creature token named Twin onto the battlefield attacking. Its power is equal to Gemini Engine's power and its toughness is equal to Gemini Engine's toughness. Sacrifice the token at end of combat. -DST R - -Gempalm Avenger -{5}{W} -Creature - Human Soldier -3/5 -Cycling {2}{W} ({2}{W}, Discard this card: Draw a card.) -When you cycle Gempalm Avenger, Soldier creatures get +1/+1 and gain first strike until end of turn. -LGN C - -Gempalm Incinerator -{2}{R} -Creature - Goblin -2/1 -Cycling {1}{R} ({1}{R}, Discard this card: Draw a card.) -When you cycle Gempalm Incinerator, you may have it deal X damage to target creature, where X is the number of Goblins on the battlefield. -LGN U, EVG U - -Gempalm Polluter -{5}{B} -Creature - Zombie -4/3 -Cycling {B}{B} ({B}{B}, Discard this card: Draw a card.) -When you cycle Gempalm Polluter, you may have target player lose life equal to the number of Zombies on the battlefield. -LGN C - -Gempalm Sorcerer -{2}{U} -Creature - Human Wizard -2/2 -Cycling {2}{U} ({2}{U}, Discard this card: Draw a card.) -When you cycle Gempalm Sorcerer, Wizard creatures gain flying until end of turn. -LGN U - -Gempalm Strider -{1}{G} -Creature - Elf -2/2 -Cycling {2}{G}{G} ({2}{G}{G}, Discard this card: Draw a card.) -When you cycle Gempalm Strider, Elf creatures get +2/+2 until end of turn. -LGN U, EVG U - -Gemstone Array -{4} -Artifact -{2}: Put a charge counter on Gemstone Array. -Remove a charge counter from Gemstone Array: Add one mana of any color to your mana pool. -5DN U - -Gemstone Caverns -Legendary Land -If Gemstone Caverns is in your opening hand and you're not playing first, you may begin the game with Gemstone Caverns on the battlefield with a luck counter on it. If you do, exile a card from your hand. -{T}: Add {1} to your mana pool. If Gemstone Caverns has a luck counter on it, instead add one mana of any color to your mana pool. -TSP R - -Gemstone Mine -Land -Gemstone Mine enters the battlefield with three mining counters on it. -{T}, Remove a mining counter from Gemstone Mine: Add one mana of any color to your mana pool. If there are no mining counters on Gemstone Mine, sacrifice it. -WTH U, TSB S - -General Jarkeld -{3}{W} -Legendary Creature - Human Soldier -1/2 -{T}: Switch the blocking creatures of two target attacking creatures. Activate this ability only during the declare blockers step. -ICE R - -General's Kabuto -{4} -Artifact - Equipment -Equipped creature has shroud. (It can't be the target of spells or abilities.) -Prevent all combat damage that would be dealt to equipped creature. -Equip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) -CHK R - -General's Regalia -{3} -Artifact -{3}: The next time a source of your choice would deal damage to you this turn, that damage is dealt to target creature you control instead. -MMQ R - -Genesis -{4}{G} -Creature - Incarnation -4/4 -At the beginning of your upkeep, if Genesis is in your graveyard, you may pay {2}{G}. If you do, return target creature card from your graveyard to your hand. -JUD R - -Genesis Chamber -{2} -Artifact -Whenever a nontoken creature enters the battlefield, if Genesis Chamber is untapped, that creature's controller puts a 1/1 colorless Myr artifact creature token onto the battlefield. -DST U - -Genesis Wave -{X}{G}{G}{G} -Sorcery -Reveal the top X cards of your library. You may put any number of permanent cards with converted mana cost X or less from among them onto the battlefield. Then put all cards revealed this way that weren't put onto the battlefield into your graveyard. -SOM R - -Genju of the Cedars -{G} -Enchantment - Aura -Enchant Forest -{2}: Enchanted Forest becomes a 4/4 green Spirit creature until end of turn. It's still a land. -When enchanted Forest is put into a graveyard, you may return Genju of the Cedars from your graveyard to your hand. -BOK U, GVL U - -Genju of the Falls -{U} -Enchantment - Aura -Enchant Island -{2}: Enchanted Island becomes a 3/2 blue Spirit creature with flying until end of turn. It's still a land. -When enchanted Island is put into a graveyard, you may return Genju of the Falls from your graveyard to your hand. -BOK U - -Genju of the Fens -{B} -Enchantment - Aura -Enchant Swamp -{2}: Until end of turn, enchanted Swamp becomes a 2/2 black Spirit creature with "{B}: This creature gets +1/+1 until end of turn." It's still a land. -When enchanted Swamp is put into a graveyard, you may return Genju of the Fens from your graveyard to your hand. -BOK U, GVL U - -Genju of the Fields -{W} -Enchantment - Aura -Enchant Plains -{2}: Until end of turn, enchanted Plains becomes a 2/5 white Spirit creature with "Whenever this creature deals damage, its controller gains that much life." It's still a land. -When enchanted Plains is put into a graveyard, you may return Genju of the Fields from your graveyard to your hand. -BOK U - -Genju of the Realm -{W}{U}{B}{R}{G} -Legendary Enchantment - Aura -Enchant land -{2}: Enchanted land becomes a legendary 8/12 Spirit creature with trample until end of turn. It's still a land. -When enchanted land is put into a graveyard, you may return Genju of the Realm from your graveyard to your hand. -BOK R - -Genju of the Spires -{R} -Enchantment - Aura -Enchant Mountain -{2}: Enchanted Mountain becomes a 6/1 red Spirit creature until end of turn. It's still a land. -When enchanted Mountain is put into a graveyard, you may return Genju of the Spires from your graveyard to your hand. -BOK U - -Geosurge -{R}{R}{R}{R} -Sorcery -Add {R}{R}{R}{R}{R}{R}{R} to your mana pool. Spend this mana only to cast artifact or creature spells. -NPH U - -Geothermal Crevice -Land -Geothermal Crevice enters the battlefield tapped. -{T}: Add {R} to your mana pool. -{T}, Sacrifice Geothermal Crevice: Add {B}{G} to your mana pool. -INV C - -Gerrard -Vanguard -Hand -4, life +0 -At the beginning of your draw step, draw an additional card. -VG S - -Gerrard Capashen -{3}{W}{W} -Legendary Creature - Human Soldier -3/4 -At the beginning of your upkeep, you gain 1 life for each card in target opponent's hand. -{3}{W}: Tap target creature. Activate this ability only if Gerrard Capashen is attacking. -APC R, PVC R - -Gerrard's Battle Cry -{W} -Enchantment -{2}{W}: Creatures you control get +1/+1 until end of turn. -TMP R - -Gerrard's Command -{G}{W} -Instant -Untap target creature. It gets +3/+3 until end of turn. -PLS C, PVC C - -Gerrard's Irregulars -{4}{R} -Creature - Human Soldier -4/2 -Trample, haste -MMQ C - -Gerrard's Verdict -{W}{B} -Sorcery -Target player discards two cards. You gain 3 life for each land card discarded this way. -APC U - -Gerrard's Wisdom -{2}{W}{W} -Sorcery -You gain 2 life for each card in your hand. -WTH U, S99 R, 7ED U - -Geth's Grimoire -{4} -Artifact -Whenever an opponent discards a card, you may draw a card. -DST U - -Geth's Verdict -{B}{B} -Instant -Target player sacrifices a creature and loses 1 life. -NPH C - -Geth, Lord of the Vault -{4}{B}{B} -Legendary Creature - Zombie -5/5 -Intimidate -{X}{B}: Put target artifact or creature card with converted mana cost X from an opponent's graveyard onto the battlefield under your control tapped. Then that player puts the top X cards of his or her library into his or her graveyard. -SOM M - -Geyser Glider -{3}{R}{R} -Creature - Elemental Beast -4/4 -Landfall - Whenever a land enters the battlefield under your control, Geyser Glider gains flying until end of turn. -ZEN U - -Ghalma's Warden -{3}{W} -Creature - Elephant Soldier -2/4 -Metalcraft - Ghalma's Warden gets +2/+2 as long as you control three or more artifacts. -SOM C - -Ghastlord of Fugue -{U/B}{U/B}{U/B}{U/B}{U/B} -Creature - Spirit Avatar -4/4 -Ghastlord of Fugue is unblockable. -Whenever Ghastlord of Fugue deals combat damage to a player, that player reveals his or her hand. You choose a card from it. That player exiles that card. -SHM R - -Ghastly Demise -{B} -Instant -Destroy target nonblack creature if its toughness is less than or equal to the number of cards in your graveyard. -ODY C - -Ghastly Discovery -{2}{U} -Sorcery -Draw two cards, then discard a card. -Conspire (As you cast this spell, you may tap two untapped creatures you control that share a color with it. When you do, copy it.) -SHM C - -Ghastly Remains -{B}{B}{B} -Creature - Zombie -0/0 -Amplify 1 (As this creature enters the battlefield, put a +1/+1 counter on it for each Zombie card you reveal in your hand.) -At the beginning of your upkeep, if Ghastly Remains is in your graveyard, you may pay {B}{B}{B}. If you do, return Ghastly Remains to your hand. -LGN R - -Ghave, Guru of Spores -{2}{B}{G}{W} -Legendary Creature - Fungus Shaman -0/0 -Ghave, Guru of Spores enters the battlefield with five +1/+1 counters on it. -{1}, Remove a +1/+1 counter from a creature you control: Put a 1/1 green Saproling creature token onto the battlefield. -{1}, Sacrifice a creature: Put a +1/+1 counter on target creature. -COM M - -Ghazban Ogre -{G} -Creature - Ogre -2/2 -At the beginning of your upkeep, if a player has more life than each other player, the player with the most life gains control of Ghazban Ogre. -ARN C, CHR C, 5ED C, MED C - -Ghitu Encampment -Land -Ghitu Encampment enters the battlefield tapped. -{T}: Add {R} to your mana pool. -{1}{R}: Ghitu Encampment becomes a 2/1 red Warrior creature with first strike until end of turn. It's still a land. (It deals combat damage before creatures without first strike.) -ULG U, 10E U, H10 U - -Ghitu Fire -{X}{R} -Sorcery -You may cast Ghitu Fire any time you could cast an instant if you pay {2} more to cast it. -Ghitu Fire deals X damage to target creature or player. -INV R - -Ghitu Fire-Eater -{2}{R} -Creature - Human Nomad -2/2 -{T}, Sacrifice Ghitu Fire-Eater: Ghitu Fire-Eater deals damage equal to its power to target creature or player. -ULG U, 7ED U - -Ghitu Firebreathing -{1}{R} -Enchantment - Aura -Flash (You may cast this spell any time you could cast an instant.) -Enchant creature -{R}: Enchanted creature gets +1/+0 until end of turn. -{R}: Return Ghitu Firebreathing to its owner's hand. -TSP C - -Ghitu Slinger -{2}{R} -Creature - Human Nomad -2/2 -Echo {2}{R} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -When Ghitu Slinger enters the battlefield, it deals 2 damage to target creature or player. -ULG C - -Ghitu War Cry -{2}{R} -Enchantment -{R}: Target creature gets +1/+0 until end of turn. -ULG U - -Ghor-Clan Bloodscale -{3}{R} -Creature - Viashino Warrior -2/1 -First strike -{3}{G}: Ghor-Clan Bloodscale gets +2/+2 until end of turn. Activate this ability only once each turn. -GPT U - -Ghor-Clan Savage -{3}{G}{G} -Creature - Centaur Berserker -2/3 -Bloodthirst 3 (If an opponent was dealt damage this turn, this creature enters the battlefield with three +1/+1 counters on it.) -GPT C - -Ghost Council of Orzhova -{W}{W}{B}{B} -Legendary Creature - Spirit -4/4 -When Ghost Council of Orzhova enters the battlefield, target opponent loses 1 life and you gain 1 life. -{1}, Sacrifice a creature: Exile Ghost Council of Orzhova. Return it to the battlefield under its owner's control at the beginning of the next end step. -GPT R - -Ghost Hounds -{1}{B} -Creature - Hound Spirit -1/1 -Vigilance -Whenever Ghost Hounds blocks or becomes blocked by a white creature, Ghost Hounds gains first strike until end of turn. -HML U - -Ghost Quarter -Land -{T}: Add {1} to your mana pool. -{T}, Sacrifice Ghost Quarter: Destroy target land. Its controller may search his or her library for a basic land card, put it onto the battlefield, then shuffle his or her library. -DIS U - -Ghost Ship -{2}{U}{U} -Creature - Spirit -2/4 -Flying -{U}{U}{U}: Regenerate Ghost Ship. -DRK C, 4ED U, TSB S - -Ghost Tactician -{4}{W} -Creature - Spirit Spellshaper -2/5 -{W}, {T}, Discard a card: Creatures you control get +1/+0 until end of turn. -PLC C - -Ghost Town -Land -{T}: Add {1} to your mana pool. -{0}: Return Ghost Town to its owner's hand. Activate this ability only if it's not your turn. -TMP U - -Ghost Warden -{1}{W} -Creature - Spirit -1/1 -{T}: Target creature gets +1/+1 until end of turn. -GPT C, 10E C - -Ghost-Lit Nourisher -{2}{G} -Creature - Spirit -2/1 -{2}{G}, {T}: Target creature gets +2/+2 until end of turn. -Channel - {3}{G}, Discard Ghost-Lit Nourisher: Target creature gets +4/+4 until end of turn. -SOK U - -Ghost-Lit Raider -{2}{R} -Creature - Spirit -2/1 -{2}{R}, {T}: Ghost-Lit Raider deals 2 damage to target creature. -Channel - {3}{R}, Discard Ghost-Lit Raider: Ghost-Lit Raider deals 4 damage to target creature. -SOK U - -Ghost-Lit Redeemer -{W} -Creature - Spirit -1/1 -{W}, {T}: You gain 2 life. -Channel - {1}{W}, Discard Ghost-Lit Redeemer: You gain 4 life. -SOK U - -Ghost-Lit Stalker -{B} -Creature - Spirit -1/1 -{4}{B}, {T}: Target player discards two cards. Activate this ability only any time you could cast a sorcery. -Channel - {5}{B}{B}, Discard Ghost-Lit Stalker: Target player discards four cards. Activate this ability only any time you could cast a sorcery. -SOK U, GVL U - -Ghost-Lit Warder -{1}{U} -Creature - Spirit -1/1 -{3}{U}, {T}: Counter target spell unless its controller pays {2}. -Channel - {3}{U}, Discard Ghost-Lit Warder: Counter target spell unless its controller pays {4}. -SOK U - -Ghostfire -{2}{R} -Instant -Ghostfire is colorless. -Ghostfire deals 3 damage to target creature or player. -FUT C, DDG C - -Ghostflame Sliver -{B}{R} -Creature - Sliver -2/2 -All Slivers are colorless. -TSP U - -Ghosthelm Courier -{2}{U} -Creature - Human Wizard -2/1 -You may choose not to untap Ghosthelm Courier during your untap step. -{2}{U}, {T}: Target Wizard creature gets +2/+2 and has shroud for as long as Ghosthelm Courier remains tapped. (It can't be the target of spells or abilities.) -ONS U - -Ghostly Changeling -{2}{B} -Creature - Shapeshifter -2/2 -Changeling (This card is every creature type at all times.) -{1}{B}: Ghostly Changeling gets +1/+1 until end of turn. -LRW U - -Ghostly Flame -{B}{R} -Enchantment -Black and/or red permanents and spells are colorless sources of damage. -ICE R - -Ghostly Prison -{2}{W} -Enchantment -Creatures can't attack you unless their controller pays {2} for each creature he or she controls that's attacking you. -CHK U, COM U - -Ghostly Visit -{2}{B} -Sorcery -Destroy target nonblack creature. -PTK C, ME3 C - -Ghostly Wings -{1}{U} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+1 and has flying. -Discard a card: Return enchanted creature to its owner's hand. -TOR C - -Ghosts of the Damned -{1}{B}{B} -Creature - Spirit -0/2 -{T}: Target creature gets -1/-0 until end of turn. -LEG C, ME3 C - -Ghosts of the Innocent -{5}{W}{W} -Creature - Spirit -4/5 -If a source would deal damage to a creature or player, it deals half that damage, rounded down, to that creature or player instead. -RAV R - -Ghostway -{2}{W} -Instant -Exile each creature you control. Return those cards to the battlefield under their owner's control at the beginning of the next end step. -GPT R - -Ghoul's Feast -{1}{B} -Instant -Target creature gets +X/+0 until end of turn, where X is the number of creature cards in your graveyard. -MMQ U - -Giant Albatross -{1}{U} -Creature - Bird -1/1 -Flying -When Giant Albatross dies, you may pay {1}{U}. If you do, for each creature that dealt damage to Giant Albatross this turn, destroy that creature unless its controller pays 2 life. A creature destroyed this way can't be regenerated. -HML C (x2) - -Giant Ambush Beetle -{3}{B/G}{R} -Creature - Insect -4/3 -Haste -When Giant Ambush Beetle enters the battlefield, you may have target creature block it this turn if able. -ARB U - -Giant Badger -{1}{G}{G} -Creature - Badger -2/2 -Whenever Giant Badger blocks, it gets +2/+2 until end of turn. -PRO S, 8ED C - -Giant Caterpillar -{3}{G} -Creature - Insect -3/3 -{G}, Sacrifice Giant Caterpillar: Put a 1/1 green Insect creature token with flying named Butterfly onto the battlefield at the beginning of the next end step. -VIS C, MMQ C - -Giant Cockroach -{3}{B} -Creature - Insect -4/2 -ULG C, 7ED C, 8ED C, 9ED C - -Giant Crab -{4}{U} -Creature - Crab -3/3 -{U}: Giant Crab gains shroud until end of turn. (It can't be the target of spells or abilities.) -TMP C, BTD C - -Giant Dustwasp -{3}{G}{G} -Creature - Insect -3/3 -Flying -Suspend 4-{1}{G} (Rather than cast this card from your hand, you may pay {1}{G} and exile it with four time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -PLC C - -Giant Growth -{G} -Instant -Target creature gets +3/+3 until end of turn. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, ICE C, 5ED C, 6ED C, BRB C, S00 C, BTD C, 7ED C, 8ED C, 9ED C, 10E C, EVG C, ME2 C, M10 C, ME3 C, GVL C, M11 C, ME4 C - -Giant Harbinger -{4}{R} -Creature - Giant Shaman -3/4 -When Giant Harbinger enters the battlefield, you may search your library for a Giant card, reveal it, then shuffle your library and put that card on top of it. -LRW U - -Giant Mantis -{3}{G} -Creature - Insect -2/4 -Reach (This creature can block creatures with flying.) -MIR C - -Giant Octopus -{3}{U} -Creature - Octopus -3/3 -POR C, S99 C, S00 C, 7ED C, 8ED C, 9ED C - -Giant Oyster -{2}{U}{U} -Creature - Oyster -0/3 -You may choose not to untap Giant Oyster during your untap step. -{T}: For as long as Giant Oyster remains tapped, target tapped creature doesn't untap during its controller's untap step, and at the beginning of each of your draw steps, put a -1/-1 counter on that creature. When Giant Oyster leaves the battlefield or becomes untapped, remove all -1/-1 counters from the creature. -HML U, TSB S - -Giant Scorpion -{2}{B} -Creature - Scorpion -1/3 -Deathtouch (Any amount of damage this deals to a creature is enough to destroy it.) -ZEN C - -Giant Shark -{5}{U} -Creature - Fish -4/4 -Giant Shark can't attack unless defending player controls an Island. -Whenever Giant Shark blocks or becomes blocked by a creature that has been dealt damage this turn, Giant Shark gets +2/+0 and gains trample until end of turn. -When you control no Islands, sacrifice Giant Shark. -DRK C - -Giant Slug -{1}{B} -Creature - Slug -1/1 -{5}: At the beginning of your next upkeep, choose a basic land type. Giant Slug gains landwalk of the chosen type until the end of that turn. -LEG C, CHR C - -Giant Solifuge -{2}{R/G}{R/G} -Creature - Insect -4/1 -({R/G} can be paid with either {R} or {G}.) -Trample; haste; shroud (This permanent can't be the target of spells or abilities.) -GPT R - -Giant Spider -{3}{G} -Creature - Spider -2/4 -Reach (This creature can block creatures with flying.) -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, POR C, 6ED C, 7ED C, 8ED C, 9ED C, 10E C, M10 C, M11 C, M12 C - -Giant Strength -{R}{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2. -LEG C, 4ED C, 5ED C, TMP C, 6ED C - -Giant Tortoise -{1}{U} -Creature - Turtle -1/1 -Giant Tortoise gets +0/+3 as long as it's untapped. -ARN C (x2), 4ED C, MED C, ME4 C - -Giant Trap Door Spider -{1}{R}{G} -Creature - Spider -2/3 -{1}{R}{G}, {T}: Exile Giant Trap Door Spider and target creature without flying that's attacking you. -ICE U, ME2 U - -Giant Turtle -{1}{G}{G} -Creature - Turtle -2/4 -Giant Turtle can't attack if it attacked during your last turn. -LEG C - -Giant Warthog -{5}{G} -Creature - Boar Beast -5/5 -Trample -JUD C - -Giant's Ire -{3}{R} -Tribal Sorcery - Giant -Giant's Ire deals 4 damage to target player. If you control a Giant, draw a card. -LRW C - -Giantbaiting -{2}{R/G} -Sorcery -Put a 4/4 red and green Giant Warrior creature token with haste onto the battlefield. Exile it at the beginning of the next end step. -Conspire (As you cast this spell, you may tap two untapped creatures you control that share a color with it. When you do, copy it.) -SHM C - -Gibbering Descent -{4}{B}{B} -Enchantment -At the beginning of each player's upkeep, that player loses 1 life and discards a card. -Hellbent - Skip your upkeep step if you have no cards in hand. -Madness {2}{B}{B} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -FUT R - -Gibbering Hyenas -{2}{G} -Creature - Hyena -3/2 -Gibbering Hyenas can't block black creatures. -MIR C - -Gibbering Kami -{3}{B} -Creature - Spirit -2/2 -Flying -Soulshift 3 (When this creature dies, you may return target Spirit card with converted mana cost 3 or less from your graveyard to your hand.) -CHK C - -Gideon Jura -{3}{W}{W} -Planeswalker - Gideon -6 -[+2] During target opponent's next turn, creatures that player controls attack Gideon Jura if able. -[-2] Destroy target tapped creature. -[0] Until end of turn, Gideon Jura becomes a 6/6 Human Soldier creature that's still a planeswalker. Prevent all damage that would be dealt to him this turn. -ROE M, M12 M - -Gideon's Avenger -{1}{W}{W} -Creature - Human Soldier -2/2 -Whenever a creature an opponent controls becomes tapped, put a +1/+1 counter on Gideon's Avenger. -M12 R - -Gideon's Lawkeeper -{W} -Creature - Human Soldier -1/1 -{W}, {T}: Tap target creature. -M12 C - -Gift of Estates -{1}{W} -Sorcery -If an opponent controls more lands than you, search your library for up to three Plains cards, reveal them, and put them into your hand. Then shuffle your library. -POR R, 9ED U - -Gift of Granite -{W} -Enchantment - Aura -Flash (You may cast this spell any time you could cast an instant.) -Enchant creature -Enchanted creature gets +0/+2. -FUT C - -Gift of the Deity -{4}{B/G} -Enchantment - Aura -Enchant creature -As long as enchanted creature is black, it gets +1/+1 and has deathtouch. (Any amount of damage it deals to a creature is enough to destroy that creature.) -As long as enchanted creature is green, it gets +1/+1 and all creatures able to block it do so. -EVE C - -Gift of the Gargantuan -{2}{G} -Sorcery -Look at the top four cards of your library. You may reveal a creature card and/or a land card from among them and put the revealed cards into your hand. Put the rest on the bottom of your library in any order. -ALA C - -Gift of the Woods -{G} -Enchantment - Aura -Enchant creature -Whenever enchanted creature blocks or becomes blocked, it gets +0/+3 until end of turn and you gain 1 life. -ALL C (x2) - -Gifts Ungiven -{3}{U} -Instant -Search your library for four cards with different names and reveal them. Target opponent chooses two of those cards. Put the chosen cards into your graveyard and the rest into your hand. Then shuffle your library. -CHK R, FVE M - -Gigadrowse -{U} -Instant -Replicate {U} (When you cast this spell, copy it for each time you paid its replicate cost. You may choose new targets for the copies.) -Tap target permanent. -GPT C - -Gigantiform -{3}{G}{G} -Enchantment - Aura -Kicker {4} -Enchant creature -Enchanted creature is 8/8 and has trample. -When Gigantiform enters the battlefield, if it was kicked, you may search your library for a card named Gigantiform, put it onto the battlefield, then shuffle your library. -ZEN R - -Gigantomancer -{7}{G} -Creature - Human Shaman -1/1 -{1}: Target creature you control becomes 7/7 until end of turn. -ROE R - -Gigapede -{3}{G}{G} -Creature - Insect -6/1 -Shroud (This permanent can't be the target of spells or abilities.) -At the beginning of your upkeep, if Gigapede is in your graveyard, you may discard a card. If you do, return Gigapede to your hand. -ONS R - -Gilded Drake -{1}{U} -Creature - Drake -3/3 -Flying -When Gilded Drake enters the battlefield, exchange control of Gilded Drake and up to one target creature an opponent controls. If you don't make an exchange, sacrifice Gilded Drake. This ability can't be countered except by spells and abilities. (This effect lasts indefinitely.) -USG R - -Gilded Light -{1}{W} -Instant -You gain shroud until end of turn. (You can't be the target of spells or abilities.) -Cycling {2} ({2}, Discard this card: Draw a card.) -SCG U - -Gilded Lotus -{5} -Artifact -{T}: Add three mana of any one color to your mana pool. -MRD R - -Gilder Bairn -{1}{G/U}{G/U} -Creature - Ouphe -1/3 -{2}{G/U}, {Q}: For each counter on target permanent, put another of those counters on that permanent. ({Q} is the untap symbol.) -EVE U - -Gilt-Leaf Ambush -{2}{G} -Tribal Instant - Elf -Put two 1/1 green Elf Warrior creature tokens onto the battlefield. Clash with an opponent. If you win, those creatures gain deathtouch until end of turn. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost. Any amount of damage a creature with deathtouch deals to a creature is enough to destroy it.) -LRW C - -Gilt-Leaf Archdruid -{3}{G}{G} -Creature - Elf Druid -3/3 -Whenever you cast a Druid spell, you may draw a card. -Tap seven untapped Druids you control: Gain control of all lands target player controls. -MOR R - -Gilt-Leaf Palace -Land -As Gilt-Leaf Palace enters the battlefield, you may reveal an Elf card from your hand. If you don't, Gilt-Leaf Palace enters the battlefield tapped. -{T}: Add {B} or {G} to your mana pool. -LRW R - -Gilt-Leaf Seer -{2}{G} -Creature - Elf Shaman -2/2 -{G}, {T}: Look at the top two cards of your library, then put them back in any order. -LRW C - -Giltspire Avenger -{G}{W}{U} -Creature - Human Soldier -2/2 -Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.) -{T}: Destroy target creature that dealt damage to you this turn. -CON R - -Gitaxian Probe -{U/P} -Sorcery -({U/P} can be paid with either {U} or 2 life.) -Look at target player's hand. -Draw a card. -NPH C - -Gix -Vanguard -Hand -2, life +18 -{3}: Return target creature card from your graveyard to your hand. -VG S - -Glacial Chasm -Land -Cumulative upkeep-Pay 2 life. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -When Glacial Chasm enters the battlefield, sacrifice a land. -Creatures you control can't attack. -Prevent all damage that would be dealt to you. -ICE U, ME2 R - -Glacial Crevasses -{2}{R} -Enchantment -Sacrifice a snow Mountain: Prevent all combat damage that would be dealt this turn. -ICE R, ME2 R - -Glacial Fortress -Land -Glacial Fortress enters the battlefield tapped unless you control a Plains or an Island. -{T}: Add {W} or {U} to your mana pool. -M10 R, M11 R, M12 R - -Glacial Plating -{2}{W}{W} -Snow Enchantment - Aura -Enchant creature -Cumulative upkeep {S} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it. {S} can be paid with one mana from a snow permanent.) -Enchanted creature gets +3/+3 for each age counter on Glacial Plating. -CSP U - -Glacial Ray -{1}{R} -Instant - Arcane -Glacial Ray deals 2 damage to target creature or player. -Splice onto Arcane {1}{R} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -CHK C - -Glacial Wall -{2}{U} -Creature - Wall -0/7 -Defender (This creature can't attack.) -ICE U, 5ED U, 6ED U, 7ED U - -Glaciers -{2}{W}{U} -Enchantment -At the beginning of your upkeep, sacrifice Glaciers unless you pay {W}{U}. -All Mountains are Plains. -ICE R - -Glade Gnarr -{5}{G} -Creature - Beast -4/4 -Whenever a player casts a blue spell, Glade Gnarr gets +2/+2 until end of turn. -APC C - -Gladecover Scout -{G} -Creature - Elf Scout -1/1 -Hexproof (This creature can't be the target of spells or abilities your opponents control.) -M12 C - -Glamer Spinners -{4}{W/U} -Creature - Faerie Wizard -2/4 -Flash -Flying -When Glamer Spinners enters the battlefield, attach all Auras enchanting target permanent to another permanent with the same controller. -SHM U - -Glamerdye -{1}{U} -Instant -Change the text of target spell or permanent by replacing all instances of one color word with another. -Retrace (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) -EVE R - -Glare of Subdual -{2}{G}{W} -Enchantment -Tap an untapped creature you control: Tap target artifact or creature. -RAV R - -Glarecaster -{4}{W}{W} -Creature - Bird Cleric -3/3 -Flying -{5}{W}: The next time damage would be dealt to Glarecaster and/or you this turn, that damage is dealt to target creature or player instead. -ONS R - -Glarewielder -{4}{R} -Creature - Elemental Shaman -3/1 -Haste -When Glarewielder enters the battlefield, up to two target creatures can't block this turn. -Evoke {1}{R} (You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield.) -LRW U - -Glass Asp -{1}{G}{G} -Creature - Snake -2/1 -Whenever Glass Asp deals combat damage to a player, that player loses 2 life at the beginning of his or her next draw step unless he or she pays {2} before that step. -TSP C - -Glass Golem -{5} -Artifact Creature - Golem -6/2 -RAV U - -Glassdust Hulk -{3}{W}{U} -Artifact Creature - Golem -3/4 -Whenever another artifact enters the battlefield under your control, Glassdust Hulk gets +1/+1 until end of turn and is unblockable this turn. -Cycling {W/U} ({W/U}, Discard this card: Draw a card.) -ARB C - -Glasses of Urza -{1} -Artifact -{T}: Look at target player's hand. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, 6ED U, ME4 C - -Glaze Fiend -{1}{B} -Artifact Creature - Illusion -0/1 -Flying -Whenever another artifact enters the battlefield under your control, Glaze Fiend gets +2/+2 until end of turn. -ALA C - -Gleam of Resistance -{4}{W} -Instant -Creatures you control get +1/+2 until end of turn. Untap those creatures. -Basic landcycling {1}{W} ({1}{W}, Discard this card: Search your library for a basic land card, reveal it, and put it into your hand. Then shuffle your library.) -CON C - -Gleancrawler -{3}{B/G}{B/G}{B/G} -Creature - Insect Horror -6/6 -({B/G} can be paid with either {B} or {G}.) -Trample -At the beginning of your end step, return to your hand all creature cards in your graveyard that were put there from the battlefield this turn. -RAV R - -Gleeful Sabotage -{1}{G} -Sorcery -Destroy target artifact or enchantment. -Conspire (As you cast this spell, you may tap two untapped creatures you control that share a color with it. When you do, copy it and you may choose a new target for the copy.) -SHM C, ARC C - -Glen Elendra Archmage -{3}{U} -Creature - Faerie Wizard -2/2 -Flying -{U}, Sacrifice Glen Elendra Archmage: Counter target noncreature spell. -Persist (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) -EVE R - -Glen Elendra Liege -{1}{U/B}{U/B}{U/B} -Creature - Faerie Knight -2/3 -Flying -Other blue creatures you control get +1/+1. -Other black creatures you control get +1/+1. -SHM R - -Glen Elendra Pranksters -{3}{U} -Creature - Faerie Wizard -1/3 -Flying -Whenever you cast a spell during an opponent's turn, you may return target creature you control to its owner's hand. -LRW U - -Gliding Licid -{2}{U} -Creature - Licid -2/2 -{U}, {T}: Gliding Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {U} to end this effect. -Enchanted creature has flying. -STH U - -Glimmerdust Nap -{2}{U} -Enchantment - Aura -Enchant tapped creature -Enchanted creature doesn't untap during its controller's untap step. -LRW C - -Glimmering Angel -{3}{W} -Creature - Angel -2/2 -Flying -{U}: Glimmering Angel gains shroud until end of turn. (It can't be the target of spells or abilities.) -INV C - -Glimmerpoint Stag -{2}{W}{W} -Creature - Elk -3/3 -Vigilance -When Glimmerpoint Stag enters the battlefield, exile another target permanent. Return that card to the battlefield under its owner's control at the beginning of the next end step. -SOM U - -Glimmerpost -Land - Locus -When Glimmerpost enters the battlefield, you gain 1 life for each Locus on the battlefield. -{T}: Add {1} to your mana pool. -SOM C - -Glimmervoid -Land -At the beginning of the end step, if you control no artifacts, sacrifice Glimmervoid. -{T}: Add one mana of any color to your mana pool. -MRD R - -Glimmervoid Basin -Plane - Mirrodin -Whenever a player casts an instant or sorcery spell with a single target, he or she copies that spell for each other spell, permanent, card not on the battlefield, and/or player the spell could target. Each copy targets a different one of them. -Whenever you roll {C}, choose target creature. Each player except that creature's controller puts a token that's a copy of that creature onto the battlefield. -HOP C - -Glimpse of Nature -{G} -Sorcery -Whenever you cast a creature spell this turn, draw a card. -CHK R - -Glimpse the Unthinkable -{U}{B} -Sorcery -Target player puts the top ten cards of his or her library into his or her graveyard. -RAV R - -Glint Hawk -{W} -Creature - Bird -2/2 -Flying -When Glint Hawk enters the battlefield, sacrifice it unless you return an artifact you control to its owner's hand. -SOM C - -Glint Hawk Idol -{2} -Artifact -Whenever another artifact enters the battlefield under your control, you may have Glint Hawk Idol become a 2/2 Bird artifact creature with flying until end of turn. -{W}: Glint Hawk Idol becomes a 2/2 Bird artifact creature with flying until end of turn. -SOM C - -Glint-Eye Nephilim -{U}{B}{R}{G} -Creature - Nephilim -2/2 -Whenever Glint-Eye Nephilim deals combat damage to a player, draw that many cards. -{1}, Discard a card: Glint-Eye Nephilim gets +1/+1 until end of turn. -GPT R - -Glintwing Invoker -{4}{U} -Creature - Human Wizard Mutant -3/3 -{7}{U}: Glintwing Invoker gets +3/+3 and gains flying until end of turn. -LGN C - -Glissa Sunseeker -{2}{G}{G} -Legendary Creature - Elf -3/2 -First strike -{T}: Destroy target artifact if its converted mana cost is equal to the amount of mana in your mana pool. -MRD R - -Glissa's Courier -{1}{G}{G} -Creature - Horror -2/3 -Mountainwalk -MBS C - -Glissa's Scorn -{1}{G} -Instant -Destroy target artifact. Its controller loses 1 life. -NPH C - -Glissa, the Traitor -{B}{G}{G} -Legendary Creature - Zombie Elf -3/3 -First strike, deathtouch -Whenever a creature an opponent controls dies, you may return target artifact card from your graveyard to your hand. -MBS M - -Glistener Elf -{G} -Creature - Elf Warrior -1/1 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -NPH C - -Glistening Oil -{B}{B} -Enchantment - Aura -Enchant creature -Enchanted creature has infect. -At the beginning of your upkeep, put a -1/-1 counter on enchanted creature. -When Glistening Oil is put into a graveyard from the battlefield, return Glistening Oil to its owner's hand. -NPH R - -Glitterfang -{R} -Creature - Spirit -1/1 -Haste -At the beginning of the end step, return Glitterfang to its owner's hand. -SOK C - -Glittering Lion -{2}{W} -Creature - Cat -2/2 -Prevent all damage that would be dealt to Glittering Lion. -{3}: Until end of turn, Glittering Lion loses "Prevent all damage that would be dealt to Glittering Lion." Any player may activate this ability. -PCY U - -Glittering Lynx -{W} -Creature - Cat -1/1 -Prevent all damage that would be dealt to Glittering Lynx. -{2}: Until end of turn, Glittering Lynx loses "Prevent all damage that would be dealt to Glittering Lynx." Any player may activate this ability. -PCY C - -Glittering Wish -{G}{W} -Sorcery -You may choose a multicolored card you own from outside the game, reveal that card, and put it into your hand. Exile Glittering Wish. -FUT R - -Global Ruin -{4}{W} -Sorcery -Each player chooses from the lands he or she controls a land of each basic land type, then sacrifices the rest. -INV R - -Gloom -{2}{B} -Enchantment -White spells cost {3} more to cast. -Activated abilities of white enchantments cost {3} more to activate. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, ME4 R - -Gloomdrifter -{3}{B} -Creature - Zombie Minion -2/2 -Flying -Threshold - As long as seven or more cards are in your graveyard, Gloomdrifter has "When Gloomdrifter enters the battlefield, nonblack creatures get -2/-2 until end of turn." -TOR U - -Gloomhunter -{2}{B} -Creature - Bat -2/1 -Flying -ROE C - -Gloomlance -{3}{B}{B} -Sorcery -Destroy target creature. If that creature was green or white, its controller discards a card. -SHM C - -Gloomwidow -{2}{G} -Creature - Spider -3/3 -Reach -Gloomwidow can block only creatures with flying. -SHM U - -Gloomwidow's Feast -{3}{G} -Instant -Destroy target creature with flying. If that creature was blue or black, put a 1/2 green Spider creature token with reach onto the battlefield. (It can block creatures with flying.) -SHM C - -Glorious Anthem -{1}{W}{W} -Enchantment -Creatures you control get +1/+1. -USG R, 7ED R, 8ED R, 9ED R, 10E R - -Glorious Charge -{1}{W} -Instant -Creatures you control get +1/+1 until end of turn. -M10 C - -Glory -{3}{W}{W} -Creature - Incarnation -3/3 -Flying -{2}{W}: Choose a color. Creatures you control gain protection from the chosen color until end of turn. Activate this ability only if Glory is in your graveyard. -PRO R, JUD R - -Glory Seeker -{1}{W} -Creature - Human Soldier -2/2 -ONS C, 8ED C, 9ED C, ROE C, EVT C - -Glory of Warfare -{2}{R}{W} -Enchantment -As long as it's your turn, creatures you control get +2/+0. -As long as it's not your turn, creatures you control get +0/+2. -ARB R, HOP R - -Gloryscale Viashino -{1}{R}{G}{W} -Creature - Viashino Soldier -3/3 -Whenever you cast a multicolored spell, Gloryscale Viashino gets +3/+3 until end of turn. -ARB U - -Glowering Rogon -{5}{G} -Creature - Beast -4/4 -Amplify 1 (As this creature enters the battlefield, put a +1/+1 counter on it for each Beast card you reveal in your hand.) -LGN C - -Glowing Anemone -{3}{U} -Creature - Jellyfish Beast -1/3 -When Glowing Anemone enters the battlefield, you may return target land to its owner's hand. -MMQ U - -Glowrider -{2}{W} -Creature - Human Cleric -2/1 -Noncreature spells cost {1} more to cast. -LGN R - -Gluttonous Slime -{2}{G} -Creature - Ooze -2/2 -Flash -Devour 1 (As this enters the battlefield, you may sacrifice any number of creatures. This creature enters the battlefield with that many +1/+1 counters on it.) -CON U - -Gluttonous Zombie -{4}{B} -Creature - Zombie -3/3 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -ONS U, 8ED U, 9ED U - -Glyph of Delusion -{U} -Instant -Put X glyph counters on target creature that target Wall blocked this turn, where X is the power of that blocked creature. The creature gains "This creature doesn't untap during your untap step if it has a glyph counter on it" and "At the beginning of your upkeep, remove a glyph counter from this creature." -LEG C - -Glyph of Destruction -{R} -Instant -Target blocking Wall you control gets +10/+0 until end of combat. Prevent all damage that would be dealt to it this turn. Destroy it at the beginning of the next end step. -LEG C - -Glyph of Doom -{B} -Instant -At end of combat, destroy all creatures that were blocked by target Wall this turn. -LEG C - -Glyph of Life -{W} -Instant -Until end of turn, whenever an attacking creature deals damage to target Wall creature, you gain that much life. -LEG C - -Glyph of Reincarnation -{G} -Instant -Cast Glyph of Reincarnation only after combat. -Destroy all creatures that were blocked by target Wall this turn. They can't be regenerated. For each creature that died this way, put a creature card from the graveyard of the player who controlled that creature the last time it became blocked by that Wall onto the battlefield under its owner's control. -LEG C - -Gnarled Effigy -{4} -Artifact -{4}, {T}: Put a -1/-1 counter on target creature. -SHM U - -Gnarled Mass -{1}{G}{G} -Creature - Spirit -3/3 -BOK C - -Gnarlid Pack -{1}{G} -Creature - Beast -2/2 -Multikicker {1}{G} (You may pay an additional {1}{G} any number of times as you cast this spell.) -Gnarlid Pack enters the battlefield with a +1/+1 counter on it for each time it was kicked. -WWK C - -Gnat Alley Creeper -{2}{R} -Creature - Human Rogue -3/1 -Gnat Alley Creeper can't be blocked by creatures with flying. -DIS U - -Gnat Miser -{B} -Creature - Rat Shaman -1/1 -Each opponent's maximum hand size is reduced by one. -SOK C - -Gnathosaur -{4}{R}{R} -Creature - Lizard -5/4 -Sacrifice an artifact: Gnathosaur gains trample until end of turn. -MBS C - -Go for the Throat -{1}{B} -Instant -Destroy target nonartifact creature. -MBS U - -Goatnapper -{2}{R} -Creature - Goblin Rogue -2/2 -When Goatnapper enters the battlefield, untap target Goat and gain control of it until end of turn. It gains haste until end of turn. -LRW U - -Gobhobbler Rats -{B}{R} -Creature - Rat -2/2 -Hellbent - As long as you have no cards in hand, Gobhobbler Rats gets +1/+0 and has "{B}: Regenerate Gobhobbler Rats." -DIS C - -Goblin Archaeologist -{1}{R} -Creature - Goblin Artificer -1/2 -{R}, {T}: Flip a coin. If you win the flip, destroy target artifact and untap Goblin Archaeologist. If you lose the flip, sacrifice Goblin Archaeologist. -DST U - -Goblin Arsonist -{R} -Creature - Goblin Shaman -1/1 -When Goblin Arsonist dies, you may have it deal 1 damage to target creature or player. -ROE C, M12 C - -Goblin Artillery -{1}{R}{R} -Creature - Goblin Warrior -1/3 -{T}: Goblin Artillery deals 2 damage to target creature or player and 3 damage to you. -M10 U - -Goblin Artisans -{R} -Creature - Goblin Artificer -1/1 -{T}: Flip a coin. If you win the flip, draw a card. If you lose the flip, counter target artifact spell you control that isn't the target of an ability from another creature named Goblin Artisans. -ATQ U, CHR U - -Goblin Assassin -{3}{R}{R} -Creature - Goblin Assassin -2/2 -Whenever Goblin Assassin or another Goblin enters the battlefield, each player flips a coin. Each player whose coin comes up tails sacrifices a creature. -LGN U - -Goblin Assault -{2}{R} -Enchantment -At the beginning of your upkeep, put a 1/1 red Goblin creature token with haste onto the battlefield. -Goblin creatures attack each turn if able. -ALA R - -Goblin Balloon Brigade -{R} -Creature - Goblin Warrior -1/1 -{R}: Goblin Balloon Brigade gains flying until end of turn. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 9ED U, M11 C - -Goblin Bangchuckers -{2}{R}{R} -Creature - Goblin Warrior -2/2 -{T}: Flip a coin. If you win the flip, Goblin Bangchuckers deals 2 damage to target creature or player. If you lose the flip, Goblin Bangchuckers deals 2 damage to itself. -M12 U - -Goblin Berserker -{3}{R} -Creature - Goblin Berserker -2/2 -First strike, haste -UDS U - -Goblin Bomb -{1}{R} -Enchantment -At the beginning of your upkeep, you may flip a coin. If you win the flip, put a fuse counter on Goblin Bomb. If you lose the flip, remove a fuse counter from Goblin Bomb. -Remove five fuse counters from Goblin Bomb, Sacrifice Goblin Bomb: Goblin Bomb deals 20 damage to target player. -WTH R - -Goblin Bombardment -{1}{R} -Enchantment -Sacrifice a creature: Goblin Bombardment deals 1 damage to target creature or player. -TMP U - -Goblin Brawler -{2}{R} -Creature - Goblin Warrior -2/2 -First strike -Goblin Brawler can't be equipped. -5DN C - -Goblin Brigand -{1}{R} -Creature - Goblin Warrior -2/2 -Goblin Brigand attacks each turn if able. -SCG C, 9ED C - -Goblin Bully -{1}{R} -Creature - Goblin -2/1 -POR C, ME4 C - -Goblin Burrows -Land -{T}: Add {1} to your mana pool. -{1}{R}, {T}: Target Goblin creature gets +2/+0 until end of turn. -ONS U, EVG U - -Goblin Bushwhacker -{R} -Creature - Goblin Warrior -1/1 -Kicker {R} (You may pay an additional {R} as you cast this spell.) -When Goblin Bushwhacker enters the battlefield, if it was kicked, creatures you control get +1/+0 and gain haste until end of turn. -ZEN C - -Goblin Cadets -{R} -Creature - Goblin -2/1 -Whenever Goblin Cadets blocks or becomes blocked, target opponent gains control of it. (This removes Goblin Cadets from combat.) -USG U, COM U - -Goblin Cannon -{4} -Artifact -{2}: Goblin Cannon deals 1 damage to target creature or player. Sacrifice Goblin Cannon. -5DN U - -Goblin Cavaliers -{2}{R} -Creature - Goblin -3/2 -P02 C, S99 C, ME4 C - -Goblin Caves -{1}{R}{R} -Enchantment - Aura -Enchant land -As long as enchanted land is a basic Mountain, Goblin creatures get +0/+2. -DRK C, ME4 C - -Goblin Charbelcher -{4} -Artifact -{3}, {T}: Reveal cards from the top of your library until you reveal a land card. Goblin Charbelcher deals damage equal to the number of nonland cards revealed this way to target creature or player. If the revealed land card was a Mountain, Goblin Charbelcher deals double that damage instead. Put the revealed cards on the bottom of your library in any order. -MRD R - -Goblin Chariot -{2}{R} -Creature - Goblin Warrior -2/2 -Haste (This creature can attack the turn it comes under your control.) -S99 C, 7ED C, 8ED C, 9ED C - -Goblin Chieftain -{1}{R}{R} -Creature - Goblin -2/2 -Haste (This creature can attack and {T} as soon as it comes under your control.) -Other Goblin creatures you control get +1/+1 and have haste. -M10 R, M11 R, M12 R - -Goblin Chirurgeon -{R} -Creature - Goblin Shaman -0/2 -Sacrifice a Goblin: Regenerate target creature. -FEM C (x3), MED C - -Goblin Clearcutter -{3}{R} -Creature - Goblin -3/3 -{T}, Sacrifice a Forest: Add three mana in any combination of {R} and/or {G} to your mana pool. -LGN U - -Goblin Cohort -{R} -Creature - Goblin Warrior -2/2 -Goblin Cohort can't attack unless you've cast a creature spell this turn. -BOK C, EVG C - -Goblin Commando -{4}{R} -Creature - Goblin -2/2 -When Goblin Commando enters the battlefield, it deals 2 damage to target creature. -S99 U - -Goblin Deathraiders -{B}{R} -Creature - Goblin Warrior -3/1 -Trample -ALA C - -Goblin Digging Team -{R} -Creature - Goblin -1/1 -{T}, Sacrifice Goblin Digging Team: Destroy target Wall. -DRK C, CHR C, 5ED C, 6ED C, 7ED C - -Goblin Dirigible -{6} -Artifact Creature - Construct -4/4 -Flying -Goblin Dirigible doesn't untap during your untap step. -At the beginning of your upkeep, you may pay {4}. If you do, untap Goblin Dirigible. -MRD U - -Goblin Dynamo -{5}{R}{R} -Creature - Goblin Mutant -4/4 -{T}: Goblin Dynamo deals 1 damage to target creature or player. -{X}{R}, {T}, Sacrifice Goblin Dynamo: Goblin Dynamo deals X damage to target creature or player. -LGN U - -Goblin Elite Infantry -{1}{R} -Creature - Goblin Warrior -2/2 -Whenever Goblin Elite Infantry blocks or becomes blocked, it gets -1/-1 until end of turn. -MIR C, 6ED C, 7ED C, 10E C - -Goblin Festival -{1}{R} -Enchantment -{2}: Goblin Festival deals 1 damage to target creature or player. Flip a coin. If you lose the flip, choose one of your opponents. That player gains control of Goblin Festival. -UDS R - -Goblin Fire Fiend -{3}{R} -Creature - Goblin Berserker -1/1 -Haste -Goblin Fire Fiend must be blocked if able. -{R}: Goblin Fire Fiend gets +1/+0 until end of turn. -RAV C - -Goblin Firebug -{1}{R} -Creature - Goblin -2/2 -When Goblin Firebug leaves the battlefield, sacrifice a land. -LGN C - -Goblin Fireslinger -{R} -Creature - Goblin Warrior -1/1 -{T}: Goblin Fireslinger deals 1 damage to target player. -M12 C - -Goblin Firestarter -{R} -Creature - Goblin -1/1 -Sacrifice Goblin Firestarter: Goblin Firestarter deals 1 damage to target creature or player. Activate this ability only during your turn, before attackers are declared. -P02 U, ME4 C - -Goblin Flectomancer -{U}{R}{R} -Creature - Goblin Wizard -2/2 -Sacrifice Goblin Flectomancer: You may change the targets of target instant or sorcery spell. -GPT U - -Goblin Flotilla -{2}{R} -Creature - Goblin -2/2 -Islandwalk -At the beginning of combat, unless you pay {R}, whenever Goblin Flotilla blocks or becomes blocked by a creature this combat, that creature gains first strike until end of turn. -FEM R - -Goblin Furrier -{1}{R} -Creature - Goblin Warrior -2/2 -Prevent all damage that Goblin Furrier would deal to snow creatures. -CSP C - -Goblin Game -{5}{R}{R} -Sorcery -Each player hides at least one item, then all players reveal them simultaneously. Each player loses life equal to the number of items he or she revealed. The player who revealed the fewest items then loses half his or her life, rounded up. If two or more players are tied for fewest, each loses half his or her life, rounded up. -PLS R - -Goblin Gardener -{3}{R} -Creature - Goblin -2/1 -When Goblin Gardener dies, destroy target land. -UDS C, 7ED C - -Goblin Gaveleer -{R} -Creature - Goblin Warrior -1/1 -Trample -Goblin Gaveleer gets +2/+0 for each Equipment attached to it. -SOM C - -Goblin General -{1}{R}{R} -Creature - Goblin Warrior -1/1 -Whenever Goblin General attacks, Goblin creatures you control get +1/+1 until end of turn. -P02 R, S99 U, ME4 U - -Goblin Glider -{1}{R} -Creature - Goblin -1/1 -Flying -Goblin Glider can't block. -P02 C, S99 U, 7ED U, 8ED U - -Goblin Goon -{3}{R} -Creature - Goblin Mutant -6/6 -Goblin Goon can't attack unless you control more creatures than defending player. -Goblin Goon can't block unless you control more creatures than attacking player. -LGN R - -Goblin Grappler -{R} -Creature - Goblin -1/1 -Provoke (When this attacks, you may have target creature defending player controls untap and block it if able.) -LGN C - -Goblin Grenade -{R} -Sorcery -As an additional cost to cast Goblin Grenade, sacrifice a Goblin. -Goblin Grenade deals 5 damage to target creature or player. -FEM C (x3), MED U, M12 U - -Goblin Grenadiers -{3}{R} -Creature - Goblin -2/2 -Whenever Goblin Grenadiers attacks and isn't blocked, you may sacrifice it. If you do, destroy target creature and target land. -WTH U - -Goblin Guide -{R} -Creature - Goblin Scout -2/2 -Haste -Whenever Goblin Guide attacks, defending player reveals the top card of his or her library. If it's a land card, that player puts it into his or her hand. -ZEN R - -Goblin Hero -{2}{R} -Creature - Goblin -2/2 -DRK C, 5ED C, 6ED C, S99 R, S00 C - -Goblin King -{1}{R}{R} -Creature - Goblin -2/2 -Other Goblin creatures get +1/+1 and have mountainwalk. (They're unblockable as long as defending player controls a Mountain.) -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, 6ED R, 7ED R, 8ED R, 9ED R, 10E R - -Goblin Kites -{1}{R} -Enchantment -{R}: Target creature you control with toughness 2 or less gains flying until end of turn. Flip a coin at the beginning of the next end step. If you lose the flip, sacrifice that creature. -FEM U - -Goblin Lackey -{R} -Creature - Goblin -1/1 -Whenever Goblin Lackey deals damage to a player, you may put a Goblin permanent card from your hand onto the battlefield. -USG U, FVE M - -Goblin Legionnaire -{R}{W} -Creature - Goblin Soldier -2/2 -{R}, Sacrifice Goblin Legionnaire: Goblin Legionnaire deals 2 damage to target creature or player. -{W}, Sacrifice Goblin Legionnaire: Prevent the next 2 damage that would be dealt to target creature or player this turn. -APC C - -Goblin Lookout -{1}{R} -Creature - Goblin -1/2 -{T}, Sacrifice a Goblin: Goblin creatures get +2/+0 until end of turn. -LGN C - -Goblin Lore -{1}{R} -Sorcery -Draw four cards, then discard three cards at random. -P02 U, S99 U, 10E U - -Goblin Lyre -{3} -Artifact -Sacrifice Goblin Lyre: Flip a coin. If you win the flip, Goblin Lyre deals damage to target opponent equal to the number of creatures you control. If you lose the flip, Goblin Lyre deals damage to you equal to the number of creatures that opponent controls. -ICE R - -Goblin Machinist -{4}{R} -Creature - Goblin -0/5 -{2}{R}: Reveal cards from the top of your library until you reveal a nonland card. Goblin Machinist gets +X/+0 until end of turn, where X is that card's converted mana cost. Put the revealed cards on the bottom of your library in any order. -ONS U - -Goblin Marshal -{4}{R}{R} -Creature - Goblin Warrior -3/3 -Echo {4}{R}{R} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -When Goblin Marshal enters the battlefield or dies, put two 1/1 red Goblin creature tokens onto the battlefield. -UDS R - -Goblin Masons -{1}{R} -Creature - Goblin -2/1 -When Goblin Masons dies, destroy target Wall. -UDS C - -Goblin Matron -{2}{R} -Creature - Goblin -1/1 -When Goblin Matron enters the battlefield, you may search your library for a Goblin card, reveal that card, and put it into your hand. If you do, shuffle your library. -P02 U, USG C, 7ED U, EVG U - -Goblin Medics -{2}{R} -Creature - Goblin Shaman -1/1 -Whenever Goblin Medics becomes tapped, it deals 1 damage to target creature or player. -ULG C - -Goblin Mountaineer -{R} -Creature - Goblin Scout -1/1 -Mountainwalk -P02 C, S99 C, 9ED C, ALA C - -Goblin Mutant -{2}{R}{R} -Creature - Goblin Mutant -5/3 -Trample -Goblin Mutant can't attack if defending player controls an untapped creature with power 3 or greater. -Goblin Mutant can't block creatures with power 3 or greater. -ICE U, MED U - -Goblin Offensive -{X}{1}{R}{R} -Sorcery -Put X 1/1 red Goblin creature tokens onto the battlefield. -USG U, HOP U - -Goblin Outlander -{B}{R} -Creature - Goblin Scout -2/2 -Protection from white -CON C - -Goblin Patrol -{R} -Creature - Goblin -2/1 -Echo {R} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -USG C - -Goblin Piker -{1}{R} -Creature - Goblin Warrior -2/1 -P02 C, 9ED C, 10E C, M10 C, M11 C, M12 C - -Goblin Piledriver -{1}{R} -Creature - Goblin Warrior -1/2 -Protection from blue -Whenever Goblin Piledriver attacks, it gets +2/+0 until end of turn for each other attacking Goblin. -ONS R - -Goblin Polka Band -{R}{R} -Creature - Goblin -1/1 -{2}, {T}: Choose any number of target creatures at random. Tap those creatures. Goblins tapped this way do not untap during their controllers' next untap steps. This ability costs R more to activate for each target. -ASTRAL S - -Goblin Psychopath -{3}{R} -Creature - Goblin Mutant -5/5 -Whenever Goblin Psychopath attacks or blocks, flip a coin. If you lose the flip, the next time it would deal combat damage this turn, it deals that damage to you instead. -SCG U - -Goblin Pyromancer -{3}{R} -Creature - Goblin Wizard -2/2 -When Goblin Pyromancer enters the battlefield, Goblin creatures get +3/+0 until end of turn. -At the beginning of the end step, destroy all Goblins. -ONS R - -Goblin Raider -{1}{R} -Creature - Goblin Warrior -2/2 -Goblin Raider can't block. -P02 C, USG C, 7ED C, 8ED C, 9ED C - -Goblin Razerunners -{2}{R}{R} -Creature - Goblin Warrior -3/4 -{1}{R}, Sacrifice a land: Put a +1/+1 counter on Goblin Razerunners. -At the beginning of your end step, you may have Goblin Razerunners deal damage equal to the number of +1/+1 counters on it to target player. -CON R - -Goblin Recruiter -{1}{R} -Creature - Goblin -1/1 -When Goblin Recruiter enters the battlefield, search your library for any number of Goblin cards and reveal those cards. Shuffle your library, then put them on top of it in any order. -VIS U, 6ED U - -Goblin Replica -{3} -Artifact Creature - Goblin -2/2 -{3}{R}, Sacrifice Goblin Replica: Destroy target artifact. -MRD C - -Goblin Rimerunner -{2}{R} -Snow Creature - Goblin Warrior -2/2 -{T}: Target creature can't block this turn. -{S}: Goblin Rimerunner gains haste until end of turn. ({S} can be paid with one mana from a snow permanent.) -CSP C - -Goblin Ringleader -{3}{R} -Creature - Goblin -2/2 -Haste -When Goblin Ringleader enters the battlefield, reveal the top four cards of your library. Put all Goblin cards revealed this way into your hand and the rest on the bottom of your library in any order. -APC U, EVG U - -Goblin Rock Sled -{1}{R} -Creature - Goblin -3/1 -Trample -Goblin Rock Sled doesn't untap during your untap step if it attacked during your last turn. -Goblin Rock Sled can't attack unless defending player controls a Mountain. -DRK C, 4ED C - -Goblin Roughrider -{2}{R} -Creature - Goblin Knight -3/2 -WWK C - -Goblin Ruinblaster -{2}{R} -Creature - Goblin Shaman -2/1 -Kicker {R} (You may pay an additional {R} as you cast this spell.) -Haste -When Goblin Ruinblaster enters the battlefield, if it was kicked, destroy target nonbasic land. -ZEN U - -Goblin Sappers -{1}{R} -Creature - Goblin -1/1 -{R}{R}, {T}: Target creature you control is unblockable this turn. Destroy it and Goblin Sappers at end of combat. -{R}{R}{R}{R}, {T}: Target creature you control is unblockable this turn. Destroy it at end of combat. -ICE C - -Goblin Scouts -{3}{R}{R} -Sorcery -Put three 1/1 red Goblin Scout creature tokens with mountainwalk onto the battlefield. -MIR U - -Goblin Settler -{3}{R} -Creature - Goblin -1/1 -When Goblin Settler enters the battlefield, destroy target land. -S99 U - -Goblin Sharpshooter -{2}{R} -Creature - Goblin -1/1 -Goblin Sharpshooter doesn't untap during your untap step. -Whenever a creature dies, untap Goblin Sharpshooter. -{T}: Goblin Sharpshooter deals 1 damage to target creature or player. -ONS R - -Goblin Shortcutter -{1}{R} -Creature - Goblin Scout -2/1 -When Goblin Shortcutter enters the battlefield, target creature can't block this turn. -ZEN C - -Goblin Shrine -{1}{R}{R} -Enchantment - Aura -Enchant land -As long as enchanted land is a basic Mountain, Goblin creatures get +1/+0. -When Goblin Shrine leaves the battlefield, it deals 1 damage to each Goblin creature. -DRK C, CHR C, ME4 C - -Goblin Ski Patrol -{1}{R} -Creature - Goblin -1/1 -{1}{R}: Goblin Ski Patrol gets +2/+0 and gains flying. Its controller sacrifices it at the beginning of the next end step. Activate this ability only once and only if you control a snow Mountain. -ICE C, ME2 C - -Goblin Sky Raider -{2}{R} -Creature - Goblin Warrior -1/2 -Flying (This creature can't be blocked except by creatures with flying or reach.) -ONS C, 9ED C, 10E C - -Goblin Skycutter -{1}{R} -Creature - Goblin Warrior -2/1 -Sacrifice Goblin Skycutter: Goblin Skycutter deals 2 damage to target creature with flying. That creature loses flying until end of turn. -TSP C - -Goblin Sledder -{R} -Creature - Goblin -1/1 -Sacrifice a Goblin: Target creature gets +1/+1 until end of turn. -ONS C, EVG C - -Goblin Snowman -{3}{R} -Creature - Goblin -1/1 -Whenever Goblin Snowman blocks, prevent all combat damage that would be dealt to and dealt by it this turn. -{T}: Goblin Snowman deals 1 damage to target creature it's blocking. -ICE U, TSB S - -Goblin Soothsayer -{R} -Creature - Goblin Shaman -1/1 -{R}, {T}, Sacrifice a Goblin: Red creatures get +1/+1 until end of turn. -MIR U - -Goblin Spelunkers -{2}{R} -Creature - Goblin Warrior -2/2 -Mountainwalk -USG C, 7ED C, RAV C - -Goblin Spy -{R} -Creature - Goblin Rogue -1/1 -Play with the top card of your library revealed. -INV U - -Goblin Striker -{1}{R} -Creature - Goblin Berserker -1/1 -First strike, haste -MRD C - -Goblin Swine-Rider -{R} -Creature - Goblin -1/1 -Whenever Goblin Swine-Rider becomes blocked, it deals 2 damage to each attacking creature and each blocking creature. -VIS C - -Goblin Taskmaster -{R} -Creature - Goblin -1/1 -{1}{R}: Target Goblin creature gets +1/+0 until end of turn. -Morph {R} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS C - -Goblin Tinkerer -{1}{R} -Creature - Goblin Artificer -1/2 -{R}, {T}: Destroy target artifact. That artifact deals damage equal to its converted mana cost to Goblin Tinkerer. -MIR C - -Goblin Trenches -{1}{R}{W} -Enchantment -{2}, Sacrifice a land: Put two 1/1 red and white Goblin Soldier creature tokens onto the battlefield. -APC R - -Goblin Tunneler -{1}{R} -Creature - Goblin Rogue -1/1 -{T}: Target creature with power 2 or less is unblockable this turn. -ROE C, M11 C, M12 C - -Goblin Turncoat -{1}{B} -Creature - Goblin Mercenary -2/1 -Sacrifice a Goblin: Regenerate Goblin Turncoat. -LGN C - -Goblin Vandal -{R} -Creature - Goblin Rogue -1/1 -Whenever Goblin Vandal attacks and isn't blocked, you may pay {R}. If you do, destroy target artifact defending player controls and Goblin Vandal assigns no combat damage this turn. -WTH C - -Goblin War Buggy -{1}{R} -Creature - Goblin -2/2 -Haste -Echo {1}{R} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -USG C - -Goblin War Cry -{2}{R} -Sorcery -Target opponent chooses a creature he or she controls. Other creatures he or she controls can't block this turn. -P02 U - -Goblin War Drums -{2}{R} -Enchantment -Each creature you control can't be blocked except by two or more creatures. -FEM C (x4), 5ED C, 7ED U - -Goblin War Paint -{1}{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2 and has haste. (It can attack and {T} no matter when it came under its controller's control.) -ZEN C, M12 C - -Goblin War Strike -{R} -Sorcery -Goblin War Strike deals damage equal to the number of Goblins you control to target player. -P02 C, SCG C - -Goblin War Wagon -{4} -Artifact Creature - Juggernaut -3/3 -Goblin War Wagon doesn't untap during your untap step. -At the beginning of your upkeep, you may pay {2}. If you do, untap Goblin War Wagon. -MRD C - -Goblin Warchief -{1}{R}{R} -Creature - Goblin -2/2 -Goblin spells you cast cost {1} less to cast. -Goblin creatures you control have haste. -SCG U, EVG U - -Goblin Warchief Avatar -Vanguard -Hand +1, life +2 -Attacking creatures you control get +1/+0. -VG S (x2) - -Goblin Wardriver -{R}{R} -Creature - Goblin Warrior -2/2 -Battle cry (Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn.) -MBS U - -Goblin Warrens -{2}{R} -Enchantment -{2}{R}, Sacrifice two Goblins: Put three 1/1 red Goblin creature tokens onto the battlefield. -FEM R, 5ED R, 6ED R, ME4 U - -Goblin Welder -{R} -Creature - Goblin Artificer -1/1 -{T}: Choose target artifact a player controls and target artifact card in that player's graveyard. If both targets are still legal as this ability resolves, that player simultaneously sacrifices the artifact and returns the artifact card to the battlefield. -ULG R - -Goblin Wizard -{2}{R}{R} -Creature - Goblin Wizard -1/1 -{T}: You may put a Goblin permanent card from your hand onto the battlefield. -{R}: Target Goblin gains protection from white until end of turn. -DRK R, MED R - -Goblins of the Flarg -{R} -Creature - Goblin Warrior -1/1 -Mountainwalk -When you control a Dwarf, sacrifice Goblins of the Flarg. -DRK C, CHR C, MED C - -Godhead of Awe -{W/U}{W/U}{W/U}{W/U}{W/U} -Creature - Spirit Avatar -4/4 -Flying -Other creatures are 1/1. -SHM R - -Godless Shrine -Land - Plains Swamp -({T}: Add {W} or {B} to your mana pool.) -As Godless Shrine enters the battlefield, you may pay 2 life. If you don't, Godless Shrine enters the battlefield tapped. -GPT R - -Godo's Irregulars -{R} -Creature - Human Warrior -1/1 -{R}: Godo's Irregulars deals 1 damage to target creature blocking it. -SOK U - -Godo, Bandit Warlord -{5}{R} -Legendary Creature - Human Barbarian -3/3 -When Godo, Bandit Warlord enters the battlefield, you may search your library for an Equipment card and put it onto the battlefield. If you do, shuffle your library. -Whenever Godo attacks for the first time each turn, untap it and all Samurai you control. After this phase, there is an additional combat phase. -CHK R - -Gods' Eye, Gate to the Reikai -Legendary Land -{T}: Add {1} to your mana pool. -When Gods' Eye, Gate to the Reikai is put into a graveyard from the battlefield, put a 1/1 colorless Spirit creature token onto the battlefield. -BOK U - -Godsire -{4}{R}{G}{G}{W} -Creature - Beast -8/8 -Vigilance -{T}: Put an 8/8 Beast creature token that's red, green, and white onto the battlefield. -ALA M - -Godtoucher -{3}{G} -Creature - Elf Cleric -2/2 -{1}{W}, {T}: Prevent all damage that would be dealt to target creature with power 5 or greater this turn. -ALA C - -Godtracker of Jund -{1}{R}{G} -Creature - Elf Shaman -2/2 -Whenever a creature with power 5 or greater enters the battlefield under your control, you may put a +1/+1 counter on Godtracker of Jund. -ARB C - -Goham Djinn -{5}{B} -Creature - Djinn -5/5 -{1}{B}: Regenerate Goham Djinn. -Goham Djinn gets -2/-2 as long as black is the most common color among all permanents or is tied for most common. -INV U - -Gold Myr -{2} -Artifact Creature - Myr -1/1 -{T}: Add {W} to your mana pool. -MRD C, HOP C, SOM C - -Golden Bear -{3}{G} -Creature - Bear -4/3 -P02 C - -Golden Urn -{1} -Artifact -At the beginning of your upkeep, you may put a charge counter on Golden Urn. -{T}, Sacrifice Golden Urn: You gain life equal to the number of charge counters on Golden Urn. -SOM C - -Golden Wish -{3}{W}{W} -Sorcery -You may choose an artifact or enchantment card you own from outside the game, reveal that card, and put it into your hand. Exile Golden Wish. -JUD R - -Goldenglow Moth -{W} -Creature - Insect -0/1 -Flying -Whenever Goldenglow Moth blocks, you may gain 4 life. -SHM C, M11 C - -Goldmeadow -Plane - Lorwyn -Whenever a land enters the battlefield, that land's controller puts three 0/1 white Goat creature tokens onto the battlefield. -Whenever you roll {C}, put a 0/1 white Goat creature token onto the battlefield. -HOP C - -Goldmeadow Dodger -{W} -Creature - Kithkin Rogue -1/1 -Goldmeadow Dodger can't be blocked by creatures with power 4 or greater. -LRW C - -Goldmeadow Harrier -{W} -Creature - Kithkin Soldier -1/1 -{W}, {T}: Tap target creature. -LRW C, EVT C - -Goldmeadow Lookout -{3}{W} -Creature - Kithkin Spellshaper -2/2 -{W}, {T}, Discard a card: Put a 1/1 white Kithkin Soldier creature token named Goldmeadow Harrier onto the battlefield. It has "{W}, {T}: Tap target creature." -FUT U - -Goldmeadow Stalwart -{W} -Creature - Kithkin Soldier -2/2 -As an additional cost to cast Goldmeadow Stalwart, reveal a Kithkin card from your hand or pay {3}. -LRW U - -Golem Artisan -{5} -Artifact Creature - Golem -3/3 -{2}: Target artifact creature gets +1/+1 until end of turn. -{2}: Target artifact creature gains your choice of flying, trample, or haste until end of turn. -SOM U - -Golem Foundry -{3} -Artifact -Whenever you cast an artifact spell, you may put a charge counter on Golem Foundry. -Remove three charge counters from Golem Foundry: Put a 3/3 colorless Golem artifact creature token onto the battlefield. -SOM C - -Golem's Heart -{2} -Artifact -Whenever a player casts an artifact spell, you may gain 1 life. -SOM U - -Golem-Skin Gauntlets -{1} -Artifact - Equipment -Equipped creature gets +1/+0 for each Equipment attached to it. -Equip {2} ({2}: Attach to target creature you control. Equip only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.) -MRD U - -Golgari Brownscale -{1}{G}{G} -Creature - Lizard -2/3 -When Golgari Brownscale is put into your hand from your graveyard, you gain 2 life. -Dredge 2 (If you would draw a card, instead you may put exactly two cards from the top of your library into your graveyard. If you do, return this card from your graveyard to your hand. Otherwise, draw a card.) -RAV C - -Golgari Germination -{1}{B}{G} -Enchantment -Whenever a nontoken creature you control dies, put a 1/1 green Saproling creature token onto the battlefield. -RAV U - -Golgari Grave-Troll -{4}{G} -Creature - Skeleton Troll -0/0 -Golgari Grave-Troll enters the battlefield with a +1/+1 counter on it for each creature card in your graveyard. -{1}, Remove a +1/+1 counter from Golgari Grave-Troll: Regenerate Golgari Grave-Troll. -Dredge 6 (If you would draw a card, instead you may put exactly six cards from the top of your library into your graveyard. If you do, return this card from your graveyard to your hand. Otherwise, draw a card.) -RAV R - -Golgari Guildmage -{B/G}{B/G} -Creature - Elf Shaman -2/2 -{4}{B}, Sacrifice a creature: Return target creature card from your graveyard to your hand. -{4}{G}: Put a +1/+1 counter on target creature. -RAV U, COM U - -Golgari Rot Farm -Land -Golgari Rot Farm enters the battlefield tapped. -When Golgari Rot Farm enters the battlefield, return a land you control to its owner's hand. -{T}: Add {B}{G} to your mana pool. -RAV C, COM C - -Golgari Rotwurm -{3}{B}{G} -Creature - Zombie Wurm -5/4 -{B}, Sacrifice a creature: Target player loses 1 life. -RAV C - -Golgari Signet -{2} -Artifact -{1}, {T}: Add {B}{G} to your mana pool. -RAV C, COM C - -Golgari Thug -{1}{B} -Creature - Human Warrior -1/1 -When Golgari Thug dies, put target creature card from your graveyard on top of your library. -Dredge 4 (If you would draw a card, instead you may put exactly four cards from the top of your library into your graveyard. If you do, return this card from your graveyard to your hand. Otherwise, draw a card.) -RAV U - -Golgothian Sylex -{4} -Artifact -{1}, {T}: Each nontoken permanent from the Antiquities expansion is sacrificed by its controller. -ATQ R - -Goliath Beetle -{2}{G} -Creature - Insect -3/1 -Trample -UDS C - -Goliath Sphinx -{5}{U}{U} -Creature - Sphinx -8/7 -Flying -WWK R - -Goliath Spider -{6}{G}{G} -Creature - Spider -7/6 -Reach (This creature can block creatures with flying.) -RAV U - -Gomazoa -{2}{U} -Creature - Jellyfish -0/3 -Defender, flying -{T}: Put Gomazoa and each creature it's blocking on top of their owners' libraries, then those players shuffle their libraries. -ZEN U, COM U - -Gore Vassal -{2}{W} -Creature - Hound -2/1 -Sacrifice Gore Vassal: Put a -1/-1 counter on target creature. Then if that creature's toughness is 1 or greater, regenerate it. -MBS U - -Gorehorn Minotaurs -{2}{R}{R} -Creature - Minotaur Warrior -3/3 -Bloodthirst 2 (If an opponent was dealt damage this turn, this creature enters the battlefield with two +1/+1 counters on it.) -M12 C - -Goretusk Firebeast -{5}{R} -Creature - Elemental Boar Beast -2/2 -When Goretusk Firebeast enters the battlefield, it deals 4 damage to target player. -JUD C - -Gorger Wurm -{3}{R}{G} -Creature - Wurm -5/5 -Devour 1 (As this enters the battlefield, you may sacrifice any number of creatures. This creature enters the battlefield with that many +1/+1 counters on it.) -ARB C - -Gorgon Flail -{2} -Artifact - Equipment -Equipped creature gets +1/+1 and has deathtouch. (Any amount of damage it deals to a creature is enough to destroy that creature.) -Equip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) -M10 U - -Gorgon Recluse -{3}{B}{B} -Creature - Gorgon -2/4 -Whenever Gorgon Recluse blocks or becomes blocked by a nonblack creature, destroy that creature at end of combat. -Madness {B}{B} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -TSP C - -Gorilla Berserkers -{3}{G}{G} -Creature - Ape Berserker -2/3 -Trample; rampage 2 (Whenever this creature becomes blocked, it gets +2/+2 until end of turn for each creature blocking it beyond the first.) -Gorilla Berserkers can't be blocked except by three or more creatures. -ALL C (x2) - -Gorilla Chieftain -{2}{G}{G} -Creature - Ape -3/3 -{1}{G}: Regenerate Gorilla Chieftain. -ALL C (x2), 6ED C, 7ED C - -Gorilla Pack -{2}{G} -Creature - Ape -3/3 -Gorilla Pack can't attack unless defending player controls a Forest. -When you control no Forests, sacrifice Gorilla Pack. -ICE C - -Gorilla Shaman -{R} -Creature - Ape Shaman -1/1 -{X}{X}{1}: Destroy target noncreature artifact with converted mana cost X. -ALL C (x2), ME2 U - -Gorilla Titan -{3}{G}{G} -Creature - Ape -4/4 -Trample -Gorilla Titan gets +4/+4 as long as there are no cards in your graveyard. -ODY U - -Gorilla War Cry -{1}{R} -Instant -Cast Gorilla War Cry only during combat before blockers are declared. -Creatures can't be blocked this turn except by two or more creatures. -Draw a card at the beginning of the next turn's upkeep. -ALL C (x2), ME4 C - -Gorilla Warrior -{2}{G} -Creature - Ape Warrior -3/2 -POR C, USG C, S99 C, BRB C - -Goryo's Vengeance -{1}{B} -Instant - Arcane -Return target legendary creature card from your graveyard to the battlefield. That creature gains haste. Exile it at the beginning of the next end step. -Splice onto Arcane {2}{B} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -BOK R - -Gossamer Chains -{W}{W} -Enchantment -Return Gossamer Chains to its owner's hand: Prevent all combat damage that would be dealt by target unblocked creature this turn. -VIS C - -Gossamer Phantasm -{1}{U} -Creature - Illusion -2/1 -Flying -When Gossamer Phantasm becomes the target of a spell or ability, sacrifice it. -PLC C - -Gosta Dirk -{3}{W}{W}{U}{U} -Legendary Creature - Human Warrior -4/4 -First strike -Creatures with islandwalk can be blocked as though they didn't have islandwalk. -LEG R - -Govern the Guildless -{5}{U} -Sorcery -Gain control of target monocolored creature. -Forecast - {1}{U}, Reveal Govern the Guildless from your hand: Target creature becomes the color or colors of your choice until end of turn. (Activate this ability only during your upkeep and only once each turn.) -DIS R - -Grab the Reins -{3}{R} -Instant -Choose one - Until end of turn, you gain control of target creature and it gains haste; or sacrifice a creature, then Grab the Reins deals damage equal to that creature's power to target creature or player. -Entwine {2}{R} (Choose both if you pay the entwine cost.) -MRD U - -Graceful Adept -{2}{U} -Creature - Human Wizard -1/3 -You have no maximum hand size. -CHK U - -Graceful Antelope -{2}{W}{W} -Creature - Antelope -1/4 -Plainswalk -Whenever Graceful Antelope deals combat damage to a player, you may have target land become a Plains until Graceful Antelope leaves the battlefield. -ODY R - -Graceful Reprieve -{1}{W} -Instant -When target creature dies this turn, return that card to the battlefield under its owner's control. -MOR U - -Grafted Exoskeleton -{4} -Artifact - Equipment -Equipped creature gets +2/+2 and has infect. (It deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -Whenever Grafted Exoskeleton becomes unattached from a permanent, sacrifice that permanent. -Equip {2} -SOM U - -Grafted Skullcap -{4} -Artifact -At the beginning of your draw step, draw an additional card. -At the beginning of your end step, discard your hand. -USG R, 7ED R - -Grafted Wargear -{3} -Artifact - Equipment -Equipped creature gets +3/+2. -Whenever Grafted Wargear becomes unattached from a permanent, sacrifice that permanent. -Equip {0} ({0}: Attach to target creature you control. Equip only as a sorcery.) -5DN U - -Grand Abolisher -{W}{W} -Creature - Human Cleric -2/2 -During your turn, your opponents can't cast spells or activate abilities of artifacts, creatures, or enchantments. -M12 R - -Grand Arbiter Augustin IV -{2}{W}{U} -Legendary Creature - Human Advisor -2/3 -White spells you cast cost {1} less to cast. -Blue spells you cast cost {1} less to cast. -Spells your opponents cast cost {1} more to cast. -DIS R - -Grand Architect -{1}{U}{U} -Creature - Vedalken Artificer -1/3 -Other blue creatures you control get +1/+1. -{U}: Target artifact creature becomes blue until end of turn. -Tap an untapped blue creature you control: Add {2} to your mana pool. Spend this mana only to cast artifact spells or activate abilities of artifacts. -SOM R - -Grand Coliseum -Land -Grand Coliseum enters the battlefield tapped. -{T}: Add {1} to your mana pool. -{T}: Add one mana of any color to your mana pool. Grand Coliseum deals 1 damage to you. -ONS R - -Grand Melee -{3}{R} -Enchantment -All creatures attack each turn if able. -All creatures block each turn if able. -ONS R - -Grandmother Sengir -{4}{B} -Legendary Creature - Human Wizard -3/3 -{1}{B}, {T}: Target creature gets -1/-1 until end of turn. -HML R, ME2 R - -Granger Guildmage -{G} -Creature - Human Wizard -1/1 -{W}, {T}: Target creature gains first strike until end of turn. -{R}, {T}: Granger Guildmage deals 1 damage to target creature or player and 1 damage to you. -MIR C - -Granite Gargoyle -{2}{R} -Creature - Gargoyle -2/2 -Flying -{R}: Granite Gargoyle gets +0/+1 until end of turn. -LEA R, LEB R, 2ED R, 3ED R, MED U - -Granite Grip -{2}{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+0 for each Mountain you control. -ULG C, 7ED C - -Granite Shard -{3} -Artifact -{3}, {T} or {R}, {T}: Granite Shard deals 1 damage to target creature or player. -MRD U - -Granulate -{2}{R}{R} -Sorcery -Destroy each nonland artifact with converted mana cost 4 or less. -5DN R - -Grapeshot -{1}{R} -Sorcery -Grapeshot deals 1 damage to target creature or player. -Storm (When you cast this spell, copy it for each spell cast before it this turn. You may choose new targets for the copies.) -TSP C - -Grapeshot Catapult -{4} -Artifact Creature - Construct -2/3 -{T}: Grapeshot Catapult deals 1 damage to target creature with flying. -ATQ C, 4ED C, 5ED C, 7ED U, ME4 U - -Grappler Spider -{1}{G} -Creature - Spider -2/1 -Reach (This creature can block creatures with flying.) -WWK C - -Grappling Hook -{4} -Artifact - Equipment -Equipped creature has double strike. -Whenever equipped creature attacks, you may have target creature block it this turn if able. -Equip {4} -ZEN R - -Grasp of Darkness -{B}{B} -Instant -Target creature gets -4/-4 until end of turn. -SOM C - -Grassland Crusader -{5}{W} -Creature - Human Cleric Soldier -2/4 -{T}: Target Elf or Soldier creature gets +2/+2 until end of turn. -ONS C - -Grasslands -Land -Grasslands enters the battlefield tapped. -{T}, Sacrifice Grasslands: Search your library for a Forest or Plains card and put it onto the battlefield. Then shuffle your library. -MIR U, DDG U - -Gratuitous Violence -{2}{R}{R}{R} -Enchantment -If a creature you control would deal damage to a creature or player, it deals double that damage to that creature or player instead. -ONS R - -Grave Consequences -{1}{B} -Instant -Each player may exile any number of cards from his or her graveyard. Then each player loses 1 life for each card in his or her graveyard. -Draw a card. -JUD U - -Grave Defiler -{3}{B} -Creature - Zombie -2/1 -When Grave Defiler enters the battlefield, reveal the top four cards of your library. Put all Zombie cards revealed this way into your hand and the rest on the bottom of your library in any order. -{1}{B}: Regenerate Grave Defiler. -APC U - -Grave Pact -{1}{B}{B}{B} -Enchantment -Whenever a creature you control dies, each other player sacrifices a creature. -STH R, 8ED R, 9ED R, 10E R, HOP R, COM R - -Grave Peril -{1}{B} -Enchantment -When a nonblack creature enters the battlefield, sacrifice Grave Peril. If you do, destroy that creature. -FUT C - -Grave Robbers -{1}{B}{B} -Creature - Human Rogue -1/1 -{B}, {T}: Exile target artifact card from a graveyard. You gain 2 life. -DRK R - -Grave Scrabbler -{3}{B} -Creature - Zombie -2/2 -Madness {1}{B} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -When Grave Scrabbler enters the battlefield, if its madness cost was paid, you may return target creature card from a graveyard to its owner's hand. -FUT C - -Grave Servitude -{1}{B} -Enchantment - Aura -You may cast Grave Servitude as though it had flash. If you cast it any time a sorcery couldn't have been cast, the controller of the permanent it becomes sacrifices it at the beginning of the next cleanup step. -Enchant creature -Enchanted creature gets +3/-1 and is black. -MIR C - -Grave Titan -{4}{B}{B} -Creature - Giant -6/6 -Deathtouch -Whenever Grave Titan enters the battlefield or attacks, put two 2/2 black Zombie creature tokens onto the battlefield. -M11 M, M12 M - -Grave-Shell Scarab -{2}{B}{G}{G} -Creature - Insect -4/4 -{1}, Sacrifice Grave-Shell Scarab: Draw a card. -Dredge 1 (If you would draw a card, instead you may put exactly one card from the top of your library into your graveyard. If you do, return this card from your graveyard to your hand. Otherwise, draw a card.) -RAV R - -Gravebane Zombie -{3}{B} -Creature - Zombie -3/2 -If Gravebane Zombie would die, put Gravebane Zombie on top of its owner's library instead. -MIR C, 6ED U - -Gravebind -{B} -Instant -Target creature can't be regenerated this turn. -Draw a card at the beginning of the next turn's upkeep. -ICE R, ME4 C - -Graveborn Muse -{2}{B}{B} -Creature - Zombie Spirit -3/3 -At the beginning of your upkeep, you draw X cards and you lose X life, where X is the number of Zombies you control. -LGN R, 10E R - -Gravedigger -{3}{B} -Creature - Zombie -2/2 -When Gravedigger enters the battlefield, you may return target creature card from your graveyard to your hand. -POR U, TMP C, 6ED C, S99 U, BTD C, 7ED C, ODY C, 8ED C, 9ED C, 10E C, M10 C, HOP C, M11 C, COM C, M12 C - -Gravegouger -{2}{B} -Creature - Nightmare Horror -2/2 -When Gravegouger enters the battlefield, exile up to two target cards from a single graveyard. -When Gravegouger leaves the battlefield, return the exiled cards to their owner's graveyard. -TOR C - -Gravel Slinger -{3}{W} -Creature - Human Soldier -1/3 -{T}: Gravel Slinger deals 1 damage to target attacking or blocking creature. -Morph {1}{W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS C - -Gravelgill Axeshark -{4}{U/B} -Creature - Merfolk Soldier -3/3 -Persist (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) -SHM C - -Gravelgill Duo -{2}{U/B} -Creature - Merfolk Rogue Warrior -2/1 -Whenever you cast a blue spell, Gravelgill Duo gets +1/+1 until end of turn. -Whenever you cast a black spell, Gravelgill Duo gains fear until end of turn. (It can't be blocked except by artifact creatures and/or black creatures.) -SHM C - -Graven Cairns -Land -{T}: Add {1} to your mana pool. -{B/R}, {T}: Add {B}{B}, {B}{R}, or {R}{R} to your mana pool. -FUT R, SHM R - -Graven Dominator -{4}{W}{W} -Creature - Gargoyle -4/4 -Flying -Haunt (When this creature dies, exile it haunting target creature.) -When Graven Dominator enters the battlefield or the creature it haunts dies, each other creature becomes 1/1 until end of turn. -GPT R - -Gravespawn Sovereign -{4}{B}{B} -Creature - Zombie -3/3 -Tap five untapped Zombies you control: Put target creature card from a graveyard onto the battlefield under your control. -ONS R - -Gravestorm -{B}{B}{B} -Enchantment -At the beginning of your upkeep, target opponent may exile a card from his or her graveyard. If that player doesn't, you may draw a card. -ODY R - -Gravitational Shift -{3}{U}{U} -Enchantment -Creatures with flying get +2/+0. -Creatures without flying get -2/-0. -ROE R - -Gravity Sphere -{2}{R} -World Enchantment -All creatures lose flying. -LEG R - -Gravity Well -{1}{G}{G} -Enchantment -Whenever a creature with flying attacks, it loses flying until end of turn. -ROE U - -Graxiplon -{5}{U} -Creature - Beast -3/4 -Graxiplon is unblockable unless defending player controls three or more creatures that share a creature type. -ONS U - -Gray Ogre -{2}{R} -Creature - Ogre -2/2 -LEA C, LEB C, 2ED C, 3ED C, 4ED C - -Graypelt Hunter -{3}{G} -Creature - Human Warrior Ally -2/2 -Trample -Whenever Graypelt Hunter or another Ally enters the battlefield under your control, you may put a +1/+1 counter on Graypelt Hunter. -WWK C - -Graypelt Refuge -Land -Graypelt Refuge enters the battlefield tapped. -When Graypelt Refuge enters the battlefield, you gain 1 life. -{T}: Add {G} or {W} to your mana pool. -ZEN U, ARC U - -Grayscaled Gharial -{U} -Creature - Crocodile -1/1 -Islandwalk -RAV C - -Grazing Gladehart -{2}{G} -Creature - Antelope -2/2 -Landfall - Whenever a land enters the battlefield under your control, you may gain 2 life. -ZEN C - -Grazing Kelpie -{3}{G/U} -Creature - Beast -2/3 -{G/U}, Sacrifice Grazing Kelpie: Put target card from a graveyard on the bottom of its owner's library. -Persist (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) -EVE C - -Great Defender -{W} -Instant -Target creature gets +0/+X until end of turn, where X is its converted mana cost. -LEG U - -Great Furnace -Artifact Land -(Great Furnace isn't a spell.) -{T}: Add {R} to your mana pool. -MRD C, HOP C - -Great Sable Stag -{1}{G}{G} -Creature - Elk -3/3 -Great Sable Stag can't be countered. -Protection from blue and from black (This creature can't be blocked, targeted, dealt damage, or enchanted by anything blue or black.) -M10 R - -Great Wall -{2}{W} -Enchantment -Creatures with plainswalk can be blocked as though they didn't have plainswalk. -LEG U - -Great Whale -{5}{U}{U} -Creature - Whale -5/5 -When Great Whale enters the battlefield, untap up to seven lands. -USG R - -Greatbow Doyen -{4}{G} -Creature - Elf Archer -2/4 -Other Archer creatures you control get +1/+1. -Whenever an Archer you control deals damage to a creature, that Archer deals that much damage to that creature's controller. -MOR R - -Greater Auramancy -{1}{W} -Enchantment -Other enchantments you control have shroud. -Enchanted creatures you control have shroud. -SHM R - -Greater Basilisk -{3}{G}{G} -Creature - Basilisk -3/5 -Deathtouch (Any amount of damage this deals to a creature is enough to destroy it.) -M11 C, M12 C - -Greater Forgeling -{3}{R}{R} -Creature - Elemental -3/4 -{1}{R}: Greater Forgeling gets +3/-3 until end of turn. -RAV U - -Greater Gargadon -{9}{R} -Creature - Beast -9/7 -Suspend 10-{R} (Rather than cast this card from your hand, you may pay {R} and exile it with ten time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -Sacrifice an artifact, creature, or land: Remove a time counter from Greater Gargadon. Activate this ability only if Greater Gargadon is suspended. -TSP R - -Greater Good -{2}{G}{G} -Enchantment -Sacrifice a creature: Draw cards equal to the sacrificed creature's power, then discard three cards. -USG R, 9ED R - -Greater Harvester -{2}{B}{B}{B} -Creature - Horror -5/6 -At the beginning of your upkeep, sacrifice a permanent. -Whenever Greater Harvester deals combat damage to a player, that player sacrifices two permanents. -DST R - -Greater Mossdog -{3}{G} -Creature - Plant Hound -3/3 -Dredge 3 (If you would draw a card, instead you may put exactly three cards from the top of your library into your graveyard. If you do, return this card from your graveyard to your hand. Otherwise, draw a card.) -RAV C - -Greater Realm of Preservation -{1}{W} -Enchantment -{1}{W}: The next time a black or red source of your choice would deal damage to you this turn, prevent that damage. -LEG U, 5ED U, MED U - -Greater Stone Spirit -{4}{R}{R} -Creature - Elemental Spirit -4/4 -Greater Stone Spirit can't be blocked by creatures with flying. -{2}{R}: Until end of turn, target creature gets +0/+2 and gains "{R}: This creature gets +1/+0 until end of turn." -CSP U - -Greater Werewolf -{4}{B} -Creature - Human Wolf -2/4 -At end of combat, put a -0/-2 counter on each creature blocking or blocked by Greater Werewolf. -HML C, 5ED U - -Greatsword -{3} -Artifact - Equipment -Equipped creature gets +3/+0. -Equip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) -M12 U - -Greed -{3}{B} -Enchantment -{B}, Pay 2 life: Draw a card. -LEG R, 4ED R, 6ED R, 7ED R - -Greel's Caress -{1}{B} -Enchantment - Aura -Flash -Enchant creature -Enchanted creature gets -3/-0. -PCY C - -Greel, Mind Raker -{3}{B}{B} -Legendary Creature - Horror Spellshaper -3/3 -{X}{B}, {T}, Discard two cards: Target player discards X cards at random. -PCY R - -Green Mana Battery -{4} -Artifact -{2}, {T}: Put a charge counter on Green Mana Battery. -{T}, Remove any number of charge counters from Green Mana Battery: Add {G} to your mana pool, then add an additional {G} to your mana pool for each charge counter removed this way. -LEG U, 4ED R - -Green Scarab -{W} -Enchantment - Aura -Enchant creature -Enchanted creature can't be blocked by green creatures. -Enchanted creature gets +2/+2 as long as an opponent controls a green permanent. -ICE U - -Green Sun's Zenith -{X}{G} -Sorcery -Search your library for a green creature card with converted mana cost X or less, put it onto the battlefield, then shuffle your library. Shuffle Green Sun's Zenith into its owner's library. -MBS R - -Green Ward -{W} -Enchantment - Aura -Enchant creature -Enchanted creature has protection from green. This effect doesn't remove Green Ward. -LEA U, LEB U, 2ED U, 3ED U, 4ED U - -Greener Pastures -{2}{G} -Enchantment -At the beginning of each player's upkeep, if that player controls more lands than each other player, the player puts a 1/1 green Saproling creature token onto the battlefield. -USG R - -Greenhilt Trainee -{3}{G} -Creature - Elf Warrior -2/3 -{T}: Target creature gets +4/+4 until end of turn. Activate this ability only if Greenhilt Trainee's power is 4 or greater. -NPH U - -Greenseeker -{G} -Creature - Elf Spellshaper -1/1 -{G}, {T}, Discard a card: Search your library for a basic land card, reveal it, and put it into your hand. Then shuffle your library. -TSP C - -Greenweaver Druid -{2}{G} -Creature - Elf Druid -1/1 -{T}: Add {G}{G} to your mana pool. -ZEN U - -Gremlin Mine -{1} -Artifact -{1}, {T}, Sacrifice Gremlin Mine: Gremlin Mine deals 4 damage to target artifact creature. -{1}, {T}, Sacrifice Gremlin Mine: Remove up to four charge counters from target noncreature artifact. -NPH C - -Greven il-Vec -Vanguard -Hand -1, life +2 -Whenever a creature you control deals damage to a creature, destroy the other creature. It can't be regenerated. -VG S - -Grid Monitor -{4} -Artifact Creature - Construct -4/6 -You can't cast creature spells. -MRD R - -Grief Tyrant -{5}{B/R} -Creature - Horror -8/8 -Grief Tyrant enters the battlefield with four -1/-1 counters on it. -When Grief Tyrant dies, put a -1/-1 counter on target creature for each -1/-1 counter on Grief Tyrant. -SHM U - -Griffin Canyon -Land -{T}: Add {1} to your mana pool. -{T}: Untap target Griffin. If it's a creature, it gets +1/+1 until end of turn. -VIS R - -Griffin Guide -{2}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2 and has flying. -When enchanted creature dies, put a 2/2 white Griffin creature token with flying onto the battlefield. -TSP U, DDG U - -Griffin Rider -{1}{W} -Creature - Human Knight -1/1 -As long as you control a Griffin creature, Griffin Rider gets +3/+3 and has flying. -M12 C - -Griffin Sentinel -{2}{W} -Creature - Griffin -1/3 -Flying -Vigilance (Attacking doesn't cause this creature to tap.) -M10 C, M12 C - -Grifter's Blade -{3} -Artifact - Equipment -Flash -As Grifter's Blade enters the battlefield, choose a creature you control it could be attached to. If you do, it enters the battlefield attached to that creature. -Equipped creature gets +1/+1. -Equip {1} -RAV U - -Grim Affliction -{2}{B} -Instant -Put a -1/-1 counter on target creature, then proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.) -NPH C - -Grim Discovery -{1}{B} -Sorcery -Choose one or both - Return target creature card from your graveyard to your hand; and/or return target land card from your graveyard to your hand. -ZEN C - -Grim Feast -{1}{B}{G} -Enchantment -At the beginning of your upkeep, Grim Feast deals 1 damage to you. -Whenever a creature is put into an opponent's graveyard from the battlefield, you gain life equal to its toughness. -MIR R - -Grim Harvest -{1}{B} -Instant -Return target creature card from your graveyard to your hand. -Recover {2}{B} (When a creature is put into your graveyard from the battlefield, you may pay {2}{B}. If you do, return this card from your graveyard to your hand. Otherwise, exile this card.) -CSP C - -Grim Lavamancer -{R} -Creature - Human Wizard -1/1 -{R}, {T}, Exile two cards from your graveyard: Grim Lavamancer deals 2 damage to target creature or player. -TOR R, H10 R, M12 R - -Grim Monolith -{2} -Artifact -Grim Monolith doesn't untap during your untap step. -{T}: Add {3} to your mana pool. -{4}: Untap Grim Monolith. -ULG R - -Grim Poppet -{7} -Artifact Creature - Scarecrow -4/4 -Grim Poppet enters the battlefield with three -1/-1 counters on it. -Remove a -1/-1 counter from Grim Poppet: Put a -1/-1 counter on another target creature. -SHM R - -Grim Reminder -{2}{B} -Instant -Search your library for a nonland card and reveal it. Each opponent who cast a card this turn with the same name as that card loses 6 life. Then shuffle your library. -{B}{B}: Return Grim Reminder from your graveyard to your hand. Activate this ability only during your upkeep. -MRD R - -Grim Tutor -{1}{B}{B} -Sorcery -Search your library for a card and put that card into your hand, then shuffle your library. You lose 3 life. -S99 R, ME3 R - -Grimclaw Bats -{1}{B} -Creature - Bat -1/1 -Flying -{B}, Pay 1 life: Grimclaw Bats gets +1/+1 until end of turn. -DST C - -Grimoire Thief -{U}{U} -Creature - Merfolk Rogue -2/2 -Whenever Grimoire Thief becomes tapped, exile the top three cards of target opponent's library face down. -You may look at cards exiled with Grimoire Thief. -{U}, Sacrifice Grimoire Thief: Turn all cards exiled with Grimoire Thief face up. Counter all spells with those names. -MOR R - -Grindclock -{2} -Artifact -{T}: Put a charge counter on Grindclock. -{T}: Target player puts the top X cards of his or her library into his or her graveyard, where X is the number of charge counters on Grindclock. -SOM R - -Grinding Station -{2} -Artifact -{T}, Sacrifice an artifact: Target player puts the top three cards of his or her library into his or her graveyard. -Whenever an artifact enters the battlefield, you may untap Grinding Station. -5DN U - -Grindstone -{1} -Artifact -{3}, {T}: Put the top two cards of target player's library into that player's graveyard. If both cards share a color, repeat this process. -TMP R - -Grinning Demon -{2}{B}{B} -Creature - Demon -6/6 -At the beginning of your upkeep, you lose 2 life. -Morph {2}{B}{B} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS R - -Grinning Demon Avatar -Vanguard -Hand -1, life -2 -Whenever a nontoken creature you control dies, target opponent discards a card. -VG S (x2) - -Grinning Ignus -{2}{R} -Creature - Elemental -2/2 -{R}, Return Grinning Ignus to its owner's hand: Add {2}{R} to your mana pool. Activate this ability only any time you could cast a sorcery. -FUT C - -Grinning Totem -{4} -Artifact -{2}, {T}, Sacrifice Grinning Totem: Search target opponent's library for a card and exile it. Then that player shuffles his or her library. Until the beginning of your next upkeep, you may play that card. At the beginning of your next upkeep, if you haven't played it, put it into its owner's graveyard. -MIR R, 6ED R, TSB S - -Grip of Amnesia -{1}{U} -Instant -Counter target spell unless its controller exiles all cards from his or her graveyard. -Draw a card. -JUD C - -Grip of Chaos -{4}{R}{R} -Enchantment -Whenever a spell or ability is put onto the stack, if it has a single target, reselect its target at random. (Select from among all legal targets.) -SCG R - -Gristle Grinner -{4}{B} -Creature - Zombie -3/3 -Whenever a creature dies, Gristle Grinner gets +2/+2 until end of turn. -CSP U - -Gristleback -{2}{G} -Creature - Boar Beast -2/2 -Bloodthirst 1 (If an opponent was dealt damage this turn, this creature enters the battlefield with a +1/+1 counter on it.) -Sacrifice Gristleback: You gain life equal to Gristleback's power. -GPT U - -Grixis -Plane - Alara -Blue, black, and/or red creature cards in your graveyard have unearth. The unearth cost is equal to the card's mana cost. (Pay the card's mana cost: Return it to the battlefield. The creature gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) -Whenever you roll {C}, put target creature card from a graveyard onto the battlefield under your control. -HOP C - -Grixis Battlemage -{2}{B} -Creature - Human Wizard -2/2 -{U}, {T}: Draw a card, then discard a card. -{R}, {T}: Target creature can't block this turn. -ALA U - -Grixis Charm -{U}{B}{R} -Instant -Choose one - Return target permanent to its owner's hand; or target creature gets -4/-4 until end of turn; or creatures you control get +2/+0 until end of turn. -ALA U - -Grixis Grimblade -{U/R}{B} -Creature - Zombie Warrior -2/1 -As long as you control another multicolored permanent, Grixis Grimblade gets +1/+1 and has deathtouch. (Any amount of damage it deals to a creature is enough to destroy that creature.) -ARB C - -Grixis Illusionist -{U} -Creature - Human Wizard -1/1 -{T}: Target land you control becomes the basic land type of your choice until end of turn. -CON C - -Grixis Panorama -Land -{T}: Add {1} to your mana pool. -{1}, {T}, Sacrifice Grixis Panorama: Search your library for a basic Island, Swamp, or Mountain card and put it onto the battlefield tapped. Then shuffle your library. -ALA C - -Grixis Slavedriver -{5}{B} -Creature - Zombie Giant -4/4 -When Grixis Slavedriver leaves the battlefield, put a 2/2 black Zombie creature token onto the battlefield. -Unearth {3}{B} ({3}{B}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) -CON U - -Grixis Sojourners -{1}{U}{B}{R} -Creature - Zombie Ogre -4/3 -When you cycle Grixis Sojourners or it dies, you may exile target card from a graveyard. -Cycling {2}{B} ({2}{B}, Discard this card: Draw a card.) -ARB C - -Grizzled Leotau -{G}{W} -Creature - Cat -1/5 -ARB C - -Grizzled Wolverine -{1}{R}{R} -Creature - Wolverine -2/2 -Whenever Grizzled Wolverine becomes blocked, you may pay {R}. If you do, Grizzled Wolverine gets +2/+0 until end of turn. -ICE C - -Grizzly Bears -{1}{G} -Creature - Bear -2/2 -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, POR C, 6ED C, S99 C, 7ED C, 8ED C, 9ED C, 10E C - -Grizzly Fate -{3}{G}{G} -Sorcery -Put two 2/2 green Bear creature tokens onto the battlefield. -Threshold - Put four 2/2 green Bear creature tokens onto the battlefield instead if seven or more cards are in your graveyard. -Flashback {5}{G}{G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -JUD U - -Groffskithur -{5}{G} -Creature - Beast -3/3 -Whenever Groffskithur becomes blocked, you may return target card named Groffskithur from your graveyard to your hand. -MRD C - -Grollub -{2}{B} -Creature - Beast -3/3 -Whenever Grollub is dealt damage, each opponent gains that much life. -EXO C - -Grotag Siege-Runner -{1}{R} -Creature - Goblin Rogue -2/1 -{R}, Sacrifice Grotag Siege-Runner: Destroy target creature with defender. Grotag Siege-Runner deals 2 damage to that creature's controller. -ROE C - -Grotag Thrasher -{4}{R} -Creature - Lizard -3/3 -Whenever Grotag Thrasher attacks, target creature can't block this turn. -WWK C - -Grotesque Hybrid -{4}{B} -Creature - Zombie -3/3 -Whenever Grotesque Hybrid deals combat damage to a creature, destroy that creature. It can't be regenerated. -Discard a card: Grotesque Hybrid gains flying and protection from green and from white until end of turn. -TOR U - -Ground Rift -{R} -Sorcery -Target creature without flying can't block this turn. -Storm (When you cast this spell, copy it for each spell cast before it this turn. You may choose new targets for the copies.) -TSP C - -Ground Seal -{1}{G} -Enchantment -When Ground Seal enters the battlefield, draw a card. -Cards in graveyards can't be the targets of spells or abilities. -ODY R - -Groundbreaker -{G}{G}{G} -Creature - Elemental -6/1 -Trample, haste -At the beginning of the end step, sacrifice Groundbreaker. -PLC R - -Groundling Pouncer -{1}{G/U} -Creature - Faerie -2/1 -{G/U}: Groundling Pouncer gets +1/+3 and gains flying until end of turn. Activate this ability only once each turn and only if an opponent controls a creature with flying. -EVE U - -Groundskeeper -{G} -Creature - Human Druid -1/1 -{1}{G}: Return target basic land card from your graveyard to your hand. -MMQ U, 9ED U - -Groundswell -{G} -Instant -Target creature gets +2/+2 until end of turn. -Landfall - If you had a land enter the battlefield under your control this turn, that creature gets +4/+4 until end of turn instead. -WWK C - -Grove of the Burnwillows -Land -{T}: Add {1} to your mana pool. -{T}: Add {R} or {G} to your mana pool. Each opponent gains 1 life. -FUT R - -Growth Spasm -{2}{G} -Sorcery -Search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. Put a 0/1 colorless Eldrazi Spawn creature token onto the battlefield. It has "Sacrifice this creature: Add {1} to your mana pool." -ROE C - -Grozoth -{6}{U}{U}{U} -Creature - Leviathan -9/9 -Defender (This creature can't attack.) -When Grozoth enters the battlefield, you may search your library for any number of cards that have converted mana cost 9, reveal them, and put them into your hand. If you do, shuffle your library. -{4}: Grozoth loses defender until end of turn. -Transmute {1}{U}{U} ({1}{U}{U}, Discard this card: Search your library for a card with the same converted mana cost as this card, reveal it, and put it into your hand. Then shuffle your library. Transmute only as a sorcery.) -RAV R - -Gruesome Encore -{2}{B} -Sorcery -Put target creature card from an opponent's graveyard onto the battlefield under your control. It gains haste. Exile it at the beginning of the next end step. If that creature would leave the battlefield, exile it instead of putting it anywhere else. -MBS U - -Gruul Guildmage -{R/G}{R/G} -Creature - Human Shaman -2/2 -({R/G} can be paid with either {R} or {G}.) -{3}{R}, Sacrifice a land: Gruul Guildmage deals 2 damage to target player. -{3}{G}: Target creature gets +2/+2 until end of turn. -GPT U - -Gruul Nodorog -{4}{G}{G} -Creature - Beast -4/4 -{R}: Gruul Nodorog can't be blocked this turn except by two or more creatures. -GPT C - -Gruul Scrapper -{3}{G} -Creature - Human Berserker -3/2 -When Gruul Scrapper enters the battlefield, if {R} was spent to cast Gruul Scrapper, it gains haste until end of turn. -GPT C - -Gruul Signet -{2} -Artifact -{1}, {T}: Add {R}{G} to your mana pool. -GPT C, ARC C, COM C - -Gruul Turf -Land -Gruul Turf enters the battlefield tapped. -When Gruul Turf enters the battlefield, return a land you control to its owner's hand. -{T}: Add {R}{G} to your mana pool. -GPT C, HOP C, COM C - -Gruul War Plow -{4} -Artifact -Creatures you control have trample. -{1}{R}{G}: Gruul War Plow becomes a 4/4 Juggernaut artifact creature until end of turn. -GPT R - -Guan Yu's 1,000-Li March -{4}{W}{W} -Sorcery -Destroy all tapped creatures. -PTK R, ME3 R - -Guan Yu, Sainted Warrior -{3}{W}{W} -Legendary Creature - Human Soldier Warrior -3/5 -Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -When Guan Yu, Sainted Warrior is put into your graveyard from the battlefield, you may shuffle Guan Yu into your library. -PTK R, ME3 U - -Guard Dogs -{3}{W} -Creature - Hound -2/2 -{2}{W}, {T}: Choose a permanent you control. Prevent all combat damage target creature would deal this turn if it shares a color with that permanent. -PLS U - -Guard Duty -{W} -Enchantment - Aura -Enchant creature -Enchanted creature has defender. -ROE C - -Guard Gomazoa -{2}{U} -Creature - Jellyfish -1/3 -Defender, flying -Prevent all combat damage that would be dealt to Guard Gomazoa. -ROE U, COM U - -Guardian Angel -{X}{W} -Instant -Prevent the next X damage that would be dealt to target creature or player this turn. Until end of turn, you may pay {1} any time you could cast an instant. If you do, prevent the next 1 damage that would be dealt to that creature or player this turn. -LEA C, LEB C, 2ED C, 3ED C - -Guardian Beast -{3}{B} -Creature - Beast -2/4 -As long as Guardian Beast is untapped, noncreature artifacts you control can't be enchanted, they're indestructible, and other players can't gain control of them. This effect doesn't remove Auras already attached to those artifacts. -ARN R, ME4 R - -Guardian Idol -{2} -Artifact -Guardian Idol enters the battlefield tapped. -{T}: Add {1} to your mana pool. -{2}: Guardian Idol becomes a 2/2 Golem artifact creature until end of turn. -5DN U - -Guardian Seraph -{2}{W}{W} -Creature - Angel -3/4 -Flying -If a source an opponent controls would deal damage to you, prevent 1 of that damage. -M10 R - -Guardian Zendikon -{2}{W} -Enchantment - Aura -Enchant land -Enchanted land is a 2/6 white Wall creature with defender. It's still a land. -When enchanted land dies, return that card to its owner's hand. -WWK C - -Guardian of Cloverdell -{5}{G}{G} -Creature - Treefolk Shaman -4/5 -When Guardian of Cloverdell enters the battlefield, put three 1/1 white Kithkin Soldier creature tokens onto the battlefield. -{G}, Sacrifice a Kithkin: You gain 1 life. -LRW U - -Guardian of Solitude -{1}{U} -Creature - Spirit -1/2 -Whenever you cast a Spirit or Arcane spell, target creature gains flying until end of turn. -CHK U - -Guardian of Vitu-Ghazi -{6}{G}{W} -Creature - Elemental -4/7 -Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.) -Vigilance -RAV C - -Guardian of the Guildpact -{3}{W} -Creature - Spirit -2/3 -Protection from monocolored -DIS C - -Guardian's Magemark -{2}{W} -Enchantment - Aura -Flash -Enchant creature -Creatures you control that are enchanted get +1/+1. -GPT C - -Guardians of Akrasa -{2}{W} -Creature - Human Soldier -0/4 -Defender -Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.) -ALA C - -Guardians' Pledge -{1}{W}{W} -Instant -White creatures you control get +2/+2 until end of turn. -M12 C - -Guerrilla Tactics -{1}{R} -Instant -Guerrilla Tactics deals 2 damage to target creature or player. -When a spell or ability an opponent controls causes you to discard Guerrilla Tactics, Guerrilla Tactics deals 4 damage to target creature or player. -ALL C (x2), 8ED U, 9ED U, 10E U - -Guided Passage -{U}{R}{G} -Sorcery -Reveal the cards in your library. An opponent chooses from among them a creature card, a land card, and a noncreature, nonland card. You put the chosen cards into your hand. Then shuffle your library. -APC R - -Guided Strike -{1}{W} -Instant -Target creature gets +1/+0 and gains first strike until end of turn. -Draw a card. -WTH C, JUD C - -Guiding Spirit -{1}{W}{U} -Creature - Angel Spirit -1/2 -Flying -{T}: If the top card of target player's graveyard is a creature card, put that card on top of that player's library. -VIS R - -Guile -{3}{U}{U}{U} -Creature - Elemental Incarnation -6/6 -Guile can't be blocked except by three or more creatures. -If a spell or ability you control would counter a spell, instead exile that spell and you may play that card without paying its mana cost. -When Guile is put into a graveyard from anywhere, shuffle it into its owner's library. -LRW R, JVC R - -Guiltfeeder -{3}{B}{B} -Creature - Horror -0/4 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -Whenever Guiltfeeder attacks and isn't blocked, defending player loses 1 life for each card in his or her graveyard. -JUD R - -Guilty Conscience -{W} -Enchantment - Aura -Enchant creature -Whenever enchanted creature deals damage, Guilty Conscience deals that much damage to that creature. -SCG C - -Gulf Squid -{3}{U} -Creature - Squid Beast -2/2 -When Gulf Squid enters the battlefield, tap all lands target player controls. -PCY C - -Guma -{2}{R} -Creature - Cat -2/2 -Protection from blue -USG U - -Gurzigost -{3}{G}{G} -Creature - Beast -6/8 -At the beginning of your upkeep, sacrifice Gurzigost unless you put two cards from your graveyard on the bottom of your library. -{G}{G}, Discard a card: You may have Gurzigost assign its combat damage this turn as though it weren't blocked. -TOR R - -Gush -{4}{U} -Instant -You may return two Islands you control to their owner's hand rather than pay Gush's mana cost. -Draw two cards. -MMQ C, JVC C - -Gust-Skimmer -{2} -Artifact Creature - Insect -2/1 -{U}: Gust-Skimmer gains flying until end of turn. -MBS C - -Gustcloak Cavalier -{3}{W}{W} -Creature - Human Knight -2/2 -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -Whenever Gustcloak Cavalier attacks, you may tap target creature. -Whenever Gustcloak Cavalier becomes blocked, you may untap Gustcloak Cavalier and remove it from combat. -TSP U - -Gustcloak Harrier -{1}{W}{W} -Creature - Bird Soldier -2/2 -Flying -Whenever Gustcloak Harrier becomes blocked, you may untap it and remove it from combat. -ONS C - -Gustcloak Runner -{W} -Creature - Human Soldier -1/1 -Whenever Gustcloak Runner becomes blocked, you may untap it and remove it from combat. -ONS C - -Gustcloak Savior -{4}{W} -Creature - Bird Soldier -3/4 -Flying -Whenever a creature you control becomes blocked, you may untap that creature and remove it from combat. -ONS R - -Gustcloak Sentinel -{2}{W}{W} -Creature - Human Soldier -3/3 -Whenever Gustcloak Sentinel becomes blocked, you may untap it and remove it from combat. -ONS U - -Gustcloak Skirmisher -{3}{W} -Creature - Bird Soldier -2/3 -Flying -Whenever Gustcloak Skirmisher becomes blocked, you may untap it and remove it from combat. -ONS U - -Gustha's Scepter -{0} -Artifact -{T}: Exile a card from your hand face down. You may look at it for as long as it remains exiled. -{T}: Return a card you own exiled with Gustha's Scepter to your hand. -When you lose control of Gustha's Scepter, put all cards exiled with Gustha's Scepter into their owner's graveyard. -ALL R, ME2 R - -Gustrider Exuberant -{2}{W} -Creature - Human Wizard -1/2 -Flying -Sacrifice Gustrider Exuberant: Creatures you control with power 5 or greater gain flying until end of turn. -ALA C - -Gut Shot -{R/P} -Instant -({R/P} can be paid with either {R} or 2 life.) -Gut Shot deals 1 damage to target creature or player. -NPH U - -Gutless Ghoul -{2}{B} -Snow Creature - Zombie -2/2 -{1}, Sacrifice a creature: You gain 2 life. -CSP C - -Guttural Response -{R/G} -Instant -Counter target blue instant spell. -SHM U - -Gutwrencher Oni -{3}{B}{B} -Creature - Demon Spirit -5/4 -Trample -At the beginning of your upkeep, discard a card if you don't control an Ogre. -CHK U - -Guul Draz Assassin -{B} -Creature - Vampire Assassin -1/1 -Level up {1}{B} ({1}{B}: Put a level counter on this. Level up only as a sorcery.) -LEVEL 2-3 -2/2 -{B}, {T}: Target creature gets -2/-2 until end of turn. -LEVEL 4+ -4/4 -{B}, {T}: Target creature gets -4/-4 until end of turn. -ROE R - -Guul Draz Specter -{2}{B}{B} -Creature - Specter -2/2 -Flying -Guul Draz Specter gets +3/+3 as long as an opponent has no cards in hand. -Whenever Guul Draz Specter deals combat damage to a player, that player discards a card. -ZEN R - -Guul Draz Vampire -{B} -Creature - Vampire Rogue -1/1 -As long as an opponent has 10 or less life, Guul Draz Vampire gets +2/+1 and has intimidate. (It can't be blocked except by artifact creatures and/or creatures that share a color with it.) -ZEN C - -Gwafa Hazid, Profiteer -{1}{W}{U} -Legendary Creature - Human Rogue -2/2 -{W}{U}, {T}: Put a bribery counter on target creature you don't control. Its controller draws a card. -Creatures with bribery counters on them can't attack or block. -CON R - -Gwendlyn Di Corci -{U}{B}{B}{R} -Legendary Creature - Human Rogue -3/5 -{T}: Target player discards a card at random. Activate this ability only during your turn. -LEG R, ME3 R - -Gwyllion Hedge-Mage -{2}{W/B} -Creature - Hag Wizard -2/2 -When Gwyllion Hedge-Mage enters the battlefield, if you control two or more Plains, you may put a 1/1 white Kithkin Soldier creature token onto the battlefield. -When Gwyllion Hedge-Mage enters the battlefield, if you control two or more Swamps, you may put a -1/-1 counter on target creature. -EVE U, COM U - -Haakon, Stromgald Scourge -{1}{B}{B} -Legendary Creature - Zombie Knight -3/3 -You may cast Haakon, Stromgald Scourge from your graveyard, but not from anywhere else. -As long as Haakon is on the battlefield, you may play Knight cards from your graveyard. -When Haakon dies, you lose 2 life. -CSP R - -Haakon, Stromgald Scourge Avatar -Vanguard -Hand +0, life -3 -Pay 1 life: You may play target creature card in your graveyard this turn. -Whenever you play a creature card from your graveyard, it becomes a black Zombie Knight. -If a Zombie Knight would be put into your graveyard from the battlefield, exile it instead. -VG S - -Haazda Exonerator -{W} -Creature - Human Cleric -1/1 -{T}, Sacrifice Haazda Exonerator: Destroy target Aura. -DIS C - -Haazda Shield Mate -{2}{W} -Creature - Human Soldier -1/1 -At the beginning of your upkeep, sacrifice Haazda Shield Mate unless you pay {W}{W}. -{W}: The next time a source of your choice would deal damage to you this turn, prevent that damage. -DIS R - -Hada Freeblade -{W} -Creature - Human Soldier Ally -0/1 -Whenever Hada Freeblade or another Ally enters the battlefield under your control, you may put a +1/+1 counter on Hada Freeblade. -WWK U - -Hada Spy Patrol -{1}{U} -Creature - Human Rogue -1/1 -Level up {2}{U} ({2}{U}: Put a level counter on this. Level up only as a sorcery.) -LEVEL 1-2 -2/2 -Hada Spy Patrol is unblockable. -LEVEL 3+ -3/3 -Shroud -Hada Spy Patrol is unblockable. -ROE U - -Hag Hedge-Mage -{2}{B/G} -Creature - Hag Shaman -2/2 -When Hag Hedge-Mage enters the battlefield, if you control two or more Swamps, you may have target player discard a card. -When Hag Hedge-Mage enters the battlefield, if you control two or more Forests, you may put target card from your graveyard on top of your library. -EVE U - -Hagra Crocodile -{3}{B} -Creature - Crocodile -3/1 -Hagra Crocodile can't block. -Landfall - Whenever a land enters the battlefield under your control, Hagra Crocodile gets +2/+2 until end of turn. -ZEN C - -Hagra Diabolist -{4}{B} -Creature - Ogre Shaman Ally -3/2 -Whenever Hagra Diabolist or another Ally enters the battlefield under your control, you may have target player lose life equal to the number of Allies you control. -ZEN U - -Hail Storm -{1}{G}{G} -Instant -Hail Storm deals 2 damage to each attacking creature and 1 damage to you and each creature you control. -ALL U, TSB S - -Hail of Arrows -{X}{W} -Instant -Hail of Arrows deals X damage divided as you choose among any number of target attacking creatures. -SOK U, 10E U - -Hair-Strung Koto -{6} -Artifact -Tap an untapped creature you control: Target player puts the top card of his or her library into his or her graveyard. -CHK R - -Hakim, Loreweaver -{3}{U}{U} -Legendary Creature - Human Wizard -2/4 -Flying -{U}{U}: Return target Aura card from your graveyard to the battlefield attached to Hakim, Loreweaver. Activate this ability only during your upkeep and only if Hakim isn't enchanted. -{U}{U}, {T}: Destroy all Auras attached to Hakim. -MIR R - -Halam Djinn -{5}{R} -Creature - Djinn -6/5 -Haste -Halam Djinn gets -2/-2 as long as red is the most common color among all permanents or is tied for most common. -INV U - -Halberdier -{3}{R} -Creature - Human Barbarian -3/1 -First strike -ODY C - -Halcyon Glaze -{1}{U}{U} -Enchantment -Whenever you cast a creature spell, Halcyon Glaze becomes a 4/4 Illusion creature with flying until end of turn. It's still an enchantment. -RAV U - -Halfdane -{1}{W}{U}{B} -Legendary Creature - Shapeshifter -3/3 -At the beginning of your upkeep, Halfdane's power and toughness become equal to the power and toughness of target creature other than Halfdane until the end of your next upkeep. -LEG R, ME3 R - -Halimar Depths -Land -Halimar Depths enters the battlefield tapped. -When Halimar Depths enters the battlefield, look at the top three cards of your library, then put them back in any order. -{T}: Add {U} to your mana pool. -WWK C - -Halimar Excavator -{1}{U} -Creature - Human Wizard Ally -1/3 -Whenever Halimar Excavator or another Ally enters the battlefield under your control, target player puts the top X cards of his or her library into his or her graveyard, where X is the number of Allies you control. -WWK C - -Halimar Wavewatch -{1}{U} -Creature - Merfolk Soldier -0/3 -Level up {2} ({2}: Put a level counter on this. Level up only as a sorcery.) -LEVEL 1-4 -0/6 -LEVEL 5+ -6/6 -Islandwalk -ROE C - -Hall of Gemstone -{1}{G}{G} -World Enchantment -At the beginning of each player's upkeep, that player chooses a color. Until end of turn, lands tapped for mana produce mana of the chosen color instead of any other color. -MIR R - -Hall of the Bandit Lord -Legendary Land -Hall of the Bandit Lord enters the battlefield tapped. -{T}, Pay 3 life: Add {1} to your mana pool. If that mana is spent on a creature spell, that creature has haste. -CHK R - -Hallow -{W} -Instant -Prevent all damage target spell would deal this turn. You gain life equal to the damage prevented this way. -DST C - -Hallowed Burial -{3}{W}{W} -Sorcery -Put all creatures on the bottom of their owners' libraries. -EVE R - -Hallowed Fountain -Land - Plains Island -({T}: Add {W} or {U} to your mana pool.) -As Hallowed Fountain enters the battlefield, you may pay 2 life. If you don't, Hallowed Fountain enters the battlefield tapped. -DIS R - -Hallowed Ground -{1}{W} -Enchantment -{W}{W}: Return target nonsnow land you control to its owner's hand. -ICE U, MED U - -Hallowed Healer -{2}{W} -Creature - Human Cleric -1/1 -{T}: Prevent the next 2 damage that would be dealt to target creature or player this turn. -Threshold - {T}: Prevent the next 4 damage that would be dealt to target creature or player this turn. Activate this ability only if seven or more cards are in your graveyard. -ODY C - -Halls of Mist -Land -Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -Creatures that attacked during their controller's last turn can't attack. -ICE R - -Halo Hunter -{2}{B}{B}{B} -Creature - Demon -6/3 -Intimidate (This creature can't be blocked except by artifact creatures and/or creatures that share a color with it.) -When Halo Hunter enters the battlefield, destroy target Angel. -ZEN R - -Halt Order -{2}{U} -Instant -Counter target artifact spell. -Draw a card. -SOM U - -Hamletback Goliath -{6}{R} -Creature - Giant Warrior -6/6 -Whenever another creature enters the battlefield, you may put X +1/+1 counters on Hamletback Goliath, where X is that creature's power. -LRW R - -Hammer Mage -{1}{R} -Creature - Human Spellshaper -1/1 -{X}{R}, {T}, Discard a card: Destroy all artifacts with converted mana cost X or less. -MMQ U - -Hammer of Bogardan -{1}{R}{R} -Sorcery -Hammer of Bogardan deals 3 damage to target creature or player. -{2}{R}{R}{R}: Return Hammer of Bogardan from your graveyard to your hand. Activate this ability only during your upkeep. -MIR R, 6ED R, 8ED R, H10 R - -Hammer of Ruin -{2} -Artifact - Equipment -Equipped creature gets +2/+0. -Whenever equipped creature deals combat damage to a player, you may destroy target Equipment that player controls. -Equip {2} -WWK U - -Hammerfist Giant -{4}{R}{R} -Creature - Giant Warrior -5/4 -{T}: Hammerfist Giant deals 4 damage to each creature without flying and each player. -RAV R - -Hammerhead Shark -{1}{U} -Creature - Fish -2/3 -Hammerhead Shark can't attack unless defending player controls an Island. -STH C - -Hammerheim -Legendary Land -{T}: Add {R} to your mana pool. -{T}: Target creature loses all landwalk abilities until end of turn. -LEG U, ME3 U - -Hammerheim Deadeye -{3}{R} -Creature - Giant Warrior -3/3 -Echo {5}{R} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -When Hammerheim Deadeye enters the battlefield, destroy target creature with flying. -PLC U - -Hana Kami -{G} -Creature - Spirit -1/1 -{1}{G}, Sacrifice Hana Kami: Return target Arcane card from your graveyard to your hand. -CHK U - -Hanabi Blast -{1}{R}{R} -Instant -Hanabi Blast deals 2 damage to target creature or player. Return Hanabi Blast to its owner's hand, then discard a card at random. -CHK U - -Hand of Cruelty -{B}{B} -Creature - Human Samurai -2/2 -Protection from white -Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -SOK U - -Hand of Death -{2}{B} -Sorcery -Destroy target nonblack creature. -POR C (x2), P02 C, S99 C, S00 C - -Hand of Emrakul -{9} -Creature - Eldrazi -7/7 -You may sacrifice four Eldrazi Spawn rather than pay Hand of Emrakul's mana cost. -Annihilator 1 (Whenever this creature attacks, defending player sacrifices a permanent.) -ROE C - -Hand of Honor -{W}{W} -Creature - Human Samurai -2/2 -Protection from black -Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -SOK U - -Hand of Justice -{5}{W} -Creature - Avatar -2/6 -{T}, Tap three untapped white creatures you control: Destroy target creature. -FEM R, MED R - -Hand of the Praetors -{3}{B} -Creature - Zombie -3/2 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -Other creatures you control with infect get +1/+1. -Whenever you cast a creature spell with infect, target player gets a poison counter. -SOM R - -Hand to Hand -{2}{R} -Enchantment -During combat, players can't cast instant spells or activate abilities that aren't mana abilities. -TMP R - -Hankyu -{1} -Artifact - Equipment -Equipped creature has "{T}: Put an aim counter on Hankyu" and "{T}, Remove all aim counters from Hankyu: This creature deals damage to target creature or player equal to the number of aim counters removed this way." -Equip {4} ({4}: Attach to target creature you control. Equip only as a sorcery.) -CHK U - -Hanna -Vanguard -Hand +1, life -5 -Spells you cast cost {1} less to cast. -VG S - -Hanna's Custody -{2}{W} -Enchantment -All artifacts have shroud. (They can't be the targets of spells or abilities.) -TMP R - -Hanna, Ship's Navigator -{1}{W}{U} -Legendary Creature - Human Artificer -1/2 -{1}{W}{U}, {T}: Return target artifact or enchantment card from your graveyard to your hand. -INV R - -Hapato's Might -{2}{B} -Instant -Target creature gets +X/+0 until end of turn, where X is a number chosen randomly from 0 to 6. -SDC S - -Hapless Researcher -{U} -Creature - Human Wizard -1/1 -Sacrifice Hapless Researcher: Draw a card, then discard a card. -JUD C - -Harabaz Druid -{1}{G} -Creature - Human Druid Ally -0/1 -{T}: Add X mana of any one color to your mana pool, where X is the number of Allies you control. -WWK R - -Harbinger of Night -{2}{B}{B} -Creature - Spirit -2/3 -At the beginning of your upkeep, put a -1/-1 counter on each creature. -MIR R - -Harbinger of Spring -{4}{G} -Creature - Spirit -2/1 -Protection from non-Spirit creatures -Soulshift 4 (When this creature dies, you may return target Spirit card with converted mana cost 4 or less from your graveyard to your hand.) -BOK C - -Harbor Guardian -{2}{W}{U} -Creature - Gargoyle -3/4 -Reach (This creature can block creatures with flying.) -Whenever Harbor Guardian attacks, defending player may draw a card. -MIR U - -Harbor Serpent -{4}{U}{U} -Creature - Serpent -5/5 -Islandwalk (This creature is unblockable as long as defending player controls an Island.) -Harbor Serpent can't attack unless there are five or more Islands on the battlefield. -M11 C, M12 C - -Harm's Way -{W} -Instant -The next 2 damage that a source of your choice would deal to you and/or permanents you control this turn is dealt to target creature or player instead. -M10 U, DDG U - -Harmattan Efreet -{2}{U}{U} -Creature - Efreet -2/2 -Flying -{1}{U}{U}: Target creature gains flying until end of turn. -MIR U, 6ED U - -Harmless Assault -{2}{W}{W} -Instant -Prevent all combat damage that would be dealt this turn by attacking creatures. -ROE C - -Harmonic Convergence -{2}{G} -Instant -Put all enchantments on top of their owners' libraries. -ULG U - -Harmonic Sliver -{1}{G}{W} -Creature - Sliver -1/1 -All Slivers have "When this permanent enters the battlefield, destroy target artifact or enchantment." -TSP U - -Harmonize -{2}{G}{G} -Sorcery -Draw three cards. -PLC U, EVG U, GVL U, ARC U, COM U - -Harmony of Nature -{2}{G} -Sorcery -Tap any number of untapped creatures you control. You gain 4 life for each creature tapped this way. -P02 U - -Harpoon Sniper -{2}{W} -Creature - Merfolk Archer -2/2 -{W}, {T}: Harpoon Sniper deals X damage to target attacking or blocking creature, where X is the number of Merfolk you control. -LRW U - -Harrier Griffin -{5}{W} -Creature - Griffin -3/3 -Flying -At the beginning of your upkeep, tap target creature. -GPT U - -Harrow -{2}{G} -Instant -As an additional cost to cast Harrow, sacrifice a land. -Search your library for up to two basic land cards and put them onto the battlefield. Then shuffle your library. -TMP U, INV C, ZEN C, PVC C - -Harsh Deceiver -{3}{W} -Creature - Spirit -1/4 -{1}: Look at the top card of your library. -{2}: Reveal the top card of your library. If it's a land card, untap Harsh Deceiver and it gets +1/+1 until end of turn. Activate this ability only once each turn. -CHK C - -Harsh Judgment -{2}{W}{W} -Enchantment -As Harsh Judgment enters the battlefield, choose a color. -If an instant or sorcery spell of the chosen color would deal damage to you, it deals that damage to its controller instead. -INV R - -Harsh Justice -{2}{W} -Instant -Cast Harsh Justice only during the declare attackers step and only if you've been attacked this step. -This turn, whenever an attacking creature deals combat damage to you, it deals that much damage to its controller. -POR R, ME4 R - -Harsh Mercy -{2}{W} -Sorcery -Each player chooses a creature type. Destroy all creatures that aren't of a type chosen this way. They can't be regenerated. -ONS R - -Haru-Onna -{3}{G} -Creature - Spirit -2/1 -When Haru-Onna enters the battlefield, draw a card. -Whenever you cast a Spirit or Arcane spell, you may return Haru-Onna to its owner's hand. -SOK U - -Harvest Gwyllion -{2}{W/B}{W/B} -Creature - Hag -2/4 -Wither (This deals damage to creatures in the form of -1/-1 counters.) -EVE C - -Harvest Mage -{G} -Creature - Human Spellshaper -1/1 -{G}, {T}, Discard a card: Until end of turn, if you tap a land for mana, it produces one mana of a color of your choice instead of any other type and amount. -NEM C - -Harvest Wurm -{1}{G} -Creature - Wurm -3/2 -When Harvest Wurm enters the battlefield, sacrifice it unless you return a basic land card from your graveyard to your hand. -WTH C - -Harvester Druid -{1}{G} -Creature - Human Druid -1/1 -{T}: Add to your mana pool one mana of any color that a land you control could produce. -JUD C - -Hasran Ogress -{B}{B} -Creature - Ogre -3/2 -Whenever Hasran Ogress attacks, it deals 3 damage to you unless you pay {2}. -ARN C (x2), CHR C, ME4 C - -Hatchet Bully -{3}{R} -Creature - Goblin Warrior -3/3 -{2}{R}, {T}, Put a -1/-1 counter on a creature you control: Hatchet Bully deals 2 damage to target creature or player. -EVE U - -Hatching Plans -{1}{U} -Enchantment -When Hatching Plans is put into a graveyard from the battlefield, draw three cards. -GPT R - -Hate Weaver -{1}{B} -Creature - Zombie Wizard -2/1 -{2}: Target blue or red creature gets +1/+0 until end of turn. -INV U, 10E U - -Hateflayer -{5}{R}{R} -Creature - Elemental -5/5 -Wither (This deals damage to creatures in the form of -1/-1 counters.) -{2}{R}, {Q}: Hateflayer deals damage equal to its power to target creature or player. ({Q} is the untap symbol.) -EVE R - -Hatred -{3}{B}{B} -Instant -As an additional cost to cast Hatred, pay X life. -Target creature gets +X/+0 until end of turn. -EXO R - -Haunted Angel -{2}{W} -Creature - Angel -3/3 -Flying -When Haunted Angel dies, exile Haunted Angel and each other player puts a 3/3 black Angel creature token with flying onto the battlefield. -APC U - -Haunted Cadaver -{3}{B} -Creature - Zombie -2/2 -Whenever Haunted Cadaver deals combat damage to a player, you may sacrifice it. If you do, that player discards three cards. -Morph {1}{B} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS C - -Haunted Crossroads -{2}{B} -Enchantment -{B}: Put target creature card from your graveyard on top of your library. -MMQ U - -Haunting Apparition -{1}{U}{B} -Creature - Spirit -1+*/2 -Flying -As Haunting Apparition enters the battlefield, choose an opponent. -Haunting Apparition's power is equal to 1 plus the number of green creature cards in the chosen player's graveyard. -MIR U - -Haunting Echoes -{3}{B}{B} -Sorcery -Exile all cards from target player's graveyard other than basic land cards. For each card exiled this way, search that player's library for all cards with the same name as that card and exile them. Then that player shuffles his or her library. -ODY R, M10 R, M11 R - -Haunting Hymn -{4}{B}{B} -Instant -Target player discards two cards. If you cast this spell during your main phase, that player discards four cards instead. -TSP U - -Haunting Misery -{1}{B}{B} -Sorcery -As an additional cost to cast Haunting Misery, exile X creature cards from your graveyard. -Haunting Misery deals X damage to target player. -WTH C - -Haunting Wind -{3}{B} -Enchantment -Whenever an artifact becomes tapped or a player activates an artifact's ability without {T} in its activation cost, Haunting Wind deals 1 damage to that artifact's controller. -ATQ U - -Havenwood Battleground -Land -Havenwood Battleground enters the battlefield tapped. -{T}: Add {G} to your mana pool. -{T}, Sacrifice Havenwood Battleground: Add {G}{G} to your mana pool. -FEM U, 5ED U, 6ED U, BTD U, ME2 U - -Havenwood Wurm -{6}{G} -Creature - Wurm -5/6 -Flash (You may cast this spell any time you could cast an instant.) -Trample -TSP C - -Havoc -{1}{R} -Enchantment -Whenever an opponent casts a white spell, he or she loses 2 life. -TMP U - -Havoc Demon -{5}{B}{B} -Creature - Demon -5/5 -Flying -When Havoc Demon dies, all creatures get -5/-5 until end of turn. -LGN R - -Hawkeater Moth -{3}{G} -Creature - Insect -1/2 -Flying; shroud (This permanent can't be the target of spells or abilities.) -USG U - -Hazduhr the Abbot -{3}{W}{W} -Legendary Creature - Human Cleric -2/5 -{X}, {T}: The next X damage that would be dealt this turn to target white creature you control is dealt to Hazduhr the Abbot instead. -HML R - -Haze Frog -{3}{G}{G} -Creature - Frog -2/1 -Flash (You may cast this spell any time you could cast an instant.) -When Haze Frog enters the battlefield, prevent all combat damage that other creatures would deal this turn. -ROE C - -Haze of Rage -{1}{R} -Sorcery -Buyback {2} (You may pay an additional {2} as you cast this spell. If you do, put this card into your hand as it resolves.) -Creatures you control get +1/+0 until end of turn. -Storm (When you cast this spell, copy it for each spell cast before it this turn.) -FUT U - -Hazerider Drake -{2}{W}{U} -Creature - Drake -2/3 -Flying, protection from red -MIR U - -Hazezon Tamar -{4}{R}{G}{W} -Legendary Creature - Human Warrior -2/4 -When Hazezon Tamar enters the battlefield, put X 1/1 Sand Warrior creature tokens that are red, green, and white onto the battlefield at the beginning of your next upkeep, where X is the number of lands you control at that time. -When Hazezon leaves the battlefield, exile all Sand Warriors. -LEG R, ME3 R - -Hazy Homunculus -{1}{U} -Creature - Homunculus Illusion -1/1 -Hazy Homunculus is unblockable as long as defending player controls an untapped land. -PCY C - -He Who Hungers -{4}{B} -Legendary Creature - Spirit -3/2 -Flying -{1}, Sacrifice a Spirit: Target opponent reveals his or her hand. You choose a card from it. That player discards that card. Activate this ability only any time you could cast a sorcery. -Soulshift 4 (When this creature dies, you may return target Spirit card with converted mana cost 4 or less from your graveyard to your hand.) -CHK R - -Head Games -{3}{B}{B} -Sorcery -Target opponent puts the cards from his or her hand on top of his or her library. Search that player's library for that many cards. The player puts those cards into his or her hand, then shuffles his or her library. -ONS R, 10E R - -Headhunter -{1}{B} -Creature - Human Cleric -1/1 -Whenever Headhunter deals combat damage to a player, that player discards a card. -Morph {B} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS U - -Headless Horseman -{2}{B} -Creature - Zombie Knight -2/2 -LEG C - -Headlong Rush -{1}{R} -Instant -Attacking creatures gain first strike until end of turn. -USG C - -Headstone -{1}{B} -Instant -Exile target card from a graveyard. -Draw a card at the beginning of the next turn's upkeep. -HML C - -Heal -{W} -Instant -Prevent the next 1 damage that would be dealt to target creature or player this turn. -Draw a card at the beginning of the next turn's upkeep. -ICE C, 5ED C, ME3 C - -Heal the Scars -{3}{G} -Instant -Regenerate target creature. You gain life equal to that creature's toughness. -LRW C - -Healer's Headdress -{2} -Artifact - Equipment -Equipped creature gets +0/+2 and has "{T}: Prevent the next 1 damage that would be dealt to target creature or player this turn." -{W}{W}: Attach Healer's Headdress to target creature you control. -Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) -5DN C - -Healing Leaves -{G} -Instant -Choose one - Target player gains 3 life; or prevent the next 3 damage that would be dealt to target creature or player this turn. -PLC C - -Healing Salve -{W} -Instant -Choose one - Target player gains 3 life; or prevent the next 3 damage that would be dealt to target creature or player this turn. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, MIR C, 5ED C, USG C, 6ED C, BRB C, 7ED C, 8ED C, DVD C, ME4 C - -Heap Doll -{1} -Artifact Creature - Scarecrow -1/1 -Sacrifice Heap Doll: Exile target card from a graveyard. -SHM U - -Heart Sliver -{1}{R} -Creature - Sliver -1/1 -All Sliver creatures have haste. -TMP C, H09 C - -Heart Warden -{1}{G} -Creature - Elf Druid -1/1 -{T}: Add {G} to your mana pool. -{2}, Sacrifice Heart Warden: Draw a card. -UDS C - -Heart Wolf -{3}{R} -Creature - Wolf -2/2 -First strike -{T}: Target Dwarf creature gets +2/+0 and gains first strike until end of turn. When that creature leaves the battlefield this turn, sacrifice Heart Wolf. Activate this ability only during combat. -HML R - -Heart of Bogardan -{2}{R}{R} -Enchantment -Cumulative upkeep {2} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -When Heart of Bogardan's cumulative upkeep isn't paid, it deals X damage to target player and each creature he or she controls, where X is twice the number of age counters on Heart of Bogardan minus 2. -WTH R - -Heart of Light -{2}{W} -Enchantment - Aura -Enchant creature (Target a creature as you cast this. This card enters the battlefield attached to that creature.) -Prevent all damage that would be dealt to and dealt by enchanted creature. -BOK C, 10E C - -Heart of Ramos -{3} -Artifact -{T}: Add {R} to your mana pool. -Sacrifice Heart of Ramos: Add {R} to your mana pool. -MMQ R - -Heart of Yavimaya -Land -If Heart of Yavimaya would enter the battlefield, sacrifice a Forest instead. If you do, put Heart of Yavimaya onto the battlefield. If you don't, put it into its owner's graveyard. -{T}: Add {G} to your mana pool. -{T}: Target creature gets +1/+1 until end of turn. -ALL R, ME2 R - -Heartbeat of Spring -{2}{G} -Enchantment -Whenever a player taps a land for mana, that player adds one mana to his or her mana pool of any type that land produced. -CHK R - -Hearth Charm -{R} -Instant -Choose one - Destroy target artifact creature; or attacking creatures get +1/+0 until end of turn; or target creature with power 2 or less is unblockable this turn. -VIS C - -Hearth Kami -{1}{R} -Creature - Spirit -2/1 -{X}, Sacrifice Hearth Kami: Destroy target artifact with converted mana cost X. -CHK C - -Hearthcage Giant -{6}{R}{R} -Creature - Giant Warrior -5/5 -When Hearthcage Giant enters the battlefield, put two 3/1 red Elemental Shaman creature tokens onto the battlefield. -Sacrifice an Elemental: Target Giant creature gets +3/+1 until end of turn. -LRW U - -Hearthfire Hobgoblin -{R/W}{R/W}{R/W} -Creature - Goblin Soldier -2/2 -Double strike -EVE U, HOP U - -Heartlash Cinder -{1}{R} -Creature - Elemental Warrior -1/1 -Haste -Chroma - When Heartlash Cinder enters the battlefield, it gets +X/+0 until end of turn, where X is the number of red mana symbols in the mana costs of permanents you control. -EVE C - -Heartless Hidetsugu -{3}{R}{R} -Legendary Creature - Ogre Shaman -4/3 -{T}: Heartless Hidetsugu deals damage to each player equal to half that player's life total, rounded down. -BOK R - -Heartmender -{2}{G/W}{G/W} -Creature - Elemental -2/2 -At the beginning of your upkeep, remove a -1/-1 counter from each creature you control. -Persist (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) -SHM R - -Heartseeker -{4} -Artifact - Equipment -Equipped creature gets +2/+1 and has "{T}, Unattach Heartseeker: Destroy target creature." -Equip {5} ({5}: Attach to target creature you control. Equip only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.) -DST R - -Heartstabber Mosquito -{3}{B} -Creature - Insect -2/2 -Kicker {2}{B} (You may pay an additional {2}{B} as you cast this spell.) -Flying -When Heartstabber Mosquito enters the battlefield, if it was kicked, destroy target creature. -ZEN C - -Heartstone -{3} -Artifact -Activated abilities of creatures cost {1} less to activate. This effect can't reduce the amount of mana an ability costs to activate to less than one mana. -STH U, H09 U - -Heartwood Dryad -{1}{G} -Creature - Dryad -2/1 -Heartwood Dryad can block creatures with shadow as though Heartwood Dryad had shadow. -TMP C - -Heartwood Giant -{3}{G}{G} -Creature - Giant -4/4 -{T}, Sacrifice a Forest: Heartwood Giant deals 2 damage to target player. -TMP R - -Heartwood Shard -{3} -Artifact -{3}, {T} or {G}, {T}: Target creature gains trample until end of turn. -MRD U - -Heartwood Storyteller -{1}{G}{G} -Creature - Treefolk -2/3 -Whenever a player casts a noncreature spell, each of that player's opponents may draw a card. -FUT R - -Heartwood Storyteller Avatar -Vanguard -Hand -1, life +4 -The first creature spell you cast each turn costs {1} less to cast. -The first noncreature spell each opponent casts each turn costs {1} more to cast. -VG S - -Heartwood Treefolk -{2}{G}{G} -Creature - Treefolk -3/4 -Forestwalk -TMP U - -Heat Ray -{X}{R} -Instant -Heat Ray deals X damage to target creature. -USG C, BRB C, ROE C - -Heat Shimmer -{2}{R} -Sorcery -Put a token that's a copy of target creature onto the battlefield. That token has haste and "At the beginning of the end step, exile this permanent." -LRW R - -Heat Stroke -{2}{R} -Enchantment -At end of combat, destroy each creature that blocked or was blocked this turn. -WTH R - -Heat Wave -{2}{R} -Enchantment -Cumulative upkeep {R} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -Blue creatures can't block creatures you control. -Nonblue creatures can't block creatures you control unless their controller pays 1 life for each blocking creature he or she controls. -VIS U - -Heat of Battle -{1}{R} -Enchantment -Whenever a creature blocks, Heat of Battle deals 1 damage to that creature's controller. -STH U - -Heaven's Gate -{W} -Instant -Any number of target creatures become white until end of turn. -LEG U - -Heavy Arbalest -{3} -Artifact - Equipment -Equipped creature doesn't untap during its controller's untap step. -Equipped creature has "{T}: This creature deals 2 damage to target creature or player." -Equip {4} -SOM U - -Heavy Ballista -{3}{W} -Creature - Human Soldier -2/3 -{T}: Heavy Ballista deals 2 damage to target attacking or blocking creature. -WTH C, 6ED U, 7ED U - -Heavy Fog -{1}{G} -Instant -Cast Heavy Fog only during the declare attackers step and only if you've been attacked this step. -Prevent all damage that would be dealt to you this turn by attacking creatures. -PTK U, ME3 C - -Hecatomb -{1}{B}{B} -Enchantment -When Hecatomb enters the battlefield, sacrifice Hecatomb unless you sacrifice four creatures. -Tap an untapped Swamp you control: Hecatomb deals 1 damage to target creature or player. -ICE R, 5ED R, 6ED R, MED R - -Hedge Troll -{2}{G} -Creature - Troll Cleric -2/2 -Hedge Troll gets +1/+1 as long as you control a Plains. -{W}: Regenerate Hedge Troll. -PLC U - -Hedron Crab -{U} -Creature - Crab -0/2 -Landfall - Whenever a land enters the battlefield under your control, target player puts the top three cards of his or her library into his or her graveyard. -ZEN U - -Hedron Matrix -{4} -Artifact - Equipment -Equipped creature gets +X/+X, where X is its converted mana cost. -Equip {4} -ROE R - -Hedron Rover -{4} -Artifact Creature - Construct -2/2 -Landfall - Whenever a land enters the battlefield under your control, Hedron Rover gets +2/+2 until end of turn. -WWK C - -Hedron Scrabbler -{2} -Artifact Creature - Construct -1/1 -Landfall - Whenever a land enters the battlefield under your control, Hedron Scrabbler gets +1/+1 until end of turn. -ZEN C - -Hedron-Field Purists -{2}{W} -Creature - Human Cleric -0/3 -Level up {2}{W} ({2}{W}: Put a level counter on this. Level up only as a sorcery.) -LEVEL 1-4 -1/4 -If a source would deal damage to you or a creature you control, prevent 1 of that damage. -LEVEL 5+ -2/5 -If a source would deal damage to you or a creature you control, prevent 2 of that damage. -ROE R - -Heed the Mists -{3}{U}{U} -Sorcery - Arcane -Put the top card of your library into your graveyard, then draw cards equal to that card's converted mana cost. -BOK U - -Heedless One -{3}{G} -Creature - Elf Avatar -*/* -Trample -Heedless One's power and toughness are each equal to the number of Elves on the battlefield. -ONS U, EVG U - -Heidar, Rimewind Master -{4}{U} -Legendary Creature - Human Wizard -3/3 -{2}, {T}: Return target permanent to its owner's hand. Activate this ability only if you control four or more snow permanents. -CSP R - -Heightened Awareness -{3}{U}{U} -Enchantment -As Heightened Awareness enters the battlefield, discard your hand. -At the beginning of your draw step, draw an additional card. -PCY R - -Helionaut -{2}{W} -Creature - Human Soldier -1/2 -Flying -{1}, {T}: Add one mana of any color to your mana pool. -APC C - -Heliophial -{5} -Artifact -Sunburst (This enters the battlefield with a charge counter on it for each color of mana spent to cast it.) -{2}, Sacrifice Heliophial: Heliophial deals damage equal to the number of charge counters on it to target creature or player. -5DN C - -Helium Squirter -{4}{U} -Creature - Beast Mutant -0/0 -Graft 3 (This creature enters the battlefield with three +1/+1 counters on it. Whenever another creature enters the battlefield, you may move a +1/+1 counter from this creature onto it.) -{1}: Target creature with a +1/+1 counter on it gains flying until end of turn. -DIS C - -Helix Pinnacle -{G} -Enchantment -Shroud -{X}: Put X tower counters on Helix Pinnacle. -At the beginning of your upkeep, if there are 100 or more tower counters on Helix Pinnacle, you win the game. -EVE R - -Hell Swarm -{B} -Instant -All creatures get -1/-0 until end of turn. -LEG C - -Hell's Caretaker -{3}{B} -Creature - Horror -1/1 -{T}, Sacrifice a creature: Return target creature card from your graveyard to the battlefield. Activate this ability only during your upkeep. -LEG R, CHR R, 9ED R - -Hell's Caretaker Avatar -Vanguard -Hand -1, life -4 -{3}, Sacrifice a creature: Return target creature card from your graveyard to the battlefield. -VG S - -Hell's Thunder -{1}{R}{R} -Creature - Elemental -4/4 -Flying, haste -At the beginning of the end step, sacrifice Hell's Thunder. -Unearth {4}{R} ({4}{R}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) -ALA R - -Hell-Bent Raider -{1}{R}{R} -Creature - Human Barbarian -2/2 -First strike, haste -Discard a card at random: Hell-Bent Raider gains protection from white until end of turn. -TOR R - -Hellcarver Demon -{3}{B}{B}{B} -Creature - Demon -6/6 -Flying -Whenever Hellcarver Demon deals combat damage to a player, sacrifice all other permanents you control and discard your hand. Exile the top six cards of your library. You may cast any number of nonland cards exiled this way without paying their mana costs. -ROE M - -Helldozer -{3}{B}{B}{B} -Creature - Zombie Giant -6/5 -{B}{B}{B}, {T}: Destroy target land. If that land was nonbasic, untap Helldozer. -RAV R, HOP R - -Hellfire -{2}{B}{B}{B} -Sorcery -Destroy all nonblack creatures. Hellfire deals X plus 3 damage to you, where X is the number of creatures that died this way. -LEG R, ME3 R - -Hellfire Mongrel -{2}{R} -Creature - Elemental Hound -2/2 -At the beginning of each opponent's upkeep, if that player has two or fewer cards in hand, Hellfire Mongrel deals 2 damage to him or her. -ZEN U - -Hellhole Rats -{2}{B}{R} -Creature - Rat -2/2 -Haste -When Hellhole Rats enters the battlefield, target player discards a card. Hellhole Rats deals damage to that player equal to that card's converted mana cost. -DIS U - -Hellion Eruption -{5}{R} -Sorcery -Sacrifice all creatures you control, then put that many 4/4 red Hellion creature tokens onto the battlefield. -ROE R - -Hellkite Charger -{4}{R}{R} -Creature - Dragon -5/5 -Flying, haste -Whenever Hellkite Charger attacks, you may pay {5}{R}{R}. If you do, untap all attacking creatures and after this phase, there is an additional combat phase. -ZEN R, ARC R - -Hellkite Hatchling -{2}{R}{G} -Creature - Dragon -2/2 -Devour 1 (As this enters the battlefield, you may sacrifice any number of creatures. This creature enters the battlefield with that many +1/+1 counters on it.) -Hellkite Hatchling has flying and trample if it devoured a creature. -CON U - -Hellkite Igniter -{5}{R}{R} -Creature - Dragon -5/5 -Flying, haste -{1}{R}: Hellkite Igniter gets +X/+0 until end of turn, where X is the number of artifacts you control. -MBS R - -Hellkite Overlord -{4}{B}{R}{R}{G} -Creature - Dragon -8/8 -Flying, trample, haste -{R}: Hellkite Overlord gets +1/+0 until end of turn. -{B}{G}: Regenerate Hellkite Overlord. -FVD R, ALA M - -Hellspark Elemental -{1}{R} -Creature - Elemental -3/1 -Trample, haste -At the beginning of the end step, sacrifice Hellspark Elemental. -Unearth {1}{R} ({1}{R}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) -CON U, H10 U - -Helm of Awakening -{2} -Artifact -Spells cost {1} less to cast. -VIS U - -Helm of Chatzuk -{1} -Artifact -{1}, {T}: Target creature gains banding until end of turn. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding a player controls are blocking or being blocked by a creature, that player divides that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R - -Helm of Kaldra -{3} -Legendary Artifact - Equipment -Equipped creature has first strike, trample, and haste. -{1}: If you control Equipment named Helm of Kaldra, Sword of Kaldra, and Shield of Kaldra, put a legendary 4/4 colorless Avatar creature token named Kaldra onto the battlefield and attach those Equipment to it. -Equip {2} -PRO R, 5DN R - -Helm of Obedience -{4} -Artifact -{X}, {T}: Target opponent puts cards from the top of his or her library into his or her graveyard until a creature card or X cards are put into that graveyard this way, whichever comes first. If a creature card is put into that graveyard this way, sacrifice Helm of Obedience and put that card onto the battlefield under your control. X can't be 0. -ALL R, ME2 R - -Helm of Possession -{4} -Artifact -You may choose not to untap Helm of Possession during your untap step. -{2}, {T}, Sacrifice a creature: Gain control of target creature for as long as you control Helm of Possession and Helm of Possession remains tapped. -TMP R - -Helm of the Ghastlord -{3}{U/B} -Enchantment - Aura -Enchant creature -As long as enchanted creature is blue, it gets +1/+1 and has "Whenever this creature deals damage to an opponent, draw a card." -As long as enchanted creature is black, it gets +1/+1 and has "Whenever this creature deals damage to an opponent, that player discards a card." -SHM C - -Hematite Golem -{4} -Artifact Creature - Golem -1/4 -{1}{R}: Hematite Golem gets +2/+0 until end of turn. -MRD C - -Hematite Talisman -{2} -Artifact -Whenever a player casts a red spell, you may pay {3}. If you do, untap target permanent. -ICE U - -Henchfiend of Ukor -{3}{R} -Creature - Ogre -3/2 -Haste -Echo {1}{B} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice this permanent unless you pay its echo cost.) -{B/R}: Henchfiend of Ukor gets +1/+0 until end of turn. -FUT C - -Henge Guardian -{5} -Artifact Creature - Dragon Wurm -3/4 -{2}: Henge Guardian gains trample until end of turn. -MMQ U, DDG U - -Henge of Ramos -Land -{T}: Add {1} to your mana pool. -{2}, {T}: Add one mana of any color to your mana pool. -MMQ U - -Herald of Leshrac -{6}{B} -Creature - Avatar -2/4 -Flying -Cumulative upkeep-Gain control of a land you don't control. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -Herald of Leshrac gets +1/+1 for each land you control but don't own. -When Herald of Leshrac leaves the battlefield, each player gains control of each land he or she owns that you control. -CSP R - -Herald of Serra -{2}{W}{W} -Creature - Angel -3/4 -Flying, vigilance -Echo {2}{W}{W} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -USG R - -Herbal Poultice -{0} -Artifact -{3}, Sacrifice Herbal Poultice: Regenerate target creature. -LRW C - -Herd Gnarr -{3}{G} -Creature - Beast -2/2 -Whenever another creature enters the battlefield under your control, Herd Gnarr gets +2/+2 until end of turn. -TSP C - -Heritage Druid -{G} -Creature - Elf Druid -1/1 -Tap three untapped Elves you control: Add {G}{G}{G} to your mana pool. -MOR U - -Hermetic Study -{1}{U} -Enchantment - Aura -Enchant creature -Enchanted creature has "{T}: This creature deals 1 damage to target creature or player." -USG C - -Hermit Druid -{1}{G} -Creature - Human Druid -1/1 -{G}, {T}: Reveal cards from the top of your library until you reveal a basic land card. Put that card into your hand and all other cards revealed this way into your graveyard. -STH R - -Hermit Druid Avatar -Vanguard -Hand -2, life -2 -At the beginning of your upkeep, put a land card from your library chosen at random onto the battlefield. -VG S - -Hero of Bladehold -{2}{W}{W} -Creature - Human Knight -3/4 -Battle cry (Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn.) -Whenever Hero of Bladehold attacks, put two 1/1 white Soldier creature tokens onto the battlefield tapped and attacking. -MBS M - -Hero of Oxid Ridge -{2}{R}{R} -Creature - Human Knight -4/2 -Haste -Battle cry (Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn.) -Whenever Hero of Oxid Ridge attacks, creatures with power 1 or less can't block this turn. -MBS M - -Hero's Demise -{1}{B} -Instant -Destroy target legendary creature. -BOK R - -Hero's Resolve -{1}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+5. -TMP C, 6ED C, S00 C - -Heroes Remembered -{6}{W}{W}{W} -Sorcery -You gain 20 life. -Suspend 10-{W} (Rather than cast this card from your hand, you may pay {W} and exile it with ten time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) -PLC R - -Heroes' Reunion -{G}{W} -Instant -Target player gains 7 life. -INV U, ARC U, DDG U - -Heroic Defiance -{1}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +3/+3 unless it shares a color with the most common color among all permanents or a color tied for most common. -PLS C - -Heroism -{2}{W} -Enchantment -Sacrifice a white creature: For each attacking red creature, prevent all combat damage that would be dealt by it this turn unless the attacking player pays {2}{R}. -FEM U - -Hesitation -{1}{U} -Enchantment -When a player casts a spell, sacrifice Hesitation. If you do, counter that spell. -STH U - -Hex -{4}{B}{B} -Sorcery -Destroy six target creatures. -RAV R, COM R - -Hex Parasite -{1} -Artifact Creature - Insect -1/1 -{X}{B/P}: Remove up to X counters from target permanent. For each counter removed this way, Hex Parasite gets +1/+0 until end of turn. ({B/P} can be paid with either {B} or 2 life.) -NPH R - -Hexplate Golem -{7} -Artifact Creature - Golem -5/7 -MBS C - -Hibernation -{2}{U} -Instant -Return all green permanents to their owners' hands. -USG U, 7ED U, 8ED U - -Hibernation Sliver -{U}{B} -Creature - Sliver -2/2 -All Slivers have "Pay 2 life: Return this permanent to its owner's hand." -STH U, H09 U - -Hibernation's End -{4}{G} -Enchantment -Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -Whenever you pay Hibernation's End's cumulative upkeep, you may search your library for a creature card with converted mana cost equal to the number of age counters on Hibernation's End and put it onto the battlefield. If you do, shuffle your library. -CSP R - -Hickory Woodlot -Land -Hickory Woodlot enters the battlefield tapped with two depletion counters on it. -{T}, Remove a depletion counter from Hickory Woodlot: Add {G}{G} to your mana pool. If there are no depletion counters on Hickory Woodlot, sacrifice it. -MMQ C - -Hidden Ancients -{1}{G} -Enchantment -When an opponent casts an enchantment spell, if Hidden Ancients is an enchantment, Hidden Ancients becomes a 5/5 Treefolk creature. -USG U - -Hidden Gibbons -{G} -Enchantment -When an opponent casts an instant spell, if Hidden Gibbons is an enchantment, Hidden Gibbons becomes a 4/4 Ape creature. -ULG R - -Hidden Guerrillas -{G} -Enchantment -When an opponent casts an artifact spell, if Hidden Guerrillas is an enchantment, Hidden Guerrillas becomes a 5/3 Soldier creature with trample. -USG U - -Hidden Herd -{G} -Enchantment -When an opponent plays a nonbasic land, if Hidden Herd is an enchantment, Hidden Herd becomes a 3/3 Beast creature. -USG R - -Hidden Horror -{1}{B}{B} -Creature - Horror -4/4 -When Hidden Horror enters the battlefield, sacrifice it unless you discard a creature card. -WTH U, P02 R, 6ED U, 10E U - -Hidden Path -{2}{G}{G}{G}{G} -Enchantment -Green creatures have forestwalk. -DRK R - -Hidden Predators -{G} -Enchantment -When an opponent controls a creature with power 4 or greater, if Hidden Predators is an enchantment, Hidden Predators becomes a 4/4 Beast creature. -USG R - -Hidden Retreat -{2}{W} -Enchantment -Put a card from your hand on top of your library: Prevent all damage that would be dealt by target instant or sorcery spell this turn. -STH R - -Hidden Spider -{G} -Enchantment -When an opponent casts a creature spell with flying, if Hidden Spider is an enchantment, Hidden Spider becomes a 3/5 Spider creature with reach. (It can block creatures with flying.) -USG C - -Hidden Stag -{1}{G} -Enchantment -Whenever an opponent plays a land, if Hidden Stag is an enchantment, Hidden Stag becomes a 3/2 Elk Beast creature. -Whenever you play a land, if Hidden Stag is a creature, Hidden Stag becomes an enchantment. -USG R - -Hide -{R}{W} -Instant -Put target artifact or enchantment on the bottom of its owner's library. ----- -Seek -{W}{B} -Instant -Search target opponent's library for a card and exile it. You gain life equal to its converted mana cost. Then that player shuffles his or her library. -DIS R - -Hideous End -{1}{B}{B} -Instant -Destroy target nonblack creature. Its controller loses 2 life. -HOP C, ZEN C, GVL C, PVC C - -Hideous Laughter -{2}{B}{B} -Instant - Arcane -All creatures get -2/-2 until end of turn. -Splice onto Arcane {3}{B}{B} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -CHK U - -Hideous Visage -{2}{B} -Sorcery -Creatures you control gain intimidate until end of turn. (Each of those creatures can't be blocked except by artifact creatures and/or creatures that share a color with it.) -M12 C - -Hidetsugu's Second Rite -{3}{R} -Instant -If target player has exactly 10 life, Hidetsugu's Second Rite deals 10 damage to that player. -SOK R - -High Ground -{W} -Enchantment -Each creature you control can block an additional creature. -EXO U, 10E U - -High Market -Land -{T}: Add {1} to your mana pool. -{T}, Sacrifice a creature: You gain 1 life. -MMQ R - -High Seas -{2}{U} -Enchantment -Red creature spells and green creature spells cost {1} more to cast. -MMQ U - -High Tide -{U} -Instant -Until end of turn, whenever a player taps an Island for mana, that player adds {U} to his or her mana pool (in addition to the mana the land produces). -FEM C (x3), MED U - -Highland Berserker -{1}{R} -Creature - Human Berserker Ally -2/1 -Whenever Highland Berserker or another Ally enters the battlefield under your control, you may have Ally creatures you control gain first strike until end of turn. -ZEN C - -Highland Giant -{2}{R}{R} -Creature - Giant -3/4 -POR C - -Highland Weald -Snow Land -Highland Weald enters the battlefield tapped. -{T}: Add {R} or {G} to your mana pool. -CSP U - -Highway Robber -{2}{B}{B} -Creature - Human Rogue Mercenary -2/2 -When Highway Robber enters the battlefield, target opponent loses 2 life and you gain 2 life. -MMQ C, 9ED C, 10E C - -Higure, the Still Wind -{3}{U}{U} -Legendary Creature - Human Ninja -3/4 -Ninjutsu {2}{U}{U} ({2}{U}{U}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -Whenever Higure, the Still Wind deals combat damage to a player, you may search your library for a Ninja card, reveal it, and put it into your hand. If you do, shuffle your library. -{2}: Target Ninja creature is unblockable this turn. -BOK R - -Higure, the Still Wind Avatar -Vanguard -Hand -1, life +3 -Whenever a nontoken creature you control deals combat damage to an opponent, choose a creature card at random from your library, reveal that card, and put it into your hand. Then shuffle your library. -VG S - -Hikari, Twilight Guardian -{3}{W}{W} -Legendary Creature - Spirit -4/4 -Flying -Whenever you cast a Spirit or Arcane spell, you may exile Hikari, Twilight Guardian. If you do, return it to the battlefield under its owner's control at the beginning of the next end step. -CHK R - -Hill Giant -{3}{R} -Creature - Giant -3/3 -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, POR C, 7ED C, 8ED C, 9ED C, 10E C - -Hillcomber Giant -{2}{W}{W} -Creature - Giant Scout -3/3 -Mountainwalk -LRW C - -Hinder -{1}{U}{U} -Instant -Counter target spell. If that spell is countered this way, put that card on the top or bottom of its owner's library instead of into that player's graveyard. -CHK U - -Hindering Light -{W}{U} -Instant -Counter target spell that targets you or a permanent you control. -Draw a card. -ALA C - -Hindering Touch -{3}{U} -Instant -Counter target spell unless its controller pays {2}. -Storm (When you cast this spell, copy it for each spell cast before it this turn. You may choose new targets for the copies.) -SCG C - -Hint of Insanity -{2}{B} -Sorcery -Target player reveals his or her hand. That player discards all nonland cards with the same name as another card in his or her hand. -ODY R - -Hipparion -{1}{W} -Creature - Horse -1/3 -Hipparion can't block creatures with power 3 or greater unless you pay {1}. -ICE U, 5ED C - -Hired Giant -{3}{R} -Creature - Giant -4/4 -When Hired Giant enters the battlefield, each other player may search his or her library for a land card and put that card onto the battlefield. Then each player who searched his or her library this way shuffles it. -MMQ U - -Hired Muscle -{1}{B}{B} -Creature - Human Warrior -2/2 -Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Hired Muscle. -At the beginning of the end step, if there are two or more ki counters on Hired Muscle, you may flip it. ----- -Scarmaker -Legendary Creature - Spirit -4/4 -Remove a ki counter from Scarmaker: Target creature gains fear until end of turn. -BOK U - -Hisoka's Defiance -{1}{U} -Instant -Counter target Spirit or Arcane spell. -CHK C - -Hisoka's Guard -{1}{U} -Creature - Human Wizard -1/1 -You may choose not to untap Hisoka's Guard during your untap step. -{1}{U}, {T}: Target creature you control other than Hisoka's Guard has shroud for as long as Hisoka's Guard remains tapped. (It can't be the target of spells or abilities.) -CHK C - -Hisoka, Minamo Sensei -{2}{U}{U} -Legendary Creature - Human Wizard -1/3 -{2}{U}, Discard a card: Counter target spell if it has the same converted mana cost as the discarded card. -CHK R - -Hissing Iguanar -{2}{R} -Creature - Lizard -3/1 -Whenever another creature dies, you may have Hissing Iguanar deal 1 damage to target player. -ALA C - -Hissing Miasma -{1}{B}{B} -Enchantment -Whenever a creature attacks you, its controller loses 1 life. -GPT U - -Hit -{1}{B}{R} -Instant -Target player sacrifices an artifact or creature. Hit deals damage to that player equal to that permanent's converted mana cost. ----- -Run -{3}{R}{G} -Instant -Attacking creatures you control get +1/+0 until end of turn for each other attacking creature. -DIS U - -Hive Mind -{5}{U} -Enchantment -Whenever a player casts an instant or sorcery spell, each other player copies that spell. Each of those players may choose new targets for his or her copy. -M10 R - -Hivestone -{2} -Artifact -Creatures you control are Slivers in addition to their other creature types. -TSP R - -Hivis of the Scale -{3}{R}{R} -Legendary Creature - Viashino Shaman -3/4 -You may choose not to untap Hivis of the Scale during your untap step. -{T}: Gain control of target Dragon for as long as you control Hivis and Hivis remains tapped. -MIR R - -Hoar Shade -{3}{B} -Creature - Shade -1/2 -{B}: Hoar Shade gets +1/+1 until end of turn. -ICE C - -Hoard-Smelter Dragon -{4}{R}{R} -Creature - Dragon -5/5 -Flying -{3}{R}: Destroy target artifact. Hoard-Smelter Dragon gets +X/+0 until end of turn, where X is that artifact's converted mana cost. -SOM R - -Hoarder's Greed -{3}{B} -Sorcery -You lose 2 life and draw two cards, then clash with an opponent. If you win, repeat this process. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -LRW U - -Hoarding Dragon -{3}{R}{R} -Creature - Dragon -4/4 -Flying -When Hoarding Dragon enters the battlefield, you may search your library for an artifact card, exile it, then shuffle your library. -When Hoarding Dragon dies, you may put the exiled card into its owner's hand. -M11 R - -Hobble -{2}{W} -Enchantment - Aura -Enchant creature -When Hobble enters the battlefield, draw a card. -Enchanted creature can't attack. -Enchanted creature can't block if it's black. -PLS C - -Hobgoblin Dragoon -{2}{R/W} -Creature - Goblin Knight -1/2 -Flying, first strike -EVE C - -Hokori, Dust Drinker -{2}{W}{W} -Legendary Creature - Spirit -2/2 -Lands don't untap during their controllers' untap steps. -At the beginning of each player's upkeep, that player untaps a land he or she controls. -BOK R - -Hold the Line -{1}{W}{W} -Instant -Blocking creatures get +7/+7 until end of turn. -CHK R - -Holistic Wisdom -{1}{G}{G} -Enchantment -{2}, Exile a card from your hand: Return target card from your graveyard to your hand if it shares a card type with the card exiled this way. (Artifact, creature, enchantment, instant, land, planeswalker, sorcery, and tribal are card types.) -ODY R - -Hollow Dogs -{4}{B} -Creature - Zombie Hound -3/3 -Whenever Hollow Dogs attacks, it gets +2/+0 until end of turn. -USG C, S99 C, BTD C, 7ED C, 9ED C - -Hollow Specter -{1}{B}{B} -Creature - Specter -2/2 -Flying -Whenever Hollow Specter deals combat damage to a player, you may pay {X}. If you do, that player reveals X cards from his or her hand and you choose one of them. That player discards that card. -LGN R - -Hollow Trees -Land -Hollow Trees enters the battlefield tapped. -You may choose not to untap Hollow Trees during your untap step. -At the beginning of your upkeep, if Hollow Trees is tapped, put a storage counter on it. -{T}, Remove any number of storage counters from Hollow Trees: Add {G} to your mana pool for each storage counter removed this way. -FEM R, 5ED R - -Hollow Warrior -{4} -Artifact Creature - Golem Warrior -4/4 -Hollow Warrior can't attack or block unless you tap an untapped creature you control not declared as an attacking or blocking creature this combat. -PCY U - -Hollowborn Barghest -{5}{B}{B} -Creature - Demon Hound -7/6 -At the beginning of your upkeep, if you have no cards in hand, each opponent loses 2 life. -At the beginning of each opponent's upkeep, if that player has no cards in hand, he or she loses 2 life. -SHM R - -Hollowsage -{3}{B} -Creature - Merfolk Wizard -2/2 -Whenever Hollowsage becomes untapped, you may have target player discard a card. -SHM U - -Holy Armor -{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +0/+2. -{W}: Enchanted creature gets +0/+1 until end of turn. -LEA C, LEB C, 2ED C, 3ED C, 4ED C - -Holy Day -{W} -Instant -Prevent all combat damage that would be dealt this turn. -LEG C, INV C, 8ED C, 9ED C, 10E C - -Holy Light -{2}{W} -Instant -Nonwhite creatures get -1/-1 until end of turn. -DRK C, MED C - -Holy Strength -{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+2. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, 7ED C, 8ED C, 9ED C, 10E C, M10 C, M11 C - -Homarid -{2}{U} -Creature - Homarid -2/2 -Homarid enters the battlefield with a tide counter on it. -At the beginning of your upkeep, put a tide counter on Homarid. -As long as there is exactly one tide counter on Homarid, it gets -1/-1. -As long as there are exactly three tide counters on Homarid, it gets +1/+1. -Whenever there are four tide counters on Homarid, remove all tide counters from it. -FEM C (x4) - -Homarid Shaman -{2}{U}{U} -Creature - Homarid Shaman -2/1 -{U}: Tap target green creature. -FEM R - -Homarid Spawning Bed -{U}{U} -Enchantment -{1}{U}{U}, Sacrifice a blue creature: Put X 1/1 blue Camarid creature tokens onto the battlefield, where X is the sacrificed creature's converted mana cost. -FEM U, MED U - -Homarid Warrior -{4}{U} -Creature - Homarid Warrior -3/3 -{U}: Homarid Warrior gains shroud until end of turn and doesn't untap during your next untap step. Tap Homarid Warrior. (A permanent with shroud can't be the target of spells or abilities.) -FEM C (x3), 5ED C - -Homeward Path -Land -{T}: Add {1} to your mana pool. -{T}: Each player gains control of all creatures he or she owns. -COM R - -Homing Sliver -{2}{R} -Creature - Sliver -2/2 -Each Sliver card in each player's hand has slivercycling {3}. -Slivercycling {3} ({3}, Discard this card: Search your library for a Sliver card, reveal it, and put it into your hand. Then shuffle your library.) -FUT C, H09 C - -Homura, Human Ascendant -{4}{R}{R} -Legendary Creature - Human Monk -4/4 -Homura, Human Ascendant can't block. -When Homura dies, return it to the battlefield flipped. ----- -Homura's Essence -Legendary Enchantment -Creatures you control get +2/+2 and have flying and "{R}: This creature gets +1/+0 until end of turn." -SOK R - -Honden of Cleansing Fire -{3}{W} -Legendary Enchantment - Shrine -At the beginning of your upkeep, you gain 2 life for each Shrine you control. -CHK U - -Honden of Infinite Rage -{2}{R} -Legendary Enchantment - Shrine -At the beginning of your upkeep, Honden of Infinite Rage deals damage to target creature or player equal to the number of Shrines you control. -CHK U - -Honden of Life's Web -{4}{G} -Legendary Enchantment - Shrine -At the beginning of your upkeep, put a 1/1 colorless Spirit creature token onto the battlefield for each Shrine you control. -CHK U - -Honden of Night's Reach -{3}{B} -Legendary Enchantment - Shrine -At the beginning of your upkeep, target opponent discards a card for each Shrine you control. -CHK U - -Honden of Seeing Winds -{4}{U} -Legendary Enchantment - Shrine -At the beginning of your upkeep, draw a card for each Shrine you control. -CHK U - -Honor Guard -{W} -Creature - Human Soldier -1/1 -{W}: Honor Guard gets +0/+1 until end of turn. -STH C, 7ED C, 8ED C, 9ED C, 10E C - -Honor of the Pure -{1}{W} -Enchantment -White creatures you control get +1/+1. -M10 R, M11 R, M12 R - -Honor the Fallen -{1}{W} -Instant -Exile all creature cards from all graveyards. You gain 1 life for each card exiled this way. -MMQ R - -Honor-Worn Shaku -{3} -Artifact -{T}: Add {1} to your mana pool. -Tap an untapped legendary permanent you control: Untap Honor-Worn Shaku. -CHK U - -Honorable Passage -{1}{W} -Instant -The next time a source of your choice would deal damage to target creature or player this turn, prevent that damage. If damage from a red source is prevented this way, Honorable Passage deals that much damage to the source's controller. -VIS U, TSB S - -Honorable Scout -{W} -Creature - Human Soldier Scout -1/1 -When Honorable Scout enters the battlefield, you gain 2 life for each black and/or red creature target opponent controls. -PLS C - -Hooded Kavu -{2}{R} -Creature - Kavu -2/2 -{B}: Hooded Kavu gains fear until end of turn. (It can't be blocked except by artifact creatures and/or black creatures.) -INV C - -Hoodwink -{1}{U} -Instant -Return target artifact, enchantment, or land to its owner's hand. -MMQ C - -Hoof Skulkin -{3} -Artifact Creature - Scarecrow -2/2 -{3}: Target green creature gets +1/+1 until end of turn. -EVE C - -Hoofprints of the Stag -{1}{W} -Tribal Enchantment - Elemental -Whenever you draw a card, you may put a hoofprint counter on Hoofprints of the Stag. -{2}{W}, Remove four hoofprint counters from Hoofprints of the Stag: Put a 4/4 white Elemental creature token with flying onto the battlefield. Activate this ability only during your turn. -LRW R - -Hope Charm -{W} -Instant -Choose one - Target creature gains first strike until end of turn; or target player gains 2 life; or destroy target Aura. -VIS C - -Hope and Glory -{1}{W} -Instant -Untap two target creatures. Each of them gets +1/+1 until end of turn. -ULG U - -Hopping Automaton -{3} -Artifact Creature - Construct -2/2 -{0}: Hopping Automaton gets -1/-1 and gains flying until end of turn. -USG U - -Horde of Boggarts -{3}{R} -Creature - Goblin -*/* -Horde of Boggarts's power and toughness are each equal to the number of red permanents you control. -Horde of Boggarts can't be blocked except by two or more creatures. -SHM U - -Horde of Notions -{W}{U}{B}{R}{G} -Legendary Creature - Elemental -5/5 -Vigilance, trample, haste -{W}{U}{B}{R}{G}: You may play target Elemental card from your graveyard without paying its mana cost. -LRW R - -Horizon Boughs -Plane - Pyrulea -All permanents untap during each player's untap step. -Whenever you roll {C}, you may search your library for up to three basic land cards, put them onto the battlefield tapped, then shuffle your library. -HOP P - -Horizon Canopy -Land -{T}, Pay 1 life: Add {G} or {W} to your mana pool. -{1}, {T}, Sacrifice Horizon Canopy: Draw a card. -FUT R - -Horizon Drake -{1}{U}{U} -Creature - Drake -3/1 -Flying, protection from lands -WWK U - -Horizon Seed -{4}{W} -Creature - Spirit -2/1 -Whenever you cast a Spirit or Arcane spell, regenerate target creature. -CHK U - -Horizon Spellbomb -{1} -Artifact -{2}, {T}, Sacrifice Horizon Spellbomb: Search your library for a basic land card, reveal it, and put it into your hand. Then shuffle your library. -When Horizon Spellbomb is put into a graveyard from the battlefield, you may pay {G}. If you do, draw a card. -SOM C - -Horn of Deafening -{4} -Artifact -{2}, {T}: Prevent all combat damage that would be dealt by target creature this turn. -LEG R, CHR R, ME4 U - -Horn of Greed -{3} -Artifact -Whenever a player plays a land, that player draws a card. -STH R - -Horn of Plenty -{6} -Artifact -Whenever a player casts a spell, he or she may pay {1}. If that player does, he or she draws a card at the beginning of the next end step. -MMQ R - -Horn of Ramos -{3} -Artifact -{T}: Add {G} to your mana pool. -Sacrifice Horn of Ramos: Add {G} to your mana pool. -MMQ R - -Horned Cheetah -{2}{G}{W} -Creature - Cat -2/2 -Whenever Horned Cheetah deals damage, you gain that much life. -INV U - -Horned Helm -{2} -Artifact - Equipment -Equipped creature gets +1/+1 and has trample. -{G}{G}: Attach Horned Helm to target creature you control. -Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) -5DN C - -Horned Kavu -{R}{G} -Creature - Kavu -3/4 -When Horned Kavu enters the battlefield, return a red or green creature you control to its owner's hand. -PLS C - -Horned Sliver -{2}{G} -Creature - Sliver -2/2 -All Sliver creatures have trample. -TMP U - -Horned Troll -{2}{G} -Creature - Troll -2/2 -{G}: Regenerate Horned Troll. -MMQ C, 8ED C - -Horned Turtle -{2}{U} -Creature - Turtle -1/4 -POR C, TMP C, 6ED C, 7ED C, 8ED C, 9ED C, M10 C - -Hornet Cannon -{4} -Artifact -{3}, {T}: Put a 1/1 colorless Insect artifact creature token with flying and haste named Hornet onto the battlefield. Destroy it at the beginning of the next end step. -STH U, PVC U - -Hornet Cobra -{1}{G}{G} -Creature - Snake -2/1 -First strike -LEG C - -Hornet Harasser -{2}{B}{B} -Creature - Goblin Shaman -2/2 -When Hornet Harasser dies, target creature gets -2/-2 until end of turn. -LRW C - -Hornet Queen -{4}{G}{G}{G} -Creature - Insect -2/2 -Flying, deathtouch -When Hornet Queen enters the battlefield, put four 1/1 green Insect creature tokens with flying and deathtouch onto the battlefield. -COM R - -Hornet Sting -{G} -Instant -Hornet Sting deals 1 damage to target creature or player. -M11 C - -Horobi's Whisper -{1}{B}{B} -Instant - Arcane -If you control a Swamp, destroy target nonblack creature. -Splice onto Arcane-Exile four cards from your graveyard. (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -BOK C - -Horobi, Death's Wail -{2}{B}{B} -Legendary Creature - Spirit -4/4 -Flying -Whenever a creature becomes the target of a spell or ability, destroy that creature. -CHK R - -Horrible Hordes -{3} -Artifact Creature - Spirit -2/2 -Rampage 1 (Whenever this creature becomes blocked, it gets +1/+1 until end of turn for each creature blocking it beyond the first.) -MIR U - -Horrifying Revelation -{B} -Sorcery -Target player discards a card, then puts the top card of his or her library into his or her graveyard. -MBS C - -Horror of Horrors -{3}{B}{B} -Enchantment -Sacrifice a Swamp: Regenerate target black creature. (The next time that creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.) -LEG U, 9ED U - -Horseshoe Crab -{2}{U} -Creature - Crab -1/3 -{U}: Untap Horseshoe Crab. -USG C, 10E C - -Hostile Realm -{2}{R} -Enchantment - Aura -Enchant land -Enchanted land has "{T}: Target creature can't block this turn." -MOR C - -Hostility -{3}{R}{R}{R} -Creature - Elemental Incarnation -6/6 -Haste -If a spell you control would deal damage to an opponent, prevent that damage. Put a 3/1 red Elemental Shaman creature token with haste onto the battlefield for each 1 damage prevented this way. -When Hostility is put into a graveyard from anywhere, shuffle it into its owner's library. -LRW R, JVC R - -Hot Springs -{1}{G} -Enchantment - Aura -Enchant land you control -Enchanted land has "{T}: Prevent the next 1 damage that would be dealt to target creature or player this turn." -ICE R - -Hotheaded Giant -{3}{R} -Creature - Giant Warrior -4/4 -Haste -Hotheaded Giant enters the battlefield with two -1/-1 counters on it unless you've cast another red spell this turn. -EVE C - -Hour of Reckoning -{4}{W}{W}{W} -Sorcery -Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.) -Destroy all nontoken creatures. -RAV R, COM R - -Hoverguard Observer -{2}{U}{U} -Creature - Drone -3/3 -Flying -Hoverguard Observer can block only creatures with flying. -DST U - -Hoverguard Sweepers -{6}{U}{U} -Creature - Drone -5/6 -Flying -When Hoverguard Sweepers enters the battlefield, you may return up to two target creatures to their owners' hands. -5DN R - -Hovermyr -{2} -Artifact Creature - Myr -1/2 -Flying, vigilance -NPH C - -Howl from Beyond -{X}{B} -Instant -Target creature gets +X/+0 until end of turn. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, ICE C, 5ED C, 6ED C, 7ED C, ME4 C - -Howl of the Night Pack -{6}{G} -Sorcery -Put a 2/2 green Wolf creature token onto the battlefield for each Forest you control. -SHM U, M10 U - -Howling Banshee -{2}{B}{B} -Creature - Spirit -3/3 -Flying -When Howling Banshee enters the battlefield, each player loses 3 life. -M10 U, GVL U, M11 U - -Howling Fury -{2}{B} -Sorcery -Target creature gets +4/+0 until end of turn. -POR C, S99 U - -Howling Gale -{1}{G} -Instant -Howling Gale deals 1 damage to each creature with flying and each player. -Flashback {1}{G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY U - -Howling Mine -{2} -Artifact -At the beginning of each player's draw step, if Howling Mine is untapped, that player draws an additional card. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, 6ED R, 7ED R, 8ED R, 9ED R, 10E R, M10 R, COM R - -Howling Wolf -{2}{G}{G} -Creature - Wolf -2/2 -When Howling Wolf enters the battlefield, you may search your library for up to three cards named Howling Wolf, reveal them, and put them into your hand. If you do, shuffle your library. -MMQ C - -Howltooth Hollow -Land -Hideaway (This land enters the battlefield tapped. When it does, look at the top four cards of your library, exile one face down, then put the rest on the bottom of your library.) -{T}: Add {B} to your mana pool. -{B}, {T}: You may play the exiled card without paying its mana cost if each player has no cards in hand. -LRW R - -Hua Tuo, Honored Physician -{1}{G}{G} -Legendary Creature - Human -1/2 -{T}: Put target creature card from your graveyard on top of your library. Activate this ability only during your turn, before attackers are declared. -PTK R, ME3 R - -Huang Zhong, Shu General -{2}{W}{W} -Legendary Creature - Human Soldier -2/3 -Huang Zhong, Shu General can't be blocked by more than one creature. -PTK R - -Hulking Cyclops -{3}{R}{R} -Creature - Cyclops -5/5 -Hulking Cyclops can't block. -VIS U, POR U, 6ED U, BTD U, 8ED U - -Hulking Goblin -{1}{R} -Creature - Goblin -2/2 -Hulking Goblin can't block. -POR C, S99 C - -Hulking Ogre -{2}{R} -Creature - Ogre -3/3 -Hulking Ogre can't block. -UDS C, S99 U - -Hull Breach -{R}{G} -Sorcery -Choose one - Destroy target artifact; or destroy target enchantment; or destroy target artifact and target enchantment. -PLS C, HOP C, COM C - -Hum of the Radix -{2}{G}{G} -Enchantment -Each artifact spell costs {1} more to cast for each artifact its controller controls. -MRD R - -Humble -{1}{W} -Instant -Target creature loses all abilities and becomes 0/1 until end of turn. -USG U - -Humble Budoka -{1}{G} -Creature - Human Monk -2/2 -Shroud (This permanent can't be the target of spells or abilities.) -CHK C - -Humility -{2}{W}{W} -Enchantment -All creatures lose all abilities and are 1/1. -TMP R - -Hunding Gjornersen -{3}{W}{U}{U} -Legendary Creature - Human Warrior -5/4 -Rampage 1 (Whenever this creature becomes blocked, it gets +1/+1 until end of turn for each creature blocking it beyond the first.) -LEG U, ME3 U - -Hundred-Talon Kami -{4}{W} -Creature - Spirit -2/3 -Flying -Soulshift 4 (When this creature dies, you may return target Spirit card with converted mana cost 4 or less from your graveyard to your hand.) -CHK C - -Hundred-Talon Strike -{W} -Instant - Arcane -Target creature gets +1/+0 and gains first strike until end of turn. -Splice onto Arcane-Tap an untapped white creature you control. (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -BOK C - -Hundroog -{6}{G} -Creature - Beast -4/7 -Cycling {3} ({3}, Discard this card: Draw a card.) -LGN C - -Hunger of the Nim -{1}{B} -Sorcery -Target creature gets +1/+0 until end of turn for each artifact you control. -DST C - -Hungry Mist -{2}{G}{G} -Creature - Elemental -6/2 -At the beginning of your upkeep, sacrifice Hungry Mist unless you pay {G}{G}. -HML C (x2), 5ED C, MED C - -Hungry Spriggan -{2}{G} -Creature - Goblin Warrior -1/1 -Trample -Whenever Hungry Spriggan attacks, it gets +3/+3 until end of turn. -SHM C - -Hunt Down -{G} -Sorcery -Target creature blocks target creature this turn if able. -LRW C - -Hunted Dragon -{3}{R}{R} -Creature - Dragon -6/6 -Flying, haste -When Hunted Dragon enters the battlefield, put three 2/2 white Knight creature tokens with first strike onto the battlefield under target opponent's control. -RAV R - -Hunted Horror -{B}{B} -Creature - Horror -7/7 -Trample -When Hunted Horror enters the battlefield, put two 3/3 green Centaur creature tokens with protection from black onto the battlefield under target opponent's control. -RAV R - -Hunted Lammasu -{2}{W}{W} -Creature - Lammasu -5/5 -Flying -When Hunted Lammasu enters the battlefield, put a 4/4 black Horror creature token onto the battlefield under target opponent's control. -RAV R - -Hunted Phantasm -{1}{U}{U} -Creature - Spirit -4/6 -Hunted Phantasm is unblockable. -When Hunted Phantasm enters the battlefield, put five 1/1 red Goblin creature tokens onto the battlefield under target opponent's control. -RAV R - -Hunted Troll -{2}{G}{G} -Creature - Troll Warrior -8/4 -When Hunted Troll enters the battlefield, put four 1/1 blue Faerie creature tokens with flying onto the battlefield under target opponent's control. -{G}: Regenerate Hunted Troll. -RAV R - -Hunted Wumpus -{3}{G} -Creature - Beast -6/6 -When Hunted Wumpus enters the battlefield, each other player may put a creature card from his or her hand onto the battlefield. -MMQ U, 8ED U, 9ED U, 10E U - -Hunter Sliver -{1}{R} -Creature - Sliver -1/1 -All Sliver creatures have provoke. (When a Sliver attacks, its controller may have target creature defending player controls untap and block it if able.) -LGN C - -Hunter of Eyeblights -{3}{B}{B} -Creature - Elf Assassin -3/3 -When Hunter of Eyeblights enters the battlefield, put a +1/+1 counter on target creature you don't control. -{2}{B}, {T}: Destroy target creature with a counter on it. -LRW U - -Hunter's Insight -{2}{G} -Instant -Choose target creature you control. Whenever that creature deals combat damage to a player or planeswalker this turn, draw that many cards. -M12 U - -Hunters' Feast -{3}{G} -Sorcery -Any number of target players each gain 6 life. -M11 C - -Hunting Cheetah -{2}{G} -Creature - Cat -2/3 -Whenever Hunting Cheetah deals damage to an opponent, you may search your library for a Forest card, reveal that card, put it into your hand, then shuffle your library. -PTK U, ME3 C - -Hunting Drake -{4}{U} -Creature - Drake -2/2 -Flying -When Hunting Drake enters the battlefield, put target red or green creature on top of its owner's library. -PLS C - -Hunting Grounds -{G}{W} -Enchantment -Threshold - As long as seven or more cards are in your graveyard, Hunting Grounds has "Whenever an opponent casts a spell, you may put a creature card from your hand onto the battlefield." -JUD R - -Hunting Kavu -{1}{R}{G} -Creature - Kavu -2/3 -{1}{R}{G}, {T}: Exile Hunting Kavu and target creature without flying that's attacking you. -INV U - -Hunting Moa -{2}{G} -Creature - Bird Beast -3/2 -Echo {2}{G} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -When Hunting Moa enters the battlefield or dies, put a +1/+1 counter on target creature. -UDS U, TSB S, ARC U - -Hunting Pack -{5}{G}{G} -Instant -Put a 4/4 green Beast creature token onto the battlefield. -Storm (When you cast this spell, copy it for each spell cast before it this turn.) -SCG U, COM U - -Hunting Triad -{3}{G} -Tribal Sorcery - Elf -Put three 1/1 green Elf Warrior creature tokens onto the battlefield. -Reinforce 3-{3}{G} ({3}{G}, Discard this card: Put three +1/+1 counters on target creature.) -MOR U - -Hunting Wilds -{3}{G} -Sorcery -Kicker {3}{G} (You may pay an additional {3}{G} as you cast this spell.) -Search your library for up to two Forest cards and put them onto the battlefield tapped. Then shuffle your library. -If Hunting Wilds was kicked, untap all Forests put onto the battlefield this way. They become 3/3 green creatures with haste that are still lands. -PLC U - -Hurkyl's Recall -{1}{U} -Instant -Return all artifacts target player owns to his or her hand. -ATQ R, 3ED R, 4ED R, 5ED R, 10E R - -Hurloon Minotaur -{1}{R}{R} -Creature - Minotaur -2/3 -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, ME3 C - -Hurloon Shaman -{1}{R}{R} -Creature - Minotaur Shaman -2/3 -When Hurloon Shaman dies, each player sacrifices a land. -WTH U - -Hurly-Burly -{1}{R} -Sorcery -Choose one - Hurly-Burly deals 1 damage to each creature without flying; or Hurly-Burly deals 1 damage to each creature with flying. -LRW C - -Hurr Jackal -{R} -Creature - Hound -1/1 -{T}: Target creature can't be regenerated this turn. -ARN C, 4ED R - -Hurricane -{X}{G} -Sorcery -Hurricane deals X damage to each creature with flying and each player. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, ICE U, 5ED U, POR R, P02 R, 6ED R, BRB U, 7ED R, 10E R - -Hush -{3}{G} -Sorcery -Destroy all enchantments. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG C - -Hyalopterous Lemure -{4}{B} -Creature - Spirit -4/3 -{0}: Hyalopterous Lemure gets -1/-0 and gains flying until end of turn. -ICE U, MED C - -Hydra Omnivore -{4}{G}{G} -Creature - Hydra -8/8 -Whenever Hydra Omnivore deals combat damage to an opponent, it deals that much damage to each other opponent. -COM R - -Hydroblast -{U} -Instant -Choose one - Counter target spell if it's red; or destroy target permanent if it's red. -ICE C, 5ED U, MED C - -Hydromorph Guardian -{2}{U} -Creature - Elemental -2/2 -{U}, Sacrifice Hydromorph Guardian: Counter target spell that targets one or more creatures you control. -TOR C - -Hydromorph Gull -{3}{U}{U} -Creature - Elemental Bird -3/3 -Flying -{U}, Sacrifice Hydromorph Gull: Counter target spell that targets one or more creatures you control. -TOR U - -Hyena Umbra -{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+1 and has first strike. -Totem armor (If enchanted creature would be destroyed, instead remove all damage from it and destroy this Aura.) -ROE C - -Hymn of Rebirth -{3}{G}{W} -Sorcery -Put target creature card from a graveyard onto the battlefield under your control. -ICE U, MED U - -Hymn to Tourach -{B}{B} -Sorcery -Target player discards two cards at random. -FEM C (x4), MED U - -Hypergenesis -Sorcery -Hypergenesis is green. -Suspend 3-{1}{G}{G} (Rather than cast this card from your hand, pay {1}{G}{G} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) -Starting with you, each player may put an artifact, creature, enchantment, or land card from his or her hand onto the battlefield. Repeat this process until no one puts a card onto the battlefield. -TSP R - -Hyperion Blacksmith -{1}{R}{R} -Creature - Human Artificer -2/2 -{T}: You may tap or untap target artifact an opponent controls. -LEG U - -Hypervolt Grasp -{2}{R} -Enchantment - Aura -Enchant creature -Enchanted creature has "{T}: This creature deals 1 damage to target creature or player." -{1}{U}: Return Hypervolt Grasp to its owner's hand. -GPT U - -Hypnotic Cloud -{1}{B} -Sorcery -Kicker {4} (You may pay an additional {4} as you cast this spell.) -Target player discards a card. If Hypnotic Cloud was kicked, that player discards three cards instead. -INV C - -Hypnotic Specter -{1}{B}{B} -Creature - Specter -2/2 -Flying -Whenever Hypnotic Specter deals damage to an opponent, that player discards a card at random. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 9ED R, 10E R, M10 R - -Hypnox -{8}{B}{B}{B} -Creature - Nightmare Horror -8/8 -Flying -When Hypnox enters the battlefield, if you cast it from your hand, exile all cards from target opponent's hand. -When Hypnox leaves the battlefield, return the exiled cards to their owner's hand. -TOR R - -Hypochondria -{1}{W} -Enchantment -{W}, Discard a card: Prevent the next 3 damage that would be dealt to target creature or player this turn. -{W}, Sacrifice Hypochondria: Prevent the next 3 damage that would be dealt to target creature or player this turn. -TOR U - -Hystrodon -{4}{G} -Creature - Beast -3/4 -Trample -Whenever Hystrodon deals combat damage to a player, you may draw a card. -Morph {1}{G}{G} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS R - -I Bask in Your Silent Awe -Ongoing Scheme -(An ongoing scheme remains face up until it's abandoned.) -Each opponent can't cast more than one spell each turn. -At the beginning of your upkeep, if no opponent cast a spell since your last turn ended, abandon this scheme. -ARC C - -I Call on the Ancient Magics -Scheme -When you set this scheme in motion, each other player searches his or her library for a card, reveals it, and puts it into his or her hand. Then you search your library for two cards and put them into your hand. Each player shuffles his or her library. -ARC C - -I Delight in Your Convulsions -Scheme -When you set this scheme in motion, each opponent loses 3 life. You gain life equal to the life lost this way. -ARC C - -I Know All, I See All -Ongoing Scheme -(An ongoing scheme remains face up until it's abandoned.) -Untap all permanents you control during each opponent's untap step. -At the beginning of each end step, if three or more cards were put into your graveyard this turn from anywhere, abandon this scheme. -ARC C - -Ib Halfheart, Goblin Tactician -{3}{R} -Legendary Creature - Goblin Advisor -3/2 -Whenever another Goblin you control becomes blocked, sacrifice it. If you do, it deals 4 damage to each creature blocking it. -Sacrifice two Mountains: Put two 1/1 red Goblin creature tokens onto the battlefield. -TSP R, EVG R - -Icatian Crier -{2}{W} -Creature - Human Spellshaper -1/1 -{1}{W}, {T}, Discard a card: Put two 1/1 white Citizen creature tokens onto the battlefield. -TSP C - -Icatian Infantry -{W} -Creature - Human Soldier -1/1 -{1}: Icatian Infantry gains first strike until end of turn. -{1}: Icatian Infantry gains banding until end of turn. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -FEM C (x4) - -Icatian Javelineers -{W} -Creature - Human Soldier -1/1 -Icatian Javelineers enters the battlefield with a javelin counter on it. -{T}, Remove a javelin counter from Icatian Javelineers: Icatian Javelineers deals 1 damage to target creature or player. -FEM C (x3), TSB S, ME2 C - -Icatian Lieutenant -{W}{W} -Creature - Human Soldier -1/2 -{1}{W}: Target Soldier creature gets +1/+0 until end of turn. -FEM R, MED C - -Icatian Moneychanger -{W} -Creature - Human -0/2 -Icatian Moneychanger enters the battlefield with three credit counters on it. -When Icatian Moneychanger enters the battlefield, it deals 3 damage to you. -At the beginning of your upkeep, put a credit counter on Icatian Moneychanger. -Sacrifice Icatian Moneychanger: You gain 1 life for each credit counter on Icatian Moneychanger. Activate this ability only during your upkeep. -FEM C (x3) - -Icatian Phalanx -{4}{W} -Creature - Human Soldier -2/4 -Banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -FEM U, 5ED U, ME2 C - -Icatian Priest -{W} -Creature - Human Cleric -1/1 -{1}{W}{W}: Target creature gets +1/+1 until end of turn. -FEM U, 10E U, DVD U - -Icatian Scout -{W} -Creature - Human Soldier Scout -1/1 -{1}, {T}: Target creature gains first strike until end of turn. -FEM C (x4), 5ED C, ME2 C - -Icatian Skirmishers -{3}{W} -Creature - Human Soldier -1/1 -First strike; banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -Whenever Icatian Skirmishers attacks, all creatures banded with it gain first strike until end of turn. -FEM R - -Icatian Store -Land -Icatian Store enters the battlefield tapped. -You may choose not to untap Icatian Store during your untap step. -At the beginning of your upkeep, if Icatian Store is tapped, put a storage counter on it. -{T}, Remove any number of storage counters from Icatian Store: Add {W} to your mana pool for each storage counter removed this way. -FEM R, 5ED R - -Icatian Town -{5}{W} -Sorcery -Put four 1/1 white Citizen creature tokens onto the battlefield. -FEM R, 5ED R, 6ED R, MED U - -Ice Cage -{1}{U} -Enchantment - Aura -Enchant creature -Enchanted creature can't attack or block, and its activated abilities can't be activated. -When enchanted creature becomes the target of a spell or ability, destroy Ice Cage. -M10 C, M11 C, M12 C - -Ice Cauldron -{4} -Artifact -{X}, {T}: Put a charge counter on Ice Cauldron and exile a nonland card from your hand. You may cast that card for as long as it remains exiled. Note the type and amount of mana spent to pay this activation cost. Activate this ability only if there are no charge counters on Ice Cauldron. -{T}, Remove a charge counter from Ice Cauldron: Add Ice Cauldron's last noted type and amount of mana to your mana pool. Spend this mana only to cast the last card exiled with Ice Cauldron. -ICE R, ME4 R - -Ice Cave -{3}{U}{U} -Enchantment -Whenever a player casts a spell, any other player may pay that spell's mana cost. If a player does, counter the spell. (Mana cost includes color.) -APC R - -Ice Floe -Land -You may choose not to untap Ice Floe during your untap step. -{T}: Tap target creature without flying that's attacking you. It doesn't untap during its controller's untap step for as long as Ice Floe remains tapped. -ICE U, 5ED U, ME2 U - -Ice Storm -{2}{G} -Sorcery -Destroy target land. -LEA U, LEB U, 2ED U, MED U - -Iceberg -{X}{U}{U} -Enchantment -Iceberg enters the battlefield with X ice counters on it. -{3}: Put an ice counter on Iceberg. -Remove an ice counter from Iceberg: Add {1} to your mana pool. -ICE U, ME2 U - -Icefall -{2}{R}{R} -Sorcery -Destroy target artifact or land. -Recover {R}{R} (When a creature is put into your graveyard from the battlefield, you may pay {R}{R}. If you do, return this card from your graveyard to your hand. Otherwise, exile this card.) -CSP C - -Icequake -{1}{B}{B} -Sorcery -Destroy target land. If that land was a snow land, Icequake deals 1 damage to that land's controller. -ICE U, ME2 C - -Ichneumon Druid -{1}{G}{G} -Creature - Human Druid -1/1 -Whenever an opponent casts an instant spell other than the first instant spell that player casts each turn, Ichneumon Druid deals 4 damage to him or her. -LEG U - -Ichor Explosion -{5}{B}{B} -Sorcery -As an additional cost to cast Ichor Explosion, sacrifice a creature. -All creatures get -X/-X until end of turn, where X is the sacrificed creature's power. -NPH U - -Ichor Rats -{1}{B}{B} -Creature - Rat -2/1 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -When Ichor Rats enters the battlefield, each player gets a poison counter. -SOM U - -Ichor Slick -{2}{B} -Sorcery -Target creature gets -3/-3 until end of turn. -Cycling {2} ({2}, Discard this card: Draw a card.) -Madness {3}{B} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -FUT C, GVL C - -Ichor Wellspring -{2} -Artifact -When Ichor Wellspring enters the battlefield or is put into a graveyard from the battlefield, draw a card. -MBS C - -Ichorclaw Myr -{2} -Artifact Creature - Myr -1/1 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -Whenever Ichorclaw Myr becomes blocked, it gets +2/+2 until end of turn. -SOM C - -Ichorid -{3}{B} -Creature - Horror -3/1 -Haste -At the beginning of the end step, sacrifice Ichorid. -At the beginning of your upkeep, if Ichorid is in your graveyard, you may exile a black creature card other than Ichorid from your graveyard. If you do, return Ichorid to the battlefield. -TOR R - -Icy Manipulator -{4} -Artifact -{1}, {T}: Tap target artifact, creature, or land. -LEA U, LEB U, 2ED U, ICE U, MRD U, 9ED U, 10E U, ME4 U - -Icy Prison -{U}{U} -Enchantment -When Icy Prison enters the battlefield, exile target creature. -At the beginning of your upkeep, sacrifice Icy Prison unless any player pays {3}. -When Icy Prison leaves the battlefield, return the exiled card to the battlefield under its owner's control. -ICE R, ME2 C - -Ideas Unbound -{U}{U} -Sorcery - Arcane -Draw three cards. Discard three cards at the beginning of the next end step. -SOK C - -Identity Crisis -{2}{W}{W}{B}{B} -Sorcery -Exile all cards from target player's hand and graveyard. -ARB R - -Idle Thoughts -{3}{U} -Enchantment -{2}: Draw a card if you have no cards in hand. -EVE U - -Idyllic Tutor -{2}{W} -Sorcery -Search your library for an enchantment card, reveal it, and put it into your hand. Then shuffle your library. -MOR R - -Ifh-Biff Efreet -{2}{G}{G} -Creature - Efreet -3/3 -Flying -{G}: Ifh-Biff Efreet deals 1 damage to each creature with flying and each player. Any player may activate this ability. -ARN R, MED R - -Igneous Golem -{5} -Artifact Creature - Golem -3/4 -{2}: Igneous Golem gains trample until end of turn. -MIR U - -Igneous Pouncer -{4}{B}{R} -Creature - Elemental -5/1 -Haste -Swampcycling {2}, mountaincycling {2} ({2}, Discard this card: Search your library for a Swamp or Mountain card, reveal it, and put it into your hand. Then shuffle your library.) -ARB C - -Ignite Disorder -{1}{R} -Instant -Ignite Disorder deals 3 damage divided as you choose among one, two, or three target white and/or blue creatures. -CON U, M10 U - -Ignite Memories -{4}{R} -Sorcery -Target player reveals a card at random from his or her hand. Ignite Memories deals damage to that player equal to that card's converted mana cost. -Storm (When you cast this spell, copy it for each spell cast before it this turn. You may choose new targets for the copies.) -TSP U - -Ignite the Cloneforge! -Scheme -When you set this scheme in motion, put a token onto the battlefield that's a copy of target permanent an opponent controls. -ARC C - -Ignoble Soldier -{2}{W} -Creature - Human Soldier -3/1 -Whenever Ignoble Soldier becomes blocked, prevent all combat damage that would be dealt by it this turn. -MMQ U - -Ignorant Bliss -{1}{R} -Instant -Exile all cards from your hand face down. At the beginning of the next end step, return those cards to your hand, then draw a card. -DIS U - -Ihsan's Shade -{3}{B}{B}{B} -Legendary Creature - Shade Knight -5/5 -Protection from white -HML U, ME2 R - -Iizuka the Ruthless -{3}{R}{R} -Legendary Creature - Human Samurai -3/3 -Bushido 2 (When this blocks or becomes blocked, it gets +2/+2 until end of turn.) -{2}{R}, Sacrifice a Samurai: Samurai creatures you control gain double strike until end of turn. -SOK R - -Ikiral Outrider -{1}{W} -Creature - Human Soldier -1/2 -Level up {4} ({4}: Put a level counter on this. Level up only as a sorcery.) -LEVEL 1-3 -2/6 -Vigilance -LEVEL 4+ -3/10 -Vigilance -ROE C - -Ill-Gotten Gains -{2}{B}{B} -Sorcery -Exile Ill-Gotten Gains. Each player discards his or her hand, then returns up to three cards from his or her graveyard to his or her hand. -USG R - -Illicit Auction -{3}{R}{R} -Sorcery -Each player may bid life for control of target creature. You start the bidding with a bid of 0. In turn order, each player may top the high bid. The bidding ends if the high bid stands. The high bidder loses life equal to the high bid and gains control of the creature. (This effect lasts indefinitely.) -MIR R, 6ED R - -Illuminate -{X}{R} -Sorcery -Kicker {2}{R} and/or {3}{U} (You may pay an additional {2}{R} and/or {3}{U} as you cast this spell.) -Illuminate deals X damage to target creature. If Illuminate was kicked with its {2}{R} kicker, it deals X damage to that creature's controller. If Illuminate was kicked with its {3}{U} kicker, you draw X cards. -APC U - -Illuminated Folio -{5} -Artifact -{1}, {T}, Reveal two cards from your hand that share a color: Draw a card. -SHM U - -Illuminated Wings -{1}{U} -Enchantment - Aura -Enchant creature -Enchanted creature has flying. -{2}, Sacrifice Illuminated Wings: Draw a card. -UDS C - -Illumination -{W}{W} -Instant -Counter target artifact or enchantment spell. Its controller gains life equal to its converted mana cost. -MIR U - -Illusion -{U} -Instant -Target spell or permanent becomes the color of your choice until end of turn. ----- -Reality -{2}{G} -Instant -Destroy target artifact. -APC U (x2) - -Illusionary Forces -{3}{U} -Creature - Illusion -4/4 -Flying -Cumulative upkeep {U} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -ICE C, MED U - -Illusionary Mask -{2} -Artifact -{X}: You may choose a creature card in your hand whose mana cost could be paid by some amount of, or all of, the mana you spent on {X}. If you do, you may cast that card face down as a 2/2 creature spell without paying its mana cost. If the creature that spell becomes as it resolves has not been turned face up and would assign or deal damage, be dealt damage, or become tapped, instead it's turned face up and assigns or deals damage, is dealt damage, or becomes tapped. Activate this ability only any time you could cast a sorcery. -LEA R, LEB R, 2ED R, ME3 R - -Illusionary Presence -{1}{U}{U} -Creature - Illusion -2/2 -Cumulative upkeep {U} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -At the beginning of your upkeep, choose a land type. Illusionary Presence gains landwalk of the chosen type until end of turn. -ICE R - -Illusionary Servant -{1}{U}{U} -Creature - Illusion -3/4 -Flying -When Illusionary Servant becomes the target of a spell or ability, sacrifice it. -M10 C - -Illusionary Terrain -{U}{U} -Enchantment -Cumulative upkeep {2} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -As Illusionary Terrain enters the battlefield, choose two basic land types. -Basic lands of the first chosen type are the second chosen type. -ICE U - -Illusionary Wall -{4}{U} -Creature - Illusion Wall -7/4 -Defender, flying, first strike -Cumulative upkeep {U} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -ICE C, MED C - -Illusions of Grandeur -{3}{U} -Enchantment -Cumulative upkeep {2} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -When Illusions of Grandeur enters the battlefield, you gain 20 life. -When Illusions of Grandeur leaves the battlefield, you lose 20 life. -ICE R, MED R - -Illusory Demon -{1}{U}{B} -Creature - Demon Illusion -4/3 -Flying -When you cast a spell, sacrifice Illusory Demon. -ARB U - -Imagecrafter -{U} -Creature - Human Wizard -1/1 -{T}: Choose a creature type other than Wall. Target creature becomes that type until end of turn. -ONS C - -Imaginary Pet -{1}{U} -Creature - Illusion -4/4 -At the beginning of your upkeep, if you have a card in hand, return Imaginary Pet to its owner's hand. -USG R, 9ED R - -Imi Statue -{3} -Artifact -Players can't untap more than one artifact during their untap steps. -CHK R - -Immaculate Magistrate -{3}{G} -Creature - Elf Shaman -2/2 -{T}: Put a +1/+1 counter on target creature for each Elf you control. -LRW R - -Immersturm -Plane - Valla -Whenever a creature enters the battlefield, that creature's controller may have it deal damage equal to its power to target creature or player of his or her choice. -Whenever you roll {C}, exile target creature, then return it to the battlefield under its owner's control. -HOP C - -Immobilizing Ink -{1}{U} -Enchantment - Aura -Enchant creature -Enchanted creature doesn't untap during its controller's untap step. -Enchanted creature has "{1}, Discard a card: Untap this creature." -ODY C - -Immolating Souleater -{2} -Artifact Creature - Hound -1/1 -{R/P}: Immolating Souleater gets +1/+0 until end of turn. ({R/P} can be paid with either {R} or 2 life.) -NPH C - -Immolation -{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/-2. -LEG C, 4ED C, ME3 C - -Immortal Coil -{2}{B}{B} -Artifact -{T}, Exile two cards from your graveyard: Draw a card. -If damage would be dealt to you, prevent that damage. Exile a card from your graveyard for each 1 damage prevented this way. -When there are no cards in your graveyard, you lose the game. -ALA R - -Imp's Mischief -{1}{B} -Instant -Change the target of target spell with a single target. You lose life equal to that spell's converted mana cost. -PLC R - -Impaler Shrike -{2}{U}{U} -Creature - Bird -3/1 -Flying -Whenever Impaler Shrike deals combat damage to a player, you may sacrifice it. If you do, draw three cards. -NPH C - -Impatience -{2}{R} -Enchantment -At the beginning of each player's end step, if that player didn't cast a spell this turn, Impatience deals 2 damage to him or her. -UDS R, 7ED R - -Impelled Giant -{4}{R}{R} -Creature - Giant Warrior -3/3 -Trample -Tap an untapped red creature you control other than Impelled Giant: Impelled Giant gets +X/+0 until end of turn, where X is the power of the creature tapped this way. -EVE U - -Impending Disaster -{1}{R} -Enchantment -At the beginning of your upkeep, if there are seven or more lands on the battlefield, sacrifice Impending Disaster and destroy all lands. -ULG R - -Imperial Edict -{1}{B} -Sorcery -Target opponent chooses a creature he or she controls. Destroy it. -PTK C - -Imperial Hellkite -{5}{R}{R} -Creature - Dragon -6/6 -Flying -Morph {6}{R}{R} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Imperial Hellkite is turned face up, you may search your library for a Dragon card, reveal it, and put it into your hand. If you do, shuffle your library. -LGN R, ARC R - -Imperial Mask -{4}{W} -Enchantment -When Imperial Mask enters the battlefield, if it's not a token, each of your teammates puts a token that's a copy of Imperial Mask onto the battlefield. -You have hexproof. (You can't be the target of spells or abilities your opponents control.) -FUT R - -Imperial Recruiter -{2}{R} -Creature - Human Advisor -1/1 -When Imperial Recruiter enters the battlefield, search your library for a creature card with power 2 or less, reveal it, and put it into your hand. Then shuffle your library. -PTK U, ME2 R - -Imperial Seal -{B} -Sorcery -Search your library for a card, then shuffle your library and put that card on top of it. You lose 2 life. -PTK R, ME2 R - -Imperiosaur -{2}{G}{G} -Creature - Lizard -5/5 -Spend only mana produced by basic lands to cast Imperiosaur. -FUT U - -Imperious Perfect -{2}{G} -Creature - Elf Warrior -2/2 -Other Elf creatures you control get +1/+1. -{G}, {T}: Put a 1/1 green Elf Warrior creature token onto the battlefield. -LRW U, EVG U - -Implements of Sacrifice -{2} -Artifact -{1}, {T}, Sacrifice Implements of Sacrifice: Add two mana of any one color to your mana pool. -FEM R - -Implode -{4}{R} -Sorcery -Destroy target land. -Draw a card. -PLS U - -Imposing Visage -{R} -Enchantment - Aura -Enchant creature -Enchanted creature can't be blocked except by two or more creatures. -ICE C, 5ED C - -Imprison -{B} -Enchantment - Aura -Enchant creature -Whenever a player activates an ability of enchanted creature with {T} in its activation cost that isn't a mana ability, you may pay {1}. If you do, counter that ability. If you don't, destroy Imprison. -Whenever enchanted creature attacks or blocks, you may pay {1}. If you do, tap the creature, remove it from combat, and creatures it was blocking that had become blocked by only that creature this combat become unblocked. If you don't, destroy Imprison. -LEG R - -Imprison This Insolent Wretch -Ongoing Scheme -When you set this scheme in motion, choose an opponent. -Permanents the chosen player controls don't untap during his or her untap step. -When the chosen player is attacked or becomes the target of a spell or ability, abandon this scheme. -ARC P - -Impromptu Raid -{3}{R/G} -Enchantment -{2}{R/G}: Reveal the top card of your library. If it isn't a creature card, put it into your graveyard. Otherwise, put that card onto the battlefield. That creature has haste. Sacrifice it at the beginning of the next end step. -SHM R - -Improvised Armor -{3}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+5. -Cycling {3} ({3}, Discard this card: Draw a card.) -ONS U - -Imps' Taunt -{1}{B} -Instant -Buyback {3} (You may pay an additional {3} as you cast this spell. If you do, put this card into your hand as it resolves.) -Target creature attacks this turn if able. -TMP U - -Impulse -{1}{U} -Instant -Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order. -VIS C, BTD C - -Impulsive Maneuvers -{2}{R}{R} -Enchantment -Whenever a creature attacks, flip a coin. If you win the flip, the next time that creature would deal combat damage this turn, it deals double that damage instead. If you lose the flip, the next time that creature would deal combat damage this turn, prevent that damage. -ODY R - -In the Eye of Chaos -{2}{U} -World Enchantment -Whenever a player casts an instant spell, counter it unless that player pays {X}, where X is its converted mana cost. -LEG R, ME4 R - -In the Web of War -{3}{R}{R} -Enchantment -Whenever a creature enters the battlefield under your control, it gets +2/+0 and gains haste until end of turn. -BOK R - -Iname as One -{8}{B}{B}{G}{G} -Legendary Creature - Spirit -8/8 -When Iname as One enters the battlefield, if you cast it from your hand, you may search your library for a Spirit permanent card, put it onto the battlefield, then shuffle your library. -When Iname as One dies, you may exile it. If you do, return target Spirit permanent card from your graveyard to the battlefield. -SOK R - -Iname, Death Aspect -{4}{B}{B} -Legendary Creature - Spirit -4/4 -When Iname, Death Aspect enters the battlefield, you may search your library for any number of Spirit cards and put them into your graveyard. If you do, shuffle your library. -CHK R - -Iname, Life Aspect -{4}{G}{G} -Legendary Creature - Spirit -4/4 -When Iname, Life Aspect dies, you may exile it. If you do, return any number of target Spirit cards from your graveyard to your hand. -CHK R - -Incandescent Soulstoke -{2}{R} -Creature - Elemental Shaman -2/2 -Other Elemental creatures you control get +1/+1. -{1}{R}, {T}: You may put an Elemental creature card from your hand onto the battlefield. That creature gains haste until end of turn. Sacrifice it at the beginning of the next end step. -LRW R - -Incendiary -{R} -Enchantment - Aura -Enchant creature -At the beginning of your upkeep, you may put a fuse counter on Incendiary. -When enchanted creature dies, Incendiary deals X damage to target creature or player, where X is the number of fuse counters on Incendiary. -UDS U - -Incendiary Command -{3}{R}{R} -Sorcery -Choose two - Incendiary Command deals 4 damage to target player; or Incendiary Command deals 2 damage to each creature; or destroy target nonbasic land; or each player discards all the cards in his or her hand, then draws that many cards. -LRW R - -Incinerate -{1}{R} -Instant -Incinerate deals 3 damage to target creature or player. A creature dealt damage this way can't be regenerated this turn. -ICE C, MIR C, 5ED C, 10E C, ME2 C, JVC C, M12 C - -Incite -{R} -Instant -Target creature becomes red until end of turn and attacks this turn if able. -M11 C - -Incite Hysteria -{2}{R} -Sorcery -Radiance - Until end of turn, target creature and each other creature that shares a color with it gain "This creature can't block." -RAV C - -Incite War -{2}{R} -Instant -Choose one - Creatures target player controls attack this turn if able; or creatures you control gain first strike until end of turn. -Entwine {2} (Choose both if you pay the entwine cost.) -MRD C - -Incremental Blight -{3}{B}{B} -Sorcery -Put a -1/-1 counter on target creature, two -1/-1 counters on another target creature, and three -1/-1 counters on a third target creature. -SHM U, HOP U, ARC U - -Incremental Growth -{3}{G}{G} -Sorcery -Put a +1/+1 counter on target creature, two +1/+1 counters on another target creature, and three +1/+1 counters on a third target creature. -LRW U - -Incurable Ogre -{3}{R} -Creature - Ogre Mutant -5/1 -ALA C - -Indebted Samurai -{3}{W} -Creature - Human Samurai -2/3 -Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -Whenever a Samurai you control dies, you may put a +1/+1 counter on Indebted Samurai. -BOK U - -Indentured Djinn -{1}{U}{U} -Creature - Djinn -4/4 -Flying -When Indentured Djinn enters the battlefield, each other player may draw up to three cards. -MMQ U - -Indentured Oaf -{3}{R} -Creature - Ogre Warrior -4/3 -Prevent all damage that Indentured Oaf would deal to red creatures. -RAV U - -Independent Troops -{1}{R} -Creature - Human Soldier -2/1 -PTK C - -Indestructibility -{3}{W} -Enchantment - Aura -Enchant permanent -Enchanted permanent is indestructible. (Effects that say "destroy" don't destroy that permanent. An indestructible creature can't be destroyed by damage.) -M10 R - -Indestructible Aura -{W} -Instant -Prevent all damage that would be dealt to target creature this turn. -LEG C, CHR C - -Index -{U} -Sorcery -Look at the top five cards of your library, then put them back in any order. -APC C, 8ED C, 9ED C - -Indigo Faerie -{1}{U} -Creature - Faerie Wizard -1/1 -Flying -{U}: Target permanent becomes blue in addition to its other colors until end of turn. -EVE U - -Indomitable Ancients -{2}{W}{W} -Creature - Treefolk Warrior -2/10 -MOR R - -Indomitable Archangel -{2}{W}{W} -Creature - Angel -4/4 -Flying -Metalcraft - Artifacts you control have shroud as long as you control three or more artifacts. -SOM M - -Indomitable Will -{1}{W} -Enchantment - Aura -Flash -Enchant creature -Enchanted creature gets +1/+2. -CHK C - -Indrik Stomphowler -{4}{G} -Creature - Beast -4/4 -When Indrik Stomphowler enters the battlefield, destroy target artifact or enchantment. -DIS U, GVL U - -Induce Despair -{2}{B} -Instant -As an additional cost to cast Induce Despair, reveal a creature card from your hand. -Target creature gets -X/-X until end of turn, where X is the revealed card's converted mana cost. -ROE C - -Induce Paranoia -{2}{U}{U} -Instant -Counter target spell. If {B} was spent to cast Induce Paranoia, that spell's controller puts the top X cards of his or her library into his or her graveyard, where X is the spell's converted mana cost. -RAV C - -Inertia Bubble -{1}{U} -Enchantment - Aura -Enchant artifact -Enchanted artifact doesn't untap during its controller's untap step. -MRD C - -Inescapable Brute -{5}{R} -Creature - Giant Warrior -3/3 -Wither (This deals damage to creatures in the form of -1/-1 counters.) -Inescapable Brute must be blocked if able. -SHM C - -Inexorable Tide -{3}{U}{U} -Enchantment -Whenever you cast a spell, proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.) -SOM R - -Infantry Veteran -{W} -Creature - Human Soldier -1/1 -{T}: Target attacking creature gets +1/+1 until end of turn. -VIS C, 6ED C, BRB C, 9ED C, M11 C, EVT C - -Infected Vermin -{2}{B} -Creature - Rat -1/1 -{2}{B}: Infected Vermin deals 1 damage to each creature and each player. -Threshold - {3}{B}: Infected Vermin deals 3 damage to each creature and each player. Activate this ability only if seven or more cards are in your graveyard. -ODY U - -Infectious Horror -{3}{B} -Creature - Zombie Horror -2/2 -Whenever Infectious Horror attacks, each opponent loses 2 life. -CON C, ARC C - -Infectious Host -{2}{B} -Creature - Zombie -1/1 -When Infectious Host dies, target player loses 2 life. -RAV C - -Infectious Rage -{1}{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/-1. -When enchanted creature dies, choose a creature at random Infectious Rage can enchant. Return Infectious Rage to the battlefield attached to that creature. -JUD U - -Infernal Caretaker -{3}{B} -Creature - Human Cleric -2/2 -Morph {3}{B} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Infernal Caretaker is turned face up, return all Zombie cards from all graveyards to their owners' hands. -LGN C - -Infernal Contract -{B}{B}{B} -Sorcery -Draw four cards. You lose half your life, rounded up. -MIR R, 6ED R, 7ED R - -Infernal Darkness -{2}{B}{B} -Enchantment -Cumulative upkeep-Pay {B} and 1 life. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -If a land is tapped for mana, it produces {B} instead of any other type. -ICE R, ME2 R - -Infernal Denizen -{7}{B} -Creature - Demon -5/7 -At the beginning of your upkeep, sacrifice two Swamps. If you can't, tap Infernal Denizen, and an opponent may gain control of a creature you control of his or her choice for as long as Infernal Denizen remains on the battlefield. -{T}: Gain control of target creature for as long as Infernal Denizen remains on the battlefield. -ICE R - -Infernal Genesis -{4}{B}{B} -Enchantment -At the beginning of each player's upkeep, that player puts the top card of his or her library into his or her graveyard. Then he or she puts X 1/1 black Minion creature tokens onto the battlefield, where X is that card's converted mana cost. -PCY R - -Infernal Harvest -{1}{B} -Sorcery -As an additional cost to cast Infernal Harvest, return X Swamps you control to their owner's hand. -Infernal Harvest deals X damage divided as you choose among any number of target creatures. -VIS C - -Infernal Kirin -{2}{B}{B} -Legendary Creature - Kirin Spirit -3/3 -Flying -Whenever you cast a Spirit or Arcane spell, target player reveals his or her hand and discards all cards with that spell's converted mana cost. -SOK R - -Infernal Medusa -{3}{B}{B} -Creature - Gorgon -2/4 -Whenever Infernal Medusa blocks a creature, destroy that creature at end of combat. -Whenever Infernal Medusa becomes blocked by a non-Wall creature, destroy that creature at end of combat. -LEG U - -Infernal Tribute -{B}{B}{B} -Enchantment -{2}, Sacrifice a nontoken permanent: Draw a card. -WTH R - -Infernal Tutor -{1}{B} -Sorcery -Reveal a card from your hand. Search your library for a card with the same name as that card, reveal it, put it into your hand, then shuffle your library. -Hellbent - If you have no cards in hand, instead search your library for a card, put it into your hand, then shuffle your library. -DIS R - -Inferno -{5}{R}{R} -Instant -Inferno deals 6 damage to each creature and each player. -DRK R, 4ED R, 5ED R, 6ED R, 7ED R, 8ED R - -Inferno Elemental -{4}{R}{R} -Creature - Elemental -4/4 -Whenever Inferno Elemental blocks or becomes blocked by a creature, Inferno Elemental deals 3 damage to that creature. -M10 U - -Inferno Titan -{4}{R}{R} -Creature - Giant -6/6 -{R}: Inferno Titan gets +1/+0 until end of turn. -Whenever Inferno Titan enters the battlefield or attacks, it deals 3 damage divided as you choose among one, two, or three target creatures and/or players. -M11 M, M12 M - -Inferno Trap -{3}{R} -Instant - Trap -If you've been dealt damage by two or more creatures this turn, you may pay {R} rather than pay Inferno Trap's mana cost. -Inferno Trap deals 4 damage to target creature. -ZEN U, ARC U - -Infest -{1}{B}{B} -Sorcery -All creatures get -2/-2 until end of turn. -ONS U, ALA U, ARC U - -Infested Roothold -{4}{G} -Creature - Wall -0/3 -Defender (This creature can't attack.) -Protection from artifacts -Whenever an opponent casts an artifact spell, you may put a 1/1 green Insect creature token onto the battlefield. -DST U - -Infiltrate -{U} -Instant -Target creature is unblockable this turn. -NEM C - -Infiltration Lens -{1} -Artifact - Equipment -Whenever equipped creature becomes blocked by a creature, you may draw two cards. -Equip {1} -SOM U - -Infiltrator il-Kor -{4}{U} -Creature - Kor Rogue -3/1 -Shadow (This creature can block or be blocked by only creatures with shadow.) -Suspend 2-{1}{U} (Rather than cast this card from your hand, you may pay {1}{U} and exile it with two time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -FUT C - -Infiltrator's Magemark -{2}{U} -Enchantment - Aura -Enchant creature -Creatures you control that are enchanted get +1/+1 and can't be blocked except by creatures with defender. -GPT C - -Infinite Authority -{W}{W}{W} -Enchantment - Aura -Enchant creature -Whenever enchanted creature blocks or becomes blocked by a creature with toughness 3 or less, destroy the other creature at end of combat. At the beginning of the next end step, if that creature died this way, put a +1/+1 counter on the first creature. -LEG R - -Infinite Hourglass -{4} -Artifact -At the beginning of your upkeep, put a time counter on Infinite Hourglass. -All creatures get +1/+0 for each time counter on Infinite Hourglass. -{3}: Remove a time counter from Infinite Hourglass. Any player may activate this ability but only during any upkeep step. -ICE R, 5ED R - -Inflame -{R} -Instant -Inflame deals 2 damage to each creature dealt damage this turn. -PCY C, DST C - -Information Dealer -{1}{U} -Creature - Human Wizard -1/1 -{T}: Look at the top X cards of your library, where X is the number of Wizards on the battlefield, then put them back in any order. -ONS C - -Infuse -{2}{U} -Instant -Untap target artifact, creature, or land. -Draw a card at the beginning of the next turn's upkeep. -ICE C, ME3 C - -Infused Arrows -{4} -Artifact -Sunburst (This enters the battlefield with a charge counter on it for each color of mana spent to cast it.) -{T}, Remove X charge counters from Infused Arrows: Target creature gets -X/-X until end of turn. -5DN U - -Ingenious Thief -{1}{U} -Creature - Human Rogue -1/1 -Flying -When Ingenious Thief enters the battlefield, look at target player's hand. -POR U, S99 C - -Ingot Chewer -{4}{R} -Creature - Elemental -3/3 -When Ingot Chewer enters the battlefield, destroy target artifact. -Evoke {R} (You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield.) -LRW C, JVC C - -Inheritance -{W} -Enchantment -Whenever a creature dies, you may pay {3}. If you do, draw a card. -ALL U, ME2 U - -Initiate of Blood -{3}{R} -Creature - Ogre Shaman -2/2 -{T}: Initiate of Blood deals 1 damage to target creature that was dealt damage this turn. When that creature dies this turn, flip Initiate of Blood. ----- -Goka the Unjust -Legendary Creature - Ogre Shaman -4/4 -{T}: Goka the Unjust deals 4 damage to target creature that was dealt damage this turn. -CHK U - -Initiates of the Ebon Hand -{B} -Creature - Cleric -1/1 -{1}: Add {B} to your mana pool. If this ability has been activated four or more times this turn, sacrifice Initiates of the Ebon Hand at the beginning of the next end step. -FEM C (x3), 5ED C - -Ink Dissolver -{1}{U} -Creature - Merfolk Wizard -2/1 -Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Ink Dissolver, you may reveal it. If you do, each opponent puts the top three cards of his or her library into his or her graveyard. -MOR C - -Ink-Eyes, Servant of Oni -{4}{B}{B} -Legendary Creature - Rat Ninja -5/4 -Ninjutsu {3}{B}{B} ({3}{B}{B}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -Whenever Ink-Eyes, Servant of Oni deals combat damage to a player, you may put target creature card from that player's graveyard onto the battlefield under your control. -{1}{B}: Regenerate Ink-Eyes. -BOK R - -Ink-Eyes, Servant of Oni Avatar -Vanguard -Hand +0, life -3 -At the beginning of the game, look at target opponent's hand and choose a nonland card from it. That player discards that card. -{X}, Pay X life: Put target creature card with converted mana cost X from an opponent's graveyard onto the battlefield under your control. -VG S - -Ink-Treader Nephilim -{R}{G}{W}{U} -Creature - Nephilim -3/3 -Whenever a player casts an instant or sorcery spell, if Ink-Treader Nephilim is the only target of that spell, copy the spell for each other creature that spell could target. Each copy targets a different one of those creatures. -GPT R - -Inkfathom Divers -{3}{U}{U} -Creature - Merfolk Soldier -3/3 -Islandwalk -When Inkfathom Divers enters the battlefield, look at the top four cards of your library, then put them back in any order. -LRW C - -Inkfathom Infiltrator -{U/B}{U/B} -Creature - Merfolk Rogue -2/1 -Inkfathom Infiltrator can't block and is unblockable. -SHM U - -Inkfathom Witch -{1}{U/B} -Creature - Merfolk Wizard -1/1 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -{2}{U}{B}: Each unblocked creature becomes 4/1 until end of turn. -SHM U - -Inkmoth Nexus -Land -{T}: Add {1} to your mana pool. -{1}: Inkmoth Nexus becomes a 1/1 Blinkmoth artifact creature with flying and infect until end of turn. It's still a land. (It deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -MBS R - -Inkwell Leviathan -{7}{U}{U} -Artifact Creature - Leviathan -7/11 -Islandwalk, trample, shroud -CON R - -Inner Calm, Outer Strength -{2}{G} -Instant - Arcane -Target creature gets +X/+X until end of turn, where X is the number of cards in your hand. -SOK C - -Inner Fire -{3}{R} -Sorcery -Add {R} to your mana pool for each card in your hand. -SOK C - -Inner Sanctum -{1}{W}{W} -Enchantment -Cumulative upkeep-Pay 2 life. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -Prevent all damage that would be dealt to creatures you control. -WTH R - -Inner-Chamber Guard -{1}{W} -Creature - Human Samurai -0/2 -Bushido 2 (When this blocks or becomes blocked, it gets +2/+2 until end of turn.) -SOK U - -Inner-Flame Acolyte -{1}{R}{R} -Creature - Elemental Shaman -2/2 -When Inner-Flame Acolyte enters the battlefield, target creature gets +2/+0 and gains haste until end of turn. -Evoke {R} (You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield.) -LRW C, JVC C - -Inner-Flame Igniter -{2}{R} -Creature - Elemental Warrior -2/2 -{2}{R}: Creatures you control get +1/+0 until end of turn. If this is the third time this ability has resolved this turn, creatures you control gain first strike until end of turn. -LRW U - -Innocence Kami -{3}{W}{W} -Creature - Spirit -2/3 -{W}, {T}: Tap target creature. -Whenever you cast a Spirit or Arcane spell, untap Innocence Kami. -CHK U - -Innocent Blood -{B} -Sorcery -Each player sacrifices a creature. -ODY C, HOP C - -Inquisition -{2}{B} -Sorcery -Target player reveals his or her hand. Inquisition deals damage to that player equal to the number of white cards in his or her hand. -DRK C - -Inquisition of Kozilek -{B} -Sorcery -Target player reveals his or her hand. You choose a nonland card from it with converted mana cost 3 or less. That player discards that card. -ROE U - -Inquisitor Exarch -{W}{W} -Creature - Cleric -2/2 -When Inquisitor Exarch enters the battlefield, choose one - You gain 2 life; or target opponent loses 2 life. -NPH U - -Inquisitor's Snare -{1}{W} -Instant -Prevent all damage target attacking or blocking creature would deal this turn. If that creature is black or red, destroy it. -SHM C - -Insatiable Souleater -{4} -Artifact Creature - Beast -5/1 -{G/P}: Insatiable Souleater gains trample until end of turn. ({G/P} can be paid with either {G} or 2 life.) -NPH C - -Inside Out -{1}{U/R} -Instant -Switch target creature's power and toughness until end of turn. -Draw a card. -EVE C - -Insidious Bookworms -{B} -Creature - Worm -1/1 -When Insidious Bookworms dies, you may pay {1}{B}. If you do, target player discards a card at random. -ALL C (x2) - -Insidious Dreams -{3}{B} -Instant -As an additional cost to cast Insidious Dreams, discard X cards. -Search your library for X cards. Then shuffle your library and put those cards on top of it in any order. -TOR R - -Insight -{2}{U} -Enchantment -Whenever an opponent casts a green spell, you draw a card. -TMP U, 6ED U - -Insist -{G} -Sorcery -The next creature spell you cast this turn can't be countered by spells or abilities. -Draw a card. -TOR R - -Insolence -{2}{R} -Enchantment - Aura -Enchant creature -Whenever enchanted creature becomes tapped, Insolence deals 2 damage to that creature's controller. -PLS C - -Inspiration -{3}{U} -Instant -Target player draws two cards. -VIS C, 6ED C, S00 C, 7ED C, 8ED C - -Inspired Charge -{2}{W}{W} -Instant -Creatures you control get +2/+1 until end of turn. -M11 C - -Inspired Sprite -{3}{U} -Creature - Faerie Wizard -2/2 -Flash -Flying -Whenever you cast a Wizard spell, you may untap Inspired Sprite. -{T}: Draw a card, then discard a card. -MOR U - -Inspirit -{2}{W} -Instant -Untap target creature. It gets +2/+4 until end of turn. -ONS U, 9ED U - -Instigator -{1}{B} -Creature - Human Spellshaper -1/1 -{1}{B}{B}, {T}, Discard a card: Creatures target player controls attack this turn if able. -MMQ R - -Instill Energy -{G} -Enchantment - Aura -Enchant creature -Enchanted creature can attack as though it had haste. -{0}: Untap enchanted creature. Activate this ability only during your turn and only once each turn. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, ME4 U - -Instill Furor -{1}{R} -Enchantment - Aura -Enchant creature -Enchanted creature has "At the beginning of your end step, sacrifice this creature unless it attacked this turn." -RAV U - -Instill Infection -{3}{B} -Instant -Put a -1/-1 counter on target creature. -Draw a card. -SOM C - -Insubordination -{B}{B} -Enchantment - Aura -Enchant creature -At the beginning of the end step of enchanted creature's controller, Insubordination deals 2 damage to that player unless that creature attacked this turn. -MMQ C - -Insurrection -{5}{R}{R}{R} -Sorcery -Untap all creatures and gain control of them until end of turn. They gain haste until end of turn. -ONS R, HOP R, COM R - -Interdict -{1}{U} -Instant -Counter target activated ability from an artifact, creature, enchantment, or land. That permanent's activated abilities can't be activated this turn. (Mana abilities can't be targeted.) -Draw a card. -TMP U - -Intervene -{U} -Instant -Counter target spell that targets a creature. -ULG C - -Intervention Pact -{0} -Instant -Intervention Pact is white. -The next time a source of your choice would deal damage to you this turn, prevent that damage. You gain life equal to the damage prevented this way. -At the beginning of your next upkeep, pay {1}{W}{W}. If you don't, you lose the game. -FUT R - -Intet, the Dreamer -{3}{U}{R}{G} -Legendary Creature - Dragon -6/6 -Flying -Whenever Intet, the Dreamer deals combat damage to a player, you may pay {2}{U}. If you do, exile the top card of your library face down. You may look at that card for as long as it remains exiled. You may play that card without paying its mana cost for as long as Intet remains on the battlefield. -PLC R, COM R - -Intimidation -{2}{B}{B}{B} -Enchantment -Creatures you control have fear. (They can't be blocked except by artifact creatures and/or black creatures.) -MMQ U - -Intimidation Bolt -{1}{R}{W} -Instant -Intimidation Bolt deals 3 damage to target creature. Other creatures can't attack this turn. -ARB U - -Intimidator Initiate -{R} -Creature - Goblin Shaman -1/1 -Whenever a player casts a red spell, you may pay {1}. If you do, target creature can't block this turn. -SHM C - -Into Thin Air -{5}{U} -Instant -Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -Return target artifact to its owner's hand. -5DN C - -Into the Core -{2}{R}{R} -Instant -Exile two target artifacts. -MBS U - -Into the Earthen Maw -Scheme -When you set this scheme in motion, exile up to one target creature with flying, up to one target creature without flying, and all cards from up to one target opponent's graveyard. -ARC C - -Into the Fray -{R} -Instant - Arcane -Target creature attacks this turn if able. -Splice onto Arcane {R} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -SOK C - -Into the North -{1}{G} -Sorcery -Search your library for a snow land card and put it onto the battlefield tapped. Then shuffle your library. -CSP C - -Into the Roil -{1}{U} -Instant -Kicker {1}{U} (You may pay an additional {1}{U} as you cast this spell.) -Return target nonland permanent to its owner's hand. If Into the Roil was kicked, draw a card. -ZEN C - -Intrepid Hero -{2}{W} -Creature - Human Soldier -1/1 -{T}: Destroy target creature with power 4 or greater. -USG R, 7ED R, 8ED R - -Introductions Are in Order -Scheme -When you set this scheme in motion, choose one - Search your library for a creature card, reveal it, put it into your hand, then shuffle your library; or you may put a creature card from your hand onto the battlefield. -ARC C - -Intruder Alarm -{2}{U} -Enchantment -Creatures don't untap during their controllers' untap steps. -Whenever a creature enters the battlefield, untap all creatures. -STH R, 8ED R - -Intuition -{2}{U} -Instant -Search your library for any three cards and reveal them. Target opponent chooses one. Put that card into your hand and the rest into your graveyard. Then shuffle your library. -TMP R - -Inundate -{3}{U}{U}{U} -Sorcery -Return all nonblue creatures to their owners' hands. -EVE R - -Invader Parasite -{3}{R}{R} -Creature - Insect -3/2 -Imprint - When Invader Parasite enters the battlefield, exile target land. -Whenever a land with the same name as the exiled card enters the battlefield under an opponent's control, Invader Parasite deals 2 damage to that player. -NPH R - -Invasion Plans -{2}{R} -Enchantment -All creatures block each turn if able. -The attacking player chooses how each creature blocks each turn. -STH R - -Invert the Skies -{3}{G/U} -Instant -Creatures your opponents control lose flying until end of turn if {G} was spent to cast Invert the Skies, and creatures you control gain flying until end of turn if {U} was spent to cast it. (Do both if {G}{U} was spent.) -EVE U - -Invigorate -{2}{G} -Instant -If you control a Forest, rather than pay Invigorate's mana cost, you may have an opponent gain 3 life. -Target creature gets +4/+4 until end of turn. -MMQ C, GVL C, COM C - -Invigorating Boon -{1}{G} -Enchantment -Whenever a player cycles a card, you may put a +1/+1 counter on target creature. -ONS U - -Invigorating Falls -{2}{G}{G} -Sorcery -You gain life equal to the number of creature cards in all graveyards. -TOR C - -Invincible Hymn -{6}{W}{W} -Sorcery -Count the number of cards in your library. Your life total becomes that number. -ALA R - -Inviolability -{1}{W} -Enchantment - Aura -Enchant creature -Prevent all damage that would be dealt to enchanted creature. -MMQ C - -Invisibility -{U}{U} -Enchantment - Aura -Enchant creature -Enchanted creature can't be blocked except by Walls. -LEA C, LEB C, 2ED C, 8ED U - -Invoke Prejudice -{U}{U}{U}{U} -Enchantment -Whenever an opponent casts a creature spell that doesn't share a color with a creature you control, counter that spell unless its controller pays {X}, where X is its converted mana cost. -LEG R - -Invoke the Firemind -{X}{U}{U}{R} -Sorcery -Choose one - Draw X cards; or Invoke the Firemind deals X damage to target creature or player. -GPT R - -Invulnerability -{1}{W} -Instant -Buyback {3} (You may pay an additional {3} as you cast this spell. If you do, put this card into your hand as it resolves.) -The next time a source of your choice would deal damage to you this turn, prevent that damage. -TMP U - -Ion Storm -{2}{R} -Enchantment -{1}{R}, Remove a +1/+1 counter or a charge counter from a permanent you control: Ion Storm deals 2 damage to target creature or player. -5DN R - -Iona's Judgment -{4}{W} -Sorcery -Exile target creature or enchantment. -WWK C - -Iona, Shield of Emeria -{6}{W}{W}{W} -Legendary Creature - Angel -7/7 -Flying -As Iona, Shield of Emeria enters the battlefield, choose a color. -Your opponents can't cast spells of the chosen color. -ZEN M - -Ior Ruin Expedition -{1}{U} -Enchantment -Landfall - Whenever a land enters the battlefield under your control, you may put a quest counter on Ior Ruin Expedition. -Remove three quest counters from Ior Ruin Expedition and sacrifice it: Draw two cards. -ZEN C - -Ire of Kaminari -{3}{R} -Instant - Arcane -Ire of Kaminari deals damage to target creature or player equal to the number of Arcane cards in your graveyard. -BOK C - -Iridescent Angel -{5}{W}{U} -Creature - Angel -4/4 -Flying, protection from all colors -ODY R - -Iridescent Drake -{3}{U} -Creature - Drake -2/2 -Flying -When Iridescent Drake enters the battlefield, put target Aura card from a graveyard onto the battlefield under your control attached to Iridescent Drake. -UDS U - -Irini Sengir -{2}{B}{B} -Legendary Creature - Vampire Dwarf -2/2 -Green enchantment spells and white enchantment spells cost {2} more to cast. -HML U - -Iron Lance -{2} -Artifact -{3}, {T}: Target creature gains first strike until end of turn. -MMQ U - -Iron Maiden -{3} -Artifact -At the beginning of each opponent's upkeep, Iron Maiden deals X damage to that player, where X is the number of cards in his or her hand minus 4. -ULG R - -Iron Myr -{2} -Artifact Creature - Myr -1/1 -{T}: Add {R} to your mana pool. -MRD C, HOP C, SOM C - -Iron Star -{1} -Artifact -Whenever a player casts a red spell, you may pay {1}. If you do, you gain 1 life. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, 6ED U, 7ED U, 8ED U - -Iron Tusk Elephant -{4}{W} -Creature - Elephant -3/3 -Trample -MIR U - -Iron Will -{W} -Instant -Target creature gets +0/+4 until end of turn. -Cycling {2} ({2}, Discard this card: Draw a card.) -ULG C - -Iron-Barb Hellion -{5}{R} -Creature - Hellion Beast -5/4 -Haste -Iron-Barb Hellion can't block. -5DN U - -Iron-Heart Chimera -{4} -Artifact Creature - Chimera -2/2 -Vigilance -Sacrifice Iron-Heart Chimera: Put a +2/+2 counter on target Chimera creature. It gains vigilance. (This effect lasts indefinitely.) -VIS U - -Ironclaw Buzzardiers -{2}{R} -Creature - Orc Scout -2/2 -Ironclaw Buzzardiers can't block creatures with power 2 or greater. -{R}: Ironclaw Buzzardiers gains flying until end of turn. -TSP C - -Ironclaw Curse -{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets -0/-1. -Enchanted creature can't block creatures with power equal to or greater than the enchanted creature's toughness. -HML R, 5ED R - -Ironclaw Orcs -{1}{R} -Creature - Orc -2/2 -Ironclaw Orcs can't block creatures with power 2 or greater. -LEA C, LEB C, 2ED C, 4ED C, 5ED C, ME2 C - -Ironfist Crusher -{4}{W} -Creature - Human Soldier -2/4 -Ironfist Crusher can block any number of creatures. -Morph {3}{W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS U - -Ironhoof Ox -{3}{G}{G} -Creature - Ox -4/4 -Ironhoof Ox can't be blocked by more than one creature. -P02 U, ME4 C - -Ironroot Treefolk -{4}{G} -Creature - Treefolk -3/5 -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C - -Ironshell Beetle -{1}{G} -Creature - Insect -1/1 -When Ironshell Beetle enters the battlefield, put a +1/+1 counter on target creature. -JUD C - -Irradiate -{3}{B} -Instant -Target creature gets -1/-1 until end of turn for each artifact you control. -MRD C - -Irresistible Prey -{G} -Sorcery -Target creature must be blocked this turn if able. -Draw a card. -ROE U - -Irrigation Ditch -Land -Irrigation Ditch enters the battlefield tapped. -{T}: Add {W} to your mana pool. -{T}, Sacrifice Irrigation Ditch: Add {G}{U} to your mana pool. -INV C - -Isamaru, Hound of Konda -{W} -Legendary Creature - Hound -2/2 -CHK R - -Isao, Enlightened Bushi -{2}{G} -Legendary Creature - Human Samurai -2/1 -Isao, Enlightened Bushi can't be countered. -Bushido 2 (When this blocks or becomes blocked, it gets +2/+2 until end of turn.) -{2}: Regenerate target Samurai. -BOK R - -Ishi-Ishi, Akki Crackshot -{1}{R} -Legendary Creature - Goblin Warrior -1/1 -Whenever an opponent casts a Spirit or Arcane spell, Ishi-Ishi, Akki Crackshot deals 2 damage to that player. -BOK R - -Island -Basic Land - Island -U -LEA L (x2), LEB L (x3), 2ED L (x3), 3ED L (x3), 4ED L (x3), ICE L (x3), MIR L (x4), 5ED L (x4), POR L (x4), TMP L (x4), P02 L (x3), UGL C, USG L (x4), 6ED L (x4), PTK L (x3), S99 L (x4), MMQ L (x4), BRB L (x5), S00 L (x2), INV L (x4), BTD L (x3), 7ED L (x4), ODY L (x4), ONS L (x4), 8ED L (x4), MRD L (x4), CHK L (x4), UNH L, 9ED L (x4), RAV L (x4), TSP L (x4), 10E L (x4), MED L (x3), LRW L (x4), SHM L (x4), ALA L (x4), JVC L (x4), M10 L (x4), HOP L (x4), ME3 L (x3), ZEN L (x8), H09 L, PVC L, ROE L (x4), ARC L (x3), M11 L (x4), EVT L (x4), SOM L (x4), MBS L (x2), NPH L (x2), COM L (x4), M12 L (x4) - -Island Fish Jasconius -{4}{U}{U}{U} -Creature - Fish -6/8 -Island Fish Jasconius doesn't untap during your untap step. -At the beginning of your upkeep, you may pay {U}{U}{U}. If you do, untap Island Fish Jasconius. -Island Fish Jasconius can't attack unless defending player controls an Island. -When you control no Islands, sacrifice Island Fish Jasconius. -ARN R, 3ED R, 4ED R - -Island Sanctuary -{1}{W} -Enchantment -If you would draw a card during your draw step, instead you may skip that draw. If you do, until your next turn, you can't be attacked except by creatures with flying and/or islandwalk. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, ME4 R - -Island of Wak-Wak -Land -{T}: The power of target creature with flying becomes 0 until end of turn. -ARN R, MED R - -Isle of Vesuva -Plane - Dominaria -Whenever a nontoken creature enters the battlefield, its controller puts a token onto the battlefield that's a copy of that creature. -Whenever you roll {C}, destroy target creature and all other creatures with the same name as that creature. -HOP C - -Isleback Spawn -{5}{U}{U} -Creature - Kraken -4/8 -Shroud -Isleback Spawn gets +4/+8 as long as a library has twenty or fewer cards in it. -SHM R - -Isochron Scepter -{2} -Artifact -Imprint - When Isochron Scepter enters the battlefield, you may exile an instant card with converted mana cost 2 or less from your hand. -{2}, {T}: You may copy the exiled card. If you do, you may cast the copy without paying its mana cost. -MRD U, FVR M - -Isolation Cell -{4} -Artifact -Whenever an opponent casts a creature spell, that player loses 2 life unless he or she pays {2}. -NPH U - -Isperia the Inscrutable -{1}{W}{W}{U}{U} -Legendary Creature - Sphinx -3/6 -Flying -Whenever Isperia the Inscrutable deals combat damage to a player, name a card. That player reveals his or her hand. If he or she reveals the named card, search your library for a creature card with flying, reveal it, put it into your hand, then shuffle your library. -DIS R - -It That Betrays -{12} -Creature - Eldrazi -11/11 -Annihilator 2 (Whenever this creature attacks, defending player sacrifices two permanents.) -Whenever an opponent sacrifices a nontoken permanent, put that card onto the battlefield under your control. -ROE R - -Ith, High Arcanist -{5}{W}{U} -Legendary Creature - Human Wizard -3/5 -Vigilance -{T}: Untap target attacking creature. Prevent all combat damage that would be dealt to and dealt by that creature this turn. -Suspend 4-{W}{U} (Rather than cast this card from your hand, you may pay {W}{U} and exile it with four time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -TSP R - -Ivory Charm -{W} -Instant -Choose one - All creatures get -2/-0 until end of turn; or tap target creature; or prevent the next 1 damage that would be dealt to target creature or player this turn. -MIR C - -Ivory Crane Netsuke -{2} -Artifact -At the beginning of your upkeep, if you have seven or more cards in hand, you gain 4 life. -SOK U - -Ivory Cup -{1} -Artifact -Whenever a player casts a white spell, you may pay {1}. If you do, you gain 1 life. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, 6ED U, 7ED U, 8ED U - -Ivory Gargoyle -{4}{W} -Creature - Gargoyle -2/2 -Flying -When Ivory Gargoyle dies, return it to the battlefield under its owner's control at the beginning of the next end step and you skip your next draw step. -{4}{W}: Exile Ivory Gargoyle. -ALL R, ME2 R - -Ivory Giant -{5}{W}{W} -Creature - Giant -3/4 -When Ivory Giant enters the battlefield, tap all nonwhite creatures. -Suspend 5-{W} (Rather than cast this card from your hand, you may pay {W} and exile it with five time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -TSP C - -Ivory Guardians -{4}{W}{W} -Creature - Giant Cleric -3/3 -Protection from red -Creatures named Ivory Guardians get +1/+1 as long as an opponent controls a nontoken red permanent. -LEG U, CHR U, 5ED U, ME3 U - -Ivory Mask -{2}{W}{W} -Enchantment -You have shroud. (You can't be the target of spells or abilities.) -MMQ R, 8ED R, 9ED R - -Ivory Tower -{1} -Artifact -At the beginning of your upkeep, you gain X life, where X is the number of cards in your hand minus four. -ATQ U, 3ED R, 4ED R, MED R, FVR M - -Ivy Dancer -{2}{G} -Creature - Dryad Shaman -1/2 -{T}: Target creature gains forestwalk until end of turn. -RAV U - -Ivy Elemental -{X}{G} -Creature - Elemental -0/0 -Ivy Elemental enters the battlefield with X +1/+1 counters on it. -ODY R, HOP R - -Ivy Seer -{3}{G} -Creature - Elf Wizard -1/1 -{2}{G}, {T}: Reveal any number of green cards in your hand. Target creature gets +X/+X until end of turn, where X is the number of cards revealed this way. -UDS U - -Iwamori of the Open Fist -{2}{G}{G} -Legendary Creature - Human Monk -5/5 -Trample -When Iwamori of the Open Fist enters the battlefield, each opponent may put a legendary creature card from his or her hand onto the battlefield. -BOK R - -Ixidor's Will -{2}{U} -Instant -Counter target spell unless its controller pays {2} for each Wizard on the battlefield. -ONS C - -Ixidor, Reality Sculptor -{3}{U}{U} -Legendary Creature - Human Wizard -3/4 -Face-down creatures get +1/+1. -{2}{U}: Turn target face-down creature face up. -ONS R - -Ixidron -{3}{U}{U} -Creature - Illusion -*/* -As Ixidron enters the battlefield, turn all other nontoken creatures face down. (They're 2/2 creatures.) -Ixidron's power and toughness are each equal to the number of face-down creatures on the battlefield. -TSP R - -Izzet Boilerworks -Land -Izzet Boilerworks enters the battlefield tapped. -When Izzet Boilerworks enters the battlefield, return a land you control to its owner's hand. -{T}: Add {U}{R} to your mana pool. -GPT C, COM C - -Izzet Chronarch -{3}{U}{R} -Creature - Human Wizard -2/2 -When Izzet Chronarch enters the battlefield, return target instant or sorcery card from your graveyard to your hand. -GPT C, COM C - -Izzet Guildmage -{U/R}{U/R} -Creature - Human Wizard -2/2 -({U/R} can be paid with either {U} or {R}.) -{2}{U}: Copy target instant spell you control with converted mana cost 2 or less. You may choose new targets for the copy. -{2}{R}: Copy target sorcery spell you control with converted mana cost 2 or less. You may choose new targets for the copy. -GPT U - -Izzet Signet -{2} -Artifact -{1}, {T}: Add {U}{R} to your mana pool. -GPT C, COM C - -Izzet Steam Maze -Plane - Ravnica -Whenever a player casts an instant or sorcery spell, that player copies it. The player may choose new targets for the copy. -Whenever you roll {C}, instant and sorcery spells you cast this turn cost {3} less to cast. -HOP C - -Jabari's Banner -{2} -Artifact -{1}, {T}: Target creature gains flanking until end of turn. (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -WTH U - -Jabari's Influence -{3}{W}{W} -Instant -Cast Jabari's Influence only after combat. -Gain control of target nonartifact, nonblack creature that attacked you this turn and put a -1/-0 counter on it. -MIR R - -Jace Beleren -{1}{U}{U} -Planeswalker - Jace -3 -[+2] Each player draws a card. -[-1] Target player draws a card. -[-10] Target player puts the top twenty cards of his or her library into his or her graveyard. -LRW R, JVC M, M10 M, M11 M - -Jace's Archivist -{1}{U}{U} -Creature - Vedalken Wizard -2/2 -{U}, {T}: Each player discards his or her hand, then draws cards equal to the greatest number of cards a player discarded this way. -M12 R - -Jace's Erasure -{1}{U} -Enchantment -Whenever you draw a card, you may have target player put the top card of his or her library into his or her graveyard. -M11 C, M12 C - -Jace's Ingenuity -{3}{U}{U} -Instant -Draw three cards. -M11 U - -Jace, Memory Adept -{3}{U}{U} -Planeswalker - Jace -4 -[+1] Draw a card. Target player puts the top card of his or her library into his or her graveyard. -[0] Target player puts the top ten cards of his or her library into his or her graveyard. -[-7] Any number of target players each draw twenty cards. -M12 M - -Jace, the Mind Sculptor -{2}{U}{U} -Planeswalker - Jace -3 -[+2] Look at the top card of target player's library. You may put that card on the bottom of that player's library. -[0] Draw three cards, then put two cards from your hand on top of your library in any order. -[-1] Return target creature to its owner's hand. -[-12] Exile all cards from target player's library, then that player shuffles his or her hand into his or her library. -WWK M - -Jackal Familiar -{R} -Creature - Hound -2/2 -Jackal Familiar can't attack or block alone. -M10 C - -Jackal Pup -{R} -Creature - Hound -2/1 -Whenever Jackal Pup is dealt damage, it deals that much damage to you. -TMP U, H10 U - -Jackalope Herd -{3}{G} -Creature - Rabbit Beast -4/5 -When you cast a spell, return Jackalope Herd to its owner's hand. -EXO C - -Jacques le Vert -{1}{R}{G}{W} -Legendary Creature - Human Warrior -3/2 -Green creatures you control get +0/+2. -LEG R, MED R - -Jaddi Lifestrider -{4}{G} -Creature - Elemental -2/8 -When Jaddi Lifestrider enters the battlefield, you may tap any number of untapped creatures you control. You gain 2 life for each creature tapped this way. -ROE U - -Jade Idol -{4} -Artifact -Whenever you cast a Spirit or Arcane spell, Jade Idol becomes a 4/4 Spirit artifact creature until end of turn. -CHK U - -Jade Leech -{2}{G}{G} -Creature - Leech -5/5 -Green spells you cast cost {G} more to cast. -INV R - -Jade Mage -{1}{G} -Creature - Human Shaman -2/1 -{2}{G}: Put a 1/1 green Saproling creature token onto the battlefield. -M12 U - -Jade Monolith -{4} -Artifact -{1}: The next time a source of your choice would deal damage to target creature this turn, that source deals that damage to you instead. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, 6ED R, ME4 R - -Jade Statue -{4} -Artifact -{2}: Jade Statue becomes a 3/6 Golem artifact creature until end of combat. Activate this ability only during combat. -LEA U, LEB U, 2ED U, 9ED R - -Jaded Response -{1}{U} -Instant -Counter target spell if it shares a color with a creature you control. -APC C - -Jagged Lightning -{3}{R}{R} -Sorcery -Jagged Lightning deals 3 damage to each of two target creatures. -P02 U, USG U, S99 U - -Jagged Poppet -{1}{B}{R} -Creature - Ogre Warrior -3/4 -Whenever Jagged Poppet is dealt damage, discard that many cards. -Hellbent - Whenever Jagged Poppet deals combat damage to a player, if you have no cards in hand, that player discards cards equal to the damage. -DIS U - -Jagged-Scar Archers -{1}{G}{G} -Creature - Elf Archer -*/* -Jagged-Scar Archers's power and toughness are each equal to the number of Elves you control. -{T}: Jagged-Scar Archers deals damage equal to its power to target creature with flying. -LRW U - -Jagwasp Swarm -{3}{B} -Creature - Insect -3/2 -Flying -WWK C - -Jalum Tome -{3} -Artifact -{2}, {T}: Draw a card, then discard a card. -ATQ U, CHR R, 5ED R, 6ED R, 7ED R - -Jamuraan Lion -{2}{W} -Creature - Cat -3/1 -{W}, {T}: Target creature can't block this turn. -VIS C - -Jandor's Ring -{6} -Artifact -{2}, {T}, Discard the last card you drew this turn: Draw a card. -ARN R, 3ED R - -Jandor's Saddlebags -{2} -Artifact -{3}, {T}: Untap target creature. -ARN R, 3ED R, 4ED R, 5ED R, 7ED R - -Jangling Automaton -{3} -Artifact Creature - Construct -3/2 -Whenever Jangling Automaton attacks, untap all creatures defending player controls. -WTH C - -Jareth, Leonine Titan -{3}{W}{W}{W} -Legendary Creature - Cat Giant -4/7 -Whenever Jareth, Leonine Titan blocks, it gets +7/+7 until end of turn. -{W}: Jareth gains protection from the color of your choice until end of turn. -ONS R - -Jasmine Boreal -{3}{G}{W} -Legendary Creature - Human -4/5 -LEG U, TSB S - -Jasmine Seer -{3}{W} -Creature - Human Wizard -1/1 -{2}{W}, {T}: Reveal any number of white cards in your hand. You gain 2 life for each card revealed this way. -UDS U - -Jawbone Skulkin -{1} -Artifact Creature - Scarecrow -1/1 -{2}: Target red creature gains haste until end of turn. -EVE C - -Jaws of Stone -{5}{R} -Sorcery -Jaws of Stone deals X damage divided as you choose among any number of target creatures and/or players, where X is the number of Mountains you control as you cast Jaws of Stone. -SHM U, DDG U - -Jaya Ballard Avatar -Vanguard -Hand +0, life +1 -{X}: Jaya Ballard Avatar deals an amount of damage chosen at random from 0 to X to target creature or player. Activate this ability only once each turn. -VG S - -Jaya Ballard, Task Mage -{1}{R}{R} -Legendary Creature - Human Spellshaper -2/2 -{R}, {T}, Discard a card: Destroy target blue permanent. -{1}{R}, {T}, Discard a card: Jaya Ballard, Task Mage deals 3 damage to target creature or player. A creature dealt damage this way can't be regenerated this turn. -{5}{R}{R}, {T}, Discard a card: Jaya Ballard deals 6 damage to each creature and each player. -TSP R, H10 R - -Jayemdae Tome -{4} -Artifact -{4}, {T}: Draw a card. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, 6ED R, 7ED R, 8ED R, 10E R - -Jedit Ojanen -{4}{W}{W}{U} -Legendary Creature - Cat Warrior -5/5 -LEG U, ME3 C - -Jedit Ojanen of Efrava -{3}{G}{G}{G} -Legendary Creature - Cat Warrior -5/5 -Forestwalk -Whenever Jedit Ojanen of Efrava attacks or blocks, put a 2/2 green Cat Warrior creature token with forestwalk onto the battlefield. -PLC R - -Jedit's Dragoons -{5}{W} -Creature - Cat Soldier -2/5 -Vigilance -When Jedit's Dragoons enters the battlefield, you gain 4 life. -TSP C - -Jenara, Asura of War -{G}{W}{U} -Legendary Creature - Angel -3/3 -Flying -{1}{W}: Put a +1/+1 counter on Jenara, Asura of War. -ARB M - -Jerrard of the Closed Fist -{3}{R}{G}{G} -Legendary Creature - Human Knight -6/5 -LEG U, ME3 C - -Jeska, Warrior Adept -{2}{R}{R} -Legendary Creature - Human Barbarian Warrior -3/1 -First strike, haste -{T}: Jeska, Warrior Adept deals 1 damage to target creature or player. -JUD R - -Jester's Cap -{4} -Artifact -{2}, {T}, Sacrifice Jester's Cap: Search target player's library for three cards and exile them. Then that player shuffles his or her library. -ICE R, 5ED R, 9ED R, FVR M - -Jester's Mask -{5} -Artifact -Jester's Mask enters the battlefield tapped. -{1}, {T}, Sacrifice Jester's Mask: Target opponent puts the cards from his or her hand on top of his or her library. Search that player's library for that many cards. That player puts those cards into his or her hand, then shuffles his or her library. -ICE R, ME2 R - -Jester's Scepter -{3} -Artifact -When Jester's Scepter enters the battlefield, exile the top five cards of target player's library face down. You may look at those cards for as long as they remain exiled. -{2}, {T}, Put a card exiled with Jester's Scepter into its owner's graveyard: Counter target spell if it has the same name as that card. -CSP R - -Jet Medallion -{2} -Artifact -Black spells you cast cost {1} less to cast. -TMP R - -Jetting Glasskite -{4}{U}{U} -Creature - Spirit -4/4 -Flying -Whenever Jetting Glasskite becomes the target of a spell or ability for the first time in a turn, counter that spell or ability. -BOK U - -Jeweled Amulet -{0} -Artifact -{1}, {T}: Put a charge counter on Jeweled Amulet. Note the type of mana spent to pay this activation cost. Activate this ability only if there are no charge counters on Jeweled Amulet. -{T}, Remove a charge counter from Jeweled Amulet: Add one mana of Jeweled Amulet's last noted type to your mana pool. -ICE U, ME2 U - -Jeweled Bird -{1} -Artifact -Remove Jeweled Bird from your deck before playing if you're not playing for ante. -{T}: Put Jeweled Bird into the ante. If you do, put all other cards you own from the ante into your graveyard, then draw a card. -ARN U, CHR R - -Jeweled Spirit -{3}{W}{W} -Creature - Spirit -3/3 -Flying -Sacrifice two lands: Jeweled Spirit gains protection from artifacts or from the color of your choice until end of turn. -PCY R - -Jeweled Torque -{2} -Artifact -As Jeweled Torque enters the battlefield, choose a color. -Whenever a player casts a spell of the chosen color, you may pay {2}. If you do, you gain 2 life. -MMQ U - -Jhessian Balmgiver -{1}{W}{U} -Creature - Human Cleric -1/1 -{T}: Prevent the next 1 damage that would be dealt to target creature or player this turn. -{T}: Target creature is unblockable this turn. -CON U - -Jhessian Infiltrator -{G}{U} -Creature - Human Rogue -2/2 -Jhessian Infiltrator is unblockable. -ALA U - -Jhessian Lookout -{1}{U} -Creature - Human Scout -2/1 -ALA C - -Jhessian Zombies -{4}{U}{B} -Creature - Zombie -2/4 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -Islandcycling {2}, swampcycling {2} ({2}, Discard this card: Search your library for an Island or Swamp card, reveal it, and put it into your hand. Then shuffle your library.) -ARB C - -Jhoira of the Ghitu -{1}{U}{R} -Legendary Creature - Human Wizard -2/2 -{2}, Exile a nonland card from your hand: Put four time counters on the exiled card. If it doesn't have suspend, it gains suspend. (At the beginning of your upkeep, remove a time counter from that card. When the last is removed, cast it without paying its mana cost. If it's a creature, it has haste.) -FUT R - -Jhoira of the Ghitu Avatar -Vanguard -Hand +1, life +0 -{3}, Discard a card: Copy three instant cards chosen at random. You may cast one of the copies without paying its mana cost. -{3}, Discard a card: Copy three sorcery cards chosen at random. You may cast one of the copies without paying its mana cost. Activate this ability only any time you could cast a sorcery. -VG S - -Jhoira's Timebug -{2} -Artifact Creature - Insect -1/2 -{T}: Choose target permanent you control or suspended card you own. If that permanent or card has a time counter on it, you may remove a time counter from it or put another time counter on it. -TSP C - -Jhoira's Toolbox -{2} -Artifact Creature - Insect -1/1 -{2}: Regenerate target artifact creature. -ULG U - -Jhovall Queen -{4}{W}{W} -Creature - Cat Rebel -4/7 -Vigilance -MMQ R - -Jhovall Rider -{4}{W} -Creature - Human Rebel -3/3 -Trample -MMQ U - -Jihad -{W}{W}{W} -Enchantment -As Jihad enters the battlefield, choose a color and an opponent. -White creatures get +2/+1 as long as the chosen player controls a nontoken permanent of the chosen color. -When the chosen player controls no nontoken permanents of the chosen color, sacrifice Jihad. -ARN R - -Jilt -{1}{U} -Instant -Kicker {1}{R} (You may pay an additional {1}{R} as you cast this spell.) -Return target creature to its owner's hand. If Jilt was kicked, it deals 2 damage to another target creature. -APC C - -Jin-Gitaxias, Core Augur -{8}{U}{U} -Legendary Creature - Praetor -5/4 -Flash -At the beginning of your end step, draw seven cards. -Each opponent's maximum hand size is reduced by seven. -NPH M - -Jinx -{1}{U} -Instant -Target land becomes the basic land type of your choice until end of turn. -Draw a card at the beginning of the next turn's upkeep. -HML C - -Jinxed Choker -{3} -Artifact -At the beginning of your end step, target opponent gains control of Jinxed Choker and puts a charge counter on it. -At the beginning of your upkeep, Jinxed Choker deals damage to you equal to the number of charge counters on it. -{3}: Put a charge counter on Jinxed Choker or remove one from it. -MRD R - -Jinxed Idol -{2} -Artifact -At the beginning of your upkeep, Jinxed Idol deals 2 damage to you. -Sacrifice a creature: Target opponent gains control of Jinxed Idol. -TMP R, M11 R - -Jinxed Ring -{2} -Artifact -Whenever a nontoken permanent is put into your graveyard from the battlefield, Jinxed Ring deals 1 damage to you. -Sacrifice a creature: Target opponent gains control of Jinxed Ring. (This effect lasts indefinitely.) -STH R - -Jiwari, the Earth Aflame -{3}{R}{R} -Legendary Creature - Spirit -3/3 -{X}{R}, {T}: Jiwari, the Earth Aflame deals X damage to target creature without flying. -Channel - {X}{R}{R}{R}, Discard Jiwari: Jiwari deals X damage to each creature without flying. -SOK R - -Jodah's Avenger -{5}{U} -Creature - Shapeshifter -4/4 -{0}: Until end of turn, Jodah's Avenger gets -1/-1 and gains your choice of double strike, protection from red, vigilance, or shadow. (A creature with shadow can block or be blocked by only creatures with shadow.) -PLC U - -Johan -{3}{R}{G}{W} -Legendary Creature - Human Wizard -5/4 -At the beginning of combat on your turn, you may have Johan gain "Johan can't attack" until end of combat. If you do, attacking doesn't cause creatures you control to tap this combat if Johan is untapped. -LEG R, CHR R - -Johtull Wurm -{5}{G} -Creature - Wurm -6/6 -Whenever Johtull Wurm becomes blocked, it gets -2/-1 until end of turn for each creature blocking it beyond the first. -ICE U, 5ED U, ME2 U - -Join the Ranks -{3}{W} -Instant -Put two 1/1 white Soldier Ally creature tokens onto the battlefield. -WWK C - -Joiner Adept -{1}{G} -Creature - Elf Druid -2/1 -Lands you control have "{T}: Add one mana of any color to your mana pool." -5DN R, 10E R - -Jokulhaups -{4}{R}{R} -Sorcery -Destroy all artifacts, creatures, and lands. They can't be regenerated. -ICE R, 5ED R, 6ED R, MED R - -Jokulmorder -{4}{U}{U}{U} -Creature - Leviathan -12/12 -Trample -Jokulmorder enters the battlefield tapped. -When Jokulmorder enters the battlefield, sacrifice it unless you sacrifice five lands. -Jokulmorder doesn't untap during your untap step. -Whenever you play an Island, you may untap Jokulmorder. -CSP R - -Jolrael's Centaur -{1}{G}{G} -Creature - Centaur Archer -2/2 -Shroud (This permanent can't be the target of spells or abilities.) -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -MIR C - -Jolrael's Favor -{1}{G} -Enchantment - Aura -Flash -Enchant creature -{1}{G}: Regenerate enchanted creature. -PCY C - -Jolrael, Empress of Beasts -{3}{G}{G} -Legendary Creature - Human Spellshaper -3/3 -{2}{G}, {T}, Discard two cards: All lands target player controls become 3/3 creatures until end of turn. They're still lands. -PCY R, TSB S - -Jolt -{2}{U} -Instant -You may tap or untap target artifact, creature, or land. -Draw a card at the beginning of the next turn's upkeep. -MIR C - -Jolting Merfolk -{2}{U}{U} -Creature - Merfolk -2/2 -Fading 4 (This creature enters the battlefield with four fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.) -Remove a fade counter from Jolting Merfolk: Tap target creature. -NEM U - -Jor Kadeen, the Prevailer -{3}{R}{W} -Legendary Creature - Human Warrior -5/4 -First strike -Metalcraft - Creatures you control get +3/+0 as long as you control three or more artifacts. -NPH R - -Joraga Bard -{3}{G} -Creature - Elf Rogue Ally -1/4 -Whenever Joraga Bard or another Ally enters the battlefield under your control, you may have Ally creatures you control gain vigilance until end of turn. -ZEN C - -Joraga Treespeaker -{G} -Creature - Elf Druid -1/1 -Level up {1}{G} ({1}{G}: Put a level counter on this. Level up only as a sorcery.) -LEVEL 1-4 -1/2 -{T}: Add {G}{G} to your mana pool. -LEVEL 5+ -1/4 -Elves you control have "{T}: Add {G}{G} to your mana pool." -ROE U - -Joraga Warcaller -{G} -Creature - Elf Warrior -1/1 -Multikicker {1}{G} (You may pay an additional {1}{G} any number of times as you cast this spell.) -Joraga Warcaller enters the battlefield with a +1/+1 counter on it for each time it was kicked. -Other Elf creatures you control get +1/+1 for each +1/+1 counter on Joraga Warcaller. -WWK R - -Jotun Grunt -{1}{W} -Creature - Giant Soldier -4/4 -Cumulative upkeep-Put two cards from a single graveyard on the bottom of their owner's library. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -CSP U, COM U - -Jotun Owl Keeper -{2}{W} -Creature - Giant -3/3 -Cumulative upkeep {W} or {U} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -When Jotun Owl Keeper dies, put a 1/1 white Bird creature token with flying onto the battlefield for each age counter on it. -CSP U - -Journey of Discovery -{2}{G} -Sorcery -Choose one - Search your library for up to two basic land cards, reveal them, put them into your hand, then shuffle your library; or you may play up to two additional lands this turn. -Entwine {2}{G} (Choose both if you pay the entwine cost.) -MRD C - -Journey to Nowhere -{1}{W} -Enchantment -When Journey to Nowhere enters the battlefield, exile target creature. -When Journey to Nowhere leaves the battlefield, return the exiled card to the battlefield under its owner's control. -ZEN C, EVT C, COM C - -Journeyer's Kite -{2} -Artifact -{3}, {T}: Search your library for a basic land card, reveal it, and put it into your hand. Then shuffle your library. -CHK R - -Joven -{3}{R}{R} -Legendary Creature - Human Rogue -3/3 -{R}{R}{R}, {T}: Destroy target noncreature artifact. -HML C - -Joven's Ferrets -{G} -Creature - Ferret -1/1 -Whenever Joven's Ferrets attacks, it gets +0/+2 until end of turn. -At end of combat, tap all creatures that blocked Joven's Ferrets this turn. They don't untap during their controller's next untap step. -HML C, ME2 U - -Joven's Tools -{6} -Artifact -{4}, {T}: Target creature can't be blocked this turn except by Walls. -HML U, 5ED U - -Jovial Evil -{2}{B} -Sorcery -Jovial Evil deals X damage to target opponent, where X is twice the number of white creatures that player controls. -LEG R - -Joyous Respite -{3}{G} -Sorcery - Arcane -You gain 1 life for each land you control. -CHK C - -Judge Unworthy -{1}{W} -Instant -Choose target attacking or blocking creature. Scry 3, then reveal the top card of your library. Judge Unworthy deals damage equal to that card's converted mana cost to that creature. (To scry 3, look at the top three cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) -FUT C - -Judge of Currents -{1}{W} -Creature - Merfolk Wizard -1/1 -Whenever a Merfolk you control becomes tapped, you may gain 1 life. -LRW C - -Jugan, the Rising Star -{3}{G}{G}{G} -Legendary Creature - Dragon Spirit -5/5 -Flying -When Jugan, the Rising Star dies, you may distribute five +1/+1 counters among any number of target creatures. -CHK R - -Juggernaut -{4} -Artifact Creature - Juggernaut -5/3 -Juggernaut attacks each turn if able. -Juggernaut can't be blocked by Walls. -LEA U, LEB U, 2ED U, 3ED U, DST U, 10E U, ARC U, M11 U, EVT U, ME4 U - -Juju Bubble -{1} -Artifact -Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -When you play a card, sacrifice Juju Bubble. -{2}: You gain 1 life. -VIS U - -Jukai Messenger -{G} -Creature - Human Monk -1/1 -Forestwalk -CHK C - -Jump -{U} -Instant -Target creature gains flying until end of turn. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, M10 C - -Jund Battlemage -{2}{R} -Creature - Human Shaman -2/2 -{B}, {T}: Target player loses 1 life. -{G}, {T}: Put a 1/1 green Saproling creature token onto the battlefield. -ALA U - -Jund Charm -{B}{R}{G} -Instant -Choose one - Exile all cards from target player's graveyard; or Jund Charm deals 2 damage to each creature; or put two +1/+1 counters on target creature. -ALA U - -Jund Hackblade -{B/G}{R} -Creature - Goblin Berserker -2/1 -As long as you control another multicolored permanent, Jund Hackblade gets +1/+1 and has haste. -ARB C - -Jund Panorama -Land -{T}: Add {1} to your mana pool. -{1}, {T}, Sacrifice Jund Panorama: Search your library for a basic Swamp, Mountain, or Forest card and put it onto the battlefield tapped. Then shuffle your library. -ALA C - -Jund Sojourners -{B}{R}{G} -Creature - Viashino Shaman -3/2 -When you cycle Jund Sojourners or it dies, you may have it deal 1 damage to target creature or player. -Cycling {2}{R} ({2}{R}, Discard this card: Draw a card.) -ARB C - -Jungle Barrier -{2}{G}{U} -Creature - Plant Wall -2/6 -Defender (This creature can't attack.) -When Jungle Barrier enters the battlefield, draw a card. -APC U - -Jungle Basin -Land -Jungle Basin enters the battlefield tapped. -When Jungle Basin enters the battlefield, sacrifice it unless you return an untapped Forest you control to its owner's hand. -{T}: Add {1}{G} to your mana pool. -VIS U - -Jungle Lion -{G} -Creature - Cat -2/1 -Jungle Lion can't block. -POR C, ME3 C - -Jungle Patrol -{3}{G} -Creature - Human Soldier -3/2 -{1}{G}, {T}: Put a 0/1 green Wall creature token with defender named Wood onto the battlefield. -Sacrifice a token named Wood: Add {R} to your mana pool. -MIR R - -Jungle Shrine -Land -Jungle Shrine enters the battlefield tapped. -{T}: Add {R}, {G}, or {W} to your mana pool. -ALA U - -Jungle Troll -{1}{R}{G} -Creature - Troll -2/1 -{R}: Regenerate Jungle Troll. -{G}: Regenerate Jungle Troll. -MIR U - -Jungle Weaver -{5}{G}{G} -Creature - Spider -5/6 -Reach (This can block creatures with flying.) -Cycling {2} ({2}, Discard this card: Draw a card.) -ALA C - -Jungle Wurm -{3}{G}{G} -Creature - Wurm -5/5 -Whenever Jungle Wurm becomes blocked, it gets -1/-1 until end of turn for each creature blocking it beyond the first. -MIR C - -Juniper Order Advocate -{2}{W} -Creature - Human Knight -1/2 -As long as Juniper Order Advocate is untapped, green creatures you control get +1/+1. -ALL U, ME2 U - -Juniper Order Druid -{2}{G} -Creature - Human Cleric Druid -1/1 -{T}: Untap target land. -ICE C - -Juniper Order Ranger -{3}{G}{W} -Creature - Human Knight -2/4 -Whenever another creature enters the battlefield under your control, put a +1/+1 counter on that creature and a +1/+1 counter on Juniper Order Ranger. -CSP U, DDG U - -Junk Diver -{3} -Artifact Creature - Bird -1/1 -Flying -When Junk Diver dies, return another target artifact card from your graveyard to your hand. -UDS R - -Junk Golem -{4} -Artifact Creature - Golem -0/0 -Junk Golem enters the battlefield with three +1/+1 counters on it. -At the beginning of your upkeep, sacrifice Junk Golem unless you remove a +1/+1 counter from it. -{1}, Discard a card: Put a +1/+1 counter on Junk Golem. -ODY R - -Junktroller -{4} -Artifact Creature - Golem -0/6 -Defender (This creature can't attack.) -{T}: Put target card from a graveyard on the bottom of its owner's library. -RAV U - -Junkyo Bell -{4} -Artifact -At the beginning of your upkeep, you may have target creature you control get +X/+X until end of turn, where X is the number of creatures you control. If you do, sacrifice that creature at the beginning of the next end step. -CHK R - -Juntu Stakes -{2} -Artifact -Creatures with power 1 or less don't untap during their controllers' untap steps. -INV R - -Junun Efreet -{1}{B}{B} -Creature - Efreet -3/3 -Flying -At the beginning of your upkeep, sacrifice Junun Efreet unless you pay {B}{B}. -ARN R, 4ED U, ME4 U - -Jushi Apprentice -{1}{U} -Creature - Human Wizard -1/2 -{2}{U}, {T}: Draw a card. If you have nine or more cards in hand, flip Jushi Apprentice. ----- -Tomoya the Revealer -Legendary Creature - Human Wizard -2/3 -{3}{U}{U}, {T}: Target player draws X cards, where X is the number of cards in your hand. -CHK R - -Just Fate -{2}{W} -Instant -Cast Just Fate only during the declare attackers step and only if you've been attacked this step. -Destroy target attacking creature. -P02 R, ME4 C - -Justice -{2}{W}{W} -Enchantment -At the beginning of your upkeep, sacrifice Justice unless you pay {W}{W}. -Whenever a red creature or spell deals damage, Justice deals that much damage to that creature's or spell's controller. -ICE U, 5ED U - -Juvenile Gloomwidow -{G}{G} -Creature - Spider -1/3 -Reach (This can block creatures with flying.) -Wither (This deals damage to creatures in the form of -1/-1 counters.) -SHM C - -Juxtapose -{3}{U} -Sorcery -You and target player exchange control of the creature you each control with the highest converted mana cost. Then exchange control of artifacts the same way. If two or more permanents a player controls are tied for highest cost, their controller chooses one of them. -LEG R, CHR R, 5ED R, 6ED R, MED U - -Juzam Djinn -{2}{B}{B} -Creature - Djinn -5/5 -At the beginning of your upkeep, Juzam Djinn deals 1 damage to you. -ARN R, MED R - -Jwar Isle Refuge -Land -Jwar Isle Refuge enters the battlefield tapped. -When Jwar Isle Refuge enters the battlefield, you gain 1 life. -{T}: Add {U} or {B} to your mana pool. -ZEN U, COM U - -Jwari Scuttler -{2}{U} -Creature - Crab -2/3 -ROE C - -Jwari Shapeshifter -{1}{U} -Creature - Shapeshifter Ally -0/0 -You may have Jwari Shapeshifter enter the battlefield as a copy of any Ally creature on the battlefield. -WWK R - -Kaalia of the Vast -{1}{W}{B}{R} -Legendary Creature - Human Cleric -2/2 -Flying -Whenever Kaalia of the Vast attacks an opponent, you may put an Angel, Demon, or Dragon creature card from your hand onto the battlefield tapped and attacking that opponent. -COM M - -Kabira Crossroads -Land -Kabira Crossroads enters the battlefield tapped. -When Kabira Crossroads enters the battlefield, you gain 2 life. -{T}: Add {W} to your mana pool. -ZEN C, EVT C - -Kabira Evangel -{2}{W} -Creature - Human Cleric Ally -2/3 -Whenever Kabira Evangel or another Ally enters the battlefield under your control, you may choose a color. If you do, Allies you control gain protection from the chosen color until end of turn. -ZEN R - -Kabira Vindicator -{3}{W} -Creature - Human Knight -2/4 -Level up {2}{W} ({2}{W}: Put a level counter on this. Level up only as a sorcery.) -LEVEL 2-4 -3/6 -Other creatures you control get +1/+1. -LEVEL 5+ -4/8 -Other creatures you control get +2/+2. -ROE U, DDG U - -Kaboom! -{4}{R} -Sorcery -Choose any number of target players. For each of those players, reveal cards from the top of your library until you reveal a nonland card. Kaboom deals damage equal to that card's converted mana cost to that player, then you put the revealed cards on the bottom of your library in any order. -ONS R - -Kabuto Moth -{2}{W} -Creature - Spirit -1/2 -Flying -{T}: Target creature gets +1/+2 until end of turn. -CHK C - -Kaervek the Merciless -{5}{B}{R} -Legendary Creature - Human Shaman -5/4 -Whenever an opponent casts a spell, Kaervek the Merciless deals damage to target creature or player equal to that spell's converted mana cost. -TSP R, ARC R - -Kaervek's Hex -{3}{B} -Sorcery -Kaervek's Hex deals 1 damage to each nonblack creature and an additional 1 damage to each green creature. -MIR U - -Kaervek's Purge -{X}{B}{R} -Sorcery -Destroy target creature with converted mana cost X. If that creature dies this way, Kaervek's Purge deals damage equal to the creature's power to the creature's controller. -MIR U - -Kaervek's Spite -{B}{B}{B} -Instant -As an additional cost to cast Kaervek's Spite, sacrifice all permanents you control and discard your hand. -Target player loses 5 life. -VIS R - -Kaervek's Torch -{X}{R} -Sorcery -As long as Kaervek's Torch is on the stack, spells that target it cost {2} more to cast. -Kaervek's Torch deals X damage to target creature or player. -MIR C - -Kagemaro's Clutch -{3}{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets -X/-X, where X is the number of cards in your hand. -SOK C - -Kagemaro, First to Suffer -{3}{B}{B} -Legendary Creature - Demon Spirit -*/* -Kagemaro, First to Suffer's power and toughness are each equal to the number of cards in your hand. -{B}, Sacrifice Kagemaro: All creatures get -X/-X until end of turn, where X is the number of cards in your hand. -SOK R - -Kaho, Minamo Historian -{2}{U}{U} -Legendary Creature - Human Wizard -2/2 -When Kaho, Minamo Historian enters the battlefield, search your library for up to three instant cards and exile them. Then shuffle your library. -{X}, {T}: You may cast a card with converted mana cost X exiled with Kaho without paying its mana cost. -SOK R - -Kaijin of the Vanishing Touch -{1}{U} -Creature - Spirit -0/3 -Defender (This creature can't attack.) -Whenever Kaijin of the Vanishing Touch blocks a creature, return that creature to its owner's hand at end of combat. (Return it only if it's on the battlefield.) -BOK U - -Kalastria Highborn -{B}{B} -Creature - Vampire Shaman -2/2 -Whenever Kalastria Highborn or another Vampire you control dies, you may pay {B}. If you do, target player loses 2 life and you gain 2 life. -WWK R - -Kaleidostone -{2} -Artifact -When Kaleidostone enters the battlefield, draw a card. -{5}, {T}, Sacrifice Kaleidostone: Add {W}{U}{B}{R}{G} to your mana pool. -CON C - -Kalitas, Bloodchief of Ghet -{5}{B}{B} -Legendary Creature - Vampire Warrior -5/5 -{B}{B}{B}, {T}: Destroy target creature. If that creature dies this way, put a black Vampire creature token onto the battlefield. Its power is equal to that creature's power and its toughness is equal to that creature's toughness. -ZEN M - -Kalonian Behemoth -{5}{G}{G} -Creature - Beast -9/9 -Shroud (This creature can't be the target of spells or abilities.) -M10 R - -Kamahl's Desire -{1}{R} -Enchantment - Aura -Enchant creature -Enchanted creature has first strike. -Threshold - Enchanted creature gets +3/+0 as long as seven or more cards are in your graveyard. -ODY C - -Kamahl's Sledge -{5}{R}{R} -Sorcery -Kamahl's Sledge deals 4 damage to target creature. -Threshold - If seven or more cards are in your graveyard, instead Kamahl's Sledge deals 4 damage to that creature and 4 damage to that creature's controller. -TOR C - -Kamahl's Summons -{3}{G} -Sorcery -Each player may reveal any number of creature cards from his or her hand. Then each player puts a 2/2 green Bear creature token onto the battlefield for each card he or she revealed this way. -ONS U - -Kamahl, Fist of Krosa -{4}{G}{G} -Legendary Creature - Human Druid -4/3 -{G}: Target land becomes a 1/1 creature until end of turn. It's still a land. -{2}{G}{G}{G}: Creatures you control get +3/+3 and gain trample until end of turn. -ONS R, ARC R - -Kamahl, Pit Fighter -{4}{R}{R} -Legendary Creature - Human Barbarian -6/1 -Haste (This creature can attack and {T} as soon as it comes under your control.) -{T}: Kamahl, Pit Fighter deals 3 damage to target creature or player. -ODY R, 10E R - -Kami of Ancient Law -{1}{W} -Creature - Spirit -2/2 -Sacrifice Kami of Ancient Law: Destroy target enchantment. -CHK C - -Kami of Empty Graves -{3}{B} -Creature - Spirit -4/1 -Soulshift 3 (When this creature dies, you may return target Spirit card with converted mana cost 3 or less from your graveyard to your hand.) -SOK C - -Kami of False Hope -{W} -Creature - Spirit -1/1 -Sacrifice Kami of False Hope: Prevent all combat damage that would be dealt this turn. -BOK C - -Kami of Fire's Roar -{3}{R} -Creature - Spirit -2/3 -Whenever you cast a Spirit or Arcane spell, target creature can't block this turn. -CHK C - -Kami of Lunacy -{4}{B}{B} -Creature - Spirit -4/1 -Flying -Soulshift 5 (When this creature dies, you may return target Spirit card with converted mana cost 5 or less from your graveyard to your hand.) -CHK U - -Kami of Old Stone -{3}{W} -Creature - Spirit -1/7 -CHK U, 9ED U - -Kami of Tattered Shoji -{4}{W} -Creature - Spirit -2/5 -Whenever you cast a Spirit or Arcane spell, Kami of Tattered Shoji gains flying until end of turn. -BOK C - -Kami of Twisted Reflection -{1}{U}{U} -Creature - Spirit -2/2 -Sacrifice Kami of Twisted Reflection: Return target creature you control to its owner's hand. -CHK C - -Kami of the Crescent Moon -{U}{U} -Legendary Creature - Spirit -1/3 -At the beginning of each player's draw step, that player draws an additional card. -SOK R - -Kami of the Honored Dead -{5}{W}{W} -Creature - Spirit -3/5 -Flying -Whenever Kami of the Honored Dead is dealt damage, you gain that much life. -Soulshift 6 (When this creature dies, you may return target Spirit card with converted mana cost 6 or less from your graveyard to your hand.) -BOK U - -Kami of the Hunt -{2}{G} -Creature - Spirit -2/2 -Whenever you cast a Spirit or Arcane spell, Kami of the Hunt gets +1/+1 until end of turn. -CHK C - -Kami of the Painted Road -{4}{W} -Creature - Spirit -3/3 -Whenever you cast a Spirit or Arcane spell, Kami of the Painted Road gains protection from the color of your choice until end of turn. -CHK C - -Kami of the Palace Fields -{5}{W} -Creature - Spirit -3/2 -Flying, first strike -Soulshift 5 (When this creature dies, you may return target Spirit card with converted mana cost 5 or less from your graveyard to your hand.) -CHK U - -Kami of the Tended Garden -{3}{G} -Creature - Spirit -4/4 -At the beginning of your upkeep, sacrifice Kami of the Tended Garden unless you pay {G}. -Soulshift 3 (When this creature dies, you may return target Spirit card with converted mana cost 3 or less from your graveyard to your hand.) -SOK U - -Kami of the Waning Moon -{2}{B} -Creature - Spirit -1/1 -Flying -Whenever you cast a Spirit or Arcane spell, target creature gains fear until end of turn. (It can't be blocked except by artifact creatures and/or black creatures.) -CHK C - -Kangee, Aerie Keeper -{2}{W}{U} -Legendary Creature - Bird Wizard -2/2 -Kicker {X}{2} (You may pay an additional {X}{2} as you cast this spell.) -Flying -When Kangee, Aerie Keeper enters the battlefield, if it was kicked, put X feather counters on it. -Other Bird creatures get +1/+1 for each feather counter on Kangee, Aerie Keeper. -INV R - -Karador, Ghost Chieftain -{5}{B}{G}{W} -Legendary Creature - Centaur Spirit -3/4 -Karador, Ghost Chieftain costs {1} less to cast for each creature card in your graveyard. -During each of your turns, you may cast one creature card from your graveyard. -COM M - -Karakas -Legendary Land -{T}: Add {W} to your mana pool. -{T}: Return target legendary creature to its owner's hand. -LEG U, ME3 R - -Kargan Dragonlord -{R}{R} -Creature - Human Warrior -2/2 -Level up {R} ({R}: Put a level counter on this. Level up only as a sorcery.) -LEVEL 4-7 -4/4 -Flying -LEVEL 8+ -8/8 -Flying, trample -{R}: Kargan Dragonlord gets +1/+0 until end of turn. -ROE M - -Karma -{2}{W}{W} -Enchantment -At the beginning of each player's upkeep, Karma deals damage to that player equal to the number of Swamps he or she controls. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, 8ED U - -Karmic Guide -{3}{W}{W} -Creature - Angel Spirit -2/2 -Flying, protection from black -Echo {3}{W}{W} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -When Karmic Guide enters the battlefield, return target creature card from your graveyard to the battlefield. -ULG R - -Karmic Justice -{2}{W} -Enchantment -Whenever a spell or ability an opponent controls destroys a noncreature permanent you control, you may destroy target permanent that opponent controls. -ODY R - -Karn -Vanguard -Hand +1, life +6 -Each noncreature artifact you control is an artifact creature with power and toughness each equal to its converted mana cost. -VG S - -Karn Liberated -{7} -Planeswalker - Karn -6 -[+4] Target player exiles a card from his or her hand. -[-3] Exile target permanent. -[-14] Restart the game, leaving in exile all non-Aura permanent cards exiled with Karn Liberated. Then put those cards onto the battlefield under your control. -NPH M - -Karn's Touch -{U}{U} -Instant -Target noncreature artifact becomes an artifact creature with power and toughness each equal to its converted mana cost until end of turn. (It retains its abilities.) -MMQ R - -Karn, Silver Golem -{5} -Legendary Artifact Creature - Golem -4/4 -Whenever Karn, Silver Golem blocks or becomes blocked, it gets -4/+4 until end of turn. -{1}: Target noncreature artifact becomes an artifact creature with power and toughness each equal to its converted mana cost until end of turn. -USG R, FVR M - -Karona's Zealot -{4}{W} -Creature - Human Cleric -2/5 -Morph {3}{W}{W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Karona's Zealot is turned face up, all damage that would be dealt to it this turn is dealt to target creature instead. -SCG U - -Karona, False God -{1}{W}{U}{B}{R}{G} -Legendary Creature - Avatar -5/5 -Haste -At the beginning of each player's upkeep, that player untaps Karona, False God and gains control of it. -Whenever Karona attacks, creatures of the creature type of your choice get +3/+3 until end of turn. -SCG R - -Karona, False God Avatar -Vanguard -Hand -1, life +8 -At the beginning of your upkeep, exchange control of a permanent you control chosen at random and a permanent target opponent controls chosen at random. -VG S - -Karoo -Land -Karoo enters the battlefield tapped. -When Karoo enters the battlefield, sacrifice it unless you return an untapped Plains you control to its owner's hand. -{T}: Add {1}{W} to your mana pool. -VIS U - -Karoo Meerkat -{1}{G} -Creature - Mongoose -2/1 -Protection from blue -MIR U - -Karplusan Forest -Land -{T}: Add {1} to your mana pool. -{T}: Add {R} or {G} to your mana pool. Karplusan Forest deals 1 damage to you. -ICE R, 5ED R, 6ED R, 7ED R, 9ED R, 10E R - -Karplusan Giant -{6}{R} -Creature - Giant -3/3 -Tap an untapped snow land you control: Karplusan Giant gets +1/+1 until end of turn. -ICE U, ME2 U - -Karplusan Minotaur -{2}{R}{R} -Creature - Minotaur Warrior -3/3 -Cumulative upkeep-Flip a coin. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -Whenever you win a coin flip, Karplusan Minotaur deals 1 damage to target creature or player. -Whenever you lose a coin flip, Karplusan Minotaur deals 1 damage to target creature or player of an opponent's choice. -CSP R - -Karplusan Strider -{3}{G} -Creature - Yeti -3/4 -Karplusan Strider can't be the target of blue or black spells. -CSP U, 10E U - -Karplusan Wolverine -{R} -Snow Creature - Wolverine Beast -1/1 -Whenever Karplusan Wolverine becomes blocked, you may have it deal 1 damage to target creature or player. -CSP C - -Karplusan Yeti -{3}{R}{R} -Creature - Yeti -3/3 -{T}: Karplusan Yeti deals damage equal to its power to target creature. That creature deals damage equal to its power to Karplusan Yeti. -ICE R, 9ED R - -Karrthus, Tyrant of Jund -{4}{B}{R}{G} -Legendary Creature - Dragon -7/7 -Flying, haste -When Karrthus, Tyrant of Jund enters the battlefield, gain control of all Dragons, then untap all Dragons. -Other Dragon creatures you control have haste. -ARB M - -Karstoderm -{2}{G}{G} -Creature - Beast -0/0 -Karstoderm enters the battlefield with five +1/+1 counters on it. -Whenever an artifact enters the battlefield, remove a +1/+1 counter from Karstoderm. -DST U - -Kashi-Tribe Elite -{1}{G}{G} -Creature - Snake Warrior -2/3 -Legendary Snakes you control have shroud. (They can't be the targets of spells or abilities.) -Whenever Kashi-Tribe Elite deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. -SOK U - -Kashi-Tribe Reaver -{3}{G} -Creature - Snake Warrior -3/2 -Whenever Kashi-Tribe Reaver deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. -{1}{G}: Regenerate Kashi-Tribe Reaver. -CHK U - -Kashi-Tribe Warriors -{3}{G}{G} -Creature - Snake Warrior -2/4 -Whenever Kashi-Tribe Warriors deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. -CHK C - -Kasimir the Lone Wolf -{4}{W}{U} -Legendary Creature - Human Warrior -5/3 -LEG U - -Katabatic Winds -{2}{G} -Enchantment -Phasing (This phases in or out before you untap during each of your untap steps. While it's phased out, it's treated as though it doesn't exist.) -Creatures with flying can't attack or block, and their activated abilities with {T} in their costs can't be activated. -VIS R - -Kataki, War's Wage -{1}{W} -Legendary Creature - Spirit -2/1 -All artifacts have "At the beginning of your upkeep, sacrifice this artifact unless you pay {1}." -SOK R - -Kathari Bomber -{1}{B}{R} -Creature - Bird Shaman -2/2 -Flying -When Kathari Bomber deals combat damage to a player, put two 1/1 red Goblin creature tokens onto the battlefield and sacrifice Kathari Bomber. -Unearth {3}{B}{R} ({3}{B}{R}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) -ARB C - -Kathari Remnant -{2}{U}{B} -Creature - Bird Skeleton -0/1 -Flying -{B}: Regenerate Kathari Remnant. -Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.) -ARB U - -Kathari Screecher -{2}{U} -Creature - Bird Soldier -2/2 -Flying -Unearth {2}{U} ({2}{U}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) -ALA C - -Kavu Aggressor -{2}{R} -Creature - Kavu -3/2 -Kicker {4} (You may pay an additional {4} as you cast this spell.) -Kavu Aggressor can't block. -If Kavu Aggressor was kicked, it enters the battlefield with a +1/+1 counter on it. -INV C - -Kavu Chameleon -{3}{G}{G} -Creature - Kavu -4/4 -Kavu Chameleon can't be countered. -{G}: Kavu Chameleon becomes the color of your choice until end of turn. -INV U - -Kavu Climber -{3}{G}{G} -Creature - Kavu -3/3 -When Kavu Climber enters the battlefield, draw a card. -INV C, 9ED C, 10E C - -Kavu Glider -{2}{R} -Creature - Kavu -2/1 -{W}: Kavu Glider gets +0/+1 until end of turn. -{U}: Kavu Glider gains flying until end of turn. -APC C - -Kavu Howler -{4}{G}{G} -Creature - Kavu -4/5 -When Kavu Howler enters the battlefield, reveal the top four cards of your library. Put all Kavu cards revealed this way into your hand and the rest on the bottom of your library in any order. -APC U - -Kavu Lair -{2}{G} -Enchantment -Whenever a creature with power 4 or greater enters the battlefield, its controller draws a card. -INV R - -Kavu Mauler -{4}{G}{G} -Creature - Kavu -4/4 -Trample -Whenever Kavu Mauler attacks, it gets +1/+1 until end of turn for each other attacking Kavu. -APC R - -Kavu Monarch -{2}{R}{R} -Creature - Kavu -3/3 -Kavu creatures have trample. -Whenever another Kavu enters the battlefield, put a +1/+1 counter on Kavu Monarch. -INV R - -Kavu Predator -{1}{G} -Creature - Kavu -2/2 -Trample -Whenever an opponent gains life, put that many +1/+1 counters on Kavu Predator. -PLC U - -Kavu Primarch -{3}{G} -Creature - Kavu -3/3 -Convoke (Each creature you tap while casting this spell reduces its total cost by {1} or by one mana of that creature's color.) -Kicker {4} (You may pay an additional {4} as you cast this spell.) -If Kavu Primarch was kicked, it enters the battlefield with four +1/+1 counters on it. -FUT C - -Kavu Recluse -{2}{R} -Creature - Kavu -2/2 -{T}: Target land becomes a Forest until end of turn. -PLS C - -Kavu Runner -{3}{R} -Creature - Kavu -3/3 -Kavu Runner has haste as long as no opponent controls a white or blue creature. -INV U - -Kavu Scout -{2}{R} -Creature - Kavu Scout -0/2 -Domain - Kavu Scout gets +1/+0 for each basic land type among lands you control. -INV C - -Kavu Titan -{1}{G} -Creature - Kavu -2/2 -Kicker {2}{G} (You may pay an additional {2}{G} as you cast this spell.) -If Kavu Titan was kicked, it enters the battlefield with three +1/+1 counters on it and with trample. -INV R - -Kaysa -{3}{G}{G} -Legendary Creature - Elf Druid -2/3 -Green creatures you control get +1/+1. -ALL R, ME2 R - -Kazandu Blademaster -{W}{W} -Creature - Human Soldier Ally -1/1 -First strike, vigilance -Whenever Kazandu Blademaster or another Ally enters the battlefield under your control, you may put a +1/+1 counter on Kazandu Blademaster. -ZEN U - -Kazandu Refuge -Land -Kazandu Refuge enters the battlefield tapped. -When Kazandu Refuge enters the battlefield, you gain 1 life. -{T}: Add {R} or {G} to your mana pool. -ZEN U, ARC U, COM U - -Kazandu Tuskcaller -{1}{G} -Creature - Human Shaman -1/1 -Level up {1}{G} ({1}{G}: Put a level counter on this. Level up only as a sorcery.) -LEVEL 2-5 -1/1 -{T}: Put a 3/3 green Elephant creature token onto the battlefield. -LEVEL 6+ -1/1 -{T}: Put two 3/3 green Elephant creature tokens onto the battlefield. -ROE R - -Kazuul Warlord -{4}{R} -Creature - Minotaur Warrior Ally -3/3 -Whenever Kazuul Warlord or another Ally enters the battlefield under your control, you may put a +1/+1 counter on each Ally creature you control. -ZEN R - -Kazuul, Tyrant of the Cliffs -{3}{R}{R} -Legendary Creature - Ogre Warrior -5/4 -Whenever a creature an opponent controls attacks, if you're the defending player, put a 3/3 red Ogre creature token onto the battlefield unless that creature's controller pays {3}. -WWK R - -Kederekt Creeper -{U}{B}{R} -Creature - Horror -2/3 -Deathtouch (Any amount of damage this deals to a creature is enough to destroy it.) -Kederekt Creeper can't be blocked except by two or more creatures. -ALA C - -Kederekt Leviathan -{6}{U}{U} -Creature - Leviathan -5/5 -When Kederekt Leviathan enters the battlefield, return all other nonland permanents to their owners' hands. -Unearth {6}{U} ({6}{U}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) -ALA R - -Kederekt Parasite -{B} -Creature - Horror -1/1 -Whenever an opponent draws a card, if you control a red permanent, you may have Kederekt Parasite deal 1 damage to that player. -CON R - -Keen Sense -{G} -Enchantment - Aura -Enchant creature -Whenever enchanted creature deals damage to an opponent, you may draw a card. -PLC U - -Keen-Eyed Archers -{2}{W} -Creature - Elf Archer -2/2 -Reach (This creature can block creatures with flying.) -POR C - -Keeneye Aven -{3}{U} -Creature - Bird Soldier -2/3 -Flying -Cycling {2} ({2}, Discard this card: Draw a card.) -LGN C - -Keening Banshee -{2}{B}{B} -Creature - Spirit -2/2 -Flying -When Keening Banshee enters the battlefield, target creature gets -2/-2 until end of turn. -RAV U, GVL U - -Keening Stone -{6} -Artifact -{5}, {T}: Target player puts the top X cards of his or her library into his or her graveyard, where X is the number of cards in that player's graveyard. -ROE R - -Keep Watch -{2}{U} -Instant -Draw a card for each attacking creature. -JUD C, HOP C - -Keeper of Kookus -{R} -Creature - Goblin -1/1 -{R}: Keeper of Kookus gains protection from red until end of turn. -VIS C - -Keeper of Progenitus -{3}{G} -Creature - Elf Druid -1/3 -Whenever a player taps a Mountain, Forest, or Plains for mana, that player adds one mana to his or her mana pool of any type that land produced. -ALA R - -Keeper of Tresserhorn -{5}{B} -Creature - Avatar -6/6 -Whenever Keeper of Tresserhorn attacks and isn't blocked, it assigns no combat damage this turn and defending player loses 2 life. -ALL R - -Keeper of the Beasts -{G}{G} -Creature - Human Wizard -1/2 -{G}, {T}: Choose target opponent who controlled more creatures than you did as you activated this ability. Put a 2/2 green Beast creature token onto the battlefield. -EXO U - -Keeper of the Dead -{B}{B} -Creature - Human Wizard -1/2 -{B}, {T}: Choose target opponent who had at least two fewer creature cards in his or her graveyard than you did as you activated this ability. Destroy target nonblack creature he or she controls. -EXO U - -Keeper of the Flame -{R}{R} -Creature - Human Wizard -1/2 -{R}, {T}: Choose target opponent who had more life than you did as you activated this ability. Keeper of the Flame deals 2 damage to him or her. -EXO U - -Keeper of the Light -{W}{W} -Creature - Human Wizard -1/2 -{W}, {T}: Choose target opponent who had more life than you did as you activated this ability. You gain 3 life. -EXO U - -Keeper of the Mind -{U}{U} -Creature - Human Wizard -1/2 -{U}, {T}: Choose target opponent who had at least two more cards in hand than you did as you activated this ability. Draw a card. -EXO U - -Keeper of the Nine Gales -{2}{U} -Creature - Bird Wizard -1/2 -Flying -{T}, Tap two untapped Birds you control: Return target permanent to its owner's hand. -LGN R - -Keepers of the Faith -{1}{W}{W} -Creature - Human Cleric -2/3 -LEG C, CHR C - -Kei Takahashi -{2}{G}{W} -Legendary Creature - Human Cleric -2/2 -{T}: Prevent the next 2 damage that would be dealt to target creature this turn. -LEG R, CHR U, ME3 U - -Keiga, the Tide Star -{5}{U} -Legendary Creature - Dragon Spirit -5/5 -Flying -When Keiga, the Tide Star dies, gain control of target creature. -CHK R - -Keldon Arsonist -{2}{R} -Creature - Human Soldier -1/1 -{1}, Sacrifice two lands: Destroy target land. -PCY U - -Keldon Battlewagon -{5} -Artifact Creature - Juggernaut -0/3 -Trample -Keldon Battlewagon can't block. -When Keldon Battlewagon attacks, sacrifice it at end of combat. -Tap an untapped creature you control: Keldon Battlewagon gets +X/+0 until end of turn, where X is the power of the creature tapped this way. -PCY R - -Keldon Berserker -{3}{R} -Creature - Human Soldier Berserker -2/3 -Whenever Keldon Berserker attacks, if you control no untapped lands, it gets +3/+0 until end of turn. -PCY C - -Keldon Champion -{2}{R}{R} -Creature - Human Barbarian -3/2 -Haste -Echo {2}{R}{R} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -When Keldon Champion enters the battlefield, it deals 3 damage to target player. -UDS U, HOP U, H10 U - -Keldon Firebombers -{3}{R}{R} -Creature - Human Soldier -3/3 -When Keldon Firebombers enters the battlefield, each player sacrifices all lands he or she controls except for three. -PCY R - -Keldon Halberdier -{4}{R} -Creature - Human Warrior -4/1 -First strike -Suspend 4-{R} (Rather than cast this card from your hand, you may pay {R} and exile it with four time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -TSP C - -Keldon Mantle -{1}{R} -Enchantment - Aura -Enchant creature -{B}: Regenerate enchanted creature. -{R}: Enchanted creature gets +1/+0 until end of turn. -{G}: Enchanted creature gains trample until end of turn. -PLS C - -Keldon Marauders -{1}{R} -Creature - Human Warrior -3/3 -Vanishing 2 (This permanent enters the battlefield with two time counters on it. At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.) -When Keldon Marauders enters the battlefield or leaves the battlefield, it deals 1 damage to target player. -PLC C, H10 C - -Keldon Megaliths -Land -Keldon Megaliths enters the battlefield tapped. -{T}: Add {R} to your mana pool. -Hellbent - {1}{R}, {T}: Keldon Megaliths deals 1 damage to target creature or player. Activate this ability only if you have no cards in hand. -FUT U, JVC U - -Keldon Necropolis -Legendary Land -{T}: Add {1} to your mana pool. -{4}{R}, {T}, Sacrifice a creature: Keldon Necropolis deals 2 damage to target creature or player. -INV R - -Keldon Twilight -{1}{B}{R} -Enchantment -At the beginning of each player's end step, if no creatures attacked this turn, that player sacrifices a creature he or she controlled since the beginning of the turn. -PLS R - -Keldon Vandals -{2}{R} -Creature - Human Rogue -4/1 -Echo {2}{R} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -When Keldon Vandals enters the battlefield, destroy target artifact. -UDS C - -Keldon Warlord -{2}{R}{R} -Creature - Human Barbarian -*/* -Keldon Warlord's power and toughness are each equal to the number of non-Wall creatures you control. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, MED U - -Kelinore Bat -{2}{B} -Creature - Bat -2/1 -Flying -M10 C - -Kelsinko Ranger -{W} -Creature - Human -1/1 -{1}{W}: Target green creature gains first strike until end of turn. -ICE C - -Kemba's Legion -{5}{W}{W} -Creature - Cat Soldier -4/6 -Vigilance -Kemba's Legion can block an additional creature for each Equipment attached to Kemba's Legion. -MBS U - -Kemba's Skyguard -{1}{W}{W} -Creature - Cat Knight -2/2 -Flying -When Kemba's Skyguard enters the battlefield, you gain 2 life. -EVT C, SOM C - -Kemba, Kha Regent -{1}{W}{W} -Legendary Creature - Cat Cleric -2/4 -At the beginning of your upkeep, put a 2/2 white Cat creature token onto the battlefield for each Equipment attached to Kemba, Kha Regent. -SOM R - -Kemuri-Onna -{4}{B} -Creature - Spirit -3/3 -When Kemuri-Onna enters the battlefield, target player discards a card. -Whenever you cast a Spirit or Arcane spell, you may return Kemuri-Onna to its owner's hand. -SOK U - -Kentaro, the Smiling Cat -{1}{W} -Legendary Creature - Human Samurai -2/1 -Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -You may pay {X} rather than pay the mana cost for Samurai spells you cast, where X is that spell's converted mana cost. -BOK R - -Kezzerdrix -{2}{B}{B} -Creature - Rabbit Beast -4/4 -First strike -At the beginning of your upkeep, if your opponents control no creatures, Kezzerdrix deals 4 damage to you. -TMP R - -Khabal Ghoul -{2}{B} -Creature - Zombie -1/1 -At the beginning of each end step, put a +1/+1 counter on Khabal Ghoul for each creature that died this turn. -ARN U, MED R - -Khalni Garden -Land -Khalni Garden enters the battlefield tapped. -When Khalni Garden enters the battlefield, put a 0/1 green Plant creature token onto the battlefield. -{T}: Add {G} to your mana pool. -WWK C, ARC C - -Khalni Gem -{4} -Artifact -When Khalni Gem enters the battlefield, return two lands you control to their owner's hand. -{T}: Add two mana of any one color to your mana pool. -ZEN U - -Khalni Heart Expedition -{1}{G} -Enchantment -Landfall - Whenever a land enters the battlefield under your control, you may put a quest counter on Khalni Heart Expedition. -Remove three quest counters from Khalni Heart Expedition and sacrifice it: Search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle your library. -ZEN C - -Khalni Hydra -{G}{G}{G}{G}{G}{G}{G}{G} -Creature - Hydra -8/8 -Khalni Hydra costs {G} less to cast for each green creature you control. -Trample -ROE M - -Kher Keep -Legendary Land -{T}: Add {1} to your mana pool. -{1}{R}, {T}: Put a 0/1 red Kobold creature token named Kobolds of Kher Keep onto the battlefield. -TSP R - -Kiki-Jiki, Mirror Breaker -{2}{R}{R}{R} -Legendary Creature - Goblin Shaman -2/2 -Haste -{T}: Put a token that's a copy of target nonlegendary creature you control onto the battlefield. That token has haste. Sacrifice it at the beginning of the next end step. -CHK R - -Kiku's Shadow -{B}{B} -Sorcery -Target creature deals damage to itself equal to its power. -SOK U - -Kiku, Night's Flower -{B}{B} -Legendary Creature - Human Assassin -1/1 -{2}{B}{B}, {T}: Target creature deals damage to itself equal to its power. -CHK R - -Kill Switch -{3} -Artifact -{2}, {T}: Tap all other artifacts. They don't untap during their controllers' untap steps for as long as Kill Switch remains tapped. -NEM R - -Kill-Suit Cultist -{R} -Creature - Goblin Berserker -1/1 -Kill-Suit Cultist attacks each turn if able. -{B}, Sacrifice Kill-Suit Cultist: The next time damage would be dealt to target creature this turn, destroy that creature instead. -DIS C - -Killer Bees -{1}{G}{G} -Creature - Insect -0/1 -Flying -{G}: Killer Bees gets +1/+1 until end of turn. -LEG R, 4ED U, 5ED U, ME3 U - -Killer Instinct -{4}{R}{G} -Enchantment -At the beginning of your upkeep, reveal the top card of your library. If it's a creature card, put it onto the battlefield. That creature gains haste until end of turn. Sacrifice it at the beginning of the next end step. -GPT R - -Killer Whale -{3}{U}{U} -Creature - Whale -3/5 -{U}: Killer Whale gains flying until end of turn. -EXO U, BTD U - -Kiln Fiend -{1}{R} -Creature - Elemental Beast -1/2 -Whenever you cast an instant or sorcery spell, Kiln Fiend gets +3/+0 until end of turn. -ROE C - -Kiln Walker -{3} -Artifact Creature - Construct -0/3 -Whenever Kiln Walker attacks, it gets +3/+0 until end of turn. -NPH U - -Kilnmouth Dragon -{5}{R}{R} -Creature - Dragon -5/5 -Amplify 3 (As this creature enters the battlefield, put three +1/+1 counters on it for each Dragon card you reveal in your hand.) -Flying -{T}: Kilnmouth Dragon deals damage equal to the number of +1/+1 counters on it to target creature or player. -LGN R, ARC R, DDG R - -Kindle -{1}{R} -Instant -Kindle deals X damage to target creature or player, where X is 2 plus the number of cards named Kindle in all graveyards. -TMP C - -Kindle the Carnage -{1}{R}{R} -Sorcery -Discard a card at random. If you do, Kindle the Carnage deals damage equal to that card's converted mana cost to each creature. You may repeat this process any number of times. -DIS U - -Kindled Fury -{R} -Instant -Target creature gets +1/+0 and gains first strike until end of turn. (It deals combat damage before creatures without first strike.) -MOR C, M10 C - -King Cheetah -{3}{G} -Creature - Cat -3/2 -Flash -VIS C, 9ED U - -King Crab -{4}{U}{U} -Creature - Crab -4/5 -{1}{U}, {T}: Put target green creature on top of its owner's library. -ULG U - -King Suleiman -{1}{W} -Creature - Human -1/1 -{T}: Destroy target Djinn or Efreet. -ARN R - -King's Assassin -{1}{B}{B} -Creature - Human Assassin -1/1 -{T}: Destroy target tapped creature. Activate this ability only during your turn, before attackers are declared. -POR R - -Kingfisher -{3}{U} -Creature - Bird -2/2 -Flying -When Kingfisher dies, draw a card. -UDS C - -Kinsbaile Balloonist -{3}{W} -Creature - Kithkin Soldier -2/2 -Flying -Whenever Kinsbaile Balloonist attacks, you may have target creature gain flying until end of turn. -LRW C - -Kinsbaile Borderguard -{1}{W}{W} -Creature - Kithkin Soldier -1/1 -Kinsbaile Borderguard enters the battlefield with a +1/+1 counter on it for each other Kithkin you control. -When Kinsbaile Borderguard dies, put a 1/1 white Kithkin Soldier creature token onto the battlefield for each counter on it. -MOR R - -Kinsbaile Cavalier -{3}{W} -Creature - Kithkin Knight -2/2 -Knight creatures you control have double strike. -MOR R, DDG R - -Kinsbaile Skirmisher -{1}{W} -Creature - Kithkin Soldier -2/2 -When Kinsbaile Skirmisher enters the battlefield, target creature gets +1/+1 until end of turn. -LRW C - -Kinscaer Harpoonist -{3}{U} -Creature - Kithkin Soldier -2/2 -Flying -Whenever Kinscaer Harpoonist attacks, you may have target creature lose flying until end of turn. -SHM C - -Kira, Great Glass-Spinner -{1}{U}{U} -Legendary Creature - Spirit -2/2 -Flying -Creatures you control have "Whenever this creature becomes the target of a spell or ability for the first time in a turn, counter that spell or ability." -BOK R - -Kird Ape -{R} -Creature - Ape -1/1 -Kird Ape gets +1/+2 as long as you control a Forest. -ARN C, 3ED C, BTD C, 9ED U, FVE M - -Kiri-Onna -{4}{U} -Creature - Spirit -2/2 -When Kiri-Onna enters the battlefield, return target creature to its owner's hand. -Whenever you cast a Spirit or Arcane spell, you may return Kiri-Onna to its owner's hand. -SOK U - -Kirtar's Desire -{W} -Enchantment - Aura -Enchant creature -Enchanted creature can't attack. -Threshold - Enchanted creature can't block as long as seven or more cards are in your graveyard. -ODY C - -Kirtar's Wrath -{4}{W}{W} -Sorcery -Destroy all creatures. They can't be regenerated. -Threshold - If seven or more cards are in your graveyard, instead destroy all creatures, then put two 1/1 white Spirit creature tokens with flying onto the battlefield. Creatures destroyed this way can't be regenerated. -ODY R - -Kismet -{3}{W} -Enchantment -Artifacts, creatures, and lands played by your opponents enter the battlefield tapped. -LEG U, 4ED U, 5ED U, 6ED U, ME4 R - -Kiss of Death -{4}{B}{B} -Sorcery -Kiss of Death deals 4 damage to target opponent. You gain 4 life. -P02 U - -Kiss of the Amesha -{4}{W}{U} -Sorcery -Target player gains 7 life and draws two cards. -ALA U - -Kitchen Finks -{1}{G/W}{G/W} -Creature - Ouphe -3/2 -When Kitchen Finks enters the battlefield, you gain 2 life. -Persist (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) -SHM U - -Kite Shield -{0} -Artifact - Equipment -Equipped creature gets +0/+3. -Equip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) -M12 U - -Kitesail -{2} -Artifact - Equipment -Equipped creature gets +1/+0 and has flying. -Equip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) -WWK C - -Kitesail Apprentice -{W} -Creature - Kor Soldier -1/1 -As long as Kitesail Apprentice is equipped, it gets +1/+1 and has flying. -WWK C - -Kithkin Armor -{W} -Enchantment - Aura -Enchant creature -Enchanted creature can't be blocked by creatures with power 3 or greater. -Sacrifice Kithkin Armor: The next time a source of your choice would deal damage to enchanted creature this turn, prevent that damage. -WTH C - -Kithkin Daggerdare -{1}{G} -Creature - Kithkin Soldier -1/1 -{G}, {T}: Target attacking creature gets +2/+2 until end of turn. -LRW C - -Kithkin Greatheart -{1}{W} -Creature - Kithkin Soldier -2/1 -As long as you control a Giant, Kithkin Greatheart gets +1/+1 and has first strike. -LRW C - -Kithkin Harbinger -{2}{W} -Creature - Kithkin Wizard -1/3 -When Kithkin Harbinger enters the battlefield, you may search your library for a Kithkin card, reveal it, then shuffle your library and put that card on top of it. -LRW U - -Kithkin Healer -{2}{W} -Creature - Kithkin Cleric -2/2 -{T}: Prevent the next 1 damage that would be dealt to target creature or player this turn. -LRW C - -Kithkin Mourncaller -{2}{G} -Creature - Kithkin Scout -2/2 -Whenever an attacking Kithkin or Elf is put into your graveyard from the battlefield, you may draw a card. -LRW U - -Kithkin Rabble -{3}{W} -Creature - Kithkin -*/* -Vigilance -Kithkin Rabble's power and toughness are each equal to the number of white permanents you control. -SHM U - -Kithkin Shielddare -{1}{W} -Creature - Kithkin Soldier -1/1 -{W}, {T}: Target blocking creature gets +2/+2 until end of turn. -SHM C - -Kithkin Spellduster -{4}{W} -Creature - Kithkin Wizard -2/3 -Flying -{1}{W}, Sacrifice Kithkin Spellduster: Destroy target enchantment. -Persist (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) -EVE C - -Kithkin Zealot -{1}{W} -Creature - Kithkin Cleric -1/3 -When Kithkin Zealot enters the battlefield, you gain 1 life for each black and/or red permanent target opponent controls. -EVE C - -Kithkin Zephyrnaut -{2}{W} -Creature - Kithkin Soldier -2/2 -Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Kithkin Zephyrnaut, you may reveal it. If you do, Kithkin Zephyrnaut gets +2/+2 and gains flying and vigilance until end of turn. -MOR C - -Kitsune Blademaster -{2}{W} -Creature - Fox Samurai -2/2 -First strike -Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -CHK C - -Kitsune Bonesetter -{2}{W} -Creature - Fox Cleric -0/1 -{T}: Prevent the next 3 damage that would be dealt to target creature this turn. Activate this ability only if you have more cards in hand than each opponent. -SOK C - -Kitsune Dawnblade -{4}{W} -Creature - Fox Samurai -2/3 -Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -When Kitsune Dawnblade enters the battlefield, you may tap target creature. -SOK C - -Kitsune Diviner -{W} -Creature - Fox Cleric -0/1 -{T}: Tap target Spirit. -CHK C - -Kitsune Healer -{3}{W} -Creature - Fox Cleric -2/2 -{T}: Prevent the next 1 damage that would be dealt to target creature or player this turn. -{T}: Prevent all damage that would be dealt to target legendary creature this turn. -CHK C - -Kitsune Loreweaver -{1}{W} -Creature - Fox Cleric -2/1 -{1}{W}: Kitsune Loreweaver gets +0/+X until end of turn, where X is the number of cards in your hand. -SOK C - -Kitsune Mystic -{3}{W} -Creature - Fox Wizard -2/3 -At the beginning of the end step, if Kitsune Mystic is enchanted by two or more Auras, flip it. ----- -Autumn-Tail, Kitsune Sage -Legendary Creature - Fox Wizard -4/5 -{1}: Attach target Aura attached to a creature to another creature. -CHK R - -Kitsune Palliator -{2}{W} -Creature - Fox Cleric -0/2 -{T}: Prevent the next 1 damage that would be dealt to each creature and each player this turn. -BOK U - -Kitsune Riftwalker -{1}{W}{W} -Creature - Fox Wizard -2/1 -Protection from Spirits and from Arcane -CHK C - -Kiyomaro, First to Stand -{3}{W}{W} -Legendary Creature - Spirit -*/* -Kiyomaro, First to Stand's power and toughness are each equal to the number of cards in your hand. -As long as you have four or more cards in hand, Kiyomaro has vigilance. -Whenever Kiyomaro deals damage, if you have seven or more cards in hand, you gain 7 life. -SOK R - -Kjeldoran Dead -{B} -Creature - Skeleton -3/1 -When Kjeldoran Dead enters the battlefield, sacrifice a creature. -{B}: Regenerate Kjeldoran Dead. -ICE C, 5ED C, 6ED C, ME2 C - -Kjeldoran Elite Guard -{3}{W} -Creature - Human Soldier -2/2 -{T}: Target creature gets +2/+2 until end of turn. When that creature leaves the battlefield this turn, sacrifice Kjeldoran Elite Guard. Activate this ability only during combat. -ICE U, ME2 C - -Kjeldoran Escort -{2}{W}{W} -Creature - Human Soldier -2/3 -Banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -ALL C (x2) - -Kjeldoran Frostbeast -{3}{G}{W} -Creature - Elemental Beast -2/4 -At end of combat, destroy all creatures blocking or blocked by Kjeldoran Frostbeast. -ICE U, ME3 U - -Kjeldoran Gargoyle -{5}{W} -Creature - Gargoyle -3/3 -Flying, first strike -Whenever Kjeldoran Gargoyle deals damage, you gain that much life. -CSP U - -Kjeldoran Guard -{1}{W} -Creature - Human Soldier -1/1 -{T}: Target creature gets +1/+1 until end of turn. When that creature leaves the battlefield this turn, sacrifice Kjeldoran Guard. Activate this ability only during combat and only if defending player controls no snow lands. -ICE C - -Kjeldoran Home Guard -{3}{W} -Creature - Human Soldier -1/6 -At end of combat, if Kjeldoran Home Guard attacked or blocked this combat, put a -0/-1 counter on Kjeldoran Home Guard and put a 0/1 white Deserter creature token onto the battlefield. -ALL U, ME2 U - -Kjeldoran Javelineer -{W} -Creature - Human Soldier -1/2 -Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -{T}: Kjeldoran Javelineer deals damage equal to the number of age counters on it to target attacking or blocking creature. -CSP C - -Kjeldoran Knight -{W}{W} -Creature - Human Knight -1/1 -Banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -{1}{W}: Kjeldoran Knight gets +1/+0 until end of turn. -{W}{W}: Kjeldoran Knight gets +0/+2 until end of turn. -ICE R - -Kjeldoran Outpost -Land -If Kjeldoran Outpost would enter the battlefield, sacrifice a Plains instead. If you do, put Kjeldoran Outpost onto the battlefield. If you don't, put it into its owner's graveyard. -{T}: Add {W} to your mana pool. -{1}{W}, {T}: Put a 1/1 white Soldier creature token onto the battlefield. -ALL R, ME2 R - -Kjeldoran Outrider -{1}{W} -Creature - Human Soldier -2/2 -{W}: Kjeldoran Outrider gets +0/+1 until end of turn. -CSP C - -Kjeldoran Phalanx -{5}{W} -Creature - Human Soldier -2/5 -First strike; banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -ICE R - -Kjeldoran Pride -{1}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+2. -{2}{U}: Attach Kjeldoran Pride to target creature other than enchanted creature. -ALL C (x2) - -Kjeldoran Royal Guard -{3}{W}{W} -Creature - Human Soldier -2/5 -{T}: All combat damage that would be dealt to you by unblocked creatures this turn is dealt to Kjeldoran Royal Guard instead. -ICE R, 5ED R, 6ED R, 7ED R, 10E R - -Kjeldoran Skycaptain -{4}{W} -Creature - Human Soldier -2/2 -Flying; first strike; banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -ICE U, 5ED U, ME2 C - -Kjeldoran Skyknight -{2}{W} -Creature - Human Knight -1/1 -Flying; first strike; banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -ICE C - -Kjeldoran War Cry -{1}{W} -Instant -Creatures you control get +X/+X until end of turn, where X is 1 plus the number of cards named Kjeldoran War Cry in all graveyards. -CSP C - -Kjeldoran Warrior -{W} -Creature - Human Warrior -1/1 -Banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -ICE C - -Knacksaw Clique -{3}{U} -Creature - Faerie Rogue -1/4 -Flying -{1}{U}, {Q}: Target opponent exiles the top card of his or her library. Until end of turn, you may play that card. ({Q} is the untap symbol.) -SHM R - -Knight Errant -{1}{W} -Creature - Human Knight -2/2 -POR C, S99 C, S00 C, 7ED C - -Knight Exemplar -{1}{W}{W} -Creature - Human Knight -2/2 -First strike (This creature deals combat damage before creatures without first strike.) -Other Knight creatures you control get +1/+1 and are indestructible. (Lethal damage and effects that say "destroy" don't destroy them.) -M11 R, DDG R - -Knight of Cliffhaven -{1}{W} -Creature - Kor Knight -2/2 -Level up {3} ({3}: Put a level counter on this. Level up only as a sorcery.) -LEVEL 1-3 -2/3 -Flying -LEVEL 4+ -4/4 -Flying, vigilance -ROE C, DDG C - -Knight of Dawn -{1}{W}{W} -Creature - Human Knight -2/2 -First strike -{W}{W}: Knight of Dawn gains protection from the color of your choice until end of turn. -TMP U - -Knight of Dusk -{1}{B}{B} -Creature - Human Knight -2/2 -{B}{B}: Destroy target creature blocking Knight of Dusk. -TMP U, 10E U - -Knight of Meadowgrain -{W}{W} -Creature - Kithkin Knight -2/2 -First strike -Lifelink (Damage dealt by this creature also causes you to gain that much life.) -LRW U, DDG U - -Knight of New Alara -{2}{G}{W} -Creature - Human Knight -2/2 -Each other multicolored creature you control gets +1/+1 for each of its colors. -ARB R - -Knight of Stromgald -{B}{B} -Creature - Human Knight -2/1 -Protection from white -{B}: Knight of Stromgald gains first strike until end of turn. -{B}{B}: Knight of Stromgald gets +1/+0 until end of turn. -ICE U, 5ED U, ME2 U - -Knight of Sursi -{3}{W} -Creature - Human Knight -2/2 -Flying; flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -Suspend 3-{W} (Rather than cast this card from your hand, you may pay {W} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -FUT C - -Knight of Valor -{2}{W} -Creature - Human Knight -2/2 -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -{1}{W}: Each creature without flanking blocking Knight of Valor gets -1/-1 until end of turn. Activate this ability only once each turn. -VIS C - -Knight of the Holy Nimbus -{W}{W} -Creature - Human Rebel Knight -2/2 -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -If Knight of the Holy Nimbus would be destroyed, regenerate it. -{2}: Knight of the Holy Nimbus can't be regenerated this turn. Only any opponent may activate this ability. -TSP U - -Knight of the Mists -{2}{U} -Creature - Human Knight -2/2 -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -When Knight of the Mists enters the battlefield, you may pay {U}. If you don't, destroy target Knight and it can't be regenerated. -VIS C - -Knight of the Reliquary -{1}{G}{W} -Creature - Human Knight -2/2 -Knight of the Reliquary gets +1/+1 for each land card in your graveyard. -{T}, Sacrifice a Forest or Plains: Search your library for a land card, put it onto the battlefield, then shuffle your library. -CON R, DDG M - -Knight of the Skyward Eye -{1}{W} -Creature - Human Knight -2/2 -{3}{G}: Knight of the Skyward Eye gets +3/+3 until end of turn. Activate this ability only once each turn. -ALA C - -Knight of the White Orchid -{W}{W} -Creature - Human Knight -2/2 -First strike -When Knight of the White Orchid enters the battlefield, if an opponent controls more lands than you, you may search your library for a Plains card, put it onto the battlefield, then shuffle your library. -ALA R, DDG R - -Knight-Captain of Eos -{4}{W} -Creature - Human Knight -2/2 -When Knight-Captain of Eos enters the battlefield, put two 1/1 white Soldier creature tokens onto the battlefield. -{W}, Sacrifice a Soldier: Prevent all combat damage that would be dealt this turn. -ALA R - -Knighthood -{2}{W} -Enchantment -Creatures you control have first strike. -ULG U, 7ED U - -Knights of Thorn -{3}{W} -Creature - Human Knight -2/2 -Protection from red; banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -DRK R, MED C - -Knollspine Dragon -{5}{R}{R} -Creature - Dragon -7/5 -Flying -When Knollspine Dragon enters the battlefield, you may discard your hand and draw cards equal to the damage dealt to target opponent this turn. -SHM R - -Knollspine Invocation -{1}{R}{R} -Enchantment -{X}, Discard a card with converted mana cost X: Knollspine Invocation deals X damage to target creature or player. -SHM R - -Knotvine Mystic -{R}{G}{W} -Creature - Elf Druid -2/2 -{1}, {T}: Add {R}{G}{W} to your mana pool. -CON U - -Knotvine Paladin -{G}{W} -Creature - Human Knight -2/2 -Whenever Knotvine Paladin attacks, it gets +1/+1 until end of turn for each untapped creature you control. -ARB R, DDG R - -Know Naught but Fire -Scheme -When you set this scheme in motion, it deals damage to each opponent equal to the number of cards in that player's hand. -ARC C - -Knowledge Exploitation -{5}{U}{U} -Tribal Sorcery - Rogue -Prowl {3}{U} (You may cast this for its prowl cost if you dealt combat damage to a player this turn with a Rogue.) -Search target opponent's library for an instant or sorcery card. You may cast that card without paying its mana cost. Then that player shuffles his or her library. -MOR R - -Knowledge Pool -{6} -Artifact -Imprint - When Knowledge Pool enters the battlefield, each player exiles the top three cards of his or her library. -Whenever a player casts a spell from his or her hand, that player exiles it. If the player does, he or she may cast another nonland card exiled with Knowledge Pool without paying that card's mana cost. -MBS R - -Knowledge Vault -{4} -Artifact -{2}, {T}: Exile the top card of your library face down. -{0}: Sacrifice Knowledge Vault. If you do, discard your hand, then put all cards exiled with Knowledge Vault into their owner's hand. -When Knowledge Vault leaves the battlefield, put all cards exiled with Knowledge Vault into their owner's graveyard. -LEG R, ME3 U - -Knucklebone Witch -{B} -Creature - Goblin Shaman -1/1 -Whenever a Goblin you control dies, you may put a +1/+1 counter on Knucklebone Witch. -LRW R - -Kobold Drill Sergeant -{1}{R} -Creature - Kobold Soldier -1/2 -Other Kobold creatures you control get +0/+1 and have trample. -LEG U, ME3 U - -Kobold Overlord -{1}{R} -Creature - Kobold -1/2 -First strike -Other Kobold creatures you control have first strike. -LEG R, ME3 U - -Kobold Taskmaster -{1}{R} -Creature - Kobold -1/2 -Other Kobold creatures you control get +1/+0. -LEG U, TSB S, ME3 C - -Kobolds of Kher Keep -{0} -Creature - Kobold -0/1 -Kobolds of Kher Keep is red. -LEG C, ME3 C - -Kodama of the Center Tree -{4}{G} -Legendary Creature - Spirit -*/* -Kodama of the Center Tree's power and toughness are each equal to the number of Spirits you control. -Kodama of the Center Tree has soulshift X, where X is the number of Spirits you control. (When this creature dies, you may return target Spirit card with converted mana cost X or less from your graveyard to your hand.) -BOK R - -Kodama of the North Tree -{2}{G}{G}{G} -Legendary Creature - Spirit -6/4 -Trample; shroud (This permanent can't be the target of spells or abilities.) -CHK R - -Kodama of the South Tree -{2}{G}{G} -Legendary Creature - Spirit -4/4 -Whenever you cast a Spirit or Arcane spell, each other creature you control gets +1/+1 and gains trample until end of turn. -CHK R - -Kodama's Might -{G} -Instant - Arcane -Target creature gets +2/+2 until end of turn. -Splice onto Arcane {G} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -CHK C - -Kodama's Reach -{2}{G} -Sorcery - Arcane -Search your library for two basic land cards, reveal those cards, and put one onto the battlefield tapped and the other into your hand. Then shuffle your library. -CHK C, COM C - -Kokusho, the Evening Star -{4}{B}{B} -Legendary Creature - Dragon Spirit -5/5 -Flying -When Kokusho, the Evening Star dies, each opponent loses 5 life. You gain life equal to the life lost this way. -CHK R, FVD R - -Konda's Banner -{2} -Legendary Artifact - Equipment -Konda's Banner can be attached only to a legendary creature. -Creatures that share a color with equipped creature get +1/+1. -Creatures that share a creature type with equipped creature get +1/+1. -Equip {2} -CHK R - -Konda's Hatamoto -{1}{W} -Creature - Human Samurai -1/2 -Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -As long as you control a legendary Samurai, Konda's Hatamoto gets +1/+2 and has vigilance. (Attacking doesn't cause this creature to tap.) -CHK U - -Konda, Lord of Eiganjo -{5}{W}{W} -Legendary Creature - Human Samurai -3/3 -Vigilance (Attacking doesn't cause this creature to tap.) -Bushido 5 (When this blocks or becomes blocked, it gets +5/+5 until end of turn.) -Konda, Lord of Eiganjo is indestructible. -CHK R - -Kongming's Contraptions -{3}{W} -Creature - Human Soldier -2/4 -{T}: Kongming's Contraptions deals 2 damage to target attacking creature. Activate this ability only during the declare attackers step and only if you've been attacked this step. -PTK R - -Kongming, "Sleeping Dragon" -{2}{W}{W} -Legendary Creature - Human Advisor -2/2 -Other creatures you control get +1/+1. -PTK R, ME3 R - -Kookus -{3}{R}{R} -Creature - Djinn -3/5 -Trample -At the beginning of your upkeep, if you don't control a creature named Keeper of Kookus, Kookus deals 3 damage to you and attacks this turn if able. -{R}: Kookus gets +1/+0 until end of turn. -VIS R - -Kor Aeronaut -{W}{W} -Creature - Kor Soldier -2/2 -Kicker {1}{W} (You may pay an additional {1}{W} as you cast this spell.) -Flying -When Kor Aeronaut enters the battlefield, if it was kicked, target creature gains flying until end of turn. -ZEN U, EVT U - -Kor Cartographer -{3}{W} -Creature - Kor Scout -2/2 -When Kor Cartographer enters the battlefield, you may search your library for a Plains card, put it onto the battlefield tapped, then shuffle your library. -ZEN C - -Kor Chant -{2}{W} -Instant -All damage that would be dealt this turn to target creature you control by a source of your choice is dealt to another target creature instead. -EXO C - -Kor Dirge -{2}{B} -Instant -All damage that would be dealt this turn to target creature you control by a source of your choice is dealt to another target creature instead. -PLC U - -Kor Duelist -{W} -Creature - Kor Soldier -1/1 -As long as Kor Duelist is equipped, it has double strike. (It deals both first-strike and regular combat damage.) -ZEN U - -Kor Firewalker -{W}{W} -Creature - Kor Soldier -2/2 -Protection from red -Whenever a player casts a red spell, you may gain 1 life. -WWK U - -Kor Haven -Legendary Land -{T}: Add {1} to your mana pool. -{1}{W}, {T}: Prevent all combat damage that would be dealt by target attacking creature this turn. -NEM R - -Kor Hookmaster -{2}{W} -Creature - Kor Soldier -2/2 -When Kor Hookmaster enters the battlefield, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. -ZEN C, EVT C - -Kor Line-Slinger -{1}{W} -Creature - Kor Scout -0/1 -{T}: Tap target creature with power 3 or less. -ROE C - -Kor Outfitter -{W}{W} -Creature - Kor Soldier -2/2 -When Kor Outfitter enters the battlefield, you may attach target Equipment you control to target creature you control. -ZEN C - -Kor Sanctifiers -{2}{W} -Creature - Kor Cleric -2/3 -Kicker {W} (You may pay an additional {W} as you cast this spell.) -When Kor Sanctifiers enters the battlefield, if it was kicked, destroy target artifact or enchantment. -HOP C, ZEN C - -Kor Skyfisher -{1}{W} -Creature - Kor Soldier -2/3 -Flying -When Kor Skyfisher enters the battlefield, return a permanent you control to its owner's hand. -ZEN C, EVT C - -Kor Spiritdancer -{1}{W} -Creature - Kor Wizard -0/2 -Kor Spiritdancer gets +2/+2 for each Aura attached to it. -Whenever you cast an Aura spell, you may draw a card. -ROE R - -Korlash, Heir to Blackblade -{2}{B}{B} -Legendary Creature - Zombie Warrior -*/* -Korlash, Heir to Blackblade's power and toughness are each equal to the number of Swamps you control. -{1}{B}: Regenerate Korlash. -Grandeur - Discard another card named Korlash, Heir to Blackblade: Search your library for up to two Swamp cards, put them onto the battlefield tapped, then shuffle your library. -FUT R - -Kormus Bell -{4} -Artifact -All Swamps are 1/1 black creatures that are still lands. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, ME4 R - -Koskun Falls -{2}{B}{B} -World Enchantment -At the beginning of your upkeep, sacrifice Koskun Falls unless you tap an untapped creature you control. -Creatures can't attack you unless their controller pays {2} for each creature he or she controls that's attacking you. -HML R - -Koskun Keep -Land -{T}: Add {1} to your mana pool. -{1}, {T}: Add {R} to your mana pool. -{2}, {T}: Add {B} or {G} to your mana pool. -HML U - -Koth of the Hammer -{2}{R}{R} -Planeswalker - Koth -3 -[+1] Untap target Mountain. It becomes a 4/4 red Elemental creature until end of turn. It's still a land. -[-2] Add {R} to your mana pool for each Mountain you control. -[-5] You get an emblem with "Mountains you control have '{T}: This land deals 1 damage to target creature or player.'" -SOM M - -Koth's Courier -{1}{R}{R} -Creature - Human Rogue -2/3 -Forestwalk -MBS C - -Kozilek's Predator -{3}{G} -Creature - Eldrazi Drone -3/3 -When Kozilek's Predator enters the battlefield, put two 0/1 colorless Eldrazi Spawn creature tokens onto the battlefield. They have "Sacrifice this creature: Add {1} to your mana pool." -ROE C - -Kozilek, Butcher of Truth -{10} -Legendary Creature - Eldrazi -12/12 -When you cast Kozilek, Butcher of Truth, draw four cards. -Annihilator 4 (Whenever this creature attacks, defending player sacrifices four permanents.) -When Kozilek is put into a graveyard from anywhere, its owner shuffles his or her graveyard into his or her library. -ROE M - -Kraken Hatchling -{U} -Creature - Kraken -0/4 -ZEN C - -Kraken's Eye -{2} -Artifact -Whenever a player casts a blue spell, you may gain 1 life. -DST U, 9ED U, 10E U, M10 U, M11 U, M12 U - -Krakilin -{X}{G}{G} -Creature - Beast -0/0 -Krakilin enters the battlefield with X +1/+1 counters on it. -{1}{G}: Regenerate Krakilin. -TMP U - -Kranioceros -{4}{R} -Creature - Beast -5/2 -{1}{W}: Kranioceros gets +0/+3 until end of turn. -CON C - -Krark's Thumb -{2} -Legendary Artifact -If you would flip a coin, instead flip two coins and ignore one. -MRD R - -Krark-Clan Engineers -{3}{R} -Creature - Goblin Artificer -2/2 -{R}, Sacrifice two artifacts: Destroy target artifact. -5DN U - -Krark-Clan Grunt -{2}{R} -Creature - Goblin Warrior -2/2 -Sacrifice an artifact: Krark-Clan Grunt gets +1/+0 and gains first strike until end of turn. -MRD C - -Krark-Clan Ironworks -{4} -Artifact -Sacrifice an artifact: Add {2} to your mana pool. -5DN U - -Krark-Clan Ogre -{3}{R}{R} -Creature - Ogre -3/3 -{R}, Sacrifice an artifact: Target creature can't block this turn. -5DN C - -Krark-Clan Shaman -{R} -Creature - Goblin Shaman -1/1 -Sacrifice an artifact: Krark-Clan Shaman deals 1 damage to each creature without flying. -MRD C - -Krark-Clan Stoker -{2}{R} -Creature - Goblin Shaman -2/2 -{T}, Sacrifice an artifact: Add {R}{R} to your mana pool. -DST C - -Kresh the Bloodbraided -{2}{B}{R}{G} -Legendary Creature - Human Warrior -3/3 -Whenever another creature dies, you may put X +1/+1 counters on Kresh the Bloodbraided, where X is that creature's power. -ALA M - -Kresh the Bloodbraided Avatar -Vanguard -Hand +1, life -3 -Whenever a creature you control is devoured, put an X/X green Ooze creature token onto the battlefield, where X is the devoured creature's power. -VG S - -Kris Mage -{R} -Creature - Human Spellshaper -1/1 -{R}, {T}, Discard a card: Kris Mage deals 1 damage to target creature or player. -MMQ C - -Krosa -Plane - Dominaria -All creatures get +2/+2. -Whenever you roll {C}, you may add {W}{U}{B}{R}{G} to your mana pool. -HOP C - -Krosan Archer -{3}{G} -Creature - Centaur Archer -2/3 -Reach (This creature can block creatures with flying.) -{G}, Discard a card: Krosan Archer gets +0/+2 until end of turn. -ODY C - -Krosan Avenger -{2}{G} -Creature - Human Druid -3/1 -Trample -Threshold - {1}{G}: Regenerate Krosan Avenger. Activate this ability only if seven or more cards are in your graveyard. -ODY C - -Krosan Beast -{3}{G} -Creature - Squirrel Beast -1/1 -Threshold - Krosan Beast gets +7/+7 as long as seven or more cards are in your graveyard. -ODY R - -Krosan Cloudscraper -{7}{G}{G}{G} -Creature - Beast Mutant -13/13 -At the beginning of your upkeep, sacrifice Krosan Cloudscraper unless you pay {G}{G}. -Morph {7}{G}{G} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -LGN R, TSB S - -Krosan Colossus -{6}{G}{G}{G} -Creature - Beast -9/9 -Morph {6}{G}{G} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS R - -Krosan Constrictor -{3}{G} -Creature - Snake -2/2 -Swampwalk -{T}: Target black creature gets -2/-0 until end of turn. -TOR C - -Krosan Drover -{3}{G} -Creature - Elf -2/2 -Creature spells you cast with converted mana cost 6 or greater cost {2} less to cast. -SCG C - -Krosan Grip -{2}{G} -Instant -Split second (As long as this spell is on the stack, players can't cast spells or activate abilities that aren't mana abilities.) -Destroy target artifact or enchantment. -TSP U - -Krosan Groundshaker -{4}{G}{G}{G} -Creature - Beast -6/6 -{G}: Target Beast creature gains trample until end of turn. -ONS U - -Krosan Reclamation -{1}{G} -Instant -Target player shuffles up to two target cards from his or her graveyard into his or her library. -Flashback {1}{G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -JUD U - -Krosan Restorer -{2}{G} -Creature - Human Druid -1/2 -{T}: Untap target land. -Threshold - {T}: Untap up to three target lands. Activate this ability only if seven or more cards are in your graveyard. -TOR C - -Krosan Tusker -{5}{G}{G} -Creature - Boar Beast -6/5 -Cycling {2}{G} ({2}{G}, Discard this card: Draw a card.) -When you cycle Krosan Tusker, you may search your library for a basic land card, reveal that card, put it into your hand, then shuffle your library. -ONS C, GVL C, ARC C, COM C - -Krosan Verge -Land -Krosan Verge enters the battlefield tapped. -{T}: Add {1} to your mana pool. -{2}, {T}, Sacrifice Krosan Verge: Search your library for a Forest card and a Plains card and put them onto the battlefield tapped. Then shuffle your library. -JUD U, ARC U - -Krosan Vorine -{3}{G} -Creature - Cat Beast -3/2 -Provoke (When this attacks, you may have target creature defending player controls untap and block it if able.) -Krosan Vorine can't be blocked by more than one creature. -LGN C - -Krosan Warchief -{2}{G} -Creature - Beast -2/2 -Beast spells you cast cost {1} less to cast. -{1}{G}: Regenerate target Beast. -SCG U - -Krosan Wayfarer -{G} -Creature - Human Druid -1/1 -Sacrifice Krosan Wayfarer: You may put a land card from your hand onto the battlefield. -JUD C - -Krovikan Elementalist -{B}{B} -Creature - Human Wizard -1/1 -{2}{R}: Target creature gets +1/+0 until end of turn. -{U}{U}: Target creature you control gains flying until end of turn. Sacrifice it at the beginning of the next end step. -ICE U - -Krovikan Fetish -{2}{B} -Enchantment - Aura -Enchant creature -When Krovikan Fetish enters the battlefield, draw a card at the beginning of the next turn's upkeep. -Enchanted creature gets +1/+1. -ICE C, 5ED C, ME2 C - -Krovikan Horror -{3}{B} -Creature - Horror Spirit -2/2 -At the beginning of the end step, if Krovikan Horror is in your graveyard with a creature card directly above it, you may return Krovikan Horror to your hand. -{1}, Sacrifice a creature: Krovikan Horror deals 1 damage to target creature or player. -ALL R, ME2 R - -Krovikan Mist -{1}{U} -Creature - Illusion -*/* -Flying -Krovikan Mist's power and toughness are each equal to the number of Illusions on the battlefield. -CSP C - -Krovikan Plague -{2}{B} -Enchantment - Aura -Enchant non-Wall creature you control -When Krovikan Plague enters the battlefield, draw a card at the beginning of the next turn's upkeep. -Tap enchanted creature: Krovikan Plague deals 1 damage to target creature or player. Put a -0/-1 counter on enchanted creature. Activate this ability only if enchanted creature is untapped. -ALL U - -Krovikan Rot -{2}{B} -Instant -Destroy target creature with power 2 or less. -Recover {1}{B}{B} (When a creature is put into your graveyard from the battlefield, you may pay {1}{B}{B}. If you do, return this card from your graveyard to your hand. Otherwise, exile this card.) -CSP U - -Krovikan Scoundrel -{1}{B} -Creature - Human Rogue -2/1 -CSP C - -Krovikan Sorcerer -{2}{U} -Creature - Human Wizard -1/1 -{T}, Discard a nonblack card: Draw a card. -{T}, Discard a black card: Draw two cards, then discard one of them. -ICE C, 5ED C, ME2 C - -Krovikan Vampire -{3}{B}{B} -Creature - Vampire -3/3 -At the beginning of each end step, if a creature dealt damage by Krovikan Vampire this turn died, put that card onto the battlefield under your control. Sacrifice it when you lose control of Krovikan Vampire. -ICE U, ME2 U - -Krovikan Whispers -{3}{U} -Enchantment - Aura -Enchant creature -Cumulative upkeep {U} or {B} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -You control enchanted creature. -When Krovikan Whispers is put into a graveyard from the battlefield, you lose 2 life for each age counter on it. -CSP U - -Kry Shield -{2} -Artifact -{2}, {T}: Prevent all damage that would be dealt this turn by target creature you control. That creature gets +0/+X until end of turn, where X is its converted mana cost. -LEG U - -Kudzu -{1}{G}{G} -Enchantment - Aura -Enchant land -When enchanted land becomes tapped, destroy it. That land's controller attaches Kudzu to a land of his or her choice. -LEA R, LEB R, 2ED R, 3ED R, ME4 U - -Kukemssa Pirates -{3}{U} -Creature - Human Pirate -2/2 -Whenever Kukemssa Pirates attacks and isn't blocked, you may gain control of target artifact defending player controls. If you do, Kukemssa Pirates assigns no combat damage this turn. -MIR R - -Kukemssa Serpent -{3}{U} -Creature - Serpent -4/3 -Kukemssa Serpent can't attack unless defending player controls an Island. -{U}, Sacrifice an Island: Target land an opponent controls becomes an Island until end of turn. -When you control no Islands, sacrifice Kukemssa Serpent. -MIR C - -Kuldotha Flamefiend -{4}{R}{R} -Creature - Elemental -4/4 -When Kuldotha Flamefiend enters the battlefield, you may sacrifice an artifact. If you do, Kuldotha Flamefiend deals 4 damage divided as you choose among any number of target creatures and/or players. -MBS U - -Kuldotha Forgemaster -{5} -Artifact Creature - Construct -3/5 -{T}, Sacrifice three artifacts: Search your library for an artifact card and put it onto the battlefield. Then shuffle your library. -SOM R - -Kuldotha Phoenix -{2}{R}{R}{R} -Creature - Phoenix -4/4 -Flying, haste -Metalcraft - {4}: Return Kuldotha Phoenix from your graveyard to the battlefield. Activate this ability only during your upkeep and only if you control three or more artifacts. -SOM R - -Kuldotha Rebirth -{R} -Sorcery -As an additional cost to cast Kuldotha Rebirth, sacrifice an artifact. -Put three 1/1 red Goblin creature tokens onto the battlefield. -SOM C - -Kuldotha Ringleader -{4}{R} -Creature - Giant Berserker -4/4 -Battle cry (Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn.) -Kuldotha Ringleader attacks each turn if able. -MBS C - -Kulrath Knight -{3}{B/R}{B/R} -Creature - Elemental Knight -3/3 -Flying -Wither (This deals damage to creatures in the form of -1/-1 counters.) -Creatures your opponents control with counters on them can't attack or block. -SHM U - -Kumano's Blessing -{2}{R} -Enchantment - Aura -Flash -Enchant creature -If a creature dealt damage by enchanted creature this turn would die, exile it instead. -BOK C - -Kumano's Pupils -{4}{R} -Creature - Human Shaman -3/3 -If a creature dealt damage by Kumano's Pupils this turn would die, exile it instead. -CHK U - -Kumano, Master Yamabushi -{3}{R}{R} -Legendary Creature - Human Shaman -4/4 -{1}{R}: Kumano, Master Yamabushi deals 1 damage to target creature or player. -If a creature dealt damage by Kumano this turn would die, exile it instead. -CHK R - -Kuon, Ogre Ascendant -{B}{B}{B} -Legendary Creature - Ogre Monk -2/4 -At the beginning of the end step, if three or more creatures died this turn, flip Kuon, Ogre Ascendant. ----- -Kuon's Essence -Legendary Enchantment -At the beginning of each player's upkeep, that player sacrifices a creature. -SOK R - -Kurgadon -{4}{G} -Creature - Beast -3/3 -Whenever you cast a creature spell with converted mana cost 6 or greater, put three +1/+1 counters on Kurgadon. -SCG U - -Kuro's Taken -{1}{B} -Creature - Rat Samurai -1/1 -Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -{1}{B}: Regenerate Kuro's Taken. -SOK C - -Kuro, Pitlord -{6}{B}{B}{B} -Legendary Creature - Demon Spirit -9/9 -At the beginning of your upkeep, sacrifice Kuro, Pitlord unless you pay {B}{B}{B}{B}. -Pay 1 life: Target creature gets -1/-1 until end of turn. -CHK R, DVD R - -Kusari-Gama -{3} -Artifact - Equipment -Equipped creature has "{2}: This creature gets +1/+0 until end of turn." -Whenever equipped creature deals damage to a blocking creature, Kusari-Gama deals that much damage to each other creature defending player controls. -Equip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) -CHK R - -Kyoki, Sanity's Eclipse -{4}{B}{B} -Legendary Creature - Demon Spirit -6/4 -Whenever you cast a Spirit or Arcane spell, target opponent exiles a card from his or her hand. -BOK R - -Kyren Archive -{3} -Artifact -At the beginning of your upkeep, you may exile the top card of your library face down. -{5}, Discard your hand, Sacrifice Kyren Archive: Put all cards exiled with Kyren Archive into their owner's hand. -MMQ R - -Kyren Glider -{1}{R} -Creature - Goblin -1/1 -Flying -Kyren Glider can't block. -MMQ C - -Kyren Legate -{1}{R} -Creature - Goblin -1/1 -Haste -If an opponent controls a Plains and you control a Mountain, you may cast Kyren Legate without paying its mana cost. -MMQ U - -Kyren Negotiations -{2}{R}{R} -Enchantment -Tap an untapped creature you control: Kyren Negotiations deals 1 damage to target player. -MMQ U - -Kyren Sniper -{2}{R} -Creature - Goblin -1/1 -At the beginning of your upkeep, you may have Kyren Sniper deal 1 damage to target player. -MMQ C - -Kyren Toy -{3} -Artifact -{1}, {T}: Put a charge counter on Kyren Toy. -{T}, Remove X charge counters from Kyren Toy: Add {X}{1} to your mana pool. -MMQ R - -Kyscu Drake -{3}{G} -Creature - Drake -2/2 -Flying -{G}: Kyscu Drake gets +0/+1 until end of turn. Activate this ability only once each turn. -Sacrifice Kyscu Drake and a creature named Spitting Drake: Search your library for a card named Viashivan Dragon and put that card onto the battlefield. Then shuffle your library. -VIS U - -Lab Rats -{B} -Sorcery -Buyback {4} (You may pay an additional {4} as you cast this spell. If you do, put this card into your hand as it resolves.) -Put a 1/1 black Rat creature token onto the battlefield. -STH C - -Labyrinth Minotaur -{3}{U} -Creature - Minotaur -1/4 -Whenever Labyrinth Minotaur blocks a creature, that creature doesn't untap during its controller's next untap step. -HML C (x2), 5ED C, ME3 C - -Laccolith Grunt -{2}{R} -Creature - Beast -2/2 -Whenever Laccolith Grunt becomes blocked, you may have it deal damage equal to its power to target creature. If you do, Laccolith Grunt assigns no combat damage this turn. -NEM C - -Laccolith Rig -{R} -Enchantment - Aura -Enchant creature -Whenever enchanted creature becomes blocked, you may have it deal damage equal to its power to target creature. If you do, the first creature assigns no combat damage this turn. -NEM C - -Laccolith Titan -{5}{R}{R} -Creature - Beast -6/6 -Whenever Laccolith Titan becomes blocked, you may have it deal damage equal to its power to target creature. If you do, Laccolith Titan assigns no combat damage this turn. -NEM R - -Laccolith Warrior -{2}{R}{R} -Creature - Beast Warrior -3/3 -Whenever Laccolith Warrior becomes blocked, you may have it deal damage equal to its power to target creature. If you do, Laccolith Warrior assigns no combat damage this turn. -NEM U - -Laccolith Whelp -{R} -Creature - Beast -1/1 -Whenever Laccolith Whelp becomes blocked, you may have it deal damage equal to its power to target creature. If you do, Laccolith Whelp assigns no combat damage this turn. -NEM C - -Lace with Moonglove -{2}{G} -Instant -Target creature gains deathtouch until end of turn. (Any amount of damage it deals to a creature is enough to destroy that creature.) -Draw a card. -LRW C - -Lady Caleria -{3}{G}{G}{W}{W} -Legendary Creature - Human Archer -3/6 -{T}: Lady Caleria deals 3 damage to target attacking or blocking creature. -LEG R, ME3 U - -Lady Evangela -{W}{U}{B} -Legendary Creature - Human Cleric -1/2 -{W}{B}, {T}: Prevent all combat damage that would be dealt by target creature this turn. -LEG R, ME3 U - -Lady Orca -{5}{B}{R} -Legendary Creature - Demon -7/4 -LEG U, ME3 C - -Lady Sun -{1}{U}{U} -Legendary Creature - Human Advisor -1/1 -{T}: Return Lady Sun and another target creature to their owners' hands. Activate this ability only during your turn, before attackers are declared. -PTK R - -Lady Zhurong, Warrior Queen -{4}{G} -Legendary Creature - Human Soldier Warrior -4/3 -Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -PTK R - -Lagac Lizard -{3}{R} -Creature - Lizard -3/3 -ROE C - -Lairwatch Giant -{5}{W} -Creature - Giant Warrior -5/3 -Lairwatch Giant can block an additional creature. -Whenever Lairwatch Giant blocks two or more creatures, it gains first strike until end of turn. -LRW C - -Lake of the Dead -Land -If Lake of the Dead would enter the battlefield, sacrifice a Swamp instead. If you do, put Lake of the Dead onto the battlefield. If you don't, put it into its owner's graveyard. -{T}: Add {B} to your mana pool. -{T}, Sacrifice a Swamp: Add {B}{B}{B}{B} to your mana pool. -ALL R, MED R - -Lammastide Weave -{1}{G} -Instant -Name a card, then target player puts the top card of his or her library into his or her graveyard. If that card is the named card, you gain life equal to its converted mana cost. -Draw a card. -LRW U - -Lance -{W} -Enchantment - Aura -Enchant creature -Enchanted creature has first strike. -LEA U, LEB U, 2ED U, 3ED U - -Lancers en-Kor -{3}{W}{W} -Creature - Kor Soldier -3/3 -Trample -{0}: The next 1 damage that would be dealt to Lancers en-Kor this turn is dealt to target creature you control instead. -STH U - -Land Cap -Land -Land Cap doesn't untap during your untap step if it has a depletion counter on it. -At the beginning of your upkeep, remove a depletion counter from Land Cap. -{T}: Add {W} or {U} to your mana pool. Put a depletion counter on Land Cap. -ICE R - -Land Equilibrium -{2}{U}{U} -Enchantment -If an opponent who controls at least as many lands as you do would put a land onto the battlefield, that player instead puts that land onto the battlefield then sacrifices a land. -LEG R, ME3 R - -Land Grant -{1}{G} -Sorcery -If you have no land cards in hand, you may reveal your hand rather than pay Land Grant's mana cost. -Search your library for a Forest card, reveal that card, and put it into your hand. Then shuffle your library. -MMQ C - -Land Leeches -{1}{G}{G} -Creature - Leech -2/2 -First strike -DRK C, 4ED C - -Land Tax -{W} -Enchantment -At the beginning of your upkeep, if an opponent controls more lands than you, you may search your library for up to three basic land cards, reveal them, and put them into your hand. If you do, shuffle your library. -LEG U, 4ED R, BRB U, ME3 R - -Land's Edge -{1}{R}{R} -World Enchantment -Discard a card: If the discarded card is a land card, Land's Edge deals 2 damage to target player. Any player may activate this ability. -LEG R, CHR R - -Landbind Ritual -{3}{W}{W} -Sorcery -You gain 2 life for each Plains you control. -ZEN U - -Landslide -{R} -Sorcery -Sacrifice any number of Mountains. Landslide deals that much damage to target player. -UDS U - -Lantern Kami -{W} -Creature - Spirit -1/1 -Flying -CHK C - -Lantern of Insight -{1} -Artifact -Each player plays with the top card of his or her library revealed. -{T}, Sacrifice Lantern of Insight: Target player shuffles his or her library. -5DN U - -Lantern-Lit Graveyard -Land -{T}: Add {1} to your mana pool. -{T}: Add {B} or {R} to your mana pool. Lantern-Lit Graveyard doesn't untap during your next untap step. -CHK U - -Lapis Lazuli Talisman -{2} -Artifact -Whenever a player casts a blue spell, you may pay {3}. If you do, untap target permanent. -ICE U - -Lapse of Certainty -{2}{W} -Instant -Counter target spell. If that spell is countered this way, put it on top of its owner's library instead of into that player's graveyard. -CON C - -Laquatus's Champion -{4}{B}{B} -Creature - Nightmare Horror -6/3 -When Laquatus's Champion enters the battlefield, target player loses 6 life. -When Laquatus's Champion leaves the battlefield, that player gains 6 life. -{B}: Regenerate Laquatus's Champion. -PRO R, TOR R - -Laquatus's Creativity -{4}{U} -Sorcery -Target player draws cards equal to the number of cards in his or her hand, then discards that many cards. -ODY U - -Laquatus's Disdain -{1}{U} -Instant -Counter target spell cast from a graveyard. -Draw a card. -JUD U - -Larceny -{3}{B}{B} -Enchantment -Whenever a creature you control deals combat damage to a player, that player discards a card. -MMQ U, 8ED R - -Lash Out -{1}{R} -Instant -Lash Out deals 3 damage to target creature. Clash with an opponent. If you win, Lash Out deals 3 damage to that creature's controller. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -LRW C, COM C - -Lashknife -{1}{W} -Enchantment - Aura -If you control a Plains, you may tap an untapped creature you control rather than pay Lashknife's mana cost. -Enchant creature -Enchanted creature has first strike. -NEM C - -Lashknife Barrier -{2}{W} -Enchantment -When Lashknife Barrier enters the battlefield, draw a card. -If a source would deal damage to a creature you control, it deals that much damage minus 1 to that creature instead. -PLS U - -Lashwrithe -{4} -Artifact - Equipment -Living weapon (When this Equipment enters the battlefield, put a 0/0 black Germ creature token onto the battlefield, then attach this to it.) -Equipped creature gets +1/+1 for each Swamp you control. -Equip {B/P}{B/P} ({B/P} can be paid with either {B} or 2 life.) -NPH R - -Last Breath -{1}{W} -Instant -Exile target creature with power 2 or less. Its controller gains 4 life. -MMQ U, SHM C - -Last Caress -{2}{B} -Sorcery -Target player loses 1 life and you gain 1 life. -Draw a card. -APC C - -Last Chance -{R}{R} -Sorcery -Take an extra turn after this one. At the beginning of that turn's end step, you lose the game. -POR R, S99 R, ME4 R - -Last Gasp -{1}{B} -Instant -Target creature gets -3/-3 until end of turn. -RAV C - -Last Kiss -{2}{B} -Instant -Last Kiss deals 2 damage to target creature and you gain 2 life. -ROE C - -Last Laugh -{2}{B}{B} -Enchantment -Whenever a permanent other than Last Laugh is put into a graveyard from the battlefield, Last Laugh deals 1 damage to each creature and each player. -When no creatures are on the battlefield, sacrifice Last Laugh. -TOR R - -Last Rites -{2}{B} -Sorcery -Discard any number of cards. Target player reveals his or her hand, then you choose a nonland card from it for each card discarded this way. That player discards those cards. -ODY C - -Last Stand -{W}{U}{B}{R}{G} -Sorcery -Target opponent loses 2 life for each Swamp you control. Last Stand deals damage equal to the number of Mountains you control to target creature. Put a 1/1 green Saproling creature token onto the battlefield for each Forest you control. You gain 2 life for each Plains you control. Draw a card for each Island you control, then discard that many cards. -APC R - -Last Word -{2}{U}{U} -Instant -Last Word can't be countered by spells or abilities. -Counter target spell. -DST R - -Last-Ditch Effort -{R} -Instant -Sacrifice any number of creatures. Last-Ditch Effort deals that much damage to target creature or player. -ULG U - -Lat-Nam's Legacy -{1}{U} -Instant -Shuffle a card from your hand into your library. If you do, draw two cards at the beginning of the next turn's upkeep. -ALL C (x2), ME2 C - -Latchkey Faerie -{3}{U} -Creature - Faerie Rogue -3/1 -Flying -Prowl {2}{U} (You may cast this for its prowl cost if you dealt combat damage to a player this turn with a Faerie or Rogue.) -When Latchkey Faerie enters the battlefield, if its prowl cost was paid, draw a card. -MOR C - -Latulla's Orders -{1}{R} -Enchantment - Aura -Flash -Enchant creature -Whenever enchanted creature deals combat damage to defending player, you may destroy target artifact that player controls. -PCY C - -Latulla, Keldon Overseer -{3}{R}{R} -Legendary Creature - Human Spellshaper -3/3 -{X}{R}, {T}, Discard two cards: Latulla, Keldon Overseer deals X damage to target creature or player. -PCY R - -Launch -{1}{U} -Enchantment - Aura -Enchant creature -Enchanted creature has flying. -When Launch is put into a graveyard from the battlefield, return Launch to its owner's hand. -USG C - -Lava Axe -{4}{R} -Sorcery -Lava Axe deals 5 damage to target player. -POR C, P02 C, ULG C, S99 C, S00 C, BTD C, 7ED C, 8ED C, 9ED C, 10E C, M10 C, M11 C, M12 C - -Lava Blister -{1}{R} -Sorcery -Destroy target nonbasic land unless its controller has Lava Blister deal 6 damage to him or her. -ODY U - -Lava Burst -{X}{R} -Sorcery -Lava Burst deals X damage to target creature or player. If Lava Burst would deal damage to a creature, that damage can't be prevented or dealt instead to another creature or player. -ICE C, ME2 U - -Lava Dart -{R} -Instant -Lava Dart deals 1 damage to target creature or player. -Flashback-Sacrifice a Mountain. (You may cast this card from your graveyard for its flashback cost. Then exile it.) -JUD C - -Lava Flow -{3}{R}{R} -Sorcery -Destroy target creature or land. -POR U, ME4 C - -Lava Hounds -{2}{R}{R} -Creature - Hound -4/4 -Haste -When Lava Hounds enters the battlefield, it deals 4 damage to you. -WTH U, 8ED R - -Lava Runner -{1}{R}{R} -Creature - Lizard -2/2 -Haste -Whenever Lava Runner becomes the target of a spell or ability, that spell or ability's controller sacrifices a land. -MMQ R - -Lava Spike -{R} -Sorcery - Arcane -Lava Spike deals 3 damage to target player. -CHK C - -Lava Storm -{3}{R}{R} -Instant -Lava Storm deals 2 damage to each attacking creature or Lava Storm deals 2 damage to each blocking creature. -WTH C - -Lava Tubes -Land -Lava Tubes doesn't untap during your untap step if it has a depletion counter on it. -At the beginning of your upkeep, remove a depletion counter from Lava Tubes. -{T}: Add {B} or {R} to your mana pool. Put a depletion counter on Lava Tubes. -ICE R - -Lava Zombie -{1}{B}{R} -Creature - Zombie -4/3 -When Lava Zombie enters the battlefield, return a black or red creature you control to its owner's hand. -{2}: Lava Zombie gets +1/+0 until end of turn. -PLS C - -Lavaball Trap -{6}{R}{R} -Instant - Trap -If an opponent had two or more lands enter the battlefield under his or her control this turn, you may pay {3}{R}{R} rather than pay Lavaball Trap's mana cost. -Destroy two target lands. Lavaball Trap deals 4 damage to each creature. -ZEN R - -Lavaborn Muse -{3}{R} -Creature - Spirit -3/3 -At the beginning of each opponent's upkeep, if that player has two or fewer cards in hand, Lavaborn Muse deals 3 damage to him or her. -LGN R, 10E R - -Lavaclaw Reaches -Land -Lavaclaw Reaches enters the battlefield tapped. -{T}: Add {B} or {R} to your mana pool. -{1}{B}{R}: Until end of turn, Lavaclaw Reaches becomes a 2/2 black and red Elemental creature with "{X}: This creature gets +X/+0 until end of turn." It's still a land. -WWK R - -Lavacore Elemental -{2}{R} -Creature - Elemental -5/3 -Vanishing 1 (This permanent enters the battlefield with a time counter on it. At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.) -Whenever a creature you control deals combat damage to a player, put a time counter on Lavacore Elemental. -PLC U - -Lavafume Invoker -{2}{R} -Creature - Goblin Shaman -2/2 -{8}: Creatures you control get +3/+0 until end of turn. -ROE C - -Lavalanche -{X}{B}{R}{G} -Sorcery -Lavalanche deals X damage to target player and each creature he or she controls. -ARB R - -Lavamancer's Skill -{1}{R} -Enchantment - Aura -Enchant creature -Enchanted creature has "{T}: This creature deals 1 damage to target creature." -As long as enchanted creature is a Wizard, it has "{T}: This creature deals 2 damage to target creature." -ONS C - -Lawbringer -{2}{W} -Creature - Kor Rebel -2/2 -{T}, Sacrifice Lawbringer: Exile target red creature. -NEM C - -Lay Bare -{2}{U}{U} -Instant -Counter target spell. Look at its controller's hand. -ROE C - -Lay Waste -{3}{R} -Sorcery -Destroy target land. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG C, ONS C - -Lay of the Land -{G} -Sorcery -Search your library for a basic land card, reveal that card, and put it into your hand. Then shuffle your library. -APC C - -Lead Astray -{1}{W} -Instant -Tap up to two target creatures. -JUD C - -Lead Golem -{5} -Artifact Creature - Golem -3/5 -Whenever Lead Golem attacks, it doesn't untap during its controller's next untap step. -MIR U, 6ED U - -Lead the Stampede -{2}{G} -Sorcery -Look at the top five cards of your library. You may reveal any number of creature cards from among them and put the revealed cards into your hand. Put the rest on the bottom of your library in any order. -MBS U - -Lead-Belly Chimera -{4} -Artifact Creature - Chimera -2/2 -Trample -Sacrifice Lead-Belly Chimera: Put a +2/+2 counter on target Chimera creature. It gains trample. (This effect lasts indefinitely.) -VIS U - -Leaden Fists -{2}{U} -Enchantment - Aura -Flash (You may cast this spell any time you could cast an instant.) -Enchant creature -Enchanted creature gets +3/+3 and doesn't untap during its controller's untap step. -FUT C - -Leaden Myr -{2} -Artifact Creature - Myr -1/1 -{T}: Add {B} to your mana pool. -MRD C, HOP C, SOM C - -Leaf Arrow -{G} -Instant -Leaf Arrow deals 3 damage to target creature with flying. -ROE C - -Leaf Dancer -{1}{G}{G} -Creature - Centaur -2/2 -Forestwalk -ODY C - -Leaf Gilder -{1}{G} -Creature - Elf Druid -2/1 -{T}: Add {G} to your mana pool. -LRW C, ARC C - -Leaf-Crowned Elder -{2}{G}{G} -Creature - Treefolk Shaman -3/5 -Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Leaf-Crowned Elder, you may reveal it. If you do, you may play that card without paying its mana cost. -MOR R - -Leafdrake Roost -{3}{G}{U} -Enchantment - Aura -Enchant land -Enchanted land has "{G}{U}, {T}: Put a 2/2 green and blue Drake creature token with flying onto the battlefield." -DIS U - -Leap -{U} -Instant -Target creature gains flying until end of turn. -Draw a card. -STH C - -Leap of Flame -{U}{R} -Instant -Replicate {U}{R} (When you cast this spell, copy it for each time you paid its replicate cost. You may choose new targets for the copies.) -Target creature gets +1/+0 and gains flying and first strike until end of turn. -GPT C - -Leaping Lizard -{1}{G}{G} -Creature - Lizard -2/3 -{1}{G}: Leaping Lizard gets -0/-1 and gains flying until end of turn. -HML C, ME2 C - -Leashling -{6} -Artifact Creature - Hound -3/3 -Put a card in your hand on top of your library: Return Leashling to its owner's hand. -RAV U - -Leatherback Baloth -{G}{G}{G} -Creature - Beast -4/5 -WWK U - -Leave No Trace -{1}{W} -Instant -Radiance - Destroy target enchantment and each other enchantment that shares a color with it. -RAV C - -Leech Bonder -{2}{U} -Creature - Merfolk Soldier -3/3 -Leech Bonder enters the battlefield with two -1/-1 counters on it. -{U}, {Q}: Move a counter from target creature onto another target creature. ({Q} is the untap symbol.) -SHM U - -Leeches -{1}{W}{W} -Sorcery -Target player loses all poison counters. Leeches deals that much damage to that player. -HML R, ME4 R - -Leeching Bite -{1}{G} -Instant -Target creature gets +1/+1 until end of turn. Another target creature gets -1/-1 until end of turn. -NPH C - -Leeching Licid -{1}{B} -Creature - Licid -1/1 -{B}, {T}: Leeching Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {B} to end this effect. -At the beginning of the upkeep of enchanted creature's controller, Leeching Licid deals 1 damage to that player. -TMP U - -Leechridden Swamp -Land - Swamp -({T}: Add {B} to your mana pool.) -Leechridden Swamp enters the battlefield tapped. -{B}, {T}: Each opponent loses 1 life. Activate this ability only if you control two or more black permanents. -SHM U, HOP U - -Leering Emblem -{2} -Artifact - Equipment -Whenever you cast a spell, equipped creature gets +2/+2 until end of turn. -Equip {2} -EVE R - -Leering Gargoyle -{1}{W}{U} -Creature - Gargoyle -2/2 -Flying -{T}: Leering Gargoyle gets -2/+2 and loses flying until end of turn. -MIR R - -Leery Fogbeast -{2}{G} -Creature - Beast -4/2 -Whenever Leery Fogbeast becomes blocked, prevent all combat damage that would be dealt this turn. -ONS C - -Legacy Weapon -{7} -Legendary Artifact -{W}{U}{B}{R}{G}: Exile target permanent. -If Legacy Weapon would be put into a graveyard from anywhere, reveal Legacy Weapon and shuffle it into its owner's library instead. -APC R, 10E R - -Legacy's Allure -{U}{U} -Enchantment -At the beginning of your upkeep, you may put a treasure counter on Legacy's Allure. -Sacrifice Legacy's Allure: Gain control of target creature with power less than or equal to the number of treasure counters on Legacy's Allure. (This effect lasts indefinitely.) -TMP U - -Legerdemain -{2}{U}{U} -Sorcery -Exchange control of target artifact or creature and another target permanent that shares one of those types with it. (This effect lasts indefinitely.) -TMP U - -Legions of Lim-Dul -{1}{B}{B} -Creature - Zombie -2/3 -Snow swampwalk -ICE C - -Leonin Abunas -{3}{W} -Creature - Cat Cleric -2/5 -Artifacts you control have hexproof. (They can't be the targets of spells or abilities your opponents control.) -MRD R, ARC R - -Leonin Arbiter -{1}{W} -Creature - Cat Cleric -2/2 -Players can't search libraries. Any player may pay {2} for that player to ignore this effect until end of turn. -SOM R - -Leonin Armorguard -{2}{G}{W} -Creature - Cat Soldier -3/3 -When Leonin Armorguard enters the battlefield, creatures you control get +1/+1 until end of turn. -ARB C - -Leonin Battlemage -{3}{W} -Creature - Cat Wizard -2/3 -{T}: Target creature gets +1/+1 until end of turn. -Whenever you cast a spell, you may untap Leonin Battlemage. -DST U - -Leonin Bladetrap -{3} -Artifact -Flash -{2}, Sacrifice Leonin Bladetrap: Leonin Bladetrap deals 2 damage to each attacking creature without flying. -MRD U - -Leonin Bola -{1} -Artifact - Equipment -Equipped creature has "{T}, Unattach Leonin Bola: Tap target creature." -Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.) -DST C - -Leonin Den-Guard -{1}{W} -Creature - Cat Soldier -1/3 -As long as Leonin Den-Guard is equipped, it gets +1/+1 and has vigilance. -MRD C - -Leonin Elder -{W} -Creature - Cat Cleric -1/1 -Whenever an artifact enters the battlefield, you may gain 1 life. -MRD C - -Leonin Relic-Warder -{W}{W} -Creature - Cat Cleric -2/2 -When Leonin Relic-Warder enters the battlefield, you may exile target artifact or enchantment. -When Leonin Relic-Warder leaves the battlefield, return the exiled card to the battlefield under its owner's control. -MBS U - -Leonin Scimitar -{1} -Artifact - Equipment -Equipped creature gets +1/+1. -Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) -MRD C, 10E U - -Leonin Shikari -{1}{W} -Creature - Cat Soldier -2/2 -You may activate equip abilities any time you could cast an instant. -DST R - -Leonin Skyhunter -{W}{W} -Creature - Cat Knight -2/2 -Flying -MRD U, 9ED U, MBS C, DDG U - -Leonin Squire -{1}{W} -Creature - Cat Soldier -2/2 -When Leonin Squire enters the battlefield, return target artifact card with converted mana cost 1 or less from your graveyard to your hand. -5DN C - -Leonin Sun Standard -{2} -Artifact -{1}{W}: Creatures you control get +1/+1 until end of turn. -MRD R - -Leshrac's Rite -{B} -Enchantment - Aura -Enchant creature -Enchanted creature has swampwalk. -ICE U, 5ED U, 6ED U, 7ED U - -Leshrac's Sigil -{B}{B} -Enchantment -Whenever an opponent casts a green spell, you may pay {B}{B}. If you do, look at that player's hand and choose a card from it. The player discards that card. -{B}{B}: Return Leshrac's Sigil to its owner's hand. -ICE U - -Lesser Gargadon -{2}{R}{R} -Creature - Beast -6/4 -Whenever Lesser Gargadon attacks or blocks, sacrifice a land. -PCY U, 8ED U - -Lesser Werewolf -{3}{B} -Creature - Human Wolf -2/4 -{B}: If Lesser Werewolf's power is 1 or more, it gets -1/-0 until end of turn and put a -0/-1 counter on target creature blocking or blocked by Lesser Werewolf. Activate this ability only during the declare blockers step. -LEG U, ME3 C - -Lethal Vapors -{2}{B}{B} -Enchantment -Whenever a creature enters the battlefield, destroy it. -{0}: Destroy Lethal Vapors. You skip your next turn. Any player may activate this ability. -SCG R - -Lethargy Trap -{3}{U} -Instant - Trap -If three or more creatures are attacking, you may pay {U} rather than pay Lethargy Trap's mana cost. -Attacking creatures get -3/-0 until end of turn. -ZEN C - -Lethe Lake -Plane - Arkhos -At the beginning of your upkeep, put the top ten cards of your library into your graveyard. -Whenever you roll {C}, target player puts the top ten cards of his or her library into his or her graveyard. -HOP C - -Leveler -{5} -Artifact Creature - Juggernaut -10/10 -When Leveler enters the battlefield, exile all cards from your library. -MRD R - -Leviathan -{5}{U}{U}{U}{U} -Creature - Leviathan -10/10 -Trample -Leviathan enters the battlefield tapped and doesn't untap during your untap step. -At the beginning of your upkeep, you may sacrifice two Islands. If you do, untap Leviathan. -Leviathan can't attack unless you sacrifice two Islands. -DRK R, 4ED R, 5ED R, BTD R, TSB S - -Levitation -{2}{U}{U} -Enchantment -Creatures you control have flying. -ULG U, 7ED U, 9ED U, M10 U, M12 U - -Ley Druid -{2}{G} -Creature - Human Druid -1/1 -{T}: Untap target land. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED C, 9ED U - -Ley Line -{3}{G} -Enchantment -At the beginning of each player's upkeep, that player may put a +1/+1 counter on target creature of his or her choice. -MMQ U - -Leyline of Anticipation -{2}{U}{U} -Enchantment -If Leyline of Anticipation is in your opening hand, you may begin the game with it on the battlefield. -You may cast nonland cards as though they had flash. (You may cast them any time you could cast an instant.) -M11 R - -Leyline of Lifeforce -{2}{G}{G} -Enchantment -If Leyline of Lifeforce is in your opening hand, you may begin the game with it on the battlefield. -Creature spells can't be countered. -GPT R - -Leyline of Lightning -{2}{R}{R} -Enchantment -If Leyline of Lightning is in your opening hand, you may begin the game with it on the battlefield. -Whenever you cast a spell, you may pay {1}. If you do, Leyline of Lightning deals 1 damage to target player. -GPT R - -Leyline of Punishment -{2}{R}{R} -Enchantment -If Leyline of Punishment is in your opening hand, you may begin the game with it on the battlefield. -Players can't gain life. -Damage can't be prevented. -M11 R - -Leyline of Sanctity -{2}{W}{W} -Enchantment -If Leyline of Sanctity is in your opening hand, you may begin the game with it on the battlefield. -You have hexproof. (You can't be the target of spells or abilities your opponents control.) -M11 R - -Leyline of Singularity -{2}{U}{U} -Enchantment -If Leyline of Singularity is in your opening hand, you may begin the game with it on the battlefield. -All nonland permanents are legendary. -GPT R - -Leyline of Vitality -{2}{G}{G} -Enchantment -If Leyline of Vitality is in your opening hand, you may begin the game with it on the battlefield. -Creatures you control get +0/+1. -Whenever a creature enters the battlefield under your control, you may gain 1 life. -M11 R - -Leyline of the Meek -{2}{W}{W} -Enchantment -If Leyline of the Meek is in your opening hand, you may begin the game with it on the battlefield. -Creature tokens get +1/+1. -GPT R - -Leyline of the Void -{2}{B}{B} -Enchantment -If Leyline of the Void is in your opening hand, you may begin the game with it on the battlefield. -If a card would be put into an opponent's graveyard from anywhere, exile it instead. -GPT R, M11 R - -Lhurgoyf -{2}{G}{G} -Creature - Lhurgoyf -*/1+* -Lhurgoyf's power is equal to the number of creature cards in all graveyards and its toughness is equal to that number plus 1. -ICE R, 5ED R, BRB R, 8ED R, COM R - -Liability -{1}{B}{B} -Enchantment -Whenever a nontoken permanent is put into a player's graveyard from the battlefield, that player loses 1 life. -MMQ R - -Liar's Pendulum -{1} -Artifact -{2}, {T}: Name a card. Target opponent guesses whether a card with that name is in your hand. You may reveal your hand. If you do and your opponent guessed wrong, draw a card. -MRD R - -Liberate -{1}{W} -Instant -Exile target creature you control. Return that card to the battlefield under its owner's control at the beginning of the next end step. -INV U - -Liberated Dwarf -{R} -Creature - Dwarf -1/1 -{R}, Sacrifice Liberated Dwarf: Target green creature gets +1/+0 and gains first strike until end of turn. -JUD C - -Library of Alexandria -Land -{T}: Add {1} to your mana pool. -{T}: Draw a card. Activate this ability only if you have exactly seven cards in hand. -ARN U, ME4 R - -Library of Lat-Nam -{4}{U} -Sorcery -An opponent chooses one - You draw three cards at the beginning of the next turn's upkeep; or you search your library for a card, put that card into your hand, then shuffle your library. -ALL R, 6ED R - -Library of Leng -{1} -Artifact -You have no maximum hand size. -If an effect causes you to discard a card, discard it, but you may put it on top of your library instead of into your graveyard. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, ME4 C - -Lich -{B}{B}{B}{B} -Enchantment -As Lich enters the battlefield, you lose life equal to your life total. -You don't lose the game for having 0 or less life. -If you would gain life, draw that many cards instead. -Whenever you're dealt damage, sacrifice that many nontoken permanents. If you can't, you lose the game. -When Lich is put into a graveyard from the battlefield, you lose the game. -LEA R, LEB R, 2ED R, ME4 R - -Lich Lord of Unx -{1}{U}{B} -Creature - Zombie Wizard -2/2 -{U}{B}, {T}: Put a 1/1 blue and black Zombie Wizard creature token onto the battlefield. -{U}{U}{B}{B}: Target player loses X life and puts the top X cards of his or her library into his or her graveyard, where X is the number of Zombies you control. -ARB R - -Lich's Mirror -{5} -Artifact -If you would lose the game, instead shuffle your hand, your graveyard, and all permanents you own into your library, then draw seven cards and your life total becomes 20. -ALA M - -Lich's Tomb -{4} -Artifact -You don't lose the game for having 0 or less life. -Whenever you lose life, sacrifice a permanent for each 1 life you lost. (Damage causes loss of life.) -DST R - -Lichenthrope -{3}{G}{G} -Creature - Plant Fungus -5/5 -If damage would be dealt to Lichenthrope, put that many -1/-1 counters on it instead. -At the beginning of your upkeep, remove a -1/-1 counter from Lichenthrope. -VIS R - -Liege of the Axe -{3}{W} -Creature - Human Soldier -2/3 -Vigilance -Morph {1}{W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Liege of the Axe is turned face up, untap it. -LGN U - -Liege of the Hollows -{2}{G}{G} -Creature - Spirit -3/4 -When Liege of the Hollows dies, each player may pay any amount of mana. Then each player who paid mana this way puts that many 1/1 green Squirrel creature tokens onto the battlefield. -WTH R - -Liege of the Pit -{5}{B}{B}{B} -Creature - Demon -7/7 -Flying, trample -At the beginning of your upkeep, sacrifice a creature other than Liege of the Pit. If you can't, Liege of the Pit deals 7 damage to you. -Morph {B}{B}{B}{B} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -TSP R - -Liege of the Tangle -{6}{G}{G} -Creature - Elemental -8/8 -Trample -Whenever Liege of the Tangle deals combat damage to a player, you may choose any number of target lands you control and put an awakening counter on each of them. Each of those lands is an 8/8 green Elemental creature for as long as it has an awakening counter on it. They're still lands. -SOM M - -Lieutenant Kirtar -{1}{W}{W} -Legendary Creature - Bird Soldier -2/2 -Flying -{1}{W}, Sacrifice Lieutenant Kirtar: Exile target attacking creature. -ODY R - -Life -{G} -Sorcery -All lands you control become 1/1 creatures until end of turn. They're still lands. ----- -Death -{1}{B} -Sorcery -Return target creature card from your graveyard to the battlefield. You lose life equal to its converted mana cost. -APC U (x2) - -Life Burst -{1}{W} -Instant -Target player gains 4 life, then gains 4 life for each card named Life Burst in each graveyard. -ODY C - -Life Chisel -{4} -Artifact -Sacrifice a creature: You gain life equal to the sacrificed creature's toughness. Activate this ability only during your upkeep. -LEG U, ME3 R - -Life Matrix -{4} -Artifact -{4}, {T}: Put a matrix counter on target creature and that creature gains "Remove a matrix counter from this creature: Regenerate this creature." Activate this ability only during your upkeep. -LEG R - -Life and Limb -{3}{G} -Enchantment -All Forests and all Saprolings are 1/1 green Saproling creatures and Forest lands in addition to their other types. -PLC R - -Life from the Loam -{1}{G} -Sorcery -Return up to three target land cards from your graveyard to your hand. -Dredge 3 (If you would draw a card, instead you may put exactly three cards from the top of your library into your graveyard. If you do, return this card from your graveyard to your hand. Otherwise, draw a card.) -RAV R - -Life's Finale -{4}{B}{B} -Sorcery -Destroy all creatures, then search target opponent's library for up to three creature cards and put them into his or her graveyard. Then that player shuffles his or her library. -NPH R - -Lifeblood -{2}{W}{W} -Enchantment -Whenever a Mountain an opponent controls becomes tapped, you gain 1 life. -LEG R - -Lifeforce -{G}{G} -Enchantment -{G}{G}: Counter target black spell. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, ME4 R - -Lifegift -{2}{G} -Enchantment -Whenever a land enters the battlefield, you may gain 1 life. -BOK R - -Lifelace -{G} -Instant -Target spell or permanent becomes green. (Mana symbols on that permanent remain unchanged.) -LEA R, LEB R, 2ED R, 3ED R, 4ED R - -Lifeline -{5} -Artifact -Whenever a creature dies, if another creature is on the battlefield, return the first card to the battlefield under its owner's control at the beginning of the next end step. -USG R - -Lifelink -{W} -Enchantment - Aura -Enchant creature -Enchanted creature has lifelink. (Damage dealt by the creature also causes its controller to gain that much life.) -M10 C, M12 C - -Lifesmith -{1}{G} -Creature - Human Artificer -2/1 -Whenever you cast an artifact spell, you may pay {1}. If you do, you gain 3 life. -SOM U - -Lifespark Spellbomb -{1} -Artifact -{G}, Sacrifice Lifespark Spellbomb: Until end of turn, target land becomes a 3/3 creature that's still a land. -{1}, Sacrifice Lifespark Spellbomb: Draw a card. -MRD C - -Lifespinner -{3}{G} -Creature - Spirit -3/3 -{T}, Sacrifice three Spirits: Search your library for a legendary Spirit permanent card and put it onto the battlefield. Then shuffle your library. -BOK U - -Lifetap -{U}{U} -Enchantment -Whenever a Forest an opponent controls becomes tapped, you gain 1 life. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U - -Lifted by Clouds -{2}{U} -Instant - Arcane -Target creature gains flying until end of turn. -Splice onto Arcane {1}{U} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -CHK C - -Light from Within -{2}{W}{W} -Enchantment -Chroma - Each creature you control gets +1/+1 for each white mana symbol in its mana cost. -EVE R - -Light of Day -{3}{W} -Enchantment -Black creatures can't attack or block. -TMP U, 6ED U - -Light of Sanction -{1}{W}{W} -Enchantment -Prevent all damage that would be dealt to creatures you control by sources you control. -RAV R - -Lightbringer -{2}{W} -Creature - Kor Rebel -2/2 -{T}, Sacrifice Lightbringer: Exile target black creature. -NEM C - -Lighthouse Chronologist -{1}{U} -Creature - Human Wizard -1/3 -Level up {U} ({U}: Put a level counter on this. Level up only as a sorcery.) -LEVEL 4-6 -2/4 -LEVEL 7+ -3/5 -At the beginning of each end step, if it's not your turn, take an extra turn after this one. -ROE M - -Lightkeeper of Emeria -{3}{W} -Creature - Angel -2/4 -Multikicker {W} (You may pay an additional {W} any number of times as you cast this spell.) -Flying -When Lightkeeper of Emeria enters the battlefield, you gain 2 life for each time it was kicked. -WWK U, COM U - -Lightmine Field -{2}{W}{W} -Enchantment -Whenever one or more creatures attack, Lightmine Field deals damage to each of those creatures equal to the number of attacking creatures. -ROE R - -Lightning Angel -{1}{R}{W}{U} -Creature - Angel -3/4 -Flying, vigilance, haste -APC R, TSB S - -Lightning Axe -{R} -Instant -As an additional cost to cast Lightning Axe, discard a card or pay {5}. -Lightning Axe deals 5 damage to target creature. -TSP C - -Lightning Blast -{3}{R} -Instant -Lightning Blast deals 4 damage to target creature or player. -TMP C, 6ED C, 7ED C, 8ED U - -Lightning Blow -{1}{W} -Instant -Target creature gains first strike until end of turn. -Draw a card at the beginning of the next turn's upkeep. -ICE R, ME3 C - -Lightning Bolt -{R} -Instant -Lightning Bolt deals 3 damage to target creature or player. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, BTD C, MED C, M10 C, M11 C, H10 C - -Lightning Cloud -{3}{R} -Enchantment -Whenever a player casts a red spell, you may pay {R}. If you do, Lightning Cloud deals 1 damage to target creature or player. -VIS R - -Lightning Coils -{3} -Artifact -Whenever a nontoken creature you control dies, put a charge counter on Lightning Coils. -At the beginning of your upkeep, if Lightning Coils has five or more charge counters on it, remove all of them from it and put that many 3/1 red Elemental creature tokens with haste onto the battlefield. Exile them at the beginning of the next end step. -MRD R - -Lightning Crafter -{3}{R} -Creature - Goblin Shaman -3/3 -Champion a Goblin or Shaman (When this enters the battlefield, sacrifice it unless you exile another Goblin or Shaman you control. When this leaves the battlefield, that card returns to the battlefield.) -{T}: Lightning Crafter deals 3 damage to target creature or player. -MOR R - -Lightning Dart -{1}{R} -Instant -Lightning Dart deals 1 damage to target creature. If that creature is white or blue, Lightning Dart deals 4 damage to it instead. -INV U - -Lightning Dragon -{2}{R}{R} -Creature - Dragon -4/4 -Flying -Echo {2}{R}{R} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -{R}: Lightning Dragon gets +1/+0 until end of turn. -PRO R, USG R - -Lightning Elemental -{3}{R} -Creature - Elemental -4/1 -Haste (This creature can attack and {T} as soon as it comes under your control.) -TMP C, BRB C, 7ED C, 8ED C, 9ED C, 10E C, M10 C, M12 C - -Lightning Greaves -{2} -Artifact - Equipment -Equipped creature has haste and shroud. (It can't be the target of spells or abilities.) -Equip {0} -MRD U, PVC U, ARC U, COM U - -Lightning Helix -{R}{W} -Instant -Lightning Helix deals 3 damage to target creature or player and you gain 3 life. -RAV U, HOP U - -Lightning Hounds -{2}{R}{R} -Creature - Hound -3/2 -First strike -MMQ C - -Lightning Reaver -{3}{B}{R} -Creature - Zombie Beast -3/3 -Haste; fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -Whenever Lightning Reaver deals combat damage to a player, put a charge counter on it. -At the beginning of your end step, Lightning Reaver deals damage equal to the number of charge counters on it to each opponent. -ARB R - -Lightning Reflexes -{1}{R} -Enchantment - Aura -You may cast Lightning Reflexes as though it had flash. If you cast it any time a sorcery couldn't have been cast, the controller of the permanent it becomes sacrifices it at the beginning of the next cleanup step. -Enchant creature -Enchanted creature gets +1/+0 and has first strike. -MIR C - -Lightning Rift -{1}{R} -Enchantment -Whenever a player cycles a card, you may pay {1}. If you do, Lightning Rift deals 2 damage to target creature or player. -ONS U - -Lightning Serpent -{X}{R} -Creature - Elemental Serpent -2/1 -Trample, haste -Lightning Serpent enters the battlefield with X +1/+0 counters on it. -At the beginning of the end step, sacrifice Lightning Serpent. -CSP R - -Lightning Storm -{1}{R}{R} -Instant -Lightning Storm deals X damage to target creature or player, where X is 3 plus the number of charge counters on it. -Discard a land card: Put two charge counters on Lightning Storm. You may choose a new target for it. Any player may activate this ability but only if Lightning Storm is on the stack. -CSP U - -Lightning Surge -{3}{R}{R} -Sorcery -Lightning Surge deals 4 damage to target creature or player. -Threshold - If seven or more cards are in your graveyard, instead Lightning Surge deals 6 damage to that creature or player and the damage can't be prevented. -Flashback {5}{R}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -JUD R - -Lightning Talons -{2}{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +3/+0 and has first strike. -ALA C - -Lightwielder Paladin -{3}{W}{W} -Creature - Human Knight -4/4 -First strike (This creature deals combat damage before creatures without first strike.) -Whenever Lightwielder Paladin deals combat damage to a player, you may exile target black or red permanent that player controls. -M10 R - -Lignify -{1}{G} -Tribal Enchantment - Treefolk Aura -Enchant creature -Enchanted creature is a 0/4 Treefolk with no abilities. -LRW C, GVL C - -Liliana Vess -{3}{B}{B} -Planeswalker - Liliana -5 -[+1] Target player discards a card. -[-2] Search your library for a card, then shuffle your library and put that card on top of it. -[-8] Put all creature cards from all graveyards onto the battlefield under your control. -LRW R, M10 M, GVL M, M11 M - -Liliana's Caress -{1}{B} -Enchantment -Whenever an opponent discards a card, that player loses 2 life. -M11 U - -Liliana's Specter -{1}{B}{B} -Creature - Specter -2/1 -Flying -When Liliana's Specter enters the battlefield, each opponent discards a card. -M11 C - -Lilting Refrain -{1}{U} -Enchantment -At the beginning of your upkeep, you may put a verse counter on Lilting Refrain. -Sacrifice Lilting Refrain: Counter target spell unless its controller pays {X}, where X is the number of verse counters on Lilting Refrain. -USG U - -Lim-Dul the Necromancer -{5}{B}{B} -Legendary Creature - Human Wizard -4/4 -Whenever a creature an opponent controls dies, you may pay {1}{B}. If you do, return that card to the battlefield under your control. If it's a creature, it's a Zombie in addition to its other creature types. -{1}{B}: Regenerate target Zombie. -TSP R - -Lim-Dul's Cohort -{1}{B}{B} -Creature - Zombie -2/3 -Whenever Lim-Dul's Cohort blocks or becomes blocked by a creature, that creature can't be regenerated this turn. -ICE C, ME4 C - -Lim-Dul's Hex -{1}{B} -Enchantment -At the beginning of your upkeep, for each player, Lim-Dul's Hex deals 1 damage to that player unless he or she pays {B} or {3}. -ICE U - -Lim-Dul's High Guard -{1}{B}{B} -Creature - Skeleton -2/1 -First strike -{1}{B}: Regenerate Lim-Dul's High Guard. -ALL C (x2), ME2 U - -Lim-Dul's Paladin -{2}{B}{R} -Creature - Human Knight -0/3 -Trample -At the beginning of your upkeep, you may discard a card. If you don't, sacrifice Lim-Dul's Paladin and draw a card. -Whenever Lim-Dul's Paladin becomes blocked, it gets +6/+3 until end of turn. -Whenever Lim-Dul's Paladin attacks and isn't blocked, it assigns no combat damage to defending player this turn and that player loses 4 life. -ALL U - -Lim-Dul's Vault -{U}{B} -Instant -Look at the top five cards of your library. As many times as you choose, you may pay 1 life, put those cards on the bottom of your library, then look at the top five cards of your library. Then shuffle your library and put the last cards you looked at this way on top of it in any order. -ALL U, MED U - -Limestone Golem -{6} -Artifact Creature - Golem -3/4 -{2}, Sacrifice Limestone Golem: Target player draws a card. -ODY U - -Limited Resources -{W} -Enchantment -When Limited Resources enters the battlefield, each player chooses five lands he or she controls and sacrifices the rest. -Players can't play lands as long as ten or more lands are on the battlefield. -EXO R - -Lin Sivvi, Defiant Hero -{1}{W}{W} -Legendary Creature - Human Rebel -1/3 -{X}, {T}: Search your library for a Rebel permanent card with converted mana cost X or less and put it onto the battlefield. Then shuffle your library. -{3}: Put target Rebel card from your graveyard on the bottom of your library. -NEM R - -Linessa, Zephyr Mage -{3}{U} -Legendary Creature - Human Wizard -3/3 -{X}{U}{U}, {T}: Return target creature with converted mana cost X to its owner's hand. -Grandeur - Discard another card named Linessa, Zephyr Mage: Target player returns a creature he or she controls to its owner's hand, then repeats this process for an artifact, an enchantment, and a land. -FUT R - -Lingering Death -{1}{B} -Enchantment - Aura -Enchant creature -At the beginning of the end step of enchanted creature's controller, that player sacrifices that creature. -SCG C - -Lingering Mirage -{1}{U} -Enchantment - Aura -Enchant land -Enchanted land is an Island. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG U - -Lingering Tormentor -{3}{B} -Creature - Spirit -2/2 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -Persist (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) -EVE U - -Linvala, Keeper of Silence -{2}{W}{W} -Legendary Creature - Angel -3/4 -Flying -Activated abilities of creatures your opponents control can't be activated. -ROE M - -Lion's Eye Diamond -{0} -Artifact -Sacrifice Lion's Eye Diamond, Discard your hand: Add three mana of any one color to your mana pool. Activate this ability only any time you could cast an instant. -MIR R - -Lionheart Maverick -{W} -Creature - Human Knight -1/1 -Vigilance -{4}{W}: Lionheart Maverick gets +1/+2 until end of turn. -GPT C, DDG C - -Liquid Fire -{4}{R}{R} -Sorcery -As an additional cost to cast Liquid Fire, choose a number between 0 and 5. -Liquid Fire deals X damage to target creature and 5 minus X damage to that creature's controller, where X is the chosen number. -ODY U - -Liquify -{2}{U} -Instant -Counter target spell with converted mana cost 3 or less. If that spell is countered this way, exile it instead of putting it into its owner's graveyard. -TOR C - -Liquimetal Coating -{2} -Artifact -{T}: Target permanent becomes an artifact in addition to its other types until end of turn. -SOM U - -Lithatog -{1}{R}{G} -Creature - Atog -1/2 -Sacrifice an artifact: Lithatog gets +1/+1 until end of turn. -Sacrifice a land: Lithatog gets +1/+1 until end of turn. -ODY U - -Lithophage -{3}{R}{R} -Creature - Insect -7/7 -At the beginning of your upkeep, sacrifice Lithophage unless you sacrifice a Mountain. -MMQ R - -Liu Bei, Lord of Shu -{3}{W}{W} -Legendary Creature - Human Soldier -2/4 -Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -Liu Bei, Lord of Shu gets +2/+2 as long as you control a permanent named Guan Yu, Sainted Warrior or a permanent named Zhang Fei, Fierce Warrior. -PTK R, ME3 R - -Livewire Lash -{2} -Artifact - Equipment -Equipped creature gets +2/+0 and has "Whenever this creature becomes the target of a spell, this creature deals 2 damage to target creature or player." -Equip {2} -SOM R - -Living Airship -{3}{U} -Creature - Metathran -2/3 -Flying -{2}{G}: Regenerate Living Airship. -APC C - -Living Armor -{4} -Artifact -{T}, Sacrifice Living Armor: Put X +0/+1 counters on target creature, where X is that creature's converted mana cost. -DRK U, CHR C - -Living Artifact -{G} -Enchantment - Aura -Enchant artifact -Whenever you're dealt damage, put that many vitality counters on Living Artifact. -At the beginning of your upkeep, you may remove a vitality counter from Living Artifact. If you do, you gain 1 life. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R - -Living Death -{3}{B}{B} -Sorcery -Each player exiles all creature cards from his or her graveyard, then sacrifices all creatures he or she controls, then puts all cards he or she exiled this way onto the battlefield. -TMP R, BRB R, PVC R, COM R - -Living Destiny -{3}{G} -Instant -As an additional cost to cast Living Destiny, reveal a creature card from your hand. -You gain life equal to the revealed card's converted mana cost. -ROE C - -Living End -Sorcery -Living End is black. -Suspend 3-{2}{B}{B} (Rather than cast this card from your hand, pay {2}{B}{B} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) -Each player exiles all creature cards from his or her graveyard, then sacrifices all creatures he or she controls, then puts all cards he or she exiled this way onto the battlefield. -TSP R - -Living Hive -{6}{G}{G} -Creature - Elemental Insect -6/6 -Trample -Whenever Living Hive deals combat damage to a player, put that many 1/1 green Insect creature tokens onto the battlefield. -MRD R, HOP R - -Living Inferno -{6}{R}{R} -Creature - Elemental -8/5 -{T}: Living Inferno deals damage equal to its power divided as you choose among any number of target creatures. Each of those creatures deals damage equal to its power to Living Inferno. -GPT R - -Living Lands -{3}{G} -Enchantment -All Forests are 1/1 creatures that are still lands. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, 6ED R, ME4 R - -Living Plane -{2}{G}{G} -World Enchantment -All lands are 1/1 creatures that are still lands. -LEG R, ME3 R - -Living Terrain -{2}{G}{G} -Enchantment - Aura -Enchant land -Enchanted land is a 5/6 green Treefolk creature that's still a land. -PCY U, 8ED U - -Living Tsunami -{2}{U}{U} -Creature - Elemental -4/4 -Flying -At the beginning of your upkeep, sacrifice Living Tsunami unless you return a land you control to its owner's hand. -ZEN U - -Living Wall -{4} -Artifact Creature - Wall -0/6 -Defender (This creature can't attack.) -{1}: Regenerate Living Wall. -LEA U, LEB U, 2ED U, 3ED U, ME4 U - -Living Wish -{1}{G} -Sorcery -You may choose a creature or land card you own from outside the game, reveal that card, and put it into your hand. Exile Living Wish. -JUD R - -Livonya Silone -{2}{R}{R}{G}{G} -Legendary Creature - Human Warrior -4/4 -First strike, legendary landwalk -LEG R, ME3 U - -Lizard Warrior -{3}{R} -Creature - Lizard Warrior -4/2 -POR C - -Llanowar -Plane - Dominaria -All creatures have "{T}: Add {G}{G} to your mana pool." -Whenever you roll {C}, untap all creatures you control. -HOP C - -Llanowar Augur -{G} -Creature - Elf Shaman -0/3 -Sacrifice Llanowar Augur: Target creature gets +3/+3 and gains trample until end of turn. Activate this ability only during your upkeep. -FUT C - -Llanowar Behemoth -{3}{G}{G} -Creature - Elemental -4/4 -Tap an untapped creature you control: Llanowar Behemoth gets +1/+1 until end of turn. -WTH U, 8ED U, 9ED U - -Llanowar Cavalry -{2}{G} -Creature - Human Soldier -1/4 -{W}: Llanowar Cavalry gains vigilance until end of turn. -INV C - -Llanowar Dead -{B}{G} -Creature - Zombie Elf -2/2 -{T}: Add {B} to your mana pool. -APC C - -Llanowar Druid -{1}{G} -Creature - Elf Druid -1/2 -{T}, Sacrifice Llanowar Druid: Untap all Forests. -WTH C - -Llanowar Elite -{G} -Creature - Elf -1/1 -Kicker {8} (You may pay an additional {8} as you cast this spell.) -Trample -If Llanowar Elite was kicked, it enters the battlefield with five +1/+1 counters on it. -INV C - -Llanowar Elves -{G} -Creature - Elf Druid -1/1 -{T}: Add {G} to your mana pool. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, 6ED C, BRB C, S00 C, BTD C, 7ED C, 9ED C, 10E C, EVG C, M10 C, M11 C, M12 C - -Llanowar Empath -{3}{G} -Creature - Elf Shaman -2/2 -When Llanowar Empath enters the battlefield, scry 2, then reveal the top card of your library. If it's a creature card, put it into your hand. (To scry 2, look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) -FUT C - -Llanowar Knight -{G}{W} -Creature - Elf Knight -2/2 -Protection from black -INV C - -Llanowar Mentor -{G} -Creature - Elf Spellshaper -1/1 -{G}, {T}, Discard a card: Put a 1/1 green Elf Druid creature token named Llanowar Elves onto the battlefield. It has "{T}: Add {G} to your mana pool." -FUT U - -Llanowar Reborn -Land -Llanowar Reborn enters the battlefield tapped. -{T}: Add {G} to your mana pool. -Graft 1 (This land enters the battlefield with a +1/+1 counter on it. Whenever a creature enters the battlefield, you may move a +1/+1 counter from this land onto it.) -FUT U, ARC U - -Llanowar Sentinel -{2}{G} -Creature - Elf -2/3 -When Llanowar Sentinel enters the battlefield, you may pay {1}{G}. If you do, search your library for a card named Llanowar Sentinel and put that card onto the battlefield. Then shuffle your library. -WTH C, 10E C - -Llanowar Vanguard -{2}{G} -Creature - Dryad -1/1 -{T}: Llanowar Vanguard gets +0/+4 until end of turn. -INV C - -Llanowar Wastes -Land -{T}: Add {1} to your mana pool. -{T}: Add {B} or {G} to your mana pool. Llanowar Wastes deals 1 damage to you. -APC R, 9ED R, 10E R - -Llawan, Cephalid Empress -{3}{U} -Legendary Creature - Cephalid -2/3 -When Llawan, Cephalid Empress enters the battlefield, return all blue creatures your opponents control to their owners' hands. -Your opponents can't cast blue creature spells. -TOR R - -Loafing Giant -{4}{R} -Creature - Giant -4/6 -Whenever Loafing Giant attacks or blocks, put the top card of your library into your graveyard. If that card is a land card, prevent all combat damage Loafing Giant would deal this turn. -INV R - -Loam Dweller -{1}{G} -Creature - Spirit -2/2 -Whenever you cast a Spirit or Arcane spell, you may put a land card from your hand onto the battlefield tapped. -BOK U - -Loam Lion -{W} -Creature - Cat -1/1 -Loam Lion gets +1/+2 as long as you control a Forest. -WWK U - -Loamdragger Giant -{4}{R/G}{R/G}{R/G} -Creature - Giant Warrior -7/6 -SHM C - -Loaming Shaman -{2}{G} -Creature - Centaur Shaman -3/2 -When Loaming Shaman enters the battlefield, target player shuffles any number of target cards from his or her graveyard into his or her library. -DIS R - -Lobotomy -{2}{U}{B} -Sorcery -Target player reveals his or her hand, then you choose a card other than a basic land card from it. Search that player's graveyard, hand, and library for all cards with the same name as the chosen card and exile them. Then that player shuffles his or her library. -TMP U, INV U - -Loch Korrigan -{3}{B} -Creature - Spirit -1/1 -{U/B}: Loch Korrigan gets +1/+1 until end of turn. -SHM C - -Locket of Yesterdays -{1} -Artifact -Spells you cast cost {1} less to cast for each card with the same name as that spell in your graveyard. -TSP U - -Lockjaw Snapper -{4} -Artifact Creature - Scarecrow -2/2 -Wither (This deals damage to creatures in the form of -1/-1 counters.) -When Lockjaw Snapper dies, put a -1/-1 counter on each creature with a -1/-1 counter on it. -SHM U - -Locust Miser -{2}{B}{B} -Creature - Rat Shaman -2/2 -Each opponent's maximum hand size is reduced by two. -SOK U - -Locust Swarm -{3}{G} -Creature - Insect -1/1 -Flying -{G}: Regenerate Locust Swarm. -{G}: Untap Locust Swarm. Activate this ability only once each turn. -MIR U - -Lodestone Bauble -{0} -Artifact -{1}, {T}, Sacrifice Lodestone Bauble: Put up to four target basic land cards from a player's graveyard on top of his or her library in any order. That player draws a card at the beginning of the next turn's upkeep. -ALL R, ME2 R - -Lodestone Golem -{4} -Artifact Creature - Golem -5/3 -Nonartifact spells cost {1} more to cast. -WWK R, ARC R - -Lodestone Myr -{4} -Artifact Creature - Myr -2/2 -Trample -Tap an untapped artifact you control: Lodestone Myr gets +1/+1 until end of turn. -MRD R, HOP R - -Logic Knot -{X}{U}{U} -Instant -Delve (You may exile any number of cards from your graveyard as you cast this spell. It costs {1} less to cast for each card exiled this way.) -Counter target spell unless its controller pays {X}. -FUT C - -Lone Missionary -{1}{W} -Creature - Kor Monk -2/1 -When Lone Missionary enters the battlefield, you gain 4 life. -ROE C - -Lone Wolf -{2}{G} -Creature - Wolf -2/2 -You may have Lone Wolf assign its combat damage as though it weren't blocked. -P02 U, ULG U, PTK U, S99 C, 7ED C, 8ED C - -Lonely Sandbar -Land -Lonely Sandbar enters the battlefield tapped. -{T}: Add {U} to your mana pool. -Cycling {U} ({U}, Discard this card: Draw a card.) -ONS C, COM C - -Long-Forgotten Gohei -{3} -Artifact -Arcane spells you cast cost {1} less to cast. -Spirit creatures you control get +1/+1. -CHK R - -Long-Term Plans -{2}{U} -Instant -Search your library for a card, shuffle your library, then put that card third from the top. -SCG U - -Longbow Archer -{W}{W} -Creature - Human Soldier Archer -2/2 -First strike; reach (This creature can block creatures with flying.) -VIS U, 6ED U, 7ED U - -Longhorn Firebeast -{2}{R} -Creature - Elemental Ox Beast -3/2 -When Longhorn Firebeast enters the battlefield, any opponent may have it deal 5 damage to him or her. If a player does, sacrifice Longhorn Firebeast. -TOR C - -Look Skyward and Despair -Scheme -When you set this scheme in motion, put a 5/5 red Dragon creature token with flying onto the battlefield. -ARC C - -Looming Hoverguard -{4}{U}{U} -Creature - Drone -3/3 -Flying -When Looming Hoverguard enters the battlefield, put target artifact on top of its owner's library. -MRD U - -Looming Shade -{2}{B} -Creature - Shade -1/1 -{B}: Looming Shade gets +1/+1 until end of turn. -USG C, 7ED C, 8ED C, 9ED C, 10E C, M10 C - -Looter il-Kor -{1}{U} -Creature - Kor Rogue -1/1 -Shadow (This creature can block or be blocked by only creatures with shadow.) -Whenever Looter il-Kor deals damage to an opponent, draw a card, then discard a card. -TSP C - -Lord Magnus -{3}{G}{W}{W} -Legendary Creature - Human Druid -4/3 -First strike -Creatures with plainswalk can be blocked as though they didn't have plainswalk. -Creatures with forestwalk can be blocked as though they didn't have forestwalk. -LEG U - -Lord of Atlantis -{U}{U} -Creature - Merfolk -2/2 -Other Merfolk creatures get +1/+1 and have islandwalk. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, 6ED R, 7ED R, TSB S - -Lord of Extinction -{3}{B}{G} -Creature - Elemental -*/* -Lord of Extinction's power and toughness are each equal to the number of cards in all graveyards. -ARB M - -Lord of Shatterskull Pass -{3}{R} -Creature - Minotaur Shaman -3/3 -Level up {1}{R} ({1}{R}: Put a level counter on this. Level up only as a sorcery.) -LEVEL 1-5 -6/6 -LEVEL 6+ -6/6 -Whenever Lord of Shatterskull Pass attacks, it deals 6 damage to each creature defending player controls. -ROE R - -Lord of Tresserhorn -{1}{U}{B}{R} -Legendary Creature - Zombie -10/4 -When Lord of Tresserhorn enters the battlefield, you lose 2 life, you sacrifice two creatures, and target opponent draws two cards. -{B}: Regenerate Lord of Tresserhorn. -ALL R, MED R - -Lord of the Pit -{4}{B}{B}{B} -Creature - Demon -7/7 -Flying, trample -At the beginning of your upkeep, sacrifice a creature other than Lord of the Pit. If you can't, Lord of the Pit deals 7 damage to you. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, 10E R, DVD M - -Lord of the Undead -{1}{B}{B} -Creature - Zombie -2/2 -Other Zombie creatures get +1/+1. -{1}{B}, {T}: Return target Zombie card from your graveyard to your hand. -PLS R, 8ED R, 9ED R, 10E R - -Lord of the Unreal -{U}{U} -Creature - Human Wizard -2/2 -Illusion creatures you control get +1/+1 and have hexproof. (They can't be the targets of spells or abilities your opponents control.) -M12 R - -Lore Broker -{1}{U} -Creature - Human Rogue -1/2 -{T}: Each player draws a card, then discards a card. -RAV U - -Lorescale Coatl -{1}{G}{U} -Creature - Snake -2/2 -Whenever you draw a card, you may put a +1/+1 counter on Lorescale Coatl. -ARB U - -Lorthos, the Tidemaker -{5}{U}{U}{U} -Legendary Creature - Octopus -8/8 -Whenever Lorthos, the Tidemaker attacks, you may pay {8}. If you do, tap up to eight target permanents. Those permanents don't untap during their controllers' next untap steps. -ZEN M - -Lose Hope -{B} -Instant -Target creature gets -1/-1 until end of turn. -Scry 2. (To scry 2, look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) -5DN C - -Lost Auramancers -{2}{W}{W} -Creature - Human Wizard -3/3 -Vanishing 3 (This permanent enters the battlefield with three time counters on it. At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.) -When Lost Auramancers dies, if it had no time counters on it, you may search your library for an enchantment card and put it onto the battlefield. If you do, shuffle your library. -FUT U - -Lost Hours -{1}{B} -Sorcery -Target player reveals his or her hand. You choose a nonland card from it. That player puts that card into his or her library third from the top. -FUT C - -Lost Leonin -{1}{W} -Creature - Cat Soldier -2/1 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -NPH C - -Lost Order of Jarkeld -{2}{W}{W} -Creature - Human Knight -1+*/1+* -As Lost Order of Jarkeld enters the battlefield, choose an opponent. -Lost Order of Jarkeld's power and toughness are each equal to 1 plus the number of creatures the chosen player controls. -ICE R, ME2 R - -Lost Soul -{1}{B}{B} -Creature - Spirit Minion -2/1 -Swampwalk -LEG C, 4ED C, 5ED C, 6ED C - -Lost in Thought -{1}{U} -Enchantment - Aura -Enchant creature -Enchanted creature can't attack or block, and its activated abilities can't be activated. Its controller may exile three cards from his or her graveyard for that player to ignore this effect until end of turn. -JUD C - -Lotus Bloom -Artifact -Suspend 3-{0} (Rather than cast this card from your hand, pay {0} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) -{T}, Sacrifice Lotus Bloom: Add three mana of any one color to your mana pool. -TSP R - -Lotus Blossom -{2} -Artifact -At the beginning of your upkeep, you may put a petal counter on Lotus Blossom. -{T}, Sacrifice Lotus Blossom: Add X mana of any one color to your mana pool, where X is the number of petal counters on Lotus Blossom. -USG R - -Lotus Cobra -{1}{G} -Creature - Snake -2/1 -Landfall - Whenever a land enters the battlefield under your control, you may add one mana of any color to your mana pool. -ZEN M - -Lotus Guardian -{7} -Artifact Creature - Dragon -4/4 -Flying -{T}: Add one mana of any color to your mana pool. -INV R - -Lotus Petal -{0} -Artifact -{T}, Sacrifice Lotus Petal: Add one mana of any color to your mana pool. -TMP C, FVE M - -Lotus Vale -Land -If Lotus Vale would enter the battlefield, sacrifice two untapped lands instead. If you do, put Lotus Vale onto the battlefield. If you don't, put it into its owner's graveyard. -{T}: Add three mana of any one color to your mana pool. -WTH R - -Lovisa Coldeyes -{3}{R}{R} -Legendary Creature - Human Barbarian -3/3 -Warrior, Berserker, and/or other Barbarian creatures get +2/+2 and have haste. -CSP R - -Lowland Basilisk -{2}{G} -Creature - Basilisk -1/3 -Whenever Lowland Basilisk deals damage to a creature, destroy that creature at end of combat. -STH C - -Lowland Giant -{2}{R}{R} -Creature - Giant -4/3 -TMP C, BTD C - -Lowland Oaf -{3}{R} -Creature - Giant Warrior -3/3 -{T}: Target Goblin creature you control gets +1/+0 and gains flying until end of turn. Sacrifice that creature at the beginning of the next end step. -LRW C - -Lowland Tracker -{4}{W} -Creature - Human Soldier -2/2 -First strike -Provoke (When this attacks, you may have target creature defending player controls untap and block it if able.) -LGN C - -Loxodon Anchorite -{2}{W}{W} -Creature - Elephant Cleric -2/3 -{T}: Prevent the next 2 damage that would be dealt to target creature or player this turn. -5DN C - -Loxodon Convert -{3}{W} -Creature - Elephant Soldier -4/2 -NPH C - -Loxodon Gatekeeper -{2}{W}{W} -Creature - Elephant Soldier -2/3 -Artifacts, creatures, and lands your opponents control enter the battlefield tapped. -RAV R - -Loxodon Hierarch -{2}{G}{W} -Creature - Elephant Cleric -4/4 -When Loxodon Hierarch enters the battlefield, you gain 4 life. -{G}{W}, Sacrifice Loxodon Hierarch: Regenerate each creature you control. -RAV R - -Loxodon Hierarch Avatar -Vanguard -Hand +0, life +12 -Sacrifice a permanent: Regenerate target creature you control. -VG S - -Loxodon Mender -{5}{W} -Creature - Elephant Cleric -3/3 -{W}, {T}: Regenerate target artifact. -MRD C - -Loxodon Mystic -{3}{W}{W} -Creature - Elephant Cleric -3/3 -{W}, {T}: Tap target creature. -DST C, 10E C - -Loxodon Partisan -{4}{W} -Creature - Elephant Soldier -3/4 -Battle cry (Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn.) -MBS C - -Loxodon Peacekeeper -{1}{W} -Creature - Elephant Soldier -4/4 -At the beginning of your upkeep, the player with the lowest life total gains control of Loxodon Peacekeeper. If two or more players are tied for lowest life total, you choose one of them, and that player gains control of Loxodon Peacekeeper. -MRD R - -Loxodon Punisher -{3}{W} -Creature - Elephant Soldier -2/2 -Loxodon Punisher gets +2/+2 for each Equipment attached to it. -MRD R - -Loxodon Stalwart -{3}{W}{W} -Creature - Elephant Soldier -3/3 -Vigilance -{W}: Loxodon Stalwart gets +0/+1 until end of turn. -5DN U - -Loxodon Warhammer -{3} -Artifact - Equipment -Equipped creature gets +3/+0 and has trample and lifelink. (If the creature would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker. Damage dealt by the creature also causes its controller to gain that much life.) -Equip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) -MRD U, 9ED R, 10E R, HOP R, DDG R - -Loxodon Wayfarer -{2}{W} -Creature - Elephant Monk -1/5 -SOM C - -Loyal Gyrfalcon -{3}{W} -Creature - Bird -3/3 -Defender, flying -Whenever you cast a white spell, Loyal Gyrfalcon loses defender until end of turn. -EVE U - -Loyal Retainers -{2}{W} -Creature - Human Advisor -1/1 -Sacrifice Loyal Retainers: Return target legendary creature card from your graveyard to the battlefield. Activate this ability only during your turn, before attackers are declared. -PTK U, ME3 U - -Loyal Sentry -{W} -Creature - Human Soldier -1/1 -When Loyal Sentry blocks a creature, destroy that creature and Loyal Sentry. -S99 R, 10E R, EVT R - -Lu Bu, Master-at-Arms -{5}{R} -Legendary Creature - Human Soldier Warrior -4/3 -Haste; horsemanship (This creature can't be blocked except by creatures with horsemanship.) -PTK R, ME3 R - -Lu Meng, Wu General -{3}{U}{U} -Legendary Creature - Human Soldier -4/4 -Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -PTK R, ME3 U - -Lu Su, Wu Advisor -{3}{U}{U} -Legendary Creature - Human Advisor -1/2 -{T}: Draw a card. Activate this ability only during your turn, before attackers are declared. -PTK R - -Lu Xun, Scholar General -{2}{U}{U} -Legendary Creature - Human Soldier -1/3 -Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -Whenever Lu Xun, Scholar General deals damage to an opponent, you may draw a card. -PTK R, ME3 U - -Lucent Liminid -{3}{W}{W} -Enchantment Creature - Elemental -3/3 -Flying -FUT C - -Lull -{1}{G} -Instant -Prevent all combat damage that would be dealt this turn. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG C - -Lullmage Mentor -{1}{U}{U} -Creature - Merfolk Wizard -2/2 -Whenever a spell or ability you control counters a spell, you may put a 1/1 blue Merfolk creature token onto the battlefield. -Tap seven untapped Merfolk you control: Counter target spell. -ZEN R - -Lumbering Satyr -{2}{G}{G} -Creature - Satyr Beast -5/4 -All creatures have forestwalk. -MMQ U - -Lumengrid Augur -{3}{U} -Creature - Vedalken Wizard -2/2 -{1}, {T}: Target player draws a card, then discards a card. If that player discards an artifact card this way, untap Lumengrid Augur. -MRD R - -Lumengrid Drake -{3}{U} -Creature - Drake -2/2 -Flying -Metalcraft - When Lumengrid Drake enters the battlefield, if you control three or more artifacts, return target creature to its owner's hand. -SOM C - -Lumengrid Gargoyle -{6} -Artifact Creature - Gargoyle -4/4 -Flying -MBS U - -Lumengrid Sentinel -{2}{U} -Creature - Human Wizard -1/2 -Flying -Whenever an artifact enters the battlefield under your control, you may tap target permanent. -MRD U - -Lumengrid Warden -{1}{U} -Creature - Human Wizard -1/3 -MRD C, 9ED C, 10E C - -Luminarch Ascension -{1}{W} -Enchantment -At the beginning of each opponent's end step, if you didn't lose life this turn, you may put a quest counter on Luminarch Ascension. (Damage causes loss of life.) -{1}{W}: Put a 4/4 white Angel creature token with flying onto the battlefield. Activate this ability only if Luminarch Ascension has four or more quest counters on it. -ZEN R - -Luminesce -{W} -Instant -Prevent all damage that black sources and red sources would deal this turn. -CSP U, 10E U - -Luminescent Rain -{2}{G} -Instant -Choose a creature type. You gain 2 life for each permanent you control of that type. -MOR C - -Luminous Angel -{4}{W}{W}{W} -Creature - Angel -4/4 -Flying -At the beginning of your upkeep, you may put a 1/1 white Spirit creature token with flying onto the battlefield. -MRD R, DVD R - -Luminous Guardian -{3}{W} -Creature - Human Nomad -1/4 -{W}: Luminous Guardian gets +0/+1 until end of turn. -{2}: Luminous Guardian can block an additional creature this turn. -ODY U - -Luminous Wake -{2}{W} -Enchantment - Aura -Enchant creature -Whenever enchanted creature attacks or blocks, you gain 4 life. -ROE U - -Lumithread Field -{1}{W} -Enchantment -Creatures you control get +0/+1. -Morph {1}{W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -FUT C - -Lunar Avenger -{7} -Artifact Creature - Golem -2/2 -Sunburst (This enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.) -Remove a +1/+1 counter from Lunar Avenger: Lunar Avenger gains your choice of flying, first strike, or haste until end of turn. -5DN U - -Lunge -{2}{R} -Instant -Lunge deals 2 damage to target creature and 2 damage to target player. -MMQ C - -Lunk Errant -{5}{R} -Creature - Giant Warrior -4/4 -Whenever Lunk Errant attacks alone, it gets +1/+1 and gains trample until end of turn. -MOR C - -Lure -{1}{G}{G} -Enchantment - Aura -Enchant creature -All creatures able to block enchanted creature do so. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, ICE U, 5ED U, 6ED U, MMQ U, 7ED U, 8ED U, CHK U, 10E U, M12 U - -Lure of Prey -{2}{G}{G} -Instant -Cast Lure of Prey only if an opponent cast a creature spell this turn. -You may put a green creature card from your hand onto the battlefield. -MIR R - -Lurebound Scarecrow -{3} -Artifact Creature - Scarecrow -4/4 -As Lurebound Scarecrow enters the battlefield, choose a color. -When you control no permanents of the chosen color, sacrifice Lurebound Scarecrow. -SHM U - -Lurker -{2}{G} -Creature - Beast -2/3 -Lurker can't be the target of spells unless it attacked or blocked this turn. -DRK R - -Lurking Crocodile -{2}{G} -Creature - Crocodile -2/2 -Bloodthirst 1 (If an opponent was dealt damage this turn, this creature enters the battlefield with a +1/+1 counter on it.) -Islandwalk (This creature is unblockable as long as defending player controls an Island.) -M12 C - -Lurking Evil -{B}{B}{B} -Enchantment -Pay half your life, rounded up: Lurking Evil becomes a 4/4 Horror creature with flying. -USG R - -Lurking Informant -{1}{U/B} -Creature - Human Rogue -1/2 -({U/B} can be paid with either {U} or {B}.) -{2}, {T}: Look at the top card of target player's library. You may put that card into that player's graveyard. -RAV C - -Lurking Jackals -{B} -Enchantment -When an opponent has 10 or less life, if Lurking Jackals is an enchantment, it becomes a 3/2 Hound creature. -UDS U - -Lurking Nightstalker -{B}{B} -Creature - Nightstalker -1/1 -Whenever Lurking Nightstalker attacks, it gets +2/+0 until end of turn. -P02 C - -Lurking Predators -{4}{G}{G} -Enchantment -Whenever an opponent casts a spell, reveal the top card of your library. If it's a creature card, put it onto the battlefield. Otherwise, you may put that card on the bottom of your library. -M10 R - -Lurking Skirge -{1}{B} -Enchantment -When a creature is put into an opponent's graveyard from the battlefield, if Lurking Skirge is an enchantment, Lurking Skirge becomes a 3/2 Imp creature with flying. -ULG R - -Lush Growth -{G} -Enchantment - Aura -Enchant land -Enchanted land is a Mountain, Forest, and Plains. -ALA C - -Lust for War -{2}{R} -Enchantment - Aura -Enchant creature -Whenever enchanted creature becomes tapped, Lust for War deals 3 damage to that creature's controller. -Enchanted creature attacks each turn if able. -ROE U - -Lux Cannon -{4} -Artifact -{T}: Put a charge counter on Lux Cannon. -{T}, Remove three charge counters from Lux Cannon: Destroy target permanent. -SOM M - -Lydari Druid -{2}{G} -Creature - Human Druid -2/2 -When Lydari Druid enters the battlefield, for each land, choose a basic land type at random. That land becomes that land type. (This effect lasts indefinitely.) -SDC S - -Lydari Elephant -{4}{G} -Creature - Elephant -*/* -Lydari Elephant enters the battlefield as a X/Y creature, where X and Y are numbers randomly chosen from 3 to 7. -SDC S - -Lymph Sliver -{4}{W} -Creature - Sliver -3/3 -All Sliver creatures have absorb 1. (If a source would deal damage to a Sliver, prevent 1 of that damage.) -FUT C - -Lyna -Vanguard -Hand +2, life -4 -Creatures you control have shadow. (They can block and be blocked only by creatures with shadow.) -VG S - -Lynx -{1}{G} -Creature - Cat -2/1 -Forestwalk -P02 C, S99 U - -Lys Alana Bowmaster -{2}{G} -Creature - Elf Archer -2/2 -Reach (This can block creatures with flying.) -Whenever you cast an Elf spell, you may have Lys Alana Bowmaster deal 2 damage to target creature with flying. -MOR C - -Lys Alana Huntmaster -{2}{G}{G} -Creature - Elf Warrior -3/3 -Whenever you cast an Elf spell, you may put a 1/1 green Elf Warrior creature token onto the battlefield. -LRW C, EVG C - -Lys Alana Scarblade -{2}{B} -Creature - Elf Assassin -1/1 -{T}, Discard an Elf card: Target creature gets -X/-X until end of turn, where X is the number of Elves you control. -LRW U - -Lyzolda, the Blood Witch -{1}{B}{R} -Legendary Creature - Human Cleric -3/1 -{2}, Sacrifice a creature: Lyzolda, the Blood Witch deals 2 damage to target creature or player if the sacrificed creature was red. Draw a card if the sacrificed creature was black. -DIS R - -Lyzolda, the Blood Witch Avatar -Vanguard -Hand -1, life -1 -Hellbent - As long as you have no cards in hand, if a source you control would deal damage to a creature or player, it deals double that damage to that creature or player instead. -Hellbent - At the beginning of your end step, if you have no cards in hand, each of your opponents discards a card. -VG S - -Ma Chao, Western Warrior -{3}{R}{R} -Legendary Creature - Human Soldier Warrior -3/3 -Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -Whenever Ma Chao, Western Warrior attacks alone, it's unblockable this combat. -PTK R - -Macabre Waltz -{1}{B} -Sorcery -Return up to two target creature cards from your graveyard to your hand, then discard a card. -DIS C - -Macetail Hystrodon -{6}{R} -Creature - Beast -4/4 -First strike, haste -Cycling {3} ({3}, Discard this card: Draw a card.) -LGN C - -Machinate -{1}{U}{U} -Instant -Look at the top X cards of your library, where X is the number of artifacts you control. Put one of those cards into your hand and the rest on the bottom of your library in any order. -DST C - -Mad Auntie -{2}{B} -Creature - Goblin Shaman -2/2 -Other Goblin creatures you control get +1/+1. -{T}: Regenerate another target Goblin. -LRW R - -Mad Dog -{1}{R} -Creature - Hound -2/2 -At the beginning of your end step, if Mad Dog didn't attack or come under your control this turn, sacrifice it. -ODY C - -Madblind Mountain -Land - Mountain -({T}: Add {R} to your mana pool.) -Madblind Mountain enters the battlefield tapped. -{R}, {T}: Shuffle your library. Activate this ability only if you control two or more red permanents. -SHM U - -Maddening Imp -{2}{B} -Creature - Imp -1/1 -Flying -{T}: Non-Wall creatures the active player controls attack this turn if able. At the beginning of the next end step, destroy each of those creatures that didn't attack this turn. Activate this ability only during an opponent's turn and only before combat. -TMP R - -Maddening Wind -{2}{G} -Enchantment - Aura -Enchant creature -Cumulative upkeep {G} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -At the beginning of the upkeep of enchanted creature's controller, Maddening Wind deals 2 damage to that player. -ICE U - -Madrush Cyclops -{1}{B}{R}{G} -Creature - Cyclops Warrior -3/4 -Creatures you control have haste. -ARB R - -Maelstrom Archangel -{W}{U}{B}{R}{G} -Creature - Angel -5/5 -Flying -Whenever Maelstrom Archangel deals combat damage to a player, you may cast a nonland card from your hand without paying its mana cost. -CON M - -Maelstrom Archangel Avatar -Vanguard -Hand +0, life +5 -At end of combat, for each creature you controlled at the time it dealt combat damage to a player this turn, copy a random card with the same mana cost as that creature. You may pay {3}. If you do, choose one of those copies. If a copy of a permanent card is chosen, you may put a token onto the battlefield that's a copy of that card. If a copy of an instant or sorcery card is chosen, you may cast the copy without paying its mana cost. -VG S - -Maelstrom Djinn -{7}{U} -Creature - Djinn -5/6 -Flying -Morph {2}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Maelstrom Djinn is turned face up, put two time counters on it and it gains vanishing. (At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.) -FUT R - -Maelstrom Nexus -{W}{U}{B}{R}{G} -Enchantment -The first spell you cast each turn has cascade. (When you cast your first spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.) -ARB M - -Maelstrom Pulse -{1}{B}{G} -Sorcery -Destroy target nonland permanent and all other permanents with the same name as that permanent. -ARB R - -Maga, Traitor to Mortals -{X}{B}{B}{B} -Legendary Creature - Human Wizard -0/0 -Maga, Traitor to Mortals enters the battlefield with X +1/+1 counters on it. -When Maga enters the battlefield, target player loses life equal to the number of +1/+1 counters on it. -SOK R - -Mage Slayer -{1}{R}{G} -Artifact - Equipment -Whenever equipped creature attacks, it deals damage equal to its power to defending player. -Equip {3} -ARB U, HOP U - -Mage il-Vec -{2}{R} -Creature - Human Wizard -2/2 -{T}, Discard a card at random: Mage il-Vec deals 1 damage to target creature or player. -EXO C - -Mage's Guile -{1}{U} -Instant -Target creature gains shroud until end of turn. (It can't be the target of spells or abilities.) -Cycling {U} ({U}, Discard this card: Draw a card.) -ONS C - -Magebane Armor -{3} -Artifact - Equipment -Equipped creature gets +2/+4 and loses flying. -Prevent all noncombat damage that would be dealt to equipped creature. -Equip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) -M10 R - -Magefire Wings -{U}{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+0 and has flying. -ARB C - -Mages' Contest -{1}{R}{R} -Instant -You and target spell's controller bid life. You start the bidding with a bid of 1. In turn order, each player may top the high bid. The bidding ends if the high bid stands. The high bidder loses life equal to the high bid. If you win the bidding, counter that spell. -INV R - -Mageta the Lion -{3}{W}{W} -Legendary Creature - Human Spellshaper -3/3 -{2}{W}{W}, {T}, Discard two cards: Destroy all creatures except for Mageta the Lion. Those creatures can't be regenerated. -PCY R - -Mageta's Boon -{1}{W} -Enchantment - Aura -Flash -Enchant creature -Enchanted creature gets +1/+2. -PCY C - -Magewright's Stone -{2} -Artifact -{1}, {T}: Untap target creature that has an activated ability with {T} in its cost. -DIS U - -Maggot Carrier -{B} -Creature - Zombie -1/1 -When Maggot Carrier enters the battlefield, each player loses 1 life. -PLS C, 8ED C - -Maggot Therapy -{2}{B} -Enchantment - Aura -Flash -Enchant creature -Enchanted creature gets +2/-2. -MMQ C - -Magical Hack -{U} -Instant -Change the text of target spell or permanent by replacing all instances of one basic land type with another. (For example, you may change "swampwalk" to "plainswalk." This effect lasts indefinitely.) -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R - -Magister Sphinx -{4}{W}{U}{B} -Artifact Creature - Sphinx -5/5 -Flying -When Magister Sphinx enters the battlefield, target player's life total becomes 10. -CON R, ARC R - -Magistrate's Scepter -{3} -Artifact -{4}, {T}: Put a charge counter on Magistrate's Scepter. -{T}, Remove three charge counters from Magistrate's Scepter: Take an extra turn after this one. -MMQ R - -Magistrate's Veto -{2}{R} -Enchantment -White creatures and blue creatures can't block. -MMQ U - -Magma Burst -{3}{R} -Instant -Kicker-Sacrifice two lands. (You may sacrifice two lands in addition to any other costs as you cast this spell.) -Magma Burst deals 3 damage to target creature or player. If Magma Burst was kicked, it deals 3 damage to another target creature or player. -PLS C - -Magma Giant -{5}{R}{R} -Creature - Giant -5/5 -When Magma Giant enters the battlefield, it deals 2 damage to each creature and each player. -P02 R, 5DN R - -Magma Jet -{1}{R} -Instant -Magma Jet deals 2 damage to target creature or player. -Scry 2. (To scry 2, look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) -5DN U, JVC U - -Magma Mine -{1} -Artifact -{4}: Put a pressure counter on Magma Mine. -{T}, Sacrifice Magma Mine: Magma Mine deals damage equal to the number of pressure counters on it to target creature or player. -VIS U - -Magma Phoenix -{3}{R}{R} -Creature - Phoenix -3/3 -Flying -When Magma Phoenix dies, it deals 3 damage to each creature and each player. -{3}{R}{R}: Return Magma Phoenix from your graveyard to your hand. -M10 R, M11 R - -Magma Rift -{2}{R} -Sorcery -As an additional cost to cast Magma Rift, sacrifice a land. -Magma Rift deals 5 damage to target creature. -ZEN C - -Magma Sliver -{3}{R} -Creature - Sliver -3/3 -All Slivers have "{T}: Target Sliver creature gets +X/+0 until end of turn, where X is the number of Slivers on the battlefield." -LGN R - -Magma Spray -{R} -Instant -Magma Spray deals 2 damage to target creature. If that creature would die this turn, exile it instead. -ALA C - -Magma Vein -{2}{R} -Enchantment -{R}, Sacrifice a land: Magma Vein deals 1 damage to each creature without flying. -ODY U - -Magmasaur -{3}{R}{R} -Creature - Elemental Lizard -0/0 -Magmasaur enters the battlefield with five +1/+1 counters on it. -At the beginning of your upkeep, you may remove a +1/+1 counter from Magmasaur. If you don't, sacrifice Magmasaur and it deals damage equal to the number of +1/+1 counters on it to each creature without flying and each player. -TMP R - -Magmatic Core -{2}{R}{R} -Enchantment -Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -At the beginning of your end step, Magmatic Core deals X damage divided as you choose among any number of target creatures, where X is the number of age counters on it. -CSP U - -Magmatic Force -{5}{R}{R}{R} -Creature - Elemental -7/7 -At the beginning of each upkeep, Magmatic Force deals 3 damage to target creature or player. -COM R - -Magmaw -{3}{R}{R} -Creature - Elemental -4/4 -{1}, Sacrifice a nonland permanent: Magmaw deals 1 damage to target creature or player. -ROE R - -Magnetic Flux -{2}{U} -Instant -Artifact creatures you control gain flying until end of turn. -DST C - -Magnetic Mine -{4} -Artifact -Whenever another artifact is put into a graveyard from the battlefield, Magnetic Mine deals 2 damage to that artifact's controller. -MBS R - -Magnetic Mountain -{1}{R}{R} -Enchantment -Blue creatures don't untap during their controllers' untap steps. -At the beginning of each player's upkeep, that player may choose any number of tapped blue creatures he or she controls and pay {4} for each creature chosen this way. If the player does, untap those creatures. -ARN U, 3ED R, 4ED R - -Magnetic Theft -{R} -Instant -Attach target Equipment to target creature. (Control of the Equipment doesn't change.) -5DN U - -Magnetic Web -{2} -Artifact -If a creature with a magnet counter on it attacks, all creatures with magnet counters on them attack if able. -Whenever a creature with a magnet counter on it attacks, all creatures with magnet counters on them block that creature this turn if able. -{1}, {T}: Put a magnet counter on target creature. -TMP R - -Magnify -{G} -Instant -All creatures get +1/+1 until end of turn. -UDS C - -Magnigoth Treefolk -{4}{G} -Creature - Treefolk -2/6 -Domain - For each basic land type among lands you control, Magnigoth Treefolk has landwalk of that type. -PLS R - -Magnivore -{2}{R}{R} -Creature - Lhurgoyf -*/* -Haste (This creature can attack the turn it comes under your control.) -Magnivore's power and toughness are each equal to the number of sorcery cards in all graveyards. -ODY R, 9ED R - -Magosi, the Waterveil -Land -Magosi, the Waterveil enters the battlefield tapped. -{T}: Add {U} to your mana pool. -{U}, {T}: Put an eon counter on Magosi, the Waterveil. Skip your next turn. -{T}, Remove an eon counter from Magosi, the Waterveil and return it to its owner's hand: Take an extra turn after this one. -ZEN R - -Magus of the Abyss -{3}{B} -Creature - Human Wizard -4/3 -At the beginning of each player's upkeep, destroy target nonartifact creature that player controls of his or her choice. It can't be regenerated. -FUT R - -Magus of the Arena -{4}{R}{R} -Creature - Human Wizard -5/5 -{3}, {T}: Tap target creature you control and target creature of an opponent's choice he or she controls. Each of those creatures deals damage equal to its power to the other. -PLC R - -Magus of the Bazaar -{1}{U} -Creature - Human Wizard -0/1 -{T}: Draw two cards, then discard three cards. -PLC R - -Magus of the Candelabra -{G} -Creature - Human Wizard -1/2 -{X}, {T}: Untap X target lands. -TSP R - -Magus of the Coffers -{4}{B} -Creature - Human Wizard -4/4 -{2}, {T}: Add {B} to your mana pool for each Swamp you control. -PLC R - -Magus of the Disk -{2}{W}{W} -Creature - Human Wizard -2/4 -Magus of the Disk enters the battlefield tapped. -{1}, {T}: Destroy all artifacts, creatures, and enchantments. -TSP R - -Magus of the Future -{2}{U}{U}{U} -Creature - Human Wizard -2/3 -Play with the top card of your library revealed. -You may play the top card of your library. -FUT R - -Magus of the Jar -{3}{U}{U} -Creature - Human Wizard -3/3 -{T}, Sacrifice Magus of the Jar: Each player exiles all cards from his or her hand face down and draws seven cards. At the beginning of the next end step, each player discards his or her hand and returns to his or her hand each card he or she exiled this way. -TSP R - -Magus of the Library -{G}{G} -Creature - Human Wizard -1/1 -{T}: Add {1} to your mana pool. -{T}: Draw a card. Activate this ability only if you have exactly seven cards in hand. -PLC R - -Magus of the Mirror -{4}{B}{B} -Creature - Human Wizard -4/2 -{T}, Sacrifice Magus of the Mirror: Exchange life totals with target opponent. Activate this ability only during your upkeep. -TSP R - -Magus of the Moat -{2}{W}{W} -Creature - Human Wizard -0/3 -Creatures without flying can't attack. -FUT R - -Magus of the Moon -{2}{R} -Creature - Human Wizard -2/2 -Nonbasic lands are Mountains. -FUT R - -Magus of the Scroll -{R} -Creature - Human Wizard -1/1 -{3}, {T}: Name a card. Reveal a card at random from your hand. If it's the named card, Magus of the Scroll deals 2 damage to target creature or player. -TSP R - -Magus of the Tabernacle -{3}{W} -Creature - Human Wizard -2/6 -All creatures have "At the beginning of your upkeep, sacrifice this creature unless you pay {1}." -PLC R - -Magus of the Unseen -{1}{U} -Creature - Human Wizard -1/1 -{1}{U}, {T}: Untap target artifact an opponent controls and gain control of it until end of turn. It gains haste until end of turn. When you lose control of the artifact, tap it. -ICE R, 5ED R, ME2 R - -Magus of the Vineyard -{G} -Creature - Human Wizard -1/1 -At the beginning of each player's precombat main phase, add {G}{G} to that player's mana pool. -FUT R, COM R - -Mahamoti Djinn -{4}{U}{U} -Creature - Djinn -5/6 -Flying (This creature can't be blocked except by creatures with flying or reach.) -LEA R, LEB R, 2ED R, 3ED R, 4ED R, BTD R, 7ED R, 8ED R, 9ED R, 10E R, ME4 R - -Major Teroh -{3}{W} -Legendary Creature - Bird Soldier -2/3 -Flying -{3}{W}{W}, Sacrifice Major Teroh: Exile all black creatures. -TOR R - -Makeshift Mannequin -{3}{B} -Instant -Return target creature card from your graveyard to the battlefield with a mannequin counter on it. For as long as that creature has a mannequin counter on it, it has "When this creature becomes the target of a spell or ability, sacrifice it." -LRW U, ARC U - -Makindi Griffin -{3}{W} -Creature - Griffin -2/4 -Flying -ROE C - -Makindi Shieldmate -{2}{W} -Creature - Kor Soldier Ally -0/3 -Defender -Whenever Makindi Shieldmate or another Ally enters the battlefield under your control, you may put a +1/+1 counter on Makindi Shieldmate. -ZEN C - -Malach of the Dawn -{2}{W}{W} -Creature - Angel -2/4 -Flying -{W}{W}{W}: Regenerate Malach of the Dawn. -PLC U - -Malachite Golem -{6} -Artifact Creature - Golem -5/3 -{1}{G}: Malachite Golem gains trample until end of turn. -MRD C - -Malachite Talisman -{2} -Artifact -Whenever a player casts a green spell, you may pay {3}. If you do, untap target permanent. -ICE U - -Malakir Bloodwitch -{3}{B}{B} -Creature - Vampire Shaman -4/4 -Flying, protection from white -When Malakir Bloodwitch enters the battlefield, each opponent loses life equal to the number of Vampires you control. You gain life equal to the life lost this way. -ZEN R - -Malevolent Awakening -{1}{B}{B} -Enchantment -{1}{B}{B}, Sacrifice a creature: Return target creature card from your graveyard to your hand. -ODY U - -Malfegor -{2}{B}{B}{R}{R} -Legendary Creature - Demon Dragon -6/6 -Flying -When Malfegor enters the battlefield, discard your hand. Each opponent sacrifices a creature for each card discarded this way. -CON M, COM M - -Malfegor Avatar -Vanguard -Hand +2, life -2 -Whenever a creature enters the battlefield under your control, if it was unearthed, it gets +3/+0. -Whenever a creature you control is exiled, if it was unearthed, shuffle that card into its owner's library. -VG S - -Malicious Advice -{X}{U}{B} -Instant -Tap X target artifacts, creatures, and/or lands. You lose X life. -PLS C - -Malignant Growth -{3}{G}{U} -Enchantment -Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -At the beginning of your upkeep, put a growth counter on Malignant Growth. -At the beginning of each opponent's draw step, that player draws an additional card for each growth counter on Malignant Growth, then Malignant Growth deals damage to the player equal to the number of cards he or she drew this way. -MIR R - -Mammoth Harness -{3}{G} -Enchantment - Aura -Enchant creature -Enchanted creature loses flying. -Whenever enchanted creature blocks or becomes blocked by a creature, the other creature gains first strike until end of turn. -HML R - -Mammoth Umbra -{4}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +3/+3 and has vigilance. -Totem armor (If enchanted creature would be destroyed, instead remove all damage from it and destroy this Aura.) -ROE U - -Man-o'-War -{2}{U} -Creature - Jellyfish -2/2 -When Man-o'-War enters the battlefield, return target creature to its owner's hand. -VIS C, POR U, S99 U, BRB C, JVC C - -Mana Breach -{2}{U} -Enchantment -Whenever a player casts a spell, that player returns a land he or she controls to its owner's hand. -EXO U, 7ED U - -Mana Cache -{1}{R}{R} -Enchantment -At the beginning of each player's end step, put a charge counter on Mana Cache for each untapped land that player controls. -Remove a charge counter from Mana Cache: Add {1} to your mana pool. Any player may activate this ability but only during his or her turn before the end step. -NEM R - -Mana Chains -{U} -Enchantment - Aura -Enchant creature -Enchanted creature has "Cumulative upkeep {1}." (At the beginning of its controller's upkeep, that player puts an age counter on it, then sacrifices it unless he or she pays its upkeep cost for each age counter on it.) -WTH C - -Mana Clash -{R} -Sorcery -You and target opponent each flip a coin. Mana Clash deals 1 damage to each player whose coin comes up tails. Repeat this process until both players' coins come up heads on the same flip. -DRK R, 4ED R, 5ED R, 7ED R, 8ED R, 9ED R - -Mana Crypt -{0} -Artifact -At the beginning of your upkeep, flip a coin. If you lose the flip, Mana Crypt deals 3 damage to you. -{T}: Add {2} to your mana pool. -PRO S, ME2 R - -Mana Cylix -{1} -Artifact -{1}, {T}: Add one mana of any color to your mana pool. -PLS U, CON C - -Mana Drain -{U}{U} -Instant -Counter target spell. At the beginning of your next main phase, add {X} to your mana pool, where X is that spell's converted mana cost. -LEG U, ME3 R - -Mana Echoes -{2}{R}{R} -Enchantment -Whenever a creature enters the battlefield, you may add {X} to your mana pool, where X is the number of creatures you control that share a creature type with it. -ONS R - -Mana Flare -{2}{R} -Enchantment -Whenever a player taps a land for mana, that player adds one mana to his or her mana pool of any type that land produced. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, MED R - -Mana Geyser -{3}{R}{R} -Sorcery -Add {R} to your mana pool for each tapped land your opponents control. -5DN C - -Mana Leak -{1}{U} -Instant -Counter target spell unless its controller pays {3}. -STH C, BRB C, 8ED C, 9ED C, M11 C, M12 C - -Mana Leech -{2}{B} -Creature - Leech -1/1 -You may choose not to untap Mana Leech during your untap step. -{T}: Tap target land. It doesn't untap during its controller's untap step for as long as Mana Leech remains tapped. -USG U - -Mana Matrix -{6} -Artifact -Instant and enchantment spells you cast cost up to {2} less to cast. -LEG R, ME4 R - -Mana Maze -{1}{U} -Enchantment -Players can't cast spells that share a color with the spell most recently cast this turn. -INV R - -Mana Prism -{3} -Artifact -{T}: Add {1} to your mana pool. -{1}, {T}: Add one mana of any color to your mana pool. -MIR U, 6ED U - -Mana Reflection -{4}{G}{G} -Enchantment -If you tap a permanent for mana, it produces twice as much of that mana instead. -SHM R - -Mana Seism -{1}{R} -Sorcery -Sacrifice any number of lands. Add {1} to your mana pool for each land sacrificed this way. -CHK U - -Mana Severance -{1}{U} -Sorcery -Search your library for any number of land cards and exile them. Then shuffle your library. -TMP R - -Mana Short -{2}{U} -Instant -Tap all lands target player controls and empty his or her mana pool. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 6ED R, 7ED R - -Mana Skimmer -{3}{B} -Creature - Leech -2/2 -Flying -Whenever Mana Skimmer deals damage to a player, tap target land that player controls. That land doesn't untap during its controller's next untap step. -TSP C - -Mana Tithe -{W} -Instant -Counter target spell unless its controller pays {1}. -PLC C - -Mana Vapors -{1}{U} -Sorcery -Lands target player controls don't untap during his or her next untap step. -PCY U - -Mana Vault -{1} -Artifact -Mana Vault doesn't untap during your untap step. -At the beginning of your upkeep, you may pay {4}. If you do, untap Mana Vault. -At the beginning of your draw step, if Mana Vault is tapped, it deals 1 damage to you. -{T}: Add {3} to your mana pool. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, ME4 R - -Mana Vortex -{1}{U}{U} -Enchantment -When you cast Mana Vortex, counter it unless you sacrifice a land. -At the beginning of each player's upkeep, that player sacrifices a land. -When there are no lands on the battlefield, sacrifice Mana Vortex. -DRK R, ME3 R - -Mana Web -{3} -Artifact -Whenever a land an opponent controls is tapped for mana, tap all lands that player controls that could produce any type of mana that land could produce. -WTH R - -Mana-Charged Dragon -{4}{R}{R} -Creature - Dragon -5/5 -Flying, trample -Join forces - Whenever Mana-Charged Dragon attacks or blocks, each player starting with you may pay any amount of mana. Mana-Charged Dragon gets +X/+0 until end of turn, where X is the total amount of mana paid this way. -COM R - -Manabarbs -{3}{R} -Enchantment -Whenever a player taps a land for mana, Manabarbs deals 1 damage to that player. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, 6ED R, 10E R, M10 R, M12 R - -Manabond -{G} -Enchantment -At the beginning of your end step, you may reveal your hand and put all land cards from it onto the battlefield. If you do, discard your hand. -EXO R - -Manacles of Decay -{1}{W} -Enchantment - Aura -Enchant creature -Enchanted creature can't attack. -{B}: Enchanted creature gets -1/-1 until end of turn. -{R}: Enchanted creature can't block this turn. -APC C - -Manaforce Mace -{4} -Artifact - Equipment -Domain - Equipped creature gets +1/+1 for each basic land type among lands you control. -Equip {3} -CON U - -Manaforge Cinder -{B/R} -Creature - Elemental Shaman -1/1 -{1}: Add {B} or {R} to your mana pool. Activate this ability no more than three times each turn. -SHM C - -Manakin -{2} -Artifact Creature - Construct -1/1 -{T}: Add {1} to your mana pool. -TMP C - -Manalith -{3} -Artifact -{T}: Add one mana of any color to your mana pool. -M12 C - -Manamorphose -{1}{R/G} -Instant -Add two mana in any combination of colors to your mana pool. -Draw a card. -SHM C - -Manaplasm -{2}{G} -Creature - Ooze -1/1 -Whenever you cast a spell, Manaplasm gets +X/+X until end of turn, where X is that spell's converted mana cost. -ALA R - -Mangara of Corondor -{1}{W}{W} -Legendary Creature - Human Wizard -1/1 -{T}: Exile Mangara of Corondor and target permanent. -TSP R - -Mangara's Blessing -{2}{W} -Instant -You gain 5 life. -When a spell or ability an opponent controls causes you to discard Mangara's Blessing, you gain 2 life, and you return Mangara's Blessing from your graveyard to your hand at the beginning of the next end step. -MIR U - -Mangara's Equity -{1}{W}{W} -Enchantment -As Mangara's Equity enters the battlefield, choose black or red. -At the beginning of your upkeep, sacrifice Mangara's Equity unless you pay {1}{W}. -Whenever a creature of the chosen color deals damage to you or a white creature you control, Mangara's Equity deals that much damage to that creature. -MIR U - -Mangara's Tome -{5} -Artifact -When Mangara's Tome enters the battlefield, search your library for five cards, exile them in a face-down pile, and shuffle that pile. Then shuffle your library. -{2}: The next time you would draw a card this turn, instead put the top card of the exiled pile into its owner's hand. -MIR R - -Maniacal Rage -{1}{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2 and can't block. -EXO C, BRB C, INV C, CON C - -Manic Vandal -{2}{R} -Creature - Human Warrior -2/2 -When Manic Vandal enters the battlefield, destroy target artifact. -M11 C, M12 C - -Manipulate Fate -{1}{U} -Sorcery -Search your library for three cards, exile them, then shuffle your library. -Draw a card. -INV U - -Mannichi, the Fevered Dream -{2}{R} -Legendary Creature - Spirit -1/2 -{1}{R}: Switch each creature's power and toughness until end of turn. -BOK R - -Manriki-Gusari -{2} -Artifact - Equipment -Equipped creature gets +1/+2 and has "{T}: Destroy target Equipment." -Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) -SOK U - -Manta Ray -{1}{U}{U} -Creature - Fish -3/3 -Manta Ray can't attack unless defending player controls an Island. -Manta Ray can't be blocked except by blue creatures. -When you control no Islands, sacrifice Manta Ray. -WTH C - -Manta Riders -{U} -Creature - Merfolk -1/1 -{U}: Manta Riders gains flying until end of turn. -TMP C, BRB C - -Mantis Engine -{5} -Artifact Creature - Insect -3/3 -{2}: Mantis Engine gains flying until end of turn. (It can't be blocked except by creatures with flying or reach.) -{2}: Mantis Engine gains first strike until end of turn. (It deals combat damage before creatures without first strike.) -UDS U, 10E U - -Mantle of Leadership -{1}{W} -Enchantment - Aura -Flash (You may cast this spell any time you could cast an instant.) -Enchant creature -Whenever a creature enters the battlefield, enchanted creature gets +2/+2 until end of turn. -PLC U - -Maralen of the Mornsong -{1}{B}{B} -Legendary Creature - Elf Wizard -2/3 -Players can't draw cards. -At the beginning of each player's draw step, that player loses 3 life, searches his or her library for a card, puts it into his or her hand, then shuffles his or her library. -MOR R - -Maralen of the Mornsong Avatar -Vanguard -Hand +0, life -3 -At the beginning of the game, you may pay any amount of life. -You can't draw cards. -At the beginning of your draw step, look at the top X cards of your library, where X is the amount of life paid with Maralen of the Mornsong Avatar. Put one of them into your hand, then shuffle your library. -VG S - -Marauding Knight -{2}{B}{B} -Creature - Zombie Knight -2/2 -Protection from white -Marauding Knight gets +1/+1 for each Plains your opponents control. -INV R - -Maraxus -Vanguard -Hand +1, life +2 -Creatures you control get +1/+0. -VG S - -Maraxus of Keld -{4}{R}{R} -Legendary Creature - Human Warrior -*/* -Maraxus of Keld's power and toughness are each equal to the number of untapped artifacts, creatures, and lands you control. -WTH R - -Marble Chalice -{2}{W} -Artifact -{T}: You gain 1 life. -ALA C - -Marble Diamond -{2} -Artifact -Marble Diamond enters the battlefield tapped. -{T}: Add {W} to your mana pool. -MIR U, 6ED U, 7ED U, DVD U - -Marble Priest -{5} -Artifact Creature - Cleric -3/3 -All Walls able to block Marble Priest do so. -Prevent all combat damage that would be dealt to Marble Priest by Walls. -LEG U - -Marble Titan -{3}{W} -Creature - Giant -3/3 -Creatures with power 3 or greater don't untap during their controllers' untap steps. -TMP R, 9ED R - -March of Souls -{4}{W} -Sorcery -Destroy all creatures. They can't be regenerated. For each creature destroyed this way, its controller puts a 1/1 white Spirit creature token with flying onto the battlefield. -PLS R - -March of the Machines -{3}{U} -Enchantment -Each noncreature artifact is an artifact creature with power and toughness each equal to its converted mana cost. (Equipment that's a creature can't equip a creature.) -MRD R, 10E R, ARC R - -Marhault Elsdragon -{3}{R}{R}{G} -Legendary Creature - Elf Warrior -4/6 -Rampage 1 (Whenever this creature becomes blocked, it gets +1/+1 until end of turn for each creature blocking it beyond the first.) -LEG U, CHR U, ME3 U - -Marisi's Twinclaws -{2}{R/W}{G} -Creature - Cat Warrior -2/4 -Double strike -ARB U - -Maritime Guard -{1}{U} -Creature - Merfolk Soldier -1/3 -M11 C - -Marjhan -{5}{U}{U} -Creature - Leviathan -8/8 -Marjhan doesn't untap during your untap step. -{U}{U}, Sacrifice a creature: Untap Marjhan. Activate this ability only during your upkeep. -Marjhan can't attack unless defending player controls an Island. -{U}{U}: Marjhan gets -1/-0 until end of turn and deals 1 damage to target attacking creature without flying. -When you control no Islands, sacrifice Marjhan. -HML R, ME2 R - -Mark of Asylum -{1}{W} -Enchantment -Prevent all noncombat damage that would be dealt to creatures you control. -CON R - -Mark of Eviction -{U} -Enchantment - Aura -Enchant creature -At the beginning of your upkeep, return enchanted creature and all Auras attached to that creature to their owners' hands. -RAV U - -Mark of Fury -{R} -Enchantment - Aura -Enchant creature -Enchanted creature has haste. -At the beginning of the end step, return Mark of Fury to its owner's hand. -UDS C - -Mark of Mutiny -{2}{R} -Sorcery -Gain control of target creature until end of turn. Put a +1/+1 counter on it and untap it. That creature gains haste until end of turn. -ZEN U - -Mark of Sakiko -{1}{G} -Enchantment - Aura -Enchant creature -Enchanted creature has "Whenever this creature deals combat damage to a player, add that much {G} to your mana pool. Until end of turn, this mana doesn't empty from your mana pool as steps and phases end." -BOK U - -Mark of the Oni -{2}{B} -Enchantment - Aura -Enchant creature -You control enchanted creature. -At the beginning of the end step, if you control no Demons, sacrifice Mark of the Oni. -BOK U - -Marker Beetles -{1}{G}{G} -Creature - Insect -2/3 -When Marker Beetles dies, target creature gets +1/+1 until end of turn. -{2}, Sacrifice Marker Beetles: Draw a card. -UDS C - -Maro -{2}{G}{G} -Creature - Elemental -*/* -Maro's power and toughness are each equal to the number of cards in your hand. -MIR R, 6ED R, 7ED R, 8ED R, 9ED R - -Maro Avatar -Vanguard -Hand +2, life -7 -Tap an untapped creature you control, Discard a card: Target creature you control gets +X/+X until end of turn, where X is the number of cards in your hand. -VG S - -Marrow Chomper -{3}{B}{G} -Creature - Zombie Lizard -3/3 -Devour 2 (As this enters the battlefield, you may sacrifice any number of creatures. This creature enters the battlefield with twice that many +1/+1 counters on it.) -When Marrow Chomper enters the battlefield, you gain 2 life for each creature it devoured. -ARB U - -Marrow Shards -{W/P} -Instant -({W/P} can be paid with either {W} or 2 life.) -Marrow Shards deals 1 damage to each attacking creature. -NPH U - -Marrow-Gnawer -{3}{B}{B} -Legendary Creature - Rat Rogue -2/3 -Rat creatures have fear. (They can't be blocked except by artifact creatures and/or black creatures.) -{T}, Sacrifice a Rat: Put X 1/1 black Rat creature tokens onto the battlefield, where X is the number of Rats you control. -CHK R - -Marsh Boa -{G} -Creature - Snake -1/1 -Swampwalk -PCY C - -Marsh Casualties -{B}{B} -Sorcery -Kicker {3} (You may pay an additional {3} as you cast this spell.) -Creatures target player controls get -1/-1 until end of turn. If Marsh Casualties was kicked, those creatures get -2/-2 until end of turn instead. -ZEN U - -Marsh Crocodile -{2}{U}{B} -Creature - Crocodile -4/4 -When Marsh Crocodile enters the battlefield, return a blue or black creature you control to its owner's hand. -When Marsh Crocodile enters the battlefield, each player discards a card. -PLS U - -Marsh Flats -Land -{T}, Pay 1 life, Sacrifice Marsh Flats: Search your library for a Plains or Swamp card and put it onto the battlefield. Then shuffle your library. -ZEN R - -Marsh Flitter -{3}{B} -Creature - Faerie Rogue -1/1 -Flying -When Marsh Flitter enters the battlefield, put two 1/1 black Goblin Rogue creature tokens onto the battlefield. -Sacrifice a Goblin: Marsh Flitter becomes 3/3 until end of turn. -LRW U - -Marsh Gas -{B} -Instant -All creatures get -2/-0 until end of turn. -DRK C, 4ED C - -Marsh Goblins -{B}{R} -Creature - Goblin -1/1 -Swampwalk -DRK C - -Marsh Lurker -{3}{B} -Creature - Beast -3/2 -Sacrifice a Swamp: Marsh Lurker gains fear until end of turn. (It can't be blocked except by artifact creatures and/or black creatures.) -TMP C - -Marsh Threader -{1}{W} -Creature - Kor Scout -2/1 -Swampwalk -WWK C - -Marsh Viper -{3}{G} -Creature - Snake -1/2 -Whenever Marsh Viper deals damage to an opponent, that player gets two poison counters. (A player with ten or more poison counters loses the game.) -DRK C, 4ED C, 5ED C - -Marshal's Anthem -{2}{W}{W} -Enchantment -Multikicker {1}{W} (You may pay an additional {1}{W} any number of times as you cast this spell.) -Creatures you control get +1/+1. -When Marshal's Anthem enters the battlefield, return up to X target creature cards from your graveyard to the battlefield, where X is the number of times Marshal's Anthem was kicked. -WWK R - -Marshaling Cry -{1}{W}{W} -Sorcery -Creatures you control get +1/+1 and gain vigilance until end of turn. -Cycling {2} ({2}, Discard this card: Draw a card.) -Flashback {3}{W} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -FUT C - -Marshaling the Troops -{1}{G} -Sorcery -Tap any number of untapped creatures you control. You gain 4 life for each creature tapped this way. -PTK R - -Marshdrinker Giant -{3}{G}{G} -Creature - Giant Warrior -4/3 -When Marshdrinker Giant enters the battlefield, destroy target Island or Swamp an opponent controls. -EVE U - -Martial Coup -{X}{W}{W} -Sorcery -Put X 1/1 white Soldier creature tokens onto the battlefield. If X is 5 or more, destroy all other creatures. -CON R - -Marton Stromgald -{2}{R}{R} -Legendary Creature - Human Knight -1/1 -Whenever Marton Stromgald attacks, other attacking creatures get +1/+1 until end of turn for each attacking creature other than Marton Stromgald. -Whenever Marton Stromgald blocks, other blocking creatures get +1/+1 until end of turn for each blocking creature other than Marton Stromgald. -ICE R, MED R - -Martyr of Ashes -{R} -Creature - Human Shaman -1/1 -{2}, Reveal X red cards from your hand, Sacrifice Martyr of Ashes: Martyr of Ashes deals X damage to each creature without flying. -CSP C - -Martyr of Bones -{B} -Creature - Human Wizard -1/1 -{1}, Reveal X black cards from your hand, Sacrifice Martyr of Bones: Exile up to X target cards from a single graveyard. -CSP C - -Martyr of Frost -{U} -Creature - Human Wizard -1/1 -{2}, Reveal X blue cards from your hand, Sacrifice Martyr of Frost: Counter target spell unless its controller pays {X}. -CSP C, JVC C - -Martyr of Sands -{W} -Creature - Human Cleric -1/1 -{1}, Reveal X white cards from your hand, Sacrifice Martyr of Sands: You gain three times X life. -CSP C - -Martyr of Spores -{G} -Creature - Human Shaman -1/1 -{1}, Reveal X green cards from your hand, Sacrifice Martyr of Spores: Target creature gets +X/+X until end of turn. -CSP C - -Martyr's Bond -{4}{W}{W} -Enchantment -Whenever Martyr's Bond or another nonland permanent you control is put into a graveyard from the battlefield, each opponent sacrifices a permanent that shares a card type with it. -COM R - -Martyr's Cause -{2}{W} -Enchantment -Sacrifice a creature: The next time a source of your choice would deal damage to target creature or player this turn, prevent that damage. -ULG U - -Martyr's Cry -{W}{W} -Sorcery -Exile all white creatures. For each creature exiled this way, its controller draws a card. -DRK R, ME4 R - -Martyrdom -{1}{W}{W} -Instant -Until end of turn, target creature you control gains "{0}: The next 1 damage that would be dealt to target creature or player this turn is dealt to this creature instead." Only you may activate this ability. -ALL C (x2) - -Martyred Rusalka -{W} -Creature - Spirit -1/1 -{W}, Sacrifice a creature: Target creature can't attack this turn. -GPT U - -Martyrs of Korlis -{3}{W}{W} -Creature - Human -1/6 -As long as Martyrs of Korlis is untapped, all damage that would be dealt to you by artifacts is dealt to Martyrs of Korlis instead. -ATQ U, ME4 U - -Martyrs' Tomb -{2}{W}{B} -Enchantment -Pay 2 life: Prevent the next 1 damage that would be dealt to target creature this turn. -APC U - -Masako the Humorless -{2}{W} -Legendary Creature - Human Advisor -2/1 -Flash -Tapped creatures you control can block as though they were untapped. -CHK R - -Mask of Intolerance -{2} -Artifact -At the beginning of each player's upkeep, if there are four or more basic land types among lands that player controls, Mask of Intolerance deals 3 damage to him or her. -APC R - -Mask of Law and Grace -{W} -Enchantment - Aura -Enchant creature -Enchanted creature has protection from black and from red. -UDS C - -Mask of Memory -{2} -Artifact - Equipment -Whenever equipped creature deals combat damage to a player, you may draw two cards. If you do, discard a card. -Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.) -MRD U, HOP U - -Mask of Riddles -{U}{B} -Artifact - Equipment -Equipped creature has fear. (It can't be blocked except by artifact creatures and/or black creatures.) -Whenever equipped creature deals combat damage to a player, you may draw a card. -Equip {2} -ARB U - -Mask of the Mimic -{U} -Instant -As an additional cost to cast Mask of the Mimic, sacrifice a creature. -Search your library for a card with the same name as target nontoken creature and put that card onto the battlefield. Then shuffle your library. -STH U - -Masked Admirers -{2}{G}{G} -Creature - Elf Shaman -3/2 -When Masked Admirers enters the battlefield, draw a card. -Whenever you cast a creature spell, you may pay {G}{G}. If you do, return Masked Admirers from your graveyard to your hand. -LRW R - -Masked Gorgon -{4}{B} -Creature - Gorgon -5/5 -Green creatures and white creatures have protection from Gorgons. -Threshold - Masked Gorgon has protection from green and from white as long as seven or more cards are in your graveyard. -JUD R - -Mass Calcify -{5}{W}{W} -Sorcery -Destroy all nonwhite creatures. -SHM R - -Mass Hysteria -{R} -Enchantment -All creatures have haste. -MRD R - -Mass Polymorph -{5}{U} -Sorcery -Exile all creatures you control, then reveal cards from the top of your library until you reveal that many creature cards. Put all creature cards revealed this way onto the battlefield, then shuffle the rest of the revealed cards into your library. -M11 R - -Mass of Ghouls -{3}{B}{B} -Creature - Zombie Warrior -5/3 -FUT C, 10E C - -Massacre -{2}{B}{B} -Sorcery -If an opponent controls a Plains and you control a Swamp, you may cast Massacre without paying its mana cost. -All creatures get -2/-2 until end of turn. -NEM U - -Massacre Wurm -{3}{B}{B}{B} -Creature - Wurm -6/5 -When Massacre Wurm enters the battlefield, creatures your opponents control get -2/-2 until end of turn. -Whenever a creature an opponent controls dies, that player loses 2 life. -MBS M - -Master Apothecary -{W}{W}{W} -Creature - Human Cleric -2/2 -Tap an untapped Cleric you control: Prevent the next 2 damage that would be dealt to target creature or player this turn. -ODY R - -Master Decoy -{1}{W} -Creature - Human Soldier -1/2 -{W}, {T}: Tap target creature. -TMP C, BRB C, 8ED C, 9ED C - -Master Healer -{4}{W} -Creature - Human Cleric -1/4 -{T}: Prevent the next 4 damage that would be dealt to target creature or player this turn. -UDS R, 7ED R, 8ED R, 9ED R - -Master Splicer -{3}{W} -Creature - Human Artificer -1/1 -When Master Splicer enters the battlefield, put a 3/3 colorless Golem artifact creature token onto the battlefield. -Golem creatures you control get +1/+1. -NPH U - -Master Thief -{2}{U}{U} -Creature - Human Rogue -2/2 -When Master Thief enters the battlefield, gain control of target artifact for as long as you control Master Thief. -M12 U - -Master Transmuter -{3}{U} -Artifact Creature - Human Artificer -1/2 -{U}, {T}, Return an artifact you control to its owner's hand: You may put an artifact card from your hand onto the battlefield. -CON R, ARC R - -Master Warcraft -{2}{R/W}{R/W} -Instant -Cast Master Warcraft only before attackers are declared. -You choose which creatures attack this turn. You choose how each creature blocks this turn. -RAV R, COM R - -Master of Arms -{2}{W} -Creature - Human Soldier -2/2 -First strike -{1}{W}: Tap target creature blocking Master of Arms. -WTH U - -Master of Etherium -{2}{U} -Artifact Creature - Vedalken Wizard -*/* -Master of Etherium's power and toughness are each equal to the number of artifacts you control. -Other artifact creatures you control get +1/+1. -ALA R, HOP R, EVT R - -Master of the Hunt -{2}{G}{G} -Creature - Human -2/2 -{2}{G}{G}: Put a 1/1 green Wolf creature token named Wolves of the Hunt onto the battlefield. It has "bands with other creatures named Wolves of the Hunt." (Any creatures named Wolves of the Hunt can attack in a band as long as at least one has "bands with other creatures named Wolves of the Hunt." Bands are blocked as a group. If at least two creatures named Wolves of the Hunt you control, one of which has "bands with other creatures named Wolves of the Hunt," are blocking or being blocked by the same creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -LEG R - -Master of the Veil -{2}{U}{U} -Creature - Human Wizard -2/3 -Morph {2}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Master of the Veil is turned face up, you may turn target creature with morph face down. -LGN U - -Master of the Wild Hunt -{2}{G}{G} -Creature - Human Shaman -3/3 -At the beginning of your upkeep, put a 2/2 green Wolf creature token onto the battlefield. -{T}: Tap all untapped Wolf creatures you control. Each Wolf tapped this way deals damage equal to its power to target creature. That creature deals damage equal to its power divided as its controller chooses among any number of those Wolves. -M10 M - -Master of the Wild Hunt Avatar -Vanguard -Hand +1, life +3 -{2}{G}: Put a green creature token onto the battlefield that's a 2/2 Wolf, a 2/3 Antelope with forestwalk, a 3/2 Cat with shroud, or a 4/4 green Rhino with trample, chosen at random. -VG S - -Master's Call -{2}{W} -Instant -Put two 1/1 colorless Myr artifact creature tokens onto the battlefield. -MBS C - -Masticore -{4} -Artifact Creature - Masticore -4/4 -At the beginning of your upkeep, sacrifice Masticore unless you discard a card. -{2}: Masticore deals 1 damage to target creature. -{2}: Regenerate Masticore. -UDS R, FVR M - -Masumaro, First to Live -{3}{G}{G}{G} -Legendary Creature - Spirit -*/* -Masumaro, First to Live's power and toughness are each equal to twice the number of cards in your hand. -SOK R - -Matca Rioters -{2}{G} -Creature - Human Warrior -*/* -Domain - Matca Rioters's power and toughness are each equal to the number of basic land types among lands you control. -CON C - -Matopi Golem -{5} -Artifact Creature - Golem -3/3 -{1}: Regenerate Matopi Golem. When it regenerates this way, put a -1/-1 counter on it. -VIS U - -Matsu-Tribe Birdstalker -{2}{G}{G} -Creature - Snake Warrior Archer -2/2 -Whenever Matsu-Tribe Birdstalker deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. -{G}: Matsu-Tribe Birdstalker gains reach until end of turn. (It can block creatures with flying.) -SOK C - -Matsu-Tribe Decoy -{2}{G} -Creature - Snake Warrior -1/3 -{2}{G}: Target creature blocks Matsu-Tribe Decoy this turn if able. -Whenever Matsu-Tribe Decoy deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. -CHK C - -Matsu-Tribe Sniper -{1}{G} -Creature - Snake Warrior Archer -1/1 -{T}: Matsu-Tribe Sniper deals 1 damage to target creature with flying. -Whenever Matsu-Tribe Sniper deals damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. -BOK C - -Maul Splicer -{6}{G} -Creature - Human Artificer -1/1 -When Maul Splicer enters the battlefield, put two 3/3 colorless Golem artifact creature tokens onto the battlefield. -Golem creatures you control have trample. -NPH C - -Mausoleum Turnkey -{3}{B} -Creature - Ogre Rogue -3/2 -When Mausoleum Turnkey enters the battlefield, return target creature card of an opponent's choice from your graveyard to your hand. -RAV U - -Mawcor -{3}{U}{U} -Creature - Beast -3/3 -Flying -{T}: Mawcor deals 1 damage to target creature or player. -TMP R, 7ED R - -May Civilization Collapse -Scheme -When you set this scheme in motion, target opponent chooses self or others. If that player chooses self, he or she sacrifices two lands. If the player chooses others, each of your other opponents sacrifices a land. -ARC C - -Mayael the Anima -{R}{G}{W} -Legendary Creature - Elf Shaman -2/3 -{3}{R}{G}{W}, {T}: Look at the top five cards of your library. You may put a creature card with power 5 or greater from among them onto the battlefield. Put the rest on the bottom of your library in any order. -ALA M - -Mayael the Anima Avatar -Vanguard -Hand +1, life +5 -At the beginning of your upkeep, reveal the top card of your library. If it's a creature card with power 5 or greater, put it into your hand. Otherwise, you may put it on the bottom of your library. -VG S - -Mayael's Aria -{R}{G}{W} -Enchantment -At the beginning of your upkeep, put a +1/+1 counter on each creature you control if you control a creature with power 5 or greater. Then you gain 10 life if you control a creature with power 10 or greater. Then you win the game if you control a creature with power 20 or greater. -ARB R - -Maze of Ith -Land -{T}: Untap target attacking creature. Prevent all combat damage that would be dealt to and dealt by that creature this turn. -DRK U, ME4 R - -Maze of Shadows -Land -{T}: Add {1} to your mana pool. -{T}: Untap target attacking creature with shadow. Prevent all combat damage that would be dealt to and dealt by that creature this turn. -TMP U - -Meadowboon -{2}{W}{W} -Creature - Elemental -3/3 -When Meadowboon leaves the battlefield, put a +1/+1 counter on each creature target player controls. -Evoke {3}{W} (You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield.) -MOR U - -Measure of Wickedness -{3}{B} -Enchantment -At the beginning of your end step, sacrifice Measure of Wickedness and you lose 8 life. -Whenever another card is put into your graveyard from anywhere, target opponent gains control of Measure of Wickedness. -SOK U - -Meddle -{1}{U} -Instant -If target spell has only one target and that target is a creature, change that spell's target to another creature. -MIR U, ONS U - -Meddling Mage -{W}{U} -Creature - Human Wizard -2/2 -As Meddling Mage enters the battlefield, name a nonland card. -The named card can't be cast. -PLS R, ARB R - -Medicine Bag -{3} -Artifact -{1}, {T}, Discard a card: Regenerate target creature. -EXO U - -Medicine Runner -{1}{G/W} -Creature - Elf Cleric -2/1 -When Medicine Runner enters the battlefield, you may remove a counter from target permanent. -SHM C - -Meditate -{2}{U} -Instant -Draw four cards. You skip your next turn. -TMP R - -Meekstone -{1} -Artifact -Creatures with power 3 or greater don't untap during their controllers' untap steps. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, 6ED R, 7ED R - -Megatherium -{2}{G} -Creature - Beast -4/4 -Trample -When Megatherium enters the battlefield, sacrifice it unless you pay {1} for each card in your hand. -MMQ R - -Megatog -{4}{R}{R} -Creature - Atog -3/4 -Sacrifice an artifact: Megatog gets +3/+3 and gains trample until end of turn. -MRD R - -Meglonoth -{3}{R}{G}{W} -Creature - Beast -6/6 -Vigilance, trample -Whenever Meglonoth blocks a creature, Meglonoth deals damage to that creature's controller equal to Meglonoth's power. -CON R - -Megrim -{2}{B} -Enchantment -Whenever an opponent discards a card, Megrim deals 2 damage to that player. -STH U, 7ED U, 8ED U, 9ED U, 10E U, M10 U - -Meishin, the Mind Cage -{4}{U}{U}{U} -Legendary Enchantment -All creatures get -X/-0, where X is the number of cards in your hand. -SOK R - -Melancholy -{2}{B} -Enchantment - Aura -Enchant creature -When Melancholy enters the battlefield, tap enchanted creature. -Enchanted creature doesn't untap during its controller's untap step. -At the beginning of your upkeep, sacrifice Melancholy unless you pay {B}. -PLC C - -Melee -{4}{R} -Instant -Cast Melee only during your turn and only during combat before blockers are declared. -Instead of defending player, you choose how each creature blocks this turn. -Whenever a creature attacks and isn't blocked this turn, untap it and remove it from combat. -ICE U - -Melesse Spirit -{3}{W}{W} -Creature - Angel Spirit -3/3 -Flying, protection from black -MIR U - -Melira's Keepers -{4}{G} -Creature - Human Warrior -4/4 -Melira's Keepers can't have counters placed on it. -MBS U - -Melira, Sylvok Outcast -{1}{G} -Legendary Creature - Human Scout -2/2 -You can't get poison counters. -Creatures you control can't have -1/-1 counters placed on them. -Creatures your opponents control lose infect. -NPH R - -Meloku the Clouded Mirror -{4}{U} -Legendary Creature - Moonfolk Wizard -2/4 -Flying -{1}, Return a land you control to its owner's hand: Put a 1/1 blue Illusion creature token with flying onto the battlefield. -CHK R - -Melt Terrain -{2}{R}{R} -Sorcery -Destroy target land. Melt Terrain deals 2 damage to that land's controller. -SOM C - -Meltdown -{X}{R} -Sorcery -Destroy each artifact with converted mana cost X or less. -USG U - -Melting -{3}{R} -Enchantment -All lands are no longer snow. -ICE U - -Memnarch -{7} -Legendary Artifact Creature - Wizard -4/5 -{1}{U}{U}: Target permanent becomes an artifact in addition to its other types. (This effect lasts indefinitely.) -{3}{U}: Gain control of target artifact. (This effect lasts indefinitely.) -DST R, ARC R - -Memnite -{0} -Artifact Creature - Construct -1/1 -SOM U - -Memoricide -{3}{B} -Sorcery -Name a nonland card. Search target player's graveyard, hand, and library for any number of cards with that name and exile them. Then that player shuffles his or her library. -SOM R - -Memory Crystal -{3} -Artifact -Buyback costs cost {2} less. -EXO R - -Memory Erosion -{1}{U}{U} -Enchantment -Whenever an opponent casts a spell, that player puts the top two cards of his or her library into his or her graveyard. -ALA R, COM R - -Memory Jar -{5} -Artifact -{T}, Sacrifice Memory Jar: Each player exiles all cards from his or her hand face down and draws seven cards. At the beginning of the next end step, each player discards his or her hand and returns to his or her hand each card he or she exiled this way. -ULG R, FVR M - -Memory Lapse -{1}{U} -Instant -Counter target spell. If that spell is countered this way, put it on top of its owner's library instead of into that player's graveyard. -HML C (x2), MIR C, 5ED C, 6ED C, 7ED C - -Memory Plunder -{U/B}{U/B}{U/B}{U/B} -Instant -You may cast target instant or sorcery card from an opponent's graveyard without paying its mana cost. -SHM R - -Memory Sluice -{U/B} -Sorcery -Target player puts the top four cards of his or her library into his or her graveyard. -Conspire (As you cast this spell, you may tap two untapped creatures you control that share a color with it. When you do, copy it and you may choose a new target for the copy.) -SHM C - -Menacing Ogre -{3}{R}{R} -Creature - Ogre -3/3 -Trample, haste -When Menacing Ogre enters the battlefield, each player secretly chooses a number. Then those numbers are revealed. Each player with the highest number loses that much life. If you are one of those players, put two +1/+1 counters on Menacing Ogre. -ONS R, HOP R - -Mending Hands -{W} -Instant -Prevent the next 4 damage that would be dealt to target creature or player this turn. -BOK C, 9ED C - -Meng Huo's Horde -{4}{G} -Creature - Human Soldier -4/5 -PTK C, ME3 C - -Meng Huo, Barbarian King -{3}{G}{G} -Legendary Creature - Human Barbarian Soldier -4/4 -Other green creatures you control get +1/+1. -PTK R, ME3 R - -Mental Discipline -{1}{U}{U} -Enchantment -{1}{U}, Discard a card: Draw a card. -UDS C - -Mental Misstep -{U/P} -Instant -({U/P} can be paid with either {U} or 2 life.) -Counter target spell with converted mana cost 1. -NPH U - -Mental Note -{U} -Instant -Put the top two cards of your library into your graveyard. -Draw a card. -JUD C - -Mephidross Vampire -{4}{B}{B} -Creature - Vampire -3/4 -Flying -Each creature you control is a Vampire in addition to its other creature types and has "Whenever this creature deals damage to a creature, put a +1/+1 counter on this creature." -5DN R - -Mephitic Ooze -{4}{B} -Creature - Ooze -0/5 -Mephitic Ooze gets +1/+0 for each artifact you control. -Whenever Mephitic Ooze deals combat damage to a creature, destroy that creature. The creature can't be regenerated. -DST R - -Mercadia's Downfall -{2}{R} -Instant -Each attacking creature gets +1/+0 until end of turn for each nonbasic land defending player controls. -MMQ U - -Mercadian Atlas -{5} -Artifact -At the beginning of your end step, if you didn't play a land this turn, you may draw a card. -MMQ R - -Mercadian Bazaar -Land -Mercadian Bazaar enters the battlefield tapped. -{T}: Put a storage counter on Mercadian Bazaar. -{T}, Remove any number of storage counters from Mercadian Bazaar: Add {R} to your mana pool for each storage counter removed this way. -MMQ U - -Mercadian Lift -{2} -Artifact -{1}, {T}: Put a winch counter on Mercadian Lift. -{T}, Remove X winch counters from Mercadian Lift: You may put a creature card with converted mana cost X from your hand onto the battlefield. -MMQ R - -Mercenaries -{3}{W} -Creature - Human Mercenary -3/3 -{3}: The next time Mercenaries would deal damage to you this turn, prevent that damage. Any player may activate this ability. -ICE R - -Mercenary Informer -{2}{W} -Creature - Human Rebel Mercenary -2/1 -Mercenary Informer can't be the target of black spells or abilities from black sources. -{2}{W}: Put target nontoken Mercenary on the bottom of its owner's library. -PCY R - -Mercenary Knight -{2}{B} -Creature - Human Mercenary Knight -4/4 -When Mercenary Knight enters the battlefield, sacrifice it unless you discard a creature card. -POR R - -Merchant Scroll -{1}{U} -Sorcery -Search your library for a blue instant card, reveal that card, and put it into your hand. Then shuffle your library. -HML C, 8ED U - -Merchant Ship -{U} -Creature - Human -0/2 -Merchant Ship can't attack unless defending player controls an Island. -Whenever Merchant Ship attacks and isn't blocked, you gain 2 life. -When you control no Islands, sacrifice Merchant Ship. -ARN U - -Merchant of Secrets -{2}{U} -Creature - Human Wizard -1/1 -When Merchant of Secrets enters the battlefield, draw a card. -LGN C, 8ED C - -Mercurial Kite -{3}{U} -Creature - Bird -2/2 -Flying -Whenever Mercurial Kite deals combat damage to a creature, tap that creature. That creature doesn't untap during its controller's next untap step. -SCG C - -Mercy Killing -{2}{G/W} -Instant -Target creature's controller sacrifices it, then puts X 1/1 green and white Elf Warrior creature tokens onto the battlefield, where X is that creature's power. -SHM U - -Merfolk Assassin -{U}{U} -Creature - Merfolk Assassin -1/2 -{T}: Destroy target creature with islandwalk. -DRK U, TSB S - -Merfolk Looter -{1}{U} -Creature - Merfolk Rogue -1/1 -{T}: Draw a card, then discard a card. -EXO C, 7ED U, 10E C, M10 C, M12 C - -Merfolk Mesmerist -{1}{U} -Creature - Merfolk Wizard -1/2 -{U}, {T}: Target player puts the top two cards of his or her library into his or her graveyard. -M12 C - -Merfolk Observer -{1}{U} -Creature - Merfolk Rogue -2/1 -When Merfolk Observer enters the battlefield, look at the top card of target player's library. -ROE C - -Merfolk Raiders -{1}{U} -Creature - Merfolk Soldier -2/3 -Islandwalk -Phasing (This phases in or out before you untap during each of your untap steps. While it's phased out, it's treated as though it doesn't exist.) -MIR C - -Merfolk Seastalkers -{3}{U} -Creature - Merfolk Scout -2/3 -Islandwalk -{2}{U}: Tap target creature without flying. -ZEN U - -Merfolk Seer -{2}{U} -Creature - Merfolk Wizard -2/2 -When Merfolk Seer dies, you may pay {1}{U}. If you do, draw a card. -MIR C - -Merfolk Skyscout -{2}{U}{U} -Creature - Merfolk Scout -2/3 -Flying -Whenever Merfolk Skyscout attacks or blocks, untap target permanent. -ROE U - -Merfolk Sovereign -{1}{U}{U} -Creature - Merfolk -2/2 -Other Merfolk creatures you control get +1/+1. -{T}: Target Merfolk creature is unblockable this turn. -M10 R, M11 R - -Merfolk Spy -{U} -Creature - Merfolk Rogue -1/1 -Islandwalk (This creature is unblockable as long as defending player controls an Island.) -Whenever Merfolk Spy deals combat damage to a player, that player reveals a card at random from his or her hand. -M11 C - -Merfolk Thaumaturgist -{2}{U} -Creature - Merfolk Wizard -1/2 -{T}: Switch target creature's power and toughness until end of turn. -PLC C - -Merfolk Traders -{1}{U} -Creature - Merfolk -1/2 -When Merfolk Traders enters the battlefield, draw a card, then discard a card. -WTH C - -Merfolk Wayfinder -{2}{U} -Creature - Merfolk Scout -1/2 -Flying -When Merfolk Wayfinder enters the battlefield, reveal the top three cards of your library. Put all Island cards revealed this way into your hand and the rest on the bottom of your library in any order. -ZEN U - -Merfolk of the Pearl Trident -{U} -Creature - Merfolk -1/1 -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, POR C, 6ED C, S99 C, S00 C, 7ED C - -Merieke Ri Berit -{W}{U}{B} -Legendary Creature - Human -1/1 -Merieke Ri Berit doesn't untap during your untap step. -{T}: Gain control of target creature for as long as you control Merieke Ri Berit. When Merieke Ri Berit leaves the battlefield or becomes untapped, destroy that creature. It can't be regenerated. -ICE R, TSB S - -Merrow Bonegnawer -{B} -Creature - Merfolk Rogue -1/1 -{T}: Target player exiles a card from his or her graveyard. -Whenever you cast a black spell, you may untap Merrow Bonegnawer. -EVE C - -Merrow Commerce -{1}{U} -Tribal Enchantment - Merfolk -At the beginning of your end step, untap all Merfolk you control. -LRW U - -Merrow Grimeblotter -{3}{U/B} -Creature - Merfolk Wizard -2/2 -{1}{U/B}, {Q}: Target creature gets -2/-0 until end of turn. ({Q} is the untap symbol.) -SHM U - -Merrow Harbinger -{3}{U} -Creature - Merfolk Wizard -2/3 -Islandwalk -When Merrow Harbinger enters the battlefield, you may search your library for a Merfolk card, reveal it, then shuffle your library and put that card on top of it. -LRW U - -Merrow Levitator -{3}{U} -Creature - Merfolk Wizard -2/3 -{T}: Target creature gains flying until end of turn. -Whenever you cast a blue spell, you may untap Merrow Levitator. -EVE C - -Merrow Reejerey -{2}{U} -Creature - Merfolk Soldier -2/2 -Other Merfolk creatures you control get +1/+1. -Whenever you cast a Merfolk spell, you may tap or untap target permanent. -LRW U - -Merrow Wavebreakers -{4}{U} -Creature - Merfolk Soldier -3/3 -{1}{U}, {Q}: Merrow Wavebreakers gains flying until end of turn. ({Q} is the untap symbol.) -SHM C - -Merrow Witsniper -{U} -Creature - Merfolk Rogue -1/1 -When Merrow Witsniper enters the battlefield, target player puts the top card of his or her library into his or her graveyard. -MOR C - -Merseine -{2}{U}{U} -Enchantment - Aura -Enchant creature -Merseine enters the battlefield with three net counters on it. -Enchanted creature doesn't untap during its controller's untap step as long as Merseine has a net counter on it. -Pay enchanted creature's mana cost: Remove a net counter from Merseine. Any player may activate this ability, but only if he or she controls the enchanted creature. -FEM C (x4) - -Mesa Enchantress -{1}{W}{W} -Creature - Human Druid -0/2 -Whenever you cast an enchantment spell, you may draw a card. -PLC R, M10 R, M12 R - -Mesa Falcon -{1}{W} -Creature - Bird -1/1 -Flying -{1}{W}: Mesa Falcon gets +0/+1 until end of turn. -HML C (x2), 5ED C, 6ED C - -Mesa Pegasus -{1}{W} -Creature - Pegasus -1/1 -Flying; banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, MED C - -Mesmeric Fiend -{1}{B} -Creature - Nightmare Horror -1/1 -When Mesmeric Fiend enters the battlefield, target opponent reveals his or her hand and you choose a nonland card from it. Exile that card. -When Mesmeric Fiend leaves the battlefield, return the exiled card to its owner's hand. -TOR C - -Mesmeric Orb -{2} -Artifact -Whenever a permanent becomes untapped, that permanent's controller puts the top card of his or her library into his or her graveyard. -MRD R - -Mesmeric Sliver -{3}{U} -Creature - Sliver -2/2 -All Slivers have "When this permanent enters the battlefield, you may fateseal 1." (To fateseal 1, its controller looks at the top card of an opponent's library, then he or she may put that card on the bottom of that library.) -FUT C - -Mesmeric Trance -{1}{U}{U} -Enchantment -Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -{U}, Discard a card: Draw a card. -ICE R, ME2 R - -Messenger Falcons -{2}{G/U}{W} -Creature - Bird -2/2 -Flying -When Messenger Falcons enters the battlefield, draw a card. -ARB U - -Metal Fatigue -{2}{W} -Instant -Tap all artifacts. -DST C - -Metallic Mastery -{2}{R} -Sorcery -Gain control of target artifact until end of turn. Untap that artifact. It gains haste until end of turn. -MBS U - -Metallic Sliver -{1} -Artifact Creature - Sliver -1/1 -TMP C, H09 C - -Metallurgeon -{1}{W} -Artifact Creature - Human Artificer -1/2 -{W}, {T}: Regenerate target artifact. -ALA U, ARC U - -Metalworker -{3} -Artifact Creature - Construct -1/2 -{T}: Reveal any number of artifact cards in your hand. Add {2} to your mana pool for each card revealed this way. -UDS R - -Metamorphic Wurm -{3}{G}{G} -Creature - Elephant Wurm -3/3 -Threshold - Metamorphic Wurm gets +4/+4 as long as seven or more cards are in your graveyard. -ODY U - -Metamorphose -{1}{U} -Instant -Put target permanent an opponent controls on top of its owner's library. That opponent may put an artifact, creature, enchantment, or land card from his or her hand onto the battlefield. -SCG U - -Metamorphosis -{G} -Sorcery -As an additional cost to cast Metamorphosis, sacrifice a creature. -Add X mana of any one color to your mana pool, where X is one plus the sacrificed creature's converted mana cost. Spend this mana only to cast creature spells. -ARN C, CHR C - -Metathran Aerostat -{2}{U}{U} -Creature - Metathran -2/2 -Flying -{X}{U}: You may put a creature card with converted mana cost X from your hand onto the battlefield. If you do, return Metathran Aerostat to its owner's hand. -INV R - -Metathran Elite -{1}{U}{U} -Creature - Metathran Soldier -2/3 -Metathran Elite is unblockable as long as it's enchanted. -UDS U - -Metathran Soldier -{1}{U} -Creature - Metathran Soldier -1/1 -Metathran Soldier is unblockable. -UDS C - -Metathran Transport -{1}{U}{U} -Creature - Metathran -1/3 -Flying -Metathran Transport can't be blocked by blue creatures. -{U}: Target creature becomes blue until end of turn. -INV U - -Metathran Zombie -{1}{U} -Creature - Metathran Zombie -1/1 -{B}: Regenerate Metathran Zombie. -INV C - -Meteor Crater -Land -{T}: Choose a color of a permanent you control. Add one mana of that color to your mana pool. -PLS R - -Meteor Shower -{X}{X}{R} -Sorcery -Meteor Shower deals X plus 1 damage divided as you choose among any number of target creatures and/or players. -ICE C, ME2 C - -Meteor Storm -{R}{G} -Enchantment -{2}{R}{G}, Discard two cards at random: Meteor Storm deals 4 damage to target creature or player. -INV R - -Metrognome -{4} -Artifact -When a spell or ability an opponent controls causes you to discard Metrognome, put four 1/1 colorless Gnome artifact creature tokens onto the battlefield. -{4}, {T}: Put a 1/1 colorless Gnome artifact creature token onto the battlefield. -USG R - -Michiko Konda, Truth Seeker -{3}{W} -Legendary Creature - Human Advisor -2/2 -Whenever a source an opponent controls deals damage to you, that player sacrifices a permanent. -SOK R - -Midnight Banshee -{3}{B}{B}{B} -Creature - Spirit -5/5 -Wither (This deals damage to creatures in the form of -1/-1 counters.) -At the beginning of your upkeep, put a -1/-1 counter on each nonblack creature. -SHM R - -Midnight Charm -{B} -Instant -Choose one - Midnight Charm deals 1 damage to target creature and you gain 1 life; or target creature gains first strike until end of turn; or tap target creature. -PLC C - -Midnight Covenant -{1}{B} -Enchantment - Aura -Enchant creature -Enchanted creature has "{B}: This creature gets +1/+1 until end of turn." -CHK C - -Midnight Ritual -{X}{2}{B} -Sorcery -Exile X target creature cards from your graveyard. For each creature card exiled this way, put a 2/2 black Zombie creature token onto the battlefield. -MMQ R, 10E R - -Midsummer Revel -{3}{G}{G} -Enchantment -At the beginning of your upkeep, you may put a verse counter on Midsummer Revel. -{G}, Sacrifice Midsummer Revel: Put X 3/3 green Beast creature tokens onto the battlefield, where X is the number of verse counters on Midsummer Revel. -USG R - -Might Sliver -{4}{G} -Creature - Sliver -2/2 -All Sliver creatures get +2/+2. -TSP U, H09 U - -Might Weaver -{1}{G} -Creature - Human Wizard -2/1 -{2}: Target red or white creature gains trample until end of turn. (If the creature would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.) -INV U, 10E U - -Might of Alara -{G} -Instant -Domain - Target creature gets +1/+1 until end of turn for each basic land type among lands you control. -CON C - -Might of Oaks -{3}{G} -Instant -Target creature gets +7/+7 until end of turn. -ULG R, 7ED R, 8ED R, 9ED R, 10E R, M10 R - -Might of Old Krosa -{G} -Instant -Target creature gets +2/+2 until end of turn. If you cast this spell during your main phase, that creature gets +4/+4 until end of turn instead. -TSP U - -Might of the Masses -{G} -Instant -Target creature gets +1/+1 until end of turn for each creature you control. -ROE C - -Might of the Nephilim -{1}{G} -Instant -Target creature gets +2/+2 until end of turn for each of its colors. -DIS U - -Mightstone -{4} -Artifact -Attacking creatures get +1/+0. -ATQ U, ME4 C - -Mighty Emergence -{2}{G} -Enchantment -Whenever a creature with power 5 or greater enters the battlefield under your control, you may put two +1/+1 counters on it. -ALA U - -Mighty Leap -{1}{W} -Instant -Target creature gets +2/+2 and gains flying until end of turn. -M11 C, EVT C, DDG C, M12 C - -Mijae Djinn -{R}{R}{R} -Creature - Djinn -6/3 -Whenever Mijae Djinn attacks, flip a coin. If you lose the flip, remove Mijae Djinn from combat and tap it. -ARN R, 3ED R, ME4 R - -Mikokoro, Center of the Sea -Legendary Land -{T}: Add {1} to your mana pool. -{2}, {T}: Each player draws a card. -SOK R - -Militant Monk -{1}{W}{W} -Creature - Human Monk Cleric -2/1 -Vigilance -{T}: Prevent the next 1 damage that would be dealt to target creature or player this turn. -TOR C - -Militia's Pride -{1}{W} -Tribal Enchantment - Kithkin -Whenever a nontoken creature you control attacks, you may pay {W}. If you do, put a 1/1 white Kithkin Soldier creature token onto the battlefield tapped and attacking. -LRW R - -Millikin -{2} -Artifact Creature - Construct -0/1 -{T}, Put the top card of your library into your graveyard: Add {1} to your mana pool. -ODY U - -Millstone -{2} -Artifact -{2}, {T}: Target player puts the top two cards of his or her library into his or her graveyard. -ATQ U, 3ED R, 4ED R, 5ED R, 6ED R, 7ED R, 8ED R, 9ED R, 10E R - -Mimeofacture -{3}{U} -Sorcery -Replicate {3}{U} (When you cast this spell, copy it for each time you paid its replicate cost. You may choose new targets for the copies.) -Choose target permanent an opponent controls. Search that player's library for a card with the same name and put it onto the battlefield under your control. Then that player shuffles his or her library. -GPT R - -Mimic Vat -{3} -Artifact -Imprint - Whenever a nontoken creature dies, you may exile that card. If you do, return each other card exiled with Mimic Vat to its owner's graveyard. -{3}, {T}: Put a token onto the battlefield that's a copy of the exiled card. It gains haste. Exile it at the beginning of the next end step. -SOM R - -Minamo -Plane - Kamigawa -Whenever a player casts a spell, that player may draw a card. -Whenever you roll {C}, each player may return a blue card from his or her graveyard to his or her hand. -HOP C - -Minamo Scrollkeeper -{1}{U} -Creature - Human Wizard -2/3 -Defender (This creature can't attack.) -Your maximum hand size is increased by one. -SOK C - -Minamo Sightbender -{1}{U} -Creature - Human Wizard -1/2 -{X}, {T}: Target creature with power X or less is unblockable this turn. -BOK U - -Minamo's Meddling -{2}{U}{U} -Instant -Counter target spell. That spell's controller reveals his or her hand, then discards each card with the same name as a card spliced onto that spell. -BOK C - -Minamo, School at Water's Edge -Legendary Land -{T}: Add {U} to your mana pool. -{U}, {T}: Untap target legendary permanent. -CHK R - -Mind Bend -{U} -Instant -Change the text of target permanent by replacing all instances of one color word with another or one basic land type with another. (For example, you may change "nonblack creature" to "nongreen creature" or "forestwalk" to "islandwalk." This effect lasts indefinitely.) -MIR U, 8ED R, 9ED R, 10E R - -Mind Bomb -{U} -Sorcery -Each player may discard up to three cards. Mind Bomb deals damage to each player equal to 3 minus the number of cards he or she discarded this way. -DRK R, 4ED U, 5ED U - -Mind Burst -{1}{B} -Sorcery -Target player discards X cards, where X is one plus the number of cards named Mind Burst in all graveyards. -ODY C - -Mind Control -{3}{U}{U} -Enchantment - Aura -Enchant creature -You control enchanted creature. -M10 U, M11 U, M12 U - -Mind Extraction -{2}{B} -Sorcery -As an additional cost to cast Mind Extraction, sacrifice a creature. -Target player reveals his or her hand and discards all cards of each of the sacrificed creature's colors. -APC C - -Mind Funeral -{1}{U}{B} -Sorcery -Target opponent reveals cards from the top of his or her library until four land cards are revealed. That player puts all cards revealed this way into his or her graveyard. -ARB U - -Mind Games -{U} -Instant -Buyback {2}{U} (You may pay an additional {2}{U} as you cast this spell. If you do, put this card into your hand as it resolves.) -Tap target artifact, creature, or land. -STH C - -Mind Harness -{U} -Enchantment - Aura -Enchant red or green creature -Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -You control enchanted creature. -MIR U - -Mind Knives -{1}{B} -Sorcery -Target opponent discards a card at random. -POR C - -Mind Maggots -{3}{B} -Creature - Insect -2/2 -When Mind Maggots enters the battlefield, discard any number of creature cards. For each card discarded this way, put two +1/+1 counters on Mind Maggots. -EXO U - -Mind Over Matter -{2}{U}{U}{U}{U} -Enchantment -Discard a card: You may tap or untap target artifact, creature, or land. -EXO R - -Mind Peel -{B} -Sorcery -Buyback {2}{B}{B} (You may pay an additional {2}{B}{B} as you cast this spell. If you do, put this card into your hand as it resolves.) -Target player discards a card. -STH U - -Mind Ravel -{2}{B} -Sorcery -Target player discards a card. -Draw a card at the beginning of the next turn's upkeep. -ICE C, 5ED C - -Mind Rot -{2}{B} -Sorcery -Target player discards two cards. -POR C, P02 C, S99 C, 7ED C, 8ED C, 9ED C, 10E C, M10 C, M11 C, M12 C - -Mind Shatter -{X}{B}{B} -Sorcery -Target player discards X cards at random. -MOR R, M10 R - -Mind Slash -{1}{B}{B} -Enchantment -{B}, Sacrifice a creature: Target opponent reveals his or her hand. You choose a card from it. That player discards that card. Activate this ability only any time you could cast a sorcery. -NEM U, 8ED U - -Mind Sludge -{4}{B} -Sorcery -Target player discards a card for each Swamp you control. -TOR U, 8ED U, ZEN U - -Mind Spring -{X}{U}{U} -Sorcery -Draw X cards. -MOR R, M10 R - -Mind Stone -{2} -Artifact -{T}: Add {1} to your mana pool. -{1}, {T}, Sacrifice Mind Stone: Draw a card. -WTH C, 10E U, JVC U - -Mind Swords -{1}{B} -Sorcery -If you control a Swamp, you may sacrifice a creature rather than pay Mind Swords's mana cost. -Each player exiles two cards from his or her hand. -NEM C - -Mind Twist -{X}{B} -Sorcery -Target player discards X cards at random. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, ME3 R - -Mind Unbound -{4}{U}{U} -Enchantment -At the beginning of your upkeep, put a lore counter on Mind Unbound, then draw a card for each lore counter on Mind Unbound. -M12 R - -Mind Warp -{X}{3}{B} -Sorcery -Look at target player's hand and choose X cards from it. That player discards those cards. -ICE U, 5ED U, 6ED U - -Mind Whip -{2}{B}{B} -Enchantment - Aura -Enchant creature -At the beginning of the upkeep of enchanted creature's controller, that player may pay {3}. If he or she doesn't, Mind Whip deals 2 damage to that player and you tap that creature. -ICE R - -Mind's Desire -{4}{U}{U} -Sorcery -Shuffle your library. Then exile the top card of your library. Until end of turn, you may play that card without paying its mana cost. (If it has X in its mana cost, X is 0.) -Storm (When you cast this spell, copy it for each spell cast before it this turn.) -SCG R - -Mind's Eye -{5} -Artifact -Whenever an opponent draws a card, you may pay {1}. If you do, draw a card. -MRD R - -Mindbender Spores -{2}{G} -Creature - Fungus Wall -0/1 -Defender (This creature can't attack.) -Flying -Whenever Mindbender Spores blocks a creature, put four fungus counters on that creature. The creature gains "This creature doesn't untap during your untap step if it has a fungus counter on it" and "At the beginning of your upkeep, remove a fungus counter from this creature." -MIR R - -Mindblaze -{5}{R} -Sorcery -Name a nonland card and choose a number greater than 0. Target player reveals his or her library. If that library contains exactly the chosen number of the named card, Mindblaze deals 8 damage to that player. Then that player shuffles his or her library. -CHK R - -Mindbreak Trap -{2}{U}{U} -Instant - Trap -If an opponent cast three or more spells this turn, you may pay {0} rather than pay Mindbreak Trap's mana cost. -Exile any number of target spells. -ZEN M - -Mindcrank -{2} -Artifact -Whenever an opponent loses life, that player puts that many cards from the top of his or her library into his or her graveyard. (Damage dealt by sources without infect causes loss of life.) -NPH U - -Mindculling -{5}{U} -Sorcery -You draw two cards and target opponent discards two cards. -NPH U - -Mindlash Sliver -{B} -Creature - Sliver -1/1 -All Slivers have "{1}, Sacrifice this permanent: Each player discards a card." -TSP C - -Mindleech Mass -{5}{U}{B}{B} -Creature - Horror -6/6 -Trample -Whenever Mindleech Mass deals combat damage to a player, you may look at that player's hand. If you do, you may cast a nonland card in it without paying that card's mana cost. -RAV R - -Mindless Automaton -{4} -Artifact Creature - Construct -0/0 -Mindless Automaton enters the battlefield with two +1/+1 counters on it. -{1}, Discard a card: Put a +1/+1 counter on Mindless Automaton. -Remove two +1/+1 counters from Mindless Automaton: Draw a card. -EXO R, TSB S - -Mindless Null -{2}{B} -Creature - Zombie -2/2 -Mindless Null can't block unless you control a Vampire. -ZEN C - -Mindlock Orb -{3}{U} -Artifact -Players can't search libraries. -ALA R - -Mindmoil -{4}{R} -Enchantment -Whenever you cast a spell, put the cards in your hand on the bottom of your library in any order, then draw that many cards. -RAV R - -Minds Aglow -{U} -Sorcery -Join forces - Starting with you, each player may pay any amount of mana. Each player draws X cards, where X is the total amount of mana paid this way. -COM R - -Mindslaver -{6} -Legendary Artifact -{4}, {T}, Sacrifice Mindslaver: You control target player during that player's next turn. (You see all cards that player could see and make all decisions for the player.) -MRD R, SOM M - -Mindslicer -{2}{B}{B} -Creature - Horror -4/3 -When Mindslicer dies, each player discards his or her hand. -ODY R, 9ED R - -Mindstab -{5}{B} -Sorcery -Target player discards three cards. -Suspend 4-{B} (Rather than cast this card from your hand, you may pay {B} and exile it with four time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) -TSP C - -Mindstab Thrull -{1}{B}{B} -Creature - Thrull -2/2 -Whenever Mindstab Thrull attacks and isn't blocked, you may sacrifice it. If you do, defending player discards three cards. -FEM C (x3), 5ED C, MED C - -Mindstorm Crown -{3} -Artifact -At the beginning of your upkeep, draw a card if you had no cards in hand at the beginning of this turn. If you had a card in hand, Mindstorm Crown deals 1 damage to you. -MRD U - -Mindwarper -{2}{B}{B} -Creature - Spirit -0/0 -Mindwarper enters the battlefield with three +1/+1 counters on it. -{2}{B}, Remove a +1/+1 counter from Mindwarper: Target player discards a card. Activate this ability only any time you could cast a sorcery. -STH R - -Mindwhip Sliver -{2}{B} -Creature - Sliver -2/2 -All Slivers have "{2}, Sacrifice this permanent: Target player discards a card at random. Activate this ability only any time you could cast a sorcery." -TMP U - -Mindwrack Liege -{3}{U/R}{U/R}{U/R} -Creature - Horror -4/4 -Other blue creatures you control get +1/+1. -Other red creatures you control get +1/+1. -{U/R}{U/R}{U/R}{U/R}: You may put a blue or red creature card from your hand onto the battlefield. -EVE R - -Mine Bearer -{2}{W} -Creature - Human Soldier -1/1 -{T}, Sacrifice Mine Bearer: Destroy target attacking creature. -PCY C - -Mine Excavation -{1}{W} -Sorcery -Return target artifact or enchantment card from a graveyard to its owner's hand. -Conspire (As you cast this spell, you may tap two untapped creatures you control that share a color with it. When you do, copy it and you may choose a new target for the copy.) -SHM C - -Mine Layer -{3}{R} -Creature - Dwarf -1/1 -{1}{R}, {T}: Put a mine counter on target land. -Whenever a land with a mine counter on it becomes tapped, destroy it. -When Mine Layer leaves the battlefield, remove all mine counters from all lands. -ODY R - -Minion Reflector -{5} -Artifact -Whenever a nontoken creature enters the battlefield under your control, you may pay {2}. If you do, put a token that's a copy of that creature onto the battlefield. That token has haste and "At the beginning of the end step, sacrifice this permanent." -ALA R - -Minion of Leshrac -{4}{B}{B}{B} -Creature - Demon Minion -5/5 -Protection from black -At the beginning of your upkeep, Minion of Leshrac deals 5 damage to you unless you sacrifice a creature other than Minion of Leshrac. If Minion of Leshrac deals damage to you this way, tap it. -{T}: Destroy target creature or land. -ICE R, ME2 R - -Minion of Tevesh Szat -{4}{B}{B}{B} -Creature - Demon Minion -4/4 -At the beginning of your upkeep, Minion of Tevesh Szat deals 2 damage to you unless you pay {B}{B}. -{T}: Target creature gets +3/-2 until end of turn. -ICE R, ME4 R - -Minion of the Wastes -{3}{B}{B}{B} -Creature - Minion -*/* -As an additional cost to cast Minion of the Wastes, pay any amount of life. -Trample -Minion of the Wastes's power and toughness are each equal to the life paid as it was cast. -TMP R - -Minions' Murmurs -{2}{B}{B} -Sorcery -You draw X cards and you lose X life, where X is the number of creatures you control. -FUT U - -Minister of Impediments -{2}{W/U} -Creature - Human Advisor -1/1 -({W/U} can be paid with either {W} or {U}.) -{T}: Tap target creature. -DIS C - -Minotaur Explorer -{1}{R} -Creature - Minotaur Scout -3/3 -When Minotaur Explorer enters the battlefield, sacrifice it unless you discard a card at random. -ODY U - -Minotaur Illusionist -{3}{U}{R} -Creature - Minotaur Wizard -3/4 -{1}{U}: Minotaur Illusionist gains shroud until end of turn. (It can't be the target of spells or abilities.) -{R}, Sacrifice Minotaur Illusionist: Minotaur Illusionist deals damage equal to its power to target creature. -APC U - -Minotaur Tactician -{3}{R} -Creature - Minotaur -1/1 -Haste -Minotaur Tactician gets +1/+1 as long as you control a white creature. -Minotaur Tactician gets +1/+1 as long as you control a blue creature. -APC C - -Minotaur Warrior -{2}{R} -Creature - Minotaur Warrior -2/3 -POR C - -Miracle Worker -{W} -Creature - Human Cleric -1/1 -{T}: Destroy target Aura attached to a creature you control. -DRK C - -Miraculous Recovery -{4}{W} -Instant -Return target creature card from your graveyard to the battlefield. Put a +1/+1 counter on it. -VIS U - -Mirari -{5} -Legendary Artifact -Whenever you cast an instant or sorcery spell, you may pay {3}. If you do, copy that spell. You may choose new targets for the copy. -ODY R, TSB S, FVR M - -Mirari's Wake -{3}{G}{W} -Enchantment -Creatures you control get +1/+1. -Whenever you tap a land for mana, add one mana to your mana pool of any type that land produced. -JUD R - -Mire Blight -{B} -Enchantment - Aura -Enchant creature -When enchanted creature is dealt damage, destroy it. -ZEN C - -Mire Boa -{1}{G} -Creature - Snake -2/1 -Swampwalk -{G}: Regenerate Mire Boa. -PLC C - -Mire Kavu -{3}{R} -Creature - Kavu -3/2 -Mire Kavu gets +1/+1 as long as you control a Swamp. -PLS C - -Mire Shade -{1}{B} -Creature - Shade -1/1 -{B}, Sacrifice a Swamp: Put a +1/+1 counter on Mire Shade. Activate this ability only any time you could cast a sorcery. -MIR U - -Mire's Toll -{B} -Sorcery -Target player reveals a number of cards from his or her hand equal to the number of Swamps you control. You choose one of them. That player discards that card. -WWK C - -Miren, the Moaning Well -Legendary Land -{T}: Add {1} to your mana pool. -{3}, {T}, Sacrifice a creature: You gain life equal to the sacrificed creature's toughness. -SOK R - -Mirozel -{3}{U} -Creature - Illusion -2/3 -Flying -When Mirozel becomes the target of a spell or ability, return Mirozel to its owner's hand. -EXO U - -Mirran Crusader -{1}{W}{W} -Creature - Human Knight -2/2 -Double strike, protection from black and from green -MBS R - -Mirran Mettle -{G} -Instant -Target creature gets +2/+2 until end of turn. -Metalcraft - That creature gets +4/+4 until end of turn instead if you control three or more artifacts. -MBS C - -Mirran Spy -{2}{U} -Creature - Drone -1/3 -Flying -Whenever you cast an artifact spell, you may untap target creature. -MBS C - -Mirri -Vanguard -Hand +0, life +5 -If a basic land you control is tapped for mana, it produces mana of a color of your choice instead of any other type. -VG S - -Mirri the Cursed -{2}{B}{B} -Legendary Creature - Vampire Cat -3/2 -Flying, first strike, haste -Whenever Mirri the Cursed deals combat damage to a creature, put a +1/+1 counter on Mirri the Cursed. -PLC R - -Mirri the Cursed Avatar -Vanguard -Hand -2, life -3 -Creatures you control have "{T}: Another target creature gets -1/-1 until end of turn. Put a +1/+1 counter on this creature." -VG S - -Mirri's Guile -{G} -Enchantment -At the beginning of your upkeep, you may look at the top three cards of your library, then put them back in any order. -TMP R - -Mirri, Cat Warrior -{1}{G}{G} -Legendary Creature - Cat Warrior -2/3 -First strike, forestwalk, vigilance (This creature deals combat damage before creatures without first strike, it's unblockable as long as defending player controls a Forest, and attacking doesn't cause this creature to tap.) -EXO R, 10E R - -Mirrodin's Core -Land -{T}: Add {1} to your mana pool. -{T}: Put a charge counter on Mirrodin's Core. -{T}, Remove a charge counter from Mirrodin's Core: Add one mana of any color to your mana pool. -DST U - -Mirror Entity -{2}{W} -Creature - Shapeshifter -1/1 -Changeling (This card is every creature type at all times.) -{X}: Creatures you control become X/X and gain all creature types until end of turn. -LRW R - -Mirror Entity Avatar -Vanguard -Hand +1, life -2 -{X}: Choose a creature type. Until end of turn, creatures you control of the chosen type become X/X and gain all creature types. -VG S - -Mirror Gallery -{5} -Artifact -The "legend rule" doesn't apply. -BOK R - -Mirror Golem -{6} -Artifact Creature - Golem -3/4 -Imprint - When Mirror Golem enters the battlefield, you may exile target card from a graveyard. -Mirror Golem has protection from each of the exiled card's card types. (Artifact, creature, enchantment, instant, land, planeswalker, sorcery, and tribal are card types.) -MRD U - -Mirror Sheen -{1}{U/R}{U/R} -Enchantment -{1}{U/R}{U/R}: Copy target instant or sorcery spell that targets you. You may choose new targets for the copy. -EVE R - -Mirror Strike -{3}{W} -Instant -All combat damage that would be dealt to you this turn by target unblocked creature is dealt to its controller instead. -PCY U - -Mirror Universe -{6} -Artifact -{T}, Sacrifice Mirror Universe: Exchange life totals with target opponent. Activate this ability only during your upkeep. -LEG R, MED R - -Mirror Wall -{3}{U} -Creature - Wall -3/4 -Defender (This creature can't attack.) -{W}: Mirror Wall can attack this turn as though it didn't have defender. -JUD C - -Mirror of Fate -{5} -Artifact -{T}, Sacrifice Mirror of Fate: Choose up to seven face-up exiled cards you own. Exile all the cards from your library, then put the chosen cards on top of your library. -M10 R - -Mirror-Sigil Sergeant -{5}{W} -Creature - Rhino Soldier -4/4 -Trample -At the beginning of your upkeep, if you control a blue permanent, you may put a token that's a copy of Mirror-Sigil Sergeant onto the battlefield. -CON M - -Mirrored Depths -Plane - Karsus -Whenever a player casts a spell, that player flips a coin. If he or she loses the flip, counter that spell. -Whenever you roll {C}, target player reveals the top card of his or her library. If it's a nonland card, you may cast it without paying its mana cost. -HOP P - -Mirrorweave -{2}{W/U}{W/U} -Instant -Each other creature becomes a copy of target nonlegendary creature until end of turn. -SHM R - -Mirrorwood Treefolk -{3}{G} -Creature - Treefolk -2/4 -{2}{R}{W}: The next time damage would be dealt to Mirrorwood Treefolk this turn, that damage is dealt to target creature or player instead. -PLS U - -Mirrorworks -{5} -Artifact -Whenever another nontoken artifact enters the battlefield under your control, you may pay {2}. If you do, put a token that's a copy of that artifact onto the battlefield. -MBS R - -Miscalculation -{1}{U} -Instant -Counter target spell unless its controller pays {2}. -Cycling {2} ({2}, Discard this card: Draw a card.) -ULG C - -Mischievous Poltergeist -{2}{B} -Creature - Spirit -1/1 -Flying -Pay 1 life: Regenerate Mischievous Poltergeist. -WTH U, 6ED U - -Mischievous Quanar -{4}{U} -Creature - Beast -3/3 -{3}{U}{U}: Turn Mischievous Quanar face down. -Morph {1}{U}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Mischievous Quanar is turned face up, copy target instant or sorcery spell. You may choose new targets for that copy. -SCG R - -Misdirection -{3}{U}{U} -Instant -You may exile a blue card from your hand rather than pay Misdirection's mana cost. -Change the target of target spell with a single target. -MMQ R - -Misers' Cage -{3} -Artifact -At the beginning of each opponent's upkeep, if that player has five or more cards in hand, Misers' Cage deals 2 damage to him or her. -MIR R - -Misery Charm -{B} -Instant -Choose one - Destroy target Cleric; or return target Cleric card from your graveyard to your hand; or target player loses 2 life. -ONS C - -Misfortune -{1}{B}{R}{G} -Sorcery -An opponent chooses one - You put a +1/+1 counter on each creature you control and gain 4 life; or you put a -1/-1 counter on each creature that player controls and Misfortune deals 4 damage to him or her. -ALL R - -Misfortune's Gain -{3}{W} -Sorcery -Destroy target creature. Its owner gains 4 life. -PTK C, ME3 C - -Misguided Rage -{2}{R} -Sorcery -Target player sacrifices a permanent. -SCG C - -Mishra -Vanguard -Hand +0, life -3 -If a creature you control would deal damage, it deals double that damage instead. -VG S - -Mishra's Bauble -{0} -Artifact -{T}, Sacrifice Mishra's Bauble: Look at the top card of target player's library. Draw a card at the beginning of the next turn's upkeep. -CSP U - -Mishra's Factory -Land -{T}: Add {1} to your mana pool. -{1}: Mishra's Factory becomes a 2/2 Assembly-Worker artifact creature until end of turn. It's still a land. -{T}: Target Assembly-Worker creature gets +1/+1 until end of turn. -ATQ U, ATQ R (x3), 4ED U, MED U, EVT U - -Mishra's Groundbreaker -{4} -Artifact -{T}, Sacrifice Mishra's Groundbreaker: Target land becomes a 3/3 artifact creature that's still a land. (This effect lasts indefinitely.) -ALL U, ME2 U - -Mishra's Helix -{5} -Artifact -{X}, {T}: Tap X target lands. -USG R - -Mishra's War Machine -{7} -Artifact Creature - Juggernaut -5/5 -Banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -At the beginning of your upkeep, unless you discard a card, tap Mishra's War Machine and it deals 3 damage to you. -ATQ R, 3ED R, 4ED R - -Mishra's Workshop -Land -{T}: Add {3} to your mana pool. Spend this mana only to cast artifact spells. -ATQ R, ME4 R - -Mishra, Artificer Prodigy -{1}{U}{B}{R} -Legendary Creature - Human Artificer -4/4 -Whenever you cast an artifact spell, you may search your graveyard, hand, and/or library for a card with the same name as that spell and put it onto the battlefield. If you search your library this way, shuffle it. -TSP R - -Misinformation -{B} -Instant -Put up to three target cards from an opponent's graveyard on top of his or her library in any order. -ALL U, ME2 U - -Misshapen Fiend -{1}{B} -Creature - Horror Mercenary -1/1 -Flying -MMQ C - -Misstep -{1}{U} -Sorcery -Creatures target player controls don't untap during that player's next untap step. -MMQ C - -Mist Dragon -{4}{U}{U} -Creature - Dragon -4/4 -{0}: Mist Dragon gains flying. (This effect lasts indefinitely.) -{0}: Mist Dragon loses flying. (This effect lasts indefinitely.) -{3}{U}{U}: Mist Dragon phases out. (While it's phased out, it's treated as though it doesn't exist. It phases in before you untap during your next untap step.) -MIR R - -Mist Leopard -{3}{G} -Creature - Cat -3/2 -Shroud (This creature can't be the target of spells or abilities.) -M10 C - -Mist of Stagnation -{3}{U}{U} -Enchantment -Permanents don't untap during their controllers' untap steps. -At the beginning of each player's upkeep, that player chooses a permanent for each card in his or her graveyard, then untaps those permanents. -JUD R - -Mistbind Clique -{3}{U} -Creature - Faerie Wizard -4/4 -Flash -Flying -Champion a Faerie (When this enters the battlefield, sacrifice it unless you exile another Faerie you control. When this leaves the battlefield, that card returns to the battlefield.) -When a Faerie is championed with Mistbind Clique, tap all lands target player controls. -LRW R - -Mistblade Shinobi -{2}{U} -Creature - Human Ninja -1/1 -Ninjutsu {U} ({U}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -Whenever Mistblade Shinobi deals combat damage to a player, you may return target creature that player controls to its owner's hand. -BOK C - -Mistfolk -{U}{U} -Creature - Illusion -1/2 -{U}: Counter target spell that targets Mistfolk. -ICE C - -Mistform Dreamer -{2}{U} -Creature - Illusion -2/1 -Flying -{1}: Mistform Dreamer becomes the creature type of your choice until end of turn. -ONS C - -Mistform Mask -{1}{U} -Enchantment - Aura -Enchant creature -{1}: Enchanted creature becomes the creature type of your choice until end of turn. -ONS C - -Mistform Mutant -{4}{U}{U} -Creature - Illusion Mutant -3/4 -{1}{U}: Choose a creature type other than Wall. Target creature becomes that type until end of turn. -ONS U - -Mistform Seaswift -{3}{U} -Creature - Illusion -3/1 -Flying -{1}: Mistform Seaswift becomes the creature type of your choice until end of turn. -Morph {1}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -LGN C - -Mistform Shrieker -{3}{U}{U} -Creature - Illusion -3/3 -Flying -{1}: Mistform Shrieker becomes the creature type of your choice until end of turn. -Morph {3}{U}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS U - -Mistform Skyreaver -{5}{U}{U} -Creature - Illusion -6/6 -Flying -{1}: Mistform Skyreaver becomes the creature type of your choice until end of turn. -ONS R - -Mistform Sliver -{1}{U} -Creature - Illusion Sliver -1/1 -All Slivers have "{1}: This permanent becomes the creature type of your choice in addition to its other types until end of turn." -LGN C - -Mistform Stalker -{1}{U} -Creature - Illusion -1/1 -{1}: Mistform Stalker becomes the creature type of your choice until end of turn. -{2}{U}{U}: Mistform Stalker gets +2/+2 and gains flying until end of turn. -ONS U - -Mistform Ultimus -{3}{U} -Legendary Creature - Illusion -3/3 -Mistform Ultimus is every creature type (even if this card isn't on the battlefield). -LGN R, TSB S - -Mistform Wakecaster -{4}{U} -Creature - Illusion -2/3 -Flying -{1}: Mistform Wakecaster becomes the creature type of your choice until end of turn. -{2}{U}{U}, {T}: Choose a creature type. Each creature you control becomes that type until end of turn. -LGN U - -Mistform Wall -{2}{U} -Creature - Illusion Wall -1/4 -Mistform Wall has defender as long as it's a Wall. -{1}: Mistform Wall becomes the creature type of your choice until end of turn. -ONS C - -Mistform Warchief -{2}{U} -Creature - Illusion -1/3 -Creature spells you cast that share a creature type with Mistform Warchief cost {1} less to cast. -{T}: Mistform Warchief becomes the creature type of your choice until end of turn. -SCG U - -Mistmeadow Skulk -{1}{W} -Creature - Kithkin Rogue -1/1 -Lifelink, protection from converted mana cost 3 or greater -FUT U, SHM U - -Mistmeadow Witch -{1}{W/U} -Creature - Kithkin Wizard -1/1 -{2}{W}{U}: Exile target creature. Return that card to the battlefield under its owner's control at the beginning of the next end step. -SHM U - -Mistmoon Griffin -{3}{W} -Creature - Griffin -2/2 -Flying -When Mistmoon Griffin dies, exile Mistmoon Griffin, then return the top creature card of your graveyard to the battlefield. -WTH U - -Mistral Charger -{1}{W} -Creature - Pegasus -2/1 -Flying -DIS U - -Mistveil Plains -Land - Plains -({T}: Add {W} to your mana pool.) -Mistveil Plains enters the battlefield tapped. -{W}, {T}: Put target card from your graveyard on the bottom of your library. Activate this ability only if you control two or more white permanents. -SHM U - -Mistvein Borderpost -{1}{U}{B} -Artifact -You may pay {1} and return a basic land you control to its owner's hand rather than pay Mistvein Borderpost's mana cost. -Mistvein Borderpost enters the battlefield tapped. -{T}: Add {U} or {B} to your mana pool. -ARB C, ARC C - -Misty Rainforest -Land -{T}, Pay 1 life, Sacrifice Misty Rainforest: Search your library for a Forest or Island card and put it onto the battlefield. Then shuffle your library. -ZEN R - -Mitotic Manipulation -{1}{U}{U} -Sorcery -Look at the top seven cards of your library. You may put one of those cards onto the battlefield if it has the same name as a permanent. Put the rest on the bottom of your library in any order. -MBS R - -Mitotic Slime -{4}{G} -Creature - Ooze -4/4 -When Mitotic Slime dies, put two 2/2 green Ooze creature tokens onto the battlefield. They have "When this creature dies, put two 1/1 green Ooze creature tokens onto the battlefield." -M11 R - -Mizzium Transreliquat -{3} -Artifact -{3}: Mizzium Transreliquat becomes a copy of target artifact until end of turn. -{1}{U}{R}: Mizzium Transreliquat becomes a copy of target artifact and gains this ability. -GPT R - -Mnemonic Nexus -{3}{U} -Instant -Each player shuffles his or her graveyard into his or her library. -RAV U - -Mnemonic Sliver -{2}{U} -Creature - Sliver -2/2 -All Slivers have "{2}, Sacrifice this permanent: Draw a card." -TMP U - -Mnemonic Wall -{4}{U} -Creature - Wall -0/4 -Defender -When Mnemonic Wall enters the battlefield, you may return target instant or sorcery card from your graveyard to your hand. -ROE C - -Moaning Spirit -{2}{B} -Creature - Spirit -2/1 -Flying -P02 C - -Moat -{2}{W}{W} -Enchantment -Creatures without flying can't attack. -LEG R, MED R - -Mob Justice -{1}{R} -Sorcery -Mob Justice deals damage to target player equal to the number of creatures you control. -STH C - -Mob Mentality -{R} -Enchantment - Aura -Enchant creature -Enchanted creature has trample. -Whenever all non-Wall creatures you control attack, enchanted creature gets +X/+0 until end of turn, where X is the number of attacking creatures. -VIS U - -Mobile Fort -{4} -Artifact Creature - Wall -0/6 -Defender (This creature can't attack.) -{3}: Mobile Fort gets +3/-1 until end of turn and can attack this turn as though it didn't have defender. Activate this ability only once each turn. -USG U - -Mobilization -{2}{W} -Enchantment -Soldier creatures have vigilance. (Attacking doesn't cause them to tap.) -{2}{W}: Put a 1/1 white Soldier creature token onto the battlefield. -ONS R, 10E R - -Mobilize -{G} -Sorcery -Untap all creatures you control. -POR C - -Mogg Alarm -{1}{R}{R} -Sorcery -You may sacrifice two Mountains rather than pay Mogg Alarm's mana cost. -Put two 1/1 red Goblin creature tokens onto the battlefield. -NEM U - -Mogg Assassin -{2}{R} -Creature - Goblin Assassin -2/1 -{T}: You choose target creature an opponent controls, and that opponent chooses target creature. Flip a coin. If you win the flip, destroy the creature you chose. If you lose the flip, destroy the creature your opponent chose. -EXO U - -Mogg Bombers -{3}{R} -Creature - Goblin -3/4 -When another creature enters the battlefield, sacrifice Mogg Bombers. If you do, it deals 3 damage to target player. -STH C - -Mogg Cannon -{2} -Artifact -{T}: Target creature you control gets +1/+0 and gains flying until end of turn. Destroy that creature at the beginning of the next end step. -TMP U - -Mogg Conscripts -{R} -Creature - Goblin -2/2 -Mogg Conscripts can't attack unless you've cast a creature spell this turn. -TMP C - -Mogg Fanatic -{R} -Creature - Goblin -1/1 -Sacrifice Mogg Fanatic: Mogg Fanatic deals 1 damage to target creature or player. -TMP C, 10E U, EVG U, H10 U - -Mogg Flunkies -{1}{R} -Creature - Goblin -3/3 -Mogg Flunkies can't attack or block alone. -STH C, H10 C - -Mogg Hollows -Land -{T}: Add {1} to your mana pool. -{T}: Add {R} or {G} to your mana pool. Mogg Hollows doesn't untap during your next untap step. -TMP U, BRB U - -Mogg Infestation -{3}{R}{R} -Sorcery -Destroy all creatures target player controls. For each creature that died this way, put two 1/1 red Goblin creature tokens onto the battlefield under that player's control. -STH R - -Mogg Jailer -{1}{R} -Creature - Goblin -2/2 -Mogg Jailer can't attack if defending player controls an untapped creature with power 2 or less. -PLS U - -Mogg Maniac -{1}{R} -Creature - Goblin -1/1 -Whenever Mogg Maniac is dealt damage, it deals that much damage to target opponent. -STH U - -Mogg Raider -{R} -Creature - Goblin -1/1 -Sacrifice a Goblin: Target creature gets +1/+1 until end of turn. -TMP C - -Mogg Salvage -{2}{R} -Instant -If an opponent controls an Island and you control a Mountain, you may cast Mogg Salvage without paying its mana cost. -Destroy target artifact. -NEM U - -Mogg Sentry -{R} -Creature - Goblin Warrior -1/1 -Whenever an opponent casts a spell, Mogg Sentry gets +2/+2 until end of turn. -PLS R, 8ED R, 9ED R - -Mogg Squad -{1}{R} -Creature - Goblin -3/3 -Mogg Squad gets -1/-1 for each other creature on the battlefield. -TMP U - -Mogg Toady -{1}{R} -Creature - Goblin -2/2 -Mogg Toady can't attack unless you control more creatures than defending player. -Mogg Toady can't block unless you control more creatures than attacking player. -NEM C - -Mogg War Marshal -{1}{R} -Creature - Goblin Warrior -1/1 -Echo {1}{R} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -When Mogg War Marshal enters the battlefield or dies, put a 1/1 red Goblin creature token onto the battlefield. -TSP C, EVG C - -Moggcatcher -{2}{R}{R} -Creature - Human Mercenary -2/2 -{3}, {T}: Search your library for a Goblin permanent card and put it onto the battlefield. Then shuffle your library. -NEM R - -Mold Adder -{G} -Creature - Fungus Snake -1/1 -Whenever an opponent casts a blue or black spell, you may put a +1/+1 counter on Mold Adder. -M10 U - -Mold Demon -{5}{B}{B} -Creature - Fungus Demon -6/6 -When Mold Demon enters the battlefield, sacrifice it unless you sacrifice two Swamps. -LEG R - -Mold Shambler -{3}{G} -Creature - Fungus Beast -3/3 -Kicker {1}{G} (You may pay an additional {1}{G} as you cast this spell.) -When Mold Shambler enters the battlefield, if it was kicked, destroy target noncreature permanent. -ZEN C - -Molder -{X}{G} -Instant -Destroy target artifact or enchantment with converted mana cost X. It can't be regenerated. You gain X life. -TSP C - -Molder Beast -{4}{G} -Creature - Beast -5/3 -Trample -Whenever an artifact is put into a graveyard from the battlefield, Molder Beast gets +2/+0 until end of turn. -SOM C - -Molder Slug -{3}{G}{G} -Creature - Slug Beast -4/6 -At the beginning of each player's upkeep, that player sacrifices an artifact. -MRD R - -Moldervine Cloak -{2}{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +3/+3. -Dredge 2 (If you would draw a card, instead you may put exactly two cards from the top of your library into your graveyard. If you do, return this card from your graveyard to your hand. Otherwise, draw a card.) -RAV U - -Mole Worms -{2}{B} -Creature - Worm -1/1 -You may choose not to untap Mole Worms during your untap step. -{T}: Tap target land. It doesn't untap during its controller's untap step for as long as Mole Worms remains tapped. -ICE U, 5ED U - -Molimo, Maro-Sorcerer -{4}{G}{G}{G} -Legendary Creature - Elemental -*/* -Trample (If this creature would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.) -Molimo, Maro-Sorcerer's power and toughness are each equal to the number of lands you control. -INV R, 10E R, ARC R - -Molten Disaster -{X}{R}{R} -Sorcery -Kicker {R} (You may pay an additional {R} as you cast this spell.) -If Molten Disaster was kicked, it has split second. (As long as this spell is on the stack, players can't cast spells or activate abilities that aren't mana abilities.) -Molten Disaster deals X damage to each creature without flying and each player. -FUT R - -Molten Firebird -{4}{R} -Creature - Phoenix -2/2 -Flying -When Molten Firebird dies, return it to the battlefield under its owner's control at the beginning of the next end step and you skip your next draw step. -{4}{R}: Exile Molten Firebird. -PLC R - -Molten Frame -{1}{R} -Instant -Destroy target artifact creature. -Cycling {2} ({2}, Discard this card: Draw a card.) -CON C - -Molten Hydra -{1}{R} -Creature - Hydra -1/1 -{1}{R}{R}: Put a +1/+1 counter on Molten Hydra. -{T}, Remove all +1/+1 counters from Molten Hydra: Molten Hydra deals damage to target creature or player equal to the number of +1/+1 counters removed this way. -ULG R - -Molten Influence -{1}{R} -Instant -Counter target instant or sorcery spell unless its controller has Molten Influence deal 4 damage to him or her. -ODY R - -Molten Psyche -{1}{R}{R} -Sorcery -Each player shuffles the cards from his or her hand into his or her library, then draws that many cards. -Metalcraft - If you control three or more artifacts, Molten Psyche deals damage to each opponent equal to the number of cards that player has drawn this turn. -SOM R - -Molten Rain -{1}{R}{R} -Sorcery -Destroy target land. If that land was nonbasic, Molten Rain deals 2 damage to the land's controller. -MRD C - -Molten Ravager -{2}{R} -Creature - Elemental -0/4 -{R}: Molten Ravager gets +1/+0 until end of turn. -ZEN C - -Molten Sentry -{3}{R} -Creature - Elemental -*/* -As Molten Sentry enters the battlefield, flip a coin. If the coin comes up heads, Molten Sentry enters the battlefield as a 5/2 creature with haste. If it comes up tails, Molten Sentry enters the battlefield as a 2/5 creature with defender. -RAV R - -Molten Slagheap -Land -{T}: Add {1} to your mana pool. -{1}, {T}: Put a storage counter on Molten Slagheap. -{1}, Remove X storage counters from Molten Slagheap: Add X mana in any combination of {B} and/or {R} to your mana pool. -TSP U, COM U - -Molten-Tail Masticore -{4} -Artifact Creature - Masticore -4/4 -At the beginning of your upkeep, sacrifice Molten-Tail Masticore unless you discard a card. -{4}, Exile a creature card from your graveyard: Molten-Tail Masticore deals 4 damage to target creature or player. -{2}: Regenerate Molten-Tail Masticore. -SOM M - -Moltensteel Dragon -{4}{R/P}{R/P} -Artifact Creature - Dragon -4/4 -({R/P} can be paid with either {R} or 2 life.) -Flying -{R/P}: Moltensteel Dragon gets +1/+0 until end of turn. -NPH R - -Molting Harpy -{B} -Creature - Harpy Mercenary -2/1 -Flying -At the beginning of your upkeep, sacrifice Molting Harpy unless you pay {2}. -MMQ U - -Molting Skin -{2}{G} -Enchantment -Return Molting Skin to its owner's hand: Regenerate target creature. -SOK U - -Moment of Silence -{W} -Instant -Target player skips his or her next combat phase this turn. -MMQ C - -Moment's Peace -{1}{G} -Instant -Prevent all combat damage that would be dealt this turn. -Flashback {2}{G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY C - -Momentary Blink -{1}{W} -Instant -Exile target creature you control, then return it to the battlefield under its owner's control. -Flashback {3}{U} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -TSP C - -Momentous Fall -{2}{G}{G} -Instant -As an additional cost to cast Momentous Fall, sacrifice a creature. -You draw cards equal to the sacrificed creature's power, then you gain life equal to its toughness. -ROE R - -Momentum -{2}{G} -Enchantment - Aura -Enchant creature -At the beginning of your upkeep, you may put a growth counter on Momentum. -Enchanted creature gets +1/+1 for each growth counter on Momentum. -UDS U - -Momir Vig, Simic Visionary -{3}{G}{U} -Legendary Creature - Elf Wizard -2/2 -Whenever you cast a green creature spell, you may search your library for a creature card and reveal it. If you do, shuffle your library and put that card on top of it. -Whenever you cast a blue creature spell, reveal the top card of your library. If it's a creature card, put that card into your hand. -DIS R - -Momir Vig, Simic Visionary Avatar -Vanguard -Hand +0, life +4 -{X}, Discard a card: Put a token onto the battlefield that's a copy of a creature card with converted mana cost X chosen at random. Activate this ability only any time you could cast a sorcery and only once each turn. -VG S - -Mongrel Pack -{3}{G} -Creature - Hound -4/1 -When Mongrel Pack dies during combat, put four 1/1 green Hound creature tokens onto the battlefield. -TMP R - -Monk Idealist -{2}{W} -Creature - Human Monk Cleric -2/2 -When Monk Idealist enters the battlefield, return target enchantment card from your graveyard to your hand. -USG U - -Monk Realist -{1}{W} -Creature - Human Monk Cleric -1/1 -When Monk Realist enters the battlefield, destroy target enchantment. -USG C, COM C - -Monkey Cage -{5} -Artifact -When a creature enters the battlefield, sacrifice Monkey Cage and put X 2/2 green Ape creature tokens onto the battlefield, where X is that creature's converted mana cost. -MMQ R - -Monomania -{3}{B}{B} -Sorcery -Target player chooses a card in his or her hand and discards the rest. -M12 R - -Mons's Goblin Raiders -{R} -Creature - Goblin -1/1 -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, S99 R, S00 C - -Monsoon -{2}{R}{G} -Enchantment -At the beginning of each player's end step, tap all untapped Islands that player controls and Monsoon deals X damage to the player, where X is the number of Islands tapped this way. -ICE R - -Monstrify -{3}{G} -Sorcery -Target creature gets +4/+4 until end of turn. -Retrace (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) -EVE C - -Monstrous Carabid -{3}{B}{R} -Creature - Insect -4/4 -Monstrous Carabid attacks each turn if able. -Cycling {B/R} ({B/R}, Discard this card: Draw a card.) -ARB C - -Monstrous Growth -{1}{G} -Sorcery -Target creature gets +4/+4 until end of turn. -POR C (x2), P02 C, S99 C, S00 C, 7ED C, 8ED C - -Monstrous Hound -{3}{R} -Creature - Hound -4/4 -Monstrous Hound can't attack unless you control more lands than defending player. -Monstrous Hound can't block unless you control more lands than attacking player. -PRO R, EXO R - -Moon Sprite -{1}{G} -Creature - Faerie -1/1 -Flying -POR U, S99 U, S00 U - -Moonbow Illusionist -{2}{U} -Creature - Moonfolk Wizard -2/1 -Flying -{2}, Return a land you control to its owner's hand: Target land becomes the basic land type of your choice until end of turn. -SOK C - -Moonglove Changeling -{2}{B} -Creature - Shapeshifter -2/2 -Changeling (This card is every creature type at all times.) -{B}: Moonglove Changeling gains deathtouch until end of turn. (Any amount of damage it deals to a creature is enough to destroy that creature.) -MOR C - -Moonglove Extract -{3} -Artifact -Sacrifice Moonglove Extract: Moonglove Extract deals 2 damage to target creature or player. -LRW C, EVG C, EVT C - -Moonglove Winnower -{3}{B} -Creature - Elf Rogue -2/3 -Deathtouch (Any amount of damage this deals to a creature is enough to destroy it.) -LRW C - -Moonhold -{2}{R/W} -Instant -Target player can't play land cards this turn if {R} was spent to cast Moonhold and can't play creature cards this turn if {W} was spent to cast it. (Do both if {R}{W} was spent.) -EVE U - -Moonlace -{U} -Instant -Target spell or permanent becomes colorless. -TSP R - -Moonlight Bargain -{3}{B}{B} -Instant -Look at the top five cards of your library. For each card, put that card into your graveyard unless you pay 2 life. Then put the rest into your hand. -RAV R - -Moonlit Strider -{3}{W} -Creature - Spirit -1/4 -Sacrifice Moonlit Strider: Target creature you control gains protection from the color of your choice until end of turn. -Soulshift 3 (When this creature dies, you may return target Spirit card with converted mana cost 3 or less from your graveyard to your hand.) -BOK C - -Moonlit Wake -{2}{W} -Enchantment -Whenever a creature dies, you gain 1 life. -MMQ U - -Moonring Island -Land - Island -({T}: Add {U} to your mana pool.) -Moonring Island enters the battlefield tapped. -{U}, {T}: Look at the top card of target player's library. Activate this ability only if you control two or more blue permanents. -SHM U - -Moonring Mirror -{5} -Artifact -Whenever you draw a card, exile the top card of your library face down. -At the beginning of your upkeep, you may exile all cards from your hand face down. If you do, put all other cards you own exiled with Moonring Mirror into your hand. -CHK R - -Moonwing Moth -{1}{W}{W} -Creature - Insect -2/1 -Flying -{W}: Moonwing Moth gets +0/+1 until end of turn. -SOK C - -Moor Fiend -{3}{B} -Creature - Horror -3/3 -Swampwalk -ICE C - -Moorish Cavalry -{2}{W}{W} -Creature - Human Knight -3/3 -Trample -ARN C (x2), TSB S - -Morale -{1}{W}{W} -Instant -Attacking creatures get +1/+1 until end of turn. -DRK C, 4ED C - -Morality Shift -{5}{B}{B} -Sorcery -Exchange your graveyard and library. Then shuffle your library. -JUD R - -Moratorium Stone -{1} -Artifact -{2}, {T}: Exile target card from a graveyard. -{2}{W}{B}, {T}, Sacrifice Moratorium Stone: Exile target nonland card from a graveyard, all other cards from graveyards with the same name as that card, and all permanents with that name. -GPT R - -Morbid Bloom -{4}{B}{G} -Sorcery -Exile target creature card from a graveyard, then put X 1/1 green Saproling creature tokens onto the battlefield, where X is the exiled card's toughness. -ARB U - -Morbid Hunger -{4}{B}{B} -Sorcery -Morbid Hunger deals 3 damage to target creature or player. You gain 3 life. -Flashback {7}{B}{B} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY C - -Morbid Plunder -{1}{B}{B} -Sorcery -Return up to two target creature cards from your graveyard to your hand. -MBS C - -Mordant Dragon -{3}{R}{R}{R} -Creature - Dragon -5/5 -Flying -{1}{R}: Mordant Dragon gets +1/+0 until end of turn. -Whenever Mordant Dragon deals combat damage to a player, you may have it deal that much damage to target creature that player controls. -WWK R, DDG R - -Morgue Theft -{1}{B} -Sorcery -Return target creature card from your graveyard to your hand. -Flashback {4}{B} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY C - -Morgue Thrull -{2}{B} -Creature - Thrull -2/2 -Sacrifice Morgue Thrull: Put the top three cards of your library into your graveyard. -STH C - -Morgue Toad -{2}{B} -Creature - Frog -2/2 -Sacrifice Morgue Toad: Add {U}{R} to your mana pool. -PLS C - -Morinfen -{3}{B}{B} -Legendary Creature - Horror -5/4 -Flying -Cumulative upkeep-Pay 1 life. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -WTH R - -Morinfen Avatar -Vanguard -Hand +0, life +30 -At the beginning of your upkeep, you lose 1 life for each permanent you control. -VG S - -Moriok Reaver -{2}{B} -Creature - Human Warrior -3/2 -SOM C - -Moriok Replica -{3} -Artifact Creature - Warrior -2/2 -{1}{B}, Sacrifice Moriok Replica: You draw two cards and lose 2 life. -SOM C - -Moriok Rigger -{2}{B} -Creature - Human Rogue Rigger -2/2 -Whenever an artifact is put into a graveyard from the battlefield, you may put a +1/+1 counter on Moriok Rigger. -5DN R - -Moriok Scavenger -{3}{B} -Creature - Human Rogue -2/3 -When Moriok Scavenger enters the battlefield, you may return target artifact creature card from your graveyard to your hand. -MRD C - -Morningtide -{1}{W} -Sorcery -Exile all cards from all graveyards. -TOR R - -Moroii -{2}{U}{B} -Creature - Vampire -4/4 -Flying -At the beginning of your upkeep, you lose 1 life. -RAV U - -Morphling -{3}{U}{U} -Creature - Shapeshifter -3/3 -{U}: Untap Morphling. -{U}: Morphling gains flying until end of turn. -{U}: Morphling gains shroud until end of turn. (It can't be the target of spells or abilities.) -{1}: Morphling gets +1/-1 until end of turn. -{1}: Morphling gets -1/+1 until end of turn. -USG R - -Morsel Theft -{2}{B}{B} -Tribal Sorcery - Rogue -Prowl {1}{B} (You may cast this for its prowl cost if you dealt combat damage to a player this turn with a Rogue.) -Target player loses 3 life and you gain 3 life. If Morsel Theft's prowl cost was paid, draw a card. -MOR C - -Morselhoarder -{4}{R/G}{R/G} -Creature - Elemental -6/4 -Morselhoarder enters the battlefield with two -1/-1 counters on it. -Remove a -1/-1 counter from Morselhoarder: Add one mana of any color to your mana pool. -SHM C - -Mortal Combat -{2}{B}{B} -Enchantment -At the beginning of your upkeep, if twenty or more creature cards are in your graveyard, you win the game. -TOR R, 10E R - -Mortal Flesh Is Weak -Scheme -When you set this scheme in motion, each opponent's life total becomes the lowest life total among your opponents. -ARC C - -Mortal Wound -{G} -Enchantment - Aura -Enchant creature -When enchanted creature is dealt damage, destroy it. -VIS C - -Mortarpod -{2} -Artifact - Equipment -Living weapon (When this Equipment enters the battlefield, put a 0/0 black Germ creature token onto the battlefield, then attach this to it.) -Equipped creature gets +0/+1 and has "Sacrifice this creature: This creature deals 1 damage to target creature or player." -Equip {2} -MBS U - -Mortician Beetle -{B} -Creature - Insect -1/1 -Whenever a player sacrifices a creature, you may put a +1/+1 counter on Mortician Beetle. -ROE R - -Mortify -{1}{W}{B} -Instant -Destroy target creature or enchantment. -GPT U, COM U - -Mortipede -{3}{B} -Creature - Insect -4/1 -{2}{G}: All creatures able to block Mortipede this turn do so. -RAV C - -Mortiphobia -{1}{B}{B} -Enchantment -{1}{B}, Discard a card: Exile target card from a graveyard. -{1}{B}, Sacrifice Mortiphobia: Exile target card from a graveyard. -TOR U - -Mortis Dogs -{3}{B} -Creature - Hound -2/2 -Whenever Mortis Dogs attacks, it gets +2/+0 until end of turn. -When Mortis Dogs dies, target player loses life equal to its power. -NPH C - -Mortivore -{2}{B}{B} -Creature - Lhurgoyf -*/* -Mortivore's power and toughness are each equal to the number of creature cards in all graveyards. -{B}: Regenerate Mortivore. -ODY R, 9ED R, 10E R, COM R - -Mortuary -{3}{B} -Enchantment -Whenever a creature is put into your graveyard from the battlefield, put that card on top of your library. -STH R - -Mosquito Guard -{W} -Creature - Kithkin Soldier -1/1 -First strike -Reinforce 1-{1}{W} ({1}{W}, Discard this card: Put a +1/+1 counter on target creature.) -MOR C, EVT C - -Moss Diamond -{2} -Artifact -Moss Diamond enters the battlefield tapped. -{T}: Add {G} to your mana pool. -MIR U, 6ED U, 7ED U - -Moss Kami -{5}{G} -Creature - Spirit -5/5 -Trample -CHK C - -Moss Monster -{3}{G}{G} -Creature - Elemental -3/6 -LEG C, 8ED C - -Mossbridge Troll -{5}{G}{G} -Creature - Troll -5/5 -If Mossbridge Troll would be destroyed, regenerate it. -Tap any number of untapped creatures you control other than Mossbridge Troll with total power 10 or greater: Mossbridge Troll gets +20/+20 until end of turn. -SHM R - -Mossdog -{G} -Creature - Plant Hound -1/1 -Whenever Mossdog becomes the target of a spell or ability an opponent controls, put a +1/+1 counter on Mossdog. -NEM C - -Mossfire Egg -{1} -Artifact -{2}, {T}, Sacrifice Mossfire Egg: Add {R}{G} to your mana pool. Draw a card. -ODY U - -Mossfire Valley -Land -{1}, {T}: Add {R}{G} to your mana pool. -ODY R - -Mosstodon -{4}{G} -Creature - Plant Elephant -5/3 -{1}: Target creature with power 5 or greater gains trample until end of turn. -ALA C - -Mosswort Bridge -Land -Hideaway (This land enters the battlefield tapped. When it does, look at the top four cards of your library, exile one face down, then put the rest on the bottom of your library.) -{T}: Add {G} to your mana pool. -{G}, {T}: You may play the exiled card without paying its mana cost if creatures you control have total power 10 or greater. -LRW R, ARC R - -Mothdust Changeling -{U} -Creature - Shapeshifter -1/1 -Changeling (This card is every creature type at all times.) -Tap an untapped creature you control: Mothdust Changeling gains flying until end of turn. -MOR C - -Mother of Runes -{W} -Creature - Human Cleric -1/1 -{T}: Target creature you control gains protection from the color of your choice until end of turn. -ULG U, COM U - -Mothrider Samurai -{3}{W} -Creature - Human Samurai -2/2 -Flying -Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -CHK C - -Mountain -Basic Land - Mountain -R -LEA L (x2), LEB L (x3), 2ED L (x3), ARN C, 3ED L (x3), 4ED L (x3), ICE L (x3), MIR L (x4), 5ED L (x4), POR L (x4), TMP L (x4), P02 L (x3), UGL C, USG L (x4), 6ED L (x4), PTK L (x3), S99 L (x4), MMQ L (x4), BRB L (x9), S00 L (x2), INV L (x4), BTD L (x3), 7ED L (x4), ODY L (x4), ONS L (x4), 8ED L (x4), MRD L (x4), CHK L (x4), UNH L, 9ED L (x4), RAV L (x4), TSP L (x4), 10E L (x4), MED L (x3), LRW L (x4), EVG L (x4), SHM L (x4), ALA L (x4), JVC L (x4), M10 L (x4), HOP L (x9), ME3 L (x3), ZEN L (x8), H09 L, PVC L, ROE L (x4), ARC L (x3), M11 L (x4), SOM L (x4), H10 L (x4), MBS L (x2), DDG L (x4), NPH L (x2), COM L (x4), M12 L (x4) - -Mountain Bandit -{R} -Creature - Human Soldier Rogue -1/1 -Haste -PTK C - -Mountain Goat -{R} -Creature - Goat -1/1 -Mountainwalk -ICE C, 5ED C, POR U, 6ED C - -Mountain Stronghold -Land -Red legendary creatures you control have "bands with other legendary creatures." (Any legendary creatures can attack in a band as long as at least one has "bands with other legendary creatures." Bands are blocked as a group. If at least two legendary creatures you control, one of which has "bands with other legendary creatures," are blocking or being blocked by the same creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -LEG U - -Mountain Titan -{2}{B}{R} -Creature - Giant -2/2 -{1}{R}{R}: Until end of turn, whenever you cast a black spell, put a +1/+1 counter on Mountain Titan. -ICE R - -Mountain Valley -Land -Mountain Valley enters the battlefield tapped. -{T}, Sacrifice Mountain Valley: Search your library for a Mountain or Forest card and put it onto the battlefield. Then shuffle your library. -MIR U - -Mountain Yeti -{2}{R}{R} -Creature - Yeti -3/3 -Mountainwalk, protection from white -LEG U, CHR C, MED C - -Mounted Archers -{3}{W} -Creature - Human Soldier Archer -2/3 -Reach (This creature can block creatures with flying.) -{W}: Mounted Archers can block an additional creature this turn. -TMP C - -Mourner's Shield -{4} -Artifact -Imprint - When Mourner's Shield enters the battlefield, you may exile target card from a graveyard. -{2}, {T}: Prevent all damage that would be dealt this turn by a source of your choice that shares a color with the exiled card. -MRD U - -Mournful Zombie -{2}{B} -Creature - Zombie -2/1 -{W}, {T}: Target player gains 1 life. -APC C - -Mourning -{1}{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets -2/-0. -{B}: Return Mourning to its owner's hand. -INV C - -Mourning Thrull -{1}{W/B} -Creature - Thrull -1/1 -({W/B} can be paid with either {W} or {B}.) -Flying -Whenever Mourning Thrull deals damage, you gain that much life. -GPT C - -Mournwhelk -{6}{B} -Creature - Elemental -3/3 -When Mournwhelk enters the battlefield, target player discards two cards. -Evoke {3}{B} (You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield.) -LRW C - -Mouth of Ronom -Snow Land -{T}: Add {1} to your mana pool. -{4}{S}, {T}, Sacrifice Mouth of Ronom: Mouth of Ronom deals 4 damage to target creature. ({S} can be paid with one mana from a snow permanent.) -CSP U - -Mox Diamond -{0} -Artifact -If Mox Diamond would enter the battlefield, you may discard a land card instead. If you do, put Mox Diamond onto the battlefield. If you don't, put it into its owner's graveyard. -{T}: Add one mana of any color to your mana pool. -STH R, FVR M - -Mox Emerald -{0} -Artifact -{T}: Add {G} to your mana pool. -LEA R, LEB R, 2ED R - -Mox Jet -{0} -Artifact -{T}: Add {B} to your mana pool. -LEA R, LEB R, 2ED R - -Mox Opal -{0} -Legendary Artifact -Metalcraft - {T}: Add one mana of any color to your mana pool. Activate this ability only if you control three or more artifacts. -SOM M - -Mox Pearl -{0} -Artifact -{T}: Add {W} to your mana pool. -LEA R, LEB R, 2ED R - -Mox Ruby -{0} -Artifact -{T}: Add {R} to your mana pool. -LEA R, LEB R, 2ED R - -Mox Sapphire -{0} -Artifact -{T}: Add {U} to your mana pool. -LEA R, LEB R, 2ED R - -Mtenda Griffin -{3}{W} -Creature - Griffin -2/2 -Flying -{W}, {T}: Return Mtenda Griffin to its owner's hand and return target Griffin card from your graveyard to your hand. Activate this ability only during your upkeep. -MIR U - -Mtenda Herder -{W} -Creature - Human Scout -1/1 -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -MIR C - -Mtenda Lion -{G} -Creature - Cat -2/1 -Whenever Mtenda Lion attacks, defending player may pay {U}. If that player does, prevent all combat damage that would be dealt by Mtenda Lion this turn. -MIR C - -Muck Drubb -{3}{B}{B} -Creature - Beast -3/3 -Flash (You may cast this spell any time you could cast an instant.) -When Muck Drubb enters the battlefield, change the target of target spell that targets only a single creature to Muck Drubb. -Madness {2}{B} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -PLC U - -Muck Rats -{B} -Creature - Rat -1/1 -POR C, P02 C, S99 C - -Mudbrawler Cohort -{1}{R} -Creature - Goblin Warrior -1/1 -Haste -Mudbrawler Cohort gets +1/+1 as long as you control another red creature. -SHM C - -Mudbrawler Raiders -{2}{R/G}{R/G} -Creature - Goblin Warrior -3/3 -Mudbrawler Raiders can't be blocked by blue creatures. -SHM C - -Mudbutton Clanger -{R} -Creature - Goblin Warrior -1/1 -Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Mudbutton Clanger, you may reveal it. If you do, Mudbutton Clanger gets +1/+1 until end of turn. -MOR C - -Mudbutton Torchrunner -{2}{R} -Creature - Goblin Warrior -1/1 -When Mudbutton Torchrunner dies, it deals 3 damage to target creature or player. -LRW C, EVG C, DDG C - -Muddle the Mixture -{U}{U} -Instant -Counter target instant or sorcery spell. -Transmute {1}{U}{U} ({1}{U}{U}, Discard this card: Search your library for a card with the same converted mana cost as this card, reveal it, and put it into your hand. Then shuffle your library. Transmute only as a sorcery.) -RAV C - -Mudhole -{2}{R} -Instant -Target player exiles all land cards from his or her graveyard. -ODY R - -Mudslide -{2}{R} -Enchantment -Creatures without flying don't untap during their controllers' untap steps. -At the beginning of each player's upkeep, that player may choose any number of tapped creatures without flying he or she controls and pay {2} for each creature chosen this way. If the player does, untap those creatures. -ICE R, ME2 R - -Mul Daya Channelers -{1}{G}{G} -Creature - Elf Druid Shaman -2/2 -Play with the top card of your library revealed. -As long as the top card of your library is a creature card, Mul Daya Channelers gets +3/+3. -As long as the top card of your library is a land card, Mul Daya Channelers has "{T}: Add two mana of any one color to your mana pool." -ROE R - -Mulch -{1}{G} -Sorcery -Reveal the top four cards of your library. Put all land cards revealed this way into your hand and the rest into your graveyard. -STH C - -Mulldrifter -{4}{U} -Creature - Elemental -2/2 -Flying -When Mulldrifter enters the battlefield, draw two cards. -Evoke {2}{U} (You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield.) -LRW C, JVC C, COM C - -Multani -Vanguard -Hand -3, life -2 -Creatures you control get +X/+0, where X is the number of cards in your hand. -VG S - -Multani's Acolyte -{G}{G} -Creature - Elf -2/1 -Echo {G}{G} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -When Multani's Acolyte enters the battlefield, draw a card. -ULG C - -Multani's Decree -{3}{G} -Sorcery -Destroy all enchantments. You gain 2 life for each enchantment destroyed this way. -UDS C - -Multani's Harmony -{G} -Enchantment - Aura -Enchant creature -Enchanted creature has "{T}: Add one mana of any color to your mana pool." -PLS U - -Multani's Presence -{G} -Enchantment -Whenever a spell you've cast is countered, draw a card. -ULG U - -Multani, Maro-Sorcerer -{4}{G}{G} -Legendary Creature - Elemental -*/* -Shroud (This permanent can't be the target of spells or abilities.) -Multani, Maro-Sorcerer's power and toughness are each equal to the total number of cards in all players' hands. -ULG R - -Mundungu -{1}{U}{B} -Creature - Human Wizard -1/1 -{T}: Counter target spell unless its controller pays {1} and 1 life. -VIS U - -Mungha Wurm -{2}{G}{G} -Creature - Wurm -6/5 -You can't untap more than one land during your untap step. -PCY R - -Muraganda Petroglyphs -{3}{G} -Enchantment -Creatures with no abilities get +2/+2. -FUT R - -Murasa -Plane - Zendikar -Whenever a nontoken creature enters the battlefield, its controller may search his or her library for a basic land card, put it onto the battlefield tapped, then shuffle his or her library. -Whenever you roll {C}, target land becomes a 4/4 creature that's still a land. -HOP C - -Murasa Pyromancer -{4}{R}{R} -Creature - Human Shaman Ally -3/2 -Whenever Murasa Pyromancer or another Ally enters the battlefield under your control, you may have Murasa Pyromancer deal damage to target creature equal to the number of Allies you control. -ZEN U - -Murderous Betrayal -{B}{B}{B} -Enchantment -{B}{B}, Pay half your life, rounded up: Destroy target nonblack creature. It can't be regenerated. -NEM R, 8ED R - -Murderous Redcap -{2}{B/R}{B/R} -Creature - Goblin Assassin -2/2 -When Murderous Redcap enters the battlefield, it deals damage equal to its power to target creature or player. -Persist (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) -SHM U - -Murderous Redcap Avatar -Vanguard -Hand +0, life -2 -Whenever a creature enters the battlefield under your control with a counter on it, you may have it deal damage equal to its power to target creature or player. -VG S - -Murderous Spoils -{5}{B} -Instant -Destroy target nonblack creature. It can't be regenerated. You gain control of all Equipment that was attached to it. (This effect lasts indefinitely.) -DST U - -Murgish Cemetery -{4}{B}{B} -Enchantment -{3}{B}, Discard a card: Put an X/X black Zombie token onto the battlefield, where X is a number randomly chosen from 2 to 6. -SDC S - -Murk Dwellers -{3}{B} -Creature - Zombie -2/2 -Whenever Murk Dwellers attacks and isn't blocked, it gets +2/+0 until end of combat. -DRK C, 4ED C, 5ED C - -Murkfiend Liege -{2}{G/U}{G/U}{G/U} -Creature - Horror -4/4 -Other green creatures you control get +1/+1. -Other blue creatures you control get +1/+1. -Untap all green and/or blue creatures you control during each other player's untap step. -EVE R - -Murmuring Bosk -Land - Forest -({T}: Add {G} to your mana pool.) -As Murmuring Bosk enters the battlefield, you may reveal a Treefolk card from your hand. If you don't, Murmuring Bosk enters the battlefield tapped. -{T}: Add {W} or {B} to your mana pool. Murmuring Bosk deals 1 damage to you. -MOR R - -Murmurs from Beyond -{2}{U} -Instant - Arcane -Reveal the top three cards of your library. An opponent chooses one of them. Put that card into your graveyard and the rest into your hand. -SOK C, COM C - -Muscle Burst -{1}{G} -Instant -Target creature gets +X/+X until end of turn, where X is 3 plus the number of cards named Muscle Burst in all graveyards. -ODY C - -Muscle Sliver -{1}{G} -Creature - Sliver -1/1 -All Sliver creatures get +1/+1. -TMP C, H09 C - -Muse Vessel -{4} -Artifact -{3}, {T}: Target player exiles a card from his or her hand. Activate this ability only any time you could cast a sorcery. -{1}: Choose a card exiled with Muse Vessel. You may play that card this turn. -DIS R - -Musician -{2}{U} -Creature - Human Wizard -1/3 -Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -{T}: Put a music counter on target creature. If it doesn't have "At the beginning of your upkeep, destroy this creature unless you pay {1} for each music counter on it," it gains that ability. -ICE R, ME2 R - -Mutagenic Growth -{G/P} -Instant -({G/P} can be paid with either {G} or 2 life.) -Target creature gets +2/+2 until end of turn. -NPH C - -Mutavault -Land -{T}: Add {1} to your mana pool. -{1}: Mutavault becomes a 2/2 creature with all creature types until end of turn. It's still a land. -MOR R - -Mutilate -{2}{B}{B} -Sorcery -All creatures get -1/-1 until end of turn for each Swamp you control. -TOR R, GVL R - -Muzzle -{1}{W} -Enchantment - Aura -Enchant creature -Prevent all damage that would be dealt by enchanted creature. -MMQ C - -Mwonvuli Acid-Moss -{2}{G}{G} -Sorcery -Destroy target land. Search your library for a Forest card and put that card onto the battlefield tapped. Then shuffle your library. -TSP C - -Mwonvuli Ooze -{G} -Creature - Ooze -1+*/1+* -Cumulative upkeep {2} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay {2} for each age counter on it.) -Mwonvuli Ooze's power and toughness are each equal to 1 plus twice the number of age counters on it. -WTH R - -My Crushing Masterstroke -Scheme -When you set this scheme in motion, gain control of all nonland permanents your opponents control until end of turn. Untap those permanents. They gain haste until end of turn. Each of them attacks its owner this turn if able. -ARC C - -My Genius Knows No Bounds -Scheme -When you set this scheme in motion, you may pay {X}. If you do, you gain X life and draw X cards. -ARC C - -My Undead Horde Awakens -Ongoing Scheme -(An ongoing scheme remains face up until it's abandoned.) -At the beginning of your end step, you may put target creature card from an opponent's graveyard onto the battlefield under your control. -When a creature put onto the battlefield with this scheme dies, abandon this scheme. -ARC C - -My Wish Is Your Command -Scheme -When you set this scheme in motion, each opponent reveals his or her hand. You may choose a noncreature, nonland card revealed this way and cast it without paying its mana cost. -ARC C - -Mycoid Shepherd -{1}{G}{G}{W} -Creature - Fungus -5/4 -Whenever Mycoid Shepherd or another creature you control with power 5 or greater dies, you may gain 5 life. -ARB R - -Mycologist -{1}{W} -Creature - Human Druid -0/2 -At the beginning of your upkeep, put a spore counter on Mycologist. -Remove three spore counters from Mycologist: Put a 1/1 green Saproling creature token onto the battlefield. -Sacrifice a Saproling: You gain 2 life. -PLC U - -Mycoloth -{3}{G}{G} -Creature - Fungus -4/4 -Devour 2 (As this enters the battlefield, you may sacrifice any number of creatures. This creature enters the battlefield with twice that many +1/+1 counters on it.) -At the beginning of your upkeep, put a 1/1 green Saproling creature token onto the battlefield for each +1/+1 counter on Mycoloth. -ALA R - -Mycosynth Fiend -{2}{G} -Creature - Horror -2/2 -Mycosynth Fiend gets +1/+1 for each poison counter your opponents have. -NPH U - -Mycosynth Golem -{11} -Artifact Creature - Golem -4/5 -Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -Artifact creature spells you cast have affinity for artifacts. (They cost {1} less to cast for each artifact you control.) -5DN R - -Mycosynth Lattice -{6} -Artifact -All permanents are artifacts in addition to their other types. -All cards that aren't on the battlefield, spells, and permanents are colorless. -Players may spend mana as though it were mana of any color. -DST R - -Mycosynth Wellspring -{2} -Artifact -When Mycosynth Wellspring enters the battlefield or is put into a graveyard from the battlefield, you may search your library for a basic land card, reveal it, put it into your hand, then shuffle your library. -NPH C - -Myojin of Cleansing Fire -{5}{W}{W}{W} -Legendary Creature - Spirit -4/6 -Myojin of Cleansing Fire enters the battlefield with a divinity counter on it if you cast it from your hand. -Myojin of Cleansing Fire is indestructible as long as it has a divinity counter on it. -Remove a divinity counter from Myojin of Cleansing Fire: Destroy all other creatures. -CHK R - -Myojin of Infinite Rage -{7}{R}{R}{R} -Legendary Creature - Spirit -7/4 -Myojin of Infinite Rage enters the battlefield with a divinity counter on it if you cast it from your hand. -Myojin of Infinite Rage is indestructible as long as it has a divinity counter on it. -Remove a divinity counter from Myojin of Infinite Rage: Destroy all lands. -CHK R - -Myojin of Life's Web -{6}{G}{G}{G} -Legendary Creature - Spirit -8/8 -Myojin of Life's Web enters the battlefield with a divinity counter on it if you cast it from your hand. -Myojin of Life's Web is indestructible as long as it has a divinity counter on it. -Remove a divinity counter from Myojin of Life's Web: Put any number of creature cards from your hand onto the battlefield. -CHK R - -Myojin of Night's Reach -{5}{B}{B}{B} -Legendary Creature - Spirit -5/2 -Myojin of Night's Reach enters the battlefield with a divinity counter on it if you cast it from your hand. -Myojin of Night's Reach is indestructible as long as it has a divinity counter on it. -Remove a divinity counter from Myojin of Night's Reach: Each opponent discards his or her hand. -CHK R - -Myojin of Seeing Winds -{7}{U}{U}{U} -Legendary Creature - Spirit -3/3 -Myojin of Seeing Winds enters the battlefield with a divinity counter on it if you cast it from your hand. -Myojin of Seeing Winds is indestructible as long as it has a divinity counter on it. -Remove a divinity counter from Myojin of Seeing Winds: Draw a card for each permanent you control. -CHK R - -Myr Adapter -{3} -Artifact Creature - Myr -1/1 -Myr Adapter gets +1/+1 for each Equipment attached to it. -MRD C - -Myr Battlesphere -{7} -Artifact Creature - Myr Construct -4/7 -When Myr Battlesphere enters the battlefield, put four 1/1 colorless Myr artifact creature tokens onto the battlefield. -Whenever Myr Battlesphere attacks, you may tap X untapped Myr you control. If you do, Myr Battlesphere gets +X/+0 until end of turn and deals X damage to defending player. -SOM R - -Myr Enforcer -{7} -Artifact Creature - Myr -4/4 -Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -MRD C, HOP C - -Myr Galvanizer -{3} -Artifact Creature - Myr -2/2 -Other Myr creatures you control get +1/+1. -{1}, {T}: Untap each other Myr you control. -SOM U - -Myr Incubator -{6} -Artifact -{6}, {T}, Sacrifice Myr Incubator: Search your library for any number of artifact cards, exile them, then put that many 1/1 colorless Myr artifact creature tokens onto the battlefield. Then shuffle your library. -MRD R - -Myr Landshaper -{3} -Artifact Creature - Myr -1/1 -{T}: Target land becomes an artifact in addition to its other types until end of turn. -DST C - -Myr Matrix -{5} -Artifact -Myr Matrix is indestructible. ("Destroy" effects and lethal damage don't destroy it.) -Myr creatures get +1/+1. -{5}: Put a 1/1 colorless Myr artifact creature token onto the battlefield. -DST R - -Myr Mindservant -{1} -Artifact Creature - Myr -1/1 -{2}, {T}: Shuffle your library. -MRD U - -Myr Moonvessel -{1} -Artifact Creature - Myr -1/1 -When Myr Moonvessel dies, add {1} to your mana pool. -DST C - -Myr Propagator -{3} -Artifact Creature - Myr -1/1 -{3}, {T}: Put a token that's a copy of Myr Propagator onto the battlefield. -SOM R - -Myr Prototype -{5} -Artifact Creature - Myr -2/2 -At the beginning of your upkeep, put a +1/+1 counter on Myr Prototype. -Myr Prototype can't attack or block unless you pay {1} for each +1/+1 counter on it. -MRD U - -Myr Quadropod -{4} -Artifact Creature - Myr -1/4 -{3}: Switch Myr Quadropod's power and toughness until end of turn. -5DN C - -Myr Reservoir -{3} -Artifact -{T}: Add {2} to your mana pool. Spend this mana only to cast Myr spells or activate abilities of Myr. -{3}, {T}: Return target Myr card from your graveyard to your hand. -SOM R - -Myr Retriever -{2} -Artifact Creature - Myr -1/1 -When Myr Retriever dies, return another target artifact card from your graveyard to your hand. -MRD U - -Myr Servitor -{1} -Artifact Creature - Myr -1/1 -At the beginning of your upkeep, if Myr Servitor is on the battlefield, each player returns all cards named Myr Servitor from his or her graveyard to the battlefield. -5DN C - -Myr Sire -{2} -Artifact Creature - Myr -1/1 -When Myr Sire dies, put a 1/1 colorless Myr artifact creature token onto the battlefield. -MBS C - -Myr Superion -{2} -Artifact Creature - Myr -5/6 -Spend only mana produced by creatures to cast Myr Superion. -NPH R - -Myr Turbine -{5} -Artifact -{T}: Put a 1/1 colorless Myr artifact creature token onto the battlefield. -{T}, Tap five untapped Myr you control: Search your library for a Myr creature card, put it onto the battlefield, then shuffle your library. -MBS R - -Myr Welder -{3} -Artifact Creature - Myr -1/4 -Imprint - {T}: Exile target artifact card from a graveyard. -Myr Welder has all activated abilities of all cards exiled with it. -MBS R - -Myrsmith -{1}{W} -Creature - Human Artificer -2/1 -Whenever you cast an artifact spell, you may pay {1}. If you do, put a 1/1 colorless Myr artifact creature token onto the battlefield. -SOM U - -Mysteries of the Deep -{4}{U} -Instant -Draw two cards. -Landfall - If you had a land enter the battlefield under your control this turn, draw three cards instead. -WWK C - -Mystic Compass -{2} -Artifact -{1}, {T}: Target land becomes the basic land type of your choice until end of turn. -ALL U, 6ED U - -Mystic Crusader -{1}{W}{W} -Creature - Human Nomad Mystic -2/1 -Protection from black and from red -Threshold - As long as seven or more cards are in your graveyard, Mystic Crusader gets +1/+1 and has flying. -ODY R - -Mystic Decree -{2}{U}{U} -World Enchantment -All creatures lose flying and islandwalk. -HML R, ME4 U - -Mystic Denial -{1}{U}{U} -Instant -Counter target creature or sorcery spell. -POR U, P02 U, PTK U - -Mystic Enforcer -{2}{G}{W} -Creature - Human Nomad Mystic -3/3 -Protection from black -Threshold - As long as seven or more cards are in your graveyard, Mystic Enforcer gets +3/+3 and has flying. -ODY R, TSB S - -Mystic Familiar -{1}{W} -Creature - Bird -1/2 -Flying -Threshold - As long as seven or more cards are in your graveyard, Mystic Familiar gets +1/+1 and has protection from black. -TOR C - -Mystic Gate -Land -{T}: Add {1} to your mana pool. -{W/U}, {T}: Add {W}{W}, {W}{U}, or {U}{U} to your mana pool. -SHM R - -Mystic Melting -{3}{G} -Instant -Destroy target artifact or enchantment. -Draw a card at the beginning of the next turn's upkeep. -CSP U - -Mystic Might -{U} -Enchantment - Aura -Enchant land you control -Cumulative upkeep {1}{U} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -Enchanted land has "{T}: Target creature gets +2/+2 until end of turn." -ICE R - -Mystic Penitent -{W} -Creature - Human Nomad Mystic -1/1 -Vigilance -Threshold - As long as seven or more cards are in your graveyard, Mystic Penitent gets +1/+1 and has flying. -ODY U - -Mystic Remora -{U} -Enchantment -Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -Whenever an opponent casts a noncreature spell, you may draw a card unless that player pays {4}. -ICE C, MED U - -Mystic Restraints -{2}{U}{U} -Enchantment - Aura -Flash -Enchant creature -When Mystic Restraints enters the battlefield, tap enchanted creature. -Enchanted creature doesn't untap during its controller's untap step. -CHK C - -Mystic Snake -{1}{G}{U}{U} -Creature - Snake -2/2 -Flash (You may cast this spell any time you could cast an instant.) -When Mystic Snake enters the battlefield, counter target spell. -APC R, TSB S - -Mystic Speculation -{U} -Sorcery -Buyback {2} (You may pay an additional {2} as you cast this spell. If you do, put this card into your hand as it resolves.) -Scry 3. (To scry 3, look at the top three cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) -FUT U - -Mystic Veil -{1}{U} -Enchantment - Aura -You may cast Mystic Veil as though it had flash. If you cast it any time a sorcery couldn't have been cast, the controller of the permanent it becomes sacrifices it at the beginning of the next cleanup step. -Enchant creature -Enchanted creature has shroud. (It can't be the target of spells or abilities.) -VIS C - -Mystic Visionary -{1}{W} -Creature - Human Nomad Mystic -2/1 -Threshold - Mystic Visionary has flying as long as seven or more cards are in your graveyard. -ODY C - -Mystic Zealot -{3}{W} -Creature - Human Nomad Mystic -2/4 -Threshold - As long as seven or more cards are in your graveyard, Mystic Zealot gets +1/+1 and has flying. -ODY C - -Mystical Teachings -{3}{U} -Instant -Search your library for an instant card or a card with flash, reveal it, and put it into your hand. Then shuffle your library. -Flashback {5}{B} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -TSP C - -Mystical Tutor -{U} -Instant -Search your library for an instant or sorcery card and reveal that card. Shuffle your library, then put the card on top of it. -MIR U, 6ED U, FVE M - -Mystifying Maze -Land -{T}: Add {1} to your mana pool. -{4}, {T}: Exile target attacking creature an opponent controls. At the beginning of the next end step, return it to the battlefield tapped under its owner's control. -M11 R - -Mythic Proportions -{4}{G}{G}{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +8/+8 and has trample. -ONS R - -Naar Isle -Plane - Wildfire -At the beginning of your upkeep, put a flame counter on Naar Isle, then Naar Isle deals damage to you equal to the number of flame counters on it. -Whenever you roll {C}, Naar Isle deals 3 damage to target player. -HOP C - -Nacatl Hunt-Pride -{5}{W} -Creature - Cat Warrior -5/4 -Vigilance -{R}, {T}: Target creature can't block this turn. -{G}, {T}: Target creature blocks this turn if able. -CON U - -Nacatl Outlander -{R}{G} -Creature - Cat Scout -2/2 -Protection from blue -CON C - -Nacatl Savage -{1}{G} -Creature - Cat Warrior -2/1 -Protection from artifacts -CON C - -Nacatl War-Pride -{3}{G}{G}{G} -Creature - Cat Warrior -3/3 -Nacatl War-Pride must be blocked by exactly one creature if able. -Whenever Nacatl War-Pride attacks, put X tokens that are copies of Nacatl War-Pride onto the battlefield tapped and attacking, where X is the number of creatures defending player controls. Exile the tokens at the beginning of the next end step. -FUT U - -Nacre Talisman -{2} -Artifact -Whenever a player casts a white spell, you may pay {3}. If you do, untap target permanent. -ICE U - -Nafs Asp -{G} -Creature - Snake -1/1 -Whenever Nafs Asp deals damage to a player, that player loses 1 life at the beginning of his or her next draw step unless he or she pays {1} before that draw step. -ARN C (x2), 4ED C - -Nagao, Bound by Honor -{3}{W} -Legendary Creature - Human Samurai -3/3 -Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -Whenever Nagao, Bound by Honor attacks, Samurai creatures you control get +1/+1 until end of turn. -CHK U - -Nakaya Shade -{1}{B} -Creature - Shade -1/1 -{B}: Nakaya Shade gets +1/+1 until end of turn unless any player pays {2}. -PCY U - -Naked Singularity -{5} -Artifact -Cumulative upkeep {3} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -If tapped for mana, Plains produce {R}, Islands produce {G}, Swamps produce {W}, Mountains produce {U}, and Forests produce {B} instead of any other type. -ICE R, ME4 R - -Nalathni Dragon -{2}{R}{R} -Creature - Dragon -1/1 -Flying; banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -{R}: Nalathni Dragon gets +1/+0 until end of turn. If this ability has been activated four or more times this turn, sacrifice Nalathni Dragon at the beginning of the next end step. -PRO S - -Nameless Inversion -{1}{B} -Tribal Instant - Shapeshifter -Changeling (This card is every creature type at all times.) -Target creature gets +3/-3 and loses all creature types until end of turn. -LRW C - -Nameless One -{3}{U} -Creature - Wizard Avatar -*/* -Nameless One's power and toughness are each equal to the number of Wizards on the battlefield. -Morph {2}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS U - -Nameless Race -{3}{B} -Creature -*/* -Trample -As Nameless Race enters the battlefield, pay any amount of life. The amount you pay can't be more than the total number of white nontoken permanents your opponents control plus the total number of white cards in their graveyards. -Nameless Race's power and toughness are each equal to the life paid as it entered the battlefield. -DRK R - -Nantuko Blightcutter -{2}{G} -Creature - Insect Druid -2/2 -Protection from black -Threshold - Nantuko Blightcutter gets +1/+1 for each black permanent your opponents control as long as seven or more cards are in your graveyard. -TOR R - -Nantuko Calmer -{2}{G}{G} -Creature - Insect Druid -2/3 -{G}, {T}, Sacrifice Nantuko Calmer: Destroy target enchantment. -Threshold - Nantuko Calmer gets +1/+1 as long as seven or more cards are in your graveyard. -TOR C - -Nantuko Cultivator -{3}{G} -Creature - Insect Druid -2/2 -When Nantuko Cultivator enters the battlefield, you may discard any number of land cards. Put that many +1/+1 counters on Nantuko Cultivator and draw that many cards. -TOR R - -Nantuko Disciple -{3}{G} -Creature - Insect Druid -2/2 -{G}, {T}: Target creature gets +2/+2 until end of turn. -ODY C, 8ED C - -Nantuko Elder -{2}{G} -Creature - Insect Druid -1/2 -{T}: Add {1}{G} to your mana pool. -ODY U - -Nantuko Husk -{2}{B} -Creature - Zombie Insect -2/2 -Sacrifice a creature: Nantuko Husk gets +2/+2 until end of turn. -ONS C, 9ED U, 10E U, COM U - -Nantuko Mentor -{2}{G} -Creature - Insect Druid -1/1 -{2}{G}, {T}: Target creature gets +X/+X until end of turn, where X is that creature's power. -ODY R - -Nantuko Monastery -Land -{T}: Add {1} to your mana pool. -Threshold - {G}{W}: Nantuko Monastery becomes a 4/4 green and white Insect Monk creature with first strike until end of turn. It's still a land. Activate this ability only if seven or more cards are in your graveyard. -JUD U, ARC U - -Nantuko Shade -{B}{B} -Creature - Insect Shade -2/1 -{B}: Nantuko Shade gets +1/+1 until end of turn. -TOR R, M11 R - -Nantuko Shaman -{2}{G} -Creature - Insect Shaman -3/2 -When Nantuko Shaman enters the battlefield, if you control no tapped lands, draw a card. -Suspend 1-{2}{G}{G} (Rather than cast this card from your hand, you may pay {2}{G}{G} and exile it with a time counter on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -TSP C - -Nantuko Shrine -{1}{G}{G} -Enchantment -Whenever a player casts a spell, that player puts X 1/1 green Squirrel creature tokens onto the battlefield, where X is the number of cards in all graveyards with the same name as that spell. -ODY R - -Nantuko Tracer -{1}{G} -Creature - Insect Druid -2/1 -When Nantuko Tracer enters the battlefield, you may put target card from a graveyard on the bottom of its owner's library. -JUD C - -Nantuko Vigilante -{3}{G} -Creature - Insect Druid Mutant -3/2 -Morph {1}{G} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Nantuko Vigilante is turned face up, destroy target artifact or enchantment. -LGN C - -Narcissism -{2}{G} -Enchantment -{G}, Discard a card: Target creature gets +2/+2 until end of turn. -{G}, Sacrifice Narcissism: Target creature gets +2/+2 until end of turn. -TOR U - -Narcolepsy -{1}{U} -Enchantment - Aura -Enchant creature -At the beginning of each upkeep, if enchanted creature is untapped, tap it. -ROE C - -Narcomoeba -{1}{U} -Creature - Illusion -1/1 -Flying -When Narcomoeba is put into your graveyard from your library, you may put it onto the battlefield. -FUT U - -Narrow Escape -{2}{W} -Instant -Return target permanent you control to its owner's hand. You gain 4 life. -ZEN C, PVC C - -Narwhal -{2}{U}{U} -Creature - Whale -2/2 -First strike, protection from red -HML R, ME2 U - -Nath of the Gilt-Leaf -{3}{B}{G} -Legendary Creature - Elf Warrior -4/4 -At the beginning of your upkeep, you may have target opponent discard a card at random. -Whenever an opponent discards a card, you may put a 1/1 green Elf Warrior creature token onto the battlefield. -LRW R - -Nath's Buffoon -{1}{B} -Creature - Goblin Rogue -1/1 -Protection from Elves -LRW C - -Nath's Elite -{4}{G} -Creature - Elf Warrior -4/2 -All creatures able to block Nath's Elite do so. -When Nath's Elite enters the battlefield, clash with an opponent. If you win, put a +1/+1 counter on Nath's Elite. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -LRW C - -Natural Affinity -{2}{G} -Instant -All lands become 2/2 creatures until end of turn. They're still lands. -MMQ R, 8ED R, 9ED R - -Natural Balance -{2}{G}{G} -Sorcery -Each player who controls six or more lands chooses five lands he or she controls and sacrifices the rest. Each player who controls four or fewer lands may search his or her library for X basic land cards and put them onto the battlefield, where X is five minus the number of lands he or she controls. Then each player who searched his or her library this way shuffles it. -MIR R - -Natural Emergence -{2}{R}{G} -Enchantment -When Natural Emergence enters the battlefield, return a red or green enchantment you control to its owner's hand. -Lands you control are 2/2 creatures with first strike. They're still lands. -PLS R - -Natural Order -{2}{G}{G} -Sorcery -As an additional cost to cast Natural Order, sacrifice a green creature. -Search your library for a green creature card and put it onto the battlefield. Then shuffle your library. -VIS R, POR R - -Natural Selection -{G} -Instant -Look at the top three cards of target player's library, then put them back in any order. You may have that player shuffle his or her library. -LEA R, LEB R, 2ED R - -Natural Spring -{3}{G}{G} -Sorcery -Target player gains 8 life. -POR U, TMP C, P02 C, S99 U, 9ED C, 10E C - -Naturalize -{1}{G} -Instant -Destroy target artifact or enchantment. -ONS C, 8ED C, 9ED C, 10E C, ALA C, M10 C, ROE C, M11 C, M12 C - -Nature Demands an Offering -Scheme -When you set this scheme in motion, target opponent chooses a creature you don't control and puts it on top of its owner's library, then repeats this process for an artifact, an enchantment, and a land. Then the owner of each permanent chosen this way shuffles his or her library. -ARC C - -Nature Shields Its Own -Ongoing Scheme -(An ongoing scheme remains face up until it's abandoned.) -Whenever a creature attacks and isn't blocked, if you're the defending player, put a 0/1 green Plant creature token onto the battlefield blocking that creature. -When four or more creatures attack you, abandon this scheme at end of combat. -ARC C - -Nature's Blessing -{2}{G}{W} -Enchantment -{G}{W}, Discard a card: Put a +1/+1 counter on target creature or that creature gains banding, first strike, or trample. (This effect lasts indefinitely. Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding a player controls are blocking or being blocked by a creature, that player divides that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -ALL U, ME2 U - -Nature's Chosen -{G} -Enchantment - Aura -Enchant creature you control -{0}: Untap enchanted creature. Activate this ability only during your turn and only once each turn. -Tap enchanted creature: Untap target artifact, creature, or land. Activate this ability only if enchanted creature is white and is untapped and only once each turn. -ALL U - -Nature's Claim -{G} -Instant -Destroy target artifact or enchantment. Its controller gains 4 life. -WWK C - -Nature's Cloak -{2}{G} -Sorcery -Green creatures you control gain forestwalk until end of turn. -POR R, S99 R - -Nature's Kiss -{1}{G} -Enchantment - Aura -Enchant creature -{1}, Exile the top card of your graveyard: Enchanted creature gets +1/+1 until end of turn. -WTH C - -Nature's Lore -{1}{G} -Sorcery -Search your library for a Forest card and put that card onto the battlefield. Then shuffle your library. -ICE U, 5ED C, POR C, P02 C, S99 C, MED C, GVL C - -Nature's Resurgence -{2}{G}{G} -Sorcery -Each player draws a card for each creature card in his or her graveyard. -WTH R, 6ED R, 7ED R - -Nature's Revolt -{3}{G}{G} -Enchantment -All lands are 2/2 creatures that are still lands. -TMP R, 7ED R - -Nature's Ruin -{2}{B} -Sorcery -Destroy all green creatures. -POR U - -Nature's Spiral -{1}{G} -Sorcery -Return target permanent card from your graveyard to your hand. (A permanent card is an artifact, creature, enchantment, land, or planeswalker card.) -M10 U, M11 U - -Nature's Will -{2}{G}{G} -Enchantment -Whenever one or more creatures you control deal combat damage to a player, tap all lands that player controls and untap all lands you control. -CHK R - -Nature's Wrath -{4}{G}{G} -Enchantment -At the beginning of your upkeep, sacrifice Nature's Wrath unless you pay {G}. -Whenever a player puts an Island or blue permanent onto the battlefield, he or she sacrifices an Island or blue permanent. -Whenever a player puts a Swamp or black permanent onto the battlefield, he or she sacrifices a Swamp or black permanent. -ALL R, ME2 R - -Nausea -{1}{B} -Sorcery -All creatures get -1/-1 until end of turn. -EXO C, 7ED C, 8ED C - -Naya -Plane - Alara -You may play any number of additional lands on each of your turns. -Whenever you roll {C}, target red, green, or white creature you control gets +1/+1 until end of turn for each land you control. -HOP C - -Naya Battlemage -{2}{G} -Creature - Human Shaman -2/2 -{R}, {T}: Target creature gets +2/+0 until end of turn. -{W}, {T}: Tap target creature. -ALA U - -Naya Charm -{R}{G}{W} -Instant -Choose one - Naya Charm deals 3 damage to target creature; or return target card from a graveyard to its owner's hand; or tap all creatures target player controls. -ALA U - -Naya Hushblade -{R/W}{G} -Creature - Elf Rogue -2/1 -As long as you control another multicolored permanent, Naya Hushblade gets +1/+1 and has shroud. (It can't be the target of spells or abilities.) -ARB C - -Naya Panorama -Land -{T}: Add {1} to your mana pool. -{1}, {T}, Sacrifice Naya Panorama: Search your library for a basic Mountain, Forest, or Plains card and put it onto the battlefield tapped. Then shuffle your library. -ALA C - -Naya Sojourners -{2}{R}{G}{W} -Creature - Elf Shaman -5/3 -When you cycle Naya Sojourners or it dies, you may put a +1/+1 counter on target creature. -Cycling {2}{G} ({2}{G}, Discard this card: Draw a card.) -ARB C - -Near-Death Experience -{2}{W}{W}{W} -Enchantment -At the beginning of your upkeep, if you have exactly 1 life, you win the game. -ROE R - -Nebuchadnezzar -{3}{U}{B} -Legendary Creature - Human Wizard -3/3 -{X}, {T}: Name a card. Target opponent reveals X cards at random from his or her hand. Then that player discards all cards with that name revealed this way. Activate this ability only during your turn. -LEG R, CHR R, ME3 U - -Neck Snap -{3}{W} -Instant -Destroy target attacking or blocking creature. -LRW C - -Necra Disciple -{B} -Creature - Human Wizard -1/1 -{G}, {T}: Add one mana of any color to your mana pool. -{W}, {T}: Prevent the next 1 damage that would be dealt to target creature or player this turn. -APC C - -Necra Sanctuary -{2}{B} -Enchantment -At the beginning of your upkeep, if you control a green or white permanent, target player loses 1 life. If you control a green permanent and a white permanent, that player loses 3 life instead. -APC U - -Necratog -{1}{B}{B} -Creature - Atog -1/2 -Exile the top creature card of your graveyard: Necratog gets +2/+2 until end of turn. -WTH U - -Necravolver -{2}{B} -Creature - Volver -2/2 -Kicker {1}{G} and/or {W} (You may pay an additional {1}{G} and/or {W} as you cast this spell.) -If Necravolver was kicked with its {1}{G} kicker, it enters the battlefield with two +1/+1 counters on it and with trample. -If Necravolver was kicked with its {W} kicker, it enters the battlefield with a +1/+1 counter on it and with "Whenever Necravolver deals damage, you gain that much life." -APC R - -Necrite -{1}{B}{B} -Creature - Thrull -2/2 -Whenever Necrite attacks and isn't blocked, you may sacrifice it. If you do, destroy target creature defending player controls. It can't be regenerated. -FEM C (x3), 5ED C, ME2 C - -Necrogen Censer -{3} -Artifact -Necrogen Censer enters the battlefield with two charge counters on it. -{T}, Remove a charge counter from Necrogen Censer: Target player loses 2 life. -SOM C - -Necrogen Mists -{2}{B} -Enchantment -At the beginning of each player's upkeep, that player discards a card. -MRD R - -Necrogen Scudder -{2}{B} -Creature - Horror -3/3 -Flying -When Necrogen Scudder enters the battlefield, you lose 3 life. -SOM U - -Necrogen Spellbomb -{1} -Artifact -{B}, Sacrifice Necrogen Spellbomb: Target player discards a card. -{1}, Sacrifice Necrogen Spellbomb: Draw a card. -MRD C - -Necrogenesis -{B}{G} -Enchantment -{2}: Exile target creature card from a graveyard. Put a 1/1 green Saproling creature token onto the battlefield. -ALA U, COM U - -Necrologia -{3}{B}{B} -Instant -Cast Necrologia only during your end step. -As an additional cost to cast Necrologia, pay X life. -Draw X cards. -EXO U, 7ED U - -Necromancer's Covenant -{3}{W}{B}{B} -Enchantment -When Necromancer's Covenant enters the battlefield, exile all creature cards from target player's graveyard, then put a 2/2 black Zombie creature token onto the battlefield for each card exiled this way. -Zombies you control have lifelink. -ARB R - -Necromancer's Magemark -{2}{B} -Enchantment - Aura -Enchant creature -Creatures you control that are enchanted get +1/+1. -If a creature you control that's enchanted would die, return it to its owner's hand instead. -GPT C - -Necromancy -{2}{B} -Enchantment -You may cast Necromancy as though it had flash. If you cast it any time a sorcery couldn't have been cast, the controller of the permanent it becomes sacrifices it at the beginning of the next cleanup step. -When Necromancy enters the battlefield, if it's on the battlefield, it becomes an Aura with "enchant creature put onto the battlefield with Necromancy." Put target creature card from a graveyard onto the battlefield under your control and attach Necromancy to it. When Necromancy leaves the battlefield, that creature's controller sacrifices it. -VIS U - -Necromantic Thirst -{2}{B}{B} -Enchantment - Aura -Enchant creature -Whenever enchanted creature deals combat damage to a player, you may return target creature card from your graveyard to your hand. -RAV C - -Necropede -{2} -Artifact Creature - Insect -1/1 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -When Necropede dies, you may put a -1/-1 counter on target creature. -SOM U - -Necroplasm -{1}{B}{B} -Creature - Ooze -1/1 -At the beginning of your upkeep, put a +1/+1 counter on Necroplasm. -At the beginning of your end step, destroy each creature with converted mana cost equal to the number of +1/+1 counters on Necroplasm. -Dredge 2 (If you would draw a card, instead you may put exactly two cards from the top of your library into your graveyard. If you do, return this card from your graveyard to your hand. Otherwise, draw a card.) -RAV R - -Necropolis -{5} -Artifact Creature - Wall -0/1 -Defender (This creature can't attack.) -Exile a creature card from your graveyard: Put X +0/+1 counters on Necropolis, where X is the exiled card's converted mana cost. -DRK U - -Necropolis of Azar -{2}{B}{B} -Enchantment -Whenever a nonblack creature is put into a graveyard from the battlefield, put a husk counter on Necropolis of Azar. -{5}, Remove a husk counter from Necropolis of Azar: Put a X/Y black Spawn creature token named Spawn of Azar with swampwalk onto the battlefield, where X and Y are numbers chosen at random from 1 to 3. -ASTRAL S - -Necropotence -{B}{B}{B} -Enchantment -Skip your draw step. -Whenever you discard a card, exile that card from your graveyard. -Pay 1 life: Exile the top card of your library face down. Put that card into your hand at the beginning of your next end step. -ICE R, 5ED R, ME2 R, FVE M - -Necropotence Avatar -Vanguard -Hand +0, life +4 -Skip your draw step. -At the beginning of your end step, if it's not the first turn of the game, put a death counter on Necropotence Avatar. You draw X cards and you lose X life, where X is the number of death counters on Necropotence Avatar. -VG S - -Necropouncer -{6} -Artifact - Equipment -Living weapon (When this Equipment enters the battlefield, put a 0/0 black Germ creature token onto the battlefield, then attach this to it.) -Equipped creature gets +3/+1 and has haste. -Equip {2} -NPH U - -Necrosavant -{3}{B}{B}{B} -Creature - Zombie Giant -5/5 -{3}{B}{B}, Sacrifice a creature: Return Necrosavant from your graveyard to the battlefield. Activate this ability only during your upkeep. -VIS R, 6ED R - -Necroskitter -{1}{B}{B} -Creature - Elemental -1/4 -Wither (This deals damage to creatures in the form of -1/-1 counters.) -Whenever a creature an opponent controls with a -1/-1 counter on it dies, you may return that card to the battlefield under your control. -EVE R - -Necrotic Ooze -{2}{B}{B} -Creature - Ooze -4/3 -As long as Necrotic Ooze is on the battlefield, it has all activated abilities of all creature cards in all graveyards. -SOM R - -Necrotic Plague -{2}{B}{B} -Enchantment - Aura -Enchant creature -Enchanted creature has "At the beginning of your upkeep, sacrifice this creature." -When enchanted creature dies, its controller chooses target creature one of his or her opponents controls. Return Necrotic Plague from its owner's graveyard to the battlefield attached to that creature. -M11 R - -Necrotic Sliver -{1}{W}{B} -Creature - Sliver -2/2 -All Slivers have "{3}, Sacrifice this permanent: Destroy target permanent." -PLC U, H09 U - -Nectar Faerie -{1}{B} -Creature - Faerie Wizard -1/1 -Flying -{B}, {T}: Target Faerie or Elf gains lifelink until end of turn. (Damage dealt by the creature also causes its controller to gain that much life.) -LRW U - -Need for Speed -{R} -Enchantment -Sacrifice a land: Target creature gains haste until end of turn. -ODY R - -Needle Drop -{R} -Instant -Needle Drop deals 1 damage to target creature or player that was dealt damage this turn. -Draw a card. -LRW C - -Needle Specter -{1}{B}{B} -Creature - Specter -1/1 -Flying -Wither (This deals damage to creatures in the form of -1/-1 counters.) -Whenever Needle Specter deals combat damage to a player, that player discards that many cards. -EVE R - -Needle Storm -{2}{G} -Sorcery -Needle Storm deals 4 damage to each creature with flying. -POR U, TMP U, 9ED U - -Needlebite Trap -{5}{B}{B} -Instant - Trap -If an opponent gained life this turn, you may pay {B} rather than pay Needlebite Trap's mana cost. -Target player loses 5 life and you gain 5 life. -ZEN U - -Needlebug -{4} -Artifact Creature - Insect -2/2 -Flash -Protection from artifacts -MRD U - -Needlepeak Spider -{3}{R} -Creature - Spider -4/2 -Reach (This creature can block creatures with flying.) -PLC C - -Needleshot Gourna -{4}{G}{G} -Creature - Beast -3/6 -Reach (This creature can block creatures with flying.) -LGN C - -Nefarious Lich -{B}{B}{B}{B} -Enchantment -If damage would be dealt to you, exile that many cards from your graveyard instead. If you can't, you lose the game. -If you would gain life, draw that many cards instead. -When Nefarious Lich leaves the battlefield, you lose the game. -ODY R - -Nefashu -{4}{B}{B} -Creature - Zombie Mutant -5/3 -Whenever Nefashu attacks, up to five target creatures each get -1/-1 until end of turn. -SCG R, HOP R - -Negate -{1}{U} -Instant -Counter target noncreature spell. -MOR C, M10 C, M11 C, M12 C - -Neko-Te -{3} -Artifact - Equipment -Whenever equipped creature deals damage to a creature, tap that creature. That creature doesn't untap during its controller's untap step for as long as Neko-Te remains on the battlefield. -Whenever equipped creature deals damage to a player, that player loses 1 life. -Equip {2} -BOK R - -Nekrataal -{2}{B}{B} -Creature - Human Assassin -2/1 -First strike (This creature deals combat damage before creatures without first strike.) -When Nekrataal enters the battlefield, destroy target nonartifact, nonblack creature. That creature can't be regenerated. -VIS U, BRB U, 8ED U, 9ED U, 10E U - -Nekrataal Avatar -Vanguard -Hand -1, life -4 -Creature spells you cast cost {B} less to cast. This effect reduces only the amount of colored mana you pay. -VG S - -Nema Siltlurker -{4}{G} -Creature - Lizard -3/5 -ROE C - -Nemata, Grove Guardian -{4}{G}{G} -Legendary Creature - Treefolk -4/5 -{2}{G}: Put a 1/1 green Saproling creature token onto the battlefield. -Sacrifice a Saproling: Saproling creatures get +1/+1 until end of turn. -PLS R - -Nemesis Mask -{3} -Artifact - Equipment -All creatures able to block equipped creature do so. -Equip {3} ({3}: Attach to target creature you control. Equip only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.) -DST U - -Nemesis Trap -{4}{B}{B} -Instant - Trap -If a white creature is attacking, you may pay {B}{B} rather than pay Nemesis Trap's mana cost. -Exile target attacking creature. Put a token that's a copy of that creature onto the battlefield. Exile it at the beginning of the next end step. -WWK U, COM U - -Nemesis of Reason -{3}{U}{B} -Creature - Leviathan Horror -3/7 -Whenever Nemesis of Reason attacks, defending player puts the top ten cards of his or her library into his or her graveyard. -ARB R - -Nessian Courser -{2}{G} -Creature - Centaur Warrior -3/3 -FUT C - -Nest Invader -{1}{G} -Creature - Eldrazi Drone -2/2 -When Nest Invader enters the battlefield, put a 0/1 colorless Eldrazi Spawn creature token onto the battlefield. It has "Sacrifice this creature: Add {1} to your mana pool." -ROE C - -Nested Ghoul -{3}{B}{B} -Creature - Zombie Warrior -4/2 -Whenever a source deals damage to Nested Ghoul, put a 2/2 black Zombie creature token onto the battlefield. -MBS U - -Nesting Wurm -{4}{G}{G} -Creature - Wurm -4/3 -Trample -When Nesting Wurm enters the battlefield, you may search your library for up to three cards named Nesting Wurm, reveal them, and put them into your hand. If you do, shuffle your library. -NEM U - -Nether Horror -{3}{B} -Creature - Horror -4/2 -M11 C - -Nether Shadow -{B}{B} -Creature - Spirit -1/1 -Haste -At the beginning of your upkeep, if Nether Shadow is in your graveyard with three or more creature cards above it, you may put Nether Shadow onto the battlefield. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, MED U - -Nether Spirit -{1}{B}{B} -Creature - Spirit -2/2 -At the beginning of your upkeep, if Nether Spirit is the only creature card in your graveyard, you may return Nether Spirit to the battlefield. -MMQ R - -Nether Traitor -{B}{B} -Creature - Spirit -1/1 -Haste -Shadow (This creature can block or be blocked by only creatures with shadow.) -Whenever another creature is put into your graveyard from the battlefield, you may pay {B}. If you do, return Nether Traitor from your graveyard to the battlefield. -TSP R - -Nether Void -{3}{B} -World Enchantment -Whenever a player casts a spell, counter it unless its controller pays {3}. -LEG R, ME3 R - -Netherborn Phalanx -{5}{B} -Creature - Horror -2/4 -When Netherborn Phalanx enters the battlefield, each opponent loses 1 life for each creature he or she controls. -Transmute {1}{B}{B} ({1}{B}{B}, Discard this card: Search your library for a card with the same converted mana cost as this card, reveal it, and put it into your hand. Then shuffle your library. Transmute only as a sorcery.) -RAV U - -Netter en-Dal -{W} -Creature - Human Spellshaper -1/1 -{W}, {T}, Discard a card: Target creature can't attack this turn. -NEM C - -Nettle Sentinel -{G} -Creature - Elf Warrior -2/2 -Nettle Sentinel doesn't untap during your untap step. -Whenever you cast a green spell, you may untap Nettle Sentinel. -EVE C - -Nettletooth Djinn -{3}{G} -Creature - Djinn -4/4 -At the beginning of your upkeep, Nettletooth Djinn deals 1 damage to you. -MIR U - -Nettlevine Blight -{4}{B}{B} -Enchantment - Aura -Enchant creature or land -Enchanted permanent has "At the beginning of your end step, sacrifice this permanent and attach Nettlevine Blight to a creature or land you control." -LRW R - -Nettling Curse -{2}{B} -Enchantment - Aura -Enchant creature -Whenever enchanted creature attacks or blocks, its controller loses 3 life. -{1}{R}: Enchanted creature attacks this turn if able. -DIS C - -Nettling Imp -{2}{B} -Creature - Imp -1/1 -{T}: Choose target non-Wall creature the active player has controlled continuously since the beginning of the turn. That creature attacks this turn if able. If it doesn't, destroy it at the beginning of the next end step. Activate this ability only during an opponent's turn, before attackers are declared. -LEA U, LEB U, 2ED U, 3ED U - -Neurok Commando -{1}{U}{U} -Creature - Human Rogue -2/1 -Shroud -Whenever Neurok Commando deals combat damage to a player, you may draw a card. -MBS U - -Neurok Familiar -{1}{U} -Creature - Bird -1/1 -Flying -When Neurok Familiar enters the battlefield, reveal the top card of your library. If it's an artifact card, put it into your hand. Otherwise, put it into your graveyard. -MRD C - -Neurok Hoversail -{1} -Artifact - Equipment -Equipped creature has flying. -Equip {2} ({2}: Attach to target creature you control. Equip only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.) -MRD C - -Neurok Invisimancer -{1}{U}{U} -Creature - Human Wizard -2/1 -Neurok Invisimancer is unblockable. -When Neurok Invisimancer enters the battlefield, target creature is unblockable this turn. -SOM C - -Neurok Prodigy -{2}{U} -Creature - Human Wizard -2/1 -Flying -Discard an artifact card: Return Neurok Prodigy to its owner's hand. -DST C - -Neurok Replica -{3} -Artifact Creature - Wizard -1/4 -{1}{U}, Sacrifice Neurok Replica: Return target creature to its owner's hand. -SOM C - -Neurok Spy -{2}{U} -Creature - Human Rogue -2/2 -Neurok Spy is unblockable as long as defending player controls an artifact. -MRD C - -Neurok Stealthsuit -{2} -Artifact - Equipment -Equipped creature has shroud. (It can't be the target of spells or abilities.) -{U}{U}: Attach Neurok Stealthsuit to target creature you control. -Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) -5DN C - -Neurok Transmuter -{2}{U} -Creature - Human Wizard -2/2 -{U}: Target creature becomes an artifact in addition to its other types until end of turn. -{U}: Until end of turn, target artifact creature becomes blue and isn't an artifact. -DST U - -Neverending Torment -{4}{B}{B} -Sorcery -Search target player's library for X cards, where X is the number of cards in your hand, and exile them. Then that player shuffles his or her library. -Epic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability. You may choose a new target for the copy.) -SOK R - -Nevermaker -{3}{U} -Creature - Elemental -2/3 -Flying -When Nevermaker leaves the battlefield, put target nonland permanent on top of its owner's library. -Evoke {3}{U} (You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield.) -MOR U - -Nevinyrral's Disk -{4} -Artifact -Nevinyrral's Disk enters the battlefield tapped. -{1}, {T}: Destroy all artifacts, creatures, and enchantments. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, MED R, FVR M - -New Benalia -Land -New Benalia enters the battlefield tapped. -When New Benalia enters the battlefield, scry 1. (To scry 1, look at the top card of your library, then you may put that card on the bottom of your library.) -{T}: Add {W} to your mana pool. -FUT U - -New Frontiers -{X}{G} -Sorcery -Each player may search his or her library for up to X basic land cards and put them onto the battlefield tapped. Then each player who searched his or her library this way shuffles it. -ODY R - -Nezumi Bone-Reader -{1}{B} -Creature - Rat Shaman -1/1 -{B}, Sacrifice a creature: Target player discards a card. Activate this ability only any time you could cast a sorcery. -CHK U - -Nezumi Cutthroat -{1}{B} -Creature - Rat Warrior -2/1 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -Nezumi Cutthroat can't block. -CHK C - -Nezumi Graverobber -{1}{B} -Creature - Rat Rogue -2/1 -{1}{B}: Exile target card from an opponent's graveyard. If no cards are in that graveyard, flip Nezumi Graverobber. ----- -Nighteyes the Desecrator -Legendary Creature - Rat Wizard -4/2 -{4}{B}: Put target creature card from a graveyard onto the battlefield under your control. -CHK U, COM U - -Nezumi Ronin -{2}{B} -Creature - Rat Samurai -3/1 -Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -CHK C - -Nezumi Shadow-Watcher -{B} -Creature - Rat Warrior -1/1 -Sacrifice Nezumi Shadow-Watcher: Destroy target Ninja. -BOK U - -Nezumi Shortfang -{1}{B} -Creature - Rat Rogue -1/1 -{1}{B}, {T}: Target opponent discards a card. Then if that player has no cards in hand, flip Nezumi Shortfang. ----- -Stabwhisker the Odious -Legendary Creature - Rat Shaman -3/3 -At the beginning of each opponent's upkeep, that player loses 1 life for each card fewer than three in his or her hand. -CHK R - -Niall Silvain -{G}{G}{G} -Creature - Ouphe -2/2 -{G}{G}{G}{G}, {T}: Regenerate target creature. -DRK R - -Nicol Bolas -{2}{U}{U}{B}{B}{R}{R} -Legendary Creature - Elder Dragon -7/7 -Flying -At the beginning of your upkeep, sacrifice Nicol Bolas unless you pay {U}{B}{R}. -Whenever Nicol Bolas deals damage to an opponent, that player discards his or her hand. -LEG R, CHR R, TSB S, FVD R, ME3 R - -Nicol Bolas, Planeswalker -{4}{U}{B}{B}{R} -Planeswalker - Bolas -5 -[+3] Destroy target noncreature permanent. -[-2] Gain control of target creature. -[-9] Nicol Bolas, Planeswalker deals 7 damage to target player. That player discards seven cards, then sacrifices seven permanents. -CON M - -Night -{B} -Instant -Target creature gets -1/-1 until end of turn. ----- -Day -{2}{W} -Instant -Creatures target player controls get +1/+1 until end of turn. -APC U (x2) - -Night Dealings -{2}{B}{B} -Enchantment -Whenever a source you control deals damage to another player, put that many theft counters on Night Dealings. -{2}{B}{B}, Remove X theft counters from Night Dealings: Search your library for a nonland card with converted mana cost X, reveal it, and put it into your hand. Then shuffle your library. -CHK R - -Night Soil -{G}{G} -Enchantment -{1}, Exile two creature cards from a single graveyard: Put a 1/1 green Saproling creature token onto the battlefield. -FEM C (x3), ME2 U - -Night of Souls' Betrayal -{2}{B}{B} -Legendary Enchantment -All creatures get -1/-1. -CHK R - -Night's Whisper -{1}{B} -Sorcery -You draw two cards and you lose 2 life. -5DN U - -Nightcreep -{B}{B} -Instant -Until end of turn, all creatures become black and all lands become Swamps. -DIS U - -Nightguard Patrol -{2}{W} -Creature - Human Soldier -2/1 -First strike, vigilance -RAV C - -Nighthaze -{B} -Sorcery -Target creature gains swampwalk until end of turn. -Draw a card. -ROE C - -Nightmare -{5}{B} -Creature - Nightmare Horse -*/* -Flying -Nightmare's power and toughness are each equal to the number of Swamps you control. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, 6ED R, 7ED R, 8ED R, 9ED R, 10E R, M10 R - -Nightmare Incursion -{5}{B} -Sorcery -Search target player's library for up to X cards, where X is the number of Swamps you control, and exile them. Then that player shuffles his or her library. -EVE R - -Nightmare Lash -{4} -Artifact - Equipment -Equipped creature gets +1/+1 for each Swamp you control. -Equip-Pay 3 life. (Pay 3 life: Attach to target creature you control. Equip only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.) -MRD R - -Nightmare Void -{3}{B} -Sorcery -Target player reveals his or her hand. You choose a card from it. That player discards that card. -Dredge 2 (If you would draw a card, instead you may put exactly two cards from the top of your library into your graveyard. If you do, return this card from your graveyard to your hand. Otherwise, draw a card.) -RAV U - -Nightscape Apprentice -{B} -Creature - Zombie Wizard -1/1 -{U}, {T}: Put target creature you control on top of its owner's library. -{R}, {T}: Target creature gains first strike until end of turn. -INV C - -Nightscape Battlemage -{2}{B} -Creature - Zombie Wizard -2/2 -Kicker {2}{U} and/or {2}{R} (You may pay an additional {2}{U} and/or {2}{R} as you cast this spell.) -When Nightscape Battlemage enters the battlefield, if it was kicked with its {2}{U} kicker, return up to two target nonblack creatures to their owners' hands. -When Nightscape Battlemage enters the battlefield, if it was kicked with its {2}{R} kicker, destroy target land. -PLS U - -Nightscape Familiar -{1}{B} -Creature - Zombie -1/1 -Blue spells and red spells you cast cost {1} less to cast. -{1}{B}: Regenerate Nightscape Familiar. -PLS C - -Nightscape Master -{2}{B}{B} -Creature - Zombie Wizard -2/2 -{U}{U}, {T}: Return target creature to its owner's hand. -{R}{R}, {T}: Nightscape Master deals 2 damage to target creature. -INV R - -Nightshade Assassin -{2}{B}{B} -Creature - Human Assassin -2/1 -First strike -When Nightshade Assassin enters the battlefield, you may reveal X black cards in your hand. If you do, target creature gets -X/-X until end of turn. -Madness {1}{B} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -TSP U - -Nightshade Schemers -{4}{B} -Creature - Faerie Wizard -3/2 -Flying -Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Nightshade Schemers, you may reveal it. If you do, each opponent loses 2 life. -MOR U - -Nightshade Seer -{3}{B} -Creature - Human Wizard -1/1 -{2}{B}, {T}: Reveal any number of black cards in your hand. Target creature gets -X/-X until end of turn, where X is the number of cards revealed this way. -UDS U - -Nightshade Stinger -{B} -Creature - Faerie Rogue -1/1 -Flying -Nightshade Stinger can't block. -LRW C - -Nightsky Mimic -{1}{W/B} -Creature - Shapeshifter -2/1 -Whenever you cast a spell that's both white and black, Nightsky Mimic becomes 4/4 and gains flying until end of turn. -EVE C - -Nightsoil Kami -{4}{G}{G} -Creature - Spirit -6/4 -Soulshift 5 (When this creature dies, you may return target Spirit card with converted mana cost 5 or less from your graveyard to your hand.) -SOK C - -Nightstalker Engine -{4}{B} -Creature - Nightstalker -*/3 -Nightstalker Engine's power is equal to the number of creature cards in your graveyard. -P02 R - -Nightwind Glider -{2}{W} -Creature - Human Rebel -2/1 -Flying, protection from black -MMQ C - -Nightwing Shade -{4}{B} -Creature - Shade -2/2 -Flying -{1}{B}: Nightwing Shade gets +1/+1 until end of turn. -M11 C - -Nihil Spellbomb -{1} -Artifact -{T}, Sacrifice Nihil Spellbomb: Exile all cards from target player's graveyard. -When Nihil Spellbomb is put into a graveyard from the battlefield, you may pay {B}. If you do, draw a card. -SOM C - -Nihilistic Glee -{2}{B}{B} -Enchantment -{2}{B}, Discard a card: Target opponent loses 1 life and you gain 1 life. -Hellbent - {1}, Pay 2 life: Draw a card. Activate this ability only if you have no cards in hand. -DIS R - -Nihilith -{4}{B}{B} -Creature - Horror -4/4 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -Suspend 7-{1}{B} (Rather than cast this card from your hand, you may pay {1}{B} and exile it with seven time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -Whenever a card is put into an opponent's graveyard from anywhere, if Nihilith is suspended, you may remove a time counter from Nihilith. -FUT R - -Nikko-Onna -{2}{W} -Creature - Spirit -2/2 -When Nikko-Onna enters the battlefield, destroy target enchantment. -Whenever you cast a Spirit or Arcane spell, you may return Nikko-Onna to its owner's hand. -SOK U - -Nim Abomination -{2}{B} -Creature - Zombie -3/4 -At the beginning of your end step, if Nim Abomination is untapped, you lose 3 life. -DST U - -Nim Deathmantle -{2} -Artifact - Equipment -Equipped creature gets +2/+2, has intimidate, and is a black Zombie. -Whenever a nontoken creature is put into your graveyard from the battlefield, you may pay {4}. If you do, return that card to the battlefield and attach Nim Deathmantle to it. -Equip {4} -SOM R - -Nim Devourer -{3}{B}{B} -Creature - Zombie -4/1 -Nim Devourer gets +1/+0 for each artifact you control. -{B}{B}: Return Nim Devourer from your graveyard to the battlefield, then sacrifice a creature. Activate this ability only during your upkeep. -MRD R - -Nim Grotesque -{6}{B} -Creature - Zombie -3/6 -Nim Grotesque gets +1/+0 for each artifact you control. -5DN U - -Nim Lasher -{2}{B} -Creature - Zombie -1/1 -Nim Lasher gets +1/+0 for each artifact you control. -MRD C - -Nim Replica -{3} -Artifact Creature - Zombie -3/1 -{2}{B}, Sacrifice Nim Replica: Target creature gets -1/-1 until end of turn. -MRD C - -Nim Shambler -{2}{B}{B} -Creature - Zombie -2/1 -Nim Shambler gets +1/+0 for each artifact you control. -Sacrifice a creature: Regenerate Nim Shambler. -MRD U - -Nim Shrieker -{3}{B} -Creature - Zombie -0/1 -Flying -Nim Shrieker gets +1/+0 for each artifact you control. -MRD C - -Nimana Sell-Sword -{3}{B} -Creature - Human Warrior Ally -2/2 -Whenever Nimana Sell-Sword or another Ally enters the battlefield under your control, you may put a +1/+1 counter on Nimana Sell-Sword. -ZEN C - -Nimble Mongoose -{G} -Creature - Mongoose -1/1 -Shroud (This permanent can't be the target of spells or abilities.) -Threshold - Nimble Mongoose gets +2/+2 as long as seven or more cards are in your graveyard. -ODY U - -Nimbus Maze -Land -{T}: Add {1} to your mana pool. -{T}: Add {W} to your mana pool. Activate this ability only if you control an Island. -{T}: Add {U} to your mana pool. Activate this ability only if you control a Plains. -FUT R - -Nimbus Wings -{1}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+2 and has flying. -ZEN C - -Nin, the Pain Artist -{U}{R} -Legendary Creature - Vedalken Wizard -1/1 -{X}{U}{R}, {T}: Nin, the Pain Artist deals X damage to target creature. That creature's controller draws X cards. -COM R - -Nine-Ringed Bo -{3} -Artifact -{T}: Nine-Ringed Bo deals 1 damage to target Spirit creature. If that creature would die this turn, exile it instead. -CHK U - -Ninja of the Deep Hours -{3}{U} -Creature - Human Ninja -2/2 -Ninjutsu {1}{U} ({1}{U}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -Whenever Ninja of the Deep Hours deals combat damage to a player, you may draw a card. -BOK C - -Nip Gwyllion -{W/B} -Creature - Hag -1/1 -Lifelink (Damage dealt by this creature also causes you to gain that much life.) -EVE C - -Nirkana Cutthroat -{2}{B} -Creature - Vampire Warrior -3/2 -Level up {2}{B} ({2}{B}: Put a level counter on this. Level up only as a sorcery.) -LEVEL 1-2 -4/3 -Deathtouch -LEVEL 3+ -5/4 -First strike, deathtouch -ROE U - -Nirkana Revenant -{4}{B}{B} -Creature - Vampire Shade -4/4 -Whenever you tap a Swamp for mana, add {B} to your mana pool (in addition to the mana the land produces). -{B}: Nirkana Revenant gets +1/+1 until end of turn. -ROE M - -Nissa Revane -{2}{G}{G} -Planeswalker - Nissa -2 -[+1] Search your library for a card named Nissa's Chosen and put it onto the battlefield. Then shuffle your library. -[+1] You gain 2 life for each Elf you control. -[-7] Search your library for any number of Elf creature cards and put them onto the battlefield. Then shuffle your library. -ZEN M - -Nissa's Chosen -{G}{G} -Creature - Elf Warrior -2/3 -If Nissa's Chosen would die, put it on the bottom of its owner's library instead. -ZEN C - -Niv-Mizzet, the Firemind -{2}{U}{U}{R}{R} -Legendary Creature - Dragon Wizard -4/4 -Flying -Whenever you draw a card, Niv-Mizzet, the Firemind deals 1 damage to target creature or player. -{T}: Draw a card. -GPT R, FVD R - -Niveous Wisps -{W} -Instant -Target creature becomes white until end of turn. Tap that creature. -Draw a card. -SHM C - -Nivix, Aerie of the Firemind -Land -{T}: Add {1} to your mana pool. -{2}{U}{R}, {T}: Exile the top card of your library. Until your next turn, you may cast that card if it's an instant or sorcery. -GPT U - -Nix -{U} -Instant -Counter target spell if no mana was spent to cast it. -FUT R - -No Mercy -{2}{B}{B} -Enchantment -Whenever a creature deals damage to you, destroy it. -ULG R - -No Quarter -{3}{R} -Enchantment -Whenever a creature becomes blocked by a creature with lesser power, destroy the blocking creature. -Whenever a creature blocks a creature with lesser power, destroy the attacking creature. -TMP R - -No Rest for the Wicked -{1}{B} -Enchantment -Sacrifice No Rest for the Wicked: Return to your hand all creature cards in your graveyard that were put there from the battlefield this turn. -USG U, 10E U - -No-Dachi -{2} -Artifact - Equipment -Equipped creature gets +2/+0 and has first strike. -Equip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) -CHK U - -Nobilis of War -{R/W}{R/W}{R/W}{R/W}{R/W} -Creature - Spirit Avatar -3/4 -Flying -Attacking creatures you control get +2/+0. -EVE R - -Noble Benefactor -{2}{U} -Creature - Human Cleric -2/2 -When Noble Benefactor dies, each player may search his or her library for a card and put that card into his or her hand. Then each player who searched his or her library this way shuffles it. -WTH U - -Noble Elephant -{3}{W} -Creature - Elephant -2/2 -Trample; banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -MIR C - -Noble Hierarch -{G} -Creature - Human Druid -0/1 -Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.) -{T}: Add {G}, {W}, or {U} to your mana pool. -CON R - -Noble Panther -{1}{G}{W} -Creature - Cat -3/3 -{1}: Noble Panther gains first strike until end of turn. -INV R - -Noble Purpose -{3}{W}{W} -Enchantment -Whenever a creature you control deals combat damage, you gain that much life. -MMQ U, 8ED R - -Noble Stand -{4}{W} -Enchantment -Whenever a creature you control blocks, you gain 2 life. -NEM U - -Noble Steeds -{2}{W} -Enchantment -{1}{W}: Target creature gains first strike until end of turn. -ALL C (x2) - -Noble Templar -{5}{W} -Creature - Human Cleric Soldier -3/6 -Vigilance -Plainscycling {2} ({2}, Discard this card: Search your library for a Plains card, reveal it, and put it into your hand. Then shuffle your library.) -SCG C - -Noble Vestige -{2}{W} -Creature - Spirit -1/2 -Flying -{T}: Prevent the next 1 damage that would be dealt to target player this turn. -ZEN C - -Nocturnal Raid -{2}{B}{B} -Instant -Black creatures get +2/+0 until end of turn. -MIR U, 7ED U - -Noetic Scales -{4} -Artifact -At the beginning of each player's upkeep, return to its owner's hand each creature that player controls with power greater than the number of cards in his or her hand. -USG R - -Noggin Whack -{2}{B}{B} -Tribal Sorcery - Rogue -Prowl {1}{B} (You may cast this for its prowl cost if you dealt combat damage to a player this turn with a Rogue.) -Target player reveals three cards from his or her hand. You choose two of them. That player discards those cards. -MOR U - -Noggle Bandit -{1}{U/R}{U/R} -Creature - Noggle Rogue -2/2 -Noggle Bandit can't be blocked except by creatures with defender. -EVE C - -Noggle Bridgebreaker -{2}{U/R}{U/R} -Creature - Noggle Rogue -4/3 -When Noggle Bridgebreaker enters the battlefield, return a land you control to its owner's hand. -EVE C - -Noggle Hedge-Mage -{2}{U/R} -Creature - Noggle Wizard -2/2 -When Noggle Hedge-Mage enters the battlefield, if you control two or more Islands, you may tap two target permanents. -When Noggle Hedge-Mage enters the battlefield, if you control two or more Mountains, you may have Noggle Hedge-Mage deal 2 damage to target player. -EVE U - -Noggle Ransacker -{2}{U/R} -Creature - Noggle Rogue -2/1 -When Noggle Ransacker enters the battlefield, each player draws two cards, then discards a card at random. -EVE U - -Nomad Decoy -{2}{W} -Creature - Human Nomad -1/2 -{W}, {T}: Tap target creature. -Threshold - {W}{W}, {T}: Tap two target creatures. Activate this ability only if seven or more cards are in your graveyard. -ODY U - -Nomad Mythmaker -{2}{W} -Creature - Human Nomad Cleric -2/2 -{W}, {T}: Put target Aura card from a graveyard onto the battlefield under your control attached to a creature you control. -JUD R, 10E R - -Nomad Stadium -Land -{T}: Add {W} to your mana pool. Nomad Stadium deals 1 damage to you. -Threshold - {W}, {T}, Sacrifice Nomad Stadium: You gain 4 life. Activate this ability only if seven or more cards are in your graveyard. -ODY U - -Nomadic Elf -{1}{G} -Creature - Elf Nomad -2/2 -{1}{G}: Add one mana of any color to your mana pool. -INV C, PVC C - -Nomads en-Kor -{W} -Creature - Kor Nomad Soldier -1/1 -{0}: The next 1 damage that would be dealt to Nomads en-Kor this turn is dealt to target creature you control instead. -STH C - -Nomads' Assembly -{4}{W}{W} -Sorcery -Put a 1/1 white Kor Soldier creature token onto the battlefield for each creature you control. -Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -ROE R - -Norin the Wary -{R} -Legendary Creature - Human Warrior -2/1 -When a player casts a spell or a creature attacks, exile Norin the Wary. Return it to the battlefield under its owner's control at the beginning of the next end step. -TSP R - -Norn's Annex -{3}{W/P}{W/P} -Artifact -({W/P} can be paid with either {W} or 2 life.) -Creatures can't attack you or a planeswalker you control unless their controller pays {W/P} for each of those creatures. -NPH R - -Norritt -{3}{B} -Creature - Imp -1/1 -{T}: Untap target blue creature. -{T}: Choose target non-Wall creature the active player has controlled continuously since the beginning of the turn. That creature attacks this turn if able. If it doesn't, destroy it at the beginning of the next end step. Activate this ability only before attackers are declared. -ICE C - -North Star -{4} -Artifact -{4}, {T}: For one spell this turn, you may spend mana as though it were mana of any color to pay that spell's mana cost. (Additional costs are still paid normally.) -LEG R - -Northern Paladin -{2}{W}{W} -Creature - Human Knight -3/3 -{W}{W}, {T}: Destroy target black permanent. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 7ED R - -Norwood Archers -{3}{G} -Creature - Elf Archer -3/3 -Reach (This creature can block creatures with flying.) -P02 C, S99 C - -Norwood Priestess -{2}{G}{G} -Creature - Elf Druid -1/1 -{T}: You may put a green creature card from your hand onto the battlefield. Activate this ability only during your turn, before attackers are declared. -P02 R - -Norwood Ranger -{G} -Creature - Elf Scout -1/2 -P02 C, S99 C, 8ED C, 9ED C - -Norwood Riders -{3}{G} -Creature - Elf -3/3 -Norwood Riders can't be blocked by more than one creature. -P02 C - -Norwood Warrior -{2}{G} -Creature - Elf Warrior -2/2 -Whenever Norwood Warrior becomes blocked, it gets +1/+1 until end of turn. -P02 C - -Nostalgic Dreams -{G}{G} -Sorcery -As an additional cost to cast Nostalgic Dreams, discard X cards. -Return X target cards from your graveyard to your hand. Exile Nostalgic Dreams. -TOR R - -Nosy Goblin -{2}{R} -Creature - Goblin -2/1 -{T}, Sacrifice Nosy Goblin: Destroy target face-down creature. -ONS C - -Not of This World -{7} -Tribal Instant - Eldrazi -Counter target spell or ability that targets a permanent you control. -Not of This World costs {7} less to cast if it targets a spell or ability that targets a creature you control with power 7 or greater. -ROE U - -Nothing Can Stop Me Now -Ongoing Scheme -(An ongoing scheme remains face up until it's abandoned.) -If a source an opponent controls would deal damage to you, prevent 1 of that damage. -At the beginning of each end step, if you've been dealt 5 or more damage this turn, abandon this scheme. -ARC C - -Notorious Assassin -{3}{B} -Creature - Human Spellshaper Assassin -2/2 -{2}{B}, {T}, Discard a card: Destroy target nonblack creature. It can't be regenerated. -MMQ R - -Notorious Throng -{3}{U} -Tribal Sorcery - Rogue -Prowl {5}{U} (You may cast this for its prowl cost if you dealt combat damage to a player this turn with a Rogue.) -Put X 1/1 black Faerie Rogue creature tokens with flying onto the battlefield, where X is the damage dealt to your opponents this turn. If Notorious Throng's prowl cost was paid, take an extra turn after this one. -MOR R - -Nourish -{G}{G} -Instant -You gain 6 life. -DST C - -Nourishing Shoal -{X}{G}{G} -Instant - Arcane -You may exile a green card with converted mana cost X from your hand rather than pay Nourishing Shoal's mana cost. -You gain X life. -BOK R - -Nova Chaser -{3}{R} -Creature - Elemental Warrior -10/2 -Trample -Champion an Elemental (When this enters the battlefield, sacrifice it unless you exile another Elemental you control. When this leaves the battlefield, that card returns to the battlefield.) -LRW R - -Nova Cleric -{W} -Creature - Human Cleric -1/2 -{2}{W}, {T}, Sacrifice Nova Cleric: Destroy all enchantments. -ONS U - -Nova Pentacle -{4} -Artifact -{3}, {T}: The next time a source of your choice would deal damage to you this turn, that damage is dealt to target creature of an opponent's choice instead. -LEG R, ME3 R - -Novablast Wurm -{3}{G}{G}{W}{W} -Creature - Wurm -7/7 -Whenever Novablast Wurm attacks, destroy all other creatures. -WWK M - -Novijen Sages -{4}{U}{U} -Creature - Human Advisor Mutant -0/0 -Graft 4 (This creature enters the battlefield with four +1/+1 counters on it. Whenever another creature enters the battlefield, you may move a +1/+1 counter from this creature onto it.) -{1}, Remove two +1/+1 counters from among creatures you control: Draw a card. -DIS R - -Novijen, Heart of Progress -Land -{T}: Add {1} to your mana pool. -{G}{U}, {T}: Put a +1/+1 counter on each creature that entered the battlefield this turn. -DIS U - -Noxious Field -{1}{B}{B} -Enchantment - Aura -Enchant land -Enchanted land has "{T}: This land deals 1 damage to each creature and each player." -PCY U - -Noxious Ghoul -{3}{B}{B} -Creature - Zombie -3/3 -Whenever Noxious Ghoul or another Zombie enters the battlefield, all non-Zombie creatures get -1/-1 until end of turn. -LGN U, HOP U - -Noxious Hatchling -{3}{B/G} -Creature - Elemental -6/6 -Noxious Hatchling enters the battlefield with four -1/-1 counters on it. -Wither (This deals damage to creatures in the form of -1/-1 counters.) -Whenever you cast a black spell, remove a -1/-1 counter from Noxious Hatchling. -Whenever you cast a green spell, remove a -1/-1 counter from Noxious Hatchling. -EVE U - -Noxious Revival -{G/P} -Instant -({G/P} can be paid with either {G} or 2 life.) -Put target card from a graveyard on top of its owner's library. -NPH U - -Noxious Toad -{2}{B} -Creature - Frog -1/1 -When Noxious Toad dies, each opponent discards a card. -POR U - -Noxious Vapors -{1}{B}{B} -Sorcery -Each player reveals his or her hand and chooses one card of each color from it, then discards all other nonland cards. -PLS U - -Nucklavee -{4}{U/R}{U/R} -Creature - Beast -4/4 -When Nucklavee enters the battlefield, you may return target red sorcery card from your graveyard to your hand. -When Nucklavee enters the battlefield, you may return target blue instant card from your graveyard to your hand. -EVE U, COM U - -Nuisance Engine -{3} -Artifact -{2}, {T}: Put a 0/1 colorless Pest artifact creature token onto the battlefield. -MRD U, HOP U - -Null Brooch -{4} -Artifact -{2}, {T}, Discard your hand: Counter target noncreature spell. -EXO R - -Null Chamber -{3}{W} -World Enchantment -As Null Chamber enters the battlefield, you and an opponent each name a card other than a basic land card. -The named cards can't be played. -MIR R - -Null Champion -{1}{B} -Creature - Zombie Warrior -1/1 -Level up {3} ({3}: Put a level counter on this. Level up only as a sorcery.) -LEVEL 1-3 -4/2 -LEVEL 4+ -7/3 -{B}: Regenerate Null Champion. -ROE C - -Null Profusion -{4}{B}{B} -Enchantment -Skip your draw step. -Whenever you play a card, draw a card. -Your maximum hand size is two. -PLC R - -Null Rod -{2} -Artifact -Activated abilities of artifacts can't be activated. -WTH R - -Nullmage Advocate -{2}{G} -Creature - Insect Druid -2/3 -{T}: Return two target cards from an opponent's graveyard to his or her hand. Destroy target artifact or enchantment. -JUD C - -Nullmage Shepherd -{3}{G} -Creature - Elf Shaman -2/4 -Tap four untapped creatures you control: Destroy target artifact or enchantment. -RAV U - -Nullstone Gargoyle -{9} -Artifact Creature - Gargoyle -4/5 -Flying -Whenever the first noncreature spell of a turn is cast, counter that spell. -RAV R - -Nulltread Gargantuan -{1}{G}{U} -Creature - Beast -5/6 -When Nulltread Gargantuan enters the battlefield, put a creature you control on top of its owner's library. -ARB U - -Numai Outcast -{3}{B} -Creature - Human Samurai -1/1 -Bushido 2 (When this blocks or becomes blocked, it gets +2/+2 until end of turn.) -{B}, Pay 5 life: Regenerate Numai Outcast. -CHK U - -Numbing Dose -{3}{U}{U} -Enchantment - Aura -Enchant artifact or creature -Enchanted permanent doesn't untap during its controller's untap step. -At the beginning of the upkeep of enchanted permanent's controller, that player loses 1 life. -NPH C - -Numot, the Devastator -{3}{R}{W}{U} -Legendary Creature - Dragon -6/6 -Flying -Whenever Numot, the Devastator deals combat damage to a player, you may pay {2}{R}. If you do, destroy up to two target lands. -PLC R, COM R - -Nurturer Initiate -{G} -Creature - Elf Shaman -1/1 -Whenever a player casts a green spell, you may pay {1}. If you do, target creature gets +1/+1 until end of turn. -SHM C - -Nurturing Licid -{1}{G} -Creature - Licid -1/1 -{G}, {T}: Nurturing Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {G} to end this effect. -{G}: Regenerate enchanted creature. -TMP U - -Nut Collector -{5}{G} -Creature - Human Druid -1/1 -At the beginning of your upkeep, you may put a 1/1 green Squirrel creature token onto the battlefield. -Threshold - Squirrel creatures get +2/+2 as long as seven or more cards are in your graveyard. -ODY R - -Nyxathid -{1}{B}{B} -Creature - Elemental -7/7 -As Nyxathid enters the battlefield, choose an opponent. -Nyxathid gets -1/-1 for each card in the chosen player's hand. -CON R - -O-Naginata -{1} -Artifact - Equipment -O-Naginata can be attached only to a creature with 3 or more power. -Equipped creature gets +3/+0 and has trample. -Equip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) -SOK U - -Oaken Brawler -{3}{W} -Creature - Treefolk Warrior -2/4 -When Oaken Brawler enters the battlefield, clash with an opponent. If you win, put a +1/+1 counter on Oaken Brawler. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -LRW C - -Oakenform -{2}{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +3/+3. -M10 C - -Oakgnarl Warrior -{5}{G}{G} -Creature - Treefolk Warrior -5/7 -Vigilance, trample -LRW C - -Oasis -Land -{T}: Prevent the next 1 damage that would be dealt to target creature this turn. -ARN U, 4ED U, ME4 C - -Oath of Druids -{1}{G} -Enchantment -At the beginning of each player's upkeep, that player chooses target player who controls more creatures than he or she does and is his or her opponent. The first player may reveal cards from the top of his or her library until he or she reveals a creature card. If he or she does, that player puts that card onto the battlefield and all other cards revealed this way into his or her graveyard. -EXO R - -Oath of Ghouls -{1}{B} -Enchantment -At the beginning of each player's upkeep, that player chooses target player whose graveyard has fewer creature cards in it than his or her graveyard does and is his or her opponent. The first player may return a creature card from his or her graveyard to his or her hand. -EXO R - -Oath of Lieges -{1}{W} -Enchantment -At the beginning of each player's upkeep, that player chooses target player who controls more lands than he or she does and is his or her opponent. The first player may search his or her library for a basic land card, put that card onto the battlefield, then shuffle his or her library. -EXO R - -Oath of Lim-Dul -{3}{B} -Enchantment -Whenever you lose life, for each 1 life you lost, sacrifice a permanent other than Oath of Lim-Dul unless you discard a card. (Damage dealt to you causes you to lose life.) -{B}{B}: Draw a card. -ICE R - -Oath of Mages -{1}{R} -Enchantment -At the beginning of each player's upkeep, that player chooses target player who has more life than he or she does and is his or her opponent. The first player may have Oath of Mages deal 1 damage to the second player. -EXO R - -Oath of Scholars -{3}{U} -Enchantment -At the beginning of each player's upkeep, that player chooses target player who has more cards in hand than he or she does and is his or her opponent. The first player may discard his or her hand and draw three cards. -EXO R - -Oathkeeper, Takeno's Daisho -{3} -Legendary Artifact - Equipment -Equipped creature gets +3/+1. -Whenever equipped creature dies, return that card to the battlefield under your control if it's a Samurai card. -When Oathkeeper, Takeno's Daisho is put into a graveyard from the battlefield, exile equipped creature. -Equip {2} -CHK R - -Oathsworn Giant -{4}{W}{W} -Creature - Giant Soldier -3/4 -Vigilance -Other creatures you control get +0/+2 and have vigilance. -RAV U - -Ob Nixilis, the Fallen -{3}{B}{B} -Legendary Creature - Demon -3/3 -Landfall - Whenever a land enters the battlefield under your control, you may have target player lose 3 life. If you do, put three +1/+1 counters on Ob Nixilis, the Fallen. -ZEN M - -Obelisk of Alara -{6} -Artifact -{1}{W}, {T}: You gain 5 life. -{1}{U}, {T}: Draw a card, then discard a card. -{1}{B}, {T}: Target creature gets -2/-2 until end of turn. -{1}{R}, {T}: Obelisk of Alara deals 3 damage to target player. -{1}{G}, {T}: Target creature gets +4/+4 until end of turn. -CON R - -Obelisk of Bant -{3} -Artifact -{T}: Add {G}, {W}, or {U} to your mana pool. -ALA C - -Obelisk of Esper -{3} -Artifact -{T}: Add {W}, {U}, or {B} to your mana pool. -ALA C, ARC C - -Obelisk of Grixis -{3} -Artifact -{T}: Add {U}, {B}, or {R} to your mana pool. -ALA C - -Obelisk of Jund -{3} -Artifact -{T}: Add {B}, {R}, or {G} to your mana pool. -ALA C - -Obelisk of Naya -{3} -Artifact -{T}: Add {R}, {G}, or {W} to your mana pool. -ALA C - -Obelisk of Undoing -{1} -Artifact -{6}, {T}: Return target permanent you both own and control to your hand. -ATQ R, CHR R, 5ED R, ME4 R - -Oblation -{2}{W} -Instant -The owner of target nonland permanent shuffles it into his or her library, then draws two cards. -ONS R, COM R - -Obliterate -{6}{R}{R} -Sorcery -Obliterate can't be countered. -Destroy all artifacts, creatures, and lands. They can't be regenerated. -INV R, 8ED R - -Oblivion Crown -{1}{B} -Enchantment - Aura -Flash (You may cast this spell any time you could cast an instant.) -Enchant creature -Enchanted creature has "Discard a card: This creature gets +1/+1 until end of turn." -FUT C - -Oblivion Ring -{2}{W} -Enchantment -When Oblivion Ring enters the battlefield, exile another target nonland permanent. -When Oblivion Ring leaves the battlefield, return the exiled card to the battlefield under its owner's control. -LRW C, ALA C, HOP C, ARC C, DDG C, COM C, M12 U - -Oblivion Stone -{3} -Artifact -{4}, {T}: Put a fate counter on target permanent. -{5}, {T}, Sacrifice Oblivion Stone: Destroy each nonland permanent without a fate counter on it, then remove all fate counters from all permanents. -MRD R, COM R - -Oboro Breezecaller -{1}{U} -Creature - Moonfolk Wizard -1/1 -Flying -{2}, Return a land you control to its owner's hand: Untap target land. -SOK C - -Oboro Envoy -{3}{U} -Creature - Moonfolk Wizard -1/3 -Flying -{2}, Return a land you control to its owner's hand: Target creature gets -X/-0 until end of turn, where X is the number of cards in your hand. -SOK U - -Oboro, Palace in the Clouds -Legendary Land -{T}: Add {U} to your mana pool. -{1}: Return Oboro, Palace in the Clouds to its owner's hand. -SOK R - -Obsessive Search -{U} -Instant -Draw a card. -Madness {U} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -TOR C - -Obsianus Golem -{6} -Artifact Creature - Golem -4/6 -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 6ED U, S00 U, ME4 C - -Obsidian Acolyte -{1}{W} -Creature - Human Cleric -1/1 -Protection from black -{W}: Target creature gains protection from black until end of turn. -INV C - -Obsidian Battle-Axe -{3} -Tribal Artifact - Warrior Equipment -Equipped creature gets +2/+1 and has haste. -Whenever a Warrior creature enters the battlefield, you may attach Obsidian Battle-Axe to it. -Equip {3} -MOR U - -Obsidian Fireheart -{1}{R}{R}{R} -Creature - Elemental -4/4 -{1}{R}{R}: Put a blaze counter on target land without a blaze counter on it. For as long as that land has a blaze counter on it, it has "At the beginning of your upkeep, this land deals 1 damage to you." (The land continues to burn after Obsidian Fireheart has left the battlefield.) -ZEN M - -Obsidian Giant -{4}{R} -Creature - Giant -4/4 -P02 U - -Obstinate Baloth -{2}{G}{G} -Creature - Beast -4/4 -When Obstinate Baloth enters the battlefield, you gain 4 life. -If a spell or ability an opponent controls causes you to discard Obstinate Baloth, put it onto the battlefield instead of putting it into your graveyard. -M11 R - -Obstinate Familiar -{R} -Creature - Lizard -1/1 -If you would draw a card, you may skip that draw instead. -ODY R - -Ocular Halo -{3}{U} -Enchantment - Aura -Enchant creature -Enchanted creature has "{T}: Draw a card." -{W}: Enchanted creature gains vigilance until end of turn. -DIS C - -Oculus -{1}{U} -Creature - Homunculus -1/1 -When Oculus dies, you may draw a card. -MBS C - -Odds -{U}{R} -Instant -Flip a coin. If it comes up heads, counter target instant or sorcery spell. If it comes up tails, copy that spell and you may choose new targets for the copy. ----- -Ends -{3}{R}{W} -Instant -Target player sacrifices two attacking creatures. -DIS R - -Odious Trow -{B/G} -Creature - Troll -1/1 -{1}{B/G}: Regenerate Odious Trow. -EVE C - -Odylic Wraith -{3}{B} -Creature - Wraith -2/2 -Swampwalk -Whenever Odylic Wraith deals damage to a player, that player discards a card. -WTH U - -Off Balance -{W} -Instant -Target creature can't attack or block this turn. -NEM C - -Offalsnout -{2}{B} -Creature - Elemental -2/2 -Flash -When Offalsnout leaves the battlefield, exile target card from a graveyard. -Evoke {B} (You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield.) -MOR U - -Offering to Asha -{2}{W}{U} -Instant -Counter target spell unless its controller pays {4}. You gain 4 life. -ARB C - -Ogre Arsonist -{4}{R} -Creature - Ogre -3/3 -When Ogre Arsonist enters the battlefield, destroy target land. -P02 U - -Ogre Berserker -{4}{R} -Creature - Ogre Berserker -4/2 -Haste -P02 C - -Ogre Enforcer -{3}{R}{R} -Creature - Ogre -4/4 -Ogre Enforcer can't be destroyed by lethal damage unless lethal damage dealt by a single source is marked on it. -VIS R - -Ogre Gatecrasher -{3}{R} -Creature - Ogre Rogue -3/3 -When Ogre Gatecrasher enters the battlefield, destroy target creature with defender. -DIS C - -Ogre Geargrabber -{4}{R}{R} -Creature - Ogre Warrior -4/4 -Whenever Ogre Geargrabber attacks, gain control of target Equipment an opponent controls until end of turn. Attach it to Ogre Geargrabber. When you lose control of that Equipment, unattach it. -SOM U - -Ogre Leadfoot -{4}{R} -Creature - Ogre -3/3 -Whenever Ogre Leadfoot becomes blocked by an artifact creature, destroy that creature. -MRD C - -Ogre Marauder -{1}{B}{B} -Creature - Ogre Warrior -3/1 -Whenever Ogre Marauder attacks, it gains "Ogre Marauder is unblockable" until end of turn unless defending player sacrifices a creature. -BOK U - -Ogre Menial -{3}{R} -Creature - Ogre -0/4 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -{R}: Ogre Menial gets +1/+0 until end of turn. -NPH C - -Ogre Recluse -{3}{R} -Creature - Ogre Warrior -5/4 -Whenever a player casts a spell, tap Ogre Recluse. -BOK U - -Ogre Resister -{2}{R}{R} -Creature - Ogre -4/3 -MBS C - -Ogre Savant -{4}{R} -Creature - Ogre Wizard -3/2 -When Ogre Savant enters the battlefield, if {U} was spent to cast Ogre Savant, return target creature to its owner's hand. -GPT C - -Ogre Sentry -{1}{R} -Creature - Ogre Warrior -3/3 -Defender -ROE C - -Ogre Shaman -{3}{R}{R} -Creature - Ogre Shaman -3/3 -{2}, Discard a card at random: Ogre Shaman deals 2 damage to target creature or player. -EXO R - -Ogre Taskmaster -{3}{R} -Creature - Ogre -4/3 -Ogre Taskmaster can't block. -P02 U, MMQ U, 7ED U, 8ED U, 9ED U, ME4 C - -Ogre Warrior -{3}{R} -Creature - Ogre Warrior -3/3 -P02 C, S99 C, S00 C - -Ogre's Cleaver -{2} -Artifact - Equipment -Equipped creature gets +5/+0. -Equip {5} -ROE U - -Ohran Viper -{1}{G}{G} -Snow Creature - Snake -1/3 -Whenever Ohran Viper deals combat damage to a creature, destroy that creature at end of combat. -Whenever Ohran Viper deals combat damage to a player, you may draw a card. -CSP R - -Ohran Yeti -{3}{R} -Snow Creature - Yeti -3/3 -{2}{S}: Target snow creature gains first strike until end of turn. ({S} can be paid with one mana from a snow permanent.) -CSP C - -Okiba-Gang Shinobi -{3}{B}{B} -Creature - Rat Ninja -3/2 -Ninjutsu {3}{B} ({3}{B}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -Whenever Okiba-Gang Shinobi deals combat damage to a player, that player discards two cards. -BOK C - -Okina Nightwatch -{4}{G} -Creature - Human Monk -4/3 -As long as you have more cards in hand than each opponent, Okina Nightwatch gets +3/+3. -SOK C - -Okina, Temple to the Grandfathers -Legendary Land -{T}: Add {G} to your mana pool. -{G}, {T}: Target legendary creature gets +1/+1 until end of turn. -CHK R - -Okk -{1}{R} -Creature - Goblin -4/4 -Okk can't attack unless a creature with greater power also attacks. -Okk can't block unless a creature with greater power also blocks. -USG R, 7ED R, 8ED R - -Old Ghastbark -{3}{G/W}{G/W} -Creature - Treefolk Warrior -3/6 -SHM C - -Old Man of the Sea -{1}{U}{U} -Creature - Djinn -2/3 -You may choose not to untap Old Man of the Sea during your untap step. -{T}: Gain control of target creature with power less than or equal to Old Man of the Sea's power for as long as Old Man of the Sea remains tapped and that creature's power remains less than or equal to Old Man of the Sea's power. -ARN R, ME3 R - -Omega Myr -{2} -Artifact Creature - Myr -1/2 -MRD C - -Omen -{1}{U} -Sorcery -Look at the top three cards of your library, then put them back in any order. You may shuffle your library. -Draw a card. -POR C - -Omen Machine -{6} -Artifact -Players can't draw cards. -At the beginning of each player's draw step, that player exiles the top card of his or her library. If it's a land card, the player puts it onto the battlefield. Otherwise, the player casts it without paying its mana cost if able. -NPH R - -Omen of Fire -{3}{R}{R} -Instant -Return all Islands to their owners' hands. -Each player sacrifices a Plains or a white permanent for each white permanent he or she controls. -ALL R - -Omnath, Locus of Mana -{2}{G} -Legendary Creature - Elemental -1/1 -Green mana doesn't empty from your mana pool as steps and phases end. -Omnath, Locus of Mana gets +1/+1 for each green mana in your mana pool. -WWK M - -Omnibian -{1}{G}{G}{U} -Creature - Frog -3/3 -{T}: Target creature becomes a 3/3 Frog until end of turn. -DIS R - -Ondu Cleric -{1}{W} -Creature - Kor Cleric Ally -1/1 -Whenever Ondu Cleric or another Ally enters the battlefield under your control, you may gain life equal to the number of Allies you control. -ZEN C - -Ondu Giant -{3}{G} -Creature - Giant Druid -2/4 -When Ondu Giant enters the battlefield, you may search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. -ROE C - -One Dozen Eyes -{5}{G} -Sorcery -Choose one - Put a 5/5 green Beast creature token onto the battlefield; or put five 1/1 green Insect creature tokens onto the battlefield. -Entwine {G}{G}{G} (Choose both if you pay the entwine cost.) -MRD U - -One with Nature -{G} -Enchantment - Aura -Enchant creature -Whenever enchanted creature deals combat damage to a player, you may search your library for a basic land card, put that card onto the battlefield tapped, then shuffle your library. -SCG U - -One with Nothing -{B} -Instant -Discard your hand. -SOK R - -Oni Possession -{2}{B} -Enchantment - Aura -Enchant creature -At the beginning of your upkeep, sacrifice a creature. -Enchanted creature gets +3/+3 and has trample. -Enchanted creature is a Demon Spirit. -CHK U, DVD U - -Oni of Wild Places -{5}{R} -Creature - Demon Spirit -6/5 -Haste -At the beginning of your upkeep, return a red creature you control to its owner's hand. -SOK U, COM U - -Oni of Wild Places Avatar -Vanguard -Hand +0, life -2 -Creatures you control have haste. -At the beginning of your upkeep, return a creature you control to its owner's hand. -VG S - -Only Blood Ends Your Nightmares -Scheme -When you set this scheme in motion, each opponent sacrifices a creature. Then each opponent who didn't sacrifice a creature discards two cards. -ARC C - -Onslaught -{R} -Enchantment -Whenever you cast a creature spell, tap target creature. -EXO C - -Onulet -{3} -Artifact Creature - Construct -2/2 -When Onulet dies, you gain 2 life. -ATQ U, 3ED R, 4ED R, MED C, ME4 C - -Onyx Goblet -{2}{B} -Artifact -{T}: Target player loses 1 life. -ALA C - -Onyx Mage -{1}{B} -Creature - Human Wizard -2/1 -{1}{B}: Target creature you control gains deathtouch until end of turn. (Any amount of damage it deals to a creature is enough to destroy it.) -M12 U - -Onyx Talisman -{2} -Artifact -Whenever a player casts a black spell, you may pay {3}. If you do, untap target permanent. -ICE U - -Oona's Blackguard -{1}{B} -Creature - Faerie Rogue -1/1 -Flying -Each other Rogue creature you control enters the battlefield with an additional +1/+1 counter on it. -Whenever a creature you control with a +1/+1 counter on it deals combat damage to a player, that player discards a card. -MOR U - -Oona's Gatewarden -{U/B} -Creature - Faerie Soldier -2/1 -Defender, flying -Wither (This deals damage to creatures in the form of -1/-1 counters.) -SHM C - -Oona's Grace -{2}{U} -Instant -Target player draws a card. -Retrace (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) -EVE C - -Oona's Prowler -{1}{B} -Creature - Faerie Rogue -3/1 -Flying -Discard a card: Oona's Prowler gets -2/-0 until end of turn. Any player may activate this ability. -LRW R - -Oona, Queen of the Fae -{3}{U/B}{U/B}{U/B} -Legendary Creature - Faerie Wizard -5/5 -Flying -{X}{U/B}: Choose a color. Target opponent exiles the top X cards of his or her library. For each card of the chosen color exiled this way, put a 1/1 blue and black Faerie Rogue creature token with flying onto the battlefield. -SHM R - -Ooze Garden -{1}{G} -Enchantment -{1}{G}, Sacrifice a non-Ooze creature: Put an X/X green Ooze creature token onto the battlefield, where X is the sacrificed creature's power. Activate this ability only any time you could cast a sorcery. -ALA R - -Opal Acrolith -{2}{W} -Enchantment -Whenever an opponent casts a creature spell, if Opal Acrolith is an enchantment, Opal Acrolith becomes a 2/4 Soldier creature. -{0}: Opal Acrolith becomes an enchantment. -USG U - -Opal Archangel -{4}{W} -Enchantment -When an opponent casts a creature spell, if Opal Archangel is an enchantment, Opal Archangel becomes a 5/5 Angel creature with flying and vigilance. -USG R - -Opal Avenger -{2}{W} -Enchantment -When you have 10 or less life, if Opal Avenger is an enchantment, Opal Avenger becomes a 3/5 Soldier creature. -ULG R - -Opal Caryatid -{W} -Enchantment -When an opponent casts a creature spell, if Opal Caryatid is an enchantment, Opal Caryatid becomes a 2/2 Soldier creature. -USG C - -Opal Champion -{2}{W} -Enchantment -When an opponent casts a creature spell, if Opal Champion is an enchantment, Opal Champion becomes a 3/3 Knight creature with first strike. -ULG C - -Opal Gargoyle -{1}{W} -Enchantment -When an opponent casts a creature spell, if Opal Gargoyle is an enchantment, Opal Gargoyle becomes a 2/2 Gargoyle creature with flying. -USG C - -Opal Guardian -{W}{W}{W} -Enchantment -When an opponent casts a creature spell, if Opal Guardian is an enchantment, Opal Guardian becomes a 3/4 Gargoyle creature with flying and protection from red. -TSP R - -Opal Titan -{2}{W}{W} -Enchantment -When an opponent casts a creature spell, if Opal Titan is an enchantment, Opal Titan becomes a 4/4 Giant creature with protection from each of that spell's colors. -USG R - -Opal-Eye, Konda's Yojimbo -{1}{W}{W} -Legendary Creature - Fox Samurai -1/4 -Defender (This creature can't attack.) -Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -{T}: The next time a source of your choice would deal damage this turn, that damage is dealt to Opal-Eye, Konda's Yojimbo instead. -{1}{W}: Prevent the next 1 damage that would be dealt to Opal-Eye this turn. -BOK R - -Opalescence -{2}{W}{W} -Enchantment -Each other non-Aura enchantment is a creature with power and toughness each equal to its converted mana cost. It's still an enchantment. -UDS R - -Opaline Bracers -{4} -Artifact - Equipment -Sunburst (This enters the battlefield with a charge counter on it for each color of mana spent to cast it.) -Equipped creature gets +X/+X, where X is the number of charge counters on Opaline Bracers. -Equip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) -5DN C - -Opaline Sliver -{1}{W}{U} -Creature - Sliver -2/2 -All Slivers have "Whenever this permanent becomes the target of a spell an opponent controls, you may draw a card." -TSP U - -Open the Vaults -{4}{W}{W} -Sorcery -Return all artifact and enchantment cards from all graveyards to the battlefield under their owners' control. (Auras with nothing to enchant remain in graveyards.) -M10 R - -Ophidian -{2}{U} -Creature - Snake -1/3 -Whenever Ophidian attacks and isn't blocked, you may draw a card. If you do, Ophidian assigns no combat damage this turn. -WTH C, JVC C - -Ophidian Eye -{2}{U} -Enchantment - Aura -Flash (You may cast this spell any time you could cast an instant.) -Enchant creature -Whenever enchanted creature deals damage to an opponent, you may draw a card. -TSP C - -Opportunist -{2}{R} -Creature - Human Soldier -2/2 -{T}: Opportunist deals 1 damage to target creature that was dealt damage this turn. -TMP U - -Opportunity -{4}{U}{U} -Instant -Target player draws four cards. -ULG U, BRB U, 7ED U - -Opposition -{2}{U}{U} -Enchantment -Tap an untapped creature you control: Tap target artifact, creature, or land. -UDS R, 7ED R - -Oppression -{1}{B}{B} -Enchantment -Whenever a player casts a spell, that player discards a card. -USG R, 7ED R - -Oppressive Will -{2}{U} -Instant -Counter target spell unless its controller pays {1} for each card in your hand. -SOK C - -Opt -{U} -Instant -Look at the top card of your library. You may put that card on the bottom of your library. -Draw a card. -INV C - -Oracle -Vanguard -Hand +1, life +9 -{0}: Untap target attacking creature you control and remove it from combat. -VG S - -Oracle en-Vec -{1}{W} -Creature - Human Wizard -1/1 -{T}: Target opponent chooses any number of creatures he or she controls. During that player's next turn, the chosen creatures attack if able, and other creatures can't attack. At the beginning of that turn's end step, destroy each of the chosen creatures that didn't attack. Activate this ability only during your turn. -TMP R - -Oracle of Mul Daya -{3}{G} -Creature - Elf Shaman -2/2 -You may play an additional land on each of your turns. -Play with the top card of your library revealed. -You may play the top card of your library if it's a land card. -ZEN R - -Oracle of Nectars -{2}{G/W} -Creature - Elf Cleric -2/2 -{X}, {T}: You gain X life. -SHM R - -Oracle's Attendants -{3}{W} -Creature - Human Soldier -1/5 -{T}: All damage that would be dealt to target creature this turn by a source of your choice is dealt to Oracle's Attendants instead. -NEM R, 8ED R, 9ED R - -Oran-Rief Recluse -{2}{G} -Creature - Spider -1/3 -Kicker {2}{G} (You may pay an additional {2}{G} as you cast this spell.) -Reach (This creature can block creatures with flying.) -When Oran-Rief Recluse enters the battlefield, if it was kicked, destroy target creature with flying. -ZEN C - -Oran-Rief Survivalist -{1}{G} -Creature - Human Warrior Ally -1/1 -Whenever Oran-Rief Survivalist or another Ally enters the battlefield under your control, you may put a +1/+1 counter on Oran-Rief Survivalist. -ZEN C - -Oran-Rief, the Vastwood -Land -Oran-Rief, the Vastwood enters the battlefield tapped. -{T}: Add {G} to your mana pool. -{T}: Put a +1/+1 counter on each green creature that entered the battlefield this turn. -ZEN R - -Oraxid -{3}{U} -Creature - Crab Beast -2/3 -Protection from red -NEM C - -Orb of Dreams -{3} -Artifact -Permanents enter the battlefield tapped. -BOK R - -Orbweaver Kumo -{4}{G}{G} -Creature - Spirit -3/4 -Reach (This creature can block creatures with flying.) -Whenever you cast a Spirit or Arcane spell, Orbweaver Kumo gains forestwalk until end of turn. -CHK U - -Orc General -{2}{R} -Creature - Orc Warrior -2/2 -{T}, Sacrifice another Orc or Goblin: Other Orc creatures get +1/+1 until end of turn. -DRK U, ME2 U - -Orchard Warden -{4}{G}{G} -Creature - Treefolk Shaman -4/6 -Whenever another Treefolk creature enters the battlefield under your control, you may gain life equal to that creature's toughness. -MOR U - -Orcish Artillery -{1}{R}{R} -Creature - Orc Warrior -1/3 -{T}: Orcish Artillery deals 2 damage to target creature or player and 3 damage to you. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, 6ED U, 7ED U, 8ED U, 9ED U, 10E U - -Orcish Bloodpainter -{2}{R} -Creature - Orc Shaman -2/1 -{T}, Sacrifice a creature: Orcish Bloodpainter deals 1 damage to target creature or player. -CSP C - -Orcish Cannonade -{1}{R}{R} -Instant -Orcish Cannonade deals 2 damage to target creature or player and 3 damage to you. -Draw a card. -TSP C - -Orcish Cannoneers -{1}{R}{R} -Creature - Orc Warrior -1/3 -{T}: Orcish Cannoneers deals 2 damage to target creature or player and 3 damage to you. -ICE U, ME2 U - -Orcish Captain -{R} -Creature - Orc Warrior -1/1 -{1}: Flip a coin. If you win the flip, target Orc creature gets +2/+0 until end of turn. If you lose the flip, it gets -0/-2 until end of turn. -FEM U, 5ED U, ME2 U - -Orcish Catapult -{X}{R}{R} -Instant -Randomly distribute X -0/-1 counters among a random number of random target creatures. -ASTRAL S - -Orcish Conscripts -{R} -Creature - Orc -2/2 -Orcish Conscripts can't attack unless at least two other creatures attack. -Orcish Conscripts can't block unless at least two other creatures block. -ICE C, 5ED C, ME2 C - -Orcish Farmer -{1}{R}{R} -Creature - Orc -2/2 -{T}: Target land becomes a Swamp until its controller's next untap step. -ICE C, 5ED C, ME2 C - -Orcish Healer -{R}{R} -Creature - Orc Cleric -1/1 -{R}{R}, {T}: Target creature can't be regenerated this turn. -{B}{B}{R}, {T}: Regenerate target black or green creature. -{R}{G}{G}, {T}: Regenerate target black or green creature. -ICE U - -Orcish Librarian -{1}{R} -Creature - Orc -1/1 -{R}, {T}: Look at the top eight cards of your library. Exile four of them at random, then put the rest on top of your library in any order. -ICE R, TSB S - -Orcish Lumberjack -{R} -Creature - Orc -1/1 -{T}, Sacrifice a Forest: Add three mana in any combination of {R} and/or {G} to your mana pool. -ICE C, ME2 C - -Orcish Mechanics -{2}{R} -Creature - Orc -1/1 -{T}, Sacrifice an artifact: Orcish Mechanics deals 2 damage to target creature or player. -ATQ C, MED U, ME4 U - -Orcish Mine -{1}{R}{R} -Enchantment - Aura -Enchant land -Orcish Mine enters the battlefield with three ore counters on it. -At the beginning of your upkeep and whenever enchanted land becomes tapped, remove an ore counter from Orcish Mine. If there are no ore counters on Orcish Mine, destroy that land and Orcish Mine deals 2 damage to its controller. -HML U - -Orcish Oriflamme -{3}{R} -Enchantment -Attacking creatures you control get +1/+0. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, 6ED U, S00 U, 7ED U - -Orcish Settlers -{1}{R} -Creature - Orc -1/1 -{X}{X}{R}, {T}, Sacrifice Orcish Settlers: Destroy X target lands. -WTH U - -Orcish Spy -{R} -Creature - Orc Rogue -1/1 -{T}: Look at the top three cards of target player's library. -FEM C (x3), 8ED C - -Orcish Squatters -{4}{R} -Creature - Orc -2/3 -Whenever Orcish Squatters attacks and isn't blocked, you may gain control of target land defending player controls for as long as you control Orcish Squatters. If you do, Orcish Squatters assigns no combat damage this turn. -ICE R, 5ED R, ME2 R - -Orcish Squatters Avatar -Vanguard -Hand -1, life -1 -At the beginning of your precombat main phase, add {X} to your mana pool, where X is the number of lands target opponent controls. -VG S - -Orcish Veteran -{2}{R} -Creature - Orc -2/2 -Orcish Veteran can't block white creatures with power 2 or greater. -{R}: Orcish Veteran gains first strike until end of turn. -FEM C (x4), ME2 C - -Order -{3}{W} -Instant -Exile target attacking creature. ----- -Chaos -{2}{R} -Instant -Creatures can't block this turn. -APC U (x2), HOP U - -Order of Leitbur -{W}{W} -Creature - Human Cleric Knight -2/1 -Protection from black -{W}: Order of Leitbur gains first strike until end of turn. -{W}{W}: Order of Leitbur gets +1/+0 until end of turn. -FEM C (x3), MED C - -Order of Whiteclay -{1}{W}{W} -Creature - Kithkin Cleric -1/4 -{1}{W}{W}, {Q}: Return target creature card with converted mana cost 3 or less from your graveyard to the battlefield. ({Q} is the untap symbol.) -SHM R - -Order of Yawgmoth -{2}{B}{B} -Creature - Zombie Knight -2/2 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -Whenever Order of Yawgmoth deals damage to a player, that player discards a card. -USG U, PVC U - -Order of the Ebon Hand -{B}{B} -Creature - Cleric Knight -2/1 -Protection from white -{B}: Order of the Ebon Hand gains first strike until end of turn. -{B}{B}: Order of the Ebon Hand gets +1/+0 until end of turn. -FEM C (x3), MED C - -Order of the Golden Cricket -{1}{W} -Creature - Kithkin Knight -2/2 -Whenever Order of the Golden Cricket attacks, you may pay {W}. If you do, it gains flying until end of turn. -MOR C - -Order of the Sacred Bell -{3}{G} -Creature - Human Monk -4/3 -CHK C, 9ED C - -Order of the Sacred Torch -{1}{W}{W} -Creature - Human Knight -2/2 -{T}, Pay 1 life: Counter target black spell. -ICE R, 5ED R, 6ED R, ME2 R - -Order of the Stars -{W} -Creature - Human Cleric -0/1 -Defender (This creature can't attack.) -As Order of the Stars enters the battlefield, choose a color. -Order of the Stars has protection from the chosen color. -GPT U - -Order of the White Shield -{W}{W} -Creature - Human Knight -2/1 -Protection from black -{W}: Order of the White Shield gains first strike until end of turn. -{W}{W}: Order of the White Shield gets +1/+0 until end of turn. -ICE U, 5ED U, ME2 U - -Ordered Migration -{3}{W}{U} -Sorcery -Domain - Put a 1/1 blue Bird creature token with flying onto the battlefield for each basic land type among lands you control. -INV U - -Ordruun Commando -{3}{R} -Creature - Minotaur Soldier -4/1 -{W}: Prevent the next 1 damage that would be dealt to Ordruun Commando this turn. -RAV C - -Ore Gorger -{3}{R}{R} -Creature - Spirit -3/1 -Whenever you cast a Spirit or Arcane spell, you may destroy target nonbasic land. -CHK U - -Organ Grinder -{2}{B} -Creature - Zombie -3/1 -{T}, Exile three cards from your graveyard: Target player loses 3 life. -TOR C - -Orgg -{3}{R}{R} -Creature - Orgg -6/6 -Trample -Orgg can't attack if defending player controls an untapped creature with power 3 or greater. -Orgg can't block creatures with power 3 or greater. -FEM R, 5ED R, TSB S - -Origin Spellbomb -{1} -Artifact -{1}, {T}, Sacrifice Origin Spellbomb: Put a 1/1 colorless Myr artifact creature token onto the battlefield. -When Origin Spellbomb is put into a graveyard from the battlefield, you may pay {W}. If you do, draw a card. -SOM C - -Orim -Vanguard -Hand +0, life +12 -Creatures you control have reach. -VG S - -Orim's Chant -{W} -Instant -Kicker {W} (You may pay an additional {W} as you cast this spell.) -Target player can't cast spells this turn. -If Orim's Chant was kicked, creatures can't attack this turn. -PLS R - -Orim's Cure -{1}{W} -Instant -If you control a Plains, you may tap an untapped creature you control rather than pay Orim's Cure's mana cost. -Prevent the next 4 damage that would be dealt to target creature or player this turn. -MMQ C - -Orim's Prayer -{1}{W}{W} -Enchantment -Whenever one or more creatures attack you, you gain 1 life for each attacking creature. -TMP U - -Orim's Thunder -{2}{W} -Instant -Kicker {R} (You may pay an additional {R} as you cast this spell.) -Destroy target artifact or enchantment. If Orim's Thunder was kicked, it deals damage equal to that permanent's converted mana cost to target creature. -APC C, HOP C, COM C - -Orim's Touch -{W} -Instant -Kicker {1} (You may pay an additional {1} as you cast this spell.) -Prevent the next 2 damage that would be dealt to target creature or player this turn. If Orim's Touch was kicked, prevent the next 4 damage that would be dealt to that creature or player this turn instead. -INV C - -Orim, Samite Healer -{1}{W}{W} -Legendary Creature - Human Cleric -1/3 -{T}: Prevent the next 3 damage that would be dealt to target creature or player this turn. -TMP R - -Oriss, Samite Guardian -{1}{W}{W} -Legendary Creature - Human Cleric -1/3 -{T}: Prevent all damage that would be dealt to target creature this turn. -Grandeur - Discard another card named Oriss, Samite Guardian: Target player can't cast spells this turn, and creatures that player controls can't attack this turn. -FUT R - -Ornate Kanzashi -{5} -Artifact -{2}, {T}: Target opponent exiles the top card of his or her library. You may play that card this turn. -BOK R - -Ornithopter -{0} -Artifact Creature - Thopter -0/2 -Flying -ATQ C, 3ED U, 4ED U, 5ED U, 6ED U, MRD U, 9ED U, 10E U, M10 U, M11 U - -Orochi Eggwatcher -{2}{G} -Creature - Snake Shaman -1/1 -{2}{G}, {T}: Put a 1/1 green Snake creature token onto the battlefield. If you control ten or more creatures, flip Orochi Eggwatcher. ----- -Shidako, Broodmistress -Legendary Creature - Snake Shaman -3/3 -{G}, Sacrifice a creature: Target creature gets +3/+3 until end of turn. -CHK U - -Orochi Hatchery -{X}{X} -Artifact -Orochi Hatchery enters the battlefield with X charge counters on it. -{5}, {T}: Put a 1/1 green Snake creature token onto the battlefield for each charge counter on Orochi Hatchery. -CHK R - -Orochi Leafcaller -{G} -Creature - Snake Shaman -1/1 -{G}: Add one mana of any color to your mana pool. -CHK C - -Orochi Ranger -{1}{G} -Creature - Snake Warrior -2/1 -Whenever Orochi Ranger deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. -CHK C - -Orochi Sustainer -{1}{G} -Creature - Snake Shaman -1/2 -{T}: Add {G} to your mana pool. -CHK C - -Oros, the Avenger -{3}{W}{B}{R} -Legendary Creature - Dragon -6/6 -Flying -Whenever Oros, the Avenger deals combat damage to a player, you may pay {2}{W}. If you do, Oros deals 3 damage to each nonwhite creature. -PLC R, COM R - -Orzhov Basilica -Land -Orzhov Basilica enters the battlefield tapped. -When Orzhov Basilica enters the battlefield, return a land you control to its owner's hand. -{T}: Add {W}{B} to your mana pool. -GPT C, COM C - -Orzhov Euthanist -{2}{B} -Creature - Human Assassin -2/2 -Haunt (When this creature dies, exile it haunting target creature.) -When Orzhov Euthanist enters the battlefield or the creature it haunts dies, destroy target creature that was dealt damage this turn. -GPT C - -Orzhov Guildmage -{W/B}{W/B} -Creature - Human Wizard -2/2 -{2}{W}: Target player gains 1 life. -{2}{B}: Each player loses 1 life. -GPT U, COM U - -Orzhov Pontiff -{1}{W}{B} -Creature - Human Cleric -1/1 -Haunt (When this creature dies, exile it haunting target creature.) -When Orzhov Pontiff enters the battlefield or the creature it haunts dies, choose one - Creatures you control get +1/+1 until end of turn; or creatures you don't control get -1/-1 until end of turn. -GPT R - -Orzhov Signet -{2} -Artifact -{1}, {T}: Add {W}{B} to your mana pool. -GPT C, COM C - -Orzhova, the Church of Deals -Land -{T}: Add {1} to your mana pool. -{3}{W}{B}, {T}: Target player loses 1 life and you gain 1 life. -GPT U - -Osai Vultures -{1}{W} -Creature - Bird -1/1 -Flying -At the beginning of each end step, if a creature died this turn, put a carrion counter on Osai Vultures. -Remove two carrion counters from Osai Vultures: Osai Vultures gets +1/+1 until end of turn. -LEG C, 4ED U, ME4 C - -Ostiary Thrull -{3}{B} -Creature - Thrull -2/2 -{W}, {T}: Tap target creature. -GPT C - -Ostracize -{B} -Sorcery -Target opponent reveals his or her hand. You choose a creature card from it. That player discards that card. -ULG C, 7ED C - -Otaria -Plane - Dominaria -Instant and sorcery cards in graveyards have flashback. The flashback cost is equal to the card's mana cost. (Its owner may cast the card from his or her graveyard for its mana cost. Then he or she exiles it.) -Whenever you roll {C}, take an extra turn after this one. -HOP C - -Otarian Juggernaut -{4} -Artifact Creature - Juggernaut -2/3 -Otarian Juggernaut can't be blocked by Walls. -Threshold - As long as seven or more cards are in your graveyard, Otarian Juggernaut gets +3/+0 and attacks each turn if able. -ODY R - -Otherworldly Journey -{1}{W} -Instant - Arcane -Exile target creature. At the beginning of the next end step, return that card to the battlefield under its owner's control with a +1/+1 counter on it. -CHK U, DVD U - -Oubliette -{1}{B}{B} -Enchantment -When Oubliette enters the battlefield, exile target creature and all Auras attached to it. Note the number and kind of counters that were on that creature. -When Oubliette leaves the battlefield, return the exiled card to the battlefield under its owner's control tapped with the noted number and kind of counters on it. If you do, return the exiled Aura cards to the battlefield under their owner's control attached to that permanent. -ARN C (x2), MED C - -Ouphe Vandals -{2}{G} -Creature - Ouphe Rogue -2/2 -{G}, Sacrifice Ouphe Vandals: Counter target activated ability from an artifact source and destroy that artifact if it's on the battlefield. (Mana abilities can't be targeted.) -5DN U - -Oust -{W} -Sorcery -Put target creature into its owner's library second from the top. Its controller gains 3 life. -ROE U - -Outbreak -{3}{B} -Sorcery -You may discard a Swamp card rather than pay Outbreak's mana cost. -Choose a creature type. All creatures of that type get -1/-1 until end of turn. -PCY U - -Outmaneuver -{X}{R} -Instant -X target blocked creatures assign their combat damage this turn as though they weren't blocked. -USG U - -Outrage Shaman -{3}{R}{R} -Creature - Goblin Shaman -2/2 -Chroma - When Outrage Shaman enters the battlefield, it deals damage to target creature equal to the number of red mana symbols in the mana costs of permanents you control. -EVE U - -Outrider en-Kor -{2}{W} -Creature - Kor Rebel Knight -2/2 -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -{0}: The next 1 damage that would be dealt to Outrider en-Kor this turn is dealt to target creature you control instead. -TSP U - -Outrider of Jhess -{3}{U} -Creature - Human Knight -2/2 -Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.) -ALA C - -Overabundance -{1}{R}{G} -Enchantment -Whenever a player taps a land for mana, that player adds one mana to his or her mana pool of any type that land produced, and Overabundance deals 1 damage to him or her. -INV R - -Overbeing of Myth -{G/U}{G/U}{G/U}{G/U}{G/U} -Creature - Spirit Avatar -*/* -Overbeing of Myth's power and toughness are each equal to the number of cards in your hand. -At the beginning of your draw step, draw an additional card. -EVE R - -Overblaze -{3}{R} -Instant - Arcane -Each time target permanent would deal damage to a creature or player this turn, it deals double that damage to that creature or player instead. -Splice onto Arcane {2}{R}{R} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -BOK U - -Overburden -{1}{U} -Enchantment -Whenever a player puts a nontoken creature onto the battlefield, that player returns a land he or she controls to its owner's hand. -PCY R - -Overeager Apprentice -{2}{B} -Creature - Human Minion -1/2 -Discard a card, Sacrifice Overeager Apprentice: Add {B}{B}{B} to your mana pool. -ODY C, DVD C - -Overgrown Battlement -{1}{G} -Creature - Wall -0/4 -Defender -{T}: Add {G} to your mana pool for each creature with defender you control. -ROE C - -Overgrown Estate -{B}{G}{W} -Enchantment -Sacrifice a land: You gain 3 life. -APC R - -Overgrown Tomb -Land - Swamp Forest -({T}: Add {B} or {G} to your mana pool.) -As Overgrown Tomb enters the battlefield, you may pay 2 life. If you don't, Overgrown Tomb enters the battlefield tapped. -RAV R - -Overgrowth -{2}{G} -Enchantment - Aura -Enchant land (Target a land as you cast this. This card enters the battlefield attached to that land.) -Whenever enchanted land is tapped for mana, its controller adds {G}{G} to his or her mana pool (in addition to the mana the land produces). -STH C, 9ED C, 10E C - -Overlaid Terrain -{2}{G}{G} -Enchantment -As Overlaid Terrain enters the battlefield, sacrifice all lands you control. -Lands you control have "{T}: Add two mana of any one color to your mana pool." -NEM R - -Overload -{R} -Instant -Kicker {2} (You may pay an additional {2} as you cast this spell.) -Destroy target artifact if its converted mana cost is 2 or less. If Overload was kicked, destroy that artifact if its converted mana cost is 5 or less instead. -INV C - -Overmaster -{R} -Sorcery -The next instant or sorcery spell you cast this turn can't be countered by spells or abilities. -Draw a card. -TOR R - -Override -{2}{U} -Instant -Counter target spell unless its controller pays {1} for each artifact you control. -MRD C - -Overrule -{X}{W}{U} -Instant -Counter target spell unless its controller pays {X}. You gain X life. -DIS C - -Overrun -{2}{G}{G}{G} -Sorcery -Creatures you control get +3/+3 and gain trample until end of turn. (If a creature you control would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.) -TMP U, ODY U, 10E U, M10 U, GVL U, M12 U - -Oversold Cemetery -{1}{B} -Enchantment -At the beginning of your upkeep, if you have four or more creature cards in your graveyard, you may return target creature card from your graveyard to your hand. -ONS R - -Oversoul of Dusk -{G/W}{G/W}{G/W}{G/W}{G/W} -Creature - Spirit Avatar -5/5 -Protection from blue, from black, and from red -SHM R - -Overtaker -{1}{U} -Creature - Merfolk Spellshaper -1/1 -{3}{U}, {T}, Discard a card: Untap target creature and gain control of it until end of turn. That creature gains haste until end of turn. -PRO R, MMQ R - -Overwhelm -{5}{G}{G} -Sorcery -Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.) -Creatures you control get +3/+3 until end of turn. -RAV U - -Overwhelming Forces -{6}{B}{B} -Sorcery -Destroy all creatures target opponent controls. Draw a card for each creature destroyed this way. -PTK R, ME4 R - -Overwhelming Instinct -{2}{G} -Enchantment -Whenever you attack with three or more creatures, draw a card. -ONS U - -Overwhelming Intellect -{4}{U}{U} -Instant -Counter target creature spell. Draw cards equal to that spell's converted mana cost. -SOK U - -Overwhelming Stampede -{3}{G}{G} -Sorcery -Until end of turn, creatures you control gain trample and get +X/+X, where X is the greatest power among creatures you control. (If a creature you control would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.) -M11 R - -Ovinize -{1}{U} -Instant -Target creature loses all abilities and becomes 0/1 until end of turn. -PLC U - -Ovinomancer -{2}{U} -Creature - Human Wizard -0/1 -When Ovinomancer enters the battlefield, sacrifice it unless you return three basic lands you control to their owner's hand. -{T}, Return Ovinomancer to its owner's hand: Destroy target creature. It can't be regenerated. That creature's controller puts a 0/1 green Sheep creature token onto the battlefield. -VIS U, TSB S - -Owl Familiar -{1}{U} -Creature - Bird -1/1 -Flying -When Owl Familiar enters the battlefield, draw a card, then discard a card. -POR C, S99 U, ME4 C - -Oxidda Daredevil -{1}{R} -Creature - Goblin Artificer -2/1 -Sacrifice an artifact: Oxidda Daredevil gains haste until end of turn. -SOM C - -Oxidda Golem -{6} -Artifact Creature - Golem -3/2 -Affinity for Mountains (This spell costs {1} less to cast for each Mountain you control.) -Haste -DST C, JVC C - -Oxidda Scrapmelter -{3}{R} -Creature - Beast -3/3 -When Oxidda Scrapmelter enters the battlefield, destroy target artifact. -SOM U - -Oxidize -{G} -Instant -Destroy target artifact. It can't be regenerated. -DST U - -Oyobi, Who Split the Heavens -{6}{W} -Legendary Creature - Spirit -3/6 -Flying -Whenever you cast a Spirit or Arcane spell, put a 3/3 white Spirit creature token with flying onto the battlefield. -BOK R - -Pacifism -{1}{W} -Enchantment - Aura -Enchant creature -Enchanted creature can't attack or block. -MIR C, TMP C, USG C, 6ED C, BRB C, 7ED C, ONS C, 8ED C, 9ED C, 10E C, DVD C, M10 C, M11 C, M12 C - -Pack Hunt -{3}{G} -Sorcery -Search your library for up to three cards with the same name as target creature, reveal them, and put them into your hand. Then shuffle your library. -NEM R - -Pack's Disdain -{1}{B} -Instant -Choose a creature type. Target creature gets -1/-1 until end of turn for each permanent of the chosen type you control. -MOR C - -Pact of Negation -{0} -Instant -Pact of Negation is blue. -Counter target spell. -At the beginning of your next upkeep, pay {3}{U}{U}. If you don't, you lose the game. -FUT R - -Pact of the Titan -{0} -Instant -Pact of the Titan is red. -Put a 4/4 red Giant creature token onto the battlefield. -At the beginning of your next upkeep, pay {4}{R}. If you don't, you lose the game. -FUT R - -Pain -{B} -Sorcery -Target player discards a card. ----- -Suffering -{3}{R} -Sorcery -Destroy target land. -INV U (x2) - -Pain Kami -{2}{R} -Creature - Spirit -2/2 -{X}{R}, Sacrifice Pain Kami: Pain Kami deals X damage to target creature. -CHK U - -Pain Magnification -{1}{B}{R} -Enchantment -Whenever an opponent is dealt 3 or more damage by a single source, that player discards a card. -DIS U - -Pain's Reward -{2}{B} -Sorcery -Each player may bid life. You start the bidding with a bid of any number. In turn order, each player may top the high bid. The bidding ends if the high bid stands. The high bidder loses life equal to the high bid and draws four cards. -SOK R - -Painbringer -{2}{B}{B} -Creature - Human Minion -1/1 -{T}, Exile any number of cards from your graveyard: Target creature gets -X/-X until end of turn, where X is the number of cards exiled this way. -ODY U - -Painful Memories -{1}{B} -Sorcery -Look at target opponent's hand and choose a card from it. Put that card on top of that player's library. -MIR U, 6ED C - -Painful Quandary -{3}{B}{B} -Enchantment -Whenever an opponent casts a spell, that player loses 5 life unless he or she discards a card. -SOM R - -Painsmith -{1}{B} -Creature - Human Artificer -2/1 -Whenever you cast an artifact spell, you may have target creature get +2/+0 and gain deathtouch until end of turn. -SOM U - -Painter's Servant -{2} -Artifact Creature - Scarecrow -1/3 -As Painter's Servant enters the battlefield, choose a color. -All cards that aren't on the battlefield, spells, and permanents are the chosen color in addition to their other colors. -SHM R - -Painwracker Oni -{3}{B}{B} -Creature - Demon Spirit -5/4 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -At the beginning of your upkeep, sacrifice a creature if you don't control an Ogre. -CHK U - -Palace Guard -{2}{W} -Creature - Human Soldier -1/4 -Palace Guard can block any number of creatures. -M10 C, M11 C - -Paladin en-Vec -{1}{W}{W} -Creature - Human Knight -2/2 -First strike, protection from black and from red (This creature deals combat damage before creatures without first strike. It can't be blocked, targeted, dealt damage, or enchanted by anything black or red.) -EXO R, 9ED R, 10E R - -Paladin of Prahv -{4}{W}{W} -Creature - Human Knight -3/4 -Whenever Paladin of Prahv deals damage, you gain that much life. -Forecast - {1}{W}, Reveal Paladin of Prahv from your hand: Whenever target creature deals damage this turn, you gain that much life. (Activate this ability only during your upkeep and only once each turn.) -DIS U, DDG U - -Pale Bears -{2}{G} -Creature - Bear -2/2 -Islandwalk -ICE R - -Pale Moon -{1}{U} -Instant -Until end of turn, if a player taps a nonbasic land for mana, it produces colorless mana instead of any other type. -NEM R - -Pale Recluse -{4}{G}{W} -Creature - Spider -4/5 -Reach (This can block creatures with flying.) -Forestcycling {2}, plainscycling {2} ({2}, Discard this card: Search your library for a Forest or Plains card, reveal it, and put it into your hand. Then shuffle your library.) -ARB C, ARC C - -Pale Wayfarer -{5}{W}{W} -Creature - Spirit Giant -4/4 -{2}{W}{W}, {Q}: Target creature gains protection from the color of its controller's choice until end of turn. ({Q} is the untap symbol.) -SHM U - -Paleoloth -{4}{G}{G} -Creature - Beast -5/5 -Whenever another creature with power 5 or greater enters the battlefield under your control, you may return target creature card from your graveyard to your hand. -CON R - -Palinchron -{5}{U}{U} -Creature - Illusion -4/5 -Flying -When Palinchron enters the battlefield, untap up to seven lands. -{2}{U}{U}: Return Palinchron to its owner's hand. -ULG R - -Palladia-Mors -{2}{R}{R}{G}{G}{W}{W} -Legendary Creature - Elder Dragon -7/7 -Flying, trample -At the beginning of your upkeep, sacrifice Palladia-Mors unless you pay {R}{G}{W}. -LEG R, CHR R, ME3 R - -Palladium Myr -{3} -Artifact Creature - Myr -2/2 -{T}: Add {2} to your mana pool. -SOM U - -Palliation Accord -{3}{W}{U} -Enchantment -Whenever a creature an opponent controls becomes tapped, put a shield counter on Palliation Accord. -Remove a shield counter from Palliation Accord: Prevent the next 1 damage that would be dealt to you this turn. -DIS U - -Pallid Mycoderm -{3}{W} -Creature - Fungus -2/4 -At the beginning of your upkeep, put a spore counter on Pallid Mycoderm. -Remove three spore counters from Pallid Mycoderm: Put a 1/1 green Saproling creature token onto the battlefield. -Sacrifice a Saproling: Fungus and/or Saproling creatures you control get +1/+1 until end of turn. -PLC C - -Pallimud -{2}{R} -Creature - Beast -*/3 -As Pallimud enters the battlefield, choose an opponent. -Pallimud's power is equal to the number of tapped lands the chosen player controls. -TMP R - -Panacea -{4} -Artifact -{X}{X}, {T}: Prevent the next X damage that would be dealt to target creature or player this turn. -MMQ U - -Pandemonium -{3}{R} -Enchantment -Whenever a creature enters the battlefield, that creature's controller may have it deal damage equal to its power to target creature or player of his or her choice. -EXO R, TSB S - -Pandora's Box -{5} -Artifact -{3}, {T}: Choose a creature card at random from all players' decklists. For each player, flip a coin. If the flip ends up heads, put a token that's a copy of that creature card onto the battlefield under that player's control. -ASTRAL S - -Pang Tong, "Young Phoenix" -{1}{W}{W} -Legendary Creature - Human Advisor -1/2 -{T}: Target creature gets +0/+2 until end of turn. Activate this ability only during your turn, before attackers are declared. -PTK R - -Panglacial Wurm -{5}{G}{G} -Creature - Wurm -9/5 -Trample -While you're searching your library, you may cast Panglacial Wurm from your library. -CSP R - -Pangosaur -{2}{G}{G} -Creature - Lizard -6/6 -Whenever a player plays a land, return Pangosaur to its owner's hand. -MMQ R - -Panic -{R} -Instant -Cast Panic only during combat before blockers are declared. -Target creature can't block this turn. -Draw a card at the beginning of the next turn's upkeep. -ICE C, 5ED C, ME2 C - -Panic Attack -{2}{R} -Sorcery -Up to three target creatures can't block this turn. -PCY C, 8ED C, 9ED C, M10 C - -Panic Spellbomb -{1} -Artifact -{T}, Sacrifice Panic Spellbomb: Target creature can't block this turn. -When Panic Spellbomb is put into a graveyard from the battlefield, you may pay {R}. If you do, draw a card. -SOM C - -Panoptic Mirror -{5} -Artifact -Imprint - {X}, {T}: You may exile an instant or sorcery card with converted mana cost X from your hand. -At the beginning of your upkeep, you may copy a card exiled with Panoptic Mirror. If you do, you may cast the copy without paying its mana cost. -DST R - -Panopticon -Plane - Mirrodin -When you planeswalk to Panopticon, draw a card. -At the beginning of your draw step, draw an additional card. -Whenever you roll {C}, draw a card. -HOP C - -Panther Warriors -{4}{G} -Creature - Cat Warrior -6/3 -VIS C, POR C, 6ED C - -Paperfin Rascal -{2}{U} -Creature - Merfolk Rogue -2/2 -When Paperfin Rascal enters the battlefield, clash with an opponent. If you win, put a +1/+1 counter on Paperfin Rascal. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -LRW C - -Paradigm Shift -{1}{U} -Sorcery -Exile all cards from your library. Then shuffle your graveyard into your library. -WTH R - -Paradise Mantle -{0} -Artifact - Equipment -Equipped creature has "{T}: Add one mana of any color to your mana pool." -Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) -5DN U - -Paradise Plume -{4} -Artifact -As Paradise Plume enters the battlefield, choose a color. -Whenever a player casts a spell of the chosen color, you may gain 1 life. -{T}: Add one mana of the chosen color to your mana pool. -TSP U - -Paradox Haze -{2}{U} -Enchantment - Aura -Enchant player -At the beginning of enchanted player's first upkeep each turn, that player gets an additional upkeep step after this step. -TSP U - -Paragon of the Amesha -{2}{W} -Creature - Human Knight -2/2 -First strike -{W}{U}{B}{R}{G}: Until end of turn, Paragon of the Amesha becomes an Angel, gets +3/+3, and gains flying and lifelink. -CON U - -Parallax Dementia -{1}{B} -Enchantment - Aura -Enchant creature -Fading 1 (This enchantment enters the battlefield with one fade counter on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.) -Enchanted creature gets +3/+2. -When Parallax Dementia leaves the battlefield, destroy enchanted creature. That creature can't be regenerated. -NEM C - -Parallax Inhibitor -{2} -Artifact -{1}, {T}, Sacrifice Parallax Inhibitor: Put a fade counter on each permanent with fading you control. -NEM R - -Parallax Nexus -{2}{B} -Enchantment -Fading 5 (This enchantment enters the battlefield with five fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.) -Remove a fade counter from Parallax Nexus: Target opponent exiles a card from his or her hand. Activate this ability only any time you could cast a sorcery. -When Parallax Nexus leaves the battlefield, each player returns to his or her hand all cards he or she owns exiled with Parallax Nexus. -NEM R - -Parallax Tide -{2}{U}{U} -Enchantment -Fading 5 (This enchantment enters the battlefield with five fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.) -Remove a fade counter from Parallax Tide: Exile target land. -When Parallax Tide leaves the battlefield, each player returns to the battlefield all cards he or she owns exiled with Parallax Tide. -NEM R - -Parallax Wave -{2}{W}{W} -Enchantment -Fading 5 (This enchantment enters the battlefield with five fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.) -Remove a fade counter from Parallax Wave: Exile target creature. -When Parallax Wave leaves the battlefield, each player returns to the battlefield all cards he or she owns exiled with Parallax Wave. -NEM R - -Parallectric Feedback -{3}{R} -Instant -Parallectric Feedback deals damage to target spell's controller equal to that spell's converted mana cost. -GPT R - -Parallel Evolution -{3}{G}{G} -Sorcery -For each creature token on the battlefield, its controller puts a token that's a copy of that creature onto the battlefield. -Flashback {4}{G}{G}{G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -TOR R - -Parallel Thoughts -{3}{U}{U} -Enchantment -When Parallel Thoughts enters the battlefield, search your library for seven cards, exile them in a face-down pile, and shuffle that pile. Then shuffle your library. -If you would draw a card, you may instead put the top card of the pile you exiled into your hand. -SCG R - -Paralyze -{B} -Enchantment - Aura -Enchant creature -When Paralyze enters the battlefield, tap enchanted creature. -Enchanted creature doesn't untap during its controller's untap step. -At the beginning of the upkeep of enchanted creature's controller, that player may pay {4}. If he or she does, untap the creature. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, MED C - -Paralyzing Grasp -{2}{U} -Enchantment - Aura -Enchant creature -Enchanted creature doesn't untap during its controller's untap step. -ZEN C - -Parapet -{1}{W} -Enchantment -You may cast Parapet as though it had flash. If you cast it any time a sorcery couldn't have been cast, the controller of the permanent it becomes sacrifices it at the beginning of the next cleanup step. -Creatures you control get +0/+1. -VIS C - -Parapet Watchers -{2}{U} -Creature - Kithkin Soldier -2/2 -{W/U}: Parapet Watchers gets +0/+1 until end of turn. -SHM C - -Parasitic Bond -{3}{B} -Enchantment - Aura -Enchant creature -At the beginning of the upkeep of enchanted creature's controller, Parasitic Bond deals 2 damage to that player. -USG U - -Parasitic Implant -{3}{B} -Enchantment - Aura -Enchant creature -At the beginning of your upkeep, enchanted creature's controller sacrifices it and you put a 1/1 colorless Myr artifact creature token onto the battlefield. -NPH C - -Parasitic Strix -{2}{U} -Artifact Creature - Bird -2/2 -Flying -When Parasitic Strix enters the battlefield, if you control a black permanent, target player loses 2 life and you gain 2 life. -CON C - -Parch -{1}{R} -Instant -Choose one - Parch deals 2 damage to target creature or player; or Parch deals 4 damage to target blue creature. -ULG C - -Pardic Arsonist -{2}{R}{R} -Creature - Human Barbarian -3/3 -Threshold - As long as seven or more cards are in your graveyard, Pardic Arsonist has "When Pardic Arsonist enters the battlefield, it deals 3 damage to target creature or player." -TOR U - -Pardic Collaborator -{3}{R} -Creature - Human Barbarian -2/2 -First strike -{B}: Pardic Collaborator gets +1/+1 until end of turn. -TOR U - -Pardic Dragon -{4}{R}{R} -Creature - Dragon -4/4 -Flying -{R}: Pardic Dragon gets +1/+0 until end of turn. -Suspend 2-{R}{R} (Rather than cast this card from your hand, you may pay {R}{R} and exile it with two time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -Whenever an opponent casts a spell, if Pardic Dragon is suspended, that player may put a time counter on Pardic Dragon. -TSP R - -Pardic Firecat -{3}{R} -Creature - Elemental Cat -2/3 -Haste -If Pardic Firecat is in a graveyard, effects from spells named Flame Burst count it as a card named Flame Burst. -ODY C - -Pardic Lancer -{4}{R} -Creature - Human Barbarian -3/2 -Discard a card at random: Pardic Lancer gets +1/+0 and gains first strike until end of turn. -TOR C - -Pardic Miner -{1}{R} -Creature - Dwarf -1/1 -Sacrifice Pardic Miner: Target player can't play lands this turn. -ODY R - -Pardic Swordsmith -{2}{R} -Creature - Dwarf -1/1 -{R}, Discard a card at random: Pardic Swordsmith gets +2/+0 until end of turn. -ODY C - -Pariah -{2}{W} -Enchantment - Aura -Enchant creature (Target a creature as you cast this. This card enters the battlefield attached to that creature.) -All damage that would be dealt to you is dealt to enchanted creature instead. -USG R, 7ED R, 10E R - -Pariah's Shield -{5} -Artifact - Equipment -All damage that would be dealt to you is dealt to equipped creature instead. -Equip {3} -RAV R - -Paroxysm -{1}{R} -Enchantment - Aura -Enchant creature -At the beginning of the upkeep of enchanted creature's controller, that player reveals the top card of his or her library. If that card is a land card, destroy that creature. Otherwise, it gets +3/+3 until end of turn. -EXO U - -Part Water -{X}{X}{U} -Sorcery -X target creatures gain islandwalk until end of turn. -LEG U - -Part the Veil -{3}{U} -Instant - Arcane -Return all creatures you control to their owner's hand. -CHK R - -Patagia Golem -{4} -Artifact Creature - Golem -2/3 -{3}: Patagia Golem gains flying until end of turn. -MIR U, 6ED U, 7ED U, 8ED U - -Patagia Viper -{3}{G} -Creature - Snake -2/1 -Flying -When Patagia Viper enters the battlefield, put two 1/1 green and blue Snake creature tokens onto the battlefield. -When Patagia Viper enters the battlefield, sacrifice it unless {U} was spent to cast it. -DIS U - -Patchwork Gnomes -{3} -Artifact Creature - Gnome -2/1 -Discard a card: Regenerate Patchwork Gnomes. -TMP U, ODY U - -Path of Anger's Flame -{2}{R} -Instant - Arcane -Creatures you control get +2/+0 until end of turn. -SOK C - -Path of Peace -{3}{W} -Sorcery -Destroy target creature. Its owner gains 4 life. -POR C, P02 C, USG C, S99 C - -Path to Exile -{W} -Instant -Exile target creature. Its controller may search his or her library for a basic land card, put that card onto the battlefield tapped, then shuffle his or her library. -CON U, ARC U, COM U - -Pathrazer of Ulamog -{11} -Creature - Eldrazi -9/9 -Annihilator 3 (Whenever this creature attacks, defending player sacrifices three permanents.) -Pathrazer of Ulamog can't be blocked except by three or more creatures. -ROE U - -Patriarch's Bidding -{3}{B}{B} -Sorcery -Each player chooses a creature type. Each player returns all creature cards of a type chosen this way from his or her graveyard to the battlefield. -ONS R - -Patriarch's Desire -{3}{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/-2. -Threshold - Enchanted creature gets an additional +2/-2 as long as seven or more cards are in your graveyard. -ODY C - -Patrician's Scorn -{3}{W} -Instant -If you've cast another white spell this turn, you may cast Patrician's Scorn without paying its mana cost. -Destroy all enchantments. -FUT C - -Patrol Hound -{1}{W} -Creature - Hound -2/2 -Discard a card: Patrol Hound gains first strike until end of turn. -ODY C - -Patrol Signaler -{1}{W} -Creature - Kithkin Soldier -1/1 -{1}{W}, {Q}: Put a 1/1 white Kithkin Soldier creature token onto the battlefield. ({Q} is the untap symbol.) -EVE U - -Patron Wizard -{U}{U}{U} -Creature - Human Wizard -2/2 -Tap an untapped Wizard you control: Counter target spell unless its controller pays {1}. -ODY R - -Patron of the Akki -{4}{R}{R} -Legendary Creature - Spirit -5/5 -Goblin offering (You may cast this card any time you could cast an instant by sacrificing a Goblin and paying the difference in mana costs between this and the sacrificed Goblin. Mana cost includes color.) -Whenever Patron of the Akki attacks, creatures you control get +2/+0 until end of turn. -BOK R - -Patron of the Kitsune -{4}{W}{W} -Legendary Creature - Spirit -5/6 -Fox offering (You may cast this card any time you could cast an instant by sacrificing a Fox and paying the difference in mana costs between this and the sacrificed Fox. Mana cost includes color.) -Whenever a creature attacks, you may gain 1 life. -BOK R - -Patron of the Moon -{5}{U}{U} -Legendary Creature - Spirit -5/4 -Moonfolk offering (You may cast this card any time you could cast an instant by sacrificing a Moonfolk and paying the difference in mana costs between this and the sacrificed Moonfolk. Mana cost includes color.) -Flying -{1}: Put up to two land cards from your hand onto the battlefield tapped. -BOK R - -Patron of the Nezumi -{5}{B}{B} -Legendary Creature - Spirit -6/6 -Rat offering (You may cast this card any time you could cast an instant by sacrificing a Rat and paying the difference in mana costs between this and the sacrificed Rat. Mana cost includes color.) -Whenever a permanent is put into an opponent's graveyard, that player loses 1 life. -BOK R, COM R - -Patron of the Orochi -{6}{G}{G} -Legendary Creature - Spirit -7/7 -Snake offering (You may cast this card any time you could cast an instant by sacrificing a Snake and paying the difference in mana costs between this and the sacrificed Snake. Mana cost includes color.) -{T}: Untap all Forests and all green creatures. Activate this ability only once each turn. -BOK R - -Patron of the Wild -{G} -Creature - Elf -1/1 -Morph {2}{G} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Patron of the Wild is turned face up, target creature gets +3/+3 until end of turn. -LGN C - -Pattern of Rebirth -{3}{G} -Enchantment - Aura -Enchant creature -When enchanted creature dies, that creature's controller may search his or her library for a creature card and put that card onto the battlefield. If that player does, he or she shuffles his or her library. -UDS R - -Paupers' Cage -{3} -Artifact -At the beginning of each opponent's upkeep, if that player has two or fewer cards in hand, Paupers' Cage deals 2 damage to him or her. -MIR R - -Pavel Maliki -{4}{B}{R} -Legendary Creature - Human -5/3 -{B}{R}: Pavel Maliki gets +1/+0 until end of turn. -LEG U, ME3 U - -Pawn of Ulamog -{1}{B}{B} -Creature - Vampire Shaman -2/2 -Whenever Pawn of Ulamog or another nontoken creature you control dies, you may put a 0/1 colorless Eldrazi Spawn creature token onto the battlefield. It has "Sacrifice this creature: Add {1} to your mana pool." -ROE U - -Pay No Heed -{W} -Instant -Prevent all damage a source of your choice would deal this turn. -TOR C - -Peace Strider -{4} -Artifact Creature - Construct -3/3 -When Peace Strider enters the battlefield, you gain 3 life. -MBS U - -Peace Talks -{1}{W} -Sorcery -This turn and next turn, creatures can't attack, and players and permanents can't be the targets of spells or activated abilities. -VIS U - -Peace and Quiet -{1}{W} -Instant -Destroy two target enchantments. -ULG U - -Peace of Mind -{1}{W} -Enchantment -{W}, Discard a card: You gain 3 life. -EXO U, 9ED U - -Peacekeeper -{2}{W} -Creature - Human -1/1 -At the beginning of your upkeep, sacrifice Peacekeeper unless you pay {1}{W}. -Creatures can't attack. -WTH R - -Peacekeeper Avatar -Vanguard -Hand +0, life +9 -{3}: For each opponent who controls a creature, put a token onto the battlefield that's a copy of a card named Arrest and attach it to a creature that player controls chosen at random. -VG S - -Peach Garden Oath -{W} -Sorcery -You gain 2 life for each creature you control. -PTK U, 8ED U, ME3 C - -Pearl Dragon -{4}{W}{W} -Creature - Dragon -4/4 -Flying -{1}{W}: Pearl Dragon gets +0/+1 until end of turn. -MIR R, 6ED R - -Pearl Medallion -{2} -Artifact -White spells you cast cost {1} less to cast. -TMP R - -Pearl Shard -{3} -Artifact -{3}, {T} or {W}, {T}: Prevent the next 2 damage that would be dealt to target creature or player this turn. -MRD U - -Pearled Unicorn -{2}{W} -Creature - Unicorn -2/2 -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C - -Pearlspear Courier -{2}{W} -Creature - Human Soldier -2/1 -You may choose not to untap Pearlspear Courier during your untap step. -{2}{W}, {T}: Target Soldier creature gets +2/+2 and has vigilance for as long as Pearlspear Courier remains tapped. -ONS U - -Peat Bog -Land -Peat Bog enters the battlefield tapped with two depletion counters on it. -{T}, Remove a depletion counter from Peat Bog: Add {B}{B} to your mana pool. If there are no depletion counters on Peat Bog, sacrifice it. -MMQ C - -Pedantic Learning -{U}{U} -Enchantment -Whenever a land card is put into your graveyard from your library, you may pay {1}. If you do, draw a card. -ODY R - -Peek -{U} -Instant -Look at target player's hand. -Draw a card. -ODY C, 10E C - -Peel from Reality -{1}{U} -Instant -Return target creature you control and target creature you don't control to their owners' hands. -RAV C - -Peer Pressure -{3}{U} -Sorcery -Choose a creature type. If you control more creatures of that type than each other player, you gain control of all creatures of that type. (This effect lasts indefinitely.) -ONS R - -Peer Through Depths -{1}{U} -Instant - Arcane -Look at the top five cards of your library. You may reveal an instant or sorcery card from among them and put it into your hand. Put the rest on the bottom of your library in any order. -CHK C - -Pegasus Charger -{2}{W} -Creature - Pegasus -2/1 -Flying (This creature can't be blocked except by creatures with flying or reach.) -First strike (This creature deals combat damage before creatures without first strike.) -USG C, 9ED C - -Pegasus Refuge -{3}{W} -Enchantment -{2}, Discard a card: Put a 1/1 white Pegasus creature token with flying onto the battlefield. -TMP R - -Pegasus Stampede -{1}{W} -Sorcery -Buyback-Sacrifice a land. (You may sacrifice a land in addition to any other costs as you cast this spell. If you do, put this card into your hand as it resolves.) -Put a 1/1 white Pegasus creature token with flying onto the battlefield. -EXO U - -Pelakka Wurm -{4}{G}{G}{G} -Creature - Wurm -7/7 -Trample -When Pelakka Wurm enters the battlefield, you gain 7 life. -When Pelakka Wurm dies, draw a card. -ROE U - -Pemmin's Aura -{1}{U}{U} -Enchantment - Aura -Enchant creature -{U}: Untap enchanted creature. -{U}: Enchanted creature gains flying until end of turn. -{U}: Enchanted creature gains shroud until end of turn. (It can't be the target of spells or abilities.) -{1}: Enchanted creature gets +1/-1 or -1/+1 until end of turn. -SCG U - -Penance -{2}{W} -Enchantment -Put a card from your hand on top of your library: The next time a black or red source of your choice would deal damage this turn, prevent that damage. -EXO U - -Pendelhaven -Legendary Land -{T}: Add {G} to your mana pool. -{T}: Target 1/1 creature gets +1/+2 until end of turn. -LEG U, TSB S - -Pendelhaven Elder -{1}{G} -Creature - Elf Shaman -1/1 -{T}: Each 1/1 creature you control gets +1/+2 until end of turn. -TSP U - -Pendrell Drake -{3}{U} -Creature - Drake -2/3 -Flying -Cycling {2} ({2}, Discard this card: Draw a card.) -USG C - -Pendrell Flux -{1}{U} -Enchantment - Aura -Enchant creature -Enchanted creature has "At the beginning of your upkeep, sacrifice this creature unless you pay its mana cost." -USG C - -Pendrell Mists -{3}{U} -Enchantment -All creatures have "At the beginning of your upkeep, sacrifice this creature unless you pay {1}." -WTH R - -Pennon Blade -{3} -Artifact - Equipment -Equipped creature gets +1/+1 for each creature you control. -Equip {4} -ROE U - -Pentad Prism -{2} -Artifact -Sunburst (This enters the battlefield with a charge counter on it for each color of mana spent to cast it.) -Remove a charge counter from Pentad Prism: Add one mana of any color to your mana pool. -5DN C, HOP C - -Pentagram of the Ages -{4} -Artifact -{4}, {T}: The next time a source of your choice would deal damage to you this turn, prevent that damage. -ICE R, 5ED R, 6ED R, ME4 U - -Pentarch Paladin -{2}{W}{W}{W} -Creature - Human Knight -3/3 -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -As Pentarch Paladin enters the battlefield, choose a color. -{W}{W}, {T}: Destroy target permanent of the chosen color. -TSP R - -Pentarch Ward -{2}{W} -Enchantment - Aura -Enchant creature -As Pentarch Ward enters the battlefield, choose a color. -When Pentarch Ward enters the battlefield, draw a card. -Enchanted creature has protection from the chosen color. This effect doesn't remove Pentarch Ward. -TSP C - -Pentavus -{7} -Artifact Creature - Construct -0/0 -Pentavus enters the battlefield with five +1/+1 counters on it. -{1}, Remove a +1/+1 counter from Pentavus: Put a 1/1 colorless Pentavite artifact creature token with flying onto the battlefield. -{1}, Sacrifice a Pentavite: Put a +1/+1 counter on Pentavus. -MRD R, HOP R, EVT R, M12 R - -Penumbra Bobcat -{2}{G} -Creature - Cat -2/1 -When Penumbra Bobcat dies, put a 2/1 black Cat creature token onto the battlefield. -APC C - -Penumbra Kavu -{4}{G} -Creature - Kavu -3/3 -When Penumbra Kavu dies, put a 3/3 black Kavu creature token onto the battlefield. -APC U - -Penumbra Spider -{2}{G}{G} -Creature - Spider -2/4 -Reach (This creature can block creatures with flying.) -When Penumbra Spider dies, put a 2/4 black Spider creature token with reach onto the battlefield. -TSP C, COM C - -Penumbra Wurm -{5}{G}{G} -Creature - Wurm -6/6 -Trample -When Penumbra Wurm dies, put a 6/6 black Wurm creature token with trample onto the battlefield. -APC R - -People of the Woods -{G}{G} -Creature - Human -1/* -People of the Woods's toughness is equal to the number of Forests you control. -DRK U - -Peppersmoke -{B} -Tribal Instant - Faerie -Target creature gets -1/-1 until end of turn. If you control a Faerie, draw a card. -LRW C - -Peregrine Drake -{4}{U} -Creature - Drake -2/3 -Flying -When Peregrine Drake enters the battlefield, untap up to five lands. -USG U - -Peregrine Griffin -{4}{W} -Creature - Griffin -2/4 -Flying -First strike (This creature deals combat damage before creatures without first strike.) -M12 C - -Peregrine Mask -{1} -Artifact - Equipment -Equipped creature has defender, flying, and first strike. -Equip {2} -RAV U - -Perhaps You've Met My Cohort -Scheme -When you set this scheme in motion, search your library for a planeswalker card, put it onto the battlefield, then shuffle your library. -ARC P - -Perilous Forays -{3}{G}{G} -Enchantment -{1}, Sacrifice a creature: Search your library for a land card with a basic land type and put it onto the battlefield tapped. Then shuffle your library. -RAV U - -Perilous Myr -{2} -Artifact Creature - Myr -1/1 -When Perilous Myr dies, it deals 2 damage to target creature or player. -SOM C - -Perilous Research -{1}{U} -Instant -Draw two cards, then sacrifice a permanent. -CSP U, COM U - -Perimeter Captain -{W} -Creature - Human Soldier -0/4 -Defender -Whenever a creature you control with defender blocks, you may gain 2 life. -WWK U - -Perish -{2}{B} -Sorcery -Destroy all green creatures. They can't be regenerated. -TMP U, 6ED U - -Perish the Thought -{2}{B} -Sorcery -Target opponent reveals his or her hand. You choose a card from it. That player shuffles that card into his or her library. -ROE C - -Permafrost Trap -{2}{U}{U} -Instant - Trap -If an opponent had a green creature enter the battlefield under his or her control this turn, you may pay {U} rather than pay Permafrost Trap's mana cost. -Tap up to two target creatures. Those creatures don't untap during their controller's next untap step. -WWK U - -Pernicious Deed -{1}{B}{G} -Enchantment -{X}, Sacrifice Pernicious Deed: Destroy each artifact, creature, and enchantment with converted mana cost X or less. -APC R - -Perplex -{1}{U}{B} -Instant -Counter target spell unless its controller discards his or her hand. -Transmute {1}{U}{B} ({1}{U}{B}, Discard this card: Search your library for a card with the same converted mana cost as this card, reveal it, and put it into your hand. Then shuffle your library. Transmute only as a sorcery.) -RAV C - -Persecute -{2}{B}{B} -Sorcery -Choose a color. Target player reveals his or her hand and discards all cards of that color. -USG R, 7ED R, 8ED R, 9ED R - -Personal Incarnation -{3}{W}{W}{W} -Creature - Avatar Incarnation -6/6 -{0}: The next 1 damage that would be dealt to Personal Incarnation this turn is dealt to its owner instead. Any player may activate this ability, but only if he or she owns Personal Incarnation. -When Personal Incarnation dies, its owner loses half his or her life, rounded up. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, ME4 R - -Personal Sanctuary -{2}{W} -Enchantment -During your turn, prevent all damage that would be dealt to you. -M12 R - -Personal Tutor -{U} -Sorcery -Search your library for a sorcery card and reveal that card. Shuffle your library, then put the card on top of it. -POR U, ME2 U - -Persuasion -{3}{U}{U} -Enchantment - Aura -Enchant creature (Target a creature as you cast this. This card enters the battlefield attached to that creature.) -You control enchanted creature. -ODY R, 10E U - -Pestermite -{2}{U} -Creature - Faerie Rogue -2/1 -Flash -Flying -When Pestermite enters the battlefield, you may tap or untap target permanent. -LRW C - -Pestilence -{2}{B}{B} -Enchantment -At the beginning of the end step, if no creatures are on the battlefield, sacrifice Pestilence. -{B}: Pestilence deals 1 damage to each creature and each player. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, USG C, 6ED U, BRB U - -Pestilence Demon -{5}{B}{B}{B} -Creature - Demon -7/6 -Flying -{B}: Pestilence Demon deals 1 damage to each creature and each player. -ROE R - -Pestilence Rats -{2}{B} -Creature - Rat -*/3 -Pestilence Rats's power is equal to the number of other Rats on the battlefield. (For example, as long as there are two other Rats on the battlefield, Pestilence Rats's power and toughness are 2/3.) -ICE C - -Pestilent Kathari -{2}{B} -Creature - Bird Warrior -1/1 -Flying -Deathtouch (Any amount of damage this deals to a creature is enough to destroy it.) -{2}{R}: Pestilent Kathari gains first strike until end of turn. -CON C - -Pestilent Souleater -{5} -Artifact Creature - Insect -3/3 -{B/P}: Pestilent Souleater gains infect until end of turn. ({B/P} can be paid with either {B} or 2 life. A creature with infect deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -NPH C - -Petalmane Baku -{1}{G} -Creature - Spirit -1/2 -Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Petalmane Baku. -{1}, Remove X ki counters from Petalmane Baku: Add X mana of any one color to your mana pool. -BOK C - -Petals of Insight -{4}{U} -Sorcery - Arcane -Look at the top three cards of your library. You may put those cards on the bottom of your library in any order. If you do, return Petals of Insight to its owner's hand. Otherwise, draw three cards. -CHK U - -Petra Sphinx -{2}{W}{W}{W} -Creature - Sphinx -3/4 -{T}: Target player names a card, then reveals the top card of his or her library. If that card is the named card, that player puts it into his or her hand. If it isn't, the player puts it into his or her graveyard. -LEG R, CHR R, MED R - -Petradon -{6}{R}{R} -Creature - Nightmare Beast -5/6 -When Petradon enters the battlefield, exile two target lands. -When Petradon leaves the battlefield, return the exiled cards to the battlefield under their owners' control. -{R}: Petradon gets +1/+0 until end of turn. -TOR R - -Petrahydrox -{3}{U/R} -Creature - Weird -3/3 -({U/R} can be paid with either {U} or {R}.) -When Petrahydrox becomes the target of a spell or ability, return Petrahydrox to its owner's hand. -GPT C - -Petravark -{3}{R} -Creature - Nightmare Beast -2/2 -When Petravark enters the battlefield, exile target land. -When Petravark leaves the battlefield, return the exiled card to the battlefield under its owner's control. -TOR C - -Petrified Field -Land -{T}: Add {1} to your mana pool. -{T}, Sacrifice Petrified Field: Return target land card from your graveyard to your hand. -ODY R - -Petrified Plating -{2}{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2. -Suspend 2-{G} (Rather than cast this card from your hand, you may pay {G} and exile it with two time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) -FUT C - -Petrified Wood-Kin -{6}{G} -Creature - Elemental Warrior -3/3 -Petrified Wood-Kin can't be countered. -Bloodthirst X (This creature enters the battlefield with X +1/+1 counters on it, where X is the damage dealt to your opponents this turn.) -Protection from instants -GPT R - -Pewter Golem -{5} -Artifact Creature - Golem -4/2 -{1}{B}: Regenerate Pewter Golem. -MRD C - -Phage the Untouchable -{3}{B}{B}{B}{B} -Legendary Creature - Zombie Minion -4/4 -When Phage the Untouchable enters the battlefield, if you didn't cast it from your hand, you lose the game. -Whenever Phage deals combat damage to a creature, destroy that creature. It can't be regenerated. -Whenever Phage deals combat damage to a player, that player loses the game. -LGN R, 10E R - -Phage the Untouchable Avatar -Vanguard -Hand +0, life -5 -Pay 1 life: Until end of turn, whenever a creature deals combat damage to you, destroy that creature. -Pay 1 life: Until end of turn, whenever target creature you control deals combat damage to a creature, destroy the damaged creature. -VG S - -Phantasmagorian -{5}{B}{B} -Creature - Horror -6/6 -When you cast Phantasmagorian, any player may discard three cards. If a player does, counter Phantasmagorian. -Discard three cards: Return Phantasmagorian from your graveyard to your hand. -PLC U - -Phantasmal Abomination -{1}{U}{U} -Creature - Illusion -5/5 -Defender -When Phantasmal Abomination becomes the target of a spell or ability, sacrifice it. -ROE U - -Phantasmal Bear -{U} -Creature - Bear Illusion -2/2 -When Phantasmal Bear becomes the target of a spell or ability, sacrifice it. -M12 C - -Phantasmal Dragon -{2}{U}{U} -Creature - Dragon Illusion -5/5 -Flying -When Phantasmal Dragon becomes the target of a spell or ability, sacrifice it. -M12 U - -Phantasmal Fiend -{3}{B} -Creature - Illusion -1/5 -{B}: Phantasmal Fiend gets +1/-1 until end of turn. -{1}{U}: Switch Phantasmal Fiend's power and toughness until end of turn. -ALL C (x2), ME2 C - -Phantasmal Forces -{3}{U} -Creature - Illusion -4/1 -Flying -At the beginning of your upkeep, sacrifice Phantasmal Forces unless you pay {U}. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, ME4 C - -Phantasmal Image -{1}{U} -Creature - Illusion -0/0 -You may have Phantasmal Image enter the battlefield as a copy of any creature on the battlefield, except it's an Illusion in addition to its other types and it gains "When this creature becomes the target of a spell or ability, sacrifice it." -M12 R - -Phantasmal Mount -{1}{U} -Creature - Illusion Horse -1/1 -Flying -{T}: Target creature you control with toughness 2 or less gets +1/+1 and gains flying until end of turn. When Phantasmal Mount leaves the battlefield this turn, sacrifice that creature. When the creature leaves the battlefield this turn, sacrifice Phantasmal Mount. -ICE U, ME2 C - -Phantasmal Sphere -{1}{U} -Creature - Illusion -0/1 -Flying -At the beginning of your upkeep, put a +1/+1 counter on Phantasmal Sphere, then sacrifice Phantasmal Sphere unless you pay {1} for each +1/+1 counter on it. -When Phantasmal Sphere leaves the battlefield, put a blue Orb creature token with flying onto the battlefield under target opponent's control. That creature's power and toughness are each equal to the number of +1/+1 counters on Phantasmal Sphere. -ALL R - -Phantasmal Terrain -{U}{U} -Enchantment - Aura -Enchant land -As Phantasmal Terrain enters the battlefield, choose a basic land type. -Enchanted land is the chosen type. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, 6ED C, INV C, ME4 C - -Phantatog -{1}{W}{U} -Creature - Atog -1/2 -Sacrifice an enchantment: Phantatog gets +1/+1 until end of turn. -Discard a card: Phantatog gets +1/+1 until end of turn. -ODY U - -Phantom Beast -{3}{U} -Creature - Illusion Beast -4/5 -When Phantom Beast becomes the target of a spell or ability, sacrifice it. -M11 C - -Phantom Centaur -{2}{G}{G} -Creature - Centaur Spirit -2/0 -Protection from black -Phantom Centaur enters the battlefield with three +1/+1 counters on it. -If damage would be dealt to Phantom Centaur, prevent that damage. Remove a +1/+1 counter from Phantom Centaur. -JUD U - -Phantom Flock -{3}{W}{W} -Creature - Bird Soldier Spirit -0/0 -Flying -Phantom Flock enters the battlefield with three +1/+1 counters on it. -If damage would be dealt to Phantom Flock, prevent that damage. Remove a +1/+1 counter from Phantom Flock. -JUD U - -Phantom Monster -{3}{U} -Creature - Illusion -3/3 -Flying -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, MED C - -Phantom Nantuko -{2}{G} -Creature - Insect Spirit -0/0 -Trample -Phantom Nantuko enters the battlefield with two +1/+1 counters on it. -If damage would be dealt to Phantom Nantuko, prevent that damage. Remove a +1/+1 counter from Phantom Nantuko. -{T}: Put a +1/+1 counter on Phantom Nantuko. -JUD R - -Phantom Nishoba -{5}{G}{W} -Creature - Cat Beast Spirit -0/0 -Trample -Phantom Nishoba enters the battlefield with seven +1/+1 counters on it. -Whenever Phantom Nishoba deals damage, you gain that much life. -If damage would be dealt to Phantom Nishoba, prevent that damage. Remove a +1/+1 counter from Phantom Nishoba. -JUD R - -Phantom Nomad -{1}{W} -Creature - Spirit Nomad -0/0 -Phantom Nomad enters the battlefield with two +1/+1 counters on it. -If damage would be dealt to Phantom Nomad, prevent that damage. Remove a +1/+1 counter from Phantom Nomad. -JUD C - -Phantom Tiger -{2}{G} -Creature - Cat Spirit -1/0 -Phantom Tiger enters the battlefield with two +1/+1 counters on it. -If damage would be dealt to Phantom Tiger, prevent that damage. Remove a +1/+1 counter from Phantom Tiger. -JUD C - -Phantom Warrior -{1}{U}{U} -Creature - Illusion Warrior -2/2 -Phantom Warrior is unblockable. -POR R, WTH U, 6ED U, S99 R, 7ED U, 8ED U, 9ED U, 10E U, M10 U - -Phantom Whelp -{1}{U} -Creature - Illusion Hound -2/2 -When Phantom Whelp attacks or blocks, return it to its owner's hand at end of combat. (Return it only if it's on the battlefield.) -ODY C - -Phantom Wings -{1}{U} -Enchantment - Aura -Enchant creature -Enchanted creature has flying. -Sacrifice Phantom Wings: Return enchanted creature to its owner's hand. -WTH C, BOK C - -Phantom Wurm -{4}{G}{G} -Creature - Wurm Spirit -2/0 -Phantom Wurm enters the battlefield with four +1/+1 counters on it. -If damage would be dealt to Phantom Wurm, prevent that damage. Remove a +1/+1 counter from Phantom Wurm. -TSP U - -Phelddagrif -{1}{G}{W}{U} -Legendary Creature - Phelddagrif -4/4 -{G}: Phelddagrif gains trample until end of turn. Target opponent puts a 1/1 green Hippo creature token onto the battlefield. -{W}: Phelddagrif gains flying until end of turn. Target opponent gains 2 life. -{U}: Return Phelddagrif to its owner's hand. Target opponent may draw a card. -ALL R, MED R - -Phobian Phantasm -{1}{B}{B} -Creature - Illusion -3/3 -Flying; fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -Cumulative upkeep {B} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -CSP U - -Phosphorescent Feast -{2}{G}{G}{G} -Sorcery -Chroma - Reveal any number of cards in your hand. You gain 2 life for each green mana symbol in those cards' mana costs. -FUT U, EVE U - -Phthisis -{3}{B}{B}{B}{B} -Sorcery -Destroy target creature. Its controller loses life equal to its power plus its toughness. -Suspend 5-{1}{B} (Rather than cast this card from your hand, you may pay {1}{B} and exile it with five time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) -TSP U - -Phylactery Lich -{B}{B}{B} -Creature - Zombie -5/5 -As Phylactery Lich enters the battlefield, put a phylactery counter on an artifact you control. -Phylactery Lich is indestructible. -When you control no permanents with phylactery counters on them, sacrifice Phylactery Lich. -M11 R - -Phyresis -{1}{B} -Enchantment - Aura -Enchant creature -Enchanted creature has infect. (It deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -MBS C - -Phyrexia's Core -Land -{T}: Add {1} to your mana pool. -{1}, {T}, Sacrifice an artifact: You gain 1 life. -NPH U - -Phyrexian Altar -{3} -Artifact -Sacrifice a creature: Add one mana of any color to your mana pool. -INV R - -Phyrexian Arena -{1}{B}{B} -Enchantment -At the beginning of your upkeep, you draw a card and you lose 1 life. -APC R, 8ED R, 9ED R, HOP R, PVC R - -Phyrexian Battleflies -{B} -Creature - Insect -0/1 -Flying -{B}: Phyrexian Battleflies gets +1/+0 until end of turn. Activate this ability no more than twice each turn. -INV C, PVC C - -Phyrexian Bloodstock -{4}{B} -Creature - Zombie -3/3 -When Phyrexian Bloodstock leaves the battlefield, destroy target white creature. It can't be regenerated. -PLS C - -Phyrexian Boon -{2}{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+1 as long as it's black. Otherwise, it gets -1/-2. -ALL C (x2), MED C - -Phyrexian Broodlings -{1}{B}{B} -Creature - Minion -2/2 -{1}, Sacrifice a creature: Put a +1/+1 counter on Phyrexian Broodlings. -ULG C, PVC C - -Phyrexian Colossus -{7} -Artifact Creature - Golem -8/8 -Phyrexian Colossus doesn't untap during your untap step. -Pay 8 life: Untap Phyrexian Colossus. -Phyrexian Colossus can't be blocked except by three or more creatures. -USG R, 7ED R, 8ED R, PVC R - -Phyrexian Crusader -{1}{B}{B} -Creature - Zombie Knight -2/2 -First strike, protection from red and from white -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -MBS R - -Phyrexian Debaser -{3}{B} -Creature - Carrier -2/2 -Flying -{T}, Sacrifice Phyrexian Debaser: Target creature gets -2/-2 until end of turn. -ULG C, PVC C - -Phyrexian Defiler -{2}{B}{B} -Creature - Carrier -3/3 -{T}, Sacrifice Phyrexian Defiler: Target creature gets -3/-3 until end of turn. -ULG U, PVC U - -Phyrexian Delver -{3}{B}{B} -Creature - Zombie -3/2 -When Phyrexian Delver enters the battlefield, return target creature card from your graveyard to the battlefield. You lose life equal to that card's converted mana cost. -INV R - -Phyrexian Denouncer -{1}{B} -Creature - Carrier -1/1 -{T}, Sacrifice Phyrexian Denouncer: Target creature gets -1/-1 until end of turn. -ULG C, PVC C - -Phyrexian Devourer -{6} -Artifact Creature - Construct -1/1 -When Phyrexian Devourer's power is 7 or greater, sacrifice it. -Exile the top card of your library: Put X +1/+1 counters on Phyrexian Devourer, where X is the exiled card's converted mana cost. If Phyrexian Devourer's power is 7 or greater, sacrifice it. -ALL R, ME2 U - -Phyrexian Digester -{3} -Artifact Creature - Construct -2/1 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -MBS C - -Phyrexian Dreadnought -{1} -Artifact Creature - Dreadnought -12/12 -Trample -When Phyrexian Dreadnought enters the battlefield, sacrifice it unless you sacrifice any number of creatures with total power 12 or greater. -MIR R - -Phyrexian Driver -{2}{B} -Creature - Zombie Mercenary -1/1 -When Phyrexian Driver enters the battlefield, other Mercenary creatures get +1/+1 until end of turn. -NEM C - -Phyrexian Etchings -{B}{B}{B} -Enchantment -Cumulative upkeep {B} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -At the beginning of your end step, draw a card for each age counter on Phyrexian Etchings. -When Phyrexian Etchings is put into a graveyard from the battlefield, you lose 2 life for each age counter on it. -CSP R - -Phyrexian Furnace -{1} -Artifact -{T}: Exile the bottom card of target player's graveyard. -{1}, Sacrifice Phyrexian Furnace: Exile target card from a graveyard. Draw a card. -WTH U - -Phyrexian Gargantua -{4}{B}{B} -Creature - Horror -4/4 -When Phyrexian Gargantua enters the battlefield, you draw two cards and you lose 2 life. -APC U, 9ED U, PVC U - -Phyrexian Ghoul -{2}{B} -Creature - Zombie -2/2 -Sacrifice a creature: Phyrexian Ghoul gets +2/+2 until end of turn. -USG C, BRB C, HOP C, PVC C - -Phyrexian Gremlins -{2}{B} -Creature - Gremlin -1/1 -You may choose not to untap Phyrexian Gremlins during your untap step. -{T}: Tap target artifact. It doesn't untap during its controller's untap step for as long as Phyrexian Gremlins remains tapped. -ATQ C - -Phyrexian Grimoire -{3} -Artifact -{4}, {T}: Target opponent chooses one of the top two cards of your graveyard. Exile that card and put the other one into your hand. -TMP R - -Phyrexian Hulk -{6} -Artifact Creature - Golem -5/4 -TMP U, 7ED U, 8ED U, 9ED U, PVC U, NPH C - -Phyrexian Hydra -{3}{G}{G} -Creature - Hydra -7/7 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -If damage would be dealt to Phyrexian Hydra, prevent that damage. Put a -1/-1 counter on Phyrexian Hydra for each 1 damage prevented this way. -MBS R - -Phyrexian Infiltrator -{2}{B} -Creature - Minion -2/2 -{2}{U}{U}: Exchange control of Phyrexian Infiltrator and target creature. (This effect lasts indefinitely.) -INV R - -Phyrexian Ingester -{6}{U} -Creature - Beast -3/3 -Imprint - When Phyrexian Ingester enters the battlefield, you may exile target nontoken creature. -Phyrexian Ingester gets +X/+Y, where X is the exiled creature card's power and Y is its toughness. -NPH R - -Phyrexian Ironfoot -{3} -Snow Artifact Creature - Construct -3/4 -Phyrexian Ironfoot doesn't untap during your untap step. -{1}{S}: Untap Phyrexian Ironfoot. ({S} can be paid with one mana from a snow permanent.) -CSP U - -Phyrexian Juggernaut -{6} -Artifact Creature - Juggernaut -5/5 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -Phyrexian Juggernaut attacks each turn if able. -MBS U - -Phyrexian Lens -{3} -Artifact -{T}, Pay 1 life: Add one mana of any color to your mana pool. -INV R - -Phyrexian Marauder -{X} -Artifact Creature - Construct -0/0 -Phyrexian Marauder enters the battlefield with X +1/+1 counters on it. -Phyrexian Marauder can't block. -Phyrexian Marauder can't attack unless you pay {1} for each +1/+1 counter on it. -VIS R - -Phyrexian Metamorph -{3}{U/P} -Artifact Creature - Shapeshifter -0/0 -({U/P} can be paid with either {U} or 2 life.) -You may have Phyrexian Metamorph enter the battlefield as a copy of any artifact or creature on the battlefield, except it's an artifact in addition to its other types. -NPH R - -Phyrexian Monitor -{3}{B} -Creature - Skeleton -2/2 -{B}: Regenerate Phyrexian Monitor. -UDS C - -Phyrexian Negator -{2}{B} -Creature - Horror -5/5 -Trample -Whenever Phyrexian Negator is dealt damage, sacrifice that many permanents. -UDS R, PVC M - -Phyrexian Obliterator -{B}{B}{B}{B} -Creature - Horror -5/5 -Trample -Whenever a source deals damage to Phyrexian Obliterator, that source's controller sacrifices that many permanents. -NPH M - -Phyrexian Plaguelord -{3}{B}{B} -Creature - Carrier -4/4 -{T}, Sacrifice Phyrexian Plaguelord: Target creature gets -4/-4 until end of turn. -Sacrifice a creature: Target creature gets -1/-1 until end of turn. -ULG R, 8ED R, PVC R - -Phyrexian Portal -{3} -Artifact -{3}: Target opponent looks at the top ten cards of your library and separates them into two face-down piles. Exile one of those piles. Search the other pile for a card, put it into your hand, then shuffle the rest of that pile into your library. Activate this ability only if your library has ten or more cards in it. -ALL R, ME2 R - -Phyrexian Processor -{4} -Artifact -As Phyrexian Processor enters the battlefield, pay any amount of life. -{4}, {T}: Put an X/X black Minion creature token onto the battlefield, where X is the life paid as Phyrexian Processor entered the battlefield. -USG R, PVC R - -Phyrexian Prowler -{3}{B} -Creature - Zombie Mercenary -3/3 -Fading 3 (This creature enters the battlefield with three fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.) -Remove a fade counter from Phyrexian Prowler: Phyrexian Prowler gets +1/+1 until end of turn. -NEM U - -Phyrexian Purge -{2}{B}{R} -Sorcery -Destroy any number of target creatures. -Phyrexian Purge costs 3 life more to cast for each target. -MIR R - -Phyrexian Rager -{2}{B} -Creature - Horror -2/2 -When Phyrexian Rager enters the battlefield, you draw a card and you lose 1 life. -APC C, 10E C, GVL C, MBS C - -Phyrexian Reaper -{4}{B} -Creature - Zombie -3/3 -Whenever Phyrexian Reaper becomes blocked by a green creature, destroy that creature. It can't be regenerated. -INV C - -Phyrexian Rebirth -{4}{W}{W} -Sorcery -Destroy all creatures, then put an X/X colorless Horror artifact creature token onto the battlefield, where X is the number of creatures destroyed this way. -MBS R - -Phyrexian Reclamation -{B} -Enchantment -{1}{B}, Pay 2 life: Return target creature card from your graveyard to your hand. -ULG U - -Phyrexian Revoker -{2} -Artifact Creature - Horror -2/1 -As Phyrexian Revoker enters the battlefield, name a nonland card. -Activated abilities of sources with the chosen name can't be activated. -MBS R - -Phyrexian Scuta -{3}{B} -Creature - Zombie -3/3 -Kicker-Pay 3 life. (You may pay 3 life in addition to any other costs as you cast this spell.) -If Phyrexian Scuta was kicked, it enters the battlefield with two +1/+1 counters on it. -PLS R - -Phyrexian Slayer -{3}{B} -Creature - Minion -2/2 -Flying -Whenever Phyrexian Slayer becomes blocked by a white creature, destroy that creature. It can't be regenerated. -INV C - -Phyrexian Snowcrusher -{6} -Snow Artifact Creature - Juggernaut -6/5 -Phyrexian Snowcrusher attacks each turn if able. -{1}{S}: Phyrexian Snowcrusher gets +1/+0 until end of turn. ({S} can be paid with one mana from a snow permanent.) -CSP U - -Phyrexian Soulgorger -{3} -Snow Artifact Creature - Construct -8/8 -Cumulative upkeep-Sacrifice a creature. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -CSP R - -Phyrexian Splicer -{2} -Artifact -{2}, {T}: Choose one - flying; first strike; shadow; or trample. Target creature with that ability loses it until end of turn and another target creature gains it until end of turn. -TMP U - -Phyrexian Swarmlord -{4}{G}{G} -Creature - Insect Horror -4/4 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -At the beginning of your upkeep, put a 1/1 green Insect creature token with infect onto the battlefield for each poison counter your opponents have. -NPH R - -Phyrexian Totem -{3} -Artifact -{T}: Add {B} to your mana pool. -{2}{B}: Phyrexian Totem becomes a 5/5 black Horror artifact creature with trample until end of turn. -Whenever Phyrexian Totem is dealt damage, if it's a creature, sacrifice that many permanents. -TSP U, PVC U - -Phyrexian Tower -Legendary Land -{T}: Add {1} to your mana pool. -{T}, Sacrifice a creature: Add {B}{B} to your mana pool. -USG R - -Phyrexian Tribute -{2}{B} -Sorcery -As an additional cost to cast Phyrexian Tribute, sacrifice two creatures. -Destroy target artifact. -MIR R - -Phyrexian Tyranny -{U}{B}{R} -Enchantment -Whenever a player draws a card, that player loses 2 life unless he or she pays {2}. -PLS R - -Phyrexian Unlife -{2}{W} -Enchantment -You don't lose the game for having 0 or less life. -As long as you have 0 or less life, all damage is dealt to you as though its source had infect. (Damage is dealt to you in the form of poison counters.) -NPH R - -Phyrexian Vatmother -{2}{B}{B} -Creature - Horror -4/5 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -At the beginning of your upkeep, you get a poison counter. -MBS R - -Phyrexian Vault -{3} -Artifact -{2}, {T}, Sacrifice a creature: Draw a card. -MIR U, 6ED U, 10E U, PVC U - -Phyrexian Walker -{0} -Artifact Creature - Construct -0/3 -VIS C - -Phyrexian War Beast -{3} -Artifact Creature - Beast -3/4 -When Phyrexian War Beast leaves the battlefield, sacrifice a land and Phyrexian War Beast deals 1 damage to you. -ALL C (x2), MED U - -Phytohydra -{2}{G}{W}{W} -Creature - Plant Hydra -1/1 -If damage would be dealt to Phytohydra, put that many +1/+1 counters on it instead. -RAV R - -Pianna, Nomad Captain -{1}{W}{W} -Legendary Creature - Human Nomad -2/2 -Whenever Pianna, Nomad Captain attacks, attacking creatures get +1/+1 until end of turn. -ODY R - -Pierce Strider -{4} -Artifact Creature - Construct -3/3 -When Pierce Strider enters the battlefield, target opponent loses 3 life. -MBS U - -Piety -{2}{W} -Instant -Blocking creatures get +0/+3 until end of turn. -ARN C (x2), 4ED C - -Piety Charm -{W} -Instant -Choose one - Destroy target Aura attached to a creature; or target Soldier creature gets +2/+2 until end of turn; or creatures you control gain vigilance until end of turn. -ONS C - -Pikemen -{1}{W} -Creature - Human Soldier -1/1 -First strike; banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -DRK C, 4ED C, 5ED C - -Pilgrim of Justice -{2}{W} -Creature - Human Cleric -1/3 -Protection from red -{W}, Sacrifice Pilgrim of Justice: The next time a red source of your choice would deal damage this turn, prevent that damage. -ODY C - -Pilgrim of Virtue -{2}{W} -Creature - Human Cleric -1/3 -Protection from black -{W}, Sacrifice Pilgrim of Virtue: The next time a black source of your choice would deal damage this turn, prevent that damage. -ODY C - -Pilgrim's Eye -{3} -Artifact Creature - Thopter -1/1 -Flying -When Pilgrim's Eye enters the battlefield, you may search your library for a basic land card, reveal it, put it into your hand, then shuffle your library. -WWK C - -Pili-Pala -{2} -Artifact Creature - Scarecrow -1/1 -Flying -{2}, {Q}: Add one mana of any color to your mana pool. ({Q} is the untap symbol.) -SHM C - -Pillage -{1}{R}{R} -Sorcery -Destroy target artifact or land. It can't be regenerated. -ALL U, 6ED U, 7ED U, ME2 U, H10 U - -Pillaging Horde -{2}{R}{R} -Creature - Human Barbarian -5/5 -When Pillaging Horde enters the battlefield, sacrifice it unless you discard a card at random. -POR R - -Pillar Tombs of Aku -{2}{B}{B} -World Enchantment -At the beginning of each player's upkeep, that player may sacrifice a creature. If that player doesn't, he or she loses 5 life and you sacrifice Pillar Tombs of Aku. -VIS R - -Pillar of the Paruns -Land -{T}: Add one mana of any color to your mana pool. Spend this mana only to cast multicolored spells. -DIS R - -Pillarfield Ox -{3}{W} -Creature - Ox -2/4 -ZEN C - -Pillory of the Sleepless -{1}{W}{B} -Enchantment - Aura -Enchant creature -Enchanted creature can't attack or block. -Enchanted creature has "At the beginning of your upkeep, you lose 1 life." -GPT C - -Pincer Spider -{2}{G} -Creature - Spider -2/3 -Kicker {3} (You may pay an additional {3} as you cast this spell.) -Reach (This creature can block creatures with flying.) -If Pincer Spider was kicked, it enters the battlefield with a +1/+1 counter on it. -INV C - -Pincher Beetles -{2}{G} -Creature - Insect -3/1 -Shroud (This creature can't be the target of spells or abilities.) -TMP C, BRB C, 10E C - -Pine Barrens -Land -Pine Barrens enters the battlefield tapped. -{T}: Add {1} to your mana pool. -{T}: Add {B} or {G} to your mana pool. Pine Barrens deals 1 damage to you. -TMP R - -Pinecrest Ridge -Land -{T}: Add {1} to your mana pool. -{T}: Add {R} or {G} to your mana pool. Pinecrest Ridge doesn't untap during your next untap step. -CHK U - -Pinpoint Avalanche -{3}{R}{R} -Instant -Pinpoint Avalanche deals 4 damage to target creature. The damage can't be prevented. -ONS C - -Pious Kitsune -{2}{W} -Creature - Fox Cleric -1/2 -At the beginning of your upkeep, put a devotion counter on Pious Kitsune. Then if a creature named Eight-and-a-Half-Tails is on the battlefield, you gain 1 life for each devotion counter on Pious Kitsune. -{T}, Remove a devotion counter from Pious Kitsune: You gain 1 life. -CHK C - -Pious Warrior -{3}{W} -Creature - Human Rebel Warrior -2/3 -Whenever Pious Warrior is dealt combat damage, you gain that much life. -MMQ C - -Piper's Melody -{G} -Sorcery -Shuffle any number of target creature cards from your graveyard into your library. -ODY U - -Piracy -{U}{U} -Sorcery -Until end of turn, you may tap lands you don't control for mana. Spend this mana only to cast spells. -P02 R, S99 R - -Piracy Charm -{U} -Instant -Choose one - Target creature gains islandwalk until end of turn; or target creature gets +2/-1 until end of turn; or target player discards a card. -PLC C - -Piranha Marsh -Land -Piranha Marsh enters the battlefield tapped. -When Piranha Marsh enters the battlefield, target player loses 1 life. -{T}: Add {B} to your mana pool. -ZEN C - -Pirate Ship -{4}{U} -Creature - Human Pirate -4/3 -Pirate Ship can't attack unless defending player controls an Island. -{T}: Pirate Ship deals 1 damage to target creature or player. -When you control no Islands, sacrifice Pirate Ship. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, TSB S - -Piston Sledge -{3} -Artifact - Equipment -When Piston Sledge enters the battlefield, attach it to target creature you control. -Equipped creature gets +3/+1. -Equip-Sacrifice an artifact. -MBS U - -Pistus Strike -{2}{G} -Instant -Destroy target creature with flying. Its controller gets a poison counter. -MBS C - -Pit Imp -{B} -Creature - Imp -0/1 -Flying -{B}: Pit Imp gets +1/+0 until end of turn. Activate this ability no more than twice each turn. -TMP C - -Pit Keeper -{1}{B} -Creature - Human Wizard -2/1 -When Pit Keeper enters the battlefield, if you have four or more creature cards in your graveyard, you may return target creature card from your graveyard to your hand. -TSP C - -Pit Raptor -{2}{B}{B} -Creature - Bird Mercenary -4/3 -Flying, first strike -At the beginning of your upkeep, sacrifice Pit Raptor unless you pay {2}{B}{B}. -PCY U - -Pit Scorpion -{2}{B} -Creature - Scorpion -1/1 -Whenever Pit Scorpion deals damage to a player, that player gets a poison counter. (A player with ten or more poison counters loses the game.) -LEG C, 4ED C, 5ED C - -Pit Spawn -{4}{B}{B}{B} -Creature - Demon -6/4 -First strike -At the beginning of your upkeep, sacrifice Pit Spawn unless you pay {B}{B}. -Whenever Pit Spawn deals damage to a creature, exile that creature. -EXO R - -Pit Trap -{2} -Artifact -{2}, {T}, Sacrifice Pit Trap: Destroy target attacking creature without flying. It can't be regenerated. -ICE U, USG U, 7ED U - -Pitchstone Wall -{2}{R} -Creature - Wall -2/5 -Defender (This creature can't attack.) -Whenever you discard a card, you may sacrifice Pitchstone Wall. If you do, return the discarded card from your graveyard to your hand. -TOR U - -Pitfall Trap -{2}{W} -Instant - Trap -If exactly one creature is attacking, you may pay {W} rather than pay Pitfall Trap's mana cost. -Destroy target attacking creature without flying. -ZEN U - -Pith Driller -{4}{B/P} -Artifact Creature - Horror -2/4 -({B/P} can be paid with either {B} or 2 life.) -When Pith Driller enters the battlefield, put a -1/-1 counter on target creature. -NPH C - -Pithing Needle -{1} -Artifact -As Pithing Needle enters the battlefield, name a card. -Activated abilities of sources with the chosen name can't be activated unless they're mana abilities. -SOK R, 10E R, M10 R - -Pixie Queen -{2}{G}{G} -Creature - Faerie -1/1 -Flying -{G}{G}{G}, {T}: Target creature gains flying until end of turn. -LEG R - -Plagiarize -{3}{U} -Instant -Until end of turn, if target player would draw a card, instead that player skips that draw and you draw a card. -TOR R, 9ED R, 10E R - -Plague Beetle -{B} -Creature - Insect -1/1 -Swampwalk (This creature is unblockable as long as defending player controls a Swamp.) -ULG C, 7ED C, 8ED C, 9ED C, 10E C - -Plague Boiler -{3} -Artifact -At the beginning of your upkeep, put a plague counter on Plague Boiler. -{1}{B}{G}: Put a plague counter on Plague Boiler or remove a plague counter from it. -When Plague Boiler has three or more plague counters on it, sacrifice it. If you do, destroy all nonland permanents. -RAV R - -Plague Dogs -{4}{B} -Creature - Zombie Hound -3/3 -When Plague Dogs dies, all creatures get -1/-1 until end of turn. -{2}, Sacrifice Plague Dogs: Draw a card. -UDS U - -Plague Fiend -{1}{B} -Creature - Insect -1/1 -Whenever Plague Fiend deals combat damage to a creature, destroy that creature unless its controller pays {2}. -PCY C - -Plague Myr -{2} -Artifact Creature - Myr -1/1 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -{T}: Add {1} to your mana pool. -MBS U - -Plague Rats -{2}{B} -Creature - Rat -*/* -Plague Rats's power and toughness are each equal to the number of creatures named Plague Rats on the battlefield. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C - -Plague Sliver -{2}{B}{B} -Creature - Sliver -5/5 -All Slivers have "At the beginning of your upkeep, this permanent deals 1 damage to you." -TSP R - -Plague Spitter -{2}{B} -Creature - Horror -2/2 -At the beginning of your upkeep, Plague Spitter deals 1 damage to each creature and each player. -When Plague Spitter dies, Plague Spitter deals 1 damage to each creature and each player. -INV U - -Plague Spores -{4}{B}{R} -Sorcery -Destroy target nonblack creature and target land. They can't be regenerated. -INV C - -Plague Stinger -{1}{B} -Creature - Insect Horror -1/1 -Flying -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -SOM C - -Plague Wind -{7}{B}{B} -Sorcery -Destroy all creatures you don't control. They can't be regenerated. -PCY R, 8ED R, 9ED R, 10E R - -Plague Witch -{1}{B} -Creature - Elf Spellshaper -1/1 -{B}, {T}, Discard a card: Target creature gets -1/-1 until end of turn. -NEM C - -Plague of Vermin -{6}{B} -Sorcery -Starting with you, each player may pay any amount of life. Repeat this process until no one pays life. Each player puts a 1/1 black Rat creature token onto the battlefield for each 1 life he or she paid this way. -SHM R - -Plaguebearer -{1}{B} -Creature - Zombie -1/1 -{X}{X}{B}: Destroy target nonblack creature with converted mana cost X. -EXO R - -Plagued Rusalka -{B} -Creature - Spirit -1/1 -{B}, Sacrifice a creature: Target creature gets -1/-1 until end of turn. -GPT U - -Plaguemaw Beast -{3}{G}{G} -Creature - Beast -4/3 -{T}, Sacrifice a creature: Proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.) -MBS U - -Plains -Basic Land - Plains -W -LEA L (x2), LEB L (x3), 2ED L (x3), 3ED L (x3), 4ED L (x3), ICE L (x3), MIR L (x4), 5ED L (x4), POR L (x4), TMP L (x4), P02 L (x3), UGL C, USG L (x4), 6ED L (x4), PTK L (x3), S99 L (x4), MMQ L (x4), BRB L (x9), S00 L (x2), INV L (x4), 7ED L (x4), ODY L (x4), ONS L (x4), 8ED L (x4), MRD L (x4), CHK L (x4), UNH L, 9ED L (x4), RAV L (x4), TSP L (x4), 10E L (x4), MED L (x3), LRW L (x4), SHM L (x4), ALA L (x4), DVD L (x4), M10 L (x4), HOP L (x5), ME3 L (x3), ZEN L (x8), H09 L, PVC L, ROE L (x4), ARC L (x2), M11 L (x4), EVT L (x4), SOM L (x4), MBS L (x2), DDG L (x4), NPH L (x2), COM L (x4), M12 L (x4) - -Planar Birth -{1}{W} -Sorcery -Return all basic land cards from all graveyards to the battlefield tapped under their owners' control. -USG R - -Planar Chaos -{2}{R} -Enchantment -At the beginning of your upkeep, flip a coin. If you lose the flip, sacrifice Planar Chaos. -Whenever a player casts a spell, that player flips a coin. If he or she loses the flip, counter that spell. -JUD U - -Planar Cleansing -{3}{W}{W}{W} -Sorcery -Destroy all nonland permanents. -M10 R - -Planar Collapse -{1}{W} -Enchantment -At the beginning of your upkeep, if there are four or more creatures on the battlefield, sacrifice Planar Collapse and destroy all creatures. They can't be regenerated. -ULG R - -Planar Despair -{3}{B}{B} -Sorcery -Domain - All creatures get -1/-1 until end of turn for each basic land type among lands you control. -APC R - -Planar Gate -{6} -Artifact -Creature spells you cast cost up to {2} less to cast. -LEG R, ME4 U - -Planar Guide -{W} -Creature - Human Cleric -1/1 -{3}{W}, Exile Planar Guide: Exile all creatures. At the beginning of the next end step, return those cards to the battlefield under their owners' control. -LGN R - -Planar Overlay -{2}{U} -Sorcery -Each player chooses a land he or she controls of each basic land type. Return those lands to their owners' hands. -PLS R - -Planar Portal -{6} -Artifact -{6}, {T}: Search your library for a card and put that card into your hand. Then shuffle your library. -INV R, 8ED R - -Planar Void -{B} -Enchantment -Whenever another card is put into a graveyard from anywhere, exile that card. -USG U - -Planeswalker's Favor -{2}{G} -Enchantment -{3}{G}: Target opponent reveals a card at random from his or her hand. Target creature gets +X/+X until end of turn, where X is the revealed card's converted mana cost. -PLS R - -Planeswalker's Fury -{2}{R} -Enchantment -{3}{R}: Target opponent reveals a card at random from his or her hand. Planeswalker's Fury deals damage equal to that card's converted mana cost to that player. Activate this ability only any time you could cast a sorcery. -PLS R - -Planeswalker's Mirth -{2}{W} -Enchantment -{3}{W}: Target opponent reveals a card at random from his or her hand. You gain life equal to that card's converted mana cost. -PLS R - -Planeswalker's Mischief -{2}{U} -Enchantment -{3}{U}: Target opponent reveals a card at random from his or her hand. If it's an instant or sorcery card, exile it. You may cast it without paying its mana cost for as long as it remains exiled. (If it has X in its mana cost, X is 0.) At the beginning of the next end step, if you haven't cast it, return it to its owner's hand. Activate this ability only any time you could cast a sorcery. -PLS R - -Planeswalker's Scorn -{2}{B} -Enchantment -{3}{B}: Target opponent reveals a card at random from his or her hand. Target creature gets -X/-X until end of turn, where X is the revealed card's converted mana cost. Activate this ability only any time you could cast a sorcery. -PLS R - -Plant Elemental -{1}{G} -Creature - Plant Elemental -3/4 -When Plant Elemental enters the battlefield, sacrifice it unless you sacrifice a Forest. -POR U - -Plasma Elemental -{5}{U} -Creature - Elemental -4/1 -Plasma Elemental is unblockable. -5DN U - -Plateau -Land - Mountain Plains -LEA R, LEB R, 2ED R, 3ED R, ME3 R, ME4 R - -Plated Geopede -{1}{R} -Creature - Insect -1/1 -First strike -Landfall - Whenever a land enters the battlefield under your control, Plated Geopede gets +2/+2 until end of turn. -ZEN C - -Plated Pegasus -{2}{W} -Creature - Pegasus -1/2 -Flash (You may cast this spell any time you could cast an instant.) -Flying -If a spell would deal damage to a creature or player, prevent 1 damage that spell would deal to that creature or player. -TSP U - -Plated Rootwalla -{4}{G} -Creature - Lizard -3/3 -{2}{G}: Plated Rootwalla gets +3/+3 until end of turn. Activate this ability only once each turn. -EXO C, BRB C - -Plated Seastrider -{U}{U} -Creature - Beast -1/4 -SOM C - -Plated Slagwurm -{4}{G}{G}{G} -Creature - Wurm -8/8 -Hexproof (This creature can't be the target of spells or abilities your opponents control.) -MRD R, GVL R - -Plated Sliver -{W} -Creature - Sliver -1/1 -All Sliver creatures get +0/+1. -LGN C - -Plated Spider -{4}{G} -Creature - Spider -4/4 -Reach (This creature can block creatures with flying.) -UDS C, BTD C - -Plated Wurm -{4}{G} -Creature - Wurm -4/5 -P02 C - -Platinum Angel -{7} -Artifact Creature - Angel -4/4 -Flying -You can't lose the game and your opponents can't win the game. -MRD R, 10E R, M10 M, M11 M - -Platinum Angel Avatar -Vanguard -Hand -1, life -2 -If you control an artifact, a creature, an enchantment, and a land, you can't lose the game and your opponents can't win the game. -VG S (x2) - -Platinum Emperion -{8} -Artifact Creature - Golem -8/8 -Your life total can't change. (You can't gain or lose life. You can't pay any amount of life except 0.) -SOM M - -Plaxcaster Frogling -{1}{G}{U} -Creature - Frog Mutant -0/0 -Graft 3 (This creature enters the battlefield with three +1/+1 counters on it. Whenever another creature enters the battlefield, you may move a +1/+1 counter from this creature onto it.) -{2}: Target creature with a +1/+1 counter on it gains shroud until end of turn. (It can't be the target of spells or abilities.) -DIS U - -Plaxmanta -{1}{U} -Creature - Beast -2/2 -Flash -When Plaxmanta enters the battlefield, creatures you control gain shroud until end of turn. (They can't be the targets of spells or abilities.) -When Plaxmanta enters the battlefield, sacrifice it unless {G} was spent to cast it. -DIS U - -Pledge of Loyalty -{1}{W} -Enchantment - Aura -Enchant creature -Enchanted creature has protection from the colors of permanents you control. This effect doesn't remove Pledge of Loyalty. -INV U - -Plots That Span Centuries -Scheme -When you set this scheme in motion, the next time you would set a scheme in motion, set three schemes in motion instead. -ARC P - -Plover Knights -{3}{W}{W} -Creature - Kithkin Knight -3/3 -Flying, first strike -LRW C, DDG C - -Plow Through Reito -{1}{W} -Instant - Arcane -Sweep - Return any number of Plains you control to their owner's hand. Target creature gets +1/+1 until end of turn for each Plains returned this way. -SOK C - -Plow Under -{3}{G}{G} -Sorcery -Put two target lands on top of their owners' libraries. -UDS R, 8ED R - -Plumes of Peace -{1}{W}{U} -Enchantment - Aura -Enchant creature -Enchanted creature doesn't untap during its controller's untap step. -Forecast - {W}{U}, Reveal Plumes of Peace from your hand: Tap target creature. (Activate this ability only during your upkeep and only once each turn.) -DIS C - -Plumeveil -{W/U}{W/U}{W/U} -Creature - Elemental -4/4 -Flash (You may cast this spell any time you could cast an instant.) -Defender, flying -SHM U, COM U - -Plummet -{1}{G} -Instant -Destroy target creature with flying. -ARC C, M11 C, M12 C - -Plunder -{4}{R} -Sorcery -Destroy target artifact or land. -Suspend 4-{1}{R} (Rather than cast this card from your hand, you may pay {1}{R} and exile it with four time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) -TSP C - -Plunge into Darkness -{1}{B} -Instant -Choose one - Sacrifice any number of creatures, then you gain 3 life for each sacrificed creature; or pay X life, then look at the top X cards of your library, put one of those cards into your hand, and exile the rest. -Entwine {B} (Choose both if you pay the entwine cost.) -5DN R - -Poison Arrow -{4}{B}{B} -Sorcery -Destroy target nonblack creature. You gain 3 life. -PTK U - -Poison the Well -{2}{B/R}{B/R} -Sorcery -Destroy target land. Poison the Well deals 2 damage to that land's controller. -SHM C - -Poisonbelly Ogre -{4}{B} -Creature - Ogre Warrior -3/3 -Whenever another creature enters the battlefield, its controller loses 1 life. -GPT C - -Polar Kraken -{8}{U}{U}{U} -Creature - Kraken -11/11 -Trample -Polar Kraken enters the battlefield tapped. -Cumulative upkeep-Sacrifice a land. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -ICE R, MED R - -Political Trickery -{2}{U} -Sorcery -Exchange control of target land you control and target land an opponent controls. (This effect lasts indefinitely.) -MIR R - -Pollen Lullaby -{1}{W} -Instant -Prevent all combat damage that would be dealt this turn. Clash with an opponent. If you win, creatures that player controls don't untap during the player's next untap step. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -LRW U, COM U - -Pollen Remedy -{W} -Instant -Kicker-Sacrifice a land. (You may sacrifice a land in addition to any other costs as you cast this spell.) -Prevent the next 3 damage that would be dealt this turn to any number of target creatures and/or players, divided as you choose. If Pollen Remedy was kicked, prevent the next 6 damage this way instead. -PLS C - -Pollenbright Wings -{4}{G}{W} -Enchantment - Aura -Enchant creature -Enchanted creature has flying. -Whenever enchanted creature deals combat damage to a player, put that many 1/1 green Saproling creature tokens onto the battlefield. -RAV U - -Polluted Bonds -{3}{B}{B} -Enchantment -Whenever a land enters the battlefield under an opponent's control, that player loses 2 life and you gain 2 life. -SHM R - -Polluted Delta -Land -{T}, Pay 1 life, Sacrifice Polluted Delta: Search your library for an Island or Swamp card and put it onto the battlefield. Then shuffle your library. -ONS R - -Polluted Mire -Land -Polluted Mire enters the battlefield tapped. -{T}: Add {B} to your mana pool. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG C, BRB C, BTD C, GVL C - -Polymorph -{3}{U} -Sorcery -Destroy target creature. It can't be regenerated. Its controller reveals cards from the top of his or her library until he or she reveals a creature card. The player puts that card onto the battlefield, then shuffles all other cards revealed this way into his or her library. -MIR R, 6ED R, 9ED R, M10 R - -Ponder -{U} -Sorcery -Look at the top three cards of your library, then put them back in any order. You may shuffle your library. -Draw a card. -LRW C, M10 C, M12 C - -Pongify -{U} -Instant -Destroy target creature. It can't be regenerated. That creature's controller puts a 3/3 green Ape creature token onto the battlefield. -PLC U - -Pooling Venom -{1}{B} -Enchantment - Aura -Enchant land -Whenever enchanted land becomes tapped, its controller loses 2 life. -{3}{B}: Destroy enchanted land. -FUT U - -Pools of Becoming -Plane - Bolas's Meditation Realm -At the beginning of your end step, put the cards in your hand on the bottom of your library in any order, then draw that many cards. -Whenever you roll {C}, reveal the top three cards of your planar deck. Each of the revealed cards' {C} abilities triggers. Then put the revealed cards on the bottom of your planar deck in any order. -HOP C - -Porcelain Legionnaire -{2}{W/P} -Artifact Creature - Soldier -3/1 -({W/P} can be paid with either {W} or 2 life.) -First strike -NPH C - -Porphyry Nodes -{W} -Enchantment -At the beginning of your upkeep, destroy the creature with the least power. It can't be regenerated. If two or more creatures are tied for least power, you choose one of them. -When there are no creatures on the battlefield, sacrifice Porphyry Nodes. -PLC R - -Port Inspector -{1}{U} -Creature - Human -1/2 -Whenever Port Inspector becomes blocked, you may look at defending player's hand. -MMQ C - -Portcullis -{4} -Artifact -Whenever a creature enters the battlefield, if there are two or more other creatures on the battlefield, exile that creature. Return that card to the battlefield under its owner's control when Portcullis leaves the battlefield. -STH R - -Portent -{U} -Sorcery -Look at the top three cards of target player's library, then put them back in any order. You may have that player shuffle his or her library. -Draw a card at the beginning of the next turn's upkeep. -ICE C, 5ED C, ME2 C - -Possessed Aven -{2}{U}{U} -Creature - Bird Soldier Horror -3/3 -Flying -Threshold - As long as seven or more cards are in your graveyard, Possessed Aven gets +1/+1, is black, and has "{2}{B}, {T}: Destroy target blue creature." -TOR R - -Possessed Barbarian -{2}{R}{R} -Creature - Human Barbarian Horror -3/3 -First strike -Threshold - As long as seven or more cards are in your graveyard, Possessed Barbarian gets +1/+1, is black, and has "{2}{B}, {T}: Destroy target red creature." -TOR R - -Possessed Centaur -{2}{G}{G} -Creature - Centaur Horror -3/3 -Trample -Threshold - As long as seven or more cards are in your graveyard, Possessed Centaur gets +1/+1, is black, and has "{2}{B}, {T}: Destroy target green creature." -TOR R - -Possessed Nomad -{2}{W}{W} -Creature - Human Nomad Horror -3/3 -Vigilance -Threshold - As long as seven or more cards are in your graveyard, Possessed Nomad gets +1/+1, is black, and has "{2}{B}, {T}: Destroy target white creature." -TOR R - -Possessed Portal -{8} -Artifact -If a player would draw a card, that player skips that draw instead. -At the beginning of each end step, each player sacrifices a permanent unless he or she discards a card. -5DN R - -Postmortem Lunge -{X}{B/P} -Sorcery -({B/P} can be paid with either {B} or 2 life.) -Return target creature card with converted mana cost X from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step. -NPH U - -Poultice Sliver -{2}{W} -Creature - Sliver -2/2 -All Slivers have "{2}, {T}: Regenerate target Sliver." -PLC C - -Pouncing Jaguar -{G} -Creature - Cat -2/2 -Echo {G} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -USG C - -Pouncing Kavu -{1}{R} -Creature - Kavu -1/1 -Kicker {2}{R} (You may pay an additional {2}{R} as you cast this spell.) -First strike -If Pouncing Kavu was kicked, it enters the battlefield with two +1/+1 counters on it and with haste. -INV C - -Pouncing Wurm -{3}{G} -Creature - Wurm -3/3 -Kicker {2}{G} (You may pay an additional {2}{G} as you cast this spell.) -If Pouncing Wurm was kicked, it enters the battlefield with three +1/+1 counters on it and with haste. -PLC U - -Powder Keg -{2} -Artifact -At the beginning of your upkeep, you may put a fuse counter on Powder Keg. -{T}, Sacrifice Powder Keg: Destroy each artifact and creature with converted mana cost equal to the number of fuse counters on Powder Keg. -UDS R - -Power Armor -{4} -Artifact -Domain - {3}, {T}: Target creature gets +1/+1 until end of turn for each basic land type among lands you control. -INV U, PVC U - -Power Artifact -{U}{U} -Enchantment - Aura -Enchant artifact -Enchanted artifact's activated abilities cost {2} less to activate. This effect can't reduce the amount of mana an ability costs to activate to less than one mana. -ATQ U, ME4 R - -Power Conduit -{2} -Artifact -{T}, Remove a counter from a permanent you control: Choose one - Put a charge counter on target artifact; or put a +1/+1 counter on target creature. -MRD U - -Power Leak -{1}{U} -Enchantment - Aura -Enchant enchantment -At the beginning of the upkeep of enchanted enchantment's controller, that player may pay any amount of mana. Power Leak deals 2 damage to that player. Prevent X of that damage, where X is the amount of mana that player paid this way. -LEA C, LEB C, 2ED C, 3ED C, 4ED C - -Power Matrix -{4} -Artifact -{T}: Target creature gets +1/+1 and gains flying, first strike, and trample until end of turn. -MMQ R - -Power Sink -{X}{U} -Instant -Counter target spell unless its controller pays {X}. If he or she doesn't, that player taps all lands with mana abilities he or she controls and empties his or her mana pool. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, ICE C, MIR C, 5ED U, TMP C, USG C, 6ED U, BTD C - -Power Struggle -{2}{U}{U}{U} -Enchantment -At the beginning of each player's upkeep, exchange control of a target artifact, creature or land that player controls, chosen at random, and a random target permanent that shares one of those types with it a player who is his or her opponent chosen at random. -ASTRAL S - -Power Surge -{R}{R} -Enchantment -At the beginning of each player's upkeep, Power Surge deals X damage to that player, where X is the number of untapped lands he or she controlled at the beginning of this turn. -LEA R, LEB R, 2ED R, 3ED R, 4ED R - -Power Taint -{1}{U} -Enchantment - Aura -Enchant enchantment -At the beginning of the upkeep of enchanted enchantment's controller, that player loses 2 life unless he or she pays {2}. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG C - -Power of Fire -{1}{R} -Enchantment - Aura -Enchant creature -Enchanted creature has "{T}: This creature deals 1 damage to target creature or player." -SHM C - -Powerleech -{G}{G} -Enchantment -Whenever an artifact an opponent controls becomes tapped or an opponent activates an artifact's ability without {T} in its activation cost, you gain 1 life. -ATQ U - -Powerstone Minefield -{2}{R}{W} -Enchantment -Whenever a creature attacks or blocks, Powerstone Minefield deals 2 damage to it. -APC R - -Pox -{B}{B}{B} -Sorcery -Each player loses a third of his or her life, then discards a third of the cards in his or her hand, then sacrifices a third of the creatures he or she controls, then sacrifices a third of the lands he or she controls. Round up each time. -ICE R, 5ED R, MED R - -Pradesh Gypsies -{2}{G} -Creature - Human Nomad -1/1 -{1}{G}, {T}: Target creature gets -2/-0 until end of turn. -LEG U, 4ED C, 5ED C, 6ED C - -Praetor's Counsel -{5}{G}{G}{G} -Sorcery -Return all cards from your graveyard to your hand. Exile Praetor's Counsel. You have no maximum hand size for the rest of the game. -MBS M - -Praetor's Grasp -{1}{B}{B} -Sorcery -Search target opponent's library for a card and exile it face down. Then that player shuffles his or her library. You may look at and play that card for as long as it remains exiled. -NPH R - -Prahv, Spires of Order -Land -{T}: Add {1} to your mana pool. -{4}{W}{U}, {T}: Prevent all damage a source of your choice would deal this turn. -DIS U - -Preacher -{1}{W}{W} -Creature - Human Cleric -1/1 -You may choose not to untap Preacher during your untap step. -{T}: Gain control of target creature of an opponent's choice that he or she controls for as long as Preacher remains tapped. -DRK R, MED R - -Precognition -{4}{U} -Enchantment -At the beginning of your upkeep, you may look at the top card of target opponent's library. If you do, you may put that card on the bottom of that player's library. -TMP R - -Precursor Golem -{5} -Artifact Creature - Golem -3/3 -When Precursor Golem enters the battlefield, put two 3/3 colorless Golem artifact creature tokens onto the battlefield. -Whenever a player casts an instant or sorcery spell that targets only a single Golem, that player copies that spell for each other Golem that spell could target. Each copy targets a different one of those Golems. -SOM R - -Predator Dragon -{3}{R}{R}{R} -Creature - Dragon -4/4 -Flying, haste -Devour 2 (As this enters the battlefield, you may sacrifice any number of creatures. This creature enters the battlefield with twice that many +1/+1 counters on it.) -ALA R - -Predator's Strike -{1}{G} -Instant -Target creature gets +3/+3 and gains trample until end of turn. -MRD C - -Predator, Flagship -{5} -Legendary Artifact -{2}: Target creature gains flying until end of turn. -{5}, {T}: Destroy target creature with flying. -NEM R - -Predatory Advantage -{3}{R}{G} -Enchantment -At the beginning of each opponent's end step, if that player didn't cast a creature spell this turn, put a 2/2 green Lizard creature token onto the battlefield. -ARB R - -Predatory Focus -{3}{G}{G} -Sorcery -You may have creatures you control assign their combat damage this turn as though they weren't blocked. -GPT U - -Predatory Hunger -{G} -Enchantment - Aura -Enchant creature -Whenever an opponent casts a creature spell, put a +1/+1 counter on enchanted creature. -EXO C - -Predatory Nightstalker -{3}{B}{B} -Creature - Nightstalker -3/2 -When Predatory Nightstalker enters the battlefield, you may have target opponent sacrifice a creature. -P02 U - -Predatory Urge -{3}{G} -Enchantment - Aura -Enchant creature -Enchanted creature has "{T}: This creature deals damage equal to its power to target creature. That creature deals damage equal to its power to this creature." -ZEN R - -Predict -{1}{U} -Instant -Name a card, then put the top card of target player's library into his or her graveyard. If that card is the named card, you draw two cards. Otherwise, you draw a card. -ODY U - -Preeminent Captain -{2}{W} -Creature - Kithkin Soldier -2/2 -First strike -Whenever Preeminent Captain attacks, you may put a Soldier creature card from your hand onto the battlefield tapped and attacking. -MOR R - -Preemptive Strike -{1}{U} -Instant -Counter target creature spell. -PTK C - -Preferred Selection -{2}{G}{G} -Enchantment -At the beginning of your upkeep, look at the top two cards of your library. You may sacrifice Preferred Selection and pay {2}{G}{G}. If you do, put one of those cards into your hand. If you don't, put one of those cards on the bottom of your library. -MIR R - -Premature Burial -{1}{B} -Sorcery -Destroy target nonblack creature that entered the battlefield since your last turn ended. -TSP U - -Preordain -{U} -Sorcery -Scry 2, then draw a card. (To scry 2, look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) -M11 C - -Presence of Gond -{2}{G} -Enchantment - Aura -Enchant creature -Enchanted creature has "{T}: Put a 1/1 green Elf Warrior creature token onto the battlefield." -SHM C - -Presence of the Master -{3}{W} -Enchantment -Whenever a player casts an enchantment spell, counter it. -LEG U, USG U - -Presence of the Wise -{2}{W}{W} -Sorcery -You gain 2 life for each card in your hand. -SOK U - -Pretender's Claim -{1}{B} -Enchantment - Aura -Enchant creature -Whenever enchanted creature becomes blocked, tap all lands defending player controls. -MMQ U - -Prey's Vengeance -{G} -Instant -Target creature gets +2/+2 until end of turn. -Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -ROE U - -Price of Glory -{2}{R} -Enchantment -Whenever a player taps a land for mana, if it's not that player's turn, destroy that land. -ODY U - -Price of Progress -{1}{R} -Instant -Price of Progress deals damage to each player equal to twice the number of nonbasic lands that player controls. -EXO U, H10 U - -Prickly Boggart -{B} -Creature - Goblin Rogue -1/1 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -MOR C - -Pride Guardian -{W} -Creature - Cat Monk -0/3 -Defender (This creature can't attack.) -Whenever Pride Guardian blocks, you gain 3 life. -M12 C - -Pride of Lions -{3}{G}{G} -Creature - Cat -4/4 -You may have Pride of Lions assign its combat damage as though it weren't blocked. -S99 U, 7ED U - -Pride of the Clouds -{W}{U} -Creature - Elemental Cat -1/1 -Flying -Pride of the Clouds gets +1/+1 for each other creature with flying on the battlefield. -Forecast - {2}{W}{U}, Reveal Pride of the Clouds from your hand: Put a 1/1 white and blue Bird creature token with flying onto the battlefield. (Activate this ability only during your upkeep and only once each turn.) -DIS R - -Priest of Gix -{2}{B} -Creature - Human Cleric Minion -2/1 -When Priest of Gix enters the battlefield, add {B}{B}{B} to your mana pool. -USG U, PVC U - -Priest of Titania -{1}{G} -Creature - Elf Druid -1/1 -{T}: Add {G} to your mana pool for each Elf on the battlefield. -USG C - -Priest of Urabrask -{2}{R} -Creature - Human Cleric -2/1 -When Priest of Urabrask enters the battlefield, add {R}{R}{R} to your mana pool. -NPH U - -Priest of Yawgmoth -{1}{B} -Creature - Human Cleric -1/2 -{T}, Sacrifice an artifact: Add to your mana pool an amount of {B} equal to the sacrificed artifact's converted mana cost. -ATQ C - -Priests of Norn -{2}{W} -Creature - Cleric -1/4 -Vigilance -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -MBS C - -Primal Bellow -{G} -Instant -Target creature gets +1/+1 until end of turn for each Forest you control. -ZEN U - -Primal Beyond -Land -As Primal Beyond enters the battlefield, you may reveal an Elemental card from your hand. If you don't, Primal Beyond enters the battlefield tapped. -{T}: Add {1} to your mana pool. -{T}: Add one mana of any color to your mana pool. Spend this mana only to cast Elemental spells or activate abilities of Elementals. -MOR R - -Primal Boost -{2}{G} -Instant -Target creature gets +4/+4 until end of turn. -Cycling {2}{G} ({2}{G}, Discard this card: Draw a card.) -When you cycle Primal Boost, you may have target creature get +1/+1 until end of turn. -ONS U - -Primal Clay -{4} -Artifact Creature - Shapeshifter -*/* -As Primal Clay enters the battlefield, it becomes your choice of a 3/3 artifact creature, a 2/2 artifact creature with flying, or a 1/6 Wall artifact creature with defender in addition to its other types. -ATQ U, 3ED R, 4ED R, 5ED R, 6ED R, ME4 C - -Primal Cocoon -{G} -Enchantment - Aura -Enchant creature -At the beginning of your upkeep, put a +1/+1 counter on enchanted creature. -When enchanted creature attacks or blocks, sacrifice Primal Cocoon. -M11 C - -Primal Command -{3}{G}{G} -Sorcery -Choose two - Target player gains 7 life; or put target noncreature permanent on top of its owner's library; or target player shuffles his or her graveyard into his or her library; or search your library for a creature card, reveal it, put it into your hand, then shuffle your library. -LRW R, ARC R - -Primal Forcemage -{2}{G} -Creature - Elf Shaman -2/2 -Whenever another creature enters the battlefield under your control, that creature gets +3/+3 until end of turn. -TSP U - -Primal Frenzy -{G} -Enchantment - Aura -Enchant creature -Enchanted creature has trample. -ODY C - -Primal Growth -{2}{G} -Sorcery -Kicker-Sacrifice a creature. (You may sacrifice a creature in addition to any other costs as you cast this spell.) -Search your library for a basic land card, put that card onto the battlefield, then shuffle your library. If Primal Growth was kicked, instead search your library for two basic land cards, put them onto the battlefield, then shuffle your library. -PLS C - -Primal Order -{2}{G}{G} -Enchantment -At the beginning of each player's upkeep, Primal Order deals damage to that player equal to the number of nonbasic lands he or she controls. -HML R, 5ED R, MED R - -Primal Plasma -{3}{U} -Creature - Elemental Shapeshifter -*/* -As Primal Plasma enters the battlefield, it becomes your choice of a 3/3 creature, a 2/2 creature with flying, or a 1/6 creature with defender. -PLC C - -Primal Rage -{1}{G} -Enchantment -Creatures you control have trample. (If a creature you control would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.) -STH U, 10E U - -Primal Whisperer -{4}{G} -Creature - Elf Soldier -2/2 -Primal Whisperer gets +2/+2 for each face-down creature on the battlefield. -Morph {3}{G} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -LGN R - -Primalcrux -{G}{G}{G}{G}{G}{G} -Creature - Elemental -*/* -Trample -Chroma - Primalcrux's power and toughness are each equal to the number of green mana symbols in the mana costs of permanents you control. -EVE R - -Primeval Force -{2}{G}{G}{G} -Creature - Elemental -8/8 -When Primeval Force enters the battlefield, sacrifice it unless you sacrifice three Forests. -POR R, 8ED R - -Primeval Light -{3}{G} -Sorcery -Destroy all enchantments target player controls. -GPT U - -Primeval Shambler -{4}{B} -Creature - Horror Mercenary -3/3 -{B}: Primeval Shambler gets +1/+1 until end of turn. -MMQ U, 8ED U - -Primeval Titan -{4}{G}{G} -Creature - Giant -6/6 -Trample -Whenever Primeval Titan enters the battlefield or attacks, you may search your library for up to two land cards, put them onto the battlefield tapped, then shuffle your library. -M11 M, M12 M - -Primitive Etchings -{2}{G}{G} -Enchantment -Reveal the first card you draw each turn. Whenever you reveal a creature card this way, draw a card. -SCG R - -Primitive Justice -{1}{R} -Sorcery -As an additional cost to cast Primitive Justice, you may pay {1}{R} and/or {1}{G} any number of times. -Destroy target artifact. For each additional {1}{R} you paid, destroy another target artifact. For each additional {1}{G} you paid, destroy another target artifact, and you gain 1 life. -ALL U, ME4 U - -Primoc Escapee -{6}{U} -Creature - Bird Beast -4/4 -Flying -Cycling {2} ({2}, Discard this card: Draw a card.) -LGN U - -Primordial Hydra -{X}{G}{G} -Creature - Hydra -0/0 -Primordial Hydra enters the battlefield with X +1/+1 counters on it. -At the beginning of your upkeep, double the number of +1/+1 counters on Primordial Hydra. -Primordial Hydra has trample as long as it has ten or more +1/+1 counters on it. -M12 M - -Primordial Ooze -{R} -Creature - Ooze -1/1 -Primordial Ooze attacks each turn if able. -At the beginning of your upkeep, put a +1/+1 counter on Primordial Ooze. Then you may pay {X}, where X is the number of +1/+1 counters on it. If you don't, tap Primordial Ooze and it deals X damage to you. -LEG U, CHR U, 5ED U - -Primordial Sage -{4}{G}{G} -Creature - Spirit -4/5 -Whenever you cast a creature spell, you may draw a card. -RAV R - -Prince of Thralls -{4}{U}{B}{B}{R} -Creature - Demon -7/7 -Whenever a permanent an opponent controls is put into a graveyard, put that card onto the battlefield under your control unless that opponent pays 3 life. -ALA M - -Princess Lucrezia -{3}{U}{U}{B} -Legendary Creature - Human Wizard -5/4 -{T}: Add {U} to your mana pool. -LEG U, ME3 U - -Prismatic Boon -{X}{W}{U} -Instant -Choose a color. X target creatures gain protection from the chosen color until end of turn. -MIR U - -Prismatic Circle -{2}{W} -Enchantment -Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -As Prismatic Circle enters the battlefield, choose a color. -{1}: The next time a source of your choice of the chosen color would deal damage to you this turn, prevent that damage. -MIR C - -Prismatic Dragon -{2}{W}{W} -Creature - Dragon -2/3 -Flying -At the beginning of your upkeep, Prismatic Dragon becomes a color chosen at random. (This effect lasts indefinitely.) -{2}: Prismatic Dragon becomes a color chosen at random. (This effect lasts indefinitely.) -ASTRAL S - -Prismatic Lace -{U} -Instant -Target permanent becomes the color or colors of your choice. (This effect lasts indefinitely.) -MIR R - -Prismatic Lens -{2} -Artifact -{T}: Add {1} to your mana pool. -{1}, {T}: Add one mana of any color to your mana pool. -TSP C - -Prismatic Omen -{1}{G} -Enchantment -Lands you control are every basic land type in addition to their other types. -SHM R - -Prismatic Strands -{2}{W} -Instant -Prevent all damage that sources of the color of your choice would deal this turn. -Flashback-Tap an untapped white creature you control. (You may cast this card from your graveyard for its flashback cost. Then exile it.) -JUD C - -Prismatic Ward -{1}{W} -Enchantment - Aura -Enchant creature -As Prismatic Ward enters the battlefield, choose a color. -Prevent all damage that would be dealt to enchanted creature by sources of the chosen color. -ICE C, 5ED C - -Prismwake Merrow -{2}{U} -Creature - Merfolk Wizard -2/1 -Flash -When Prismwake Merrow enters the battlefield, target permanent becomes the color or colors of your choice until end of turn. -SHM C - -Prison Barricade -{1}{W} -Creature - Wall -1/3 -Defender (This creature can't attack.) -Kicker {1}{W} (You may pay an additional {1}{W} as you cast this spell.) -If Prison Barricade was kicked, it enters the battlefield with a +1/+1 counter on it and with "Prison Barricade can attack as though it didn't have defender." -INV C - -Prison Term -{1}{W}{W} -Enchantment - Aura -Enchant creature -Enchanted creature can't attack or block, and its activated abilities can't be activated. -Whenever a creature enters the battlefield under an opponent's control, you may attach Prison Term to that creature. -SHM U, HOP U, COM U - -Pristine Angel -{4}{W}{W} -Creature - Angel -4/4 -Flying -As long as Pristine Angel is untapped, it has protection from artifacts and from all colors. -Whenever you cast a spell, you may untap Pristine Angel. -DST R - -Pristine Talisman -{3} -Artifact -{T}: Add {1} to your mana pool. You gain 1 life. -NPH C - -Private Research -{U} -Enchantment - Aura -Enchant creature -At the beginning of your upkeep, you may put a page counter on Private Research. -When enchanted creature dies, draw a card for each page counter on Private Research. -UDS U - -Privileged Position -{2}{G/W}{G/W}{G/W} -Enchantment -({G/W} can be paid with either {G} or {W}.) -Other permanents you control have hexproof. (They can't be the targets of spells or abilities your opponents control.) -RAV R - -Prized Unicorn -{3}{G} -Creature - Unicorn -2/2 -All creatures able to block Prized Unicorn do so. -M10 U, M11 U - -Probe -{2}{U} -Sorcery -Kicker {1}{B} (You may pay an additional {1}{B} as you cast this spell.) -Draw three cards, then discard two cards. -If Probe was kicked, target player discards two cards. -INV C - -Proclamation of Rebirth -{2}{W} -Sorcery -Return up to three target creature cards with converted mana cost 1 or less from your graveyard to the battlefield. -Forecast - {5}{W}, Reveal Proclamation of Rebirth from your hand: Return target creature card with converted mana cost 1 or less from your graveyard to the battlefield. (Activate this ability only during your upkeep and only once each turn.) -DIS R - -Prodigal Pyromancer -{2}{R} -Creature - Human Wizard -1/1 -{T}: Prodigal Pyromancer deals 1 damage to target creature or player. -PLC C, 10E C, M10 U, M11 U - -Prodigal Sorcerer -{2}{U} -Creature - Human Wizard -1/1 -{T}: Prodigal Sorcerer deals 1 damage to target creature or player. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, 6ED C, BRB C, S00 C, 7ED C, TSB S, ME4 U - -Prodigal Sorcerer Avatar -Vanguard -Hand +0, life +5 -At the beginning of your upkeep, look at the top card of your library. You may put that card into your graveyard. -VG S (x2) - -Profane Command -{X}{B}{B} -Sorcery -Choose two - Target player loses X life; or return target creature card with converted mana cost X or less from your graveyard to the battlefield; or target creature gets -X/-X until end of turn; or up to X target creatures gain fear until end of turn. (They can't be blocked except by artifact creatures and/or black creatures.) -LRW R, HOP R - -Profane Prayers -{2}{B}{B} -Sorcery -Profane Prayers deals X damage to target creature or player and you gain X life, where X is the number of Clerics on the battlefield. -ONS C - -Progenitus -{W}{W}{U}{U}{B}{B}{R}{R}{G}{G} -Legendary Creature - Hydra Avatar -10/10 -Protection from everything -If Progenitus would be put into a graveyard from anywhere, reveal Progenitus and shuffle it into its owner's library instead. -CON M - -Prohibit -{1}{U} -Instant -Kicker {2} (You may pay an additional {2} as you cast this spell.) -Counter target spell if its converted mana cost is 2 or less. If Prohibit was kicked, counter that spell if its converted mana cost is 4 or less instead. -INV C - -Promise of Bunrei -{2}{W} -Enchantment -When a creature you control dies, sacrifice Promise of Bunrei. If you do, put four 1/1 colorless Spirit creature tokens onto the battlefield. -SOK R - -Promise of Power -{2}{B}{B}{B} -Sorcery -Choose one - You draw five cards and you lose 5 life; or put an X/X black Demon creature token with flying onto the battlefield, where X is the number of cards in your hand as the token enters the battlefield. -Entwine {4} (Choose both if you pay the entwine cost.) -MRD R, DVD R - -Promised Kannushi -{G} -Creature - Human Druid -1/1 -Soulshift 7 (When this creature dies, you may return target Spirit card with converted mana cost 7 or less from your graveyard to your hand.) -SOK C - -Propaganda -{2}{U} -Enchantment -Creatures can't attack you unless their controller pays {2} for each creature he or she controls that's attacking you. -TMP U, COM U - -Proper Burial -{3}{W} -Enchantment -Whenever a creature you control dies, you gain life equal to that creature's toughness. -DIS R - -Prophecy -{W} -Sorcery -Reveal the top card of target opponent's library. If it's a land, you gain 1 life. Then that player shuffles his or her library. -Draw a card at the beginning of the next turn's upkeep. -HML C - -Prophetic Bolt -{3}{U}{R} -Instant -Prophetic Bolt deals 4 damage to target creature or player. Look at the top four cards of your library. Put one of those cards into your hand and the rest on the bottom of your library in any order. -APC R, COM R - -Prophetic Prism -{2} -Artifact -When Prophetic Prism enters the battlefield, draw a card. -{1}, {T}: Add one mana of any color to your mana pool. -ROE C, COM C - -Prosperity -{X}{U} -Sorcery -Each player draws X cards. -VIS U, POR R, 6ED U - -Protean Hulk -{5}{G}{G} -Creature - Beast -6/6 -When Protean Hulk dies, search your library for any number of creature cards with total converted mana cost 6 or less and put them onto the battlefield. Then shuffle your library. -DIS R - -Protean Hydra -{X}{G} -Creature - Hydra -0/0 -Protean Hydra enters the battlefield with X +1/+1 counters on it. -If damage would be dealt to Protean Hydra, prevent that damage and remove that many +1/+1 counters from it. -Whenever a +1/+1 counter is removed from Protean Hydra, put two +1/+1 counters on it at the beginning of the next end step. -M10 M, M11 R - -Protective Bubble -{3}{U} -Enchantment - Aura -Enchant creature -Enchanted creature is unblockable and has shroud. (It can't be the target of spells or abilities.) -LRW C - -Protective Sphere -{2}{W} -Enchantment -{1}, Pay 1 life: Prevent all damage that would be dealt to you this turn by a source of your choice that shares a color with the mana spent on this activation cost. (Colorless mana prevents no damage.) -INV C - -Proteus Machine -{3} -Artifact Creature - Shapeshifter -2/2 -Morph {0} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Proteus Machine is turned face up, it becomes the creature type of your choice. (This effect lasts indefinitely.) -SCG U - -Proteus Staff -{3} -Artifact -{2}{U}, {T}: Put target creature on the bottom of its owner's library. That creature's controller reveals cards from the top of his or her library until he or she reveals a creature card. The player puts that card onto the battlefield and the rest on the bottom of his or her library in any order. Activate this ability only any time you could cast a sorcery. -MRD R - -Protomatter Powder -{2}{U} -Artifact -{4}{W}, {T}, Sacrifice Protomatter Powder: Return target artifact card from your graveyard to the battlefield. -ALA U - -Prototype Portal -{4} -Artifact -Imprint - When Prototype Portal enters the battlefield, you may exile an artifact card from your hand. -{X}, {T}: Put a token that's a copy of the exiled card onto the battlefield. X is the converted mana cost of that card. -SOM R - -Provoke -{1}{G} -Instant -Untap target creature you don't control. That creature blocks this turn if able. -Draw a card. -STH C - -Prowess of the Fair -{1}{B} -Tribal Enchantment - Elf -Whenever another nontoken Elf is put into your graveyard from the battlefield, you may put a 1/1 green Elf Warrior creature token onto the battlefield. -LRW U - -Prowling Nightstalker -{3}{B} -Creature - Nightstalker -2/2 -Prowling Nightstalker can't be blocked except by black creatures. -P02 C, ME4 C - -Prowling Pangolin -{3}{B}{B} -Creature - Anteater Beast -6/5 -When Prowling Pangolin enters the battlefield, any player may sacrifice two creatures. If a player does, sacrifice Prowling Pangolin. -ONS U - -Psionic Blast -{2}{U} -Instant -Psionic Blast deals 4 damage to target creature or player and 2 damage to you. -LEA U, LEB U, 2ED U, TSB S - -Psionic Entity -{4}{U} -Creature - Illusion -2/2 -{T}: Psionic Entity deals 2 damage to target creature or player and 3 damage to itself. -LEG R, 4ED R - -Psionic Gift -{1}{U} -Enchantment - Aura -Enchant creature -Enchanted creature has "{T}: This creature deals 1 damage to target creature or player." -ODY C - -Psionic Sliver -{4}{U} -Creature - Sliver -2/2 -All Sliver creatures have "{T}: This creature deals 2 damage to target creature or player and 3 damage to itself." -TSP R - -Psychatog -{1}{U}{B} -Creature - Atog -1/2 -Discard a card: Psychatog gets +1/+1 until end of turn. -Exile two cards from your graveyard: Psychatog gets +1/+1 until end of turn. -ODY U - -Psychic Allergy -{3}{U}{U} -Enchantment -As Psychic Allergy enters the battlefield, choose a color. -At the beginning of each opponent's upkeep, Psychic Allergy deals X damage to that player, where X is the number of nontoken permanents of the chosen color he or she controls. -At the beginning of your upkeep, destroy Psychic Allergy unless you sacrifice two Islands. -DRK R - -Psychic Barrier -{U}{U} -Instant -Counter target creature spell. Its controller loses 1 life. -NPH C - -Psychic Battle -{3}{U}{U} -Enchantment -Whenever a player chooses one or more targets, each player reveals the top card of his or her library. The player who reveals the card with the highest converted mana cost may change the target or targets. If two or more cards are tied for highest cost, the target or targets remain unchanged. Changing targets this way doesn't trigger this ability. -INV R - -Psychic Drain -{X}{U}{B} -Sorcery -Target player puts the top X cards of his or her library into his or her graveyard and you gain X life. -RAV U - -Psychic Membrane -{2}{U} -Creature - Wall -0/3 -Defender (This creature can't attack.) -Whenever Psychic Membrane blocks, you may draw a card. -MRD U - -Psychic Miasma -{1}{B} -Sorcery -Target player discards a card. If a land card is discarded this way, return Psychic Miasma to its owner's hand. -SOM C - -Psychic Overload -{3}{U} -Enchantment - Aura -Enchant permanent -When Psychic Overload enters the battlefield, tap enchanted permanent. -Enchanted permanent doesn't untap during its controller's untap step. -Enchanted permanent has "Discard two artifact cards: Untap this permanent." -DST U - -Psychic Possession -{2}{U}{U} -Enchantment - Aura -Enchant opponent -Skip your draw step. -Whenever enchanted opponent draws a card, you may draw a card. -DIS R - -Psychic Puppetry -{1}{U} -Instant - Arcane -You may tap or untap target permanent. -Splice onto Arcane {U} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -CHK C - -Psychic Purge -{U} -Sorcery -Psychic Purge deals 1 damage to target creature or player. -When a spell or ability an opponent controls causes you to discard Psychic Purge, that player loses 5 life. -LEG C, MED U - -Psychic Spear -{B} -Sorcery -Target player reveals his or her hand. You choose a Spirit or Arcane card from it. That player discards that card. -BOK C - -Psychic Surgery -{1}{U} -Enchantment -Whenever an opponent shuffles his or her library, you may look at the top two cards of that library. You may exile one of those cards. Then put the rest on top of that library in any order. -NPH R - -Psychic Theft -{1}{U} -Sorcery -Target player reveals his or her hand. You choose an instant or sorcery card from it and exile that card. You may cast that card for as long as it remains exiled. At the beginning of the next end step, if you haven't cast the card, return it to its owner's hand. -PCY R - -Psychic Trance -{2}{U}{U} -Instant -Until end of turn, Wizards you control gain "{T}: Counter target spell." -ONS R - -Psychic Transfer -{4}{U} -Sorcery -If the difference between your life total and target player's life total is 5 or less, exchange life totals with that player. -MIR R, 6ED R, S99 R - -Psychic Venom -{1}{U} -Enchantment - Aura -Enchant land -Whenever enchanted land becomes tapped, Psychic Venom deals 2 damage to that land's controller. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, 6ED C, MED C - -Psychic Vortex -{2}{U}{U} -Enchantment -Cumulative upkeep-Draw a card. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -At the beginning of your end step, sacrifice a land and discard your hand. -WTH R - -Psychogenic Probe -{2} -Artifact -Whenever a spell or ability causes a player to shuffle his or her library, Psychogenic Probe deals 2 damage to him or her. -MRD R - -Psychosis Crawler -{5} -Artifact Creature - Horror -*/* -Psychosis Crawler's power and toughness are each equal to the number of cards in your hand. -Whenever you draw a card, each opponent loses 1 life. -MBS R - -Psychotic Episode -{1}{B}{B} -Sorcery -Target player reveals his or her hand and the top card of his or her library. You choose a card revealed this way. That player puts the chosen card on the bottom of his or her library. -Madness {1}{B} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -TSP C - -Psychotic Fury -{1}{R} -Instant -Target multicolored creature gains double strike until end of turn. -Draw a card. -DIS C - -Psychotic Haze -{2}{B}{B} -Instant -Psychotic Haze deals 1 damage to each creature and each player. -Madness {1}{B} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -TOR C - -Psychotrope Thallid -{2}{G} -Creature - Fungus -1/1 -At the beginning of your upkeep, put a spore counter on Psychotrope Thallid. -Remove three spore counters from Psychotrope Thallid: Put a 1/1 green Saproling creature token onto the battlefield. -{1}, Sacrifice a Saproling: Draw a card. -PLC U - -Pteron Ghost -{1}{W} -Creature - Spirit -1/1 -Flying -Sacrifice Pteron Ghost: Regenerate target artifact. -DST C - -Puca's Mischief -{3}{U} -Enchantment -At the beginning of your upkeep, you may exchange control of target nonland permanent you control and target nonland permanent an opponent controls with an equal or lesser converted mana cost. -SHM R - -Puffer Extract -{5} -Artifact -{X}, {T}: Target creature you control gets +X/+X until end of turn. Destroy it at the beginning of the next end step. -MMQ U - -Pull Under -{5}{B} -Instant - Arcane -Target creature gets -5/-5 until end of turn. -CHK C - -Pull from Eternity -{W} -Instant -Put target face-up exiled card into its owner's graveyard. -TSP U - -Pulling Teeth -{1}{B} -Sorcery -Clash with an opponent. If you win, target player discards two cards. Otherwise, that player discards a card. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -MOR C - -Pulmonic Sliver -{3}{W}{W} -Creature - Sliver -3/3 -All Sliver creatures have flying. -All Slivers have "If this permanent would be put into a graveyard, you may put it on top of its owner's library instead." -TSP R - -Pulsating Illusion -{4}{U} -Creature - Illusion -0/1 -Flying -Discard a card: Pulsating Illusion gets +4/+4 until end of turn. Activate this ability only once each turn. -ODY U - -Pulse Tracker -{B} -Creature - Vampire Rogue -1/1 -Whenever Pulse Tracker attacks, each opponent loses 1 life. -WWK C - -Pulse of Llanowar -{3}{G} -Enchantment -If a basic land you control is tapped for mana, it produces mana of a color of your choice instead of any other type. -INV U - -Pulse of the Dross -{1}{B}{B} -Sorcery -Target player reveals three cards from his or her hand and you choose one of them. That player discards that card. Then if that player has more cards in hand than you, return Pulse of the Dross to its owner's hand. -DST R - -Pulse of the Fields -{1}{W}{W} -Instant -You gain 4 life. Then if an opponent has more life than you, return Pulse of the Fields to its owner's hand. -DST R - -Pulse of the Forge -{1}{R}{R} -Instant -Pulse of the Forge deals 4 damage to target player. Then if that player has more life than you, return Pulse of the Forge to its owner's hand. -DST R - -Pulse of the Grid -{1}{U}{U} -Instant -Draw two cards, then discard a card. Then if an opponent has more cards in hand than you, return Pulse of the Grid to its owner's hand. -DST R - -Pulse of the Tangle -{1}{G}{G} -Sorcery -Put a 3/3 green Beast creature token onto the battlefield. Then if an opponent controls more creatures than you, return Pulse of the Tangle to its owner's hand. -DST R - -Pulsemage Advocate -{2}{W} -Creature - Human Cleric -1/3 -{T}: Return three target cards from an opponent's graveyard to his or her hand. Return target creature card from your graveyard to the battlefield. -JUD R - -Pulverize -{4}{R}{R} -Sorcery -You may sacrifice two Mountains rather than pay Pulverize's mana cost. -Destroy all artifacts. -MMQ R - -Puncture Blast -{2}{R} -Instant -Wither (This deals damage to creatures in the form of -1/-1 counters.) -Puncture Blast deals 3 damage to target creature or player. -EVE C - -Puncture Bolt -{1}{R} -Instant -Puncture Bolt deals 1 damage to target creature. Put a -1/-1 counter on that creature. -SHM C - -Puncturing Light -{1}{W} -Instant -Destroy target attacking or blocking creature with power 3 or less. -ROE C - -Punish Ignorance -{W}{U}{U}{B} -Instant -Counter target spell. Its controller loses 3 life and you gain 3 life. -ALA R - -Punishing Fire -{1}{R} -Instant -Punishing Fire deals 2 damage to target creature or player. -Whenever an opponent gains life, you may pay {R}. If you do, return Punishing Fire from your graveyard to your hand. -ZEN U, DDG U, COM U - -Puppet Conjurer -{1}{B} -Artifact Creature - Human Wizard -1/2 -{U}, {T}: Put a 0/1 blue Homunculus artifact creature token onto the battlefield. -At the beginning of your upkeep, sacrifice a Homunculus. -ALA U - -Puppet Master -{U}{U}{U} -Enchantment - Aura -Enchant creature -When enchanted creature dies, return that card to its owner's hand. If that card is returned to its owner's hand this way, you may pay {U}{U}{U}. If you do, return Puppet Master from your graveyard to your hand. -LEG U, CHR U - -Puppet Strings -{3} -Artifact -{2}, {T}: You may tap or untap target creature. -TMP U, PVC U - -Puppet's Verdict -{1}{R}{R} -Instant -Flip a coin. If you win the flip, destroy all creatures with power 2 or less. If you lose the flip, destroy all creatures with power 3 or greater. -MMQ R - -Puppeteer -{2}{U} -Creature - Human Wizard -1/2 -{U}, {T}: You may tap or untap target creature. -ODY U, 8ED U, 9ED U, 10E U - -Puppeteer Clique -{3}{B}{B} -Creature - Faerie Wizard -3/2 -Flying -When Puppeteer Clique enters the battlefield, put target creature card from an opponent's graveyard onto the battlefield under your control. It has haste. At the beginning of your next end step, exile it. -Persist (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) -SHM R - -Pure -{1}{R}{G} -Sorcery -Destroy target multicolored permanent. ----- -Simple -{1}{G}{W} -Sorcery -Destroy all Auras and Equipment. -DIS U - -Pure Intentions -{W} -Instant - Arcane -Whenever a spell or ability an opponent controls causes you to discard cards this turn, return those cards from your graveyard to your hand. -When a spell or ability an opponent controls causes you to discard Pure Intentions, return Pure Intentions from your graveyard to your hand at the beginning of the next end step. -SOK R - -Pure Reflection -{2}{W} -Enchantment -Whenever a player casts a creature spell, destroy all Reflections. Then that player puts an X/X white Reflection creature token onto the battlefield, where X is the converted mana cost of that spell. -INV R - -Purelace -{W} -Instant -Target spell or permanent becomes white. (Mana symbols on that permanent remain unchanged.) -LEA R, LEB R, 2ED R, 3ED R, 4ED R - -Puresight Merrow -{W/U}{W/U} -Creature - Merfolk Wizard -2/2 -{W/U}, {Q}: Look at the top card of your library. You may exile that card. ({Q} is the untap symbol.) -SHM U - -Puresteel Paladin -{W}{W} -Creature - Human Knight -2/2 -Whenever an Equipment enters the battlefield under your control, you may draw a card. -Metalcraft - Equipment you control have equip {0} as long as you control three or more artifacts. -NPH R - -Purgatory -{2}{W}{B} -Enchantment -Whenever a nontoken creature is put into your graveyard from the battlefield, exile that card. -At the beginning of your upkeep, you may pay {4} and 2 life. If you do, return a card exiled with Purgatory to the battlefield. -MIR R - -Purge -{1}{W} -Instant -Destroy target artifact creature or black creature. It can't be regenerated. -DST U - -Purging Scythe -{5} -Artifact -At the beginning of your upkeep, Purging Scythe deals 2 damage to the creature with the least toughness. If two or more creatures are tied for least toughness, you choose one of them. -USG R - -Purify -{3}{W}{W} -Sorcery -Destroy all artifacts and enchantments. -ULG R, 7ED R - -Purity -{3}{W}{W}{W} -Creature - Elemental Incarnation -6/6 -Flying -If noncombat damage would be dealt to you, prevent that damage. You gain life equal to the damage prevented this way. -When Purity is put into a graveyard from anywhere, shuffle it into its owner's library. -LRW R - -Purraj of Urborg -{3}{B}{B} -Legendary Creature - Cat Warrior -2/3 -Purraj of Urborg has first strike as long as it's attacking. -Whenever a player casts a black spell, you may pay {B}. If you do, put a +1/+1 counter on Purraj of Urborg. -MIR R - -Pursuit of Knowledge -{3}{W} -Enchantment -If you would draw a card, you may put a study counter on Pursuit of Knowledge instead. -Remove three study counters from Pursuit of Knowledge, Sacrifice Pursuit of Knowledge: Draw seven cards. -STH R - -Pus Kami -{5}{B}{B} -Creature - Spirit -3/3 -{B}, Sacrifice Pus Kami: Destroy target nonblack creature. -Soulshift 6 (When this creature dies, you may return target Spirit card with converted mana cost 6 or less from your graveyard to your hand.) -BOK U - -Put Away -{2}{U}{U} -Instant -Counter target spell. You may shuffle up to one target card from your graveyard into your library. -SHM C - -Putrefaction -{4}{B} -Enchantment -Whenever a player casts a green or white spell, that player discards a card. -MMQ U - -Putrefax -{3}{G}{G} -Creature - Horror -5/3 -Trample, haste -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -At the beginning of the end step, sacrifice Putrefax. -SOM R - -Putrefy -{1}{B}{G} -Instant -Destroy target artifact or creature. It can't be regenerated. -RAV U - -Putrid Cyclops -{2}{B} -Creature - Zombie Cyclops -3/3 -When Putrid Cyclops enters the battlefield, scry 1, then reveal the top card of your library. Putrid Cyclops gets -X/-X until end of turn, where X is that card's converted mana cost. (To scry 1, look at the top card of your library, then you may put that card on the bottom of your library.) -FUT C - -Putrid Imp -{B} -Creature - Zombie Imp -1/1 -Discard a card: Putrid Imp gains flying until end of turn. -Threshold - As long as seven or more cards are in your graveyard, Putrid Imp gets +1/+1 and can't block. -TOR C - -Putrid Leech -{B}{G} -Creature - Zombie Leech -2/2 -Pay 2 life: Putrid Leech gets +2/+2 until end of turn. Activate this ability only once each turn. -ARB C - -Putrid Raptor -{4}{B}{B} -Creature - Zombie Lizard Beast -4/4 -Morph-Discard a Zombie card. (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -SCG U - -Putrid Warrior -{W}{B} -Creature - Zombie Soldier Warrior -2/2 -Whenever Putrid Warrior deals damage, choose one - Each player loses 1 life; or each player gains 1 life. -APC C - -Pygmy Allosaurus -{2}{G} -Creature - Lizard -2/2 -Swampwalk -ICE R - -Pygmy Hippo -{G}{U} -Creature - Hippo -2/2 -Whenever Pygmy Hippo attacks and isn't blocked, you may have defending player activate a mana ability of each land he or she controls and empty his or her mana pool. If you do, Pygmy Hippo assigns no combat damage this turn and at the beginning of your postcombat main phase, you add {X} to your mana pool, where X is the amount of mana emptied from defending player's mana pool this way. -VIS R - -Pygmy Kavu -{3}{G} -Creature - Kavu -1/2 -When Pygmy Kavu enters the battlefield, draw a card for each black creature your opponents control. -PLS C - -Pygmy Pyrosaur -{1}{R} -Creature - Lizard -1/1 -Pygmy Pyrosaur can't block. -{R}: Pygmy Pyrosaur gets +1/+0 until end of turn. -ULG C, 7ED C - -Pygmy Razorback -{1}{G} -Creature - Boar -2/1 -Trample -PCY C - -Pygmy Troll -{1}{G} -Creature - Troll -1/1 -Whenever Pygmy Troll becomes blocked by a creature, Pygmy Troll gets +1/+1 until end of turn. -{G}: Regenerate Pygmy Troll. -EXO C - -Pyknite -{2}{G} -Creature - Ouphe -1/1 -When Pyknite enters the battlefield, draw a card at the beginning of the next turn's upkeep. -ICE C - -Pyramids -{6} -Artifact -{2}: Choose one - Destroy target Aura attached to a land; or the next time target land would be destroyed this turn, remove all damage marked on it instead. -ARN R - -Pyre Charger -{R}{R} -Creature - Elemental Warrior -1/1 -Haste -{R}: Pyre Charger gets +1/+0 until end of turn. -SHM U, JVC U - -Pyre Zombie -{1}{B}{R} -Creature - Zombie -2/1 -At the beginning of your upkeep, if Pyre Zombie is in your graveyard, you may pay {1}{B}{B}. If you do, return Pyre Zombie to your hand. -{1}{R}{R}, Sacrifice Pyre Zombie: Pyre Zombie deals 2 damage to target creature or player. -INV R - -Pyretic Ritual -{1}{R} -Instant -Add {R}{R}{R} to your mana pool. -M11 C - -Pyric Salamander -{1}{R} -Creature - Salamander -1/1 -{R}: Pyric Salamander gets +1/+0 until end of turn. Sacrifice Pyric Salamander at the beginning of the next end step. -MIR C - -Pyrite Spellbomb -{1} -Artifact -{R}, Sacrifice Pyrite Spellbomb: Pyrite Spellbomb deals 2 damage to target creature or player. -{1}, Sacrifice Pyrite Spellbomb: Draw a card. -MRD C - -Pyroblast -{R} -Instant -Choose one - Counter target spell if it's blue; or destroy target permanent if it's blue. -ICE C, 5ED U, MED C - -Pyroclasm -{1}{R} -Sorcery -Pyroclasm deals 2 damage to each creature. -ICE U, POR R, 7ED U, 8ED U, 9ED U, 10E U, M10 U, M11 U - -Pyroclast Consul -{3}{R}{R} -Creature - Elemental Shaman -3/3 -Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Pyroclast Consul, you may reveal it. If you do, Pyroclast Consul deals 2 damage to each creature. -MOR U - -Pyrohemia -{2}{R}{R} -Enchantment -At the beginning of the end step, if no creatures are on the battlefield, sacrifice Pyrohemia. -{R}: Pyrohemia deals 1 damage to each creature and each player. -PLC U, COM U - -Pyrokinesis -{4}{R}{R} -Instant -You may exile a red card from your hand rather than pay Pyrokinesis's mana cost. -Pyrokinesis deals 4 damage divided as you choose among any number of target creatures. -ALL U, ME2 R - -Pyromancer Ascension -{1}{R} -Enchantment -Whenever you cast an instant or sorcery spell that has the same name as a card in your graveyard, you may put a quest counter on Pyromancer Ascension. -Whenever you cast an instant or sorcery spell while Pyromancer Ascension has two or more quest counters on it, you may copy that spell. You may choose new targets for the copy. -ZEN R - -Pyromancer's Swath -{2}{R} -Enchantment -If an instant or sorcery source you control would deal damage to a creature or player, it deals that much damage plus 2 to that creature or player instead. -At the beginning of each end step, discard your hand. -FUT R - -Pyromancy -{2}{R}{R} -Enchantment -{3}, Discard a card at random: Pyromancy deals damage to target creature or player equal to the converted mana cost of the discarded card. -ULG R - -Pyromania -{2}{R} -Enchantment -{1}{R}, Discard a card at random: Pyromania deals 1 damage to target creature or player. -{1}{R}, Sacrifice Pyromania: Pyromania deals 1 damage to target creature or player. -TOR U - -Pyromatics -{1}{R} -Instant -Replicate {1}{R} (When you cast this spell, copy it for each time you paid its replicate cost. You may choose new targets for the copies.) -Pyromatics deals 1 damage to target creature or player. -GPT C - -Pyrostatic Pillar -{1}{R} -Enchantment -Whenever a player casts a spell with converted mana cost 3 or less, Pyrostatic Pillar deals 2 damage to that player. -SCG U - -Pyrotechnics -{4}{R} -Sorcery -Pyrotechnics deals 4 damage divided as you choose among any number of target creatures and/or players. -LEG C, 4ED U, 5ED U, 6ED C, 7ED U, 8ED U, HOP U - -Pyrrhic Revival -{3}{W/B}{W/B}{W/B} -Sorcery -Each player returns each creature card from his or her graveyard to the battlefield with an additional -1/-1 counter on it. -EVE R - -Python -{1}{B}{B} -Creature - Snake -3/2 -VIS C, POR C, 6ED C, S00 C - -Qasali Ambusher -{1}{G}{W} -Creature - Cat Warrior -2/3 -Reach -If a creature is attacking you and you control a Forest and a Plains, you may cast Qasali Ambusher without paying its mana cost and as though it had flash. -ALA U - -Qasali Pridemage -{G}{W} -Creature - Cat Wizard -2/2 -Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.) -{1}, Sacrifice Qasali Pridemage: Destroy target artifact or enchantment. -ARB C - -Quag Sickness -{2}{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets -1/-1 for each Swamp you control. -M11 C - -Quag Vampires -{B} -Creature - Vampire Rogue -1/1 -Multikicker {1}{B} (You may pay an additional {1}{B} any number of times as you cast this spell.) -Swampwalk -Quag Vampires enters the battlefield with a +1/+1 counter on it for each time it was kicked. -WWK C - -Quagmire -{2}{B} -Enchantment -Creatures with swampwalk can be blocked as though they didn't have swampwalk. -LEG U - -Quagmire Druid -{2}{B} -Creature - Zombie Druid -2/2 -{G}, {T}, Sacrifice a creature: Destroy target enchantment. -APC C - -Quagmire Lamprey -{2}{B} -Creature - Fish -1/1 -Whenever Quagmire Lamprey becomes blocked by a creature, put a -1/-1 counter on that creature. -MMQ U - -Quagnoth -{5}{G} -Creature - Beast -4/5 -Split second (As long as this spell is on the stack, players can't cast spells or activate abilities that aren't mana abilities.) -Shroud (This permanent can't be the target of spells or abilities.) -When a spell or ability an opponent controls causes you to discard Quagnoth, return it to your hand. -FUT R - -Quarum Trench Gnomes -{3}{R} -Creature - Gnome -1/1 -{T}: If target Plains is tapped for mana, it produces colorless mana instead of white mana. (This effect lasts indefinitely.) -LEG R - -Quash -{2}{U}{U} -Instant -Counter target instant or sorcery spell. Search its controller's graveyard, hand, and library for all cards with the same name as that spell and exile them. Then that player shuffles his or her library. -UDS U, BOK U - -Quenchable Fire -{3}{R} -Sorcery -Quenchable Fire deals 3 damage to target player. It deals an additional 3 damage to that player at the beginning of your next upkeep step unless he or she pays {U} before that step. -CON C - -Quest for Ancient Secrets -{U} -Enchantment -Whenever a card is put into your graveyard from anywhere, you may put a quest counter on Quest for Ancient Secrets. -Remove five quest counters from Quest for Ancient Secrets and sacrifice it: Target player shuffles his or her graveyard into his or her library. -ZEN U - -Quest for Pure Flame -{R} -Enchantment -Whenever a source you control deals damage to an opponent, you may put a quest counter on Quest for Pure Flame. -Remove four quest counters from Quest for Pure Flame and sacrifice it: If any source you control would deal damage to a creature or player this turn, it deals double that damage to that creature or player instead. -ZEN U - -Quest for Renewal -{1}{G} -Enchantment -Whenever a creature you control becomes tapped, you may put a quest counter on Quest for Renewal. -As long as there are four or more quest counters on Quest for Renewal, untap all creatures you control during each other player's untap step. -WWK U - -Quest for Ula's Temple -{U} -Enchantment -At the beginning of your upkeep, you may look at the top card of your library. If it's a creature card, you may reveal it and put a quest counter on Quest for Ula's Temple. -At the beginning of each end step, if there are three or more quest counters on Quest for Ula's Temple, you may put a Kraken, Leviathan, Octopus, or Serpent creature card from your hand onto the battlefield. -WWK R - -Quest for the Gemblades -{1}{G} -Enchantment -Whenever a creature you control deals combat damage to a creature, you may put a quest counter on Quest for the Gemblades. -Remove a quest counter from Quest for the Gemblades and sacrifice it: Put four +1/+1 counters on target creature. -ZEN U - -Quest for the Goblin Lord -{R} -Enchantment -Whenever a Goblin enters the battlefield under your control, you may put a quest counter on Quest for the Goblin Lord. -As long as Quest for the Goblin Lord has five or more quest counters on it, creatures you control get +2/+0. -WWK U - -Quest for the Gravelord -{B} -Enchantment -Whenever a creature dies, you may put a quest counter on Quest for the Gravelord. -Remove three quest counters from Quest for the Gravelord and sacrifice it: Put a 5/5 black Zombie Giant creature token onto the battlefield. -ZEN U - -Quest for the Holy Relic -{W} -Enchantment -Whenever you cast a creature spell, you may put a quest counter on Quest for the Holy Relic. -Remove five quest counters from Quest for the Holy Relic and sacrifice it: Search your library for an Equipment card, put it onto the battlefield, and attach it to a creature you control. Then shuffle your library. -ZEN U - -Quest for the Nihil Stone -{B} -Enchantment -Whenever an opponent discards a card, you may put a quest counter on Quest for the Nihil Stone. -At the beginning of each opponent's upkeep, if that player has no cards in hand and Quest for the Nihil Stone has two or more quest counters on it, you may have that player lose 5 life. -WWK R - -Questing Phelddagrif -{1}{G}{W}{U} -Creature - Phelddagrif -4/4 -{G}: Questing Phelddagrif gets +1/+1 until end of turn. Target opponent puts a 1/1 green Hippo creature token onto the battlefield. -{W}: Questing Phelddagrif gains protection from black and from red until end of turn. Target opponent gains 2 life. -{U}: Questing Phelddagrif gains flying until end of turn. Target opponent may draw a card. -PRO R, PLS R - -Quick Sliver -{1}{G} -Creature - Sliver -1/1 -Flash -Any player may play Sliver cards as though they had flash. -LGN C, H09 C - -Quickchange -{1}{U} -Instant -Target creature becomes the color or colors of your choice until end of turn. -Draw a card. -RAV C - -Quicken -{U} -Instant -The next sorcery card you cast this turn can be cast as though it had flash. -Draw a card. -GPT R - -Quickening Licid -{1}{W} -Creature - Licid -1/1 -{1}{W}, {T}: Quickening Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {W} to end this effect. -Enchanted creature has first strike. -TMP U - -Quicksand -Land -{T}: Add {1} to your mana pool. -{T}, Sacrifice Quicksand: Target attacking creature without flying gets -1/-2 until end of turn. -VIS U, 9ED U, 10E U, WWK C - -Quicksilver Amulet -{4} -Artifact -{4}, {T}: You may put a creature card from your hand onto the battlefield. -ULG R, M12 R - -Quicksilver Behemoth -{6}{U} -Creature - Beast -4/5 -Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -When Quicksilver Behemoth attacks or blocks, return it to its owner's hand at end of combat. (Return it only if it's on the battlefield.) -DST C - -Quicksilver Dagger -{1}{U}{R} -Enchantment - Aura -Enchant creature -Enchanted creature has "{T}: This creature deals 1 damage to target player. You draw a card." -APC C - -Quicksilver Dragon -{4}{U}{U} -Creature - Dragon -5/5 -Flying -{U}: If target spell has only one target and that target is Quicksilver Dragon, change that spell's target to another creature. -Morph {4}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS R, JVC R - -Quicksilver Elemental -{3}{U}{U} -Creature - Elemental -3/4 -{U}: Quicksilver Elemental gains all activated abilities of target creature until end of turn. (If any of the abilities use that creature's name, use this creature's name instead.) -You may spend blue mana as though it were mana of any color to pay the activation costs of Quicksilver Elemental's abilities. -MRD R - -Quicksilver Fountain -{3} -Artifact -At the beginning of each player's upkeep, that player puts a flood counter on target non-Island land he or she controls of his or her choice. That land is an Island for as long as it has a flood counter on it. -At the beginning of each end step, if all lands on the battlefield are Islands, remove all flood counters from them. -MRD R - -Quicksilver Gargantuan -{5}{U}{U} -Creature - Shapeshifter -7/7 -You may have Quicksilver Gargantuan enter the battlefield as a copy of any creature on the battlefield, except it's still 7/7. -SOM M - -Quicksilver Geyser -{4}{U} -Instant -Return up to two target nonland permanents to their owners' hands. -MBS C - -Quicksilver Wall -{2}{U} -Creature - Wall -1/6 -Defender (This creature can't attack.) -{4}: Return Quicksilver Wall to its owner's hand. Any player may activate this ability. -PCY U - -Quiet Disrepair -{1}{G} -Enchantment - Aura -Enchant artifact or enchantment -At the beginning of your upkeep, choose one - Destroy enchanted permanent; or you gain 2 life. -FUT C - -Quiet Purity -{W} -Instant - Arcane -Destroy target enchantment. -CHK C - -Quiet Speculation -{1}{U} -Sorcery -Search target player's library for up to three cards with flashback and put them into that player's graveyard. Then the player shuffles his or her library. -JUD U - -Quietus Spike -{3} -Artifact - Equipment -Equipped creature has deathtouch. -Whenever equipped creature deals combat damage to a player, that player loses half his or her life, rounded up. -Equip {3} -ALA R - -Quill-Slinger Boggart -{3}{B} -Creature - Goblin Warrior -3/2 -Whenever a player casts a Kithkin spell, you may have target player lose 1 life. -LRW C - -Quilled Slagwurm -{4}{G}{G}{G} -Creature - Wurm -8/8 -MBS U - -Quilled Sliver -{1}{W} -Creature - Sliver -1/1 -All Slivers have "{T}: This permanent deals 1 damage to target attacking or blocking creature." -TSP U - -Quillmane Baku -{4}{U} -Creature - Spirit -3/3 -Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Quillmane Baku. -{1}, {T}, Remove X ki counters from Quillmane Baku: Return target creature with converted mana cost X or less to its owner's hand. -BOK C - -Quillspike -{2}{B/G} -Creature - Beast -1/1 -{B/G}, Remove a -1/-1 counter from a creature you control: Quillspike gets +3/+3 until end of turn. -EVE U - -Quirion Druid -{2}{G} -Creature - Elf Druid -1/2 -{G}, {T}: Target land becomes a 2/2 green creature that's still a land. (This effect lasts indefinitely.) -VIS R - -Quirion Dryad -{1}{G} -Creature - Dryad -1/1 -Whenever you cast a white, blue, black, or red spell, put a +1/+1 counter on Quirion Dryad. -PLS R, 10E R - -Quirion Elves -{1}{G} -Creature - Elf Druid -1/1 -As Quirion Elves enters the battlefield, choose a color. -{T}: Add {G} to your mana pool. -{T}: Add one mana of the chosen color to your mana pool. -MIR C, INV C, BTD C, PVC C - -Quirion Explorer -{1}{G} -Creature - Elf Druid Scout -1/1 -{T}: Add to your mana pool one mana of any color that a land an opponent controls could produce. -PLS C - -Quirion Ranger -{G} -Creature - Elf -1/1 -Return a Forest you control to its owner's hand: Untap target creature. Activate this ability only once each turn. -VIS C - -Quirion Sentinel -{1}{G} -Creature - Elf Druid -2/1 -When Quirion Sentinel enters the battlefield, add one mana of any color to your mana pool. -INV C - -Quirion Trailblazer -{3}{G} -Creature - Elf Scout -1/2 -When Quirion Trailblazer enters the battlefield, you may search your library for a basic land card and put that card onto the battlefield tapped. If you do, shuffle your library. -INV C - -Qumulox -{6}{U}{U} -Creature - Beast -5/4 -Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -Flying -5DN U, HOP U, EVT U - -Rabble-Rouser -{3}{R} -Creature - Goblin Shaman -1/1 -Bloodthirst 1 (If an opponent was dealt damage this turn, this creature enters the battlefield with a +1/+1 counter on it.) -{R}, {T}: Attacking creatures get +X/+0 until end of turn, where X is Rabble-Rouser's power. -GPT U - -Rabid Elephant -{4}{G} -Creature - Elephant -3/4 -Whenever Rabid Elephant becomes blocked, it gets +2/+2 until end of turn for each creature blocking it. -ODY C - -Rabid Rats -{1}{B} -Creature - Rat -1/1 -{T}: Target blocking creature gets -1/-1 until end of turn. -STH C - -Rabid Wolverines -{3}{G}{G} -Creature - Wolverine -4/4 -Whenever Rabid Wolverines becomes blocked by a creature, Rabid Wolverines gets +1/+1 until end of turn. -EXO C - -Rabid Wombat -{2}{G}{G} -Creature - Wombat -0/1 -Vigilance -Rabid Wombat gets +2/+2 for each Aura attached to it. -LEG U, CHR U, 5ED U, MED U - -Rack and Ruin -{2}{R} -Instant -Destroy two target artifacts. -ULG U - -Rackling -{4} -Artifact Creature - Construct -2/2 -At the beginning of each opponent's upkeep, Rackling deals X damage to that player, where X is 3 minus the number of cards in his or her hand. -NEM U - -Radha, Heir to Keld -{R}{G} -Legendary Creature - Elf Warrior -2/2 -Whenever Radha, Heir to Keld attacks, you may add {R}{R} to your mana pool. -{T}: Add {G} to your mana pool. -PLC R - -Radiant Essence -{1}{G}{W} -Creature - Spirit -2/3 -Radiant Essence gets +1/+2 as long as an opponent controls a black permanent. -MIR U - -Radiant Kavu -{R}{G}{W} -Creature - Kavu -3/3 -{R}{G}{W}: Prevent all combat damage blue creatures and black creatures would deal this turn. -PLS R - -Radiant's Dragoons -{3}{W} -Creature - Human Soldier -2/5 -Echo {3}{W} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -When Radiant's Dragoons enters the battlefield, you gain 5 life. -ULG U - -Radiant's Judgment -{2}{W} -Instant -Destroy target creature with power 4 or greater. -Cycling {2} ({2}, Discard this card: Draw a card.) -ULG C - -Radiant, Archangel -{3}{W}{W} -Legendary Creature - Angel -3/3 -Flying, vigilance -Radiant, Archangel gets +1/+1 for each other creature with flying on the battlefield. -ULG R - -Radiate -{3}{R}{R} -Instant -Choose target instant or sorcery spell that targets only a single permanent or player. Copy that spell for each other permanent or player the spell could target. Each copy targets a different one of those permanents and players. -TOR R - -Radjan Spirit -{3}{G} -Creature - Spirit -3/2 -{T}: Target creature loses flying until end of turn. -LEG U, 4ED U, 5ED U, 6ED U, ME4 U - -Rafiq of the Many -{1}{G}{W}{U} -Legendary Creature - Human Knight -3/3 -Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.) -Whenever a creature you control attacks alone, it gains double strike until end of turn. -ALA M - -Rag Dealer -{B} -Creature - Human Rogue -1/1 -{2}{B}, {T}: Exile up to three target cards from a single graveyard. -CHK C - -Rag Man -{2}{B}{B} -Creature - Human Minion -2/1 -{B}{B}{B}, {T}: Target opponent reveals his or her hand and discards a creature card at random. Activate this ability only during your turn. -DRK R, 4ED R, 5ED R, 6ED R, 7ED R - -Ragamuffyn -{2}{B} -Creature - Zombie Cleric -2/2 -Hellbent - {T}, Sacrifice a creature or land: Draw a card. Activate this ability only if you have no cards in hand. -DIS U - -Rage Extractor -{4}{R/P} -Artifact -({R/P} can be paid with either {R} or 2 life.) -Whenever you cast a spell with {P} in its mana cost, Rage Extractor deals damage equal to that spell's converted mana cost to target creature or player. -NPH U - -Rage Forger -{2}{R} -Creature - Elemental Shaman -2/2 -When Rage Forger enters the battlefield, put a +1/+1 counter on each other Shaman creature you control. -Whenever a creature you control with a +1/+1 counter on it attacks, you may have that creature deal 1 damage to target player. -MOR U - -Rage Nimbus -{2}{R} -Creature - Elemental -5/3 -Defender, flying -{1}{R}: Target creature attacks this turn if able. -ROE R - -Rage Reflection -{4}{R}{R} -Enchantment -Creatures you control have double strike. -SHM R - -Rage Weaver -{1}{R} -Creature - Human Wizard -2/1 -{2}: Target black or green creature gains haste until end of turn. (It can attack and {T} this turn.) -INV U, 10E U - -Ragged Veins -{1}{B} -Enchantment - Aura -Flash -Enchant creature -Whenever enchanted creature is dealt damage, its controller loses that much life. -CHK C - -Raging Bull -{2}{R} -Creature - Ox -2/2 -LEG C - -Raging Cougar -{2}{R} -Creature - Cat -2/2 -Haste -POR C - -Raging Goblin -{R} -Creature - Goblin Berserker -1/1 -Haste (This creature can attack and {T} as soon as it comes under your control.) -POR C (x2), P02 C, EXO C, 6ED C, S99 C, BRB C, BTD C, 7ED C, 8ED C, 9ED C, 10E C, EVG C, M10 C - -Raging Gorilla -{2}{R} -Creature - Ape -2/3 -Whenever Raging Gorilla blocks or becomes blocked, it gets +2/-2 until end of turn. -VIS C - -Raging Kavu -{1}{R}{G} -Creature - Kavu -3/1 -Flash -Haste -PRO R, INV R - -Raging Minotaur -{2}{R}{R} -Creature - Minotaur Berserker -3/3 -Haste -POR C, ME3 C - -Raging Ravine -Land -Raging Ravine enters the battlefield tapped. -{T}: Add {R} or {G} to your mana pool. -{2}{R}{G}: Until end of turn, Raging Ravine becomes a 3/3 red and green Elemental creature with "Whenever this creature attacks, put a +1/+1 counter on it." It's still a land. -WWK R - -Raging River -{R}{R} -Enchantment -Whenever one or more creatures you control attack, each defending player divides all creatures without flying he or she controls into a "left" pile and a "right" pile. Then, for each attacking creature you control, choose "left" or "right." That creature can't be blocked this combat except by creatures with flying and creatures in a pile with the chosen label. -LEA R, LEB R, 2ED R - -Raging Spirit -{3}{R} -Creature - Spirit -3/3 -{2}: Raging Spirit becomes colorless until end of turn. -MIR C - -Ragnar -{G}{W}{U} -Legendary Creature - Human Cleric -2/2 -{G}{W}{U}, {T}: Regenerate target creature. -LEG R, ME3 U - -Raid Bombardment -{2}{R} -Enchantment -Whenever a creature you control with power 2 or less attacks, Raid Bombardment deals 1 damage to defending player. -ROE C - -Raiding Nightstalker -{2}{B} -Creature - Nightstalker -2/2 -Swampwalk -P02 C - -Raiding Party -{2}{R} -Enchantment -Raiding Party can't be the target of white spells or abilities from white sources. -Sacrifice an Orc: Each player may tap any number of untapped white creatures he or she controls. For each creature tapped this way, that player chooses up to two Plains. Then destroy all Plains that weren't chosen this way by any player. -FEM U - -Rain of Blades -{W} -Instant -Rain of Blades deals 1 damage to each attacking creature. -SCG U, 8ED U - -Rain of Daggers -{4}{B}{B} -Sorcery -Destroy all creatures target opponent controls. You lose 2 life for each creature destroyed this way. -P02 R, ME4 R - -Rain of Embers -{1}{R} -Sorcery -Rain of Embers deals 1 damage to each creature and each player. -RAV C - -Rain of Filth -{B} -Instant -Until end of turn, lands you control gain "Sacrifice this land: Add {B} to your mana pool." -USG U - -Rain of Gore -{B}{R} -Enchantment -If a spell or ability would cause its controller to gain life, that player loses that much life instead. -DIS R - -Rain of Rust -{3}{R}{R} -Instant -Choose one - Destroy target artifact; or destroy target land. -Entwine {3}{R} (Choose both if you pay the entwine cost.) -5DN C - -Rain of Salt -{4}{R}{R} -Sorcery -Destroy two target lands. -POR U, USG U - -Rain of Tears -{1}{B}{B} -Sorcery -Destroy target land. -POR U, TMP U, MMQ U, 10E U - -Rainbow Crow -{3}{U} -Creature - Bird -2/2 -Flying -{1}: Rainbow Crow becomes the color of your choice until end of turn. -INV U - -Rainbow Efreet -{3}{U} -Creature - Efreet -3/1 -Flying -{U}{U}: Rainbow Efreet phases out. (While it's phased out, it's treated as though it doesn't exist. It phases in before you untap during your next untap step.) -VIS R - -Rainbow Knights -{W}{W} -Creature - Human Knight -2/1 -As Rainbow Knights enters the battlefield, it gains protection from a color chosen at random. (This effect lasts indefinitely.) -{1}: Rainbow Knights gains first strike until end of turn. -{W}{W}: Rainbow Knights gets +X/+0 until end of turn, where X is a number chosen randomly from 0 to 2. -ASTRAL S - -Rainbow Vale -Land -{T}: Add one mana of any color to your mana pool. An opponent gains control of Rainbow Vale at the beginning of the next end step. -FEM R, MED R - -Raise Dead -{B} -Sorcery -Return target creature card from your graveyard to your hand. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, POR C, P02 C, 6ED C, S99 C, 7ED C, 8ED C, 9ED C - -Raise the Alarm -{1}{W} -Instant -Put two 1/1 white Soldier creature tokens onto the battlefield. -MRD C, EVT C - -Raka Disciple -{R} -Creature - Minotaur Wizard -1/1 -{W}, {T}: Prevent the next 1 damage that would be dealt to target creature or player this turn. -{U}, {T}: Target creature gains flying until end of turn. -APC C - -Raka Sanctuary -{2}{R} -Enchantment -At the beginning of your upkeep, if you control a white or blue permanent, Raka Sanctuary deals 1 damage to target creature. If you control a white permanent and a blue permanent, Raka Sanctuary deals 3 damage to that creature instead. -APC U - -Rakalite -{6} -Artifact -{2}: Prevent the next 1 damage that would be dealt to target creature or player this turn. Return Rakalite to its owner's hand at the beginning of the next end step. -ATQ U, CHR R, ME4 R - -Rakavolver -{2}{R} -Creature - Volver -2/2 -Kicker {1}{W} and/or {U} (You may pay an additional {1}{W} and/or {U} as you cast this spell.) -If Rakavolver was kicked with its {1}{W} kicker, it enters the battlefield with two +1/+1 counters on it and with "Whenever Rakavolver deals damage, you gain that much life." -If Rakavolver was kicked with its {U} kicker, it enters the battlefield with a +1/+1 counter on it and with flying. -APC R - -Rakdos Augermage -{B}{B}{R} -Creature - Human Wizard -3/2 -First strike -{T}: Reveal your hand and discard a card of target opponent's choice. Then that player reveals his or her hand and discards a card of your choice. Activate this ability only any time you could cast a sorcery. -DIS R - -Rakdos Carnarium -Land -Rakdos Carnarium enters the battlefield tapped. -When Rakdos Carnarium enters the battlefield, return a land you control to its owner's hand. -{T}: Add {B}{R} to your mana pool. -DIS C, ARC C, COM C - -Rakdos Guildmage -{B/R}{B/R} -Creature - Zombie Shaman -2/2 -({B/R} can be paid with either {B} or {R}.) -{3}{B}, Discard a card: Target creature gets -2/-2 until end of turn. -{3}{R}: Put a 2/1 red Goblin creature token with haste onto the battlefield. Exile it at the beginning of the next end step. -DIS U, ARC U - -Rakdos Ickspitter -{1}{B}{R} -Creature - Thrull -1/1 -{T}: Rakdos Ickspitter deals 1 damage to target creature and that creature's controller loses 1 life. -DIS C - -Rakdos Pit Dragon -{2}{R}{R} -Creature - Dragon -3/3 -{R}{R}: Rakdos Pit Dragon gains flying until end of turn. -{R}: Rakdos Pit Dragon gets +1/+0 until end of turn. -Hellbent - Rakdos Pit Dragon has double strike as long as you have no cards in hand. -DIS R, JVC R - -Rakdos Riteknife -{2} -Artifact - Equipment -Equipped creature gets +1/+0 for each blood counter on Rakdos Riteknife and has "{T}, Sacrifice a creature: Put a blood counter on Rakdos Riteknife." -{B}{R}, Sacrifice Rakdos Riteknife: Target player sacrifices a permanent for each blood counter on Rakdos Riteknife. -Equip {2} -DIS R - -Rakdos Signet -{2} -Artifact -{1}, {T}: Add {B}{R} to your mana pool. -DIS C, ARC C, COM C - -Rakdos the Defiler -{2}{B}{B}{R}{R} -Legendary Creature - Demon -7/6 -Flying, trample -Whenever Rakdos the Defiler attacks, sacrifice half the non-Demon permanents you control, rounded up. -Whenever Rakdos deals combat damage to a player, that player sacrifices half the non-Demon permanents he or she controls, rounded up. -DIS R - -Rakeclaw Gargantuan -{2}{R}{G}{W} -Creature - Beast -5/3 -{1}: Target creature with power 5 or greater gains first strike until end of turn. -ALA C - -Raking Canopy -{1}{G}{G} -Enchantment -Whenever a creature with flying attacks you, Raking Canopy deals 4 damage to it. -SHM U - -Rakka Mar -{2}{R}{R} -Legendary Creature - Human Shaman -2/2 -Haste -{R}, {T}: Put a 3/1 red Elemental creature token with haste onto the battlefield. -CON R - -Raksha Golden Cub -{5}{W}{W} -Legendary Creature - Cat Soldier -3/4 -Vigilance -As long as Raksha Golden Cub is equipped, Cat creatures you control get +2/+2 and have double strike. -5DN R - -Raksha Golden Cub Avatar -Vanguard -Hand +1, life +9 -Creatures you control get +0/+1. -Equipped creatures you control get +1/+0 and have first strike. -VG S - -Rally -{W}{W} -Instant -Blocking creatures get +1/+1 until end of turn. -ICE C - -Rally the Forces -{2}{R} -Instant -Attacking creatures get +1/+0 and gain first strike until end of turn. -MBS C - -Rally the Horde -{5}{R} -Sorcery -Exile the top card of your library. Exile the top card of your library. Exile the top card of your library. If the last card exiled isn't a land, repeat this process until the last card exiled is a land. Put a 1/1 red Warrior creature token onto the battlefield for each nonland card exiled this way. -SOK R - -Rally the Righteous -{1}{R}{W} -Instant -Radiance - Untap target creature and each other creature that shares a color with it. Those creatures get +2/+0 until end of turn. -RAV C - -Rally the Troops -{W} -Instant -Cast Rally the Troops only during the declare attackers step and only if you've been attacked this step. -Untap all creatures you control. -P02 U, PTK U - -Ramirez DePietro -{3}{U}{B}{B} -Legendary Creature - Human Pirate -4/3 -First strike -LEG U, ME3 C - -Ramosian Captain -{1}{W}{W} -Creature - Human Rebel -2/2 -First strike -{5}, {T}: Search your library for a Rebel permanent card with converted mana cost 4 or less and put it onto the battlefield. Then shuffle your library. -MMQ U - -Ramosian Commander -{2}{W}{W} -Creature - Human Rebel -2/4 -{6}, {T}: Search your library for a Rebel permanent card with converted mana cost 5 or less and put it onto the battlefield. Then shuffle your library. -MMQ U - -Ramosian Lieutenant -{1}{W} -Creature - Human Rebel -1/2 -{4}, {T}: Search your library for a Rebel permanent card with converted mana cost 3 or less and put it onto the battlefield. Then shuffle your library. -MMQ C - -Ramosian Rally -{3}{W} -Instant -If you control a Plains, you may tap an untapped creature you control rather than pay Ramosian Rally's mana cost. -Creatures you control get +1/+1 until end of turn. -MMQ C - -Ramosian Revivalist -{3}{W} -Creature - Human Rebel Cleric -2/2 -{6}, {T}: Return target Rebel permanent card with converted mana cost 5 or less from your graveyard to the battlefield. -FUT U - -Ramosian Sergeant -{W} -Creature - Human Rebel -1/1 -{3}, {T}: Search your library for a Rebel permanent card with converted mana cost 2 or less and put it onto the battlefield. Then shuffle your library. -MMQ C - -Ramosian Sky Marshal -{3}{W}{W} -Creature - Human Rebel -3/3 -Flying -{7}, {T}: Search your library for a Rebel permanent card with converted mana cost 6 or less and put it onto the battlefield. Then shuffle your library. -MMQ R - -Rampaging Baloths -{4}{G}{G} -Creature - Beast -6/6 -Trample -Landfall - Whenever a land enters the battlefield under your control, you may put a 4/4 green Beast creature token onto the battlefield. -ZEN M - -Rampant Elephant -{3}{W} -Creature - Elephant -2/2 -{G}: Target creature blocks Rampant Elephant this turn if able. -INV C - -Rampant Growth -{1}{G} -Sorcery -Search your library for a basic land card and put that card onto the battlefield tapped. Then shuffle your library. -MIR C, TMP C, 6ED C, BTD C, 7ED C, 8ED C, 9ED C, 10E C, M10 C, HOP C, M12 C - -Rampart Crawler -{B} -Creature - Lizard Mercenary -1/1 -Rampart Crawler can't be blocked by Walls. -MMQ C - -Ramses Overdark -{2}{U}{U}{B}{B} -Legendary Creature - Human Assassin -4/3 -{T}: Destroy target enchanted creature. -LEG R, ME3 U - -Rancid Earth -{1}{B}{B} -Sorcery -Destroy target land. -Threshold - If seven or more cards are in your graveyard, instead destroy that land and Rancid Earth deals 1 damage to each creature and each player. -TOR C - -Rancor -{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+0 and has trample. -When Rancor is put into a graveyard from the battlefield, return Rancor to its owner's hand. -ULG C, GVL C, ARC C - -Ranger en-Vec -{1}{G}{W} -Creature - Human Soldier Archer -2/2 -First strike -{G}: Regenerate Ranger en-Vec. -TMP U - -Ranger of Eos -{3}{W} -Creature - Human Soldier -3/2 -When Ranger of Eos enters the battlefield, you may search your library for up to two creature cards with converted mana cost 1 or less, reveal them, and put them into your hand. If you do, shuffle your library. -ALA R - -Rank and File -{2}{B}{B} -Creature - Zombie -3/3 -When Rank and File enters the battlefield, green creatures get -1/-1 until end of turn. -ULG U - -Ransack -{3}{U} -Sorcery -Look at the top five cards of target player's library. Put any number of them on the bottom of that library in any order and the rest on top of the library in any order. -STH U, S99 R - -Rapacious One -{5}{R} -Creature - Eldrazi Drone -5/4 -Trample -Whenever Rapacious One deals combat damage to a player, put that many 0/1 colorless Eldrazi Spawn creature tokens onto the battlefield. They have "Sacrifice this creature: Add {1} to your mana pool." -ROE U, COM U - -Rapid Decay -{1}{B} -Instant -Exile up to three target cards from a single graveyard. -Cycling {2} ({2}, Discard this card: Draw a card.) -UDS R - -Rapid Fire -{3}{W} -Instant -Cast Rapid Fire only before blockers are declared. -Target creature gains first strike until end of turn. If it doesn't have rampage, that creature gains rampage 2 until end of turn. (Whenever this creature becomes blocked, it gets +2/+2 until end of turn for each creature blocking it beyond the first.) -LEG R - -Rappelling Scouts -{2}{W}{W} -Creature - Human Rebel Scout -1/4 -Flying -{2}{W}: Rappelling Scouts gains protection from the color of your choice until end of turn. -MMQ R - -Rashida Scalebane -{3}{W}{W} -Legendary Creature - Human Soldier -3/4 -{T}: Destroy target attacking or blocking Dragon. It can't be regenerated. You gain life equal to its power. -MIR R - -Rashka the Slayer -{3}{W}{W} -Legendary Creature - Human Archer -3/3 -Reach (This creature can block creatures with flying.) -Whenever Rashka the Slayer blocks one or more black creatures, Rashka gets +1/+2 until end of turn. -HML U - -Rasputin Dreamweaver -{4}{W}{U} -Legendary Creature - Human Wizard -4/1 -Rasputin Dreamweaver enters the battlefield with seven dream counters on it. -Remove a dream counter from Rasputin: Add {1} to your mana pool. -Remove a dream counter from Rasputin: Prevent the next 1 damage that would be dealt to Rasputin this turn. -At the beginning of your upkeep, if Rasputin started the turn untapped, put a dream counter on it. -Rasputin can't have more than seven dream counters on it. -LEG R, ME3 R - -Ratcatcher -{4}{B}{B} -Creature - Ogre Rogue -4/4 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -At the beginning of your upkeep, you may search your library for a Rat card, reveal it, and put it into your hand. If you do, shuffle your library. -DIS R - -Ratchet Bomb -{2} -Artifact -{T}: Put a charge counter on Ratchet Bomb. -{T}, Sacrifice Ratchet Bomb: Destroy each nonland permanent with converted mana cost equal to the number of charge counters on Ratchet Bomb. -SOM R - -Rath's Edge -Legendary Land -{T}: Add {1} to your mana pool. -{4}, {T}, Sacrifice a land: Rath's Edge deals 1 damage to target creature or player. -NEM R - -Rathi Assassin -{2}{B}{B} -Creature - Zombie Mercenary Assassin -2/2 -{1}{B}{B}, {T}: Destroy target tapped nonblack creature. -{3}, {T}: Search your library for a Mercenary permanent card with converted mana cost 3 or less and put it onto the battlefield. Then shuffle your library. -PRO R, NEM R - -Rathi Dragon -{2}{R}{R} -Creature - Dragon -5/5 -Flying (This creature can't be blocked except by creatures with flying or reach.) -When Rathi Dragon enters the battlefield, sacrifice it unless you sacrifice two Mountains. -TMP R, 9ED R - -Rathi Fiend -{3}{B} -Creature - Horror Mercenary -2/2 -When Rathi Fiend enters the battlefield, each player loses 3 life. -{3}, {T}: Search your library for a Mercenary permanent card with converted mana cost 3 or less and put it onto the battlefield. Then shuffle your library. -NEM U - -Rathi Intimidator -{1}{B}{B} -Creature - Horror Mercenary -2/1 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -{2}, {T}: Search your library for a Mercenary permanent card with converted mana cost 2 or less and put it onto the battlefield. Then shuffle your library. -NEM C - -Rathi Trapper -{1}{B} -Creature - Human Rebel Rogue -1/2 -{B}, {T}: Tap target creature. -PLC C - -Rats of Rath -{1}{B} -Creature - Rat -2/1 -{B}: Destroy target artifact, creature, or land you control. -TMP C - -Rats' Feast -{X}{B} -Sorcery -Exile X target cards from a single graveyard. -JUD C - -Rattleblaze Scarecrow -{6} -Artifact Creature - Scarecrow -5/3 -Rattleblaze Scarecrow has persist as long as you control a black creature. (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) -Rattleblaze Scarecrow has haste as long as you control a red creature. -SHM C - -Ravaged Highlands -Land -Ravaged Highlands enters the battlefield tapped. -{T}: Add {R} to your mana pool. -{T}, Sacrifice Ravaged Highlands: Add one mana of any color to your mana pool. -ODY C - -Ravages of War -{3}{W} -Sorcery -Destroy all lands. -PTK R, ME2 R - -Ravaging Horde -{3}{R}{R} -Creature - Human Soldier -3/3 -When Ravaging Horde enters the battlefield, destroy target land. -PTK U - -Ravaging Riftwurm -{1}{G}{G} -Creature - Wurm -6/6 -Kicker {4} (You may pay an additional {4} as you cast this spell.) -Vanishing 2 (This permanent enters the battlefield with two time counters on it. At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.) -If Ravaging Riftwurm was kicked, it enters the battlefield with three additional time counters on it. -FUT U - -Raven Familiar -{2}{U} -Creature - Bird -1/2 -Flying -Echo {2}{U} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -When Raven Familiar enters the battlefield, look at the top three cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order. -ULG U - -Raven Guild Initiate -{2}{U} -Creature - Human Wizard -1/4 -Morph-Return a Bird you control to its owner's hand. (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -SCG C - -Raven Guild Master -{1}{U}{U} -Creature - Human Wizard Mutant -1/1 -Whenever Raven Guild Master deals combat damage to a player, that player exiles the top ten cards of his or her library. -Morph {2}{U}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -SCG R - -Raven's Crime -{B} -Sorcery -Target player discards a card. -Retrace (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) -EVE C - -Raven's Run -Plane - Shadowmoor -All creatures have wither. (They deal damage to creatures in the form of -1/-1 counters.) -Whenever you roll {C}, put a -1/-1 counter on target creature, two -1/-1 counters on another target creature, and three -1/-1 counters on a third target creature. -HOP C - -Raven's Run Dragoon -{2}{G/W}{G/W} -Creature - Elf Knight -3/3 -Raven's Run Dragoon can't be blocked by black creatures. -SHM C - -Ravenous Baboons -{3}{R} -Creature - Ape -2/2 -When Ravenous Baboons enters the battlefield, destroy target nonbasic land. -EXO R - -Ravenous Baloth -{2}{G}{G} -Creature - Beast -4/4 -Sacrifice a Beast: You gain 4 life. -ONS R, GVL R - -Ravenous Rats -{1}{B} -Creature - Rat -1/1 -When Ravenous Rats enters the battlefield, target opponent discards a card. -P02 C, UDS C, S99 U, INV C, 8ED C, 9ED C, 10E C, GVL C - -Ravenous Skirge -{2}{B} -Creature - Imp -1/1 -Flying -Whenever Ravenous Skirge attacks, it gets +2/+0 until end of turn. -USG C - -Ravenous Trap -{2}{B}{B} -Instant - Trap -If an opponent had three or more cards put into his or her graveyard from anywhere this turn, you may pay {0} rather than pay Ravenous Trap's mana cost. -Exile all cards from target player's graveyard. -ZEN U - -Ravenous Vampire -{3}{B}{B} -Creature - Vampire -3/3 -Flying -At the beginning of your upkeep, you may sacrifice a nonartifact creature. If you do, put a +1/+1 counter on Ravenous Vampire. If you don't, tap Ravenous Vampire. -MIR U - -Raving Oni-Slave -{1}{B} -Creature - Ogre Warrior -3/3 -When Raving Oni-Slave enters the battlefield or leaves the battlefield, you lose 3 life if you don't control a Demon. -SOK C - -Ray of Command -{3}{U} -Instant -Untap target creature an opponent controls and gain control of it until end of turn. That creature gains haste until end of turn. When you lose control of the creature, tap it. -ICE C, MIR C, 5ED C, BRB C, ME2 U, COM C - -Ray of Distortion -{3}{W} -Instant -Destroy target artifact or enchantment. -Flashback {4}{W}{W} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY C - -Ray of Erasure -{U} -Instant -Target player puts the top card of his or her library into his or her graveyard. -Draw a card at the beginning of the next turn's upkeep. -ICE C - -Ray of Revelation -{1}{W} -Instant -Destroy target enchantment. -Flashback {G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -JUD C - -Rayne, Academy Chancellor -{2}{U} -Legendary Creature - Human Wizard -1/1 -Whenever you or a permanent you control becomes the target of a spell or ability an opponent controls, you may draw a card. You may draw an additional card if Rayne, Academy Chancellor is enchanted. -UDS R - -Raze -{R} -Sorcery -As an additional cost to cast Raze, sacrifice a land. -Destroy target land. -USG C - -Razia's Purification -{4}{R}{W} -Sorcery -Each player chooses three permanents he or she controls, then sacrifices the rest. -RAV R - -Razia, Boros Archangel -{4}{R}{R}{W}{W} -Legendary Creature - Angel -6/3 -Flying, vigilance, haste -{T}: The next 3 damage that would be dealt to target creature you control this turn is dealt to another target creature instead. -RAV R, HOP R - -Razing Snidd -{4}{B}{R} -Creature - Beast -3/3 -When Razing Snidd enters the battlefield, return a black or red creature you control to its owner's hand. -When Razing Snidd enters the battlefield, each player sacrifices a land. -PLS U - -Razor Barrier -{1}{W} -Instant -Target permanent you control gains protection from artifacts or from the color of your choice until end of turn. -MRD C, EVT C - -Razor Boomerang -{3} -Artifact - Equipment -Equipped creature has "{T}, Unattach Razor Boomerang: Razor Boomerang deals 1 damage to target creature or player. Return Razor Boomerang to its owner's hand." -Equip {2} -WWK U - -Razor Golem -{6} -Artifact Creature - Golem -3/4 -Affinity for Plains (This spell costs {1} less to cast for each Plains you control.) -Vigilance -DST C - -Razor Hippogriff -{3}{W}{W} -Creature - Hippogriff -3/3 -Flying -When Razor Hippogriff enters the battlefield, return target artifact card from your graveyard to your hand. You gain life equal to that card's converted mana cost. -SOM U - -Razor Pendulum -{4} -Artifact -At the beginning of each player's end step, if that player has 5 or less life, Razor Pendulum deals 2 damage to him or her. -MIR R - -Razor Swine -{2}{R} -Creature - Boar -2/1 -First strike -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -NPH C - -Razorclaw Bear -{2}{G}{G} -Creature - Bear -3/3 -Whenever Razorclaw Bear becomes blocked, it gets +2/+2 until end of turn. -P02 R - -Razorfield Rhino -{6} -Artifact Creature - Rhino -4/4 -Metalcraft - Razorfield Rhino gets +2/+2 as long as you control three or more artifacts. -MBS C - -Razorfield Thresher -{7} -Artifact Creature - Construct -6/4 -SOM C - -Razorfin Abolisher -{2}{U} -Creature - Merfolk Wizard -2/2 -{1}{U}, {T}: Return target creature with a counter on it to its owner's hand. -EVE U - -Razorfin Hunter -{U}{R} -Creature - Merfolk Goblin -1/1 -{T}: Razorfin Hunter deals 1 damage to target creature or player. -APC C - -Razorfoot Griffin -{3}{W} -Creature - Griffin -2/2 -Flying -First strike (This creature deals combat damage before creatures without first strike.) -INV C, 7ED C, 8ED C, M10 C - -Razorgrass Screen -{1} -Artifact Creature - Wall -2/1 -Defender (This creature can't attack.) -Razorgrass Screen blocks each turn if able. -5DN C - -Razorjaw Oni -{3}{B} -Creature - Demon Spirit -4/5 -Black creatures can't block. -SOK U, COM U - -Razormane Masticore -{5} -Artifact Creature - Masticore -5/5 -First strike (This creature deals combat damage before creatures without first strike.) -At the beginning of your upkeep, sacrifice Razormane Masticore unless you discard a card. -At the beginning of your draw step, you may have Razormane Masticore deal 3 damage to target creature. -5DN R, 10E R, EVT R - -Razortooth Rats -{2}{B} -Creature - Rat -2/1 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -WTH C, 6ED C, 7ED C, 9ED C - -Razorverge Thicket -Land -Razorverge Thicket enters the battlefield tapped unless you control two or fewer other lands. -{T}: Add {G} or {W} to your mana pool. -SOM R - -Reach Through Mists -{U} -Instant - Arcane -Draw a card. -CHK C - -Reach of Branches -{4}{G} -Tribal Instant - Treefolk -Put a 2/5 green Treefolk Shaman creature token onto the battlefield. -Whenever a Forest enters the battlefield under your control, you may return Reach of Branches from your graveyard to your hand. -MOR R - -Read the Runes -{X}{U} -Instant -Draw X cards. For each card drawn this way, discard a card unless you sacrifice a permanent. -ONS R - -Reality Acid -{2}{U} -Enchantment - Aura -Enchant permanent -Vanishing 3 (This permanent enters the battlefield with three time counters on it. At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.) -When Reality Acid leaves the battlefield, enchanted permanent's controller sacrifices it. -PLC C - -Reality Anchor -{1}{G} -Instant -Target creature loses shadow until end of turn. -Draw a card. -TMP C - -Reality Ripple -{1}{U} -Instant -Target artifact, creature, or land phases out. (While it's phased out, it's treated as though it doesn't exist. It phases in before its controller untaps during his or her next untap step.) -MIR C - -Reality Spasm -{X}{U}{U} -Instant -Choose one - Tap X target permanents; or untap X target permanents. -ROE U - -Reality Strobe -{4}{U}{U} -Sorcery -Return target permanent to its owner's hand. Exile Reality Strobe with three time counters on it. -Suspend 3-{2}{U} (Rather than cast this card from your hand, you may pay {2}{U} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) -FUT U - -Reality Twist -{U}{U}{U} -Enchantment -Cumulative upkeep {1}{U}{U} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -If tapped for mana, Plains produce {R}, Swamps produce {G}, Mountains produce {W}, and Forests produce {B} instead of any other type. -ICE R - -Realm Razer -{3}{R}{G}{W} -Creature - Beast -4/2 -When Realm Razer enters the battlefield, exile all lands. -When Realm Razer leaves the battlefield, return the exiled cards to the battlefield tapped under their owners' control. -ALA R - -Realms Befitting My Majesty -Scheme -When you set this scheme in motion, search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle your library. -ARC C - -Realms Uncharted -{2}{G} -Instant -Search your library for four land cards with different names and reveal them. An opponent chooses two of those cards. Put the chosen cards into your graveyard and the rest into your hand. Then shuffle your library. -ROE R - -Reanimate -{B} -Sorcery -Put target creature card from a graveyard onto the battlefield under your control. You lose life equal to its converted mana cost. -TMP U, BRB U, ARC U - -Reap -{1}{G} -Instant -Return up to X target cards from your graveyard to your hand, where X is the number of black permanents target opponent controls as you cast Reap. -TMP U - -Reap and Sow -{3}{G} -Sorcery -Choose one - Destroy target land; or search your library for a land card, put that card onto the battlefield, then shuffle your library. -Entwine {1}{G} (Choose both if you pay the entwine cost.) -DST C - -Reaper King -{2/W}{2/U}{2/B}{2/R}{2/G} -Legendary Artifact Creature - Scarecrow -6/6 -({2/W} can be paid with any two mana or with {W}. This card's converted mana cost is 10.) -Other Scarecrow creatures you control get +1/+1. -Whenever another Scarecrow enters the battlefield under your control, destroy target permanent. -SHM R - -Reaper King Avatar -Vanguard -Hand -2, life -5 -Each creature you control gets +1/+1 for each of its colors. -VG S - -Reaper of Sheoldred -{4}{B} -Creature - Horror -2/5 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -Whenever a source deals damage to Reaper of Sheoldred, that source's controller gets a poison counter. -NPH U - -Reaping the Graves -{2}{B} -Instant -Return target creature card from your graveyard to your hand. -Storm (When you cast this spell, copy it for each spell cast before it this turn. You may choose new targets for the copies.) -SCG C - -Reaping the Rewards -{W} -Instant -Buyback-Sacrifice a land. (You may sacrifice a land in addition to any other costs as you cast this spell. If you do, put this card into your hand as it resolves.) -You gain 2 life. -EXO C - -Reassembling Skeleton -{1}{B} -Creature - Skeleton Warrior -1/1 -{1}{B}: Return Reassembling Skeleton from your graveyard to the battlefield tapped. -ARC U, M11 U, M12 U - -Rebel Informer -{2}{B} -Creature - Human Mercenary Rebel -1/2 -Rebel Informer can't be the target of white spells or abilities from white sources. -{3}: Put target nontoken Rebel on the bottom of its owner's library. -PCY R - -Rebellion of the Flamekin -{3}{R} -Tribal Enchantment - Elemental -Whenever you clash, you may pay {1}. If you do, put a 3/1 red Elemental Shaman creature token onto the battlefield. If you won, that token gains haste until end of turn. (This ability triggers after the clash ends.) -LRW U - -Rebirth -{3}{G}{G}{G} -Sorcery -Remove Rebirth from your deck before playing if you're not playing for ante. -Each player may put the top card of his or her library into the ante. If a player does, his or her life total becomes 20. -LEG R, 4ED R - -Reborn Hero -{2}{W} -Creature - Human Soldier -2/2 -Vigilance -Threshold - As long as seven or more cards are in your graveyard, Reborn Hero has "When Reborn Hero dies, you may pay {W}{W}. If you do, return Reborn Hero to the battlefield under your control." -TOR R - -Reborn Hope -{G}{W} -Sorcery -Return target multicolored card from your graveyard to your hand. -ARB U - -Rebound -{1}{U} -Instant -Change the target of target spell that targets only a player. The new target must be a player. -STH U - -Rebuff the Wicked -{W} -Instant -Counter target spell that targets a permanent you control. -PLC U - -Rebuild -{2}{U} -Instant -Return all artifacts to their owners' hands. -Cycling {2} ({2}, Discard this card: Draw a card.) -ULG U - -Rebuking Ceremony -{3}{G}{G} -Sorcery -Put two target artifacts on top of their owners' libraries. -DST R - -Recall -{X}{X}{U} -Sorcery -Discard X cards, then return a card from your graveyard to your hand for each card discarded this way. Exile Recall. -LEG R, CHR U, 5ED R, 6ED R, ME3 U - -Recantation -{3}{U}{U} -Enchantment -At the beginning of your upkeep, you may put a verse counter on Recantation. -{U}, Sacrifice Recantation: Return up to X target permanents to their owners' hands, where X is the number of verse counters on Recantation. -USG R - -Reciprocate -{W} -Instant -Exile target creature that dealt damage to you this turn. -CHK U, DDG U - -Reckless Abandon -{R} -Sorcery -As an additional cost to cast Reckless Abandon, sacrifice a creature. -Reckless Abandon deals 4 damage to target creature or player. -UDS C - -Reckless Assault -{2}{B}{R} -Enchantment -{1}, Pay 2 life: Reckless Assault deals 1 damage to target creature or player. -INV R - -Reckless Charge -{R} -Sorcery -Target creature gets +3/+0 and gains haste until end of turn. -Flashback {2}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY C, HOP C - -Reckless Embermage -{3}{R} -Creature - Human Wizard -2/2 -{1}{R}: Reckless Embermage deals 1 damage to target creature or player and 1 damage to itself. -MIR R, 6ED R, 7ED R - -Reckless Ogre -{3}{R} -Creature - Ogre -3/2 -Whenever Reckless Ogre attacks alone, it gets +3/+0 until end of turn. -EXO C - -Reckless One -{3}{R} -Creature - Goblin Avatar -*/* -Haste -Reckless One's power and toughness are each equal to the number of Goblins on the battlefield. -ONS U, EVG U - -Reckless Scholar -{2}{U} -Creature - Human Wizard -2/1 -{T}: Target player draws a card, then discards a card. -ZEN C - -Reckless Spite -{1}{B}{B} -Instant -Destroy two target nonblack creatures. You lose 5 life. -TMP U, INV U - -Reckless Wurm -{3}{R}{R} -Creature - Wurm -4/4 -Trample -Madness {2}{R} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -PLC U - -Reclaim -{G} -Instant -Put target card from your graveyard on top of your library. -EXO C, 7ED C, 9ED C, M12 C - -Reclamation -{2}{G}{W} -Enchantment -Black creatures can't attack unless their controller sacrifices a land for each black creature he or she controls that's attacking. -ICE R - -Reclusive Wight -{3}{B} -Creature - Zombie Minion -4/4 -At the beginning of your upkeep, if you control another nonland permanent, sacrifice Reclusive Wight. -USG U - -Recoil -{1}{U}{B} -Instant -Return target permanent to its owner's hand. Then that player discards a card. -INV C - -Recollect -{2}{G} -Sorcery -Return target card from your graveyard to your hand. -RAV U, 10E U - -Reconnaissance -{W} -Enchantment -{0}: Remove target attacking creature you control from combat and untap it. -EXO U - -Reconstruction -{U} -Sorcery -Return target artifact card from your graveyard to your hand. -ATQ C, 3ED C, ME4 C - -Recoup -{1}{R} -Sorcery -Target sorcery card in your graveyard gains flashback until end of turn. The flashback cost is equal to its mana cost. (Mana cost includes color.) -Flashback {3}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY U - -Recover -{2}{B} -Sorcery -Return target creature card from your graveyard to your hand. -Draw a card. -INV C, 10E C - -Recross the Paths -{2}{G} -Sorcery -Reveal cards from the top of your library until you reveal a land card. Put that card onto the battlefield and the rest on the bottom of your library in any order. Clash with an opponent. If you win, return Recross the Paths to its owner's hand. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -MOR U - -Recumbent Bliss -{2}{W} -Enchantment - Aura -Enchant creature -Enchanted creature can't attack or block. -At the beginning of your upkeep, you may gain 1 life. -EVE C - -Recuperate -{3}{W} -Instant -Choose one - You gain 6 life; or prevent the next 6 damage that would be dealt to target creature this turn. -SCG C - -Recurring Insight -{4}{U}{U} -Sorcery -Draw cards equal to the number of cards in target opponent's hand. -Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -ROE R - -Recurring Nightmare -{2}{B} -Enchantment -Sacrifice a creature, Return Recurring Nightmare to its owner's hand: Return target creature card from your graveyard to the battlefield. Activate this ability only any time you could cast a sorcery. -EXO R - -Recycle -{4}{G}{G} -Enchantment -Skip your draw step. -Whenever you play a card, draw a card. -Your maximum hand size is two. -TMP R - -Red Cliffs Armada -{4}{U} -Creature - Human Soldier -5/4 -Red Cliffs Armada can't attack unless defending player controls an Island. -PTK U, ME2 C - -Red Elemental Blast -{R} -Instant -Choose one - Counter target blue spell; or destroy target blue permanent. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, ME4 U - -Red Mana Battery -{4} -Artifact -{2}, {T}: Put a charge counter on Red Mana Battery. -{T}, Remove any number of charge counters from Red Mana Battery: Add {R} to your mana pool, then add an additional {R} to your mana pool for each charge counter removed this way. -LEG U, 4ED R - -Red Scarab -{W} -Enchantment - Aura -Enchant creature -Enchanted creature can't be blocked by red creatures. -Enchanted creature gets +2/+2 as long as an opponent controls a red permanent. -ICE U - -Red Sun's Zenith -{X}{R} -Sorcery -Red Sun's Zenith deals X damage to target creature or player. If a creature dealt damage this way would die this turn, exile it instead. Shuffle Red Sun's Zenith into its owner's library. -MBS R - -Red Ward -{W} -Enchantment - Aura -Enchant creature -Enchanted creature has protection from red. This effect doesn't remove Red Ward. -LEA U, LEB U, 2ED U, 3ED U, 4ED U - -Redeem -{1}{W} -Instant -Prevent all damage that would be dealt this turn to up to two target creatures. -USG U, 8ED C - -Redeem the Lost -{1}{W} -Instant -Target creature you control gains protection from the color of your choice until end of turn. Clash with an opponent. If you win, return Redeem the Lost to its owner's hand. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -MOR U - -Redirect -{U}{U} -Instant -You may choose new targets for target spell. -M11 R, M12 R - -Reduce to Dreams -{3}{U}{U} -Sorcery -Return all artifacts and enchantments to their owners' hands. -BOK R - -Redwood Treefolk -{4}{G} -Creature - Treefolk -3/6 -POR C, WTH C, 6ED C, 7ED C - -Reef Pirates -{1}{U}{U} -Creature - Zombie Pirate -2/2 -Whenever Reef Pirates deals damage to an opponent, that player puts the top card of his or her library into his or her graveyard. -HML C (x2), 5ED C - -Reef Shaman -{U} -Creature - Merfolk Shaman -0/2 -{T}: Target land becomes the basic land type of your choice until end of turn. -APC C - -Reflect Damage -{3}{R}{W} -Instant -The next time a source of your choice would deal damage this turn, that damage is dealt to that source's controller instead. -MIR R - -Reflecting Mirror -{4} -Artifact -{X}, {T}: Change the target of target spell with a single target if that target is you. The new target must be a player. X is twice the converted mana cost of that spell. -DRK U - -Reflecting Pool -Land -{T}: Add to your mana pool one mana of any type that a land you control could produce. -TMP R, SHM R - -Reflex Sliver -{3}{G} -Creature - Sliver -2/2 -All Sliver creatures have haste. -PLC C - -Reflexes -{R} -Enchantment - Aura -Enchant creature (Target a creature as you cast this. This card enters the battlefield attached to that creature.) -Enchanted creature has first strike. (It deals combat damage before creatures without first strike.) -USG C, 7ED C, 8ED C, 9ED C - -Refraction Trap -{3}{W} -Instant - Trap -If an opponent cast a red instant or sorcery spell this turn, you may pay {W} rather than pay Refraction Trap's mana cost. -Prevent the next 3 damage that a source of your choice would deal to you and/or permanents you control this turn. If damage is prevented this way, Refraction Trap deals that much damage to target creature or player. -WWK U - -Refresh -{2}{G} -Instant -Regenerate target creature. -Draw a card. -ODY C - -Refreshing Rain -{3}{G} -Instant -If an opponent controls a Swamp and you control a Forest, you may cast Refreshing Rain without paying its mana cost. -Target player gains 6 life. -NEM U - -Regal Force -{4}{G}{G}{G} -Creature - Elemental -5/5 -When Regal Force enters the battlefield, draw a card for each green creature you control. -EVE R - -Regal Unicorn -{2}{W} -Creature - Unicorn -2/3 -POR C, 6ED C - -Regenerate -{1}{G} -Instant -Regenerate target creature. (The next time that creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.) -M10 C - -Regeneration -{1}{G} -Enchantment - Aura -Enchant creature (Target a creature as you cast this. This card enters the battlefield attached to that creature.) -{G}: Regenerate enchanted creature. (The next time that creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.) -LEA C, LEB C, 2ED C, 3ED C, 4ED C, ICE C, MIR C, 5ED C, 6ED C, 7ED C, 8ED C, 9ED U, 10E U - -Regress -{2}{U} -Instant -Return target permanent to its owner's hand. -MRD C, ROE C - -Regrowth -{1}{G} -Sorcery -Return target card from your graveyard to your hand. -LEA U, LEB U, 2ED U, 3ED U, ME4 R - -Reign of Chaos -{2}{R}{R} -Sorcery -Choose one - Destroy target Plains and target white creature; or destroy target Island and target blue creature. -MIR U - -Reign of Terror -{3}{B}{B} -Sorcery -Destroy all green creatures or all white creatures. They can't be regenerated. You lose 2 life for that died this way. -MIR U - -Reincarnation -{1}{G}{G} -Instant -Choose target creature. When that creature dies this turn, return a creature card from that graveyard to the battlefield under the control of that creature's owner. -LEG U, ME3 U - -Reinforced Bulwark -{3} -Artifact Creature - Wall -0/4 -Defender -{T}: Prevent the next 1 damage that would be dealt to you this turn. -ROE C - -Reinforcements -{W} -Instant -Put up to three target creature cards from your graveyard on top of your library. -ALL C (x2), ME2 C - -Reins of Power -{2}{U}{U} -Instant -Untap all creatures you control and all creatures target opponent controls. You and that opponent each gain control of all creatures the other controls until end of turn. Those creatures gain haste until end of turn. -STH R, COM R - -Reins of the Vinesteed -{3}{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2. -When enchanted creature dies, you may return Reins of the Vinesteed from your graveyard to the battlefield attached to a creature that shares a creature type with that creature. -MOR C - -Reiterate -{1}{R}{R} -Instant -Buyback {3} (You may pay an additional {3} as you cast this spell. If you do, put this card into your hand as it resolves.) -Copy target instant or sorcery spell. You may choose new targets for the copy. -TSP R - -Reito Lantern -{2} -Artifact -{3}: Put target card from a graveyard on the bottom of its owner's library. -CHK U - -Reiver Demon -{4}{B}{B}{B}{B} -Creature - Demon -6/6 -Flying -When Reiver Demon enters the battlefield, if you cast it from your hand, destroy all nonartifact, nonblack creatures. They can't be regenerated. -MRD R, DVD R, COM R - -Rejuvenate -{3}{G} -Sorcery -You gain 6 life. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG C - -Rejuvenation Chamber -{3} -Artifact -Fading 2 (This artifact enters the battlefield with two fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.) -{T}: You gain 2 life. -NEM U - -Reki, the History of Kamigawa -{2}{G} -Legendary Creature - Human Shaman -1/2 -Whenever you cast a legendary spell, draw a card. -SOK R - -Rekindled Flame -{2}{R}{R} -Sorcery -Rekindled Flame deals 4 damage to target creature or player. -At the beginning of your upkeep, if an opponent has no cards in hand, you may return Rekindled Flame from your graveyard to your hand. -EVE R - -Reknit -{1}{G/W} -Instant -Regenerate target permanent. -SHM U - -Relearn -{1}{U}{U} -Sorcery -Return target instant or sorcery card from your graveyard to your hand. -WTH U, 6ED U, S99 U - -Release the Ants -{1}{R} -Instant -Release the Ants deals 1 damage to target creature or player. Clash with an opponent. If you win, return Release the Ants to its owner's hand. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -MOR U - -Relentless Assault -{2}{R}{R} -Sorcery -Untap all creatures that attacked this turn. After this main phase, there is an additional combat phase followed by an additional main phase. -VIS R, P02 R, 6ED R, PTK R, S99 R, 7ED R, 8ED R, 9ED R, 10E R, HOP R - -Relentless Rats -{1}{B}{B} -Creature - Rat -2/2 -Relentless Rats gets +1/+1 for each other creature on the battlefield named Relentless Rats. -A deck can have any number of cards named Relentless Rats. -5DN U, 10E U, M10 U, M11 U - -Relic Bane -{1}{B}{B} -Enchantment - Aura -Enchant artifact -Enchanted artifact has "At the beginning of your upkeep, you lose 2 life." -MRD U - -Relic Barrier -{2} -Artifact -{T}: Tap target artifact. -LEG U, 5DN U - -Relic Bind -{2}{U} -Enchantment - Aura -Enchant artifact an opponent controls -Whenever enchanted artifact becomes tapped, choose one - Relic Bind deals 1 damage to target player; or target player gains 1 life. -LEG U, 4ED R - -Relic Crush -{4}{G} -Instant -Destroy target artifact or enchantment and up to one other target artifact or enchantment. -ZEN C, COM C - -Relic Putrescence -{2}{B} -Enchantment - Aura -Enchant artifact -Whenever enchanted artifact becomes tapped, its controller gets a poison counter. -SOM C - -Relic Ward -{1}{W} -Enchantment - Aura -You may cast Relic Ward as though it had flash. If you cast it any time a sorcery couldn't have been cast, the controller of the permanent it becomes sacrifices it at the beginning of the next cleanup step. -Enchant artifact -Enchanted artifact has shroud. (It can't be the target of spells or abilities.) -VIS U - -Relic of Progenitus -{1} -Artifact -{T}: Target player exiles a card from his or her graveyard. -{1}, Exile Relic of Progenitus: Exile all cards from all graveyards. Draw a card. -ALA C, HOP C - -Reliquary Monk -{2}{W} -Creature - Human Monk Cleric -2/2 -When Reliquary Monk dies, destroy target artifact or enchantment. -UDS C - -Reliquary Tower -Land -You have no maximum hand size. -{T}: Add {1} to your mana pool. -CON U - -Remand -{1}{U} -Instant -Counter target spell. If that spell is countered this way, put it into its owner's hand instead of into that player's graveyard. -Draw a card. -RAV U - -Remedy -{1}{W} -Instant -Prevent the next 5 damage that would be dealt this turn to any number of target creatures and/or players, divided as you choose. -VIS C, 6ED C - -Remember the Fallen -{2}{W} -Sorcery -Choose one or both - Return target creature card from your graveyard to your hand; and/or return target artifact card from your graveyard to your hand. -NPH C - -Remembrance -{3}{W} -Enchantment -Whenever a nontoken creature you control dies, you may search your library for a card with the same name as that creature, reveal it, and put it into your hand. If you do, shuffle your library. -USG R - -Reminisce -{2}{U} -Sorcery -Target player shuffles his or her graveyard into his or her library. -ONS U, 9ED U, 10E U - -Remote Farm -Land -Remote Farm enters the battlefield tapped with two depletion counters on it. -{T}, Remove a depletion counter from Remote Farm: Add {W}{W} to your mana pool. If there are no depletion counters on Remote Farm, sacrifice it. -MMQ C - -Remote Isle -Land -Remote Isle enters the battlefield tapped. -{T}: Add {U} to your mana pool. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG C, BRB C, BTD C - -Remove -{U} -Instant -Cast Remove only during the declare attackers step and only if you've been attacked this step. -Return target attacking creature to its owner's hand. -P02 U - -Remove Enchantments -{W} -Instant -Return to your hand all enchantments you both own and control, all Auras you own attached to permanents you control, and all Auras you own attached to attacking creatures your opponents control. Then destroy all other enchantments you control, all other Auras attached to permanents you control, and all other Auras attached to attacking creatures your opponents control. -LEG C - -Remove Soul -{1}{U} -Instant -Counter target creature spell. -LEG C, CHR C, 5ED C, 6ED C, S99 C, 7ED C, 8ED C, 9ED C, 10E C, ME3 C - -Rend Flesh -{2}{B} -Instant - Arcane -Destroy target non-Spirit creature. -CHK C - -Rend Spirit -{2}{B} -Instant -Destroy target Spirit. -CHK C - -Rendclaw Trow -{2}{B/G} -Creature - Troll -2/2 -Wither (This deals damage to creatures in the form of -1/-1 counters.) -Persist (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) -EVE C - -Rending Vines -{1}{G}{G} -Instant - Arcane -Destroy target artifact or enchantment if its converted mana cost is less than or equal to the number of cards in your hand. -Draw a card. -SOK C - -Renegade Doppelganger -{1}{U} -Creature - Shapeshifter -0/1 -Whenever another creature enters the battlefield under your control, you may have Renegade Doppelganger become a copy of that creature until end of turn. (If it does, it loses this ability for the rest of the turn.) -ROE R - -Renegade Troops -{4}{R} -Creature - Human Soldier -4/2 -Haste -PTK U - -Renegade Warlord -{4}{R} -Creature - Human Warrior -3/3 -First strike -Whenever Renegade Warlord attacks, each other attacking creature gets +1/+0 until end of turn. -TMP U - -Renewal -{2}{G} -Sorcery -As an additional cost to cast Renewal, sacrifice a land. -Search your library for a basic land card and put that card onto the battlefield. Then shuffle your library. -Draw a card at the beginning of the next turn's upkeep. -HML C - -Renewed Faith -{2}{W} -Instant -You gain 6 life. -Cycling {1}{W} ({1}{W}, Discard this card: Draw a card.) -When you cycle Renewed Faith, you may gain 2 life. -ONS C - -Renewing Dawn -{1}{W} -Sorcery -You gain 2 life for each Mountain target opponent controls. -POR U - -Renewing Touch -{G} -Sorcery -Shuffle any number of target creature cards from your graveyard into your library. -P02 U, S99 U - -Renounce -{1}{W} -Instant -Sacrifice any number of permanents. You gain 2 life for each permanent sacrificed this way. -MMQ U - -Reparations -{1}{W}{U} -Enchantment -Whenever an opponent casts a spell that targets you or a creature you control, you may draw a card. -MIR R - -Repay in Kind -{5}{B}{B} -Sorcery -Each player's life total becomes the lowest life total among all players. -ROE R - -Repeal -{X}{U} -Instant -Return target nonland permanent with converted mana cost X to its owner's hand. -Draw a card. -GPT C - -Repel -{3}{U} -Instant -Put target creature on top of its owner's library. -ODY C - -Repel Intruders -{3}{W/U} -Instant -Put two 1/1 white Kithkin Soldier creature tokens onto the battlefield if {W} was spent to cast Repel Intruders. Counter up to one target creature spell if {U} was spent to cast Repel Intruders. (Do both if {W}{U} was spent.) -SHM U - -Repel the Darkness -{2}{W} -Instant -Tap up to two target creatures. -Draw a card. -ROE C - -Repentance -{2}{W} -Sorcery -Target creature deals damage to itself equal to its power. -TMP U - -Repentant Blacksmith -{1}{W} -Creature - Human -1/2 -Protection from red -ARN R, CHR C, 5ED C - -Repentant Vampire -{3}{B}{B} -Creature - Vampire -3/3 -Flying -Whenever a creature dealt damage by Repentant Vampire this turn dies, put a +1/+1 counter on Repentant Vampire. -Threshold - As long as seven or more cards are in your graveyard, Repentant Vampire is white and has "{T}: Destroy target black creature." -ODY R - -Repercussion -{1}{R}{R} -Enchantment -Whenever a creature is dealt damage, Repercussion deals that much damage to that creature's controller. -UDS R - -Replenish -{3}{W} -Sorcery -Return all enchantment cards from your graveyard to the battlefield. (Auras with nothing to enchant remain in your graveyard.) -UDS R - -Repopulate -{1}{G} -Instant -Shuffle all creature cards from target player's graveyard into that player's library. -Cycling {2} ({2}, Discard this card: Draw a card.) -ULG C - -Reprisal -{1}{W} -Instant -Destroy target creature with power 4 or greater. It can't be regenerated. -ALL C (x2), 6ED U, 7ED U, ME2 C, DDG U - -Reprocess -{2}{B}{B} -Sorcery -Sacrifice any number of artifacts, creatures, and/or lands. Draw a card for each permanent sacrificed this way. -USG R, 7ED R - -Repulse -{2}{U} -Instant -Return target creature to its owner's hand. -Draw a card. -INV C, JVC C, COM C - -Reroute -{1}{R} -Instant -Change the target of target activated ability with a single target. (Mana abilities can't be targeted.) -Draw a card. -RAV U - -Rescind -{1}{U}{U} -Instant -Return target permanent to its owner's hand. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG C - -Rescue -{U} -Instant -Return target permanent you control to its owner's hand. -UDS C - -Research -{G}{U} -Instant -Choose up to four cards you own from outside the game and shuffle them into your library. ----- -Development -{3}{U}{R} -Instant -Put a 3/1 red Elemental creature token onto the battlefield unless any opponent has you draw a card. Repeat this process two more times. -DIS R - -Research the Deep -{1}{U} -Sorcery -Draw a card. Clash with an opponent. If you win, return Research the Deep to its owner's hand. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -MOR U - -Reset -{U}{U} -Instant -Cast Reset only during an opponent's turn after his or her upkeep step. -Untap all lands you control. -LEG U, ME3 R - -Reshape -{X}{U}{U} -Sorcery -As an additional cost to cast Reshape, sacrifice an artifact. -Search your library for an artifact card with converted mana cost X or less and put it onto the battlefield. Then shuffle your library. -DST R - -Resilient Wanderer -{2}{W}{W} -Creature - Human Nomad -2/3 -First strike -Discard a card: Resilient Wanderer gains protection from the color of your choice until end of turn. -ODY U - -Resistance Fighter -{W} -Creature - Human Soldier -1/1 -Sacrifice Resistance Fighter: Prevent all combat damage target creature would deal this turn. -VIS C, 6ED C - -Resize -{1}{G} -Instant -Target creature gets +3/+3 until end of turn. -Recover {1}{G} (When a creature is put into your graveyard from the battlefield, you may pay {1}{G}. If you do, return this card from your graveyard to your hand. Otherwise, exile this card.) -CSP U - -Resounding Roar -{1}{G} -Instant -Target creature gets +3/+3 until end of turn. -Cycling {5}{R}{G}{W} ({5}{R}{G}{W}, Discard this card: Draw a card.) -When you cycle Resounding Roar, target creature gets +6/+6 until end of turn. -ALA C - -Resounding Scream -{2}{B} -Sorcery -Target player discards a card at random. -Cycling {5}{U}{B}{R} ({5}{U}{B}{R}, Discard this card: Draw a card.) -When you cycle Resounding Scream, target player discards two cards at random. -ALA C - -Resounding Silence -{3}{W} -Instant -Exile target attacking creature. -Cycling {5}{G}{W}{U} ({5}{G}{W}{U}, Discard this card: Draw a card.) -When you cycle Resounding Silence, exile up to two target attacking creatures. -ALA C - -Resounding Thunder -{2}{R} -Instant -Resounding Thunder deals 3 damage to target creature or player. -Cycling {5}{B}{R}{G} ({5}{B}{R}{G}, Discard this card: Draw a card.) -When you cycle Resounding Thunder, it deals 6 damage to target creature or player. -ALA C - -Resounding Wave -{2}{U} -Instant -Return target permanent to its owner's hand. -Cycling {5}{W}{U}{B} ({5}{W}{U}{B}, Discard this card: Draw a card.) -When you cycle Resounding Wave, return two target permanents to their owners' hands. -ALA C - -Respite -{1}{G} -Instant -Prevent all combat damage that would be dealt this turn. You gain 1 life for each attacking creature. -TMP C - -Resplendent Mentor -{4}{W} -Creature - Kithkin Cleric -2/2 -White creatures you control have "{T}: You gain 1 life." -SHM U - -Rest for the Weary -{1}{W} -Instant -Target player gains 4 life. -Landfall - If you had a land enter the battlefield under your control this turn, that player gains 8 life instead. -WWK C - -Restless Apparition -{W/B}{W/B}{W/B} -Creature - Spirit -2/2 -{W/B}{W/B}{W/B}: Restless Apparition gets +3/+3 until end of turn. -Persist (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) -EVE U - -Restless Bones -{2}{B} -Creature - Skeleton -1/1 -{3}{B}, {T}: Target creature gains swampwalk until end of turn. -{1}{B}: Regenerate Restless Bones. -GPT C - -Restless Dead -{1}{B} -Creature - Skeleton -1/1 -{B}: Regenerate Restless Dead. -MIR C - -Restless Dreams -{B} -Sorcery -As an additional cost to cast Restless Dreams, discard X cards. -Return X target creature cards from your graveyard to your hand. -TOR C - -Restock -{3}{G}{G} -Sorcery -Return two target cards from your graveyard to your hand. Exile Restock. -INV R - -Restore Balance -Sorcery -Restore Balance is white. -Suspend 6-{W} (Rather than cast this card from your hand, pay {W} and exile it with six time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) -Each player chooses a number of lands he or she controls equal to the number of lands controlled by the player who controls the fewest, then sacrifices the rest. Players sacrifice creatures and discard cards the same way. -TSP R - -Restrain -{2}{W} -Instant -Prevent all combat damage that would be dealt by target attacking creature this turn. -Draw a card. -INV C - -Resurrection -{2}{W}{W} -Sorcery -Return target creature card from your graveyard to the battlefield. -LEA U, LEB U, 2ED U, 3ED U, TSB S - -Resuscitate -{1}{G} -Instant -Until end of turn, creatures you control gain "{1}: Regenerate this creature." -EXO U - -Retaliate -{2}{W}{W} -Instant -Destroy all creatures that dealt damage to you this turn. -5DN R - -Retaliation -{2}{G} -Enchantment -Creatures you control have "Whenever this creature becomes blocked by a creature, this creature gets +1/+1 until end of turn." -USG U - -Retaliator Griffin -{1}{R}{G}{W} -Creature - Griffin -2/2 -Flying -Whenever a source an opponent controls deals damage to you, you may put that many +1/+1 counters on Retaliator Griffin. -ARB R - -Retether -{3}{W} -Sorcery -Return each Aura card from your graveyard to the battlefield. Only creatures can be enchanted this way. (Aura cards that can't enchant a creature on the battlefield remain in your graveyard.) -PLC R - -Rethink -{2}{U} -Instant -Counter target spell unless its controller pays {X}, where X is its converted mana cost. -PCY C - -Retraced Image -{U} -Sorcery -Reveal a card in your hand, then put that card onto the battlefield if it has the same name as a permanent. -TOR R - -Retract -{U} -Instant -Return all artifacts you control to their owner's hand. -DST R - -Retribution -{2}{R}{R} -Sorcery -Choose two target creatures an opponent controls. That player chooses and sacrifices one of those creatures. Put a -1/-1 counter on the other. -HML U, ME2 U - -Retribution of the Meek -{2}{W} -Sorcery -Destroy all creatures with power 4 or greater. They can't be regenerated. -VIS R - -Retromancer -{2}{R}{R} -Creature - Viashino Shaman -3/3 -Whenever Retromancer becomes the target of a spell or ability, Retromancer deals 3 damage to that spell or ability's controller. -USG C - -Return of the Nightstalkers -{5}{B}{B} -Sorcery -Return all Nightstalker permanent cards from your graveyard to the battlefield. Then destroy all Swamps you control. -P02 R - -Return to Battle -{B} -Sorcery -Return target creature card from your graveyard to your hand. -PTK C - -Return to Dust -{2}{W}{W} -Instant -Exile target artifact or enchantment. If you cast this spell during your main phase, you may exile up to one other target artifact or enchantment. -TSP U, COM U - -Reveillark -{4}{W} -Creature - Elemental -4/3 -Flying -When Reveillark leaves the battlefield, return up to two target creature cards with power 2 or less from your graveyard to the battlefield. -Evoke {5}{W} (You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield.) -MOR R - -Reveille Squad -{2}{W}{W} -Creature - Human Rebel -3/3 -Whenever one or more creatures attack you, if Reveille Squad is untapped, you may untap all creatures you control. -PCY U - -Reveka, Wizard Savant -{2}{U}{U} -Legendary Creature - Dwarf Wizard -0/1 -{T}: Reveka, Wizard Savant deals 2 damage to target creature or player and doesn't untap during your next untap step. -HML R, ME3 U - -Revelation -{G} -World Enchantment -Players play with their hands revealed. -LEG R, CHR R - -Revelsong Horn -{2} -Artifact -{1}, {T}, Tap an untapped creature you control: Target creature gets +1/+1 until end of turn. -SHM U - -Revenant -{4}{B} -Creature - Spirit -*/* -Flying -Revenant's power and toughness are each equal to the number of creature cards in your graveyard. -PRO R, STH R, 7ED R - -Revenant Patriarch -{4}{B} -Creature - Spirit -4/3 -When Revenant Patriarch enters the battlefield, if {W} was spent to cast Revenant Patriarch, target player skips his or her next combat phase. -Revenant Patriarch can't block. -GPT U - -Reverberate -{R}{R} -Instant -Copy target instant or sorcery spell. You may choose new targets for the copy. -M11 R, H10 R, M12 R - -Reverberation -{2}{U}{U} -Instant -All damage that would be dealt this turn by target sorcery spell is dealt to that spell's controller instead. -LEG R - -Revered Dead -{1}{W} -Creature - Spirit Soldier -1/1 -{W}: Regenerate Revered Dead. -PLC C - -Revered Elder -{2}{W} -Creature - Human Cleric -1/2 -{1}: Prevent the next 1 damage that would be dealt to Revered Elder this turn. -MMQ C - -Revered Unicorn -{1}{W} -Creature - Unicorn -2/3 -Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -When Revered Unicorn leaves the battlefield, you gain life equal to the number of age counters on it. -WTH U - -Reverence -{2}{W}{W} -Enchantment -Creatures with power 2 or less can't attack you. -SOK R - -Reverent Mantra -{3}{W} -Instant -You may exile a white card from your hand rather than pay Reverent Mantra's mana cost. -Choose a color. All creatures gain protection from the chosen color until end of turn. -MMQ R - -Reverent Silence -{3}{G} -Sorcery -If you control a Forest, rather than pay Reverent Silence's mana cost, you may have each other player gain 6 life. -Destroy all enchantments. -NEM C - -Reversal of Fortune -{4}{R}{R} -Sorcery -Target opponent reveals his or her hand. You may copy an instant or sorcery card in it. If you do, you may cast the copy without paying its mana cost. -5DN R - -Reverse Damage -{1}{W}{W} -Instant -The next time a source of your choice would deal damage to you this turn, prevent that damage. You gain life equal to the damage prevented this way. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, 6ED R, 7ED R, 9ED R - -Reverse Polarity -{W}{W} -Instant -You gain X life, where X is twice the damage dealt to you so far this turn by artifacts. -ATQ C, 3ED U - -Reverse the Sands -{6}{W}{W} -Sorcery -Redistribute any number of players' life totals. (Each of those players gets one life total back.) -CHK R - -Revive -{1}{G} -Sorcery -Return target green card from your graveyard to your hand. -MMQ U, 8ED U - -Revive the Fallen -{1}{B} -Sorcery -Return target creature card from a graveyard to its owner's hand. Clash with an opponent. If you win, return Revive the Fallen to its owner's hand. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -MOR U - -Reviving Dose -{2}{W} -Instant -You gain 3 life. -Draw a card. -INV C, 10E C - -Reviving Vapors -{2}{W}{U} -Instant -Reveal the top three cards of your library and put one of them into your hand. You gain life equal to that card's converted mana cost. Put all other cards revealed this way into your graveyard. -INV U - -Revoke Existence -{1}{W} -Sorcery -Exile target artifact or enchantment. -SOM C - -Reward the Faithful -{W} -Instant -Any number of target players each gain life equal to the highest converted mana cost among permanents you control. -SCG U - -Rewards of Diversity -{2}{W} -Enchantment -Whenever an opponent casts a multicolored spell, you gain 4 life. -INV U - -Reweave -{5}{U} -Instant - Arcane -Target permanent's controller sacrifices it. If he or she does, that player reveals cards from the top of his or her library until he or she reveals a permanent card that shares a card type with the sacrificed permanent, puts that card onto the battlefield, then shuffles his or her library. -Splice onto Arcane {2}{U}{U} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -CHK R - -Rewind -{2}{U}{U} -Instant -Counter target spell. Untap up to four lands. -USG C, 8ED U, 9ED U - -Reya Dawnbringer -{6}{W}{W}{W} -Legendary Creature - Angel -4/6 -Flying -At the beginning of your upkeep, you may return target creature card from your graveyard to the battlefield. -INV R, 10E R, DVD R - -Rhox -{4}{G}{G} -Creature - Rhino Beast -5/5 -You may have Rhox assign its combat damage as though it weren't blocked. -{2}{G}: Regenerate Rhox. (The next time this creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.) -NEM R, 8ED R, 10E R - -Rhox Bodyguard -{3}{G}{W} -Creature - Rhino Monk Soldier -2/3 -Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.) -When Rhox Bodyguard enters the battlefield, you gain 3 life. -CON C - -Rhox Brute -{2}{R}{G} -Creature - Rhino Warrior -4/4 -ARB C - -Rhox Charger -{3}{G} -Creature - Rhino Soldier -3/3 -Trample -Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.) -ALA U - -Rhox Meditant -{3}{W} -Creature - Rhino Monk -2/4 -When Rhox Meditant enters the battlefield, if you control a green permanent, draw a card. -CON C - -Rhox Pikemaster -{2}{W}{W} -Creature - Rhino Soldier -3/3 -First strike (This creature deals combat damage before creatures without first strike.) -Other Soldier creatures you control have first strike. -M10 U - -Rhox War Monk -{G}{W}{U} -Creature - Rhino Monk -3/4 -Lifelink -ALA U - -Rhys the Exiled -{2}{G} -Legendary Creature - Elf Warrior -3/2 -Whenever Rhys the Exiled attacks, you gain 1 life for each Elf you control. -{B}, Sacrifice an Elf: Regenerate Rhys the Exiled. -MOR R - -Rhys the Redeemed -{G/W} -Legendary Creature - Elf Warrior -1/1 -{2}{G/W}, {T}: Put a 1/1 green and white Elf Warrior creature token onto the battlefield. -{4}{G/W}{G/W}, {T}: For each creature token you control, put a token that's a copy of that creature onto the battlefield. -SHM R - -Rhystic Cave -Land -{T}: Choose a color. Add one mana of that color to your mana pool unless any player pays {1}. Activate this ability only any time you could cast an instant. -PCY U - -Rhystic Circle -{2}{W}{W} -Enchantment -{1}: Any player may pay {1}. If no one does, the next time a source of your choice would deal damage to you this turn, prevent that damage. -PCY C - -Rhystic Deluge -{2}{U} -Enchantment -{U}: Tap target creature unless its controller pays {1}. -PCY C - -Rhystic Lightning -{2}{R} -Instant -Rhystic Lightning deals 4 damage to target creature or player unless that creature's controller or that player pays {2}. If he or she does, Rhystic Lightning deals 2 damage to the creature or player. -PCY C - -Rhystic Scrying -{2}{U}{U} -Sorcery -Draw three cards. Then, if any player pays {2}, discard three cards. -PCY U - -Rhystic Shield -{1}{W} -Instant -Creatures you control get +0/+1 until end of turn. They get an additional +0/+2 until end of turn unless any player pays {2}. -PCY C - -Rhystic Study -{2}{U} -Enchantment -Whenever an opponent casts a spell, you may draw a card unless that player pays {1}. -PCY C - -Rhystic Syphon -{3}{B}{B} -Sorcery -Unless target player pays {3}, he or she loses 5 life and you gain 5 life. -PCY U - -Rhystic Tutor -{2}{B} -Sorcery -Unless any player pays {2}, search your library for a card, put that card into your hand, then shuffle your library. -PCY R - -Rib Cage Spider -{2}{G} -Creature - Spider -1/4 -Reach (This creature can block creatures with flying.) -PCY C - -Ribbon Snake -{1}{U}{U} -Creature - Snake -2/3 -Flying -{2}: Ribbon Snake loses flying until end of turn. Any player may activate this ability. -PCY C - -Ribbons of Night -{4}{B} -Sorcery -Ribbons of Night deals 4 damage to target creature and you gain 4 life. If {U} was spent to cast Ribbons of Night, draw a card. -RAV U - -Ribbons of the Reikai -{4}{U} -Sorcery - Arcane -Draw a card for each Spirit you control. -BOK C - -Ricochet Trap -{3}{R} -Instant - Trap -If an opponent cast a blue spell this turn, you may pay {R} rather than pay Ricochet Trap's mana cost. -Change the target of target spell with a single target. -WWK U - -Riddle of Lightning -{3}{R}{R} -Instant -Choose target creature or player. Scry 3, then reveal the top card of your library. Riddle of Lightning deals damage equal to that card's converted mana cost to that creature or player. (To scry 3, look at the top three cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) -FUT C - -Riddlekeeper -{2}{U} -Creature - Homunculus -1/4 -Whenever a creature attacks you or a planeswalker you control, that creature's controller puts the top two cards of his or her library into his or her graveyard. -COM R - -Riddlesmith -{1}{U} -Creature - Human Artificer -2/1 -Whenever you cast an artifact spell, you may draw a card. If you do, discard a card. -SOM U - -Ridge Rannet -{5}{R}{R} -Creature - Beast -6/4 -Cycling {2} ({2}, Discard this card: Draw a card.) -ALA C - -Ridged Kusite -{B} -Creature - Horror Spellshaper -1/1 -{1}{B}, {T}, Discard a card: Target creature gets +1/+0 and gains first strike until end of turn. -PLC C - -Ridgeline Rager -{2}{R} -Creature - Beast -1/2 -{R}: Ridgeline Rager gets +1/+0 until end of turn. -PCY C, 8ED C - -Ridgetop Raptor -{3}{R} -Creature - Lizard Beast -2/1 -Double strike (This creature deals both first-strike and regular combat damage.) -LGN U - -Riding Red Hare -{2}{W} -Sorcery -Target creature gets +3/+3 and gains horsemanship until end of turn. (It can't be blocked except by creatures with horsemanship.) -PTK C - -Riding the Dilu Horse -{2}{G} -Sorcery -Target creature gets +2/+2 and gains horsemanship. (It can't be blocked except by creatures with horsemanship. This effect lasts indefinitely.) -PTK R, ME3 U - -Rift Bolt -{2}{R} -Sorcery -Rift Bolt deals 3 damage to target creature or player. -Suspend 1-{R} (Rather than cast this card from your hand, you may pay {R} and exile it with a time counter on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) -TSP C - -Rift Elemental -{R} -Creature - Elemental -1/1 -{1}{R}, Remove a time counter from a permanent you control or suspended card you own: Rift Elemental gets +2/+0 until end of turn. -FUT C - -Riftmarked Knight -{1}{W}{W} -Creature - Human Rebel Knight -2/2 -Protection from black; flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -Suspend 3-{1}{W}{W} (Rather than cast this card from your hand, you may pay {1}{W}{W} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -When the last time counter is removed from Riftmarked Knight while it's exiled, put a 2/2 black Knight creature token with flanking, protection from white, and haste onto the battlefield. -PLC U - -Riftstone Portal -Land -{T}: Add {1} to your mana pool. -As long as Riftstone Portal is in your graveyard, lands you control have "{T}: Add {G} or {W} to your mana pool." -JUD U - -Riftsweeper -{1}{G} -Creature - Elf Shaman -2/2 -When Riftsweeper enters the battlefield, choose target face-up exiled card. Its owner shuffles it into his or her library. -FUT U - -Riftwing Cloudskate -{3}{U}{U} -Creature - Illusion -2/2 -Flying -When Riftwing Cloudskate enters the battlefield, return target permanent to its owner's hand. -Suspend 3-{1}{U} (Rather than cast this card from your hand, you may pay {1}{U} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -TSP U, JVC U - -Righteous Aura -{1}{W} -Enchantment -{W}, Pay 2 life: The next time a source of your choice would deal damage to you this turn, prevent that damage. -VIS C, MMQ U - -Righteous Avengers -{4}{W} -Creature - Human Soldier -3/1 -Plainswalk -LEG U, MED C - -Righteous Cause -{3}{W}{W} -Enchantment -Whenever a creature attacks, you gain 1 life. -ONS U, DVD U, COM U - -Righteous Charge -{1}{W}{W} -Sorcery -Creatures you control get +2/+2 until end of turn. -P02 C, S99 U, ME4 C - -Righteous Fury -{4}{W}{W} -Sorcery -Destroy all tapped creatures. You gain 2 life for each creature destroyed this way. -P02 R, S99 R, ME2 R - -Righteous Indignation -{2}{W} -Enchantment -Whenever a creature blocks a black or red creature, the blocking creature gets +1/+1 until end of turn. -MMQ U - -Righteous War -{1}{W}{B} -Enchantment -White creatures you control have protection from black. -Black creatures you control have protection from white. -VIS R - -Righteousness -{W} -Instant -Target blocking creature gets +7/+7 until end of turn. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, 9ED R, 10E R, M10 U - -Riku of Two Reflections -{2}{U}{R}{G} -Legendary Creature - Human Wizard -2/2 -Whenever you cast an instant or sorcery spell, you may pay {U}{R}. If you do, copy that spell. You may choose new targets for the copy. -Whenever another nontoken creature enters the battlefield under your control, you may pay {G}{U}. If you do, put a token that's a copy of that creature onto the battlefield. -COM M - -Rime Dryad -{G} -Creature - Dryad -1/2 -Snow forestwalk -ICE C - -Rime Transfusion -{1}{B} -Snow Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+1 and has "{S}: This creature can't be blocked this turn except by snow creatures." ({S} can be paid with one mana from a snow permanent.) -CSP U - -Rimebound Dead -{B} -Snow Creature - Skeleton -1/1 -{S}: Regenerate Rimebound Dead. ({S} can be paid with one mana from a snow permanent.) -CSP C - -Rimefeather Owl -{5}{U}{U} -Snow Creature - Bird -*/* -Flying -Rimefeather Owl's power and toughness are each equal to the number of snow permanents on the battlefield. -{1}{S}: Put an ice counter on target permanent. -Permanents with ice counters on them are snow. -CSP R - -Rimehorn Aurochs -{4}{G} -Snow Creature - Aurochs -3/3 -Trample -Whenever Rimehorn Aurochs attacks, it gets +1/+0 until end of turn for each other attacking Aurochs. -{2}{S}: Target creature blocks target creature this turn if able. ({S} can be paid with one mana from a snow permanent.) -CSP U - -Rimescale Dragon -{5}{R}{R} -Snow Creature - Dragon -5/5 -Flying -{2}{S}: Tap target creature and put an ice counter on it. ({S} can be paid with one mana from a snow permanent.) -Creatures with ice counters on them don't untap during their controllers' untap steps. -CSP R - -Rimewind Cryomancer -{3}{U} -Creature - Human Wizard -2/3 -{1}, {T}: Counter target activated ability. Activate this ability only if you control four or more snow permanents. (Mana abilities can't be targeted.) -CSP U - -Rimewind Taskmage -{1}{U} -Creature - Human Wizard -1/2 -{1}, {T}: You may tap or untap target permanent. Activate this ability only if you control four or more snow permanents. -CSP C - -Ring of Gix -{3} -Artifact -Echo {3} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -{1}, {T}: Tap target artifact, creature, or land. -ULG R - -Ring of Immortals -{5} -Artifact -{3}, {T}: Counter target instant or Aura spell that targets a permanent you control. -LEG R - -Ring of Ma'ruf -{5} -Artifact -{5}, {T}, Exile Ring of Ma'ruf: The next time you would draw a card this turn, instead choose a card you own from outside the game and put it into your hand. -ARN R, MED R - -Ring of Renewal -{5} -Artifact -{5}, {T}: Discard a card at random, then draw two cards. -FEM R, ME4 R - -Rings of Brighthearth -{3} -Artifact -Whenever you activate an ability, if it isn't a mana ability, you may pay {2}. If you do, copy that ability. You may choose new targets for the copy. -LRW R - -Ringskipper -{1}{U} -Creature - Faerie Wizard -1/1 -Flying -When Ringskipper dies, clash with an opponent. If you win, return Ringskipper to its owner's hand. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -LRW C - -Riot Spikes -{B/R} -Enchantment - Aura -({B/R} can be paid with either {B} or {R}.) -Enchant creature -Enchanted creature gets +2/-1. -DIS C - -Rip-Clan Crasher -{R}{G} -Creature - Human Warrior -2/2 -Haste -ALA C - -Riptide -{U} -Instant -Tap all blue creatures. -DRK C - -Riptide Biologist -{1}{U} -Creature - Human Wizard -1/2 -Protection from Beasts -Morph {2}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS C - -Riptide Chronologist -{3}{U}{U} -Creature - Human Wizard -1/3 -{U}, Sacrifice Riptide Chronologist: Untap all creatures of the creature type of your choice. -ONS U - -Riptide Crab -{1}{W}{U} -Creature - Crab -1/3 -Vigilance -When Riptide Crab dies, draw a card. -INV U - -Riptide Director -{2}{U}{U} -Creature - Human Wizard -2/3 -{2}{U}{U}, {T}: Draw a card for each Wizard you control. -LGN R - -Riptide Entrancer -{1}{U}{U} -Creature - Human Wizard -1/1 -Whenever Riptide Entrancer deals combat damage to a player, you may sacrifice it. If you do, gain control of target creature that player controls. (This effect lasts indefinitely.) -Morph {U}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS R - -Riptide Laboratory -Land -{T}: Add {1} to your mana pool. -{1}{U}, {T}: Return target Wizard you control to its owner's hand. -ONS R - -Riptide Mangler -{1}{U} -Creature - Beast -0/3 -{1}{U}: Change Riptide Mangler's power to target creature's power. (This effect lasts indefinitely.) -LGN R - -Riptide Pilferer -{1}{U} -Creature - Merfolk Rogue -1/1 -Whenever Riptide Pilferer deals combat damage to a player, that player discards a card. -Morph {U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -PLC U - -Riptide Replicator -{X}{4} -Artifact -As Riptide Replicator enters the battlefield, choose a color and a creature type. -Riptide Replicator enters the battlefield with X charge counters on it. -{4}, {T}: Put an X/X creature token of the chosen color and type onto the battlefield, where X is the number of charge counters on Riptide Replicator. -ONS R - -Riptide Shapeshifter -{3}{U}{U} -Creature - Shapeshifter -3/3 -{2}{U}{U}, Sacrifice Riptide Shapeshifter: Choose a creature type. Reveal cards from the top of your library until you reveal a creature card of that type. Put that card onto the battlefield and shuffle the rest into your library. -ONS U - -Riptide Survivor -{2}{U} -Creature - Human Wizard -2/1 -Morph {1}{U}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Riptide Survivor is turned face up, discard two cards, then draw three cards. -SCG U - -Rise -{U}{B} -Sorcery -Return target creature card from a graveyard and target creature on the battlefield to their owners' hands. ----- -Fall -{B}{R} -Sorcery -Target player reveals two cards at random from his or her hand, then discards each nonland card revealed this way. -DIS U - -Rise from the Grave -{4}{B} -Sorcery -Put target creature card from a graveyard onto the battlefield under your control. That creature is a black Zombie in addition to its other colors and types. -M10 U, GVL U, M11 U, COM U - -Rise of the Hobgoblins -{R/W}{R/W} -Enchantment -When Rise of the Hobgoblins enters the battlefield, you may pay {X}. If you do, put X 1/1 red and white Goblin Soldier creature tokens onto the battlefield. -{R/W}: Red creatures and white creatures you control gain first strike until end of turn. -EVE R - -Rishadan Airship -{2}{U} -Creature - Human Pirate -3/1 -Flying -Rishadan Airship can block only creatures with flying. -MMQ C - -Rishadan Brigand -{4}{U} -Creature - Human Pirate -3/2 -Flying -When Rishadan Brigand enters the battlefield, each opponent sacrifices a permanent unless he or she pays {3}. -Rishadan Brigand can block only creatures with flying. -MMQ R - -Rishadan Cutpurse -{2}{U} -Creature - Human Pirate -1/1 -When Rishadan Cutpurse enters the battlefield, each opponent sacrifices a permanent unless he or she pays {1}. -MMQ C - -Rishadan Footpad -{3}{U} -Creature - Human Pirate -2/2 -When Rishadan Footpad enters the battlefield, each opponent sacrifices a permanent unless he or she pays {2}. -MMQ U - -Rishadan Pawnshop -{2} -Artifact -{2}, {T}: Shuffle target nontoken permanent you control into its owner's library. -MMQ R - -Rishadan Port -Land -{T}: Add {1} to your mana pool. -{1}, {T}: Tap target land. -MMQ R - -Rising Waters -{3}{U} -Enchantment -Lands don't untap during their controllers' untap steps. -At the beginning of each player's upkeep, that player untaps a land he or she controls. -NEM R - -Risky Move -{3}{R}{R}{R} -Enchantment -At the beginning of each player's upkeep, that player gains control of Risky Move. -When you gain control of Risky Move from another player, choose a creature you control and an opponent. Flip a coin. If you lose the flip, that opponent gains control of that creature. -ONS R - -Rite of Consumption -{1}{B} -Sorcery -As an additional cost to cast Rite of Consumption, sacrifice a creature. -Rite of Consumption deals damage equal to the sacrificed creature's power to target player. You gain life equal to the damage dealt this way. -SHM C - -Rite of Flame -{R} -Sorcery -Add {R}{R} to your mana pool, then add {R} to your mana pool for each card named Rite of Flame in each graveyard. -CSP C - -Rite of Passage -{2}{G} -Enchantment -Whenever a creature you control is dealt damage, put a +1/+1 counter on it. (The damage is dealt before the counter is put on.) -5DN R - -Rite of Replication -{2}{U}{U} -Sorcery -Kicker {5} (You may pay an additional {5} as you cast this spell.) -Put a token onto the battlefield that's a copy of target creature. If Rite of Replication was kicked, put five of those tokens onto the battlefield instead. -ZEN R - -Rites of Flourishing -{2}{G} -Enchantment -At the beginning of each player's draw step, that player draws an additional card. -Each player may play an additional land on each of his or her turns. -FUT R, M12 R - -Rites of Initiation -{R} -Instant -Discard any number of cards at random. Creatures you control get +1/+0 until end of turn for each card discarded this way. -ODY C - -Rites of Refusal -{1}{U} -Instant -Discard any number of cards. Counter target spell unless its controller pays {3} for each card discarded this way. -ODY C - -Rites of Spring -{1}{G} -Sorcery -Discard any number of cards. Search your library for that many basic land cards, reveal those cards, and put them into your hand. Then shuffle your library. -ODY C - -Rith's Attendant -{5} -Artifact Creature - Golem -3/3 -{1}, Sacrifice Rith's Attendant: Add {R}{G}{W} to your mana pool. -INV U - -Rith's Charm -{R}{G}{W} -Instant -Choose one - Destroy target nonbasic land; or put three 1/1 green Saproling creature tokens onto the battlefield; or prevent all damage a source of your choice would deal this turn. -PLS U, PVC U - -Rith's Grove -Land - Lair -When Rith's Grove enters the battlefield, sacrifice it unless you return a non-Lair land you control to its owner's hand. -{T}: Add {R}, {G}, or {W} to your mana pool. -PLS U - -Rith, the Awakener -{3}{R}{G}{W} -Legendary Creature - Dragon -6/6 -Flying -Whenever Rith, the Awakener deals combat damage to a player, you may pay {2}{G}. If you do, choose a color, then put a 1/1 green Saproling creature token onto the battlefield for each permanent of that color. -INV R, FVD R, PVC R - -Rith, the Awakener Avatar -Vanguard -Hand +0, life +6 -Whenever a creature you control deals combat damage to a player, you may pay {5}. If you do, put a 5/5 red Dragon creature token with flying onto the battlefield. -VG S (x2) - -Ritual of Restoration -{W} -Sorcery -Return target artifact card from your graveyard to your hand. -DST C - -Ritual of Steel -{2}{W} -Enchantment - Aura -Enchant creature -When Ritual of Steel enters the battlefield, draw a card at the beginning of the next turn's upkeep. -Enchanted creature gets +0/+2. -MIR C - -Ritual of Subdual -{4}{G}{G} -Enchantment -Cumulative upkeep {2} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -If a land is tapped for mana, it produces colorless mana instead of any other type. -ICE R, ME2 R - -Ritual of the Machine -{2}{B}{B} -Sorcery -As an additional cost to cast Ritual of the Machine, sacrifice a creature. -Gain control of target nonartifact, nonblack creature. -ALL R, ME2 R - -Rivalry -{2}{R} -Enchantment -At the beginning of each player's upkeep, if that player controls more lands than each other player, Rivalry deals 2 damage to him or her. -ULG R - -Rivals' Duel -{3}{R} -Sorcery -Choose two target creatures that share no creature types. Each of those creatures deals damage equal to its power to the other. -MOR U - -Riven Turnbull -{5}{U}{B} -Legendary Creature - Human Advisor -5/7 -{T}: Add {B} to your mana pool. -LEG U, ME3 U - -River Bear -{3}{G} -Creature - Bear -3/3 -Islandwalk (This creature is unblockable as long as defending player controls an Island.) -P02 U, 9ED U - -River Boa -{1}{G} -Creature - Snake -2/1 -Islandwalk -{G}: Regenerate River Boa. -VIS C, 6ED U, BRB U, ZEN U - -River Delta -Land -River Delta doesn't untap during your untap step if it has a depletion counter on it. -At the beginning of your upkeep, remove a depletion counter from River Delta. -{T}: Add {U} or {B} to your mana pool. Put a depletion counter on River Delta. -ICE R - -River Kaijin -{2}{U} -Creature - Spirit -1/4 -CHK C - -River Kelpie -{3}{U}{U} -Creature - Beast -3/3 -Whenever River Kelpie or another permanent is put onto the battlefield from a graveyard, draw a card. -Whenever a player casts a spell from a graveyard, draw a card. -Persist (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) -SHM R - -River Merfolk -{U}{U} -Creature - Merfolk -2/1 -{U}: River Merfolk gains mountainwalk until end of turn. -FEM R, MED C - -River of Tears -Land -{T}: Add {U} to your mana pool. If you played a land this turn, add {B} to your mana pool instead. -FUT R - -River's Grasp -{3}{U/B} -Sorcery -If {U} was spent to cast River's Grasp, return up to one target creature to its owner's hand. If {B} was spent to cast River's Grasp, target player reveals his or her hand, you choose a nonland card from it, then that player discards that card. (Do both if {U}{B} was spent.) -SHM U - -Riverfall Mimic -{1}{U/R} -Creature - Shapeshifter -2/1 -Whenever you cast a spell that's both blue and red, Riverfall Mimic becomes 3/3 and is unblockable until end of turn. -EVE C - -Rix Maadi, Dungeon Palace -Land -{T}: Add {1} to your mana pool. -{1}{B}{R}, {T}: Each player discards a card. Activate this ability only any time you could cast a sorcery. -DIS U - -Roar of Jukai -{2}{G} -Instant - Arcane -If you control a Forest, each blocked creature gets +2/+2 until end of turn. -Splice onto Arcane-An opponent gains 5 life. (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -BOK C - -Roar of Reclamation -{5}{W}{W} -Sorcery -Each player returns all artifact cards from his or her graveyard to the battlefield. -5DN R - -Roar of the Crowd -{3}{R} -Sorcery -Choose a creature type. Roar of the Crowd deals damage to target creature or player equal to the number of permanents you control of the chosen type. -MOR C - -Roar of the Kha -{1}{W} -Instant -Choose one - Creatures you control get +1/+1 until end of turn; or untap all creatures you control. -Entwine {1}{W} (Choose both if you pay the entwine cost.) -MRD U - -Roar of the Wurm -{6}{G} -Sorcery -Put a 6/6 green Wurm creature token onto the battlefield. -Flashback {3}{G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY U - -Roaring Slagwurm -{5}{G}{G} -Creature - Wurm -6/4 -Whenever Roaring Slagwurm attacks, tap all artifacts. -DST R - -Robber Fly -{2}{R} -Creature - Insect -1/1 -Flying -Whenever Robber Fly becomes blocked, defending player discards all the cards in his or her hand, then draws that many cards. -MMQ U - -Robe of Mirrors -{U} -Enchantment - Aura -Enchant creature (Target a creature as you cast this. This card enters the battlefield attached to that creature.) -Enchanted creature has shroud. (It can't be the target of spells or abilities.) -EXO C, 10E C - -Roc Egg -{2}{W} -Creature - Bird -0/3 -Defender (This creature can't attack.) -When Roc Egg dies, put a 3/3 white Bird creature token with flying onto the battlefield. -M11 U, M12 U - -Roc Hatchling -{R} -Creature - Bird -0/1 -Roc Hatchling enters the battlefield with four shell counters on it. -At the beginning of your upkeep, remove a shell counter from Roc Hatchling. -As long as Roc Hatchling has no shell counters on it, it gets +3/+2 and has flying. -WTH U - -Roc of Kher Ridges -{3}{R} -Creature - Bird -3/3 -Flying -LEA R, LEB R, 2ED R, 3ED R, ME4 U - -Rock Badger -{4}{R} -Creature - Badger Beast -3/3 -Mountainwalk (This creature is unblockable as long as defending player controls a Mountain.) -MMQ U, 10E C - -Rock Basilisk -{4}{R}{G} -Creature - Basilisk -4/5 -Whenever Rock Basilisk blocks or becomes blocked by a non-Wall creature, destroy that creature at end of combat. -MIR R - -Rock Hydra -{X}{R}{R} -Creature - Hydra -0/0 -Rock Hydra enters the battlefield with X +1/+1 counters on it. -For each 1 damage that would be dealt to Rock Hydra, if it has a +1/+1 counter on it, remove a +1/+1 counter from it and prevent that 1 damage. -{R}: Prevent the next 1 damage that would be dealt to Rock Hydra this turn. -{R}{R}{R}: Put a +1/+1 counter on Rock Hydra. Activate this ability only during your upkeep. -LEA R, LEB R, 2ED R, 3ED R, ME4 R - -Rock Jockey -{2}{R} -Creature - Goblin -3/3 -You can't cast Rock Jockey if you've played a land this turn. -You can't play lands if you've cast Rock Jockey this turn. -SCG C - -Rock Slide -{X}{R} -Instant -Rock Slide deals X damage divided as you choose among any number of target attacking or blocking creatures without flying. -VIS C - -Rockcaster Platoon -{5}{W}{W} -Creature - Rhino Soldier -5/7 -{4}{G}: Rockcaster Platoon deals 2 damage to each creature with flying and each player. -ALA U - -Rocket Launcher -{4} -Artifact -{2}: Rocket Launcher deals 1 damage to target creature or player. Destroy Rocket Launcher at the beginning of the next end step. Activate this ability only if you've controlled Rocket Launcher continuously since the beginning of your most recent turn. -ATQ U, 3ED R - -Rockshard Elemental -{5}{R}{R} -Creature - Elemental -4/3 -Double strike (This creature deals both first-strike and regular combat damage.) -Morph {4}{R}{R} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -LGN R - -Rockslide Ambush -{1}{R} -Sorcery -Rockslide Ambush deals damage to target creature equal to the number of Mountains you control. -PTK U, ME4 C - -Rockslide Elemental -{2}{R} -Creature - Elemental -1/1 -First strike -Whenever another creature dies, you may put a +1/+1 counter on Rockslide Elemental. -ALA U, HOP U - -Rocky Tar Pit -Land -Rocky Tar Pit enters the battlefield tapped. -{T}, Sacrifice Rocky Tar Pit: Search your library for a Swamp or Mountain card and put it onto the battlefield. Then shuffle your library. -MIR U - -Rod of Ruin -{4} -Artifact -{3}, {T}: Rod of Ruin deals 1 damage to target creature or player. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, 6ED U, S00 U, 7ED U, 8ED U, 9ED U, 10E U, M10 U - -Rofellos -Vanguard -Hand -2, life +4 -Whenever a creature you control dies, draw a card. -VG S - -Rofellos's Gift -{G} -Sorcery -Reveal any number of green cards in your hand. Return an enchantment card from your graveyard to your hand for each card revealed this way. -UDS C - -Rofellos, Llanowar Emissary -{G}{G} -Legendary Creature - Elf Druid -2/1 -{T}: Add {G} to your mana pool for each Forest you control. -UDS R - -Rogue Elephant -{G} -Creature - Elephant -3/3 -When Rogue Elephant enters the battlefield, sacrifice it unless you sacrifice a Forest. -WTH C - -Rogue Kavu -{1}{R} -Creature - Kavu -1/1 -Whenever Rogue Kavu attacks alone, it gets +2/+0 until end of turn. -INV C, 9ED C - -Rogue Skycaptain -{2}{R} -Creature - Human Rogue Mercenary -3/4 -Flying -At the beginning of your upkeep, put a wage counter on Rogue Skycaptain. You may pay {2} for each wage counter on it. If you don't, remove all wage counters from Rogue Skycaptain and an opponent gains control of it. -ALL R, ME2 R - -Rohgahh of Kher Keep -{2}{B}{B}{R}{R} -Legendary Creature - Kobold -5/5 -At the beginning of your upkeep, you may pay {R}{R}{R}. If you don't, tap Rohgahh of Kher Keep and all creatures named Kobolds of Kher Keep, then an opponent gains control of them. -Creatures you control named Kobolds of Kher Keep get +2/+2. -LEG R, ME3 R - -Roil Elemental -{3}{U}{U}{U} -Creature - Elemental -3/2 -Flying -Landfall - Whenever a land enters the battlefield under your control, you may gain control of target creature for as long as you control Roil Elemental. -ZEN R - -Roiling Horror -{3}{B}{B} -Creature - Horror -*/* -Roiling Horror's power and toughness are each equal to your life total minus the life total of an opponent with the most life. -Suspend X-{X}{B}{B}{B}. X can't be 0. (Rather than cast this card from your hand, you may pay {X}{B}{B}{B} and exile it with X time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -Whenever a time counter is removed from Roiling Horror while it's exiled, target player loses 1 life and you gain 1 life. -PLC R - -Roiling Terrain -{2}{R}{R} -Sorcery -Destroy target land, then Roiling Terrain deals damage to that land's controller equal to the number of land cards in that player's graveyard. -WWK C - -Rolling Earthquake -{X}{R} -Sorcery -Rolling Earthquake deals X damage to each creature without horsemanship and each player. -PTK R, ME3 R - -Rolling Spoil -{2}{G}{G} -Sorcery -Destroy target land. If {B} was spent to cast Rolling Spoil, all creatures get -1/-1 until end of turn. -RAV U - -Rolling Stones -{1}{W} -Enchantment -Wall creatures can attack as though they didn't have defender. -STH R, 7ED R, 8ED R - -Rolling Thunder -{X}{R}{R} -Sorcery -Rolling Thunder deals X damage divided as you choose among any number of target creatures and/or players. -TMP C, BRB C, HOP C - -Ronin Cavekeeper -{5}{R} -Creature - Human Samurai -4/3 -Bushido 2 (When this blocks or becomes blocked, it gets +2/+2 until end of turn.) -SOK C - -Ronin Cliffrider -{3}{R}{R} -Creature - Human Samurai -2/2 -Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -Whenever Ronin Cliffrider attacks, you may have it deal 1 damage to each creature defending player controls. -BOK U - -Ronin Houndmaster -{2}{R} -Creature - Human Samurai -2/2 -Haste -Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -CHK C - -Ronin Warclub -{3} -Artifact - Equipment -Equipped creature gets +2/+1. -Whenever a creature enters the battlefield under your control, attach Ronin Warclub to that creature. -Equip {5} ({5}: Attach to target creature you control. Equip only as a sorcery.) -BOK U - -Ronom Hulk -{4}{G} -Creature - Beast -5/6 -Protection from snow -Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -CSP C - -Ronom Serpent -{5}{U} -Snow Creature - Serpent -5/6 -Ronom Serpent can't attack unless defending player controls a snow land. -When you control no snow lands, sacrifice Ronom Serpent. -CSP C - -Ronom Unicorn -{1}{W} -Creature - Unicorn -2/2 -Sacrifice Ronom Unicorn: Destroy target enchantment. -CSP C - -Roofstalker Wight -{1}{B} -Creature - Zombie -2/1 -{1}{U}: Roofstalker Wight gains flying until end of turn. -RAV C - -Root Cage -{1}{G} -Enchantment -Mercenaries don't untap during their controllers' untap steps. -PCY U - -Root Elemental -{4}{G}{G} -Creature - Elemental -6/5 -Morph {5}{G}{G} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Root Elemental is turned face up, you may put a creature card from your hand onto the battlefield. -SCG R - -Root Greevil -{3}{G} -Creature - Beast -2/3 -{2}{G}, {T}, Sacrifice Root Greevil: Destroy all enchantments of the color of your choice. -PLS C - -Root Maze -{G} -Enchantment -Artifacts and lands enter the battlefield tapped. -TMP R, 10E R - -Root Sliver -{3}{G} -Creature - Sliver -2/2 -Root Sliver can't be countered. -Sliver spells can't be countered by spells or abilities. -LGN U - -Root Spider -{3}{G} -Creature - Spider -2/2 -Whenever Root Spider blocks, it gets +1/+0 and gains first strike until end of turn. -HML U - -Root-Kin Ally -{4}{G}{G} -Creature - Elemental Warrior -3/3 -Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.) -Tap two untapped creatures you control: Root-Kin Ally gets +2/+2 until end of turn. -RAV U - -Rootbound Crag -Land -Rootbound Crag enters the battlefield tapped unless you control a Mountain or a Forest. -{T}: Add {R} or {G} to your mana pool. -M10 R, H09 R, M11 R, M12 R - -Rootbreaker Wurm -{5}{G}{G} -Creature - Wurm -6/6 -Trample (If this creature would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.) -TMP C, 9ED U - -Rootgrapple -{4}{G} -Tribal Instant - Treefolk -Destroy target noncreature permanent. If you control a Treefolk, draw a card. -LRW C - -Rooting Kavu -{2}{G}{G} -Creature - Kavu -4/3 -When Rooting Kavu dies, you may exile it. If you do, shuffle all creature cards from your graveyard into your library. -INV U - -Rootrunner -{2}{G}{G} -Creature - Spirit -3/3 -{G}{G}, Sacrifice Rootrunner: Put target land on top of its owner's library. -Soulshift 3 (When this creature dies, you may return target Spirit card with converted mana cost 3 or less from your graveyard to your hand.) -CHK U - -Roots -{3}{G} -Enchantment - Aura -Enchant creature without flying -When Roots enters the battlefield, tap enchanted creature. -Enchanted creature doesn't untap during its controller's untap step. -HML U, MED C - -Roots of All Evil -Scheme -When you set this scheme in motion, put five 1/1 green Saproling creature tokens onto the battlefield. -ARC C - -Roots of Life -{1}{G}{G} -Enchantment -As Roots of Life enters the battlefield, choose Islands or Swamps. -Whenever a land of the chosen type an opponent controls becomes tapped, you gain 1 life. -MIR U - -Rootwalla -{2}{G} -Creature - Lizard -2/2 -{1}{G}: Rootwalla gets +2/+2 until end of turn. Activate this ability only once each turn. -TMP C, 9ED C, 10E C - -Rootwater Alligator -{3}{G} -Creature - Crocodile -3/2 -Sacrifice a Forest: Regenerate Rootwater Alligator. -EXO C - -Rootwater Commando -{2}{U} -Creature - Merfolk -2/2 -Islandwalk (This creature is unblockable as long as defending player controls an Island.) -NEM C, 10E C - -Rootwater Depths -Land -{T}: Add {1} to your mana pool. -{T}: Add {U} or {B} to your mana pool. Rootwater Depths doesn't untap during your next untap step. -TMP U - -Rootwater Diver -{U} -Creature - Merfolk -1/1 -{T}, Sacrifice Rootwater Diver: Return target artifact card from your graveyard to your hand. -TMP U - -Rootwater Hunter -{2}{U} -Creature - Merfolk -1/1 -{T}: Rootwater Hunter deals 1 damage to target creature or player. -TMP C - -Rootwater Matriarch -{2}{U}{U} -Creature - Merfolk -2/3 -{T}: Gain control of target creature for as long as that creature is enchanted. -TMP R, 10E R - -Rootwater Mystic -{U} -Creature - Merfolk Wizard -1/1 -{1}{U}: Look at the top card of target player's library. -EXO C - -Rootwater Shaman -{2}{U} -Creature - Merfolk Shaman -2/2 -You may cast Aura cards with enchant creature as though they had flash. -TMP R - -Rootwater Thief -{1}{U} -Creature - Merfolk Rogue -1/2 -{U}: Rootwater Thief gains flying until end of turn. -Whenever Rootwater Thief deals combat damage to a player, you may pay {2}. If you do, search that player's library for a card and exile it, then the player shuffles his or her library. -NEM R - -Rorix Bladewing -{3}{R}{R}{R} -Legendary Creature - Dragon -6/5 -Flying, haste -ONS R, HOP R - -Rosheen Meanderer -{3}{R/G} -Legendary Creature - Giant Shaman -4/4 -{T}: Add {4} to your mana pool. Spend this mana only on costs that contain {X}. -SHM R - -Rot Wolf -{2}{G} -Creature - Wolf -2/2 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -Whenever a creature dealt damage by Rot Wolf this turn dies, you may draw a card. -MBS C - -Roterothopter -{1} -Artifact Creature - Thopter -0/2 -Flying -{2}: Roterothopter gets +1/+0 until end of turn. Activate this ability no more than twice each turn. -HML C, ME2 C - -Rotlung Reanimator -{2}{B} -Creature - Zombie Cleric -2/2 -Whenever Rotlung Reanimator or another Cleric dies, put a 2/2 black Zombie creature token onto the battlefield. -ONS R - -Rotted Hystrix -{4}{G} -Creature - Beast -3/6 -NPH C - -Rotted Ones, Lay Siege -Scheme -When you set this scheme in motion, for each opponent, put a 2/2 black Zombie creature token onto the battlefield that attacks that player each combat if able. -ARC C - -Rotting Giant -{1}{B} -Creature - Zombie Giant -3/3 -Whenever Rotting Giant attacks or blocks, sacrifice it unless you exile a card from your graveyard. -ODY U - -Rotting Legion -{4}{B} -Creature - Zombie -4/5 -Rotting Legion enters the battlefield tapped. -M11 C - -Rotting Rats -{1}{B} -Creature - Zombie Rat -1/1 -When Rotting Rats enters the battlefield, each player discards a card. -Unearth {1}{B} ({1}{B}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) -CON C, HOP C - -Rough -{1}{R} -Sorcery -Rough deals 2 damage to each creature without flying. ----- -Tumble -{5}{R} -Sorcery -Tumble deals 6 damage to each creature with flying. -PLC U - -Roughshod Mentor -{5}{G} -Creature - Giant Warrior -5/4 -Green creatures you control have trample. -SHM U - -Rouse -{1}{B} -Instant -If you control a Swamp, you may pay 2 life rather than pay Rouse's mana cost. -Target creature gets +2/+0 until end of turn. -MMQ C - -Rout -{3}{W}{W} -Sorcery -You may cast Rout any time you could cast an instant if you pay {2} more to cast it. -Destroy all creatures. They can't be regenerated. -INV R - -Rowan Treefolk -{3}{G} -Creature - Treefolk -3/4 -POR C - -Rowen -{2}{G}{G} -Enchantment -Reveal the first card you draw each turn. Whenever you reveal a basic land card this way, draw a card. -VIS R, 6ED R, 7ED R - -Royal Assassin -{1}{B}{B} -Creature - Human Assassin -1/1 -{T}: Destroy target tapped creature. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 8ED R, 9ED R, 10E R, M10 R, M11 R, M12 R - -Royal Assassin Avatar -Vanguard -Hand -2, life +0 -At the beginning of your upkeep, you draw a card and you lose 1 life. -VG S (x2) - -Royal Decree -{2}{W}{W} -Enchantment -Cumulative upkeep {W} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -Whenever a Swamp, Mountain, black permanent, or red permanent becomes tapped, Royal Decree deals 1 damage to that permanent's controller. -ALL R, ME2 R - -Royal Falcon -{1}{W} -Creature - Bird -1/1 -Flying -S99 C, S00 C - -Royal Herbalist -{W} -Creature - Human Cleric -1/1 -{2}, Exile the top card of your library: You gain 1 life. -ALL C (x2) - -Royal Trooper -{2}{W} -Creature - Human Soldier -2/2 -Whenever Royal Trooper blocks, it gets +2/+2 until end of turn. -S99 U, ME2 C - -Rubinia Soulsinger -{2}{G}{W}{U} -Legendary Creature - Faerie -2/3 -You may choose not to untap Rubinia Soulsinger during your untap step. -{T}: Gain control of target creature for as long as you control Rubinia and Rubinia remains tapped. -LEG R, CHR R, ME3 R - -Ruby Leech -{1}{R} -Creature - Leech -2/2 -First strike -Red spells you cast cost {R} more to cast. -INV R - -Ruby Medallion -{2} -Artifact -Red spells you cast cost {1} less to cast. -TMP R - -Rude Awakening -{4}{G} -Sorcery -Choose one - Untap all lands you control; or until end of turn, lands you control become 2/2 creatures that are still lands. -Entwine {2}{G} (Choose both if you pay the entwine cost.) -5DN R, GVL R - -Rugged Prairie -Land -{T}: Add {1} to your mana pool. -{R/W}, {T}: Add {R}{R}, {R}{W}, or {W}{W} to your mana pool. -EVE R - -Ruham Djinn -{5}{W} -Creature - Djinn -5/5 -First strike -Ruham Djinn gets -2/-2 as long as white is the most common color among all permanents or is tied for most common. -INV U - -Ruhan of the Fomori -{1}{R}{W}{U} -Legendary Creature - Giant Warrior -7/7 -At the beginning of combat on your turn, choose an opponent at random. Ruhan of the Fomori attacks that player this combat if able. -COM M - -Ruin Ghost -{1}{W} -Creature - Spirit -1/1 -{W}, {T}: Exile target land you control, then return it to the battlefield under your control. -WWK U - -Ruination -{3}{R} -Sorcery -Destroy all nonbasic lands. -STH R, COM R - -Ruinous Minotaur -{1}{R}{R} -Creature - Minotaur Warrior -5/2 -Whenever Ruinous Minotaur deals damage to an opponent, sacrifice a land. -ZEN C - -Ruins of Trokair -Land -Ruins of Trokair enters the battlefield tapped. -{T}: Add {W} to your mana pool. -{T}, Sacrifice Ruins of Trokair: Add {W}{W} to your mana pool. -FEM U, 5ED U, 6ED U, ME2 U - -Rukh Egg -{3}{R} -Creature - Bird -0/3 -When Rukh Egg dies, put a 4/4 red Bird creature token with flying onto the battlefield at the beginning of the next end step. -ARN C (x2), 8ED R, 9ED R - -Rule of Law -{2}{W} -Enchantment -Each player can't cast more than one spell each turn. -MRD R, 10E U - -Rumbling Aftershocks -{4}{R} -Enchantment -Whenever you cast a kicked spell, you may have Rumbling Aftershocks deal damage to target creature or player equal to the number of times that spell was kicked. -WWK U - -Rumbling Crescendo -{3}{R}{R} -Enchantment -At the beginning of your upkeep, you may put a verse counter on Rumbling Crescendo. -{R}, Sacrifice Rumbling Crescendo: Destroy up to X target lands, where X is the number of verse counters on Rumbling Crescendo. -USG R - -Rumbling Slum -{1}{R}{G}{G} -Creature - Elemental -5/5 -At the beginning of your upkeep, Rumbling Slum deals 1 damage to each player. -GPT R, HOP R - -Rumbling Slum Avatar -Vanguard -Hand +1, life +1 -At the beginning of your upkeep, Rumbling Slum Avatar deals 1 damage to each opponent. -VG S - -Rummaging Wizard -{3}{U} -Creature - Human Wizard -2/2 -{2}{U}: Look at the top card of your library. You may put that card into your graveyard. -ONS U - -Run Wild -{G} -Instant -Until end of turn, target creature gains trample and "{G}: Regenerate this creature." -ONS U - -Rune Snag -{1}{U} -Instant -Counter target spell unless its controller pays {2} plus an additional {2} for each card named Rune Snag in each graveyard. -CSP C - -Rune of Protection: Artifacts -{1}{W} -Enchantment -{W}: The next time an artifact source of your choice would deal damage to you this turn, prevent that damage. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG U - -Rune of Protection: Black -{1}{W} -Enchantment -{W}: The next time a black source of your choice would deal damage to you this turn, prevent that damage. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG C - -Rune of Protection: Blue -{1}{W} -Enchantment -{W}: The next time a blue source of your choice would deal damage to you this turn, prevent that damage. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG C - -Rune of Protection: Green -{1}{W} -Enchantment -{W}: The next time a green source of your choice would deal damage to you this turn, prevent that damage. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG C - -Rune of Protection: Lands -{1}{W} -Enchantment -{W}: The next time a land source of your choice would deal damage to you this turn, prevent that damage. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG R - -Rune of Protection: Red -{1}{W} -Enchantment -{W}: The next time a red source of your choice would deal damage to you this turn, prevent that damage. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG C - -Rune of Protection: White -{1}{W} -Enchantment -{W}: The next time a white source of your choice would deal damage to you this turn, prevent that damage. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG C - -Rune-Cervin Rider -{3}{W} -Creature - Elf Knight -2/2 -Flying -{G/W}{G/W}: Rune-Cervin Rider gets +1/+1 until end of turn. -SHM C - -Rune-Scarred Demon -{5}{B}{B} -Creature - Demon -6/6 -Flying -When Rune-Scarred Demon enters the battlefield, search your library for a card, put it into your hand, then shuffle your library. -M12 R - -Rune-Tail, Kitsune Ascendant -{2}{W} -Legendary Creature - Fox Monk -2/2 -When you have 30 or more life, flip Rune-Tail, Kitsune Ascendant. ----- -Rune-Tail's Essence -Legendary Enchantment -Prevent all damage that would be dealt to creatures you control. -SOK R - -Runeboggle -{2}{U} -Instant -Counter target spell unless its controller pays {1}. -Draw a card. -GPT C - -Runeclaw Bear -{1}{G} -Creature - Bear -2/2 -M10 C, M11 C, M12 C - -Runed Arch -{3} -Artifact -Runed Arch enters the battlefield tapped. -{X}, {T}, Sacrifice Runed Arch: X target creatures with power 2 or less are unblockable this turn. -ICE R - -Runed Halo -{W}{W} -Enchantment -As Runed Halo enters the battlefield, name a card. -You have protection from the chosen name. (You can't be targeted, dealt damage, or enchanted by anything with that name.) -SHM R - -Runed Servitor -{2} -Artifact Creature - Construct -2/2 -When Runed Servitor dies, each player draws a card. -ROE U, EVT U - -Runed Stalactite -{1} -Artifact - Equipment -Equipped creature gets +1/+1 and is every creature type. -Equip {2} -LRW C - -Runeflare Trap -{4}{R}{R} -Instant - Trap -If an opponent drew three or more cards this turn, you may pay {R} rather than pay Runeflare Trap's mana cost. -Runeflare Trap deals damage to target player equal to the number of cards in that player's hand. -ZEN U - -Runes of the Deus -{4}{R/G} -Enchantment - Aura -Enchant creature -As long as enchanted creature is red, it gets +1/+1 and has double strike. (It deals both first-strike and regular combat damage.) -As long as enchanted creature is green, it gets +1/+1 and has trample. -SHM C - -Runesword -{6} -Artifact -{3}, {T}: Target attacking creature gets +2/+0 until end of turn. When that creature leaves the battlefield this turn, sacrifice Runesword. If the creature deals damage to a creature this turn, the creature dealt damage can't be regenerated this turn. If a creature dealt damage by the targeted creature would die this turn, exile that creature instead. -DRK U, CHR C - -Rupture -{2}{R} -Sorcery -Sacrifice a creature. Rupture deals damage equal to that creature's power to each creature without flying and each player. -NEM U - -Rupture Spire -Land -Rupture Spire enters the battlefield tapped. -When Rupture Spire enters the battlefield, sacrifice it unless you pay {1}. -{T}: Add one mana of any color to your mana pool. -CON C, H09 C, COM C - -Rush of Knowledge -{4}{U} -Sorcery -Draw cards equal to the highest converted mana cost among permanents you control. -SCG C - -Rushing River -{2}{U} -Instant -Kicker-Sacrifice a land. (You may sacrifice a land in addition to any other costs as you cast this spell.) -Return target nonland permanent to its owner's hand. If Rushing River was kicked, return another target nonland permanent to its owner's hand. -PLS C - -Rushing-Tide Zubera -{2}{U}{U} -Creature - Zubera Spirit -3/3 -When Rushing-Tide Zubera dies, if 4 or more damage was dealt to it this turn, draw three cards. -SOK U - -Rushwood Dryad -{1}{G} -Creature - Dryad -2/1 -Forestwalk (This creature is unblockable as long as defending player controls a Forest.) -MMQ C, 8ED C, 10E C - -Rushwood Elemental -{G}{G}{G}{G}{G} -Creature - Elemental -4/4 -Trample -At the beginning of your upkeep, you may put a +1/+1 counter on Rushwood Elemental. -MMQ R - -Rushwood Grove -Land -Rushwood Grove enters the battlefield tapped. -{T}: Put a storage counter on Rushwood Grove. -{T}, Remove any number of storage counters from Rushwood Grove: Add {G} to your mana pool for each storage counter removed this way. -MMQ U - -Rushwood Herbalist -{2}{G} -Creature - Human Spellshaper -2/2 -{G}, {T}, Discard a card: Regenerate target creature. -MMQ C - -Rushwood Legate -{2}{G} -Creature - Dryad -2/1 -If an opponent controls an Island and you control a Forest, you may cast Rushwood Legate without paying its mana cost. -MMQ U - -Rust -{G} -Instant -Counter target activated ability from an artifact source. (Mana abilities can't be targeted.) -LEG C - -Rust Elemental -{4} -Artifact Creature - Elemental -4/4 -Flying -At the beginning of your upkeep, sacrifice an artifact other than Rust Elemental. If you can't, tap Rust Elemental and you lose 4 life. -MRD U - -Rust Tick -{3} -Artifact Creature - Insect -1/3 -You may choose not to untap Rust Tick during your untap step. -{1}, {T}: Tap target artifact. It doesn't untap during its controller's untap step for as long as Rust Tick remains tapped. -SOM U - -Rusted Relic -{4} -Artifact -Metalcraft - Rusted Relic is a 5/5 Golem artifact creature as long as you control three or more artifacts. -SOM U - -Rusted Sentinel -{4} -Artifact Creature - Golem -3/4 -Rusted Sentinel enters the battlefield tapped. -M12 U - -Rusted Slasher -{4} -Artifact Creature - Horror -4/1 -Sacrifice an artifact: Regenerate Rusted Slasher. -MBS C - -Rustic Clachan -Land -As Rustic Clachan enters the battlefield, you may reveal a Kithkin card from your hand. If you don't, Rustic Clachan enters the battlefield tapped. -{T}: Add {W} to your mana pool. -Reinforce 1-{1}{W} ({1}{W}, Discard this card: Put a +1/+1 counter on target creature.) -MOR R, EVT R - -Rusting Golem -{4} -Artifact Creature - Golem -*/* -Fading 5 (This creature enters the battlefield with five fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.) -Rusting Golem's power and toughness are each equal to the number of fade counters on it. -NEM U - -Rustmouth Ogre -{4}{R}{R} -Creature - Ogre -5/4 -Whenever Rustmouth Ogre deals combat damage to a player, you may destroy target artifact that player controls. -MRD U - -Rustrazor Butcher -{1}{R} -Creature - Goblin Warrior -1/2 -First strike -Wither (This deals damage to creatures in the form of -1/-1 counters.) -SHM C - -Rustspore Ram -{4} -Artifact Creature - Sheep -1/3 -When Rustspore Ram enters the battlefield, destroy target Equipment. -MRD U - -Ruthless Cullblade -{1}{B} -Creature - Vampire Warrior -2/1 -Ruthless Cullblade gets +2/+1 as long as an opponent has 10 or less life. -WWK C - -Ruthless Invasion -{3}{R/P} -Sorcery -({R/P} can be paid with either {R} or 2 life.) -Nonartifact creatures can't block this turn. -NPH C - -Rysorian Badger -{2}{G} -Creature - Badger -2/2 -Whenever Rysorian Badger attacks and isn't blocked, you may exile up to two target creature cards from defending player's graveyard. If you do, you gain 1 life for each card exiled this way and Rysorian Badger assigns no combat damage this turn. -HML R - -Ryusei, the Falling Star -{5}{R} -Legendary Creature - Dragon Spirit -5/5 -Flying -When Ryusei, the Falling Star dies, it deals 5 damage to each creature without flying. -PRO R, CHK R, ARC R - -Saber Ants -{3}{G} -Creature - Insect -2/3 -Whenever Saber Ants is dealt damage, you may put that many 1/1 green Insect creature tokens onto the battlefield. -MMQ U - -Saberclaw Golem -{5} -Artifact Creature - Golem -4/2 -{R}: Saberclaw Golem gains first strike until end of turn. -SOM C - -Sabertooth Alley Cat -{1}{R}{R} -Creature - Cat -2/1 -Sabertooth Alley Cat attacks each turn if able. -{1}{R}: Creatures without defender can't block Sabertooth Alley Cat this turn. -RAV C - -Sabertooth Cobra -{2}{G} -Creature - Snake -2/2 -Whenever Sabertooth Cobra deals damage to a player, he or she gets a poison counter. That player gets another poison counter at the beginning of his or her next upkeep unless he or she pays {2} before that turn. (A player with ten or more poison counters loses the game.) -MIR C - -Sabertooth Nishoba -{4}{G}{W} -Creature - Cat Beast Warrior -5/5 -Trample, protection from blue and from red -INV R - -Sabertooth Wyvern -{4}{R} -Creature - Drake -3/2 -Flying, first strike -EXO U - -Sabretooth Tiger -{2}{R} -Creature - Cat -2/1 -First strike -ICE C, 5ED C, 6ED C, 7ED C, 8ED C - -Sacellum Archers -{2}{G} -Creature - Elf Archer -2/3 -{R}{W}, {T}: Sacellum Archers deals 2 damage to target attacking or blocking creature. -CON U - -Sacellum Godspeaker -{2}{G} -Creature - Elf Druid -2/2 -{T}: Reveal any number of creature cards with power 5 or greater from your hand. Add {G} to your mana pool for each card revealed this way. -ALA R - -Sachi, Daughter of Seshiro -{2}{G}{G} -Legendary Creature - Snake Shaman -1/3 -Other Snake creatures you control get +0/+1. -Shamans you control have "{T}: Add {G}{G} to your mana pool." -CHK U - -Sacred Boon -{1}{W} -Instant -Prevent the next 3 damage that would be dealt to target creature this turn. At the beginning of the next end step, put a +0/+1 counter on that creature for each 1 damage prevented this way. -ICE U, 5ED U, ME2 U - -Sacred Foundry -Land - Mountain Plains -({T}: Add {R} or {W} to your mana pool.) -As Sacred Foundry enters the battlefield, you may pay 2 life. If you don't, Sacred Foundry enters the battlefield tapped. -RAV R - -Sacred Ground -{1}{W} -Enchantment -Whenever a spell or ability an opponent controls causes a land to be put into your graveyard from the battlefield, return that card to the battlefield. -STH R, 7ED R, 8ED R, 9ED R - -Sacred Guide -{W} -Creature - Human Cleric -1/1 -{1}{W}, Sacrifice Sacred Guide: Reveal cards from the top of your library until you reveal a white card. Put that card into your hand and exile all other cards revealed this way. -TMP R - -Sacred Knight -{3}{W} -Creature - Human Knight -3/2 -Sacred Knight can't be blocked by black and/or red creatures. -POR C - -Sacred Mesa -{2}{W} -Enchantment -At the beginning of your upkeep, sacrifice Sacred Mesa unless you sacrifice a Pegasus. -{1}{W}: Put a 1/1 white Pegasus creature token with flying onto the battlefield. -MIR R, TSB S - -Sacred Nectar -{1}{W} -Sorcery -You gain 4 life. -POR C, S99 C, 7ED C, 8ED C, 9ED C - -Sacred Prey -{G} -Creature - Horse -1/1 -Whenever Sacred Prey becomes blocked, you gain 1 life. -MMQ C - -Sacred Rites -{W} -Instant -Discard any number of cards. Creatures you control get +0/+1 until end of turn for each card discarded this way. -ODY C - -Sacred Wolf -{2}{G} -Creature - Wolf -3/1 -Hexproof (This creature can't be the target of spells or abilities your opponents control.) -M11 C, M12 C - -Sacrifice -{B} -Instant -As an additional cost to cast Sacrifice, sacrifice a creature. -Add to your mana pool an amount of {B} equal to the sacrificed creature's converted mana cost. -LEA U, LEB U, 2ED U, 3ED U - -Sadistic Augermage -{2}{B} -Creature - Human Wizard -3/1 -When Sadistic Augermage dies, each player puts a card from his or her hand on top of his or her library. -RAV C - -Sadistic Glee -{B} -Enchantment - Aura -Enchant creature -Whenever a creature dies, put a +1/+1 counter on enchanted creature. -TMP C, BRB C - -Sadistic Hypnotist -{3}{B}{B} -Creature - Human Minion -2/2 -Sacrifice a creature: Target player discards two cards. Activate this ability only any time you could cast a sorcery. -ODY U - -Sadistic Sacrament -{B}{B}{B} -Sorcery -Kicker {7} (You may pay an additional {7} as you cast this spell.) -Search target player's library for up to three cards, exile them, then that player shuffles his or her library. If Sadistic Sacrament was kicked, instead search that player's library for up to fifteen cards, exile them, then that player shuffles his or her library. -ZEN R - -Safe Haven -Land -{2}, {T}: Exile target creature you control. -At the beginning of your upkeep, you may sacrifice Safe Haven. If you do, return each card exiled with Safe Haven to the battlefield under its owner's control. -DRK R, CHR R, TSB S - -Safe Passage -{2}{W} -Instant -Prevent all damage that would be dealt to you and creatures you control this turn. -M10 C, M11 C - -Safeguard -{3}{W}{W} -Enchantment -{2}{W}: Prevent all combat damage that would be dealt by target creature this turn. -TMP R - -Safehold Duo -{3}{G/W} -Creature - Elf Warrior Shaman -2/4 -Whenever you cast a green spell, Safehold Duo gets +1/+1 until end of turn. -Whenever you cast a white spell, Safehold Duo gains vigilance until end of turn. -SHM C - -Safehold Elite -{1}{G/W} -Creature - Elf Scout -2/2 -Persist (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) -SHM C - -Safehold Sentry -{1}{W} -Creature - Elf Warrior -2/2 -{2}{W}, {Q}: Safehold Sentry gets +0/+2 until end of turn. ({Q} is the untap symbol.) -SHM C - -Safewright Quest -{G/W} -Sorcery -Search your library for a Forest or Plains card, reveal it, and put it into your hand. Then shuffle your library. -SHM C - -Saffi Eriksdotter -{G}{W} -Legendary Creature - Human Scout -2/2 -Sacrifice Saffi Eriksdotter: When target creature is put into your graveyard from the battlefield this turn, return that card to the battlefield. -TSP R - -Sage Aven -{3}{U} -Creature - Bird Wizard -1/3 -Flying (This creature can't be blocked except by creatures with flying or reach.) -When Sage Aven enters the battlefield, look at the top four cards of your library, then put them back in any order. -ONS C, 9ED C - -Sage Owl -{1}{U} -Creature - Bird -1/1 -Flying -When Sage Owl enters the battlefield, look at the top four cards of your library, then put them back in any order. -WTH C, 6ED C, 7ED C, 8ED C, 10E C, M10 C - -Sage of Epityr -{U} -Creature - Human Wizard -1/1 -When Sage of Epityr enters the battlefield, look at the top four cards of your library, then put them back in any order. -TSP C - -Sage of Fables -{2}{U} -Creature - Merfolk Wizard -2/2 -Each other Wizard creature you control enters the battlefield with an additional +1/+1 counter on it. -{2}, Remove a +1/+1 counter from a creature you control: Draw a card. -MOR U - -Sage of Lat-Nam -{1}{U} -Creature - Human Artificer -1/2 -{T}, Sacrifice an artifact: Draw a card. -ATQ C, 8ED R - -Sage's Dousing -{2}{U} -Tribal Instant - Wizard -Counter target spell unless its controller pays {3}. If you control a Wizard, draw a card. -MOR U - -Sage's Knowledge -{2}{U} -Sorcery -Return target sorcery card from your graveyard to your hand. -PTK C - -Sages of the Anima -{3}{G}{U} -Creature - Elf Wizard -3/4 -If you would draw a card, instead reveal the top three cards of your library. Put all creature cards revealed this way into your hand and the rest on the bottom of your library in any order. -ARB R - -Sailmonger -{3}{U} -Creature - Human Monger -3/3 -{2}: Target creature gains flying until end of turn. Any player may activate this ability. -MMQ U - -Saji's Torrent -{1}{U} -Instant -Choose a number from 0 to 5 at random, then choose that many creatures and tap them. -SDC S - -Sakashima the Impostor -{2}{U}{U} -Legendary Creature - Human Rogue -3/1 -You may have Sakashima the Impostor enter the battlefield as a copy of any creature on the battlefield, except its name is still Sakashima the Impostor, it's legendary in addition to its other types, and it gains "{2}{U}{U}: Return Sakashima the Impostor to its owner's hand at the beginning of the next end step." -SOK R - -Sakashima the Impostor Avatar -Vanguard -Hand +0, life +1 -{2}: Choose a creature you control. It becomes a copy of target creature except for its name. -VG S - -Sakiko, Mother of Summer -{4}{G}{G} -Legendary Creature - Snake Shaman -3/3 -Whenever a creature you control deals combat damage to a player, add that much {G} to your mana pool. Until end of turn, this mana doesn't empty from your mana pool as steps and phases end. -BOK R - -Sakura-Tribe Elder -{1}{G} -Creature - Snake Shaman -1/1 -Sacrifice Sakura-Tribe Elder: Search your library for a basic land card, put that card onto the battlefield tapped, then shuffle your library. -CHK C, ARC C, COM C - -Sakura-Tribe Scout -{G} -Creature - Snake Shaman Scout -1/1 -{T}: You may put a land card from your hand onto the battlefield. -SOK C - -Sakura-Tribe Springcaller -{3}{G} -Creature - Snake Shaman -2/4 -At the beginning of your upkeep, add {G} to your mana pool. Until end of turn, this mana doesn't empty from your mana pool as steps and phases end. -BOK C - -Salt Flats -Land -Salt Flats enters the battlefield tapped. -{T}: Add {1} to your mana pool. -{T}: Add {W} or {B} to your mana pool. Salt Flats deals 1 damage to you. -TMP R - -Salt Marsh -Land -Salt Marsh enters the battlefield tapped. -{T}: Add {U} or {B} to your mana pool. -INV U, 8ED U - -Saltblast -{3}{W}{W} -Sorcery -Destroy target nonwhite permanent. -PLC U, EVT U - -Saltcrusted Steppe -Land -{T}: Add {1} to your mana pool. -{1}, {T}: Put a storage counter on Saltcrusted Steppe. -{1}, Remove X storage counters from Saltcrusted Steppe: Add X mana in any combination of {G} and/or {W} to your mana pool. -TSP U - -Saltfield Recluse -{2}{W} -Creature - Human Rebel Cleric -1/2 -{T}: Target creature gets -2/-0 until end of turn. -PLC C - -Saltskitter -{3}{W} -Creature - Wurm -3/4 -Whenever another creature enters the battlefield, exile Saltskitter. Return Saltskitter to the battlefield under its owner's control at the beginning of the next end step. -FUT C - -Salvage -{G} -Sorcery -Put target card from your graveyard on top of your library. -P02 C - -Salvage Scout -{W} -Creature - Human Scout -1/1 -{W}, Sacrifice Salvage Scout: Return target artifact card from your graveyard to your hand. -SOM C - -Salvage Slasher -{1}{B} -Artifact Creature - Human Rogue -1/1 -Salvage Slasher gets +1/+0 for each artifact card in your graveyard. -CON C - -Salvage Titan -{4}{B}{B} -Artifact Creature - Golem -6/4 -You may sacrifice three artifacts rather than pay Salvage Titan's mana cost. -Exile three artifact cards from your graveyard: Return Salvage Titan from your graveyard to your hand. -ALA R - -Salvaging Station -{6} -Artifact -{T}: Return target noncreature artifact card with converted mana cost 1 or less from your graveyard to the battlefield. -Whenever a creature dies, you may untap Salvaging Station. -5DN R - -Samite Alchemist -{3}{W} -Creature - Human Cleric -0/2 -{W}{W}, {T}: Prevent the next 4 damage that would be dealt this turn to target creature you control. Tap that creature. It doesn't untap during your next untap step. -HML C (x2) - -Samite Archer -{1}{W}{U} -Creature - Human Cleric Archer -1/1 -{T}: Prevent the next 1 damage that would be dealt to target creature or player this turn. -{T}: Samite Archer deals 1 damage to target creature or player. -INV U - -Samite Blessing -{W} -Enchantment - Aura -Enchant creature -Enchanted creature has "{T}: The next time a source of your choice would deal damage to target creature this turn, prevent that damage." -STH C - -Samite Censer-Bearer -{W} -Creature - Human Rebel Cleric -1/1 -{W}, Sacrifice Samite Censer-Bearer: Prevent the next 1 damage that would be dealt to each creature you control this turn. -FUT C - -Samite Elder -{2}{W} -Creature - Human Cleric -1/2 -{T}: Creatures you control gain protection from the colors of target permanent you control until end of turn. -PLS R - -Samite Healer -{1}{W} -Creature - Human Cleric -1/1 -{T}: Prevent the next 1 damage that would be dealt to target creature or player this turn. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, 6ED C, S00 C, 7ED C, 8ED C, 9ED C, 10E C - -Samite Ministration -{1}{W} -Instant -Prevent all damage that would be dealt to you this turn by a source of your choice. Whenever damage from a black or red source is prevented this way this turn, you gain that much life. -INV U - -Samite Pilgrim -{1}{W} -Creature - Human Cleric -1/1 -Domain - {T}: Prevent the next X damage that would be dealt to target creature this turn, where X is the number of basic land types among lands you control. -PLS C - -Samite Sanctuary -{2}{W} -Enchantment -{2}: Prevent the next 1 damage that would be dealt to target creature this turn. Any player may activate this ability. -PCY R - -Samurai Enforcers -{4}{W}{W} -Creature - Human Samurai -4/4 -Bushido 2 (When this blocks or becomes blocked, it gets +2/+2 until end of turn.) -CHK U - -Samurai of the Pale Curtain -{W}{W} -Creature - Fox Samurai -2/2 -Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -If a permanent would be put into a graveyard, exile it instead. -CHK U - -Sanctimony -{1}{W} -Enchantment -Whenever an opponent taps a Mountain for mana, you may gain 1 life. -UDS U, 7ED U, 8ED U - -Sanctum Custodian -{2}{W} -Creature - Human Cleric -1/2 -{T}: Prevent the next 2 damage that would be dealt to target creature or player this turn. -USG C, BRB C - -Sanctum Gargoyle -{3}{W} -Artifact Creature - Gargoyle -2/3 -Flying -When Sanctum Gargoyle enters the battlefield, you may return target artifact card from your graveyard to your hand. -ALA C, ARC C - -Sanctum Guardian -{1}{W}{W} -Creature - Human Cleric -1/4 -Sacrifice Sanctum Guardian: The next time a source of your choice would deal damage to target creature or player this turn, prevent that damage. -USG U, BRB U, 9ED U - -Sanctum Plowbeast -{4}{W}{U} -Artifact Creature - Beast -3/6 -Defender -Plainscycling {2}, islandcycling {2} ({2}, Discard this card: Search your library for a Plains or Island card, reveal it, and put it into your hand. Then shuffle your library.) -ARB C - -Sanctum of Serra -Plane - Serra's Realm -When you planeswalk away from Sanctum of Serra, destroy all nonland permanents. -Whenever you roll {C}, you may have your life total become 20. -HOP C - -Sand Golem -{5} -Artifact Creature - Golem -3/3 -When a spell or ability an opponent controls causes you to discard Sand Golem, return Sand Golem from your graveyard to the battlefield with a +1/+1 counter on it at the beginning of the next end step. -MIR U - -Sand Silos -Land -Sand Silos enters the battlefield tapped. -You may choose not to untap Sand Silos during your untap step. -At the beginning of your upkeep, if Sand Silos is tapped, put a storage counter on it. -{T}, Remove any number of storage counters from Sand Silos: Add {U} to your mana pool for each storage counter removed this way. -FEM R, 5ED R - -Sand Squid -{3}{U} -Creature - Squid Beast -2/2 -Islandwalk -You may choose not to untap Sand Squid during your untap step. -{T}: Tap target creature. That creature doesn't untap during its controller's untap step for as long as Sand Squid remains tapped. -MMQ R - -Sandals of Abdallah -{4} -Artifact -{2}, {T}: Target creature gains islandwalk until end of turn. When that creature dies this turn, destroy Sandals of Abdallah. -ARN U - -Sandbar Crocodile -{4}{U} -Creature - Crocodile -6/5 -Phasing (This phases in or out before you untap during each of your untap steps. While it's phased out, it's treated as though it doesn't exist.) -MIR C - -Sandbar Merfolk -{U} -Creature - Merfolk -1/1 -Cycling {2} ({2}, Discard this card: Draw a card.) -USG C - -Sandbar Serpent -{4}{U} -Creature - Serpent -3/4 -Cycling {2} ({2}, Discard this card: Draw a card.) -USG U - -Sands of Time -{4} -Artifact -Each player skips his or her untap step. -At the beginning of each player's upkeep, that player simultaneously untaps each tapped artifact, creature, and land he or she controls and taps each untapped artifact, creature, and land he or she controls. -VIS R - -Sandskin -{2}{W} -Enchantment - Aura -Enchant creature -Prevent all combat damage that would be dealt to and dealt by enchanted creature. -ONS C - -Sandsower -{3}{W} -Creature - Spirit -1/3 -Tap three untapped creatures you control: Tap target creature. -RAV U - -Sandstone Deadfall -{3} -Artifact -{T}, Sacrifice two lands and Sandstone Deadfall: Destroy target attacking creature. -ODY U - -Sandstone Needle -Land -Sandstone Needle enters the battlefield tapped with two depletion counters on it. -{T}, Remove a depletion counter from Sandstone Needle: Add {R}{R} to your mana pool. If there are no depletion counters on Sandstone Needle, sacrifice it. -MMQ C - -Sandstone Warrior -{2}{R}{R} -Creature - Human Soldier Warrior -1/3 -First strike (This creature deals combat damage before creatures without first strike.) -{R}: Sandstone Warrior gets +1/+0 until end of turn. -TMP C, 9ED C - -Sandstorm -{G} -Instant -Sandstorm deals 1 damage to each attacking creature. -ARN C, 4ED C, MIR C, BRB C, ME4 C - -Sandstorm Eidolon -{3}{R} -Creature - Spirit -2/2 -{R}, Sacrifice Sandstorm Eidolon: Target creature can't block this turn. -Whenever you cast a multicolored spell, you may return Sandstorm Eidolon from your graveyard to your hand. -DIS C - -Sangrite Backlash -{B/G}{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +3/-3. -ARB C - -Sangrite Surge -{4}{R}{G} -Sorcery -Target creature gets +3/+3 and gains double strike until end of turn. -ALA U - -Sangromancer -{2}{B}{B} -Creature - Vampire Shaman -3/3 -Flying -Whenever a creature an opponent controls dies, you may gain 3 life. -Whenever an opponent discards a card, you may gain 3 life. -MBS R - -Sangrophage -{B}{B} -Creature - Zombie -3/3 -At the beginning of your upkeep, tap Sangrophage unless you pay 2 life. -TSP C - -Sanguine Bond -{3}{B}{B} -Enchantment -Whenever you gain life, target opponent loses that much life. -M10 R - -Sanguine Guard -{1}{B}{B} -Creature - Zombie Knight -2/2 -First strike -{1}{B}: Regenerate Sanguine Guard. -USG U, PVC U - -Sanguine Praetor -{6}{B}{B} -Creature - Avatar Praetor -7/5 -{B}, Sacrifice a creature: Destroy each creature with the same converted mana cost as the sacrificed creature. -GPT R - -Sanity Gnawers -{1}{B}{R} -Creature - Rat -1/1 -When Sanity Gnawers enters the battlefield, target player discards a card at random. -ARB U - -Sanity Grinding -{U}{U}{U} -Sorcery -Chroma - Reveal the top ten cards of your library. For each blue mana symbol in the mana costs of the revealed cards, target opponent puts the top card of his or her library into his or her graveyard. Then put the cards you revealed this way on the bottom of your library in any order. -EVE R - -Sapling of Colfenor -{3}{B/G}{B/G} -Legendary Creature - Treefolk Shaman -2/5 -Sapling of Colfenor is indestructible. -Whenever Sapling of Colfenor attacks, reveal the top card of your library. If it's a creature card, you gain life equal to that card's toughness, lose life equal to its power, then put it into your hand. -EVE R - -Sapphire Charm -{U} -Instant -Choose one - Target player draws a card at the beginning of the next turn's upkeep; or target creature gains flying until end of turn; or target creature an opponent controls phases out. (While it's phased out, it's treated as though it doesn't exist. It phases in before its controller untaps during his or her next untap step.) -MIR C - -Sapphire Leech -{1}{U} -Creature - Leech -2/2 -Flying -Blue spells you cast cost {U} more to cast. -INV R - -Sapphire Medallion -{2} -Artifact -Blue spells you cast cost {1} less to cast. -TMP R - -Saprazzan Bailiff -{3}{U}{U} -Creature - Merfolk -2/2 -When Saprazzan Bailiff enters the battlefield, exile all artifact and enchantment cards from all graveyards. -When Saprazzan Bailiff leaves the battlefield, return all artifact and enchantment cards from all graveyards to their owners' hands. -MMQ R - -Saprazzan Breaker -{4}{U} -Creature - Beast -3/3 -{U}: Put the top card of your library into your graveyard. If that card is a land card, Saprazzan Breaker is unblockable this turn. -MMQ U - -Saprazzan Cove -Land -Saprazzan Cove enters the battlefield tapped. -{T}: Put a storage counter on Saprazzan Cove. -{T}, Remove any number of storage counters from Saprazzan Cove: Add {U} to your mana pool for each storage counter removed this way. -MMQ U - -Saprazzan Heir -{1}{U} -Creature - Merfolk -1/1 -Whenever Saprazzan Heir becomes blocked, you may draw three cards. -MMQ R - -Saprazzan Legate -{3}{U} -Creature - Merfolk Soldier -1/3 -Flying -If an opponent controls a Mountain and you control an Island, you may cast Saprazzan Legate without paying its mana cost. -MMQ U - -Saprazzan Outrigger -{3}{U} -Creature - Merfolk -5/5 -When Saprazzan Outrigger attacks or blocks, put it on top of its owner's library at end of combat. -MMQ C - -Saprazzan Raider -{2}{U} -Creature - Merfolk -1/2 -When Saprazzan Raider becomes blocked, return it to its owner's hand. -MMQ C - -Saprazzan Skerry -Land -Saprazzan Skerry enters the battlefield tapped with two depletion counters on it. -{T}, Remove a depletion counter from Saprazzan Skerry: Add {U}{U} to your mana pool. If there are no depletion counters on Saprazzan Skerry, sacrifice it. -MMQ C - -Saproling Burst -{4}{G} -Enchantment -Fading 7 (This enchantment enters the battlefield with seven fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.) -Remove a fade counter from Saproling Burst: Put a green Saproling creature token onto the battlefield. It has "This creature's power and toughness are each equal to the number of fade counters on Saproling Burst." -When Saproling Burst leaves the battlefield, destroy all tokens put onto the battlefield with Saproling Burst. They can't be regenerated. -NEM R - -Saproling Cluster -{1}{G} -Enchantment -{1}, Discard a card: Put a 1/1 green Saproling creature token onto the battlefield. Any player may activate this ability. -NEM R - -Saproling Infestation -{1}{G} -Enchantment -Whenever a player kicks a spell, you put a 1/1 green Saproling creature token onto the battlefield. -INV R - -Saproling Symbiosis -{3}{G} -Sorcery -You may cast Saproling Symbiosis any time you could cast an instant if you pay {2} more to cast it. -Put a 1/1 green Saproling creature token onto the battlefield for each creature you control. -INV R - -Sapseep Forest -Land - Forest -({T}: Add {G} to your mana pool.) -Sapseep Forest enters the battlefield tapped. -{G}, {T}: You gain 1 life. Activate this ability only if you control two or more green permanents. -SHM U - -Sarcatog -{1}{B}{R} -Creature - Atog -1/2 -Exile two cards from your graveyard: Sarcatog gets +1/+1 until end of turn. -Sacrifice an artifact: Sarcatog gets +1/+1 until end of turn. -ODY U - -Sarcomancy -{B} -Enchantment -When Sarcomancy enters the battlefield, put a 2/2 black Zombie creature token onto the battlefield. -At the beginning of your upkeep, if there are no Zombies on the battlefield, Sarcomancy deals 1 damage to you. -TMP R - -Sarcomite Myr -{2}{U} -Artifact Creature - Myr -2/1 -{2}: Sarcomite Myr gains flying until end of turn. -{2}, Sacrifice Sarcomite Myr: Draw a card. -FUT C, HOP C - -Sarkhan Vol -{2}{R}{G} -Planeswalker - Sarkhan -4 -[+1] Creatures you control get +1/+1 and gain haste until end of turn. -[-2] Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. -[-6] Put five 4/4 red Dragon creature tokens with flying onto the battlefield. -ALA M - -Sarkhan the Mad -{3}{B}{R} -Planeswalker - Sarkhan -7 -[0] Reveal the top card of your library and put it into your hand. Sarkhan the Mad deals damage to himself equal to that card's converted mana cost. -[-2] Target creature's controller sacrifices it, then that player puts a 5/5 red Dragon creature token with flying onto the battlefield. -[-4] Each Dragon creature you control deals damage equal to its power to target player. -ROE M - -Sarpadian Empires, Vol. VII -{3} -Artifact -As Sarpadian Empires, Vol. VII enters the battlefield, choose white Citizen, blue Camarid, black Thrull, red Goblin, or green Saproling. -{3}, {T}: Put a 1/1 creature token of the chosen color and type onto the battlefield. -TSP R - -Sasaya, Orochi Ascendant -{1}{G}{G} -Legendary Creature - Snake Monk -2/3 -Reveal your hand: If you have seven or more land cards in your hand, flip Sasaya, Orochi Ascendant. ----- -Sasaya's Essence -Legendary Enchantment -Whenever a land you control is tapped for mana, for each other land you control with the same name, add one mana to your mana pool of any type that land produced. -SOK R - -Savaen Elves -{G} -Creature - Elf -1/1 -{G}{G}, {T}: Destroy target Aura attached to a land. -DRK C - -Savage Beating -{3}{R}{R} -Instant -Cast Savage Beating only during your turn and only during combat. -Choose one - Creatures you control gain double strike until end of turn; or untap all creatures you control and after this phase, there is an additional combat phase. -Entwine {1}{R} (Choose both if you pay the entwine cost.) -DST R - -Savage Conception -{3}{G}{G} -Sorcery -Put a 3/3 green Beast creature token onto the battlefield. -Retrace (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) -EVE U - -Savage Firecat -{3}{R}{R} -Creature - Elemental Cat -0/0 -Trample -Savage Firecat enters the battlefield with seven +1/+1 counters on it. -Whenever you tap a land for mana, remove a +1/+1 counter from Savage Firecat. -ODY R - -Savage Gorilla -{4}{G} -Creature - Ape -3/3 -{U}{B}, {T}, Sacrifice Savage Gorilla: Target creature gets -3/-3 until end of turn. Draw a card. -APC C - -Savage Hunger -{2}{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+0 and has trample. -Cycling {2} ({2}, Discard this card: Draw a card.) -ALA C - -Savage Lands -Land -Savage Lands enters the battlefield tapped. -{T}: Add {B}, {R}, or {G} to your mana pool. -ALA U - -Savage Offensive -{1}{R} -Sorcery -Kicker {G} (You may pay an additional {G} as you cast this spell.) -Creatures you control gain first strike until end of turn. If Savage Offensive was kicked, they get +1/+1 until end of turn. -INV C - -Savage Silhouette -{2}{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2 and has "{1}{G}: Regenerate this creature." -ZEN C - -Savage Thallid -{3}{G}{G} -Creature - Fungus -5/2 -At the beginning of your upkeep, put a spore counter on Savage Thallid. -Remove three spore counters from Savage Thallid: Put a 1/1 green Saproling creature token onto the battlefield. -Sacrifice a Saproling: Regenerate target Fungus. -TSP C - -Savage Twister -{X}{R}{G} -Sorcery -Savage Twister deals X damage to each creature. -MIR U, GPT U, HOP U, ARC U, COM U - -Savannah -Land - Forest Plains -LEA R, LEB R, 2ED R, 3ED R, ME2 R, ME4 R - -Savannah Lions -{W} -Creature - Cat -2/1 -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 8ED R, 9ED R, ME4 U - -Savor the Moment -{1}{U}{U} -Sorcery -Take an extra turn after this one. Skip the untap step of that turn. -SHM R - -Savra, Queen of the Golgari -{2}{B}{G} -Legendary Creature - Elf Shaman -2/2 -Whenever you sacrifice a black creature, you may pay 2 life. If you do, each other player sacrifices a creature. -Whenever you sacrifice a green creature, you may gain 2 life. -RAV R - -Sawback Manticore -{3}{R}{G} -Creature - Manticore -2/4 -{4}: Sawback Manticore gains flying until end of turn. -{1}: Sawback Manticore deals 2 damage to target attacking or blocking creature. Activate this ability only if Sawback Manticore is attacking or blocking and only once each turn. -MIR R - -Sawtooth Loon -{2}{W}{U} -Creature - Bird -2/2 -Flying -When Sawtooth Loon enters the battlefield, return a white or blue creature you control to its owner's hand. -When Sawtooth Loon enters the battlefield, draw two cards, then put two cards from your hand on the bottom of your library. -PLS U - -Sawtooth Ogre -{2}{R}{R} -Creature - Ogre -3/3 -Whenever Sawtooth Ogre blocks or becomes blocked by a creature, Sawtooth Ogre deals 1 damage to that creature at end of combat. -WTH C - -Sawtooth Thresher -{6} -Artifact Creature - Construct -1/1 -Sunburst (This enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.) -Remove two +1/+1 counters from Sawtooth Thresher: Sawtooth Thresher gets +4/+4 until end of turn. -5DN C - -Scab-Clan Mauler -{R}{G} -Creature - Human Berserker -1/1 -Bloodthirst 2 (If an opponent was dealt damage this turn, this creature enters the battlefield with two +1/+1 counters on it.) -Trample -GPT C - -Scabland -Land -Scabland enters the battlefield tapped. -{T}: Add {1} to your mana pool. -{T}: Add {R} or {W} to your mana pool. Scabland deals 1 damage to you. -TMP R - -Scald -{1}{R} -Enchantment -Whenever a player taps an Island for mana, Scald deals 1 damage to that player. -USG U - -Scalding Salamander -{2}{R} -Creature - Salamander -2/1 -Whenever Scalding Salamander attacks, you may have it deal 1 damage to each creature without flying defending player controls. -EXO U - -Scalding Tarn -Land -{T}, Pay 1 life, Sacrifice Scalding Tarn: Search your library for an Island or Mountain card and put it onto the battlefield. Then shuffle your library. -ZEN R - -Scalding Tongs -{2} -Artifact -At the beginning of your upkeep, if you have three or fewer cards in hand, Scalding Tongs deals 1 damage to target opponent. -TMP R - -Scale of Chiss-Goria -{3} -Artifact -Flash -Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -{T}: Target creature gets +0/+1 until end of turn. -MRD C - -Scalebane's Elite -{3}{G}{W} -Creature - Human Soldier -4/4 -Protection from black -VIS U - -Scaled Hulk -{5}{G} -Creature - Spirit -4/4 -Whenever you cast a Spirit or Arcane spell, Scaled Hulk gets +2/+2 until end of turn. -BOK C - -Scaled Wurm -{7}{G} -Creature - Wurm -7/6 -ICE C, 5ED C, 6ED C, BRB C, BTD C, 9ED C - -Scalpelexis -{4}{U} -Creature - Beast -1/5 -Flying (This creature can't be blocked except by creatures with flying or reach.) -Whenever Scalpelexis deals combat damage to a player, that player exiles the top four cards of his or her library. If two or more of those cards have the same name, repeat this process. -JUD R, 10E R - -Scandalmonger -{3}{B} -Creature - Boar Monger -3/3 -{2}: Target player discards a card. Any player may activate this ability but only any time he or she could cast a sorcery. -MMQ U - -Scapegoat -{W} -Instant -As an additional cost to cast Scapegoat, sacrifice a creature. -Return any number of target creatures you control to their owner's hand. -STH U - -Scapeshift -{2}{G}{G} -Sorcery -Sacrifice any number of lands. Search your library for that many land cards, put them onto the battlefield tapped, then shuffle your library. -MOR R - -Scar -{B/R} -Instant -Put a -1/-1 counter on target creature. -SHM C - -Scarab of the Unseen -{2} -Artifact -{T}, Sacrifice Scarab of the Unseen: Return all Auras attached to target permanent you own to their owners' hands. Draw a card at the beginning of the next turn's upkeep. -ALL U - -Scarblade Elite -{B}{B} -Creature - Elf Assassin -2/2 -{T}, Exile an Assassin card from your graveyard: Destroy target creature. -MOR R - -Scare Tactics -{B} -Instant -Creatures you control get +1/+0 until end of turn. -EXO C - -Scarecrone -{3} -Artifact Creature - Scarecrow -1/2 -{1}, Sacrifice a Scarecrow: Draw a card. -{4}, {T}: Return target artifact creature card from your graveyard to the battlefield. -EVE R - -Scarecrow -{5} -Artifact Creature - Scarecrow -2/2 -{6}, {T}: Prevent all damage that would be dealt to you this turn by creatures with flying. -DRK U, ME4 U - -Scarland Thrinax -{B}{R}{G} -Creature - Lizard -2/2 -Sacrifice a creature: Put a +1/+1 counter on Scarland Thrinax. -CON U - -Scarred Puma -{R} -Creature - Cat -2/1 -Scarred Puma can't attack unless a black or green creature also attacks. -INV C - -Scarred Vinebreeder -{1}{B} -Creature - Elf Shaman -1/1 -{2}{B}, Exile an Elf card from your graveyard: Scarred Vinebreeder gets +3/+3 until end of turn. -LRW C - -Scars of the Veteran -{4}{W} -Instant -You may exile a white card from your hand rather than pay Scars of the Veteran's mana cost. -Prevent the next 7 damage that would be dealt to target creature or player this turn. At the beginning of the next end step, put a +0/+1 counter on that creature for each 1 damage prevented this way. -ALL U, ME2 R - -Scarscale Ritual -{1}{U/B} -Sorcery -As an additional cost to cast Scarscale Ritual, put a -1/-1 counter on a creature you control. -Draw two cards. -SHM C - -Scarwood Bandits -{2}{G}{G} -Creature - Human Rogue -2/2 -Forestwalk -{2}{G}, {T}: Unless an opponent pays {2}, gain control of target artifact for as long as Scarwood Bandits remains on the battlefield. -DRK R, ME4 R - -Scarwood Goblins -{R}{G} -Creature - Goblin -2/2 -DRK C - -Scarwood Hag -{1}{G} -Creature - Hag -1/1 -{G}{G}{G}{G}, {T}: Target creature gains forestwalk until end of turn. -{T}: Target creature loses forestwalk until end of turn. -DRK U - -Scarwood Treefolk -{3}{G} -Creature - Treefolk -3/5 -Scarwood Treefolk enters the battlefield tapped. -TSP C - -Scathe Zombies -{2}{B} -Creature - Zombie -2/2 -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, 6ED C, S99 C, S00 C, 7ED C, 8ED C, 9ED C, 10E C - -Scatter the Seeds -{3}{G}{G} -Instant -Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.) -Put three 1/1 green Saproling creature tokens onto the battlefield. -RAV C - -Scattering Stroke -{2}{U}{U} -Instant -Counter target spell. Clash with an opponent. If you win, at the beginning of your next main phase, you may add {X} to your mana pool, where X is that spell's converted mana cost. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -LRW U, COM U - -Scattershot -{2}{R} -Instant -Scattershot deals 1 damage to target creature. -Storm (When you cast this spell, copy it for each spell cast before it this turn. You may choose new targets for the copies.) -SCG C - -Scattershot Archer -{G} -Creature - Elf Archer -1/2 -{T}: Scattershot Archer deals 1 damage to each creature with flying. -CON C - -Scavenged Weaponry -{2}{B} -Enchantment - Aura -Enchant creature -When Scavenged Weaponry enters the battlefield, draw a card. -Enchanted creature gets +1/+1. -INV C - -Scavenger Drake -{3}{B} -Creature - Drake -1/1 -Flying -Whenever another creature dies, you may put a +1/+1 counter on Scavenger Drake. -ALA U - -Scavenger Folk -{G} -Creature - Human -1/1 -{G}, {T}, Sacrifice Scavenger Folk: Destroy target artifact. -DRK C, CHR C, 5ED C, 7ED U, ME4 C - -Scavenging Ghoul -{3}{B} -Creature - Zombie -2/2 -At the beginning of each end step, put a corpse counter on Scavenging Ghoul for each creature that died this turn. -Remove a corpse counter from Scavenging Ghoul: Regenerate Scavenging Ghoul. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, ME4 U - -Scavenging Ooze -{1}{G} -Creature - Ooze -2/2 -{G}: Exile target card from a graveyard. If it was a creature card, put a +1/+1 counter on Scavenging Ooze and you gain 1 life. -COM R - -Scavenging Scarab -{3}{B} -Creature - Insect -3/3 -Scavenging Scarab can't block. -DST C - -Scent of Brine -{1}{U} -Instant -Reveal any number of blue cards in your hand. Counter target spell unless its controller pays {1} for each card revealed this way. -UDS C - -Scent of Cinder -{1}{R} -Sorcery -Reveal any number of red cards in your hand. Scent of Cinder deals X damage to target creature or player, where X is the number of cards revealed this way. -UDS C - -Scent of Ivy -{G} -Instant -Reveal any number of green cards in your hand. Target creature gets +X/+X until end of turn, where X is the number of cards revealed this way. -UDS C - -Scent of Jasmine -{W} -Instant -Reveal any number of white cards in your hand. You gain 2 life for each card revealed this way. -UDS C - -Scent of Nightshade -{1}{B} -Instant -Reveal any number of black cards in your hand. Target creature gets -X/-X until end of turn, where X is the number of cards revealed this way. -UDS C - -Scepter of Dominance -{1}{W}{W} -Artifact -{W}, {T}: Tap target permanent. -CON R - -Scepter of Empires -{3} -Artifact -{T}: Scepter of Empires deals 1 damage to target player. It deals 3 damage to that player instead if you control artifacts named Crown of Empires and Throne of Empires. -M12 U - -Scepter of Fugue -{B}{B} -Artifact -{1}{B}, {T}: Target player discards a card. Activate this ability only during your turn. -CON R - -Scepter of Insight -{1}{U}{U} -Artifact -{3}{U}, {T}: Draw a card. -CON R - -Schismotivate -{1}{U}{R} -Instant -Target creature gets +4/+0 until end of turn. Another target creature gets -4/-0 until end of turn. -GPT U - -School of Piranha -{1}{U} -Creature - Fish -3/3 -At the beginning of your upkeep, sacrifice School of Piranha unless you pay {1}{U}. -EXO C - -School of the Unseen -Land -{T}: Add {1} to your mana pool. -{2}, {T}: Add one mana of any color to your mana pool. -ALL U - -Scion of Darkness -{5}{B}{B}{B} -Creature - Avatar -6/6 -Trample -Whenever Scion of Darkness deals combat damage to a player, you may put target creature card from that player's graveyard onto the battlefield under your control. -Cycling {3} ({3}, Discard this card: Draw a card.) -LGN R, ARC R - -Scion of Oona -{2}{U} -Creature - Faerie Soldier -1/1 -Flash -Flying -Other Faerie creatures you control get +1/+1. -Other Faeries you control have shroud. (A permanent with shroud can't be the target of spells or abilities.) -LRW R - -Scion of the Ur-Dragon -{W}{U}{B}{R}{G} -Legendary Creature - Dragon Avatar -4/4 -Flying -{2}: Search your library for a Dragon permanent card and put it into your graveyard. If you do, Scion of the Ur-Dragon becomes a copy of that card until end of turn. Then shuffle your library. -TSP R - -Scion of the Wild -{1}{G}{G} -Creature - Avatar -*/* -Scion of the Wild's power and toughness are each equal to the number of creatures you control. -RAV R, 10E R - -Scorched Earth -{X}{R} -Sorcery -As an additional cost to cast Scorched Earth, discard X land cards. -Destroy X target lands. -TMP R - -Scorched Ruins -Land -If Scorched Ruins would enter the battlefield, sacrifice two untapped lands instead. If you do, put Scorched Ruins onto the battlefield. If you don't, put it into its owner's graveyard. -{T}: Add {4} to your mana pool. -WTH R - -Scorched Rusalka -{R} -Creature - Spirit -1/1 -{R}, Sacrifice a creature: Scorched Rusalka deals 1 damage to target player. -GPT U - -Scorching Lava -{1}{R} -Instant -Kicker {R} (You may pay an additional {R} as you cast this spell.) -Scorching Lava deals 2 damage to target creature or player. If Scorching Lava was kicked, that creature can't be regenerated this turn and if it would die this turn, exile it instead. -INV C - -Scorching Missile -{3}{R} -Sorcery -Scorching Missile deals 4 damage to target player. -Flashback {9}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY C - -Scorching Spear -{R} -Sorcery -Scorching Spear deals 1 damage to target creature or player. -POR C, S99 C - -Scorching Winds -{R} -Instant -Cast Scorching Winds only during the declare attackers step and only if you've been attacked this step. -Scorching Winds deals 1 damage to each attacking creature. -POR U - -Scoria Cat -{3}{R}{R} -Creature - Cat -3/3 -Scoria Cat gets +3/+3 as long as you control no untapped lands. -PCY U - -Scoria Elemental -{4}{R} -Creature - Elemental -6/1 -SOM C - -Scoria Wurm -{4}{R} -Creature - Wurm -7/7 -At the beginning of your upkeep, flip a coin. If you lose the flip, return Scoria Wurm to its owner's hand. -USG R, 10E R - -Scornful AEther-Lich -{3}{U} -Artifact Creature - Zombie Wizard -2/4 -{W}{B}: Scornful AEther-Lich gains fear and vigilance until end of turn. (Attacking doesn't cause it to tap, and it can't be blocked except by artifact creatures and/or black creatures.) -CON U - -Scornful Egotist -{7}{U} -Creature - Human Wizard -1/1 -Morph {U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -SCG C - -Scour -{2}{W}{W} -Instant -Exile target enchantment. Search its controller's graveyard, hand, and library for all cards with the same name as that enchantment and exile them. Then that player shuffles his or her library. -UDS U, BOK U - -Scourge Devil -{4}{R} -Creature - Devil -3/3 -When Scourge Devil enters the battlefield, creatures you control get +1/+0 until end of turn. -Unearth {2}{R} ({2}{R}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) -ALA U - -Scourge Servant -{4}{B} -Creature - Zombie -3/3 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -MBS C - -Scourge of Kher Ridges -{6}{R}{R} -Creature - Dragon -6/6 -Flying -{1}{R}: Scourge of Kher Ridges deals 2 damage to each creature without flying. -{5}{R}: Scourge of Kher Ridges deals 6 damage to each other creature with flying. -FUT R - -Scourge of Numai -{3}{B} -Creature - Demon Spirit -4/4 -At the beginning of your upkeep, you lose 2 life if you don't control an Ogre. -BOK U - -Scourge of the Nobilis -{2}{R/W} -Enchantment - Aura -Enchant creature -As long as enchanted creature is red, it gets +1/+1 and has "{R/W}: This creature gets +1/+0 until end of turn." -As long as enchanted creature is white, it gets +1/+1 and has lifelink. (Damage dealt by the creature also causes its controller to gain that much life.) -EVE C - -Scourglass -{3}{W}{W} -Artifact -{T}, Sacrifice Scourglass: Destroy all permanents except for artifacts and lands. Activate this ability only during your upkeep. -ALA R - -Scout's Warning -{W} -Instant -The next creature card you play this turn can be played as though it had flash. -Draw a card. -FUT R - -Scouting Trek -{1}{G} -Sorcery -Search your library for any number of basic land cards. Reveal those cards, then shuffle your library and put them on top of it. -INV U - -Scrabbling Claws -{1} -Artifact -{T}: Target player exiles a card from his or her graveyard. -{1}, Sacrifice Scrabbling Claws: Exile target card from a graveyard. Draw a card. -MRD U - -Scragnoth -{4}{G} -Creature - Beast -3/4 -Scragnoth can't be countered. -Protection from blue -TMP U, TSB S - -Scrambleverse -{6}{R}{R} -Sorcery -For each nonland permanent, choose a player at random. Then each player gains control of each permanent for which he or she was chosen. Untap those permanents. -M12 R - -Scrap -{2}{R} -Instant -Destroy target artifact. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG C - -Scrapbasket -{4} -Artifact Creature - Scarecrow -3/2 -{1}: Scrapbasket becomes all colors until end of turn. -SHM C - -Scrapdiver Serpent -{5}{U}{U} -Creature - Serpent -5/5 -Scrapdiver Serpent is unblockable as long as defending player controls an artifact. -SOM C - -Scrapheap -{3} -Artifact -Whenever an artifact or enchantment is put into your graveyard from the battlefield, you gain 1 life. -ULG R - -Scrapyard Salvo -{1}{R}{R} -Sorcery -Scrapyard Salvo deals damage to target player equal to the number of artifact cards in your graveyard. -NPH C - -Screaming Fury -{2}{R} -Sorcery -Target creature gets +5/+0 and gains haste until end of turn. -5DN C - -Screaming Seahawk -{4}{U} -Creature - Bird -2/2 -Flying -When Screaming Seahawk enters the battlefield, you may search your library for a card named Screaming Seahawk, reveal it, and put it into your hand. If you do, shuffle your library. -ONS C - -Screams from Within -{1}{B}{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets -1/-1. -When enchanted creature dies, return Screams from Within from your graveyard to the battlefield. -DST U - -Screams of the Damned -{3}{B}{B} -Enchantment -{1}{B}, Exile a card from your graveyard: Screams of the Damned deals 1 damage to each creature and each player. -ODY U - -Screeching Buzzard -{3}{B} -Creature - Bird -2/2 -Flying -When Screeching Buzzard dies, each opponent discards a card. -ONS C - -Screeching Drake -{3}{U} -Creature - Drake -2/2 -Flying -When Screeching Drake enters the battlefield, draw a card, then discard a card. -P02 C, ME2 C - -Screeching Griffin -{3}{W} -Creature - Griffin -2/2 -Flying -{R}: Target creature can't block Screeching Griffin this turn. -RAV C - -Screeching Harpy -{2}{B}{B} -Creature - Harpy Beast -2/2 -Flying -{1}{B}: Regenerate Screeching Harpy. -TMP U - -Screeching Silcaw -{1}{U} -Creature - Bird -1/2 -Flying -Metalcraft - Whenever Screeching Silcaw deals combat damage to a player, if you control three or more artifacts, that player puts the top four cards of his or her library into his or her graveyard. -SOM C - -Screeching Sliver -{U} -Creature - Sliver -1/1 -All Slivers have "{T}: Target player puts the top card of his or her library into his or her graveyard." -TSP C - -Scrib Nibblers -{2}{B} -Creature - Rat -1/1 -{T}: Exile the top card of target player's library. If it's a land card, you gain 1 life. -Landfall - Whenever a land enters the battlefield under your control, you may untap Scrib Nibblers. -WWK U - -Scrivener -{4}{U} -Creature - Human Wizard -2/2 -When Scrivener enters the battlefield, you may return target instant card from your graveyard to your hand. -EXO U, ODY C - -Scroll Rack -{2} -Artifact -{1}, {T}: Exile any number of cards from your hand face down. Put that many cards from the top of your library into your hand. Then look at the exiled cards and put them on top of your library in any order. -TMP R - -Scroll Thief -{2}{U} -Creature - Merfolk Rogue -1/3 -Whenever Scroll Thief deals combat damage to a player, draw a card. -M11 C - -Scroll of Origins -{2} -Artifact -{2}, {T}: Draw a card if you have seven or more cards in hand. -SOK R - -Scrounge -{2}{B} -Sorcery -Target opponent chooses an artifact card in his or her graveyard. Put that card onto the battlefield under your control. -DST U - -Scrubland -Land - Plains Swamp -LEA R, LEB R, 2ED R, 3ED R, ME3 R, ME4 R - -Scryb Ranger -{1}{G} -Creature - Faerie -1/1 -Flash (You may cast this spell any time you could cast an instant.) -Flying, protection from blue -Return a Forest you control to its owner's hand: Untap target creature. Activate this ability only once each turn. -TSP U - -Scryb Sprites -{G} -Creature - Faerie -1/1 -Flying -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, BRB C, MED C, ME3 C - -Scrying Glass -{2} -Artifact -{3}, {T}: Choose a number greater than 0 and a color. Target opponent reveals his or her hand. If that opponent reveals exactly the chosen number of cards of the chosen color, you draw a card. -UDS R - -Scrying Sheets -Snow Land -{T}: Add {1} to your mana pool. -{1}{S}, {T}: Look at the top card of your library. If that card is snow, you may reveal it and put it into your hand. ({S} can be paid with one mana from a snow permanent.) -CSP R - -Sculpting Steel -{3} -Artifact -You may have Sculpting Steel enter the battlefield as a copy of any artifact on the battlefield. -MRD R, 10E R - -Scute Mob -{G} -Creature - Insect -1/1 -At the beginning of your upkeep, if you control five or more lands, put four +1/+1 counters on Scute Mob. -ZEN R - -Scuttlemutt -{3} -Artifact Creature - Scarecrow -2/2 -{T}: Add one mana of any color to your mana pool. -{T}: Target creature becomes the color or colors of your choice until end of turn. -SHM C - -Scuttling Death -{4}{B} -Creature - Spirit -4/2 -Sacrifice Scuttling Death: Target creature gets -1/-1 until end of turn. -Soulshift 4 (When this creature dies, you may return target Spirit card with converted mana cost 4 or less from your graveyard to your hand.) -CHK C - -Scuzzback Marauders -{4}{R/G} -Creature - Goblin Warrior -5/2 -Trample -Persist (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) -SHM C - -Scuzzback Scrapper -{R/G} -Creature - Goblin Warrior -1/1 -Wither (This deals damage to creatures in the form of -1/-1 counters.) -SHM C - -Scythe Specter -{4}{B}{B} -Creature - Specter -4/4 -Flying -Whenever Scythe Specter deals combat damage to a player, each opponent discards a card. Each player who discarded a card with the highest converted mana cost among cards discarded this way loses life equal to that converted mana cost. -COM R - -Scythe Tiger -{G} -Creature - Cat -3/2 -Shroud (This creature can't be the target of spells or abilities.) -When Scythe Tiger enters the battlefield, sacrifice it unless you sacrifice a land. -ZEN C - -Scythe of the Wretched -{2} -Artifact - Equipment -Equipped creature gets +2/+2. -Whenever a creature dealt damage by equipped creature this turn dies, return that card to the battlefield under your control. Attach Scythe of the Wretched to that creature. -Equip {4} -MRD R - -Sea Drake -{2}{U} -Creature - Drake -4/3 -Flying -When Sea Drake enters the battlefield, return two target lands you control to their owner's hand. -P02 U, ME2 R - -Sea Eagle -{1}{U} -Creature - Bird -1/1 -Flying -S99 C, S00 C, 8ED C - -Sea Gate Loremaster -{4}{U} -Creature - Merfolk Wizard Ally -1/3 -{T}: Draw a card for each Ally you control. -ZEN R - -Sea Gate Oracle -{2}{U} -Creature - Human Wizard -1/3 -When Sea Gate Oracle enters the battlefield, look at the top two cards of your library. Put one of them into your hand and the other on the bottom of your library. -ROE C - -Sea Kings' Blessing -{U} -Instant -Any number of target creatures become blue until end of turn. -LEG U - -Sea Monster -{4}{U}{U} -Creature - Serpent -6/6 -Sea Monster can't attack unless defending player controls an Island. -TMP C, 6ED C, 7ED C, 8ED C, 9ED C, 10E C - -Sea Scryer -{1}{U} -Creature - Merfolk Wizard -1/1 -{T}: Add {1} to your mana pool. -{1}, {T}: Add {U} to your mana pool. -MIR C - -Sea Serpent -{5}{U} -Creature - Serpent -5/5 -Sea Serpent can't attack unless defending player controls an Island. -When you control no Islands, sacrifice Sea Serpent. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, ME4 C - -Sea Snidd -{4}{U} -Creature - Beast -3/3 -{T}: Target land becomes the basic land type of your choice until end of turn. -PLS C - -Sea Spirit -{4}{U} -Creature - Elemental Spirit -2/3 -{U}: Sea Spirit gets +1/+0 until end of turn. -ICE U, 5ED U, ME2 U - -Sea Sprite -{1}{U} -Creature - Faerie -1/1 -Flying, protection from red -HML U, 5ED U, MED C - -Sea Troll -{2}{U} -Creature - Troll -2/1 -{U}: Regenerate Sea Troll. Activate this ability only if Sea Troll blocked or was blocked by a blue creature this turn. -HML U - -Sea of Sand -Plane - Rabiah -Players reveal each card they draw. -Whenever a player draws a land card, that player gains 3 life. -Whenever a player draws a nonland card, that player loses 3 life. -Whenever you roll {C}, put target permanent on top of its owner's library. -HOP C - -Sea's Claim -{U} -Enchantment - Aura -Enchant land (Target a land as you cast this. This card enters the battlefield attached to that land.) -Enchanted land is an Island. -ONS C, 9ED C - -Seachrome Coast -Land -Seachrome Coast enters the battlefield tapped unless you control two or fewer other lands. -{T}: Add {W} or {U} to your mana pool. -SOM R - -Seafarer's Quay -Land -Blue legendary creatures you control have "bands with other legendary creatures." (Any legendary creatures can attack in a band as long as at least one has "bands with other legendary creatures." Bands are blocked as a group. If at least two legendary creatures you control, one of which has "bands with other legendary creatures," are blocking or being blocked by the same creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -LEG U - -Seafloor Debris -Land -Seafloor Debris enters the battlefield tapped. -{T}: Add {U} to your mana pool. -{T}, Sacrifice Seafloor Debris: Add one mana of any color to your mana pool. -ODY C - -Seahunter -{2}{U}{U} -Creature - Human Mercenary -2/2 -{3}, {T}: Search your library for a Merfolk permanent card and put it onto the battlefield. Then shuffle your library. -NEM R - -Seal of Cleansing -{1}{W} -Enchantment -Sacrifice Seal of Cleansing: Destroy target artifact or enchantment. -NEM C - -Seal of Doom -{2}{B} -Enchantment -Sacrifice Seal of Doom: Destroy target nonblack creature. It can't be regenerated. -NEM C, DIS C - -Seal of Fire -{R} -Enchantment -Sacrifice Seal of Fire: Seal of Fire deals 2 damage to target creature or player. -NEM C, DIS C, JVC C - -Seal of Primordium -{1}{G} -Enchantment -Sacrifice Seal of Primordium: Destroy target artifact or enchantment. -PLC C - -Seal of Removal -{U} -Enchantment -Sacrifice Seal of Removal: Return target creature to its owner's hand. -NEM C - -Seal of Strength -{G} -Enchantment -Sacrifice Seal of Strength: Target creature gets +3/+3 until end of turn. -NEM C - -Sealed Fate -{X}{U}{B} -Sorcery -Look at the top X cards of target opponent's library. Exile one of those cards and put the rest back on top of that player's library in any order. -MIR U - -Search for Survivors -{2}{R} -Sorcery -Reorder your graveyard at random. An opponent chooses a card at random in your graveyard. If it's a creature card, put it onto the battlefield. Otherwise, exile it. -PCY R - -Search for Tomorrow -{2}{G} -Sorcery -Search your library for a basic land card and put it onto the battlefield. Then shuffle your library. -Suspend 2-{G} (Rather than cast this card from your hand, you may pay {G} and exile it with two time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) -TSP C, HOP C - -Searing Blaze -{R}{R} -Instant -Searing Blaze deals 1 damage to target player and 1 damage to target creature that player controls. -Landfall - If you had a land enter the battlefield under your control this turn, Searing Blaze deals 3 damage to that player and 3 damage to that creature instead. -WWK C - -Searing Flesh -{6}{R} -Sorcery -Searing Flesh deals 7 damage to target opponent. -ONS U - -Searing Meditation -{1}{R}{W} -Enchantment -Whenever you gain life, you may pay {2}. If you do, Searing Meditation deals 2 damage to target creature or player. -RAV R - -Searing Rays -{2}{R} -Sorcery -Choose a color. Searing Rays deals damage to each player equal to the number of creatures of that color that player controls. -INV U - -Searing Spear Askari -{2}{R} -Creature - Human Knight -2/2 -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -{1}{R}: Searing Spear Askari can't be blocked except by two or more creatures this turn. -MIR C - -Searing Touch -{R} -Instant -Buyback {4} (You may pay an additional {4} as you cast this spell. If you do, put this card into your hand as it resolves.) -Searing Touch deals 1 damage to target creature or player. -TMP U - -Searing Wind -{8}{R} -Instant -Searing Wind deals 10 damage to target creature or player. -PCY R, 8ED R - -Seascape Aerialist -{4}{U} -Creature - Merfolk Wizard Ally -2/3 -Whenever Seascape Aerialist or another Ally enters the battlefield under your control, you may have Ally creatures you control gain flying until end of turn. -ZEN U - -Seashell Cameo -{3} -Artifact -{T}: Add {W} or {U} to your mana pool. -INV U - -Seaside Citadel -Land -Seaside Citadel enters the battlefield tapped. -{T}: Add {G}, {W}, or {U} to your mana pool. -ALA U - -Seaside Haven -Land -{T}: Add {1} to your mana pool. -{W}{U}, {T}, Sacrifice a Bird: Draw a card. -ONS U - -Seasinger -{1}{U}{U} -Creature - Merfolk -0/1 -When you control no Islands, sacrifice Seasinger. -You may choose not to untap Seasinger during your untap step. -{T}: Gain control of target creature whose controller controls an Island for as long as you control Seasinger and Seasinger remains tapped. -FEM U, 5ED U, MED U - -Season of the Witch -{B}{B}{B} -Enchantment -At the beginning of your upkeep, sacrifice Season of the Witch unless you pay 2 life. -At the beginning of the end step, destroy all untapped creatures that didn't attack this turn, except for creatures that couldn't attack. -DRK R - -Seasoned Marshal -{2}{W}{W} -Creature - Human Soldier -2/2 -Whenever Seasoned Marshal attacks, you may tap target creature. -POR U, USG U, BRB U, 7ED U, 8ED U, 9ED U, EVT U - -Seasoned Tactician -{2}{W} -Creature - Human Advisor -1/3 -{3}, Exile the top four cards of your library: The next time a source of your choice would deal damage to you this turn, prevent that damage. -ALL U - -Seat of the Synod -Artifact Land -(Seat of the Synod isn't a spell.) -{T}: Add {U} to your mana pool. -MRD C, HOP C, EVT C - -Secluded Glen -Land -As Secluded Glen enters the battlefield, you may reveal a Faerie card from your hand. If you don't, Secluded Glen enters the battlefield tapped. -{T}: Add {U} or {B} to your mana pool. -LRW R - -Secluded Steppe -Land -Secluded Steppe enters the battlefield tapped. -{T}: Add {W} to your mana pool. -Cycling {W} ({W}, Discard this card: Draw a card.) -ONS C, DVD C, ARC C, COM C - -Second Chance -{2}{U} -Enchantment -At the beginning of your upkeep, if you have 5 or less life, sacrifice Second Chance and take an extra turn after this one. -ULG R - -Second Sight -{2}{U} -Instant -Choose one - Look at the top five cards of target opponent's library, then put them back in any order; or look at the top five cards of your library, then put them back in any order. -Entwine {U} (Choose both if you pay the entwine cost.) -DST U - -Second Sunrise -{1}{W}{W} -Instant -Each player returns to the battlefield all artifact, creature, enchantment, and land cards in his or her graveyard that were put there from the battlefield this turn. -MRD R - -Second Thoughts -{4}{W} -Instant -Exile target attacking creature. -Draw a card. -ODY C - -Second Wind -{2}{U} -Enchantment - Aura -Enchant creature -{T}: Tap enchanted creature. -{T}: Untap enchanted creature. -FUT U - -Secretkeeper -{3}{U} -Creature - Spirit -2/2 -As long as you have more cards in hand than each opponent, Secretkeeper gets +2/+2 and has flying. -SOK U - -Security Detail -{3}{W} -Enchantment -{W}{W}: Put a 1/1 white Soldier creature token onto the battlefield. Activate this ability only if you control no creatures and only once each turn. -MMQ R - -Sedge Sliver -{2}{R} -Creature - Sliver -2/2 -All Sliver creatures have "This creature gets +1/+1 as long as you control a Swamp." -All Slivers have "{B}: Regenerate this permanent." -TSP R - -Sedge Troll -{2}{R} -Creature - Troll -2/2 -Sedge Troll gets +1/+1 as long as you control a Swamp. -{B}: Regenerate Sedge Troll. -LEA R, LEB R, 2ED R, 3ED R, ME4 R - -Sedraxis Alchemist -{2}{B} -Creature - Zombie Wizard -2/2 -When Sedraxis Alchemist enters the battlefield, if you control a blue permanent, return target nonland permanent to its owner's hand. -CON C - -Sedraxis Specter -{U}{B}{R} -Creature - Specter -3/2 -Flying -Whenever Sedraxis Specter deals combat damage to a player, that player discards a card. -Unearth {1}{B} ({1}{B}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) -ALA R - -Sedris, the Traitor King -{3}{U}{B}{R} -Legendary Creature - Zombie Warrior -5/5 -Each creature card in your graveyard has unearth {2}{B}. ({2}{B}: Return the card to the battlefield. The creature gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) -ALA M - -See Beyond -{1}{U} -Sorcery -Draw two cards, then shuffle a card from your hand into your library. -ROE C - -Seed Spark -{3}{W} -Instant -Destroy target artifact or enchantment. If {G} was spent to cast Seed Spark, put two 1/1 green Saproling creature tokens onto the battlefield. -RAV U - -Seed the Land -{2}{G}{G} -Enchantment -Whenever a land enters the battlefield, its controller puts a 1/1 green Snake creature token onto the battlefield. -SOK R - -Seedborn Muse -{3}{G}{G} -Creature - Spirit -2/4 -Untap all permanents you control during each other player's untap step. -LGN R, 9ED R, 10E R - -Seedcradle Witch -{G/W} -Creature - Elf Shaman -1/1 -{2}{G}{W}: Target creature gets +3/+3 until end of turn. Untap that creature. -SHM U - -Seedguide Ash -{4}{G} -Creature - Treefolk Druid -4/4 -When Seedguide Ash dies, you may search your library for up to three Forest cards and put them onto the battlefield tapped. If you do, shuffle your library. -LRW U - -Seedling Charm -{G} -Instant -Choose one - Return target Aura attached to a creature to its owner's hand; or regenerate target green creature; or target creature gains trample until end of turn. -MIR C - -Seeds of Innocence -{1}{G}{G} -Sorcery -Destroy all artifacts. They can't be regenerated. The controller of each artifact destroyed this way gains life equal to its converted mana cost. -MIR R - -Seeds of Strength -{G}{W} -Instant -Target creature gets +1/+1 until end of turn. -Target creature gets +1/+1 until end of turn. -Target creature gets +1/+1 until end of turn. -RAV C - -Seedtime -{1}{G} -Instant -Cast Seedtime only during your turn. -Take an extra turn after this one if an opponent cast a blue spell this turn. -JUD R - -Seek the Horizon -{3}{G} -Sorcery -Search your library for up to three basic land cards, reveal them, and put them into your hand. Then shuffle your library. -SOK U - -Seeker -{2}{W}{W} -Enchantment - Aura -Enchant creature -Enchanted creature can't be blocked except by artifact creatures and/or white creatures. -LEG U, 4ED C - -Seeker of Skybreak -{1}{G} -Creature - Elf -2/1 -{T}: Untap target creature. -TMP C, BRB C, 7ED C - -Seer's Sundial -{4} -Artifact -Landfall - Whenever a land enters the battlefield under your control, you may pay {2}. If you do, draw a card. -WWK R - -Seer's Vision -{2}{U}{B} -Enchantment -Your opponents play with their hands revealed. -Sacrifice Seer's Vision: Look at target player's hand and choose a card from it. That player discards that card. Activate this ability only any time you could cast a sorcery. -INV U - -Seething Anger -{R} -Sorcery -Buyback {3} (You may pay an additional {3} as you cast this spell. If you do, put this card into your hand as it resolves.) -Target creature gets +3/+0 until end of turn. -STH C - -Seething Pathblazer -{2}{R} -Creature - Elemental Warrior -2/2 -Sacrifice an Elemental: Seething Pathblazer gets +2/+0 and gains first strike until end of turn. -MOR C - -Seething Song -{2}{R} -Instant -Add {R}{R}{R}{R}{R} to your mana pool. -MRD C, 9ED C, ARC C, DDG C - -Segmented Wurm -{3}{R}{G} -Creature - Wurm -5/5 -Whenever Segmented Wurm becomes the target of a spell or ability, put a -1/-1 counter on it. -TMP U, BTD U - -Segovian Leviathan -{4}{U} -Creature - Leviathan -3/3 -Islandwalk -LEG U, 4ED U, 5ED U, 6ED U - -Seht's Tiger -{2}{W}{W} -Creature - Cat -3/3 -Flash (You may cast this spell any time you could cast an instant.) -When Seht's Tiger enters the battlefield, you gain protection from the color of your choice until end of turn. (You can't be targeted, dealt damage, or enchanted by anything of the chosen color.) -FUT R - -Seismic Assault -{R}{R}{R} -Enchantment -Discard a land card: Seismic Assault deals 2 damage to target creature or player. -EXO R, 7ED R, 8ED R, 10E R - -Seismic Mage -{3}{R} -Creature - Human Spellshaper -1/1 -{2}{R}, {T}, Discard a card: Destroy target land. -MMQ R - -Seismic Shudder -{1}{R} -Instant -Seismic Shudder deals 1 damage to each creature without flying. -ZEN C - -Seismic Spike -{2}{R}{R} -Sorcery -Destroy target land. Add {R}{R} to your mana pool. -RAV C - -Seismic Strike -{2}{R} -Instant -Seismic Strike deals damage to target creature equal to the number of Mountains you control. -M10 C, DDG C - -Seizan, Perverter of Truth -{3}{B}{B} -Legendary Creature - Demon Spirit -6/5 -At the beginning of each player's upkeep, that player loses 2 life and draws two cards. -CHK R - -Seize the Day -{3}{R} -Sorcery -Untap target creature. After this main phase, there is an additional combat phase followed by an additional main phase. -Flashback {2}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY R - -Seize the Initiative -{W} -Instant -Target creature gets +1/+1 and gains first strike until end of turn. -SOM C - -Seize the Soul -{2}{B}{B} -Instant -Destroy target nonwhite, nonblack creature. Put a 1/1 white Spirit creature token with flying onto the battlefield. -Haunt (When this spell card is put into a graveyard after resolving, exile it haunting target creature.) -When the creature Seize the Soul haunts dies, destroy target nonwhite, nonblack creature. Put a 1/1 white Spirit creature token with flying onto the battlefield. -GPT R - -Seizures -{1}{B} -Enchantment - Aura -Enchant creature -Whenever enchanted creature becomes tapped, Seizures deals 3 damage to that creature's controller unless that player pays {3}. -ICE C - -Sejiri Merfolk -{1}{U} -Creature - Merfolk Soldier -2/1 -As long as you control a Plains, Sejiri Merfolk has first strike and lifelink. (Damage dealt by a creature with lifelink also causes its controller to gain that much life.) -WWK U - -Sejiri Refuge -Land -Sejiri Refuge enters the battlefield tapped. -When Sejiri Refuge enters the battlefield, you gain 1 life. -{T}: Add {W} or {U} to your mana pool. -ZEN U - -Sejiri Steppe -Land -Sejiri Steppe enters the battlefield tapped. -When Sejiri Steppe enters the battlefield, target creature you control gains protection from the color of your choice until end of turn. -{T}: Add {W} to your mana pool. -WWK C, DDG C - -Sek'Kuar, Deathkeeper -{2}{B}{R}{G} -Legendary Creature - Orc Shaman -4/3 -Whenever another nontoken creature you control dies, put a 3/1 black and red Graveborn creature token with haste onto the battlefield. -CSP R - -Sekki, Seasons' Guide -{5}{G}{G}{G} -Legendary Creature - Spirit -0/0 -Sekki, Seasons' Guide enters the battlefield with eight +1/+1 counters on it. -If damage would be dealt to Sekki, prevent that damage, remove that many +1/+1 counters from Sekki, and put that many 1/1 colorless Spirit creature tokens onto the battlefield. -Sacrifice eight Spirits: Return Sekki from your graveyard to the battlefield. -SOK R - -Selective Memory -{3}{U} -Sorcery -Search your library for any number of nonland cards and exile them. Then shuffle your library. -WWK R - -Selenia -Vanguard -Hand +1, life +7 -Creatures you control have vigilance. -VG S - -Selenia, Dark Angel -{3}{W}{B} -Legendary Creature - Angel -3/3 -Flying -Pay 2 life: Return Selenia, Dark Angel to its owner's hand. -TMP R - -Selesnya Evangel -{G}{W} -Creature - Elf Shaman -1/2 -{1}, {T}, Tap an untapped creature you control: Put a 1/1 green Saproling creature token onto the battlefield. -RAV C, COM C - -Selesnya Guildmage -{G/W}{G/W} -Creature - Elf Wizard -2/2 -{3}{G}: Put a 1/1 green Saproling creature token onto the battlefield. -{3}{W}: Creatures you control get +1/+1 until end of turn. -RAV U, ARC U, COM U - -Selesnya Sagittars -{3}{G}{W} -Creature - Elf Archer -2/5 -Reach (This creature can block creatures with flying.) -Selesnya Sagittars can block an additional creature. -RAV U - -Selesnya Sanctuary -Land -Selesnya Sanctuary enters the battlefield tapped. -When Selesnya Sanctuary enters the battlefield, return a land you control to its owner's hand. -{T}: Add {G}{W} to your mana pool. -RAV C, DDG C, COM C - -Selesnya Signet -{2} -Artifact -{1}, {T}: Add {G}{W} to your mana pool. -RAV C, COM C - -Selfless Exorcist -{3}{W}{W} -Creature - Human Cleric -3/4 -{T}: Exile target creature card from a graveyard. That card deals damage equal to its power to Selfless Exorcist. -JUD R - -Selkie Hedge-Mage -{2}{G/U} -Creature - Merfolk Wizard -2/2 -When Selkie Hedge-Mage enters the battlefield, if you control two or more Forests, you may gain 3 life. -When Selkie Hedge-Mage enters the battlefield, if you control two or more Islands, you may return target tapped creature to its owner's hand. -EVE U - -Sell-Sword Brute -{1}{R} -Creature - Human Mercenary -2/2 -When Sell-Sword Brute dies, it deals 2 damage to you. -RAV C - -Semblance Anvil -{3} -Artifact -Imprint - When Semblance Anvil enters the battlefield, you may exile a nonland card from your hand. -Spells you cast that share a card type with the exiled card cost {2} less to cast. -SOM R - -Sen Triplets -{2}{W}{U}{B} -Legendary Artifact Creature - Human Wizard -3/3 -At the beginning of your upkeep, choose target opponent. This turn, that player can't cast spells or activate abilities and plays with his or her hand revealed. You may play cards from that player's hand this turn. -ARB M - -Sengir Autocrat -{3}{B} -Creature - Human -2/2 -When Sengir Autocrat enters the battlefield, put three 0/1 black Serf creature tokens onto the battlefield. -When Sengir Autocrat leaves the battlefield, exile all Serf tokens. -HML U, 5ED R, 6ED R, TSB S - -Sengir Bats -{1}{B}{B} -Creature - Bat -1/2 -Flying -Whenever a creature dealt damage by Sengir Bats this turn dies, put a +1/+1 counter on Sengir Bats. -HML C (x2) - -Sengir Nosferatu -{3}{B}{B} -Creature - Vampire -4/4 -Flying -{1}{B}, Exile Sengir Nosferatu: Put a 1/2 black Bat creature token with flying onto the battlefield. It has "{1}{B}, Sacrifice this creature: Return an exiled card named Sengir Nosferatu to the battlefield under its owner's control." -TSP R - -Sengir Vampire -{3}{B}{B} -Creature - Vampire -4/4 -Flying -Whenever a creature dealt damage by Sengir Vampire this turn dies, put a +1/+1 counter on Sengir Vampire. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, BRB U, BTD U, TOR R, 9ED R, 10E R, ME4 U, M12 U - -Sensation Gorger -{1}{R}{R} -Creature - Goblin Shaman -2/2 -Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Sensation Gorger, you may reveal it. If you do, each player discards his or her hand and draws four cards. -MOR R - -Sensei Golden-Tail -{1}{W} -Legendary Creature - Fox Samurai -2/1 -Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -{1}{W}, {T}: Put a training counter on target creature. That creature gains bushido 1 and becomes a Samurai in addition to its other creature types. Activate this ability only any time you could cast a sorcery. -CHK R - -Sensei's Divining Top -{1} -Artifact -{1}: Look at the top three cards of your library, then put them back in any order. -{T}: Draw a card, then put Sensei's Divining Top on top of its owner's library. -CHK U, FVE M - -Sensor Splicer -{4}{W} -Creature - Artificer -1/1 -When Sensor Splicer enters the battlefield, put a 3/3 colorless Golem artifact creature token onto the battlefield. -Golem creatures you control have vigilance. -NPH C - -Sentinel -{4} -Artifact Creature - Shapeshifter -1/1 -{0}: Sentinel's toughness becomes 1 plus the power of target creature blocking or blocked by Sentinel. (This effect lasts indefinitely.) -LEG R, CHR R - -Sentinels of Glen Elendra -{3}{U} -Creature - Faerie Soldier -2/3 -Flash -Flying -LRW C - -Sentry Oak -{4}{W} -Creature - Treefolk Warrior -3/5 -Defender -At the beginning of combat on your turn, you may clash with an opponent. If you win, Sentry Oak gets +2/+0 and loses defender until end of turn. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -LRW U - -Septic Rats -{1}{B}{B} -Creature - Rat -2/2 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -Whenever Septic Rats attacks, if defending player is poisoned, it gets +1/+1 until end of turn. -MBS U - -Seraph -{6}{W} -Creature - Angel -4/4 -Flying -Whenever a creature dealt damage by Seraph this turn dies, put that card onto the battlefield under your control at the beginning of the next end step. Sacrifice the creature when you lose control of Seraph. -ICE R, 5ED R, MED R - -Serendib Djinn -{2}{U}{U} -Creature - Djinn -5/6 -Flying -At the beginning of your upkeep, sacrifice a land. If you sacrifice an Island this way, Serendib Djinn deals 3 damage to you. -When you control no lands, sacrifice Serendib Djinn. -ARN R, ME4 R - -Serendib Efreet -{2}{U} -Creature - Efreet -3/4 -Flying -At the beginning of your upkeep, Serendib Efreet deals 1 damage to you. -ARN R, 3ED R, MED R, FVE M - -Serendib Sorcerer -{1}{U}{U} -Creature - Human Wizard -1/1 -{T}: Target creature other than Serendib Sorcerer becomes 0/2 until end of turn. -PLC R - -Serene Heart -{1}{G} -Instant -Destroy all Auras. -MIR C - -Serene Offering -{1}{W} -Instant -Destroy target enchantment. You gain life equal to its converted mana cost. -TMP U - -Serene Sunset -{X}{G} -Instant -Prevent all combat damage X target creatures would deal this turn. -JUD U - -Serenity -{1}{W} -Enchantment -At the beginning of your upkeep, destroy all artifacts and enchantments. They can't be regenerated. -WTH R, 6ED R - -Serpent Assassin -{3}{B}{B} -Creature - Snake Assassin -2/2 -When Serpent Assassin enters the battlefield, you may destroy target nonblack creature. -POR R - -Serpent Generator -{6} -Artifact -{4}, {T}: Put a 1/1 colorless Snake artifact creature token onto the battlefield. It has "Whenever this creature deals damage to a player, that player gets a poison counter." (A player with ten or more poison counters loses the game.) -LEG R, CHR R, 5ED R, MED R - -Serpent Skin -{2}{G} -Enchantment - Aura -Flash -Enchant creature -Enchanted creature gets +1/+1. -{G}: Regenerate enchanted creature. -CHK C - -Serpent Warrior -{2}{B} -Creature - Snake Warrior -3/3 -When Serpent Warrior enters the battlefield, you lose 3 life. -POR C, STH C, S99 C, 7ED C, 8ED C, 9ED C - -Serpent of the Endless Sea -{4}{U} -Creature - Serpent -*/* -Serpent of the Endless Sea's power and toughness are each equal to the number of Islands you control. -Serpent of the Endless Sea can't attack unless defending player controls an Island. -M10 C - -Serpentine Basilisk -{2}{G}{G} -Creature - Basilisk -2/3 -Whenever Serpentine Basilisk deals combat damage to a creature, destroy that creature at end of combat. -Morph {1}{G}{G} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS U - -Serpentine Kavu -{4}{G} -Creature - Kavu -4/4 -{R}: Serpentine Kavu gains haste until end of turn. -INV C - -Serra -Vanguard -Hand +1, life +1 -Creatures you control get +0/+2. -VG S - -Serra Advocate -{3}{W} -Creature - Angel -2/2 -Flying -{T}: Target attacking or blocking creature gets +2/+2 until end of turn. -UDS U, 7ED U, DVD U - -Serra Angel -{3}{W}{W} -Creature - Angel -4/4 -Flying -Vigilance (Attacking doesn't cause this creature to tap.) -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 7ED R, 8ED R, 9ED R, 10E R, DVD R, M10 U, M11 U, ME4 U, COM U, M12 U - -Serra Angel Avatar -Vanguard -Hand +0, life -1 -Whenever you cast a spell, you gain 2 life. -VG S (x2) - -Serra Ascendant -{W} -Creature - Human Monk -1/1 -Lifelink (Damage dealt by this creature also causes you to gain that much life.) -As long as you have 30 or more life, Serra Ascendant gets +5/+5 and has flying. -M11 R - -Serra Avatar -{4}{W}{W}{W} -Creature - Avatar -*/* -Serra Avatar's power and toughness are each equal to your life total. -When Serra Avatar is put into a graveyard from anywhere, shuffle it into its owner's library. -USG R - -Serra Avenger -{W}{W} -Creature - Angel -3/3 -You can't cast Serra Avenger during your first, second, or third turns of the game. -Flying, vigilance -TSP R - -Serra Aviary -{3}{W} -World Enchantment -Creatures with flying get +1/+1. -HML R, ME4 U - -Serra Bestiary -{W}{W} -Enchantment - Aura -Enchant creature -At the beginning of your upkeep, sacrifice Serra Bestiary unless you pay {W}{W}. -Enchanted creature can't attack or block, and its activated abilities with {T} in their costs can't be activated. -HML C, 5ED U, ME4 C - -Serra Inquisitors -{4}{W} -Creature - Human Cleric -3/3 -Whenever Serra Inquisitors blocks or becomes blocked by one or more black creatures, Serra Inquisitors gets +2/+0 until end of turn. -HML U - -Serra Paladin -{2}{W}{W} -Creature - Human Knight -2/2 -{T}: Prevent the next 1 damage that would be dealt to target creature or player this turn. -{1}{W}{W}, {T}: Target creature gains vigilance until end of turn. -HML C, 5ED U - -Serra Sphinx -{3}{U}{U} -Creature - Sphinx -4/4 -Flying, vigilance -PLC R - -Serra Zealot -{W} -Creature - Human Soldier -1/1 -First strike -USG C - -Serra's Blessing -{1}{W} -Enchantment -Creatures you control have vigilance. (Attacking doesn't cause them to tap.) -WTH U, 6ED U, 9ED U - -Serra's Boon -{2}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+2 as long as it's white. Otherwise, it gets -2/-1. -PLC U, DVD U - -Serra's Embrace -{2}{W}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2 and has flying and vigilance. -USG U, 7ED U, 10E U, DVD U - -Serra's Hymn -{W} -Enchantment -At the beginning of your upkeep, you may put a verse counter on Serra's Hymn. -Sacrifice Serra's Hymn: Prevent the next X damage that would be dealt this turn to any number of target creatures and/or players, divided as you choose, where X is the number of verse counters on Serra's Hymn. -USG U - -Serra's Liturgy -{2}{W}{W} -Enchantment -At the beginning of your upkeep, you may put a verse counter on Serra's Liturgy. -{W}, Sacrifice Serra's Liturgy: Destroy up to X target artifacts and/or enchantments, where X is the number of verse counters on Serra's Liturgy. -USG R - -Serra's Sanctum -Legendary Land -{T}: Add {W} to your mana pool for each enchantment you control. -USG R - -Serrated Arrows -{4} -Artifact -Serrated Arrows enters the battlefield with three arrowhead counters on it. -At the beginning of your upkeep, if there are no arrowhead counters on Serrated Arrows, sacrifice it. -{T}, Remove an arrowhead counter from Serrated Arrows: Put a -1/-1 counter on target creature. -HML C, TSB S, GVL C - -Serrated Biskelion -{3} -Artifact Creature - Construct -2/2 -{T}: Put a -1/-1 counter on Serrated Biskelion and a -1/-1 counter on target creature. -WTH U, EVT U - -Serum Powder -{3} -Artifact -{T}: Add {1} to your mana pool. -Any time you could mulligan and Serum Powder is in your hand, you may exile all the cards from your hand, then draw that many cards. (You can do this in addition to taking mulligans.) -DST R - -Serum Raker -{2}{U}{U} -Creature - Drake -3/2 -Flying -When Serum Raker dies, each player discards a card. -MBS C - -Serum Tank -{3} -Artifact -Whenever Serum Tank or another artifact enters the battlefield, put a charge counter on Serum Tank. -{3}, {T}, Remove a charge counter from Serum Tank: Draw a card. -MRD U, HOP U - -Serum Visions -{U} -Sorcery -Draw a card. -Scry 2. (To scry 2, look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) -5DN C - -Servant of Volrath -{2}{B} -Creature - Minion -3/3 -When Servant of Volrath leaves the battlefield, sacrifice a creature. -TMP C - -Seshiro the Anointed -{4}{G}{G} -Legendary Creature - Snake Monk -3/4 -Other Snake creatures you control get +2/+2. -Whenever a Snake you control deals combat damage to a player, you may draw a card. -CHK R - -Seshiro the Anointed Avatar -Vanguard -Hand +0, life -1 -At the beginning of the game, choose a creature type. Creatures you control, creature spells you control, and creature cards you own in any zone other than the battlefield or the stack have the chosen type in addition to their other types. -VG S - -Seton's Desire -{2}{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2. -Threshold - As long as seven or more cards are in your graveyard, all creatures able to block enchanted creature do so. -ODY C - -Seton's Scout -{1}{G} -Creature - Centaur Druid Scout Archer -2/1 -Reach (This creature can block creatures with flying.) -Threshold - Seton's Scout gets +2/+2 as long as seven or more cards are in your graveyard. -TOR U - -Seton, Krosan Protector -{G}{G}{G} -Legendary Creature - Centaur Druid -2/2 -Tap an untapped Druid you control: Add {G} to your mana pool. -ODY R - -Sever Soul -{3}{B}{B} -Sorcery -Destroy target nonblack creature. It can't be regenerated. You gain life equal to its toughness. -MMQ C, 8ED U - -Severed Legion -{1}{B}{B} -Creature - Zombie -2/2 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -ONS C, 8ED C, 10E C - -Sewer Nemesis -{3}{B} -Creature - Horror -*/* -As Sewer Nemesis enters the battlefield, choose a player. -Sewer Nemesis's power and toughness are each equal to the number of cards in the chosen player's graveyard. -Whenever the chosen player casts a spell, that player puts the top card of his or her library into his or her graveyard. -COM R - -Sewer Rats -{B} -Creature - Rat -1/1 -{B}, Pay 1 life: Sewer Rats gets +1/+0 until end of turn. Activate this ability no more than three times each turn. -MIR C, BRB C - -Sewerdreg -{3}{B}{B} -Creature - Spirit -3/3 -Swampwalk -Sacrifice Sewerdreg: Exile target card from a graveyard. -RAV C - -Sewers of Estark -{2}{B}{B} -Instant -Choose target creature. If it's attacking, it's unblockable this turn. If it's blocking, prevent all combat damage that would be dealt this turn by it and each creature it's blocking. -PRO S - -Sewn-Eye Drake -{2}{U/R}{B} -Creature - Zombie Drake -3/1 -Flying, haste -ARB C - -Shackles -{2}{W} -Enchantment - Aura -Enchant creature -Enchanted creature doesn't untap during its controller's untap step. -{W}: Return Shackles to its owner's hand. -EXO C, INV C - -Shade of Trokair -{3}{W} -Creature - Shade -1/2 -{W}: Shade of Trokair gets +1/+1 until end of turn. -Suspend 3-{W} (Rather than cast this card from your hand, you may pay {W} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -PLC C - -Shade's Breath -{1}{B} -Instant -Until end of turn, each creature you control becomes a black Shade and gains "{B}: This creature gets +1/+1 until end of turn." -ONS U - -Shade's Form -{1}{B}{B} -Enchantment - Aura -Enchant creature -Enchanted creature has "{B}: This creature gets +1/+1 until end of turn." -When enchanted creature dies, return that card to the battlefield under your control. -TOR C - -Shadow Guildmage -{B} -Creature - Human Wizard -1/1 -{U}, {T}: Put target creature you control on top of its owner's library. -{R}, {T}: Shadow Guildmage deals 1 damage to target creature or player and 1 damage to you. -MIR C, TSB S - -Shadow Lance -{W} -Enchantment - Aura -Enchant creature -Enchanted creature has first strike. -{1}{B}: Enchanted creature gets +2/+2 until end of turn. -GPT U - -Shadow Rider -{2}{B}{B} -Creature - Zombie Knight -3/3 -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -WTH C - -Shadow Rift -{U} -Instant -Target creature gains shadow until end of turn. (It can block or be blocked by only creatures with shadow.) -Draw a card. -TMP C - -Shadow Sliver -{2}{U} -Creature - Sliver -1/1 -All Sliver creatures have shadow. (They can block or be blocked by only creatures with shadow.) -TSP C - -Shadow of Doubt -{U/B}{U/B} -Instant -({U/B} can be paid with either {U} or {B}.) -Players can't search libraries this turn. -Draw a card. -RAV R - -Shadowbane -{1}{W} -Instant -The next time a source of your choice would deal damage to you and/or creatures you control this turn, prevent that damage. If damage from a black source is prevented this way, you gain that much life. -MIR U - -Shadowblood Egg -{1} -Artifact -{2}, {T}, Sacrifice Shadowblood Egg: Add {B}{R} to your mana pool. Draw a card. -ODY U - -Shadowblood Ridge -Land -{1}, {T}: Add {B}{R} to your mana pool. -ODY R - -Shadowfeed -{B} -Instant -Exile target card from a graveyard. You gain 3 life. -ALA C - -Shadowmage Infiltrator -{1}{U}{B} -Creature - Human Wizard -1/3 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -Whenever Shadowmage Infiltrator deals combat damage to a player, you may draw a card. -ODY R, TSB S - -Shadowstorm -{R} -Sorcery -Shadowstorm deals 2 damage to each creature with shadow. -TMP U - -Shah of Naar Isle -{3}{R} -Creature - Efreet -6/6 -Trample -Echo {0} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -When Shah of Naar Isle's echo cost is paid, each opponent may draw up to three cards. -FUT R - -Shahrazad -{W}{W} -Sorcery -Players play a MAGIC subgame, using their libraries as their decks. Each player who doesn't win the subgame loses half his or her life, rounded up. -ARN R - -Shaleskin Bruiser -{6}{R} -Creature - Beast -4/4 -Trample -Whenever Shaleskin Bruiser attacks, it gets +3/+0 until end of turn for each other attacking Beast. -ONS U - -Shaleskin Plower -{3}{R} -Creature - Beast -3/2 -Morph {4}{R} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Shaleskin Plower is turned face up, destroy target land. -LGN C - -Shallow Grave -{1}{B} -Instant -Return the top creature card of your graveyard to the battlefield. That creature gains haste until end of turn. Exile it at the beginning of the next end step. -MIR R - -Shaman en-Kor -{1}{W} -Creature - Kor Shaman Cleric -1/2 -{0}: The next 1 damage that would be dealt to Shaman en-Kor this turn is dealt to target creature you control instead. -{1}{W}: The next time a source of your choice would deal damage to target creature this turn, that damage is dealt to Shaman en-Kor instead. -STH R - -Shaman's Trance -{2}{R} -Instant -Until end of turn, other players can't play cards from their graveyards, and you may play cards from other players' graveyards as though they were in your graveyard. -JUD R - -Shambling Remains -{1}{B}{R} -Creature - Zombie Horror -4/3 -Shambling Remains can't block. -Unearth {B}{R} ({B}{R}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) -CON U - -Shambling Shell -{1}{B}{G} -Creature - Plant Zombie -3/1 -Sacrifice Shambling Shell: Put a +1/+1 counter on target creature. -Dredge 3 (If you would draw a card, instead you may put exactly three cards from the top of your library into your graveyard. If you do, return this card from your graveyard to your hand. Otherwise, draw a card.) -RAV C - -Shambling Strider -{4}{G}{G} -Creature - Yeti -5/5 -{R}{G}: Shambling Strider gets +1/-1 until end of turn. -ICE C, BTD C, MED C - -Shambling Swarm -{1}{B}{B}{B} -Creature - Horror -3/3 -When Shambling Swarm dies, distribute three -1/-1 counters among one, two, or three target creatures. For each -1/-1 counter you put on a creature this way, remove a -1/-1 counter from that creature at the beginning of the next end step. -TOR R - -Shanodin Dryads -{G} -Creature - Dryad -1/1 -Forestwalk -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, 6ED C, 7ED C - -Shape Anew -{3}{U} -Sorcery -The controller of target artifact sacrifices it, then reveals cards from the top of his or her library until he or she reveals an artifact card. That player puts that card onto the battlefield, then shuffles all other cards revealed this way into his or her library. -SOM R - -Shape Stealer -{U}{U} -Creature - Shapeshifter Spirit -1/1 -Whenever Shape Stealer blocks or becomes blocked by a creature, change Shape Stealer's power and toughness to that creature's power and toughness until end of turn. -SOK U - -Shape of the Wiitigo -{3}{G}{G}{G} -Enchantment - Aura -Enchant creature -When Shape of the Wiitigo enters the battlefield, put six +1/+1 counters on enchanted creature. -At the beginning of your upkeep, put a +1/+1 counter on enchanted creature if it attacked or blocked since your last upkeep. Otherwise, remove a +1/+1 counter from it. -CSP R - -Shaper Guildmage -{U} -Creature - Human Wizard -1/1 -{W}, {T}: Target creature gains first strike until end of turn. -{B}, {T}: Target creature gets +1/+0 until end of turn. -MIR C - -Shaper Parasite -{1}{U}{U} -Creature - Illusion -2/3 -Morph {2}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Shaper Parasite is turned face up, target creature gets +2/-2 or -2/+2 until end of turn. -PLC C - -Shapesharer -{1}{U} -Creature - Shapeshifter -1/1 -Changeling (This card is every creature type at all times.) -{2}{U}: Target Shapeshifter becomes a copy of target creature until your next turn. -LRW R - -Shapeshifter -{6} -Artifact Creature - Shapeshifter -*/7-* -As Shapeshifter enters the battlefield, choose a number between 0 and 7. -At the beginning of your upkeep, you may choose a number between 0 and 7. -Shapeshifter's power is equal to the last chosen number and its toughness is equal to 7 minus that number. -ATQ R, 4ED U, 5ED U, ME4 U - -Shapeshifter's Marrow -{2}{U}{U} -Enchantment -At the beginning of each opponent's upkeep, that player reveals the top card of his or her library. If it's a creature card, the player puts the card into his or her graveyard and Shapeshifter's Marrow becomes a copy of that card. (If it does, it loses this ability.) -FUT R - -Shard Convergence -{3}{G} -Sorcery -Search your library for a Plains card, an Island card, a Swamp card, and a Mountain card. Reveal those cards and put them into your hand. Then shuffle your library. -CON U - -Shard Phoenix -{4}{R} -Creature - Phoenix -2/2 -Flying (This creature can't be blocked except by creatures with flying or reach.) -Sacrifice Shard Phoenix: Shard Phoenix deals 2 damage to each creature without flying. -{R}{R}{R}: Return Shard Phoenix from your graveyard to your hand. Activate this ability only during your upkeep. -STH R, 9ED R - -Shard Volley -{R} -Instant -As an additional cost to cast Shard Volley, sacrifice a land. -Shard Volley deals 3 damage to target creature or player. -MOR C - -Sharding Sphinx -{4}{U}{U} -Artifact Creature - Sphinx -4/4 -Flying -Whenever an artifact creature you control deals combat damage to a player, you may put a 1/1 blue Thopter artifact creature token with flying onto the battlefield. -ALA R - -Shared Animosity -{2}{R} -Enchantment -Whenever a creature you control attacks, it gets +1/+0 until end of turn for each other attacking creature that shares a creature type with it. -MOR R - -Shared Discovery -{U} -Sorcery -As an additional cost to cast Shared Discovery, tap four untapped creatures you control. -Draw three cards. -ROE C - -Shared Fate -{4}{U} -Enchantment -If a player would draw a card, that player exiles the top card of an opponent's library face down instead. -Each player may look at and play cards he or she exiled with Shared Fate. -MRD R - -Shared Trauma -{B} -Sorcery -Join forces - Starting with you, each player may pay any amount of mana. Each player puts the top X cards of his or her library into his or her graveyard, where X is the total amount of mana paid this way. -COM R - -Shared Triumph -{1}{W} -Enchantment -As Shared Triumph enters the battlefield, choose a creature type. -Creatures of the chosen type get +1/+1. -ONS R - -Sharuum the Hegemon -{3}{W}{U}{B} -Legendary Artifact Creature - Sphinx -5/5 -Flying -When Sharuum the Hegemon enters the battlefield, you may return target artifact card from your graveyard to the battlefield. -ALA M - -Shatter -{1}{R} -Instant -Destroy target artifact. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, ICE C, 5ED C, TMP C, 6ED C, 7ED C, 8ED C, MRD C, 9ED C, M10 C, SOM C - -Shattered Angel -{3}{W}{W} -Creature - Angel -3/3 -Flying -Whenever a land enters the battlefield under an opponent's control, you may gain 3 life. -NPH U, COM U - -Shattered Crypt -{X}{B}{B} -Sorcery -Return X target creature cards from your graveyard to your hand. You lose X life. -WTH C - -Shattered Dreams -{B} -Sorcery -Target opponent reveals his or her hand. You choose an artifact card from it. That player discards that card. -5DN U - -Shattering Pulse -{1}{R} -Instant -Buyback {3} (You may pay an additional {3} as you cast this spell. If you do, put this card into your hand as it resolves.) -Destroy target artifact. -EXO C - -Shattering Spree -{R} -Sorcery -Replicate {R} (When you cast this spell, copy it for each time you paid its replicate cost. You may choose new targets for the copies.) -Destroy target artifact. -GPT U - -Shatterskull Giant -{2}{R}{R} -Creature - Giant Warrior -4/3 -ZEN C - -Shatterstorm -{2}{R}{R} -Sorcery -Destroy all artifacts. They can't be regenerated. -ATQ R, 3ED U, 5ED U, 6ED R, 10E U - -Shauku's Minion -{1}{B}{R} -Creature - Human Minion -2/2 -{B}{R}, {T}: Shauku's Minion deals 2 damage to target white creature. -MIR U - -Shauku, Endbringer -{5}{B}{B} -Legendary Creature - Vampire -5/5 -Flying -Shauku, Endbringer can't attack if there's another creature on the battlefield. -At the beginning of your upkeep, you lose 3 life. -{T}: Exile target creature and put a +1/+1 counter on Shauku. -MIR R - -Shelkin Brownie -{1}{G} -Creature - Ouphe -1/1 -{T}: Target creature loses all "bands with other" abilities until end of turn. -LEG C - -Shell Skulkin -{4} -Artifact Creature - Scarecrow -3/2 -{3}: Target blue creature gains shroud until end of turn. -EVE C - -Shell of the Last Kappa -{3} -Legendary Artifact -{3}, {T}: Exile target instant or sorcery spell that targets you. (The spell has no effect.) -{3}, {T}, Sacrifice Shell of the Last Kappa: You may cast a card exiled with Shell of the Last Kappa without paying its mana cost. -CHK R - -Shelldock Isle -Land -Hideaway (This land enters the battlefield tapped. When it does, look at the top four cards of your library, exile one face down, then put the rest on the bottom of your library.) -{T}: Add {U} to your mana pool. -{U}, {T}: You may play the exiled card without paying its mana cost if a library has twenty or fewer cards in it. -LRW R - -Shelter -{1}{W} -Instant -Target creature you control gains protection from the color of your choice until end of turn. -Draw a card. -ODY C - -Sheltered Valley -Land -If Sheltered Valley would enter the battlefield, instead sacrifice each other permanent named Sheltered Valley you control, then put Sheltered Valley onto the battlefield. -At the beginning of your upkeep, if you control three or fewer lands, you gain 1 life. -{T}: Add {1} to your mana pool. -ALL R - -Sheltering Ancient -{1}{G} -Creature - Treefolk -5/5 -Trample -Cumulative upkeep-Put a +1/+1 counter on a creature an opponent controls. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -CSP U - -Sheltering Prayers -{W} -Enchantment -Basic lands each player controls have shroud as long as that player controls three or fewer lands. (They can't be the targets of spells or abilities.) -PCY R - -Sheoldred, Whispering One -{5}{B}{B} -Legendary Creature - Praetor -6/6 -Swampwalk -At the beginning of your upkeep, return target creature card from your graveyard to the battlefield. -At the beginning of each opponent's upkeep, that player sacrifices a creature. -NPH M - -Shepherd of Rot -{1}{B} -Creature - Zombie Cleric -1/1 -{T}: Each player loses 1 life for each Zombie on the battlefield. -ONS C, HOP C - -Shepherd of the Lost -{4}{W} -Creature - Angel -3/3 -Flying, first strike, vigilance -ZEN U - -Shield Bearer -{1}{W} -Creature - Human Soldier -0/3 -Banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -ICE C, 5ED C, ME2 C - -Shield Dancer -{2}{W} -Creature - Human Rebel -1/3 -{2}{W}: The next time target attacking creature would deal combat damage to Shield Dancer this turn, that creature deals that damage to itself instead. -PCY U - -Shield Mate -{W} -Creature - Human Soldier -1/1 -Sacrifice Shield Mate: Target creature gets +0/+4 until end of turn. -EXO C - -Shield Sphere -{0} -Artifact Creature - Wall -0/6 -Defender -Whenever Shield Sphere blocks, put a -0/-1 counter on it. -ALL U, MED C - -Shield Wall -{1}{W} -Instant -Creatures you control get +0/+2 until end of turn. -LEG U, CHR U, 5ED C, 7ED C - -Shield of Duty and Reason -{W} -Enchantment - Aura -Enchant creature -Enchanted creature has protection from green and from blue. -APC C - -Shield of Kaldra -{4} -Legendary Artifact - Equipment -Equipment named Sword of Kaldra, Shield of Kaldra, and Helm of Kaldra are indestructible. -Equipped creature is indestructible. ("Destroy" effects and lethal damage don't destroy it.) -Equip {4} - S, DST R - -Shield of the Ages -{2} -Artifact -{2}: Prevent the next 1 damage that would be dealt to you this turn. -ICE U, MED U - -Shield of the Oversoul -{2}{G/W} -Enchantment - Aura -Enchant creature -As long as enchanted creature is green, it gets +1/+1 and is indestructible. (Lethal damage and effects that say "destroy" don't destroy it. If its toughness is 0 or less, it's still put into its owner's graveyard.) -As long as enchanted creature is white, it gets +1/+1 and has flying. -SHM C - -Shield of the Righteous -{W}{U} -Artifact - Equipment -Equipped creature gets +0/+2 and has vigilance. -Whenever equipped creature blocks a creature, that creature doesn't untap during its controller's next untap step. -Equip {2} -ARB U - -Shielding Plax -{2}{G/U} -Enchantment - Aura -({G/U} can be paid with either {G} or {U}.) -Enchant creature -When Shielding Plax enters the battlefield, draw a card. -Enchanted creature can't be the target of spells or abilities your opponents control. -DIS C - -Shieldmage Advocate -{2}{W} -Creature - Human Cleric -1/3 -{T}: Return target card from an opponent's graveyard to his or her hand. Prevent all damage that would be dealt to target creature or player this turn by a source of your choice. -JUD C - -Shieldmage Elder -{5}{W} -Creature - Human Cleric Wizard -2/3 -Tap two untapped Clerics you control: Prevent all damage target creature would deal this turn. -Tap two untapped Wizards you control: Prevent all damage target spell would deal this turn. -ONS U - -Shieldmate's Blessing -{W} -Instant -Prevent the next 3 damage that would be dealt to target creature or player this turn. -ZEN C - -Shields of Velis Vel -{W} -Tribal Instant - Shapeshifter -Changeling (This card is every creature type at all times.) -Creatures target player controls get +0/+1 and gain all creature types until end of turn. -LRW C - -Shifting Borders -{3}{U} -Instant - Arcane -Exchange control of two target lands. -Splice onto Arcane {3}{U} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -SOK U - -Shifting Sky -{2}{U} -Enchantment -As Shifting Sky enters the battlefield, choose a color. -All nonland permanents are the chosen color. -PLS U, 8ED R - -Shifting Sliver -{3}{U} -Creature - Sliver -2/2 -Slivers can't be blocked except by Slivers. -LGN U - -Shifting Wall -{X} -Artifact Creature - Wall -0/0 -Defender (This creature can't attack.) -Shifting Wall enters the battlefield with X +1/+1 counters on it. -STH U - -Shifty Doppelganger -{2}{U} -Creature - Shapeshifter -1/1 -{3}{U}, Exile Shifty Doppelganger: You may put a creature card from your hand onto the battlefield. If you do, that creature gains haste until end of turn. At the beginning of the next end step, sacrifice that creature. If you do, return Shifty Doppelganger to the battlefield. -ODY R - -Shimatsu the Bloodcloaked -{3}{R} -Legendary Creature - Demon Spirit -0/0 -As Shimatsu the Bloodcloaked enters the battlefield, sacrifice any number of permanents. Shimatsu enters the battlefield with that many +1/+1 counters on it. -CHK R - -Shimian Night Stalker -{3}{B}{B} -Creature - Nightstalker -4/4 -{B}, {T}: All damage that would be dealt to you this turn by target attacking creature is dealt to Shimian Night Stalker instead. -LEG U, CHR U - -Shimian Specter -{2}{B}{B} -Creature - Specter -2/2 -Flying -Whenever Shimian Specter deals combat damage to a player, that player reveals his or her hand. You choose a nonland card from it. Search that player's graveyard, hand, and library for all cards with the same name as that card and exile them. Then that player shuffles his or her library. -FUT R - -Shimmer -{2}{U}{U} -Enchantment -As Shimmer enters the battlefield, choose a land type. -Each land of the chosen type has phasing. (It phases in or out before its controller untaps during each of his or her untap steps. While it's phased out, it's treated as though it doesn't exist.) -MIR R - -Shimmer Myr -{3} -Artifact Creature - Myr -2/2 -Flash -You may cast artifact cards as though they had flash. -MBS R - -Shimmering Barrier -{1}{W} -Creature - Wall -1/3 -Defender (This creature can't attack.) -First strike -Cycling {2} ({2}, Discard this card: Draw a card.) -USG U - -Shimmering Efreet -{2}{U} -Creature - Efreet -2/2 -Flying -Phasing (This phases in or out before you untap during each of your untap steps. While it's phased out, it's treated as though it doesn't exist.) -Whenever Shimmering Efreet phases in, target creature phases out. (It phases in before its controller untaps during his or her next untap step.) -VIS U - -Shimmering Glasskite -{3}{U} -Creature - Spirit -2/3 -Flying -Whenever Shimmering Glasskite becomes the target of a spell or ability for the first time in a turn, counter that spell or ability. -BOK C - -Shimmering Grotto -Land -{T}: Add {1} to your mana pool. -{1}, {T}: Add one mana of any color to your mana pool. -LRW C - -Shimmering Mirage -{1}{U} -Instant -Target land becomes the basic land type of your choice until end of turn. -Draw a card. -APC C - -Shimmering Wings -{U} -Enchantment - Aura -Enchant creature (Target a creature as you cast this. This card enters the battlefield attached to that creature.) -Enchanted creature has flying. (It can't be blocked except by creatures with flying or reach.) -{U}: Return Shimmering Wings to its owner's hand. -TMP C, INV C, 10E C - -Shinen of Fear's Chill -{4}{B} -Creature - Spirit -3/2 -Shinen of Fear's Chill can't block. -Channel - {1}{B}, Discard Shinen of Fear's Chill: Target creature can't block this turn. -SOK C - -Shinen of Flight's Wings -{4}{U} -Creature - Spirit -3/3 -Flying -Channel - {U}, Discard Shinen of Flight's Wings: Target creature gains flying until end of turn. -SOK C - -Shinen of Fury's Fire -{2}{R} -Creature - Spirit -2/1 -Haste -Channel - {R}, Discard Shinen of Fury's Fire: Target creature gains haste until end of turn. -SOK C - -Shinen of Life's Roar -{1}{G} -Creature - Spirit -1/2 -All creatures able to block Shinen of Life's Roar do so. -Channel - {2}{G}{G}, Discard Shinen of Life's Roar: All creatures able to block target creature this turn do so. -SOK C, ARC C - -Shinen of Stars' Light -{2}{W} -Creature - Spirit -2/1 -First strike -Channel - {1}{W}, Discard Shinen of Stars' Light: Target creature gains first strike until end of turn. -SOK C - -Shinewend -{1}{W} -Creature - Elemental -0/0 -Flying -Shinewend enters the battlefield with a +1/+1 counter on it. -{1}{W}, Remove a +1/+1 counter from Shinewend: Destroy target enchantment. -MOR C - -Shining Shoal -{X}{W}{W} -Instant - Arcane -You may exile a white card with converted mana cost X from your hand rather than pay Shining Shoal's mana cost. -The next X damage that a source of your choice would deal to you and/or creatures you control this turn is dealt to target creature or player instead. -BOK R - -Shinka Gatekeeper -{2}{R} -Creature - Ogre Warrior -3/2 -Whenever Shinka Gatekeeper is dealt damage, it deals that much damage to you. -BOK C - -Shinka, the Bloodsoaked Keep -Legendary Land -{T}: Add {R} to your mana pool. -{R}, {T}: Target legendary creature gains first strike until end of turn. -CHK R - -Shirei, Shizo's Caretaker -{4}{B} -Legendary Creature - Spirit -2/2 -Whenever a creature with power 1 or less is put into your graveyard from the battlefield, you may return that card to the battlefield under your control at the beginning of the next end step if Shirei, Shizo's Caretaker is still on the battlefield. -BOK R - -Shisato, Whispering Hunter -{3}{G} -Legendary Creature - Snake Warrior -2/2 -At the beginning of your upkeep, sacrifice a Snake. -Whenever Shisato, Whispering Hunter deals combat damage to a player, that player skips his or her next untap step. -CHK R - -Shiv -Plane - Dominaria -All creatures have "{R}: This creature gets +1/+0 until end of turn." -Whenever you roll {C}, put a 5/5 red Dragon creature token with flying onto the battlefield. -HOP C - -Shiv's Embrace -{2}{R}{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2 and has flying. -{R}: Enchanted creature gets +1/+0 until end of turn. -USG U, M11 U, DDG U - -Shivan Dragon -{4}{R}{R} -Creature - Dragon -5/5 -Flying -{R}: Shivan Dragon gets +1/+0 until end of turn. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, BTD R, 7ED R, 8ED R, 9ED R, 10E R, FVD R, M10 R, ME4 R - -Shivan Emissary -{2}{R} -Creature - Human Wizard -1/1 -Kicker {1}{B} (You may pay an additional {1}{B} as you cast this spell.) -When Shivan Emissary enters the battlefield, if it was kicked, destroy target nonblack creature. It can't be regenerated. -INV U - -Shivan Gorge -Legendary Land -{T}: Add {1} to your mana pool. -{2}{R}, {T}: Shivan Gorge deals 1 damage to each opponent. -USG R - -Shivan Harvest -{1}{R} -Enchantment -{1}{R}, Sacrifice a creature: Destroy target nonbasic land. -INV U - -Shivan Hellkite -{5}{R}{R} -Creature - Dragon -5/5 -Flying (This creature can't be blocked except by creatures with flying or reach.) -{1}{R}: Shivan Hellkite deals 1 damage to target creature or player. -USG R, 10E R, DDG R - -Shivan Meteor -{3}{R}{R} -Sorcery -Shivan Meteor deals 13 damage to target creature. -Suspend 2-{1}{R}{R} (Rather than cast this card from your hand, you may pay {1}{R}{R} and exile it with two time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) -PLC U - -Shivan Oasis -Land -Shivan Oasis enters the battlefield tapped. -{T}: Add {R} or {G} to your mana pool. -INV U, 8ED U, HOP U, PVC U - -Shivan Phoenix -{4}{R}{R} -Creature - Phoenix -3/4 -Flying -When Shivan Phoenix dies, return Shivan Phoenix to its owner's hand. -ULG R - -Shivan Raptor -{2}{R} -Creature - Lizard -3/1 -First strike, haste -Echo {2}{R} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -USG U - -Shivan Reef -Land -{T}: Add {1} to your mana pool. -{T}: Add {U} or {R} to your mana pool. Shivan Reef deals 1 damage to you. -APC R, 9ED R, 10E R - -Shivan Sand-Mage -{2}{R}{R} -Creature - Viashino Shaman -3/2 -When Shivan Sand-Mage enters the battlefield, choose one - Remove two time counters from target permanent or suspended card; or put two time counters on target permanent with a time counter on it or suspended card. -Suspend 4-{R} (Rather than cast this card from your hand, you may pay {R} and exile it with four time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -FUT U - -Shivan Wumpus -{3}{R} -Creature - Beast -6/6 -Trample -When Shivan Wumpus enters the battlefield, any player may sacrifice a land. If a player does, put Shivan Wumpus on top of its owner's library. -PLC R - -Shivan Wurm -{3}{R}{G} -Creature - Wurm -7/7 -Trample -When Shivan Wurm enters the battlefield, return a red or green creature you control to its owner's hand. -PLS R - -Shivan Zombie -{B}{R} -Creature - Barbarian Zombie -2/2 -Protection from white -INV C - -Shizo, Death's Storehouse -Legendary Land -{T}: Add {B} to your mana pool. -{B}, {T}: Target legendary creature gains fear until end of turn. (It can't be blocked except by artifact creatures and/or black creatures.) -CHK R - -Shizuko, Caller of Autumn -{1}{G}{G} -Legendary Creature - Snake Shaman -2/3 -At the beginning of each player's upkeep, that player adds {G}{G}{G} to his or her mana pool. Until end of turn, this mana doesn't empty from that player's mana pool as steps and phases end. -BOK R - -Shoal Serpent -{5}{U} -Creature - Serpent -5/5 -Defender -Landfall - Whenever a land enters the battlefield under your control, Shoal Serpent loses defender until end of turn. -ZEN C - -Shock -{R} -Instant -Shock deals 2 damage to target creature or player. -STH C, 6ED C, S00 C, BTD C, 7ED C, ONS C, 8ED C, 9ED C, 10E C, M12 C - -Shock Troops -{3}{R} -Creature - Human Soldier -2/2 -Sacrifice Shock Troops: Shock Troops deals 2 damage to target creature or player. -MMQ C, 8ED C - -Shocker -{1}{R} -Creature - Insect -1/1 -Whenever Shocker deals damage to a player, that player discards all the cards in his or her hand, then draws that many cards. -TMP R - -Shore Snapper -{2}{B} -Creature - Beast -2/2 -{U}: Shore Snapper gains islandwalk until end of turn. -ALA C - -Shorecrasher Mimic -{1}{G/U} -Creature - Shapeshifter -2/1 -Whenever you cast a spell that's both green and blue, Shorecrasher Mimic becomes 5/3 and gains trample until end of turn. -EVE C - -Shoreline Raider -{2}{U} -Creature - Merfolk -2/2 -Protection from Kavu -INV C - -Shoreline Ranger -{5}{U} -Creature - Bird Soldier -3/4 -Flying -Islandcycling {2} ({2}, Discard this card: Search your library for an Island card, reveal it, and put it into your hand. Then shuffle your library.) -SCG C - -Shoreline Salvager -{3}{B} -Creature - Surrakar -3/3 -Whenever Shoreline Salvager deals combat damage to a player, if you control an Island, you may draw a card. -WWK U - -Shoving Match -{2}{U} -Instant -Until end of turn, all creatures gain "{T}: Tap target creature." -MMQ U - -Show and Tell -{2}{U} -Sorcery -Each player may put an artifact, creature, enchantment, or land card from his or her hand onto the battlefield. -USG R - -Shower of Coals -{3}{R}{R} -Sorcery -Shower of Coals deals 2 damage to each of up to three target creatures and/or players. -Threshold - Shower of Coals deals 4 damage to each of those creatures and/or players instead if seven or more cards are in your graveyard. -ODY U - -Shower of Sparks -{R} -Instant -Shower of Sparks deals 1 damage to target creature and 1 damage to target player. -USG C, BRB C - -Shrapnel Blast -{1}{R} -Instant -As an additional cost to cast Shrapnel Blast, sacrifice an artifact. -Shrapnel Blast deals 5 damage to target creature or player. -MRD U - -Shred Memory -{1}{B} -Instant -Exile up to four target cards from a single graveyard. -Transmute {1}{B}{B} ({1}{B}{B}, Discard this card: Search your library for a card with the same converted mana cost as this card, reveal it, and put it into your hand. Then shuffle your library. Transmute only as a sorcery.) -RAV C - -Shrewd Hatchling -{3}{U/R} -Creature - Elemental -6/6 -Shrewd Hatchling enters the battlefield with four -1/-1 counters on it. -{U/R}: Target creature can't block Shrewd Hatchling this turn. -Whenever you cast a blue spell, remove a -1/-1 counter from Shrewd Hatchling. -Whenever you cast a red spell, remove a -1/-1 counter from Shrewd Hatchling. -EVE U - -Shriek Raptor -{3}{W}{W} -Creature - Bird -2/3 -Flying -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -NPH C - -Shriek of Dread -{1}{B} -Instant -Target creature gains fear until end of turn. (It can't be blocked except by artifact creatures and/or black creatures.) -PLS C - -Shriekhorn -{1} -Artifact -Shriekhorn enters the battlefield with three charge counters on it. -{T}, Remove a charge counter from Shriekhorn: Target player puts the top two cards of his or her library into his or her graveyard. -MBS C - -Shrieking Drake -{U} -Creature - Drake -1/1 -Flying -When Shrieking Drake enters the battlefield, return a creature you control to its owner's hand. -VIS C - -Shrieking Grotesque -{2}{W} -Creature - Gargoyle -2/1 -Flying -When Shrieking Grotesque enters the battlefield, if {B} was spent to cast Shrieking Grotesque, target player discards a card. -GPT C - -Shrieking Mogg -{1}{R} -Creature - Goblin -1/1 -Haste -When Shrieking Mogg enters the battlefield, tap all other creatures. -NEM R - -Shrieking Specter -{5}{B} -Creature - Specter -2/2 -Flying -Whenever Shrieking Specter attacks, defending player discards a card. -S99 U - -Shriekmaw -{4}{B} -Creature - Elemental -3/2 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -When Shriekmaw enters the battlefield, destroy target nonartifact, nonblack creature. -Evoke {1}{B} (You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield.) -LRW U, ARC U, COM U - -Shrine of Boundless Growth -{3} -Artifact -At the beginning of your upkeep or whenever you cast a green spell, put a charge counter on Shrine of Boundless Growth. -{T}, Sacrifice Shrine of Boundless Growth: Add {1} to your mana pool for each charge counter on Shrine of Boundless Growth. -NPH U - -Shrine of Burning Rage -{2} -Artifact -At the beginning of your upkeep or whenever you cast a red spell, put a charge counter on Shrine of Burning Rage. -{3}, {T}, Sacrifice Shrine of Burning Rage: Shrine of Burning Rage deals damage equal to the number of charge counters on it to target creature or player. -NPH U - -Shrine of Limitless Power -{3} -Artifact -At the beginning of your upkeep or whenever you cast a black spell, put a charge counter on Shrine of Limitless Power. -{4}, {T}, Sacrifice Shrine of Limitless Power: Target player discards a card for each charge counter on Shrine of Limitless Power. -NPH U - -Shrine of Loyal Legions -{2} -Artifact -At the beginning of your upkeep or whenever you cast a white spell, put a charge counter on Shrine of Loyal Legions. -{3}, {T}, Sacrifice Shrine of Loyal Legions: Put a 1/1 colorless Myr artifact creature token onto the battlefield for each charge counter on Shrine of Loyal Legions. -NPH U - -Shrine of Piercing Vision -{2} -Artifact -At the beginning of your upkeep or whenever you cast a blue spell, put a charge counter on Shrine of Piercing Vision. -{T}, Sacrifice Shrine of Piercing Vision: Look at the top X cards of your library, where X is the number of charge counters on Shrine of Piercing Vision. Put one of those cards into your hand and the rest on the bottom of your library in any order. -NPH U - -Shrink -{G} -Instant -Target creature gets -5/-0 until end of turn. -HML C (x2), 5ED C, ME2 C - -Shrivel -{1}{B} -Sorcery -All creatures get -1/-1 until end of turn. -ROE C - -Shriveling Rot -{2}{B}{B} -Instant -Choose one - Until end of turn, whenever a creature is dealt damage, destroy it; or until end of turn, whenever a creature dies, that creature's controller loses life equal to its toughness. -Entwine {2}{B} (Choose both if you pay the entwine cost.) -DST R - -Shrouded Lore -{B} -Sorcery -Target opponent chooses a card in your graveyard. You may pay {B}. If you do, repeat this process except that opponent can't choose a card already chosen for Shrouded Lore. Then put the last chosen card into your hand. -PLC U - -Shrouded Serpent -{4}{U}{U}{U} -Creature - Serpent -4/4 -Whenever Shrouded Serpent attacks, defending player may pay {4}. If he or she doesn't, Shrouded Serpent is unblockable this turn. -PCY R - -Shu Cavalry -{2}{W} -Creature - Human Soldier -2/2 -Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -PTK C, ME3 C - -Shu Defender -{2}{W} -Creature - Human Soldier -2/2 -Whenever Shu Defender blocks, it gets +0/+2 until end of turn. -PTK C - -Shu Elite Companions -{4}{W} -Creature - Human Soldier -3/3 -Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -PTK U, ME3 C - -Shu Elite Infantry -{3}{W} -Creature - Human Soldier -3/3 -PTK C - -Shu Farmer -{1}{W} -Creature - Human -1/1 -{T}: You gain 1 life. Activate this ability only during your turn, before attackers are declared. -PTK C - -Shu Foot Soldiers -{2}{W} -Creature - Human Soldier -2/3 -PTK C - -Shu General -{3}{W} -Creature - Human Soldier -2/2 -Vigilance; horsemanship (This creature can't be blocked except by creatures with horsemanship.) -PTK U, ME3 C - -Shu Grain Caravan -{2}{W} -Creature - Human Soldier -2/2 -When Shu Grain Caravan enters the battlefield, you gain 2 life. -PTK C - -Shu Soldier-Farmers -{4}{W} -Creature - Human Soldier -2/4 -When Shu Soldier-Farmers enters the battlefield, you gain 4 life. -PTK U, ME3 C - -Shuko -{1} -Artifact - Equipment -Equipped creature gets +1/+0. -Equip {0} ({0}: Attach to target creature you control. Equip only as a sorcery.) -BOK U - -Shunt -{1}{R}{R} -Instant -Change the target of target spell with a single target. -DST R, 10E R - -Shuriken -{1} -Artifact - Equipment -Equipped creature has "{T}, Unattach Shuriken: Shuriken deals 2 damage to target creature. That creature's controller gains control of Shuriken unless it was unattached from a Ninja." -Equip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) -BOK U - -Shyft -{4}{U} -Creature - Shapeshifter -4/2 -At the beginning of your upkeep, you may have Shyft become the color or colors of your choice. (This effect lasts indefinitely.) -ICE R, ME2 C - -Sibilant Spirit -{5}{U} -Creature - Spirit -5/6 -Flying -Whenever Sibilant Spirit attacks, defending player may draw a card. -ICE R, 5ED R, 6ED R, ME2 R - -Sick and Tired -{2}{B} -Instant -Two target creatures each get -1/-1 until end of turn. -ULG C - -Sicken -{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets -1/-1. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG C - -Sickening Dreams -{1}{B} -Sorcery -As an additional cost to cast Sickening Dreams, discard X cards. -Sickening Dreams deals X damage to each creature and each player. -TOR U - -Sickening Shoal -{X}{B}{B} -Instant - Arcane -You may exile a black card with converted mana cost X from your hand rather than pay Sickening Shoal's mana cost. -Target creature gets -X/-X until end of turn. -BOK R - -Sickle Ripper -{1}{B} -Creature - Elemental Warrior -2/1 -Wither (This deals damage to creatures in the form of -1/-1 counters.) -SHM C - -Sickleslicer -{3} -Artifact - Equipment -Living weapon (When this Equipment enters the battlefield, put a 0/0 black Germ creature token onto the battlefield, then attach this to it.) -Equipped creature gets +2/+2. -Equip {4} -NPH U - -Sidar Jabari -{3}{W} -Legendary Creature - Human Knight -2/2 -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -Whenever Sidar Jabari attacks, tap target creature defending player controls. -MIR R - -Sidar Kondo -Vanguard -Hand -1, life +12 -{3}: Target creature gets +3/+3 until end of turn. -VG S - -Sideswipe -{1}{R} -Instant -You may change any targets of target Arcane spell. -CHK U - -Sidewinder Sliver -{W} -Creature - Sliver -1/1 -All Sliver creatures have flanking. (Whenever a creature without flanking blocks a Sliver, the blocking creature gets -1/-1 until end of turn.) -TSP C - -Siege Mastodon -{4}{W} -Creature - Elephant -3/5 -M10 C, M11 C, M12 C - -Siege Wurm -{5}{G}{G} -Creature - Wurm -5/5 -Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.) -Trample -RAV C - -Siege of Towers -{1}{R} -Sorcery -Replicate {1}{R} (When you cast this spell, copy it for each time you paid its replicate cost. You may choose new targets for the copies.) -Target Mountain becomes a 3/1 creature. It's still a land. -GPT R - -Siege-Gang Commander -{3}{R}{R} -Creature - Goblin -2/2 -When Siege-Gang Commander enters the battlefield, put three 1/1 red Goblin creature tokens onto the battlefield. -{1}{R}, Sacrifice a Goblin: Siege-Gang Commander deals 2 damage to target creature or player. -SCG R, 10E R, EVG R, M10 R - -Sift -{3}{U} -Sorcery -Draw three cards, then discard a card. -STH C, 9ED C, 10E C - -Sift Through Sands -{1}{U}{U} -Instant - Arcane -Draw two cards, then discard a card. -If you've cast a spell named Peer Through Depths and a spell named Reach Through Mists this turn, you may search your library for a card named The Unspeakable, put it onto the battlefield, then shuffle your library. -CHK C - -Sighted-Caste Sorcerer -{1}{W} -Creature - Human Wizard -1/1 -Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.) -{U}: Sighted-Caste Sorcerer gains shroud until end of turn. (It can't be the target of spells or abilities.) -ALA C - -Sigil Blessing -{G}{W} -Instant -Until end of turn, target creature you control gets +3/+3 and other creatures you control get +1/+1. -ALA C, DDG C - -Sigil Captain -{1}{G}{W}{W} -Creature - Rhino Soldier -3/3 -Whenever a creature enters the battlefield under your control, if that creature is 1/1, put two +1/+1 counters on it. -ARB U, COM U - -Sigil Tracer -{1}{U}{U} -Creature - Merfolk Wizard -2/2 -{1}{U}, Tap two untapped Wizards you control: Copy target instant or sorcery spell. You may choose new targets for the copy. -MOR R - -Sigil of Distinction -{X} -Artifact - Equipment -Sigil of Distinction enters the battlefield with X charge counters on it. -Equipped creature gets +1/+1 for each charge counter on Sigil of Distinction. -Equip-Remove a charge counter from Sigil of Distinction. -ALA R - -Sigil of Sleep -{U} -Enchantment - Aura -Enchant creature -Whenever enchanted creature deals damage to a player, return target creature that player controls to its owner's hand. -UDS C - -Sigil of the Empty Throne -{3}{W}{W} -Enchantment -Whenever you cast an enchantment spell, put a 4/4 white Angel creature token with flying onto the battlefield. -CON R - -Sigil of the Nayan Gods -{1}{G}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+1 for each creature you control. -Cycling {G/W} ({G/W}, Discard this card: Draw a card.) -ARB C - -Sigil of the New Dawn -{3}{W} -Enchantment -Whenever a creature is put into your graveyard from the battlefield, you may pay {1}{W}. If you do, return that card to your hand. -ONS R - -Sigiled Behemoth -{4}{G}{W} -Creature - Beast -5/4 -Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.) -ARB C - -Sigiled Paladin -{W}{W} -Creature - Human Knight -2/2 -First strike -Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.) -ALA U - -Sign in Blood -{B}{B} -Sorcery -Target player draws two cards and loses 2 life. -M10 C, GVL C, ARC C, M11 C, COM C - -Signal Pest -{1} -Artifact Creature - Pest -0/1 -Battle cry (Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn.) -Signal Pest can't be blocked except by creatures with flying or reach. -MBS U - -Silence -{W} -Instant -Your opponents can't cast spells this turn. (Spells cast before this resolves are unaffected.) -M10 R, M11 R - -Silent Arbiter -{4} -Artifact Creature - Construct -1/5 -No more than one creature can attack each combat. -No more than one creature can block each combat. -5DN R - -Silent Assassin -{B}{B} -Creature - Human Mercenary Assassin -2/1 -{3}{B}: Destroy target blocking creature at end of combat. -MMQ R - -Silent Attendant -{2}{W} -Creature - Human Cleric -0/2 -{T}: You gain 1 life. -USG C - -Silent Specter -{4}{B}{B} -Creature - Specter -4/4 -Flying -Whenever Silent Specter deals combat damage to a player, that player discards two cards. -Morph {3}{B}{B} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -PRO R, ONS R - -Silent-Chant Zubera -{1}{W} -Creature - Zubera Spirit -1/2 -When Silent-Chant Zubera dies, you gain 2 life for each Zubera that died this turn. -CHK C - -Silhana Ledgewalker -{1}{G} -Creature - Elf Rogue -1/1 -Hexproof (This creature can't be the target of spells or abilities your opponents control.) -Silhana Ledgewalker can't be blocked except by creatures with flying. -GPT C - -Silhana Starfletcher -{2}{G} -Creature - Elf Druid Archer -1/3 -Reach (This creature can block creatures with flying.) -As Silhana Starfletcher enters the battlefield, choose a color. -{T}: Add one mana of the chosen color to your mana pool. -GPT C - -Silhouette -{1}{U} -Instant -Prevent all damage that would be dealt to target creature this turn by spells or abilities that target it. -LEG U - -Silk Net -{G} -Instant -Target creature gets +1/+1 and gains reach until end of turn. (It can block creatures with flying.) -ULG C - -Silkbind Faerie -{2}{W/U} -Creature - Faerie Rogue -1/3 -Flying -{1}{W/U}, {Q}: Tap target creature. ({Q} is the untap symbol.) -SHM C - -Silkenfist Fighter -{1}{W} -Creature - Kor Soldier -1/3 -Whenever Silkenfist Fighter becomes blocked, untap it. -NEM C - -Silkenfist Order -{3}{W}{W} -Creature - Kor Soldier -3/5 -Whenever Silkenfist Order becomes blocked, untap it. -NEM U - -Silklash Spider -{3}{G}{G} -Creature - Spider -2/7 -Reach (This creature can block creatures with flying.) -{X}{G}{G}: Silklash Spider deals X damage to each creature with flying. -ONS R, 9ED R - -Silkwing Scout -{2}{U} -Creature - Faerie Scout -2/1 -Flying -{G}, Sacrifice Silkwing Scout: Search your library for a basic land card and put that card onto the battlefield tapped. Then shuffle your library. -DIS C - -Silt Crawler -{2}{G} -Creature - Beast -3/3 -When Silt Crawler enters the battlefield, tap all lands you control. -PCY C - -Silver Drake -{1}{W}{U} -Creature - Drake -3/3 -Flying -When Silver Drake enters the battlefield, return a white or blue creature you control to its owner's hand. -PLS C - -Silver Erne -{3}{U} -Creature - Bird -2/2 -Flying, trample -ICE U - -Silver Knight -{W}{W} -Creature - Human Knight -2/2 -First strike, protection from red -SCG U, DDG U - -Silver Myr -{2} -Artifact Creature - Myr -1/1 -{T}: Add {U} to your mana pool. -MRD C, HOP C, EVT C, SOM C - -Silver Seraph -{5}{W}{W}{W} -Creature - Angel -6/6 -Flying -Threshold - Other creatures you control get +2/+2 as long as seven or more cards are in your graveyard. -JUD R - -Silver Wyvern -{3}{U}{U} -Creature - Drake -4/3 -Flying -{U}: Change the target of target spell or ability that targets only Silver Wyvern. The new target must be a creature. -STH R - -Silverback Ape -{3}{G}{G} -Creature - Ape -5/5 -S99 U, 8ED U - -Silvercoat Lion -{1}{W} -Creature - Cat -2/2 -M10 C, M11 C - -Silvergill Adept -{1}{U} -Creature - Merfolk Wizard -2/1 -As an additional cost to cast Silvergill Adept, reveal a Merfolk card from your hand or pay {3}. -When Silvergill Adept enters the battlefield, draw a card. -LRW U - -Silvergill Douser -{1}{U} -Creature - Merfolk Wizard -1/1 -{T}: Target creature gets -X/-0 until end of turn, where X is the number of Merfolk and/or Faeries you control. -LRW C - -Silverglade Elemental -{4}{G} -Creature - Elemental -4/4 -When Silverglade Elemental enters the battlefield, you may search your library for a Forest card and put that card onto the battlefield. If you do, shuffle your library. -MMQ C, HOP C - -Silverglade Pathfinder -{1}{G} -Creature - Dryad Spellshaper -1/1 -{1}{G}, {T}, Discard a card: Search your library for a basic land card and put that card onto the battlefield tapped. Then shuffle your library. -MMQ U - -Silverskin Armor -{2} -Artifact - Equipment -Equipped creature gets +1/+1 and is an artifact in addition to its other types. -Equip {2} -MBS U - -Silverstorm Samurai -{4}{W}{W} -Creature - Fox Samurai -3/3 -Flash -Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -BOK C - -Silvos, Rogue Elemental -{3}{G}{G}{G} -Legendary Creature - Elemental -8/5 -Trample -{G}: Regenerate Silvos, Rogue Elemental. -ONS R - -Sima Yi, Wei Field Marshal -{5}{B} -Legendary Creature - Human Soldier -*/4 -Sima Yi, Wei Field Marshal's power is equal to the number of Swamps you control. -PTK R - -Simian Brawler -{3}{G} -Creature - Ape Warrior -3/3 -Discard a land card: Simian Brawler gets +1/+1 until end of turn. -CSP C - -Simian Grunts -{2}{G} -Creature - Ape -3/4 -Flash -Echo {2}{G} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -ULG C - -Simian Spirit Guide -{2}{R} -Creature - Ape Spirit -2/2 -Exile Simian Spirit Guide from your hand: Add {R} to your mana pool. -PLC C - -Simic Basilisk -{4}{G}{G} -Creature - Basilisk Mutant -0/0 -Graft 3 (This creature enters the battlefield with three +1/+1 counters on it. Whenever another creature enters the battlefield, you may move a +1/+1 counter from this creature onto it.) -{1}{G}: Until end of turn, target creature with a +1/+1 counter on it gains "Whenever this creature deals combat damage to a creature, destroy that creature at end of combat." -DIS U - -Simic Growth Chamber -Land -Simic Growth Chamber enters the battlefield tapped. -When Simic Growth Chamber enters the battlefield, return a land you control to its owner's hand. -{T}: Add {G}{U} to your mana pool. -DIS C, COM C - -Simic Guildmage -{G/U}{G/U} -Creature - Elf Wizard -2/2 -({G/U} can be paid with either {G} or {U}.) -{1}{G}: Move a +1/+1 counter from target creature onto another target creature with the same controller. -{1}{U}: Attach target Aura enchanting a permanent to another permanent with the same controller. -DIS U - -Simic Initiate -{G} -Creature - Human Mutant -0/0 -Graft 1 (This creature enters the battlefield with a +1/+1 counter on it. Whenever another creature enters the battlefield, you may move a +1/+1 counter from this creature onto it.) -DIS C - -Simic Ragworm -{3}{G} -Creature - Worm -3/3 -{U}: Untap Simic Ragworm. -DIS C - -Simic Signet -{2} -Artifact -{1}, {T}: Add {G}{U} to your mana pool. -DIS C, COM C - -Simic Sky Swallower -{5}{G}{U} -Creature - Leviathan -6/6 -Flying, trample -Shroud (This creature can't be the target of spells or abilities.) -DIS R, COM R - -Simoon -{R}{G} -Instant -Simoon deals 1 damage to each creature target opponent controls. -VIS U, INV U - -Simplify -{G} -Sorcery -Each player sacrifices an enchantment. -ODY C - -Simulacrum -{1}{B} -Instant -You gain life equal to the damage dealt to you this turn. Simulacrum deals damage to target creature you control equal to the damage dealt to you this turn. -LEA U, LEB U, 2ED U, 3ED U, 4ED U - -Sindbad -{1}{U} -Creature - Human -1/1 -{T}: Draw a card and reveal it. If it isn't a land card, discard it. -ARN U, 4ED U, TSB S - -Sinew Sliver -{1}{W} -Creature - Sliver -1/1 -All Sliver creatures get +1/+1. -PLC C - -Singe -{R} -Instant -Singe deals 1 damage to target creature. That creature becomes black until end of turn. -PLS C - -Singe-Mind Ogre -{2}{B}{R} -Creature - Ogre Mutant -3/2 -When Singe-Mind Ogre enters the battlefield, target player reveals a card at random from his or her hand, then loses life equal to that card's converted mana cost. -ARB C - -Singing Tree -{3}{G} -Creature - Plant -0/3 -{T}: Target attacking creature's power becomes 0 until end of turn. -ARN R, MED U - -Sinister Strength -{1}{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets +3/+1 and is black. -PLS C - -Sink into Takenuma -{3}{B} -Sorcery - Arcane -Sweep - Return any number of Swamps you control to their owner's hand. Target player discards a card for each Swamp returned this way. -SOK C - -Sinkhole -{B}{B} -Sorcery -Destroy target land. -LEA C, LEB C, 2ED C, ME4 R - -Sinking Feeling -{2}{U} -Enchantment - Aura -Enchant creature -Enchanted creature doesn't untap during its controller's untap step. -Enchanted creature has "{1}, Put a -1/-1 counter on this creature: Untap this creature." -SHM C - -Sins of the Past -{4}{B}{B} -Sorcery -Until end of turn, you may cast target instant or sorcery card from your graveyard without paying its mana cost. If that card would be put into your graveyard this turn, exile it instead. Exile Sins of the Past. -RAV R - -Sinstriker's Will -{3}{W} -Enchantment - Aura -Enchant creature -Enchanted creature has "{T}: This creature deals damage equal to its power to target attacking or blocking creature." -GPT U - -Sir Shandlar of Eberyn -{4}{G}{W} -Legendary Creature - Human Knight -4/7 -LEG U, ME3 C - -Sire of the Storm -{4}{U}{U} -Creature - Spirit -3/3 -Flying -Whenever you cast a Spirit or Arcane spell, you may draw a card. -CHK U - -Siren's Call -{U} -Instant -Cast Siren's Call only during an opponent's turn, before attackers are declared. -Creatures the active player controls attack this turn if able. -At the beginning of the next end step, destroy all non-Wall creatures that player controls that didn't attack this turn. Ignore this effect for each creature the player didn't control continuously since the beginning of the turn. -LEA U, LEB U, 2ED U, 3ED U, 4ED U - -Sirocco -{1}{R} -Instant -Target player reveals his or her hand. For each blue instant card revealed this way, that player discards that card unless he or she pays 4 life. -MIR U - -Sisay -Vanguard -Hand -2, life -3 -Whenever you tap a land for mana, add one mana to your mana pool of any type that land produced. -VG S - -Sisay's Ingenuity -{U} -Enchantment - Aura -Enchant creature -When Sisay's Ingenuity enters the battlefield, draw a card. -Enchanted creature has "{2}{U}: Target creature becomes the color of your choice until end of turn." -PLS C - -Sisay's Ring -{4} -Artifact -{T}: Add {2} to your mana pool. -VIS C, 7ED U - -Sisters of Stone Death -{4}{B}{B}{G}{G} -Legendary Creature - Gorgon -7/5 -{G}: Target creature blocks Sisters of Stone Death this turn if able. -{B}{G}: Exile target creature blocking or blocked by Sisters of Stone Death. -{2}{B}: Put a creature card exiled with Sisters of Stone Death onto the battlefield under your control. -RAV R - -Sisters of Stone Death Avatar -Vanguard -Hand +1, life -5 -Each creature you control must be blocked if able. -{4}: Exile target creature that's blocking a creature you control. -VG S - -Sisters of the Flame -{1}{R}{R} -Creature - Human Shaman -2/2 -{T}: Add {R} to your mana pool. -DRK U, 4ED C - -Sivitri Scarzam -{5}{U}{B} -Legendary Creature - Human -6/4 -LEG U, CHR U, ME3 C - -Sivvi's Ruse -{2}{W}{W} -Instant -If an opponent controls a Mountain and you control a Plains, you may cast Sivvi's Ruse without paying its mana cost. -Prevent all damage that would be dealt this turn to creatures you control. -NEM U - -Sivvi's Valor -{2}{W} -Instant -If you control a Plains, you may tap an untapped creature you control rather than pay Sivvi's Valor's mana cost. -All damage that would be dealt to target creature this turn is dealt to you instead. -NEM R - -Sizzle -{2}{R} -Sorcery -Sizzle deals 3 damage to each opponent. -MMQ C, 8ED C - -Skarrg, the Rage Pits -Land -{T}: Add {1} to your mana pool. -{R}{G}, {T}: Target creature gets +1/+1 and gains trample until end of turn. -GPT U - -Skarrgan Firebird -{4}{R}{R} -Creature - Phoenix -3/3 -Bloodthirst 3 (If an opponent was dealt damage this turn, this creature enters the battlefield with three +1/+1 counters on it.) -Flying -{R}{R}{R}: Return Skarrgan Firebird from your graveyard to your hand. Activate this ability only if an opponent was dealt damage this turn. -GPT R - -Skarrgan Pit-Skulk -{G} -Creature - Human Warrior -1/1 -Bloodthirst 1 (If an opponent was dealt damage this turn, this creature enters the battlefield with a +1/+1 counter on it.) -Creatures with power less than Skarrgan Pit-Skulk's power can't block it. -GPT C - -Skarrgan Skybreaker -{4}{R}{R}{G} -Creature - Giant Shaman -3/3 -Bloodthirst 3 (If an opponent was dealt damage this turn, this creature enters the battlefield with three +1/+1 counters on it.) -{1}, Sacrifice Skarrgan Skybreaker: Skarrgan Skybreaker deals damage equal to its power to target creature or player. -GPT U - -Skeletal Changeling -{1}{B} -Creature - Shapeshifter -1/1 -Changeling (This card is every creature type at all times.) -{1}{B}: Regenerate Skeletal Changeling. -LRW C - -Skeletal Crocodile -{3}{B} -Creature - Crocodile Skeleton -5/1 -POR C - -Skeletal Kathari -{4}{B} -Creature - Bird Skeleton -3/2 -Flying -{B}, Sacrifice a creature: Regenerate Skeletal Kathari. -ALA C - -Skeletal Scrying -{X}{B} -Instant -As an additional cost to cast Skeletal Scrying, exile X cards from your graveyard. -You draw X cards and you lose X life. -ODY U - -Skeletal Snake -{1}{B} -Creature - Snake Skeleton -2/1 -POR C - -Skeletal Vampire -{4}{B}{B} -Creature - Vampire Skeleton -3/3 -Flying -When Skeletal Vampire enters the battlefield, put two 1/1 black Bat creature tokens with flying onto the battlefield. -{3}{B}{B}, Sacrifice a Bat: Put two 1/1 black Bat creature tokens with flying onto the battlefield. -Sacrifice a Bat: Regenerate Skeletal Vampire. -GPT R, GVL R - -Skeletal Wurm -{7}{B} -Creature - Skeleton Wurm -7/6 -{B}: Regenerate Skeletal Wurm. -ROE U - -Skeleton Scavengers -{2}{B} -Creature - Skeleton -0/0 -Skeleton Scavengers enters the battlefield with a +1/+1 counter on it. -Pay {1} for each +1/+1 counter on Skeleton Scavengers: Regenerate Skeleton Scavengers. When it regenerates this way, put a +1/+1 counter on it. -STH R - -Skeleton Shard -{3} -Artifact -{3}, {T} or {B}, {T}: Return target artifact creature card from your graveyard to your hand. -MRD U, HOP U - -Skeleton Ship -{3}{U}{B} -Legendary Creature - Skeleton -0/3 -When you control no Islands, sacrifice Skeleton Ship. -{T}: Put a -1/-1 counter on target creature. -ICE R, ME2 R - -Skeletonize -{4}{R} -Instant -Skeletonize deals 3 damage to target creature. When a creature dealt damage this way dies this turn, put a 1/1 black Skeleton creature token onto the battlefield with "{B}: Regenerate this creature." -ALA U - -Skill Borrower -{2}{U} -Artifact Creature - Human Wizard -1/3 -Play with the top card of your library revealed. -As long as the top card of your library is an artifact or creature card, Skill Borrower has all activated abilities of that card. (If any of the abilities use that card's name, use this creature's name instead.) -ALA R - -Skinrender -{2}{B}{B} -Creature - Zombie -3/3 -When Skinrender enters the battlefield, put three -1/-1 counters on target creature. -SOM U - -Skinshifter -{1}{G} -Creature - Human Shaman -1/1 -{G}: Choose one - Until end of turn, Skinshifter becomes a 4/4 Rhino and gains trample; or until end of turn, Skinshifter becomes a 2/2 Bird and gains flying; or until end of turn, Skinshifter becomes a 0/8 Plant. Activate this ability only once each turn. -M12 R - -Skinthinner -{1}{B} -Creature - Zombie -2/1 -Morph {3}{B}{B} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Skinthinner is turned face up, destroy target nonblack creature. It can't be regenerated. -LGN C - -Skinwing -{4} -Artifact - Equipment -Living weapon (When this Equipment enters the battlefield, put a 0/0 black Germ creature token onto the battlefield, then attach this to it.) -Equipped creature gets +2/+2 and has flying. -Equip {6} -MBS U - -Skirge Familiar -{4}{B} -Creature - Imp -3/2 -Flying -Discard a card: Add {B} to your mana pool. -USG U - -Skirk Alarmist -{1}{R} -Creature - Human Wizard -1/2 -Haste -{T}: Turn target face-down creature you control face up. At the beginning of the next end step, sacrifice it. -LGN R - -Skirk Commando -{1}{R}{R} -Creature - Goblin -2/1 -Whenever Skirk Commando deals combat damage to a player, you may have it deal 2 damage to target creature that player controls. -Morph {2}{R} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS C, ARC C - -Skirk Drill Sergeant -{1}{R} -Creature - Goblin -2/1 -Whenever Skirk Drill Sergeant or another Goblin dies, you may pay {2}{R}. If you do, reveal the top card of your library. If it's a Goblin permanent card, put it onto the battlefield. Otherwise, put it into your graveyard. -LGN U, EVG U - -Skirk Fire Marshal -{3}{R}{R} -Creature - Goblin -2/2 -Protection from red -Tap five untapped Goblins you control: Skirk Fire Marshal deals 10 damage to each creature and each player. -ONS R, EVG R - -Skirk Marauder -{1}{R} -Creature - Goblin -2/1 -Morph {2}{R} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Skirk Marauder is turned face up, it deals 2 damage to target creature or player. -LGN C, ARC C - -Skirk Outrider -{3}{R} -Creature - Goblin -2/2 -As long as you control a Beast, Skirk Outrider gets +2/+2 and has trample. -LGN C - -Skirk Prospector -{R} -Creature - Goblin -1/1 -Sacrifice a Goblin: Add {R} to your mana pool. -ONS C, EVG C, DDG C - -Skirk Ridge Exhumer -{1}{B} -Creature - Zombie Spellshaper -1/1 -{B}, {T}, Discard a card: Put a 1/1 black Zombie Goblin creature token named Festering Goblin onto the battlefield. It has "When Festering Goblin dies, target creature gets -1/-1 until end of turn." -FUT U - -Skirk Shaman -{1}{R}{R} -Creature - Goblin Shaman -2/2 -Skirk Shaman can't be blocked except by artifact creatures and/or red creatures. -PLC C, EVG C - -Skirk Volcanist -{3}{R} -Creature - Goblin -3/1 -Morph-Sacrifice two Mountains. (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Skirk Volcanist is turned face up, it deals 3 damage divided as you choose among one, two, or three target creatures. -SCG U - -Skithiryx, the Blight Dragon -{3}{B}{B} -Legendary Creature - Dragon Skeleton -4/4 -Flying -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -{B}: Skithiryx, the Blight Dragon gains haste until end of turn. -{B}{B}: Regenerate Skithiryx. -SOM M - -Skitter of Lizards -{R} -Creature - Lizard -1/1 -Multikicker {1}{R} (You may pay an additional {1}{R} any number of times as you cast this spell.) -Haste -Skitter of Lizards enters the battlefield with a +1/+1 counter on it for each time it was kicked. -WWK C - -Skittering Horror -{2}{B} -Creature - Horror -4/3 -When you cast a creature spell, sacrifice Skittering Horror. -UDS C, BTD C - -Skittering Invasion -{7} -Tribal Sorcery - Eldrazi -Put five 0/1 colorless Eldrazi Spawn creature tokens onto the battlefield. They have "Sacrifice this creature: Add {1} to your mana pool." -ROE U - -Skittering Monstrosity -{3}{B}{B} -Creature - Horror -5/5 -When you cast a creature spell, sacrifice Skittering Monstrosity. -TSP U - -Skittering Skirge -{B}{B} -Creature - Imp -3/2 -Flying -When you cast a creature spell, sacrifice Skittering Skirge. -USG C, BTD C - -Skittish Kavu -{1}{R} -Creature - Kavu -1/1 -Skittish Kavu gets +1/+1 as long as no opponent controls a white or blue creature. -INV U - -Skittish Valesk -{6}{R} -Creature - Beast -5/5 -At the beginning of your upkeep, flip a coin. If you lose the flip, turn Skittish Valesk face down. -Morph {5}{R} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS U - -Skizzik -{3}{R} -Creature - Elemental -5/3 -Kicker {R} (You may pay an additional {R} as you cast this spell.) -Trample, haste -At the beginning of the end step, sacrifice Skizzik unless it was kicked. -INV R - -Skizzik Surger -{4}{R}{R} -Creature - Elemental -6/4 -Haste -Echo-Sacrifice two lands. (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -FUT U - -Skred -{R} -Instant -Skred deals damage to target creature equal to the number of snow permanents you control. -CSP C - -Skulking Fugitive -{2}{B} -Creature - Horror Mercenary -3/4 -When Skulking Fugitive becomes the target of a spell or ability, sacrifice it. -MMQ C - -Skulking Ghost -{1}{B} -Creature - Spirit -2/1 -Flying -When Skulking Ghost becomes the target of a spell or ability, sacrifice it. -MIR C - -Skulking Knight -{2}{B} -Creature - Zombie Knight -3/3 -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -When Skulking Knight becomes the target of a spell or ability, sacrifice it. -TSP C - -Skull Catapult -{4} -Artifact -{1}, {T}, Sacrifice a creature: Skull Catapult deals 2 damage to target creature or player. -ICE U, 5ED U, 6ED U, ME2 U - -Skull Collector -{1}{B}{B} -Creature - Ogre Warrior -3/3 -At the beginning of your upkeep, return a black creature you control to its owner's hand. -{1}{B}: Regenerate Skull Collector. -SOK U - -Skull Fracture -{B} -Sorcery -Target player discards a card. -Flashback {3}{B} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY U - -Skull of Orm -{3} -Artifact -{5}, {T}: Return target enchantment card from your graveyard to your hand. -DRK U, 8ED R - -Skull of Ramos -{3} -Artifact -{T}: Add {B} to your mana pool. -Sacrifice Skull of Ramos: Add {B} to your mana pool. -MMQ R - -Skullbriar, the Walking Grave -{B}{G} -Legendary Creature - Zombie Elemental -1/1 -Haste -Whenever Skullbriar, the Walking Grave deals combat damage to a player, put a +1/+1 counter on it. -Counters remain on Skullbriar as it moves to any zone other than a player's hand or library. -COM R - -Skullcage -{4} -Artifact -At the beginning of each opponent's upkeep, Skullcage deals 2 damage to that player unless he or she has exactly three or exactly four cards in hand. -5DN U, ARC U - -Skullclamp -{1} -Artifact - Equipment -Equipped creature gets +1/-1. -Whenever equipped creature dies, draw two cards. -Equip {1} -DST U, FVE M, COM U - -Skullmane Baku -{3}{B}{B} -Creature - Spirit -2/1 -Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Skullmane Baku. -{1}, {T}, Remove X ki counters from Skullmane Baku: Target creature gets -X/-X until end of turn. -BOK C - -Skullmead Cauldron -{4} -Artifact -{T}: You gain 1 life. -{T}, Discard a card: You gain 3 life. -DIS U - -Skullmulcher -{4}{G} -Creature - Elemental -3/3 -Devour 1 (As this enters the battlefield, you may sacrifice any number of creatures. This creature enters the battlefield with that many +1/+1 counters on it.) -When Skullmulcher enters the battlefield, draw a card for each creature it devoured. -ALA R - -Skullscorch -{R}{R} -Sorcery -Target player discards two cards at random unless that player has Skullscorch deal 4 damage to him or her. -TOR R - -Skullsnatcher -{1}{B} -Creature - Rat Ninja -2/1 -Ninjutsu {B} ({B}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -Whenever Skullsnatcher deals combat damage to a player, exile up to two target cards from that player's graveyard. -BOK C - -Skulltap -{1}{B} -Sorcery -As an additional cost to cast Skulltap, sacrifice a creature. -Draw two cards. -SCG C - -Sky Diamond -{2} -Artifact -Sky Diamond enters the battlefield tapped. -{T}: Add {U} to your mana pool. -MIR U, 6ED U, 7ED U - -Sky Hussar -{3}{W}{U} -Creature - Human Knight -4/3 -Flying -When Sky Hussar enters the battlefield, untap all creatures you control. -Forecast - Tap two untapped white and/or blue creatures you control, Reveal Sky Hussar from your hand: Draw a card. (Activate this ability only during your upkeep and only once each turn.) -DIS U - -Sky Ruin Drake -{4}{U} -Creature - Drake -2/5 -Flying -ZEN C - -Sky Spirit -{1}{W}{U} -Creature - Spirit -2/2 -Flying, first strike -TMP U - -Sky Swallower -{3}{U}{U} -Creature - Leviathan -8/8 -Flying -When Sky Swallower enters the battlefield, target opponent gains control of all other permanents you control. -GPT R - -Sky Weaver -{1}{U} -Creature - Metathran Wizard -2/1 -{2}: Target white or black creature gains flying until end of turn. (It can't be blocked except by creatures with flying or reach.) -INV U, 10E U - -Sky-Eel School -{3}{U}{U} -Creature - Fish -3/3 -Flying -When Sky-Eel School enters the battlefield, draw a card, then discard a card. -SOM C - -Skybreen -Plane - Kaldheim -Players play with the top card of their libraries revealed. -Spells that share a card type with the top card of a library can't be cast. -Whenever you roll {C}, target player loses life equal to the number of cards in his or her hand. -HOP C - -Skyclaw Thrash -{3}{U}{R} -Artifact Creature - Viashino Warrior -4/4 -Whenever Skyclaw Thrash attacks, flip a coin. If you win the flip, Skyclaw Thrash gets +1/+1 and gains flying until end of turn. -ARB U - -Skycloud Egg -{1} -Artifact -{2}, {T}, Sacrifice Skycloud Egg: Add {W}{U} to your mana pool. Draw a card. -ODY U - -Skycloud Expanse -Land -{1}, {T}: Add {W}{U} to your mana pool. -ODY R - -Skyfire Kirin -{2}{R}{R} -Legendary Creature - Kirin Spirit -3/3 -Flying -Whenever you cast a Spirit or Arcane spell, you may gain control of target creature with that spell's converted mana cost until end of turn. -SOK R - -Skyhunter Cub -{2}{W} -Creature - Cat Knight -2/2 -As long as Skyhunter Cub is equipped, it gets +1/+1 and has flying. -MRD C - -Skyhunter Patrol -{2}{W}{W} -Creature - Cat Knight -2/3 -Flying, first strike (This creature can't be blocked except by creatures with flying or reach, and it deals combat damage before creatures without first strike.) -MRD C, 10E C, DDG C - -Skyhunter Prowler -{2}{W} -Creature - Cat Knight -1/3 -Flying, vigilance (This creature can't be blocked except by creatures with flying or reach, and attacking doesn't cause this creature to tap.) -5DN C, 9ED C, 10E C - -Skyhunter Skirmisher -{1}{W}{W} -Creature - Cat Knight -1/1 -Flying, double strike (This creature can't be blocked except by creatures with flying or reach, and it deals both first-strike and regular combat damage.) -5DN U, 10E U - -Skyknight Legionnaire -{1}{R}{W} -Creature - Human Knight -2/2 -Flying, haste -RAV C - -Skyreach Manta -{5} -Artifact Creature - Fish -0/0 -Sunburst (This enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.) -Flying -5DN C - -Skyrider Trainee -{4}{W} -Creature - Human Soldier -3/3 -Skyrider Trainee has flying as long as it's enchanted. -GPT C - -Skyscribing -{X}{U}{U} -Sorcery -Each player draws X cards. -Forecast - {2}{U}, Reveal Skyscribing from your hand: Each player draws a card. (Activate this ability only during your upkeep and only once each turn.) -DIS U, COM U - -Skyshaper -{2} -Artifact -Sacrifice Skyshaper: Creatures you control gain flying until end of turn. -EXO U - -Skyship Weatherlight -{4} -Legendary Artifact -When Skyship Weatherlight enters the battlefield, search your library for any number of artifact and/or creature cards and exile them. Then shuffle your library. -{4}, {T}: Choose a card at random that was exiled with Skyship Weatherlight. Put that card into its owner's hand. -PLS R (x2) - -Skyshooter -{1}{G} -Creature - Centaur Archer -1/2 -Reach (This creature can block creatures with flying.) -{T}, Sacrifice Skyshooter: Destroy target attacking or blocking creature with flying. -ODY U - -Skyshroud Archer -{G} -Creature - Elf Archer -1/1 -{T}: Target creature with flying gets -1/-1 until end of turn. -STH C - -Skyshroud Behemoth -{5}{G}{G} -Creature - Beast -10/10 -Fading 2 (This creature enters the battlefield with two fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.) -Skyshroud Behemoth enters the battlefield tapped. -NEM R - -Skyshroud Blessing -{1}{G} -Instant -Lands gain shroud until end of turn. (They can't be the targets of spells or abilities.) -Draw a card. -PLS U - -Skyshroud Claim -{3}{G} -Sorcery -Search your library for up to two Forest cards and put them onto the battlefield. Then shuffle your library. -NEM C - -Skyshroud Condor -{1}{U} -Creature - Bird -2/2 -Flying -Cast Skyshroud Condor only if you've cast another spell this turn. -TMP U - -Skyshroud Cutter -{3}{G} -Creature - Beast -2/2 -If you control a Forest, rather than pay Skyshroud Cutter's mana cost, you may have each other player gain 5 life. -NEM C - -Skyshroud Elf -{1}{G} -Creature - Elf Druid -1/1 -{T}: Add {G} to your mana pool. -{1}: Add {R} or {W} to your mana pool. -TMP C - -Skyshroud Elite -{G} -Creature - Elf -1/1 -Skyshroud Elite gets +1/+2 as long as an opponent controls a nonbasic land. -EXO U, BRB U - -Skyshroud Falcon -{1}{W} -Creature - Bird -1/1 -Flying, vigilance -STH C, 7ED C - -Skyshroud Forest -Land -Skyshroud Forest enters the battlefield tapped. -{T}: Add {1} to your mana pool. -{T}: Add {G} or {U} to your mana pool. Skyshroud Forest deals 1 damage to you. -TMP R - -Skyshroud Poacher -{2}{G}{G} -Creature - Human Rebel -2/2 -{3}, {T}: Search your library for an Elf permanent card and put it onto the battlefield. Then shuffle your library. -NEM R - -Skyshroud Ranger -{G} -Creature - Elf -1/1 -{T}: You may put a land card from your hand onto the battlefield. Activate this ability only any time you could cast a sorcery. -TMP C, 10E C - -Skyshroud Ridgeback -{G} -Creature - Beast -2/3 -Fading 2 (This creature enters the battlefield with two fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.) -NEM C - -Skyshroud Sentinel -{2}{G} -Creature - Elf -1/1 -When Skyshroud Sentinel enters the battlefield, you may search your library for up to three cards named Skyshroud Sentinel, reveal them, and put them into your hand. If you do, shuffle your library. -NEM C - -Skyshroud Troll -{2}{G}{G} -Creature - Troll Giant -3/3 -{1}{G}: Regenerate Skyshroud Troll. -TMP C - -Skyshroud Troopers -{3}{G} -Creature - Elf Druid Warrior -3/3 -{T}: Add {G} to your mana pool. -STH C - -Skyshroud Vampire -{3}{B}{B} -Creature - Vampire -3/3 -Flying -Discard a creature card: Skyshroud Vampire gets +2/+2 until end of turn. -TMP U - -Skyshroud War Beast -{1}{G} -Creature - Beast -*/* -Trample -As Skyshroud War Beast enters the battlefield, choose an opponent. -Skyshroud War Beast's power and toughness are each equal to the number of nonbasic lands the chosen player controls. -EXO R - -Skyward Eye Prophets -{3}{G}{W}{U} -Creature - Human Wizard -3/3 -Vigilance -{T}: Reveal the top card of your library. If it's a land card, put it onto the battlefield. Otherwise, put it into your hand. -CON U - -Skywatcher Adept -{U} -Creature - Merfolk Wizard -1/1 -Level up {3} ({3}: Put a level counter on this. Level up only as a sorcery.) -LEVEL 1-2 -2/2 -Flying -LEVEL 3+ -4/2 -Flying -ROE C - -Skywinder Drake -{2}{U} -Creature - Drake -3/1 -Flying -Skywinder Drake can block only creatures with flying. -M12 C - -Skywing Aven -{2}{U} -Creature - Bird Soldier -2/1 -Flying -Discard a card: Return Skywing Aven to its owner's hand. -TOR C - -Slag Fiend -{R} -Creature - Construct -*/* -Slag Fiend's power and toughness are each equal to the number of artifact cards in all graveyards. -NPH R - -Slagstorm -{1}{R}{R} -Sorcery -Choose one - Slagstorm deals 3 damage to each creature; or Slagstorm deals 3 damage to each player. -MBS R - -Slagwurm Armor -{1} -Artifact - Equipment -Equipped creature gets +0/+6. -Equip {3} ({3}: Attach to target creature you control. Equip only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.) -MRD C - -Slash Panther -{4}{R/P} -Artifact Creature - Cat -4/2 -({R/P} can be paid with either {R} or 2 life.) -Haste -NPH C - -Slashing Tiger -{2}{G}{G} -Creature - Cat -3/3 -Whenever Slashing Tiger becomes blocked, it gets +2/+2 until end of turn. -PTK R, ME3 C - -Slate of Ancestry -{4} -Artifact -{4}, {T}, Discard your hand: Draw a card for each creature you control. -ONS R, 9ED R, EVG R - -Slaughter -{2}{B}{B} -Instant -Buyback-Pay 4 life. (You may pay 4 life in addition to any other costs as you cast this spell. If you do, put this card into your hand as it resolves.) -Destroy target nonblack creature. It can't be regenerated. -EXO U - -Slaughter Cry -{2}{R} -Instant -Target creature gets +3/+0 and gains first strike until end of turn. (It deals combat damage before creatures without first strike.) -ZEN C, M12 C - -Slaughter Pact -{0} -Instant -Slaughter Pact is black. -Destroy target nonblack creature. -At the beginning of your next upkeep, pay {2}{B}. If you don't, you lose the game. -FUT R - -Slaughterhouse Bouncer -{4}{B} -Creature - Ogre Warrior -3/3 -Hellbent - When Slaughterhouse Bouncer dies, if you have no cards in hand, target creature gets -3/-3 until end of turn. -DIS C - -Slave of Bolas -{3}{U/R}{B} -Sorcery -Gain control of target creature. Untap that creature. It gains haste until end of turn. Sacrifice it at the beginning of the next end step. -ARB U - -Slavering Nulls -{1}{R} -Creature - Goblin Zombie -2/1 -Whenever Slavering Nulls deals combat damage to a player, if you control a Swamp, you may have that player discard a card. -WWK U - -Slay -{2}{B} -Instant -Destroy target green creature. It can't be regenerated. -Draw a card. -PLS U, 8ED U, 9ED U, PVC U - -Sleep -{2}{U}{U} -Sorcery -Tap all creatures target player controls. Those creatures don't untap during that player's next untap step. -M10 U, M11 U - -Sleeper Agent -{B} -Creature - Minion -3/3 -When Sleeper Agent enters the battlefield, target opponent gains control of it. -At the beginning of your upkeep, Sleeper Agent deals 2 damage to you. -USG R, 10E R - -Sleeper's Guile -{2}{B} -Enchantment - Aura -Enchant creature -Enchanted creature has fear. (It can't be blocked except by artifact creatures and/or black creatures.) -When Sleeper's Guile is put into a graveyard from the battlefield, return Sleeper's Guile to its owner's hand. -ULG C - -Sleeper's Robe -{U}{B} -Enchantment - Aura -Enchant creature -Enchanted creature has fear. (It can't be blocked except by artifact creatures and/or black creatures.) -Whenever enchanted creature deals combat damage to an opponent, you may draw a card. -INV U - -Sleeping Potion -{1}{U} -Enchantment - Aura -Enchant creature -When Sleeping Potion enters the battlefield, tap enchanted creature. -Enchanted creature doesn't untap during its controller's untap step. -When enchanted creature becomes the target of a spell or ability, sacrifice Sleeping Potion. -PLS C - -Sleight of Hand -{U} -Sorcery -Look at the top two cards of your library. Put one of them into your hand and the other on the bottom of your library. -P02 C, S99 C, 7ED C, 9ED C, ME4 C - -Sleight of Mind -{U} -Instant -Change the text of target spell or permanent by replacing all instances of one color word with another. (For example, you may change "target black spell" to "target blue spell." This effect lasts indefinitely.) -LEA R, LEB R, 2ED R, 3ED R, 4ED R, ICE U, 5ED R - -Slice and Dice -{4}{R}{R} -Sorcery -Slice and Dice deals 4 damage to each creature. -Cycling {2}{R} ({2}{R}, Discard this card: Draw a card.) -When you cycle Slice and Dice, you may have it deal 1 damage to each creature. -ONS U - -Slice in Twain -{2}{G}{G} -Instant -Destroy target artifact or enchantment. -Draw a card. -SOM U - -Slimy Kavu -{2}{R} -Creature - Kavu -2/2 -{T}: Target land becomes a Swamp until end of turn. -INV C - -Slingbow Trap -{3}{G} -Instant - Trap -If a black creature with flying is attacking, you may pay {G} rather than pay Slingbow Trap's mana cost. -Destroy target attacking creature with flying. -WWK U - -Slingshot Goblin -{2}{R} -Creature - Goblin -2/2 -{R}, {T}: Slingshot Goblin deals 2 damage to target blue creature. -PLS C - -Slinking Giant -{2}{R}{R} -Creature - Giant Rogue -4/4 -Wither (This deals damage to creatures in the form of -1/-1 counters.) -Whenever Slinking Giant blocks or becomes blocked, it gets -3/-0 until end of turn. -SHM U - -Slinking Serpent -{2}{U}{B} -Creature - Serpent -2/3 -Forestwalk -INV U - -Slinking Skirge -{3}{B} -Creature - Imp -2/1 -Flying -{2}, Sacrifice Slinking Skirge: Draw a card. -UDS C - -Slippery Bogle -{G/U} -Creature - Beast -1/1 -Hexproof (This creature can't be the target of spells or abilities your opponents control.) -EVE C - -Slippery Karst -Land -Slippery Karst enters the battlefield tapped. -{T}: Add {G} to your mana pool. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG C, BRB C, BTD C, GVL C - -Slipstream Eel -{5}{U}{U} -Creature - Fish Beast -6/6 -Slipstream Eel can't attack unless defending player controls an Island. -Cycling {1}{U} ({1}{U}, Discard this card: Draw a card.) -ONS C, COM C - -Slipstream Serpent -{7}{U} -Creature - Serpent -6/6 -Slipstream Serpent can't attack unless defending player controls an Island. -When you control no Islands, sacrifice Slipstream Serpent. -Morph {5}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -TSP C - -Sliptide Serpent -{4}{U}{U} -Creature - Serpent -4/4 -{3}{U}: Return Sliptide Serpent to its owner's hand. -NEM R - -Slith Ascendant -{1}{W}{W} -Creature - Slith -1/1 -Flying -Whenever Slith Ascendant deals combat damage to a player, put a +1/+1 counter on it. -MRD U - -Slith Bloodletter -{B}{B} -Creature - Slith -1/1 -Whenever Slith Bloodletter deals combat damage to a player, put a +1/+1 counter on it. -{1}{B}: Regenerate Slith Bloodletter. -MRD U - -Slith Firewalker -{R}{R} -Creature - Slith -1/1 -Haste -Whenever Slith Firewalker deals combat damage to a player, put a +1/+1 counter on it. -MRD U, JVC U - -Slith Predator -{G}{G} -Creature - Slith -1/1 -Trample -Whenever Slith Predator deals combat damage to a player, put a +1/+1 counter on it. -MRD U - -Slith Strider -{1}{U}{U} -Creature - Slith -1/1 -Whenever Slith Strider becomes blocked, draw a card. -Whenever Slith Strider deals combat damage to a player, put a +1/+1 counter on it. -MRD U - -Slithering Shade -{B} -Creature - Shade -0/1 -Defender (This creature can't attack.) -{B}: Slithering Shade gets +1/+1 until end of turn. -Hellbent - Slithering Shade can attack as though it didn't have defender as long as you have no cards in hand. -DIS U - -Slithermuse -{2}{U}{U} -Creature - Elemental -3/3 -When Slithermuse leaves the battlefield, choose an opponent. If that player has more cards in hand than you, draw cards equal to the difference. -Evoke {3}{U} (You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield.) -MOR R - -Slithery Stalker -{1}{B}{B} -Creature - Nightmare Horror -1/1 -Swampwalk -When Slithery Stalker enters the battlefield, exile target green or white creature an opponent controls. -When Slithery Stalker leaves the battlefield, return the exiled card to the battlefield under its owner's control. -TOR U - -Sliver Legion -{W}{U}{B}{R}{G} -Legendary Creature - Sliver -7/7 -All Sliver creatures get +1/+1 for each other Sliver on the battlefield. -FUT R - -Sliver Overlord -{W}{U}{B}{R}{G} -Legendary Creature - Sliver Mutant -7/7 -{3}: Search your library for a Sliver card, reveal that card, and put it into your hand. Then shuffle your library. -{3}: Gain control of target Sliver. (This effect lasts indefinitely.) -SCG R, H09 M - -Sliver Queen -{W}{U}{B}{R}{G} -Legendary Creature - Sliver -7/7 -{2}: Put a 1/1 colorless Sliver creature token onto the battlefield. -STH R - -Sliver Queen Avatar -Vanguard -Hand +0, life +7 -Whenever you cast a non-Sliver creature spell, exile that spell. If you do, put a token onto the battlefield that's a copy of a random non-Shapeshifter Sliver creature card with the same converted mana cost as that spell. -VG S - -Sliver Queen, Brood Mother -Vanguard -Hand +0, life +8 -{3}: Put a 1/1 colorless Sliver creature token onto the battlefield. -VG S - -Sliversmith -{2} -Artifact Creature - Spellshaper -1/1 -{1}, {T}, Discard a card: Put a 1/1 colorless Sliver artifact creature token named Metallic Sliver onto the battlefield. -FUT U - -Slobad, Goblin Tinkerer -{1}{R} -Legendary Creature - Goblin Artificer -1/2 -Sacrifice an artifact: Target artifact is indestructible this turn. ("Destroy" effects and lethal damage don't destroy that artifact.) -DST R - -Slow Motion -{2}{U} -Enchantment - Aura -Enchant creature -At the beginning of the upkeep of enchanted creature's controller, that player sacrifices that creature unless he or she pays {2}. -When Slow Motion is put into a graveyard from the battlefield, return Slow Motion to its owner's hand. -ULG C - -Sludge Strider -{1}{W}{U}{B} -Artifact Creature - Insect -3/3 -Whenever another artifact enters the battlefield under your control or another artifact you control leaves the battlefield, you may pay {1}. If you do, target player loses 1 life and you gain 1 life. -CON U, HOP U - -Sluggishness -{1}{R} -Enchantment - Aura -Enchant creature -Enchanted creature can't block. -When Sluggishness is put into a graveyard from the battlefield, return Sluggishness to its owner's hand. -ULG C - -Slumbering Tora -{3} -Artifact -{2}, Discard a Spirit or Arcane card: Slumbering Tora becomes an X/X Cat artifact creature until end of turn, where X is the discarded card's converted mana cost. -BOK R - -Smallpox -{B}{B} -Sorcery -Each player loses 1 life, discards a card, sacrifices a creature, then sacrifices a land. -TSP U, M12 U - -Smash -{2}{R} -Instant -Destroy target artifact. -Draw a card. -APC C, RAV C, 10E C - -Smash to Smithereens -{1}{R} -Instant -Destroy target artifact. Smash to Smithereens deals 3 damage to that artifact's controller. -SHM C - -Smite -{W} -Instant -Destroy target blocked creature. -STH C, ROE C - -Smogsteed Rider -{2}{B}{B} -Creature - Human Wizard -2/2 -Whenever Smogsteed Rider attacks, each other attacking creature gains fear until end of turn. (They can't be blocked except by artifact creatures and/or black creatures.) -GPT U - -Smoke -{R}{R} -Enchantment -Players can't untap more than one creature during their untap steps. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, ME4 R - -Smokebraider -{1}{R} -Creature - Elemental Shaman -1/1 -{T}: Add two mana in any combination of colors to your mana pool. Spend this mana only to cast Elemental spells or activate abilities of Elementals. -LRW C, HOP C - -Smokespew Invoker -{2}{B} -Creature - Zombie Mutant -3/1 -{7}{B}: Target creature gets -3/-3 until end of turn. -LGN C - -Smokestack -{4} -Artifact -At the beginning of your upkeep, you may put a soot counter on Smokestack. -At the beginning of each player's upkeep, that player sacrifices a permanent for each soot counter on Smokestack. -USG R - -Smolder Initiate -{B} -Creature - Elemental Shaman -1/1 -Whenever a player casts a black spell, you may pay {1}. If you do, target player loses 1 life. -SHM C - -Smoldering Butcher -{3}{B} -Creature - Elemental Warrior -4/2 -Wither (This deals damage to creatures in the form of -1/-1 counters.) -EVE C - -Smoldering Crater -Land -Smoldering Crater enters the battlefield tapped. -{T}: Add {R} to your mana pool. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG C, BTD C - -Smoldering Spires -Land -Smoldering Spires enters the battlefield tapped. -When Smoldering Spires enters the battlefield, target creature can't block this turn. -{T}: Add {R} to your mana pool. -WWK C - -Smoldering Tar -{2}{B}{R} -Enchantment -At the beginning of your upkeep, target player loses 1 life. -Sacrifice Smoldering Tar: Smoldering Tar deals 4 damage to target creature. Activate this ability only any time you could cast a sorcery. -INV U - -Smother -{1}{B} -Instant -Destroy target creature with converted mana cost 3 or less. It can't be regenerated. -ONS U, WWK U - -Snag -{3}{G} -Instant -You may discard a Forest card rather than pay Snag's mana cost. -Prevent all combat damage that would be dealt by unblocked creatures this turn. -PCY U - -Snake Basket -{4} -Artifact -{X}, Sacrifice Snake Basket: Put X 1/1 green Snake creature tokens onto the battlefield. Activate this ability only any time you could cast a sorcery. -VIS R, 6ED R - -Snake Cult Initiation -{3}{B} -Enchantment - Aura -Enchant creature -Enchanted creature has poisonous 3. (Whenever it deals combat damage to a player, that player gets three poison counters. A player with ten or more poison counters loses the game.) -FUT U - -Snake Pit -{3}{G} -Enchantment -Whenever an opponent casts a blue or black spell, you may put a 1/1 green Snake creature token onto the battlefield. -MMQ U - -Snake Umbra -{2}{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+1 and has "Whenever this creature deals damage to an opponent, you may draw a card." -Totem armor (If enchanted creature would be destroyed, instead remove all damage from it and destroy this Aura.) -ROE C - -Snakeform -{2}{G/U} -Instant -Target creature loses all abilities and becomes a 1/1 green Snake until end of turn. -Draw a card. -EVE C - -Snap -{1}{U} -Instant -Return target creature to its owner's hand. Untap up to two lands. -ULG C - -Snapback -{1}{U} -Instant -You may exile a blue card from your hand rather than pay Snapback's mana cost. -Return target creature to its owner's hand. -TSP C - -Snapping Creeper -{2}{G} -Creature - Plant -2/3 -Landfall - Whenever a land enters the battlefield under your control, Snapping Creeper gains vigilance until end of turn. -WWK C - -Snapping Drake -{3}{U} -Creature - Drake -3/2 -Flying -POR C, S99 C, BTD C, RAV C, 10E C, M10 C - -Snapping Thragg -{4}{R} -Creature - Beast -3/3 -Whenever Snapping Thragg deals combat damage to a player, you may have it deal 3 damage to target creature that player controls. -Morph {4}{R}{R} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS U - -Snapsail Glider -{3} -Artifact Creature - Construct -2/2 -Metalcraft - Snapsail Glider has flying as long as you control three or more artifacts. -SOM C - -Snarling Undorak -{2}{G}{G} -Creature - Beast -3/3 -{2}{G}: Target Beast creature gets +1/+1 until end of turn. -Morph {1}{G}{G} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS C - -Sneak Attack -{3}{R} -Enchantment -{R}: You may put a creature card from your hand onto the battlefield. That creature gains haste. Sacrifice the creature at the beginning of the next end step. -USG R - -Sneaky Homunculus -{1}{U} -Creature - Homunculus Illusion -1/1 -Sneaky Homunculus can't block or be blocked by creatures with power 2 or greater. -NEM C, 8ED C - -Snorting Gahr -{2}{G}{G} -Creature - Rhino Beast -3/3 -Whenever Snorting Gahr becomes blocked, it gets +2/+2 until end of turn. -MMQ C - -Snow Devil -{1}{U} -Enchantment - Aura -Enchant creature -Enchanted creature has flying. -Enchanted creature has first strike as long as it's blocking and you control a snow land. -ICE C - -Snow Fortress -{5} -Artifact Creature - Wall -0/4 -Defender (This creature can't attack.) -{1}: Snow Fortress gets +1/+0 until end of turn. -{1}: Snow Fortress gets +0/+1 until end of turn. -{3}: Snow Fortress deals 1 damage to target creature without flying that's attacking you. -ICE R, ME2 U - -Snow Hound -{2}{W} -Creature - Hound -1/1 -{1}, {T}: Return Snow Hound and target green or blue creature you control to their owner's hand. -ICE U - -Snow-Covered Forest -Basic Snow Land - Forest -G -ICE L, CSP C, ME2 L - -Snow-Covered Island -Basic Snow Land - Island -U -ICE L, CSP C, ME2 L - -Snow-Covered Mountain -Basic Snow Land - Mountain -R -ICE L, CSP C, ME2 L - -Snow-Covered Plains -Basic Snow Land - Plains -W -ICE L, CSP C, ME2 L - -Snow-Covered Swamp -Basic Snow Land - Swamp -B -ICE L, CSP C, ME2 L - -Snowblind -{3}{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets -X/-Y. If that creature is attacking, X is the number of snow lands defending player controls. Otherwise, X is the number of snow lands its controller controls. Y is equal to X or to enchanted creature's toughness minus 1, whichever is smaller. -ICE R - -Snowfall -{2}{U} -Enchantment -Cumulative upkeep {U} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -Whenever an Island is tapped for mana, its controller may add {U} to his or her mana pool (in addition to the mana the land produces). If that Island is snow, its controller may add {U}{U} to his or her mana pool instead. Spend this mana only to pay cumulative upkeep costs. -ICE C - -Snuff Out -{3}{B} -Instant -If you control a Swamp, you may pay 4 life rather than pay Snuff Out's mana cost. -Destroy target nonblack creature. It can't be regenerated. -MMQ C, GVL C - -Soar -{1}{U} -Enchantment - Aura -You may cast Soar as though it had flash. If you cast it any time a sorcery couldn't have been cast, the controller of the permanent it becomes sacrifices it at the beginning of the next cleanup step. -Enchant creature -Enchanted creature gets +0/+1 and has flying. -MIR C - -Soaring Hope -{4}{W} -Enchantment - Aura -Enchant creature -When Soaring Hope enters the battlefield, you gain 3 life. -Enchanted creature has flying. -{W}: Put Soaring Hope on top of its owner's library. -LRW C - -Soaring Seacliff -Land -Soaring Seacliff enters the battlefield tapped. -When Soaring Seacliff enters the battlefield, target creature gains flying until end of turn. -{T}: Add {U} to your mana pool. -ZEN C - -Soilshaper -{1}{G} -Creature - Spirit -1/1 -Whenever you cast a Spirit or Arcane spell, target land becomes a 3/3 creature until end of turn. It's still a land. -CHK U - -Sokenzan -Plane - Kamigawa -All creatures get +1/+1 and have haste. -Whenever you roll {C}, untap all creatures that attacked this turn. After this main phase, there is an additional combat phase followed by an additional main phase. -HOP C - -Sokenzan Bruiser -{4}{R} -Creature - Ogre Warrior -3/3 -Mountainwalk -CHK C - -Sokenzan Renegade -{2}{R} -Creature - Ogre Samurai Mercenary -3/3 -Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -At the beginning of your upkeep, if a player has more cards in hand than each other player, the player who has the most cards in hand gains control of Sokenzan Renegade. -SOK U - -Sokenzan Spellblade -{4}{R} -Creature - Ogre Samurai Shaman -2/3 -Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -{1}{R}: Sokenzan Spellblade gets +X/+0 until end of turn, where X is the number of cards in your hand. -SOK C - -Sol Grail -{3} -Artifact -As Sol Grail enters the battlefield, choose a color. -{T}: Add one mana of the chosen color to your mana pool. -ALL U, ME3 C - -Sol Ring -{1} -Artifact -{T}: Add {2} to your mana pool. -LEA U, LEB U, 2ED U, 3ED U, FVR M, ME4 R, COM U - -Sol'kanar the Swamp King -{2}{U}{B}{R} -Legendary Creature - Demon -5/5 -Swampwalk -Whenever a player casts a black spell, you gain 1 life. -LEG R, CHR R, TSB S - -Solar Blast -{3}{R} -Instant -Solar Blast deals 3 damage to target creature or player. -Cycling {1}{R}{R} ({1}{R}{R}, Discard this card: Draw a card.) -When you cycle Solar Blast, you may have it deal 1 damage to target creature or player. -ONS C - -Solar Tide -{4}{W}{W} -Sorcery -Choose one - Destroy all creatures with power 2 or less; or destroy all creatures with power 3 or greater. -Entwine-Sacrifice two lands. (Choose both if you pay the entwine cost.) -MRD R - -Solarion -{7} -Artifact Creature - Construct -0/0 -Sunburst (This enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.) -{T}: Double the number of +1/+1 counters on Solarion. -5DN R - -Soldevi Adnate -{1}{B} -Creature - Human Cleric -1/2 -{T}, Sacrifice a black or artifact creature: Add to your mana pool an amount of {B} equal to the sacrificed creature's converted mana cost. -ALL C (x2) - -Soldevi Digger -{2} -Artifact -{2}: Put the top card of your graveyard on the bottom of your library. -ALL R, ME2 U - -Soldevi Excavations -Land -If Soldevi Excavations would enter the battlefield, sacrifice an untapped Island instead. If you do, put Soldevi Excavations onto the battlefield. If you don't, put it into its owner's graveyard. -{T}: Add {1}{U} to your mana pool. -{1}, {T}: Look at the top card of your library. You may put that card on the bottom of your library. -ALL R, ME2 R - -Soldevi Golem -{4} -Artifact Creature - Golem -5/3 -Soldevi Golem doesn't untap during your untap step. -At the beginning of your upkeep, you may untap target tapped creature an opponent controls. If you do, untap Soldevi Golem. -ICE R, ME4 U - -Soldevi Heretic -{2}{U} -Creature - Human Cleric -2/2 -{W}, {T}: Prevent the next 2 damage that would be dealt to target creature this turn. Target opponent may draw a card. -ALL C (x2) - -Soldevi Machinist -{1}{U} -Creature - Human Wizard Artificer -1/1 -{T}: Add {2} to your mana pool. Spend this mana only to activate abilities of artifacts. -ICE U, ME4 U - -Soldevi Sage -{1}{U} -Creature - Human Wizard -1/1 -{T}, Sacrifice two lands: Draw three cards, then discard one of them. -ALL C (x2), 6ED U - -Soldevi Sentry -{1} -Artifact Creature - Soldier -1/1 -{1}: Choose target opponent. Regenerate Soldevi Sentry. When it regenerates this way, that player may draw a card. -ALL C (x2) - -Soldevi Simulacrum -{4} -Artifact Creature - Soldier -2/4 -Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -{1}: Soldevi Simulacrum gets +1/+0 until end of turn. -ICE U, ME2 U - -Soldevi Steam Beast -{5} -Artifact Creature - Beast -4/2 -Whenever Soldevi Steam Beast becomes tapped, target opponent gains 2 life. -{2}: Regenerate Soldevi Steam Beast. -ALL C (x2) - -Soldier Replica -{3} -Artifact Creature - Soldier -1/3 -{1}{W}, Sacrifice Soldier Replica: Soldier Replica deals 3 damage to target attacking or blocking creature. -MRD C - -Soldier of Fortune -{R} -Creature - Human Mercenary -1/1 -{R}, {T}: Target player shuffles his or her library. -ALL U - -Solemn Offering -{2}{W} -Sorcery -Destroy target artifact or enchantment. You gain 4 life. -M10 C, M11 C - -Solemn Simulacrum -{4} -Artifact Creature - Golem -2/2 -When Solemn Simulacrum enters the battlefield, you may search your library for a basic land card, put that card onto the battlefield tapped, then shuffle your library. -When Solemn Simulacrum dies, you may draw a card. -MRD R, COM R, M12 R - -Solfatara -{2}{R} -Instant -Target player can't play land cards this turn. -Draw a card at the beginning of the next turn's upkeep. -VIS C - -Solidarity -{3}{W} -Instant -Creatures you control get +0/+5 until end of turn. -UDS C, 8ED C - -Solitary Confinement -{2}{W} -Enchantment -At the beginning of your upkeep, sacrifice Solitary Confinement unless you discard a card. -Skip your draw step. -You have shroud. (You can't be the target of spells or abilities.) -Prevent all damage that would be dealt to you. -JUD R - -Soliton -{5} -Artifact Creature - Construct -3/4 -{U}: Untap Soliton. -SOM C - -Soltari Champion -{2}{W} -Creature - Soltari Soldier -2/2 -Shadow (This creature can block or be blocked by only creatures with shadow.) -Whenever Soltari Champion attacks, all other creatures you control get +1/+1 until end of turn. -STH R - -Soltari Crusader -{2}{W} -Creature - Soltari Knight -2/1 -Shadow (This creature can block or be blocked by only creatures with shadow.) -{1}{W}: Soltari Crusader gets +1/+0 until end of turn. -TMP U - -Soltari Emissary -{1}{W} -Creature - Soltari Soldier -2/1 -{W}: Soltari Emissary gains shadow until end of turn. (This creature can block or be blocked by only creatures with shadow.) -TMP R - -Soltari Foot Soldier -{W} -Creature - Soltari Soldier -1/1 -Shadow (This creature can block or be blocked by only creatures with shadow.) -TMP C, BRB C - -Soltari Guerrillas -{2}{W}{R} -Creature - Soltari Soldier -3/2 -Shadow (This creature can block or be blocked by only creatures with shadow.) -{0}: The next time Soltari Guerrillas would deal combat damage to an opponent this turn, it deals that damage to target creature instead. -TMP R - -Soltari Lancer -{2}{W} -Creature - Soltari Knight -2/2 -Shadow (This creature can block or be blocked by only creatures with shadow.) -Soltari Lancer has first strike as long as it's attacking. -TMP C - -Soltari Monk -{W}{W} -Creature - Soltari Monk Cleric -2/1 -Protection from black -Shadow (This creature can block or be blocked by only creatures with shadow.) -TMP U - -Soltari Priest -{W}{W} -Creature - Soltari Cleric -2/1 -Protection from red -Shadow (This creature can block or be blocked by only creatures with shadow.) -TMP U, TSB S - -Soltari Trooper -{1}{W} -Creature - Soltari Soldier -1/1 -Shadow (This creature can block or be blocked by only creatures with shadow.) -Whenever Soltari Trooper attacks, it gets +1/+1 until end of turn. -TMP C - -Soltari Visionary -{1}{W}{W} -Creature - Soltari Cleric -2/2 -Shadow (This creature can block or be blocked by only creatures with shadow.) -Whenever Soltari Visionary deals damage to a player, destroy target enchantment that player controls. -EXO C - -Somber Hoverguard -{5}{U} -Creature - Drone -3/2 -Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -Flying -MRD C - -Somnomancer -{1}{W/U} -Creature - Kithkin Wizard -2/1 -When Somnomancer enters the battlefield, you may tap target creature. -SHM C - -Somnophore -{2}{U}{U} -Creature - Illusion -2/2 -Flying -Whenever Somnophore deals damage to a player, tap target creature that player controls. That creature doesn't untap during its controller's untap step for as long as Somnophore remains on the battlefield. -USG R - -Song of Blood -{1}{R} -Sorcery -Put the top four cards of your library into your graveyard. -Whenever a creature attacks this turn, it gets +1/+0 until end of turn for each creature card put into your graveyard this way. -VIS C - -Song of Serenity -{1}{G} -Enchantment -Creatures that are enchanted can't attack or block. -EXO U - -Songs of the Damned -{B} -Instant -Add {B} to your mana pool for each creature card in your graveyard. -ICE C, ME2 C - -Songstitcher -{W} -Creature - Human Cleric -1/1 -{1}{W}: Prevent all combat damage that would be dealt this turn by target attacking creature with flying. -USG U, BRB U - -Sonic Burst -{1}{R} -Instant -As an additional cost to cast Sonic Burst, discard a card at random. -Sonic Burst deals 4 damage to target creature or player. -EXO C, BTD C - -Sonic Seizure -{R} -Instant -As an additional cost to cast Sonic Seizure, discard a card at random. -Sonic Seizure deals 3 damage to target creature or player. -TOR C - -Soot Imp -{1}{B}{B} -Creature - Imp -1/2 -Flying -Whenever a player casts a nonblack spell, that player loses 1 life. -EVE U, DVD U - -Sootfeather Flock -{4}{B} -Creature - Bird -3/2 -Flying -Morph {3}{B} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -LGN C - -Soothing Balm -{1}{W} -Instant -Target player gains 5 life. -MMQ C - -Soothsaying -{U} -Enchantment -{3}{U}{U}: Shuffle your library. -{X}: Look at the top X cards of your library, then put them back in any order. -MMQ U - -Sootstoke Kindler -{1}{B/R} -Creature - Elemental Shaman -1/1 -Haste -{T}: Target black or red creature gains haste until end of turn. -SHM C - -Sootwalkers -{2}{B/R}{B/R} -Creature - Elemental Rogue -3/3 -Sootwalkers can't be blocked by white creatures. -SHM C - -Sophic Centaur -{3}{G} -Creature - Centaur Spellshaper -1/1 -{2}{G}{G}, {T}, Discard a card: You gain 2 life for each card in your hand. -PLC U - -Soramaro, First to Dream -{4}{U}{U} -Legendary Creature - Spirit -*/* -Flying -Soramaro, First to Dream's power and toughness are each equal to the number of cards in your hand. -{4}, Return a land you control to its owner's hand: Draw a card. -SOK R - -Soratami Cloud Chariot -{5} -Artifact -{2}: Target creature you control gains flying until end of turn. -{2}: Prevent all combat damage that would be dealt to and dealt by target creature you control this turn. -SOK U - -Soratami Cloudskater -{1}{U} -Creature - Moonfolk Rogue -1/1 -Flying -{2}, Return a land you control to its owner's hand: Draw a card, then discard a card. -CHK C - -Soratami Mindsweeper -{3}{U} -Creature - Moonfolk Wizard -1/4 -Flying -{2}, Return a land you control to its owner's hand: Target player puts the top two cards of his or her library into his or her graveyard. -BOK U - -Soratami Mirror-Guard -{3}{U} -Creature - Moonfolk Wizard -3/1 -Flying -{2}, Return a land you control to its owner's hand: Target creature with power 2 or less is unblockable this turn. -CHK C - -Soratami Mirror-Mage -{3}{U} -Creature - Moonfolk Wizard -2/1 -Flying -{3}, Return three lands you control to their owner's hand: Return target creature to its owner's hand. -CHK U - -Soratami Rainshaper -{2}{U} -Creature - Moonfolk Wizard -2/1 -Flying -{3}, Return a land you control to its owner's hand: Target creature you control gains shroud until end of turn. (It can't be the target of spells or abilities.) -CHK C - -Soratami Savant -{2}{U}{U} -Creature - Moonfolk Wizard -2/2 -Flying -{3}, Return a land you control to its owner's hand: Counter target spell unless its controller pays {3}. -CHK U - -Soratami Seer -{4}{U} -Creature - Moonfolk Wizard -2/3 -Flying -{4}, Return two lands you control to their owner's hand: Discard all the cards in your hand, then draw that many cards. -CHK U - -Soraya the Falconer -{1}{W}{W} -Legendary Creature - Human -2/2 -Bird creatures get +1/+1. -{1}{W}: Target Bird creature gains banding until end of turn. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding a player controls are blocking or being blocked by a creature, that player divides that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -HML R - -Sorcerer's Strongbox -{4} -Artifact -{2}, {T}: Flip a coin. If you win the flip, sacrifice Sorcerer's Strongbox and draw three cards. -ARC U, M11 U - -Sorceress Queen -{1}{B}{B} -Creature - Human Wizard -1/1 -{T}: Target creature other than Sorceress Queen becomes 0/2 until end of turn. -ARN U, 3ED R, 4ED R, 5ED R - -Sorcerous Sight -{U} -Sorcery -Look at target opponent's hand. -Draw a card. -POR C - -Sorin Markov -{3}{B}{B}{B} -Planeswalker - Sorin -4 -[+2] Sorin Markov deals 2 damage to target creature or player and you gain 2 life. -[-3] Target opponent's life total becomes 10. -[-7] You control target player during that player's next turn. -ZEN M, M12 M - -Sorin's Thirst -{B}{B} -Instant -Sorin's Thirst deals 2 damage to target creature and you gain 2 life. -M12 C - -Sorin's Vengeance -{4}{B}{B}{B} -Sorcery -Sorin's Vengeance deals 10 damage to target player and you gain 10 life. -M12 R - -Sorrow's Path -Land -{T}: Choose two target blocking creatures an opponent controls. If each of those creatures could block all creatures that the other is blocking, remove both of them from combat. Each one then blocks all creatures the other was blocking. -Whenever Sorrow's Path becomes tapped, it deals 2 damage to you and each creature you control. -DRK R, ME3 R - -Sosuke's Summons -{2}{G} -Sorcery -Put two 1/1 green Snake creature tokens onto the battlefield. -Whenever a nontoken Snake enters the battlefield under your control, you may return Sosuke's Summons from your graveyard to your hand. -BOK U - -Sosuke, Son of Seshiro -{2}{G}{G} -Legendary Creature - Snake Warrior -3/4 -Other Snake creatures you control get +1/+0. -Whenever a Warrior you control deals combat damage to a creature, destroy that creature at end of combat. -CHK U - -Soul Barrier -{2}{U} -Enchantment -Whenever an opponent casts a creature spell, Soul Barrier deals 2 damage to that player unless he or she pays {2}. -ICE U, 5ED C - -Soul Bleed -{2}{B} -Enchantment - Aura -Enchant creature -At the beginning of the upkeep of enchanted creature's controller, that player loses 1 life. -M10 C - -Soul Burn -{X}{2}{B} -Sorcery -Spend only black and/or red mana on X. -Soul Burn deals X damage to target creature or player. You gain life equal to the damage dealt, but not more than the amount of {B} spent on X, the player's life total before Soul Burn dealt damage, or the creature's toughness. -ICE C, INV C - -Soul Channeling -{2}{B} -Enchantment - Aura -Enchant creature -Pay 2 life: Regenerate enchanted creature. -MMQ C - -Soul Charmer -{2}{W} -Creature - Human Rebel -2/2 -Whenever Soul Charmer deals combat damage to a creature, you gain 2 life unless that creature's controller pays {2}. -PCY C - -Soul Collector -{3}{B}{B} -Creature - Vampire -3/4 -Flying -Whenever a creature dealt damage by Soul Collector this turn dies, return that card to the battlefield under your control. -Morph {B}{B}{B} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -PRO R, SCG R, TSB S - -Soul Conduit -{6} -Artifact -{6}, {T}: Two target players exchange life totals. -NPH R - -Soul Echo -{X}{W}{W} -Enchantment -Soul Echo enters the battlefield with X echo counters on it. -You don't lose the game for having 0 or less life. -At the beginning of your upkeep, sacrifice Soul Echo if there are no echo counters on it. Otherwise, target opponent may choose that for each 1 damage that would be dealt to you until your next upkeep, you remove an echo counter from Soul Echo instead. -MIR R - -Soul Exchange -{B}{B} -Sorcery -As an additional cost to cast Soul Exchange, exile a creature you control. -Return target creature card from your graveyard to the battlefield. Put a +2/+2 counter on that creature if the exiled creature was a Thrull. -FEM U, ME2 U - -Soul Feast -{3}{B}{B} -Sorcery -Target player loses 4 life and you gain 4 life. -UDS U, S99 U, 7ED U, 8ED U, 9ED U, 10E U - -Soul Foundry -{4} -Artifact -Imprint - When Soul Foundry enters the battlefield, you may exile a creature card from your hand. -{X}, {T}: Put a token that's a copy of the exiled card onto the battlefield. X is the converted mana cost of that card. -MRD R - -Soul Kiss -{2}{B} -Enchantment - Aura -Enchant creature -{B}, Pay 1 life: Enchanted creature gets +2/+2 until end of turn. Activate this ability no more than three times each turn. -ICE C, ME2 U - -Soul Link -{1}{W}{B} -Enchantment - Aura -Enchant creature -Whenever enchanted creature deals damage, you gain that much life. -Whenever enchanted creature is dealt damage, you gain that much life. -APC C - -Soul Manipulation -{1}{U}{B} -Instant -Choose one or both - Counter target creature spell; and/or return target creature card from your graveyard to your hand. -ARB C - -Soul Net -{1} -Artifact -Whenever a creature dies, you may pay {1}. If you do, you gain 1 life. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, 6ED U, S00 U, 7ED U - -Soul Nova -{3}{W}{W} -Instant -Exile target attacking creature and all Equipment attached to it. -MRD U - -Soul Parry -{1}{W} -Instant -Prevent all damage one or two target creatures would deal this turn. -SOM C - -Soul Reap -{1}{B} -Sorcery -Destroy target nongreen creature. Its controller loses 3 life if you've cast another black spell this turn. -EVE C - -Soul Rend -{1}{B} -Instant -Destroy target creature if it's white. A creature destroyed this way can't be regenerated. -Draw a card at the beginning of the next turn's upkeep. -MIR U - -Soul Scourge -{4}{B} -Creature - Nightmare Horror -3/2 -Flying -When Soul Scourge enters the battlefield, target player loses 3 life. -When Soul Scourge leaves the battlefield, that player gains 3 life. -TOR C - -Soul Sculptor -{2}{W} -Creature - Human -1/1 -{1}{W}, {T}: Target creature becomes an enchantment and loses all abilities until a player casts a creature spell. -USG R - -Soul Shepherd -{1}{W} -Creature - Human Cleric -2/1 -{W}, Exile a creature card from your graveyard: You gain 1 life. -WTH C - -Soul Shred -{3}{B}{B} -Sorcery -Soul Shred deals 3 damage to target nonblack creature. You gain 3 life. -POR C, ME4 C - -Soul Snare -{W} -Enchantment -{W}, Sacrifice Soul Snare: Exile target creature that's attacking you or a planeswalker you control. -COM U - -Soul Snuffers -{2}{B}{B} -Creature - Elemental Shaman -3/3 -When Soul Snuffers enters the battlefield, put a -1/-1 counter on each creature. -EVE U - -Soul Spike -{5}{B}{B} -Instant -You may exile two black cards from your hand rather than pay Soul Spike's mana cost. -Soul Spike deals 4 damage to target creature or player and you gain 4 life. -CSP R - -Soul Stair Expedition -{B} -Enchantment -Landfall - Whenever a land enters the battlefield under your control, you may put a quest counter on Soul Stair Expedition. -Remove three quest counters from Soul Stair Expedition and sacrifice it: Return up to two target creature cards from your graveyard to your hand. -ZEN C - -Soul Strings -{X}{B} -Sorcery -Return two target creature cards from your graveyard to your hand unless any player pays {X}. -PCY C - -Soul Warden -{W} -Creature - Human Cleric -1/1 -Whenever another creature enters the battlefield, you gain 1 life. -EXO C, BRB C, 9ED U, 10E U, M10 C, HOP C - -Soul of Magma -{3}{R}{R} -Creature - Spirit -2/2 -Whenever you cast a Spirit or Arcane spell, Soul of Magma deals 1 damage to target creature. -CHK C - -Soul's Attendant -{W} -Creature - Human Cleric -1/1 -Whenever another creature enters the battlefield, you may gain 1 life. -ROE C - -Soul's Fire -{2}{R} -Instant -Target creature you control on the battlefield deals damage equal to its power to target creature or player. -ALA C - -Soul's Grace -{1}{W} -Instant -You gain life equal to target creature's power. -ALA C - -Soul's Majesty -{4}{G} -Sorcery -Draw cards equal to the power of target creature you control. -CON R - -Soul's Might -{4}{G} -Sorcery -Put X +1/+1 counters on target creature, where X is that creature's power. -ALA C - -Soulblast -{3}{R}{R}{R} -Instant -As an additional cost to cast Soulblast, sacrifice all creatures you control. -Soulblast deals damage to target creature or player equal to the total power of the sacrificed creatures. -CHK R, 10E R - -Soulbound Guardians -{4}{W} -Creature - Kor Spirit -4/5 -Defender, flying -ROE U - -Soulbright Flamekin -{1}{R} -Creature - Elemental Shaman -2/1 -{2}: Target creature gains trample until end of turn. If this is the third time this ability has resolved this turn, you may add {R}{R}{R}{R}{R}{R}{R}{R} to your mana pool. -LRW C, JVC C - -Soulcatcher -{1}{W} -Creature - Bird Soldier -1/1 -Flying -Whenever a creature with flying dies, put a +1/+1 counter on Soulcatcher. -ODY U - -Soulcatchers' Aerie -{1}{W} -Enchantment -Whenever a Bird is put into your graveyard from the battlefield, put a feather counter on Soulcatchers' Aerie. -Bird creatures get +1/+1 for each feather counter on Soulcatchers' Aerie. -JUD U - -Souldrinker -{3}{B} -Creature - Spirit -2/2 -Pay 3 life: Put a +1/+1 counter on Souldrinker. -TMP U, DVD U - -Soulgorger Orgg -{3}{R}{R} -Creature - Nightmare Orgg -6/6 -Trample -When Soulgorger Orgg enters the battlefield, you lose all but 1 life. -When Soulgorger Orgg leaves the battlefield, you gain life equal to the life you lost when it entered the battlefield. -JUD U - -Soulless One -{3}{B} -Creature - Zombie Avatar -*/* -Soulless One's power and toughness are each equal to the number of Zombies on the battlefield plus the number of Zombie cards in all graveyards. -ONS U, HOP U - -Soulless Revival -{1}{B} -Instant - Arcane -Return target creature card from your graveyard to your hand. -Splice onto Arcane {1}{B} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -CHK C - -Soulquake -{3}{U}{U}{B}{B} -Sorcery -Return all creatures on the battlefield and all creature cards in graveyards to their owners' hands. -ARB R - -Souls of the Faultless -{W}{B}{B} -Creature - Spirit -0/4 -Defender (This creature can't attack.) -Whenever Souls of the Faultless is dealt combat damage, you gain that much life and attacking player loses that much life. -GPT U - -Soulscour -{7}{W}{W}{W} -Sorcery -Destroy all nonartifact permanents. -DST R - -Soulshriek -{B} -Instant -Target creature you control gets +X/+0 until end of turn, where X is the number of creature cards in your graveyard. Sacrifice that creature at the beginning of the next end step. -MIR C - -Soulsurge Elemental -{3}{R} -Creature - Elemental -*/1 -First strike -Soulsurge Elemental's power is equal to the number of creatures you control. -ROE U - -Soulsworn Jury -{2}{W} -Creature - Spirit -1/4 -Defender (This creature can't attack.) -{1}{U}, Sacrifice Soulsworn Jury: Counter target creature spell. -DIS C - -Soultether Golem -{2} -Artifact Creature - Golem -3/3 -Vanishing 1 (This permanent enters the battlefield with a time counter on it. At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.) -Whenever another creature enters the battlefield under your control, put a time counter on Soultether Golem. -FUT U - -Sound the Call -{2}{G} -Sorcery -Put a 1/1 green Wolf creature token onto the battlefield. It has "This creature gets +1/+1 for each card named Sound the Call in each graveyard." -CSP C - -Southern Elephant -{3}{G} -Creature - Elephant -3/4 -PTK C, S99 C, ME4 C - -Southern Paladin -{2}{W}{W} -Creature - Human Knight -3/3 -{W}{W}, {T}: Destroy target red permanent. -WTH R, 7ED R - -Sovereigns of Lost Alara -{4}{W}{U} -Creature - Spirit -4/5 -Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.) -Whenever a creature you control attacks alone, you may search your library for an Aura card that could enchant that creature, put it onto the battlefield attached to that creature, then shuffle your library. -ARB R - -Sower of Temptation -{2}{U}{U} -Creature - Faerie Wizard -2/2 -Flying -When Sower of Temptation enters the battlefield, gain control of target creature for as long as Sower of Temptation remains on the battlefield. -LRW R - -Sowing Salt -{2}{R}{R} -Sorcery -Exile target nonbasic land. Search its controller's graveyard, hand, and library for all cards with the same name as that land and exile them. Then that player shuffles his or her library. -UDS U, BOK U - -Spark Elemental -{R} -Creature - Elemental -3/1 -Trample, haste (If this creature would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker. This creature can attack and {T} as soon as it comes under your control.) -At the beginning of the end step, sacrifice Spark Elemental. -5DN C, 10E U, H10 U - -Spark Mage -{R} -Creature - Dwarf Wizard -1/1 -Whenever Spark Mage deals combat damage to a player, you may have Spark Mage deal 1 damage to target creature that player controls. -ODY U - -Spark Spray -{R} -Instant -Spark Spray deals 1 damage to target creature or player. -Cycling {R} ({R}, Discard this card: Draw a card.) -SCG C - -Sparkcaster -{2}{R}{G} -Creature - Kavu -5/3 -When Sparkcaster enters the battlefield, return a red or green creature you control to its owner's hand. -When Sparkcaster enters the battlefield, it deals 1 damage to target player. -PLS U - -Sparkmage Apprentice -{1}{R} -Creature - Human Wizard -1/1 -When Sparkmage Apprentice enters the battlefield, it deals 1 damage to target creature or player. -RAV C, M10 C - -Sparksmith -{1}{R} -Creature - Goblin -1/1 -{T}: Sparksmith deals X damage to target creature and X damage to you, where X is the number of Goblins on the battlefield. -ONS C - -Sparkspitter -{2}{R} -Creature - Elemental Spellshaper -1/3 -{R}, {T}, Discard a card: Put a 3/1 red Elemental creature token named Spark Elemental onto the battlefield. It has trample, haste, and "At the beginning of the end step, sacrifice Spark Elemental." -FUT U - -Sparring Collar -{2} -Artifact - Equipment -Equipped creature has first strike. -{R}{R}: Attach Sparring Collar to target creature you control. -Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) -5DN C - -Sparring Golem -{3} -Artifact Creature - Golem -2/2 -Whenever Sparring Golem becomes blocked, it gets +1/+1 until end of turn for each creature blocking it. -INV U - -Spatial Binding -{U}{B} -Enchantment -Pay 1 life: Until your next upkeep, target permanent can't phase out. -MIR U - -Spawnbroker -{2}{U} -Creature - Human Wizard -1/1 -When Spawnbroker enters the battlefield, you may exchange control of target creature you control and target creature with power less than or equal to that creature's power an opponent controls. -RAV R - -Spawning Breath -{1}{R} -Instant -Spawning Breath deals 1 damage to target creature or player. Put a 0/1 colorless Eldrazi Spawn creature token onto the battlefield. It has "Sacrifice this creature: Add {1} to your mana pool." -ROE C - -Spawning Pit -{2} -Artifact -Sacrifice a creature: Put a charge counter on Spawning Pit. -{1}, Remove two charge counters from Spawning Pit: Put a 2/2 colorless Spawn artifact creature token onto the battlefield. -DST U - -Spawning Pool -Land -Spawning Pool enters the battlefield tapped. -{T}: Add {B} to your mana pool. -{1}{B}: Spawning Pool becomes a 1/1 black Skeleton creature with "{B}: Regenerate this creature" until end of turn. It's still a land. (If it regenerates, the next time it would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.) -ULG U, 10E U - -Spawnsire of Ulamog -{10} -Creature - Eldrazi -7/11 -Annihilator 1 (Whenever this creature attacks, defending player sacrifices a permanent.) -{4}: Put two 0/1 colorless Eldrazi Spawn creature tokens onto the battlefield. They have "Sacrifice this creature: Add {1} to your mana pool." -{20}: Cast any number of Eldrazi cards you own from outside the game without paying their mana costs. -ROE R - -Spawnwrithe -{2}{G} -Creature - Elemental -2/2 -Trample -Whenever Spawnwrithe deals combat damage to a player, put a token that's a copy of Spawnwrithe onto the battlefield. -SHM R, COM R - -Spearbreaker Behemoth -{5}{G}{G} -Creature - Beast -5/5 -Spearbreaker Behemoth is indestructible. -{1}: Target creature with power 5 or greater is indestructible this turn. -ALA R - -Specter's Shroud -{2} -Artifact - Equipment -Equipped creature gets +1/+0. -Whenever equipped creature deals combat damage to a player, that player discards a card. -Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.) -DST U - -Specter's Wail -{1}{B} -Sorcery -Target player discards a card at random. -MMQ C - -Spectral Bears -{1}{G} -Creature - Bear Spirit -3/3 -Whenever Spectral Bears attacks, if defending player controls no black nontoken permanents, it doesn't untap during your next untap step. -HML U, MED U - -Spectral Cloak -{U}{U} -Enchantment - Aura -Enchant creature -Enchanted creature has shroud as long as it's untapped. (It can't be the target of spells or abilities.) -LEG U - -Spectral Force -{3}{G}{G} -Creature - Elemental Spirit -8/8 -Trample -Whenever Spectral Force attacks, if defending player controls no black permanents, it doesn't untap during your next untap step. -TSP R - -Spectral Guardian -{2}{W}{W} -Creature - Spirit -2/3 -As long as Spectral Guardian is untapped, noncreature artifacts have shroud. (They can't be the targets of spells or abilities.) -MIR R - -Spectral Lynx -{1}{W} -Creature - Cat Spirit -2/1 -Protection from green -{B}: Regenerate Spectral Lynx. -APC R - -Spectral Procession -{2/W}{2/W}{2/W} -Sorcery -({2/W} can be paid with any two mana or with {W}. This card's converted mana cost is 6.) -Put three 1/1 white Spirit creature tokens with flying onto the battlefield. -SHM U - -Spectral Searchlight -{3} -Artifact -{T}: Choose a player. That player adds one mana of any color he or she chooses to his or her mana pool. -RAV U - -Spectral Shield -{1}{W}{U} -Enchantment - Aura -Enchant creature -Enchanted creature gets +0/+2 and can't be the target of spells. -ICE U, ME3 U - -Spectral Shift -{1}{U} -Instant -Choose one - Change the text of target spell or permanent by replacing all instances of one basic land type with another; or change the text of target spell or permanent by replacing all instances of one color word with another. (These effects last indefinitely.) -Entwine {2} (Choose both if you pay the entwine cost.) -5DN R - -Spectral Sliver -{2}{B} -Creature - Sliver Spirit -2/2 -All Sliver creatures have "{2}: This creature gets +1/+1 until end of turn." -LGN U, H09 U - -Spell Blast -{X}{U} -Instant -Counter target spell with converted mana cost X. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, TMP C, 6ED C - -Spell Burst -{X}{U} -Instant -Buyback {3} (You may pay an additional {3} as you cast this spell. If you do, put this card into your hand as it resolves.) -Counter target spell with converted mana cost X. -TSP U - -Spell Contortion -{2}{U} -Instant -Multikicker {1}{U} (You may pay an additional {1}{U} any number of times as you cast this spell.) -Counter target spell unless its controller pays {2}. Draw a card for each time Spell Contortion was kicked. -WWK U - -Spell Crumple -{1}{U}{U} -Instant -Counter target spell. If that spell is countered this way, put it on the bottom of its owner's library instead of into that player's graveyard. Put Spell Crumple on the bottom of its owner's library. -COM U - -Spell Pierce -{U} -Instant -Counter target noncreature spell unless its controller pays {2}. -ZEN C - -Spell Snare -{U} -Instant -Counter target spell with converted mana cost 2. -DIS U - -Spell Snip -{2}{U} -Instant -Counter target spell unless its controller pays {1}. -Cycling {2} ({2}, Discard this card: Draw a card.) -ALA C - -Spell Syphon -{1}{U} -Instant -Counter target spell unless its controller pays {1} for each blue permanent you control. -SHM C - -Spellbane Centaur -{2}{G} -Creature - Centaur -3/2 -Creatures you control can't be the targets of blue spells or abilities from blue sources. -ODY R - -Spellbinder -{3} -Artifact - Equipment -Imprint - When Spellbinder enters the battlefield, you may exile an instant card from your hand. -Whenever equipped creature deals combat damage to a player, you may copy the exiled card. If you do, you may cast the copy without paying its mana cost. -Equip {4} -DST R - -Spellbook -{0} -Artifact -You have no maximum hand size. -EXO U, 7ED U, 8ED U, 9ED U, 10E U, M10 U - -Spellbound Dragon -{3}{U}{R} -Creature - Dragon -3/5 -Flying -Whenever Spellbound Dragon attacks, draw a card, then discard a card. Spellbound Dragon gets +X/+0 until end of turn, where X is the discarded card's converted mana cost. -ARB R - -Spellbreaker Behemoth -{1}{R}{G}{G} -Creature - Beast -5/5 -Spellbreaker Behemoth can't be countered. -Creature spells you control with power 5 or greater can't be countered. -ARB R - -Spellgorger Barbarian -{3}{R} -Creature - Human Nightmare Barbarian -3/1 -When Spellgorger Barbarian enters the battlefield, discard a card at random. -When Spellgorger Barbarian leaves the battlefield, draw a card. -JUD C - -Spelljack -{3}{U}{U}{U} -Instant -Counter target spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyard. You may play it without paying its mana cost for as long as it remains exiled. (If it has X in its mana cost, X is 0.) -JUD R - -Spellshift -{3}{U} -Instant -Counter target instant or sorcery spell. Its controller reveals cards from the top of his or her library until he or she reveals an instant or sorcery card. That player may cast that card without paying its mana cost. Then he or she shuffles his or her library. -PLC R - -Spellshock -{2}{R} -Enchantment -Whenever a player casts a spell, Spellshock deals 2 damage to that player. -EXO U - -Spellskite -{2} -Artifact Creature - Horror -0/4 -{U/P}: Change a target of target spell or ability to Spellskite. ({U/P} can be paid with either {U} or 2 life.) -NPH R - -Spellstutter Sprite -{1}{U} -Creature - Faerie Wizard -1/1 -Flash -Flying -When Spellstutter Sprite enters the battlefield, counter target spell with converted mana cost X or less, where X is the number of Faeries you control. -LRW C - -Spelltithe Enforcer -{3}{W}{W} -Creature - Elephant Wizard -3/3 -Whenever an opponent casts a spell, that player sacrifices a permanent unless he or she pays {1}. -GPT R - -Spellweaver Helix -{3} -Artifact -Imprint - When Spellweaver Helix enters the battlefield, you may exile two target sorcery cards from a single graveyard. -Whenever a player casts a card, if it has the same name as one of the cards exiled with Spellweaver Helix, you may copy the other. If you do, you may cast the copy without paying its mana cost. -MRD R - -Spellweaver Volute -{3}{U}{U} -Enchantment - Aura -Enchant instant card in a graveyard -Whenever you cast a sorcery spell, copy the enchanted instant card. You may cast the copy without paying its mana cost. If you do, exile the enchanted card and attach Spellweaver Volute to another instant card in a graveyard. -FUT R - -Spellwild Ouphe -{1}{G} -Creature - Ouphe -1/3 -Spells that target Spellwild Ouphe cost {2} less to cast. -FUT U - -Sphere of Duty -{3}{W} -Enchantment -If a green source would deal damage to you, prevent 2 of that damage. -ODY U - -Sphere of Grace -{3}{W} -Enchantment -If a black source would deal damage to you, prevent 2 of that damage. -ODY U - -Sphere of Law -{3}{W} -Enchantment -If a red source would deal damage to you, prevent 2 of that damage. -ODY U - -Sphere of Purity -{3}{W} -Enchantment -If an artifact would deal damage to you, prevent 1 of that damage. -MRD C - -Sphere of Reason -{3}{W} -Enchantment -If a blue source would deal damage to you, prevent 2 of that damage. -ODY U - -Sphere of Resistance -{2} -Artifact -Spells cost {1} more to cast. -EXO R - -Sphere of Truth -{3}{W} -Enchantment -If a white source would deal damage to you, prevent 2 of that damage. -ODY U - -Sphere of the Suns -{2} -Artifact -Sphere of the Suns enters the battlefield tapped and with three charge counters on it. -{T}, Remove a charge counter from Sphere of the Suns: Add one mana of any color to your mana pool. -MBS U - -Sphinx Ambassador -{5}{U}{U} -Creature - Sphinx -5/5 -Flying -Whenever Sphinx Ambassador deals combat damage to a player, search that player's library for a card, then that player names a card. If you searched for a creature card that isn't the named card, you may put it onto the battlefield under your control. Then that player shuffles his or her library. -M10 M - -Sphinx Sovereign -{4}{W}{U}{U}{B} -Artifact Creature - Sphinx -6/6 -Flying -At the beginning of your end step, you gain 3 life if Sphinx Sovereign is untapped. Otherwise, each opponent loses 3 life. -ALA M - -Sphinx Summoner -{3}{U}{B} -Artifact Creature - Sphinx -3/3 -Flying -When Sphinx Summoner enters the battlefield, you may search your library for an artifact creature card, reveal it, and put it into your hand. If you do, shuffle your library. -CON R - -Sphinx of Jwar Isle -{4}{U}{U} -Creature - Sphinx -5/5 -Flying, shroud -You may look at the top card of your library. (You may do this at any time.) -ZEN R - -Sphinx of Lost Truths -{3}{U}{U} -Creature - Sphinx -3/5 -Kicker {1}{U} (You may pay an additional {1}{U} as you cast this spell.) -Flying -When Sphinx of Lost Truths enters the battlefield, draw three cards. Then if it wasn't kicked, discard three cards. -ZEN R - -Sphinx of Magosi -{3}{U}{U}{U} -Creature - Sphinx -6/6 -Flying -{2}{U}: Draw a card, then put a +1/+1 counter on Sphinx of Magosi. -ROE R - -Sphinx of Uthuun -{5}{U}{U} -Creature - Sphinx -5/6 -Flying -When Sphinx of Uthuun enters the battlefield, reveal the top five cards of your library. An opponent separates those cards into two piles. Put one pile into your hand and the other into your graveyard. -M12 R - -Sphinx of the Steel Wind -{5}{W}{U}{B} -Artifact Creature - Sphinx -6/6 -Flying, first strike, vigilance, lifelink, protection from red and from green -ARB M - -Sphinx's Herald -{U} -Artifact Creature - Vedalken Wizard -1/1 -{2}{U}, {T}, Sacrifice a white creature, a blue creature, and a black creature: Search your library for a card named Sphinx Sovereign and put it onto the battlefield. Then shuffle your library. -ALA U - -Sphinx-Bone Wand -{7} -Artifact -Whenever you cast an instant or sorcery spell, you may put a charge counter on Sphinx-Bone Wand. If you do, Sphinx-Bone Wand deals damage equal to the number of charge counters on it to target creature or player. -ROE R - -Spider Climb -{G} -Enchantment - Aura -You may cast Spider Climb as though it had flash. If you cast it any time a sorcery couldn't have been cast, the controller of the permanent it becomes sacrifices it at the beginning of the next cleanup step. -Enchant creature -Enchanted creature gets +0/+3 and has reach. (It can block creatures with flying.) -VIS C - -Spider Umbra -{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+1 and has reach. (It can block creatures with flying.) -Totem armor (If enchanted creature would be destroyed, instead remove all damage from it and destroy this Aura.) -ROE C, ARC C - -Spidersilk Armor -{2}{G} -Enchantment -Creatures you control get +0/+1 and have reach. (They can block creatures with flying.) -MMQ C, DDG C - -Spidersilk Net -{0} -Artifact - Equipment -Equipped creature gets +0/+2 and has reach. (It can block creatures with flying.) -Equip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) -ZEN C - -Spiderwig Boggart -{2}{B} -Creature - Goblin Shaman -2/2 -When Spiderwig Boggart enters the battlefield, target creature gains fear until end of turn. (It can't be blocked except by artifact creatures and/or black creatures.) -LRW C - -Spike Breeder -{3}{G} -Creature - Spike -0/0 -Spike Breeder enters the battlefield with three +1/+1 counters on it. -{2}, Remove a +1/+1 counter from Spike Breeder: Put a +1/+1 counter on target creature. -{2}, Remove a +1/+1 counter from Spike Breeder: Put a 1/1 green Spike creature token onto the battlefield. -STH R - -Spike Cannibal -{1}{B}{B} -Creature - Spike -0/0 -Spike Cannibal enters the battlefield with a +1/+1 counter on it. -When Spike Cannibal enters the battlefield, move all +1/+1 counters from all creatures onto it. -EXO U - -Spike Colony -{4}{G} -Creature - Spike -0/0 -Spike Colony enters the battlefield with four +1/+1 counters on it. -{2}, Remove a +1/+1 counter from Spike Colony: Put a +1/+1 counter on target creature. -STH C, BRB C - -Spike Drone -{G} -Creature - Spike Drone -0/0 -Spike Drone enters the battlefield with a +1/+1 counter on it. -{2}, Remove a +1/+1 counter from Spike Drone: Put a +1/+1 counter on target creature. -TMP C - -Spike Feeder -{1}{G}{G} -Creature - Spike -0/0 -Spike Feeder enters the battlefield with two +1/+1 counters on it. -{2}, Remove a +1/+1 counter from Spike Feeder: Put a +1/+1 counter on target creature. -Remove a +1/+1 counter from Spike Feeder: You gain 2 life. -STH U, BRB U, TSB S, COM U - -Spike Hatcher -{6}{G} -Creature - Spike -0/0 -Spike Hatcher enters the battlefield with six +1/+1 counters on it. -{2}, Remove a +1/+1 counter from Spike Hatcher: Put a +1/+1 counter on target creature. -{1}, Remove a +1/+1 counter from Spike Hatcher: Regenerate Spike Hatcher. -EXO R - -Spike Rogue -{1}{G}{G} -Creature - Spike -0/0 -Spike Rogue enters the battlefield with two +1/+1 counters on it. -{2}, Remove a +1/+1 counter from Spike Rogue: Put a +1/+1 counter on target creature. -{2}, Remove a +1/+1 counter from a creature you control: Put a +1/+1 counter on Spike Rogue. -EXO U - -Spike Soldier -{2}{G}{G} -Creature - Spike Soldier -0/0 -Spike Soldier enters the battlefield with three +1/+1 counters on it. -{2}, Remove a +1/+1 counter from Spike Soldier: Put a +1/+1 counter on target creature. -Remove a +1/+1 counter from Spike Soldier: Spike Soldier gets +2/+2 until end of turn. -STH U - -Spike Tiller -{3}{G}{G} -Creature - Spike -0/0 -Spike Tiller enters the battlefield with three +1/+1 counters on it. -{2}, Remove a +1/+1 counter from Spike Tiller: Put a +1/+1 counter on target creature. -{2}, Remove a +1/+1 counter from Spike Tiller: Target land becomes a 2/2 creature that's still a land. Put a +1/+1 counter on it. -TSP R - -Spike Weaver -{2}{G}{G} -Creature - Spike -0/0 -Spike Weaver enters the battlefield with three +1/+1 counters on it. -{2}, Remove a +1/+1 counter from Spike Weaver: Put a +1/+1 counter on target creature. -{1}, Remove a +1/+1 counter from Spike Weaver: Prevent all combat damage that would be dealt this turn. -EXO R, BRB R - -Spike Worker -{2}{G} -Creature - Spike -0/0 -Spike Worker enters the battlefield with two +1/+1 counters on it. -{2}, Remove a +1/+1 counter from Spike Worker: Put a +1/+1 counter on target creature. -STH C, BRB C - -Spikeshot Elder -{R} -Creature - Goblin Shaman -1/1 -{1}{R}{R}: Spikeshot Elder deals damage equal to its power to target creature or player. -SOM R - -Spikeshot Goblin -{2}{R} -Creature - Goblin Shaman -1/2 -{R}, {T}: Spikeshot Goblin deals damage equal to its power to target creature or player. -MRD C - -Spiketail Drake -{3}{U}{U} -Creature - Drake -3/3 -Flying -Sacrifice Spiketail Drake: Counter target spell unless its controller pays {3}. -PCY U - -Spiketail Drakeling -{1}{U}{U} -Creature - Drake -2/2 -Flying -Sacrifice Spiketail Drakeling: Counter target spell unless its controller pays {2}. -TSP C - -Spiketail Hatchling -{1}{U} -Creature - Drake -1/1 -Flying (This creature can't be blocked except by creatures with flying or reach.) -Sacrifice Spiketail Hatchling: Counter target spell unless its controller pays {1}. -PCY C, 8ED U, 10E U - -Spin Engine -{3} -Artifact Creature - Construct -3/1 -{R}: Target creature can't block Spin Engine this turn. -MBS C - -Spin into Myth -{4}{U} -Instant -Put target creature on top of its owner's library, then fateseal 2. (To fateseal 2, look at the top two cards of an opponent's library, then put any number of them on the bottom of that player's library and the rest on top in any order.) -FUT U, ARC U - -Spinal Embrace -{3}{U}{U}{B} -Instant -Cast Spinal Embrace only during combat. -Untap target creature you don't control and gain control of it. It gains haste until end of turn. At the beginning of the next end step, sacrifice it. If you do, you gain life equal to its toughness. -INV R - -Spinal Graft -{1}{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets +3/+3. -When enchanted creature becomes the target of a spell or ability, destroy that creature. It can't be regenerated. -TMP C - -Spinal Parasite -{5} -Artifact Creature - Insect --1/-1 -Sunburst (This enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.) -Remove two +1/+1 counters from Spinal Parasite: Remove a counter from target permanent. -5DN U - -Spinal Villain -{2}{R} -Creature - Beast -1/2 -{T}: Destroy target blue creature. -LEG R, MED U - -Spincrusher -{2} -Artifact Creature - Construct -0/2 -Whenever Spincrusher blocks, put a +1/+1 counter on it. -Remove a +1/+1 counter from Spincrusher: Spincrusher is unblockable this turn. -DST U - -Spindrift Drake -{U} -Creature - Drake -2/1 -Flying -At the beginning of your upkeep, sacrifice Spindrift Drake unless you pay {U}. -STH C - -Spine of Ish Sah -{7} -Artifact -When Spine of Ish Sah enters the battlefield, destroy target permanent. -When Spine of Ish Sah is put into a graveyard from the battlefield, return Spine of Ish Sah to its owner's hand. -MBS R - -Spinebiter -{4}{G}{G} -Creature - Beast -3/4 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -You may have Spinebiter assign its combat damage as though it weren't blocked. -NPH U - -Spined Basher -{2}{B} -Creature - Zombie Beast -3/1 -Morph {2}{B} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS C - -Spined Fluke -{2}{B} -Creature - Worm Horror -5/1 -When Spined Fluke enters the battlefield, sacrifice a creature. -{B}: Regenerate Spined Fluke. -USG U - -Spined Sliver -{R}{G} -Creature - Sliver -2/2 -Whenever a Sliver becomes blocked, that Sliver gets +1/+1 until end of turn for each creature blocking it. -STH U, TSB S, H09 U - -Spined Thopter -{2}{U/P} -Artifact Creature - Thopter -2/1 -({U/P} can be paid with either {U} or 2 life.) -Flying -NPH C - -Spined Wurm -{4}{G} -Creature - Wurm -5/4 -POR C, STH C, S00 C, 7ED C, 8ED C, 9ED C, 10E C, M11 C - -Spineless Thug -{1}{B} -Creature - Zombie Mercenary -2/2 -Spineless Thug can't block. -NEM C, 7ED C, 8ED C, 9ED C, 10E C - -Spinerock Knoll -Land -Hideaway (This land enters the battlefield tapped. When it does, look at the top four cards of your library, exile one face down, then put the rest on the bottom of your library.) -{T}: Add {R} to your mana pool. -{R}, {T}: You may play the exiled card without paying its mana cost if an opponent was dealt 7 or more damage this turn. -LRW R - -Spinneret Sliver -{1}{G} -Creature - Sliver -2/2 -All Sliver creatures have reach. (They can block creatures with flying.) -TSP C - -Spinning Darkness -{4}{B}{B} -Instant -You may exile the top three black cards of your graveyard rather than pay Spinning Darkness's mana cost. -Spinning Darkness deals 3 damage to target nonblack creature. You gain 3 life. -WTH C - -Spiny Starfish -{2}{U} -Creature - Starfish -0/1 -{U}: Regenerate Spiny Starfish. -At the beginning of each end step, if Spiny Starfish regenerated this turn, put a 0/1 blue Starfish creature token onto the battlefield for each time it regenerated this turn. -ALL U, ME3 U - -Spiraling Duelist -{2}{R}{R} -Creature - Human Berserker -3/1 -Metalcraft - Spiraling Duelist has double strike as long as you control three or more artifacts. -MBS U - -Spiraling Embers -{3}{R} -Sorcery - Arcane -Spiraling Embers deals damage to target creature or player equal to the number of cards in your hand. -SOK C - -Spire Barrage -{4}{R} -Sorcery -Spire Barrage deals damage to target creature or player equal to the number of Mountains you control. -ZEN C - -Spire Golem -{6} -Artifact Creature - Golem -2/4 -Affinity for Islands (This spell costs {1} less to cast for each Island you control.) -Flying -DST C, JVC C - -Spire Monitor -{4}{U} -Creature - Drake -3/3 -Flash (You may cast this spell any time you could cast an instant.) -Flying -NPH C - -Spire Owl -{1}{U} -Creature - Bird -1/1 -Flying -When Spire Owl enters the battlefield, look at the top four cards of your library, then put them back in any order. -USG C - -Spire Serpent -{4}{U} -Creature - Serpent -3/5 -Defender -Metalcraft - As long as you control three or more artifacts, Spire Serpent gets +2/+2 and can attack as though it didn't have defender. -MBS C - -Spirit Cairn -{2}{W} -Enchantment -Whenever a player discards a card, you may pay {W}. If you do, put a 1/1 white Spirit creature token with flying onto the battlefield. -JUD U - -Spirit Flare -{3}{W} -Instant -Tap target untapped creature you control. If you do, it deals damage equal to its power to target attacking or blocking creature an opponent controls. -Flashback-{1}{W}, Pay 3 life. (You may cast this card from your graveyard for its flashback cost. Then exile it.) -TOR C - -Spirit Link -{W} -Enchantment - Aura -Enchant creature (Target a creature as you cast this. This card enters the battlefield attached to that creature.) -Whenever enchanted creature deals damage, you gain that much life. -LEG U, 4ED U, 5ED U, 6ED U, 7ED U, 8ED U, 9ED U, 10E U - -Spirit Loop -{1}{W} -Enchantment - Aura -Enchant creature you control -Whenever enchanted creature deals damage, you gain that much life. -When Spirit Loop is put into a graveyard from the battlefield, return Spirit Loop to its owner's hand. -TSP U - -Spirit Mantle -{1}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+1 and has protection from creatures. (It can't be blocked, targeted, or dealt damage by creatures.) -M12 U - -Spirit Mirror -{2}{W}{W} -Enchantment -At the beginning of your upkeep, if there are no Reflection tokens on the battlefield, put a 2/2 white Reflection creature token onto the battlefield. -{0}: Destroy target Reflection. -TMP R - -Spirit Shackle -{B}{B} -Enchantment - Aura -Enchant creature -Whenever enchanted creature becomes tapped, put a -0/-2 counter on it. -LEG C, 4ED U, ME3 C - -Spirit Shield -{3} -Artifact -You may choose not to untap Spirit Shield during your untap step. -{2}, {T}: Target creature gets +0/+2 for as long as Spirit Shield remains tapped. -FEM R - -Spirit Weaver -{1}{W} -Creature - Human Wizard -2/1 -{2}: Target green or blue creature gets +0/+1 until end of turn. -INV U, 10E U - -Spirit en-Dal -{2}{W} -Creature - Spirit -2/1 -Shadow (This creature can block or be blocked by only creatures with shadow.) -Forecast - {1}{W}, Reveal Spirit en-Dal from your hand: Target creature gains shadow until end of turn. (Activate this ability only during your upkeep and only once each turn.) -FUT U - -Spirit en-Kor -{3}{W} -Creature - Kor Spirit -2/2 -Flying -{0}: The next 1 damage that would be dealt to Spirit en-Kor this turn is dealt to target creature you control instead. -STH C - -Spirit of Resistance -{2}{W} -Enchantment -As long as you control a permanent of each color, prevent all damage that would be dealt to you. -INV R - -Spirit of the Hearth -{4}{W}{W} -Creature - Cat Spirit -4/5 -Flying -You have hexproof. (You can't be the target of spells or abilities your opponents control.) -EVE R - -Spirit of the Night -{6}{B}{B}{B} -Legendary Creature - Demon Spirit -6/5 -Flying, trample, haste, protection from black -Spirit of the Night has first strike as long as it's attacking. -MIR R - -Spiritmonger -{3}{B}{G} -Creature - Beast -6/6 -Whenever Spiritmonger deals damage to a creature, put a +1/+1 counter on Spiritmonger. -{B}: Regenerate Spiritmonger. -{G}: Spiritmonger becomes the color of your choice until end of turn. -APC R - -Spiritual Asylum -{2}{W}{W} -Enchantment -Creatures and lands you control have shroud. (They can't be the targets of spells or abilities.) -When a creature you control attacks, sacrifice Spiritual Asylum. -NEM R - -Spiritual Focus -{1}{W} -Enchantment -Whenever a spell or ability an opponent controls causes you to discard a card, you gain 2 life and you may draw a card. -MMQ R - -Spiritual Guardian -{3}{W}{W} -Creature - Spirit -3/4 -When Spiritual Guardian enters the battlefield, you gain 4 life. -POR R - -Spiritual Sanctuary -{2}{W}{W} -Enchantment -At the beginning of each player's upkeep, if that player controls a Plains, he or she gains 1 life. -LEG R - -Spiritual Visit -{W} -Instant - Arcane -Put a 1/1 colorless Spirit creature token onto the battlefield. -Splice onto Arcane {W} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -SOK C - -Spiritualize -{2}{W} -Instant -Until end of turn, whenever target creature deals damage, you gain that much life. -Draw a card. -ODY U - -Spite -{3}{U} -Instant -Counter target noncreature spell. ----- -Malice -{3}{B} -Instant -Destroy target nonblack creature. It can't be regenerated. -INV U (x2) - -Spitebellows -{5}{R} -Creature - Elemental -6/1 -When Spitebellows leaves the battlefield, it deals 6 damage to target creature. -Evoke {1}{R}{R} (You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield.) -MOR U, COM U - -Spiteflame Witch -{1}{B/R} -Creature - Elemental Shaman -2/1 -{B}{R}: Each player loses 1 life. -SHM U - -Spiteful Bully -{1}{B} -Creature - Zombie Mercenary -3/3 -At the beginning of your upkeep, Spiteful Bully deals 3 damage to target creature you control. -NEM C - -Spiteful Visions -{2}{B/R}{B/R} -Enchantment -At the beginning of each player's draw step, that player draws an additional card. -Whenever a player draws a card, Spiteful Visions deals 1 damage to that player. -SHM R - -Spitemare -{2}{R/W}{R/W} -Creature - Elemental -3/3 -Whenever Spitemare is dealt damage, it deals that much damage to target creature or player. -EVE U - -Spitfire Handler -{1}{R} -Creature - Goblin -1/1 -Spitfire Handler can't block creatures with power greater than Spitfire Handler's power. -{R}: Spitfire Handler gets +1/+0 until end of turn. -ONS U - -Spitting Drake -{3}{R} -Creature - Drake -2/2 -Flying -{R}: Spitting Drake gets +1/+0 until end of turn. Activate this ability only once each turn. -VIS U, 6ED U - -Spitting Earth -{1}{R} -Sorcery -Spitting Earth deals damage to target creature equal to the number of Mountains you control. -MIR C, POR C, P02 C, 6ED C, S99 U, 7ED C, 10E C, EVG C, DDG C - -Spitting Gourna -{3}{G}{G} -Creature - Beast -3/4 -Reach (This creature can block creatures with flying.) -Morph {4}{G} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS C - -Spitting Hydra -{3}{R}{R} -Creature - Hydra -0/0 -Spitting Hydra enters the battlefield with four +1/+1 counters on it. -{1}{R}, Remove a +1/+1 counter from Spitting Hydra: Spitting Hydra deals 1 damage to target creature. -STH R - -Spitting Image -{4}{G/U}{G/U} -Sorcery -Put a token that's a copy of target creature onto the battlefield. -Retrace (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) -EVE R - -Spitting Sliver -{4}{B} -Creature - Sliver -3/3 -All Sliver creatures have first strike. -PLC C - -Spitting Slug -{1}{G}{G} -Creature - Slug -2/4 -Whenever Spitting Slug blocks or becomes blocked, you may pay {1}{G}. If you do, Spitting Slug gains first strike until end of turn. Otherwise, each creature blocking or blocked by Spitting Slug gains first strike until end of turn. -DRK U, TSB S - -Spitting Spider -{3}{G}{G} -Creature - Spider -3/5 -Reach (This creature can block creatures with flying.) -Sacrifice a land: Spitting Spider deals 1 damage to each creature with flying. -PCY U, 8ED U - -Splinter -{2}{G}{G} -Sorcery -Exile target artifact. Search its controller's graveyard, hand, and library for all cards with the same name as that artifact and exile them. Then that player shuffles his or her library. -UDS U, BOK U - -Splinter Twin -{2}{R}{R} -Enchantment - Aura -Enchant creature -Enchanted creature has "{T}: Put a token that's a copy of this creature onto the battlefield. That token has haste. Exile it at the beginning of the next end step." -ROE R - -Splintering Wind -{2}{G}{G} -Enchantment -{2}{G}: Splintering Wind deals 1 damage to target creature. Put a 1/1 green Splinter creature token onto the battlefield. It has flying and "Cumulative upkeep {G}." When it leaves the battlefield, it deals 1 damage to you and each creature you control. (At the beginning of its controller's upkeep, that player puts an age counter on it, then sacrifices it unless he or she pays its upkeep cost for each age counter on it.) -ALL R - -Split-Tail Miko -{1}{W} -Creature - Fox Cleric -1/1 -{W}, {T}: Prevent the next 2 damage that would be dealt to target creature or player this turn. -BOK C - -Splitting Headache -{3}{B} -Sorcery -Choose one - Target player discards two cards; or target player reveals his or her hand, you choose a card from it, then that player discards that card. -SHM C - -Spoils of Evil -{2}{B} -Instant -For each artifact or creature card in target opponent's graveyard, add {1} to your mana pool and you gain 1 life. -ICE R - -Spoils of Victory -{2}{G} -Sorcery -Search your library for a Plains, Island, Swamp, Mountain, or Forest card and put that card onto the battlefield. Then shuffle your library. -PTK U, ME3 C - -Spoils of War -{X}{B} -Sorcery -X is the number of artifact and/or creature cards in an opponent's graveyard as you cast Spoils of War. -Distribute X +1/+1 counters among any number of target creatures. -ICE R - -Spoils of the Vault -{B} -Instant -Name a card. Reveal cards from the top of your library until you reveal the named card, then put that card into your hand. Exile all other cards revealed this way, and you lose 1 life for each of the exiled cards. -MRD R - -Spontaneous Combustion -{1}{B}{R} -Instant -As an additional cost to cast Spontaneous Combustion, sacrifice a creature. -Spontaneous Combustion deals 3 damage to each creature. -TMP U - -Spontaneous Generation -{3}{G} -Sorcery -Put a 1/1 green Saproling creature token onto the battlefield for each card in your hand. -MMQ R - -Spore Burst -{3}{G} -Sorcery -Domain - Put a 1/1 green Saproling creature token onto the battlefield for each basic land type among lands you control. -CON U - -Spore Cloud -{1}{G}{G} -Instant -Tap all blocking creatures. Prevent all combat damage that would be dealt this turn. Each attacking creature and each blocking creature doesn't untap during its controller's next untap step. -FEM C (x3), ME2 U - -Spore Flower -{G}{G} -Creature - Fungus -0/1 -At the beginning of your upkeep, put a spore counter on Spore Flower. -Remove three spore counters from Spore Flower: Prevent all combat damage that would be dealt this turn. -FEM U, ME2 U - -Spore Frog -{G} -Creature - Frog -1/1 -Sacrifice Spore Frog: Prevent all combat damage that would be dealt this turn. -PCY C - -Sporeback Troll -{3}{G} -Creature - Troll Mutant -0/0 -Graft 2 (This creature enters the battlefield with two +1/+1 counters on it. Whenever another creature enters the battlefield, you may move a +1/+1 counter from this creature onto it.) -{1}{G}: Regenerate target creature with a +1/+1 counter on it. -DIS C - -Sporecap Spider -{2}{G} -Creature - Spider -1/5 -Reach (This creature can block creatures with flying.) -ROE C - -Sporesower Thallid -{2}{G}{G} -Creature - Fungus -4/4 -At the beginning of your upkeep, put a spore counter on each Fungus you control. -Remove three spore counters from Sporesower Thallid: Put a 1/1 green Saproling creature token onto the battlefield. -TSP U - -Sporogenesis -{3}{G} -Enchantment -At the beginning of your upkeep, you may put a fungus counter on target nontoken creature. -Whenever a creature with a fungus counter on it dies, put a 1/1 green Saproling creature token onto the battlefield for each fungus counter on that creature. -When Sporogenesis leaves the battlefield, remove all fungus counters from all creatures. -USG R - -Sporoloth Ancient -{3}{G}{G} -Creature - Fungus -4/4 -At the beginning of your upkeep, put a spore counter on Sporoloth Ancient. -Creatures you control have "Remove two spore counters from this creature: Put a 1/1 green Saproling creature token onto the battlefield." -FUT C - -Spotted Griffin -{3}{W} -Creature - Griffin -2/3 -Flying -POR C, ME4 C - -Spread the Sickness -{4}{B} -Sorcery -Destroy target creature, then proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.) -MBS C - -Spreading Algae -{G} -Enchantment - Aura -Enchant Swamp -When enchanted land becomes tapped, destroy it. -When Spreading Algae is put into a graveyard from the battlefield, return Spreading Algae to its owner's hand. -USG U, 8ED U - -Spreading Plague -{4}{B} -Enchantment -Whenever a creature enters the battlefield, destroy all other creatures that share a color with it. They can't be regenerated. -INV R - -Spreading Seas -{1}{U} -Enchantment - Aura -Enchant land -When Spreading Seas enters the battlefield, draw a card. -Enchanted land is an Island. -ZEN C - -Spring Cleaning -{1}{G} -Instant -Destroy target enchantment. Clash with an opponent. If you win, destroy all enchantments your opponents control. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -LRW C - -Spring of Eternal Peace -{3}{G}{G} -Sorcery -You gain 8 life. -PTK C - -Springing Tiger -{3}{G} -Creature - Cat -3/3 -Threshold - Springing Tiger gets +2/+2 as long as seven or more cards are in your graveyard. -ODY C - -Springjack Knight -{2}{W} -Creature - Kithkin Knight -2/1 -Whenever Springjack Knight attacks, clash with an opponent. If you win, target creature gains double strike until end of turn. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -LRW C - -Springjack Pasture -Land -{T}: Add {1} to your mana pool. -{4}, {T}: Put a 0/1 white Goat creature token onto the battlefield. -{T}, Sacrifice X Goats: Add X mana of any one color to your mana pool. You gain X life. -EVE R - -Springjack Shepherd -{3}{W} -Creature - Kithkin Wizard -1/2 -Chroma - When Springjack Shepherd enters the battlefield, put a 0/1 white Goat creature token onto the battlefield for each white mana symbol in the mana costs of permanents you control. -EVE U - -Springleaf Drum -{1} -Artifact -{T}, Tap an untapped creature you control: Add one mana of any color to your mana pool. -LRW C - -Sprite Noble -{1}{U}{U} -Creature - Faerie -2/2 -Flying -Other creatures you control with flying get +0/+1. -{T}: Other creatures you control with flying get +1/+0 until end of turn. -TSP R - -Sprout -{G} -Instant -Put a 1/1 green Saproling creature token onto the battlefield. -TSP C - -Sprout Swarm -{1}{G} -Instant -Convoke (Each creature you tap while casting this spell reduces its total cost by {1} or by one mana of that creature's color.) -Buyback {3} (You may pay an additional {3} as you cast this spell. If you do, put this card into your hand as it resolves.) -Put a 1/1 green Saproling creature token onto the battlefield. -FUT C - -Sprouting Phytohydra -{4}{G} -Creature - Plant Hydra -0/2 -Defender (This creature can't attack.) -Whenever Sprouting Phytohydra is dealt damage, you may put a token that's a copy of Sprouting Phytohydra onto the battlefield. -DIS R - -Sprouting Thrinax -{B}{R}{G} -Creature - Lizard -3/3 -When Sprouting Thrinax dies, put three 1/1 green Saproling creature tokens onto the battlefield. -ALA U - -Sprouting Vines -{2}{G} -Instant -Search your library for a basic land card, reveal that card, and put it into your hand. Then shuffle your library. -Storm (When you cast this spell, copy it for each spell cast before it this turn.) -SCG C - -Spur Grappler -{2}{R} -Creature - Beast -2/1 -Spur Grappler gets +2/+1 as long as you control no untapped lands. -PCY C - -Spurnmage Advocate -{W} -Creature - Human Nomad -1/1 -{T}: Return two target cards from an opponent's graveyard to his or her hand. Destroy target attacking creature. -JUD U, COM U - -Spurred Wolverine -{4}{R} -Creature - Wolverine Beast -3/2 -Tap two untapped Beasts you control: Target creature gains first strike until end of turn. -ONS C - -Spy Network -{U} -Instant -Look at target player's hand, the top card of that player's library, and any face-down creatures he or she controls. Look at the top four cards of your library, then put them back in any order. -ONS C - -Squadron Hawk -{1}{W} -Creature - Bird -1/1 -Flying -When Squadron Hawk enters the battlefield, you may search your library for up to three cards named Squadron Hawk, reveal them, put them into your hand, then shuffle your library. -M11 C - -Squall -{2}{G} -Sorcery -Squall deals 2 damage to each creature with flying. -S99 C, MMQ C, 7ED C, ME4 U - -Squall Drifter -{1}{W} -Snow Creature - Elemental -1/1 -Flying -{W}, {T}: Tap target creature. -CSP C - -Squall Line -{X}{G}{G} -Instant -Squall Line deals X damage to each creature with flying and each player. -TSP R - -Squallmonger -{3}{G} -Creature - Monger -3/3 -{2}: Squallmonger deals 1 damage to each creature with flying and each player. Any player may activate this ability. -MMQ U, COM U - -Squandered Resources -{B}{G} -Enchantment -Sacrifice a land: Add to your mana pool one mana of any type the sacrificed land could produce. -VIS R - -Squeaking Pie Grubfellows -{3}{B} -Creature - Goblin Shaman -3/2 -Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Squeaking Pie Grubfellows, you may reveal it. If you do, each opponent discards a card. -MOR C - -Squeaking Pie Sneak -{1}{B} -Creature - Goblin Rogue -2/2 -As an additional cost to cast Squeaking Pie Sneak, reveal a Goblin card from your hand or pay {3}. -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -LRW U - -Squealing Devil -{1}{R} -Creature - Devil -2/1 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -When Squealing Devil enters the battlefield, you may pay {X}. If you do, target creature gets +X/+0 until end of turn. -When Squealing Devil enters the battlefield, sacrifice it unless {B} was spent to cast it. -DIS U - -Squee -Vanguard -Hand +3, life -4 -Your opponents play with their hands revealed. -VG S - -Squee's Embrace -{R}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2. -When enchanted creature dies, return that card to its owner's hand. -APC C - -Squee's Revenge -{1}{U}{R} -Sorcery -Choose a number. Flip a coin that many times or until you lose a flip, whichever comes first. If you win all the flips, draw two cards for each flip. -APC U - -Squee's Toy -{1} -Artifact -{T}: Prevent the next 1 damage that would be dealt to target creature this turn. -TMP C - -Squee, Goblin Nabob -{2}{R} -Legendary Creature - Goblin -1/1 -At the beginning of your upkeep, you may return Squee, Goblin Nabob from your graveyard to your hand. -MMQ R, 10E R - -Squee, Goblin Nabob Avatar -Vanguard -Hand +3, life -4 -{1}: Prevent the next 1 damage that would be dealt to target creature you control this turn. -VG S - -Squeeze -{3}{U} -Enchantment -Sorcery spells cost {3} more to cast. -MMQ R - -Squelch -{1}{U} -Instant -Counter target activated ability. (Mana abilities can't be targeted.) -Draw a card. -CHK U - -Squire -{1}{W} -Creature - Human Soldier -1/2 -DRK C, TSB S - -Squirming Mass -{1}{B} -Creature - Horror -1/1 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -UDS C - -Squirrel Mob -{1}{G}{G} -Creature - Squirrel -2/2 -Squirrel Mob gets +1/+1 for each other Squirrel on the battlefield. -ODY R - -Squirrel Nest -{1}{G}{G} -Enchantment - Aura -Enchant land -Enchanted land has "{T}: Put a 1/1 green Squirrel creature token onto the battlefield." -ODY U - -Squirrel Wrangler -{2}{G}{G} -Creature - Human Druid -2/2 -{1}{G}, Sacrifice a land: Put two 1/1 green Squirrel creature tokens onto the battlefield. -{1}{G}, Sacrifice a land: Squirrel creatures get +1/+1 until end of turn. -PCY R - -Stabbing Pain -{B} -Instant -Target creature gets -1/-1 until end of turn. Tap that creature. -M11 C - -Stabilizer -{2} -Artifact -Players can't cycle cards. -SCG R - -Staff of Domination -{3} -Artifact -{1}: Untap Staff of Domination. -{2}, {T}: You gain 1 life. -{3}, {T}: Untap target creature. -{4}, {T}: Tap target creature. -{5}, {T}: Draw a card. -5DN R - -Staff of Zegon -{4} -Artifact -{3}, {T}: Target creature gets -2/-0 until end of turn. -ATQ C, ME4 C - -Staff of the Ages -{3} -Artifact -Creatures with landwalk abilities can be blocked as though they didn't have those abilities. -ICE R - -Stag Beetle -{3}{G}{G} -Creature - Insect -0/0 -Stag Beetle enters the battlefield with X +1/+1 counters on it, where X is the number of other creatures on the battlefield. -ONS R - -Staggershock -{2}{R} -Instant -Staggershock deals 2 damage to target creature or player. -Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -ROE C - -Stalker Hag -{B/G}{B/G}{B/G} -Creature - Hag -3/2 -Swampwalk, forestwalk -EVE U - -Stalking Assassin -{1}{U}{B} -Creature - Human Assassin -1/1 -{3}{U}, {T}: Tap target creature. -{3}{B}, {T}: Destroy target tapped creature. -INV R - -Stalking Bloodsucker -{4}{B}{B} -Creature - Vampire -4/4 -Flying -{1}{B}, Discard a card: Stalking Bloodsucker gets +2/+2 until end of turn. -ODY R - -Stalking Stones -Land -{T}: Add {1} to your mana pool. -{6}: Stalking Stones becomes a 3/3 Elemental artifact creature that's still a land. (This effect lasts indefinitely.) -TMP U, MRD U, EVT U - -Stalking Tiger -{3}{G} -Creature - Cat -3/3 -Stalking Tiger can't be blocked by more than one creature. -MIR C, POR C, 6ED C, PTK C, 10E C - -Stalking Tiger Avatar -Vanguard -Hand +0, life +2 -Whenever you cast a creature spell, you may pay {1}. If you do, draw a card. -VG S - -Stalking Vengeance -{5}{R}{R} -Creature - Avatar -5/5 -Haste -Whenever another creature you control dies, it deals damage equal to its power to target player. -DIS R - -Stalking Yeti -{2}{R}{R} -Snow Creature - Yeti -3/3 -When Stalking Yeti enters the battlefield, if it's on the battlefield, it deals damage equal to its power to target creature an opponent controls and that creature deals damage equal to its power to Stalking Yeti. -{2}{S}: Return Stalking Yeti to its owner's hand. Activate this ability only any time you could cast a sorcery. ({S} can be paid with one mana from a snow permanent.) -CSP U - -Stalwart Shield-Bearers -{1}{W} -Creature - Human Soldier -0/3 -Defender -Other creatures you control with defender get +0/+2. -ROE C - -Stamina -{2}{G} -Enchantment - Aura -Enchant creature -Enchanted creature has vigilance. -Sacrifice Stamina: Regenerate enchanted creature. -MMQ U - -Stampede -{1}{G}{G} -Instant -Attacking creatures get +1/+0 and gain trample until end of turn. -ICE R, 5ED R, ME2 U - -Stampede Driver -{G} -Creature - Human Spellshaper -1/1 -{1}{G}, {T}, Discard a card: Creatures you control get +1/+1 and gain trample until end of turn. -NEM U - -Stampeding Rhino -{4}{G} -Creature - Rhino -4/4 -Trample (If this creature would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.) -M10 C, M12 C - -Stampeding Serow -{2}{G}{G} -Creature - Antelope Beast -5/4 -Trample -At the beginning of your upkeep, return a green creature you control to its owner's hand. -SOK U - -Stampeding Wildebeests -{2}{G}{G} -Creature - Antelope Beast -5/4 -Trample (If this creature would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.) -At the beginning of your upkeep, return a green creature you control to its owner's hand. -VIS U, 10E U, GVL U - -Stand -{W} -Instant -Prevent the next 2 damage that would be dealt to target creature this turn. ----- -Deliver -{2}{U} -Instant -Return target permanent to its owner's hand. -INV U (x2) - -Stand Firm -{W} -Instant -Target creature gets +1/+1 until end of turn. -Scry 2. (To scry 2, look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) -5DN C - -Stand Together -{3}{G}{G} -Instant -Put two +1/+1 counters on target creature and two +1/+1 counters on another target creature. -DST U - -Stand or Fall -{3}{R} -Enchantment -At the beginning of combat on your turn, separate all creatures defending player controls into two piles. Only creatures in the pile of that player's choice can block this turn. -INV R - -Standard Bearer -{1}{W} -Creature - Human Flagbearer -1/1 -While choosing targets as part of casting a spell or activating an ability, your opponents must choose at least one Flagbearer on the battlefield if able. -APC C - -Standardize -{U}{U} -Instant -Choose a creature type other than Wall. Each creature becomes that type until end of turn. -ONS R - -Standing Stones -{3} -Artifact -{1}, {T}, Pay 1 life: Add one mana of any color to your mana pool. -DRK U - -Standing Troops -{2}{W} -Creature - Human Soldier -1/4 -Vigilance -EXO C, 6ED C, 7ED C, 8ED C - -Standstill -{1}{U} -Enchantment -When a player casts a spell, sacrifice Standstill. If you do, each of that player's opponents draws three cards. -ODY U - -Stangg -{4}{R}{G} -Legendary Creature - Human Warrior -3/4 -When Stangg enters the battlefield, put a legendary 3/4 red and green Human Warrior creature token named Stangg Twin onto the battlefield. When Stangg leaves the battlefield, exile that token. When that token leaves the battlefield, sacrifice Stangg. -LEG R, CHR R, ME3 U - -Star Compass -{2} -Artifact -Star Compass enters the battlefield tapped. -{T}: Add to your mana pool one mana of any color that a basic land you control could produce. -PLS U, 8ED U - -Starke -Vanguard -Hand +0, life -2 -At the beginning of your draw step, you may draw an additional card. If you do, put a card from your hand on the bottom of your library. -VG S - -Starke of Rath -{1}{R}{R} -Legendary Creature - Human Rogue -2/2 -{T}: Destroy target artifact or creature. That permanent's controller gains control of Starke of Rath. (This effect lasts indefinitely.) -TMP R - -Starlight -{1}{W} -Sorcery -You gain 3 life for each black creature target opponent controls. -POR U, 7ED U - -Starlight Invoker -{1}{W} -Creature - Human Cleric Mutant -1/3 -{7}{W}: You gain 5 life. -LGN C, 10E U - -Starlit Angel -{3}{W}{W} -Creature - Angel -3/4 -Flying -POR U - -Starlit Sanctum -Land -{T}: Add {1} to your mana pool. -{W}, {T}, Sacrifice a Cleric creature: You gain life equal to the sacrificed creature's toughness. -{B}, {T}, Sacrifice a Cleric creature: Target player loses life equal to the sacrificed creature's power. -ONS U - -Starstorm -{X}{R}{R} -Instant -Starstorm deals X damage to each creature. -Cycling {3} ({3}, Discard this card: Draw a card.) -ONS R - -Starved Rusalka -{G} -Creature - Spirit -1/1 -{G}, Sacrifice a creature: You gain 1 life. -GPT U - -Stasis -{1}{U} -Enchantment -Players skip their untap steps. -At the beginning of your upkeep, sacrifice Stasis unless you pay {U}. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, ME4 R - -Stasis Cell -{4}{U} -Enchantment - Aura -Enchant creature -Enchanted creature doesn't untap during its controller's untap step. -{3}{U}: Attach Stasis Cell to target creature. -RAV C - -Stasis Cocoon -{1}{W} -Enchantment - Aura -Enchant artifact -Enchanted artifact's activated abilities can't be activated. If enchanted artifact is a creature, it can't attack or block. -5DN C - -Statecraft -{3}{U} -Enchantment -Prevent all combat damage that would be dealt to and dealt by creatures you control. -MMQ R - -Static Orb -{3} -Artifact -As long as Static Orb is untapped, players can't untap more than two permanents during their untap steps. -TMP R, 7ED R - -Staunch Defenders -{3}{W}{W} -Creature - Human Soldier -3/4 -When Staunch Defenders enters the battlefield, you gain 4 life. -TMP U, 6ED U, 7ED U, 8ED U - -Stave Off -{W} -Instant -Target creature gains protection from the color of your choice until end of turn. (It can't be blocked, targeted, dealt damage, or enchanted by anything of that color.) -M12 C - -Steadfast Guard -{W}{W} -Creature - Human Rebel -2/2 -Vigilance (Attacking doesn't cause this creature to tap.) -MMQ C, 10E C - -Steadfastness -{1}{W} -Sorcery -Creatures you control get +0/+3 until end of turn. -POR C, S99 C - -Steady Progress -{2}{U} -Instant -Proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.) -Draw a card. -SOM C - -Steal Artifact -{2}{U}{U} -Enchantment - Aura -Enchant artifact -You control enchanted artifact. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, 7ED U, 8ED U - -Steal Enchantment -{U}{U} -Enchantment - Aura -Enchant enchantment -You control enchanted enchantment. -TMP U - -Steal Strength -{1}{B} -Instant -Target creature gets +1/+1 until end of turn. Another target creature gets -1/-1 until end of turn. -PCY C - -Steam Blast -{2}{R} -Sorcery -Steam Blast deals 2 damage to each creature and each player. -USG U, BRB U - -Steam Catapult -{3}{W}{W} -Creature - Human Soldier -2/3 -{T}: Destroy target tapped creature. Activate this ability only during your turn, before attackers are declared. -P02 R, ME4 R - -Steam Frigate -{2}{U} -Creature - Human Pirate -3/3 -Steam Frigate can't attack unless defending player controls an Island. -P02 C - -Steam Spitter -{4}{G} -Creature - Spider -1/5 -Reach (This creature can block creatures with flying.) -{R}: Steam Spitter gets +1/+0 until end of turn. -CSP U - -Steam Vents -Land - Island Mountain -({T}: Add {U} or {R} to your mana pool.) -As Steam Vents enters the battlefield, you may pay 2 life. If you don't, Steam Vents enters the battlefield tapped. -GPT R - -Steam Vines -{1}{R}{R} -Enchantment - Aura -Enchant land -When enchanted land becomes tapped, destroy it and Steam Vines deals 1 damage to that land's controller. That player attaches Steam Vines to a land of his or her choice. -ODY U - -Steamclaw -{2} -Artifact -{3}, {T}: Exile target card from a graveyard. -{1}, Sacrifice Steamclaw: Exile target card from a graveyard. -ODY U - -Steamcore Weird -{3}{U} -Creature - Weird -1/3 -When Steamcore Weird enters the battlefield, if {R} was spent to cast Steamcore Weird, it deals 2 damage to target creature or player. -GPT C - -Steamflogger Boss -{3}{R} -Creature - Goblin Rigger -3/3 -Other Rigger creatures you control get +1/+0 and have haste. -If a Rigger you control would assemble a Contraption, it assembles two Contraptions instead. -FUT R - -Steel Golem -{3} -Artifact Creature - Golem -3/4 -You can't cast creature spells. -WTH U, 10E U - -Steel Hellkite -{6} -Artifact Creature - Dragon -5/5 -Flying -{2}: Steel Hellkite gets +1/+0 until end of turn. -{X}: Destroy each nonland permanent with converted mana cost X whose controller was dealt combat damage by Steel Hellkite this turn. Activate this ability only once each turn. -SOM R - -Steel Leaf Paladin -{4}{G}{W} -Creature - Elf Knight -4/4 -First strike -When Steel Leaf Paladin enters the battlefield, return a green or white creature you control to its owner's hand. -PLS C - -Steel Overseer -{2} -Artifact Creature - Construct -1/1 -{T}: Put a +1/+1 counter on each artifact creature you control. -M11 R, EVT R - -Steel Sabotage -{U} -Instant -Choose one - Counter target artifact spell; or return target artifact to its owner's hand. -MBS C - -Steel Wall -{1} -Artifact Creature - Wall -0/4 -Defender (This creature can't attack.) -MRD C, EVT C - -Steel of the Godhead -{2}{W/U} -Enchantment - Aura -Enchant creature -As long as enchanted creature is white, it gets +1/+1 and has lifelink. (Damage dealt by the creature also causes its controller to gain that much life.) -As long as enchanted creature is blue, it gets +1/+1 and is unblockable. -SHM C - -Steelclad Serpent -{5}{U} -Artifact Creature - Serpent -4/5 -Steelclad Serpent can't attack unless you control another artifact. -ALA C - -Steeling Stance -{1}{W}{W} -Instant -Creatures you control get +1/+1 until end of turn. -Forecast - {W}, Reveal Steeling Stance from your hand: Target creature gets +1/+1 until end of turn. (Activate this ability only during your upkeep and only once each turn.) -DIS C - -Steelshaper Apprentice -{2}{W}{W} -Creature - Human Soldier -1/3 -{W}, {T}, Return Steelshaper Apprentice to its owner's hand: Search your library for an Equipment card, reveal that card, and put it into your hand. Then shuffle your library. -DST R - -Steelshaper's Gift -{W} -Sorcery -Search your library for an Equipment card, reveal that card, and put it into your hand. Then shuffle your library. -5DN U - -Steely Resolve -{1}{G} -Enchantment -As Steely Resolve enters the battlefield, choose a creature type. -Creatures of the chosen type have shroud. (They can't be the targets of spells or abilities.) -ONS R - -Stench of Decay -{1}{B}{B} -Instant -Nonartifact creatures get -1/-1 until end of turn. -ALL C (x2) - -Stench of Evil -{2}{B}{B} -Sorcery -Destroy all Plains. For each land put into a graveyard this way, Stench of Evil deals 1 damage to that land's controller unless he or she pays {2}. -ICE U - -Stenchskipper -{3}{B} -Creature - Elemental -6/5 -Flying -At the beginning of the end step, if you control no Goblins, sacrifice Stenchskipper. -MOR R - -Steppe Lynx -{W} -Creature - Cat -0/1 -Landfall - Whenever a land enters the battlefield under your control, Steppe Lynx gets +2/+2 until end of turn. -ZEN C - -Sterling Grove -{G}{W} -Enchantment -Other enchantments you control have shroud. (They can't be the targets of spells or abilities.) -{1}, Sacrifice Sterling Grove: Search your library for an enchantment card and reveal that card. Shuffle your library, then put the card on top of it. -INV U - -Stern Judge -{2}{W} -Creature - Human Cleric -2/2 -{T}: Each player loses 1 life for each Swamp he or she controls. -TOR U - -Stern Marshal -{2}{W} -Creature - Human Soldier -2/2 -{T}: Target creature gets +2/+2 until end of turn. Activate this ability only during your turn, before attackers are declared. -POR R - -Stern Proctor -{U}{U} -Creature - Human Wizard -1/2 -When Stern Proctor enters the battlefield, return target artifact or enchantment to its owner's hand. -USG U - -Steward of Valeron -{G}{W} -Creature - Human Druid Knight -2/2 -Vigilance -{T}: Add {G} to your mana pool. -ALA C, DDG C - -Stifle -{U} -Instant -Counter target activated or triggered ability. (Mana abilities can't be targeted.) -SCG R - -Stigma Lasher -{R}{R} -Creature - Elemental Shaman -2/2 -Wither (This deals damage to creatures in the form of -1/-1 counters.) -Whenever Stigma Lasher deals damage to a player, that player can't gain life for the rest of the game. -EVE R - -Still Life -{1}{G}{G} -Enchantment -{G}{G}: Still Life becomes a 4/3 Centaur creature until end of turn. It's still an enchantment. -ODY U - -Stillmoon Cavalier -{1}{W/B}{W/B} -Creature - Zombie Knight -2/1 -Protection from white and from black -{W/B}: Stillmoon Cavalier gains flying until end of turn. -{W/B}: Stillmoon Cavalier gains first strike until end of turn. -{W/B}{W/B}: Stillmoon Cavalier gets +1/+0 until end of turn. -EVE R - -Stingerfling Spider -{4}{G} -Creature - Spider -2/5 -Reach (This creature can block creatures with flying.) -When Stingerfling Spider enters the battlefield, you may destroy target creature with flying. -M12 U - -Stinging Barrier -{2}{U}{U} -Creature - Wall -0/4 -Defender (This creature can't attack.) -{U}, {T}: Stinging Barrier deals 1 damage to target creature or player. -MMQ C - -Stinging Licid -{1}{U} -Creature - Licid -1/1 -{1}{U}, {T}: Stinging Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {U} to end this effect. -Whenever enchanted creature becomes tapped, Stinging Licid deals 2 damage to that creature's controller. -TMP U - -Stingmoggie -{3}{R} -Creature - Elemental -0/0 -Stingmoggie enters the battlefield with two +1/+1 counters on it. -{3}{R}, Remove a +1/+1 counter from Stingmoggie: Destroy target artifact or land. -MOR C - -Stingscourger -{1}{R} -Creature - Goblin Warrior -2/2 -Echo {3}{R} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -When Stingscourger enters the battlefield, return target creature an opponent controls to its owner's hand. -PLC C - -Stinkdrinker Bandit -{3}{B} -Creature - Goblin Rogue -2/1 -Prowl {1}{B} (You may cast this for its prowl cost if you dealt combat damage to a player this turn with a Goblin or Rogue.) -Whenever a Rogue you control attacks and isn't blocked, it gets +2/+1 until end of turn. -MOR U - -Stinkdrinker Daredevil -{2}{R} -Creature - Goblin Rogue -1/3 -Giant spells you cast cost {2} less to cast. -LRW C - -Stinkweed Imp -{2}{B} -Creature - Imp -1/2 -Flying -Whenever Stinkweed Imp deals combat damage to a creature, destroy that creature. -Dredge 5 (If you would draw a card, instead you may put exactly five cards from the top of your library into your graveyard. If you do, return this card from your graveyard to your hand. Otherwise, draw a card.) -RAV C, DVD C - -Stir the Grave -{X}{B} -Sorcery -Return target creature card with converted mana cost X or less from your graveyard to the battlefield. -BOK C - -Stir the Pride -{4}{W} -Instant -Choose one - Creatures you control get +2/+2 until end of turn; or until end of turn, creatures you control gain "Whenever this creature deals damage, you gain that much life." -Entwine {1}{W} (Choose both if you pay the entwine cost.) -DST U - -Stirring Wildwood -Land -Stirring Wildwood enters the battlefield tapped. -{T}: Add {G} or {W} to your mana pool. -{1}{G}{W}: Until end of turn, Stirring Wildwood becomes a 3/4 green and white Elemental creature with reach. It's still a land. -WWK R - -Stitch Together -{B}{B} -Sorcery -Return target creature card from your graveyard to your hand. -Threshold - Return that card from your graveyard to the battlefield instead if seven or more cards are in your graveyard. -JUD U, COM U - -Stitch in Time -{1}{U}{R} -Sorcery -Flip a coin. If you win the flip, take an extra turn after this one. -GPT R - -Stoic Angel -{1}{G}{W}{U} -Creature - Angel -3/4 -Flying, vigilance -Players can't untap more than one creature during their untap steps. -ALA R - -Stoic Champion -{W}{W} -Creature - Human Soldier -2/2 -Whenever a player cycles a card, Stoic Champion gets +2/+2 until end of turn. -LGN U - -Stoic Ephemera -{2}{W} -Creature - Spirit -5/5 -Defender (This creature can't attack.) -Flying -When Stoic Ephemera blocks, sacrifice it at end of combat. -DIS U - -Stoic Rebuttal -{1}{U}{U} -Instant -Metalcraft - Stoic Rebuttal costs {1} less to cast if you control three or more artifacts. -Counter target spell. -SOM C - -Stolen Grain -{4}{B}{B} -Sorcery -Stolen Grain deals 5 damage to target opponent. You gain 5 life. -PTK U, ME3 U - -Stomp and Howl -{2}{G} -Sorcery -Destroy target artifact and target enchantment. -DIS U - -Stomper Cub -{3}{G}{G} -Creature - Beast -5/3 -Trample -ROE C - -Stomping Ground -Land - Mountain Forest -({T}: Add {R} or {G} to your mana pool.) -As Stomping Ground enters the battlefield, you may pay 2 life. If you don't, Stomping Ground enters the battlefield tapped. -GPT R - -Stomping Slabs -{2}{R} -Sorcery -Reveal the top seven cards of your library, then put those cards on the bottom of your library in any order. If a card named Stomping Slabs was revealed this way, Stomping Slabs deals 7 damage to target creature or player. -MOR U - -Stone Calendar -{5} -Artifact -Spells you cast cost up to {1} less to cast. -DRK R, MED U - -Stone Catapult -{4}{B} -Creature - Human Soldier -1/2 -{T}: Destroy target tapped nonblack creature. Activate this ability only during your turn, before attackers are declared. -PTK R - -Stone Giant -{2}{R}{R} -Creature - Giant -3/4 -{T}: Target creature you control with toughness less than Stone Giant's power gains flying until end of turn. Destroy that creature at the beginning of the next end step. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, MED U, M10 U - -Stone Golem -{5} -Artifact Creature - Golem -4/4 -M11 U - -Stone Idol Trap -{5}{R} -Instant - Trap -Stone Idol Trap costs {1} less to cast for each attacking creature. -Put a 6/12 colorless Construct artifact creature token with trample onto the battlefield. Exile it at the beginning of your next end step. -WWK R - -Stone Kavu -{4}{G} -Creature - Kavu -3/3 -{R}: Stone Kavu gets +1/+0 until end of turn. -{W}: Stone Kavu gets +0/+1 until end of turn. -PLS C - -Stone Rain -{2}{R} -Sorcery -Destroy target land. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, ICE C, MIR C, 5ED C, POR C, TMP C, P02 C, 6ED C, PTK C, S99 C, MMQ C, S00 C, 7ED C, 8ED C, CHK C, 9ED C - -Stone Spirit -{4}{R} -Creature - Elemental Spirit -4/3 -Stone Spirit can't be blocked by creatures with flying. -ICE U, 5ED U, ME2 U - -Stone-Seeder Hierophant -{2}{G}{G} -Creature - Human Druid -1/1 -Whenever a land enters the battlefield under your control, untap Stone-Seeder Hierophant. -{T}: Untap target land. -RAV C - -Stone-Throwing Devils -{B} -Creature - Devil -1/1 -First strike -ARN C (x2) - -Stone-Tongue Basilisk -{4}{G}{G}{G} -Creature - Basilisk -4/5 -Whenever Stone-Tongue Basilisk deals combat damage to a creature, destroy that creature at end of combat. -Threshold - As long as seven or more cards are in your graveyard, all creatures able to block Stone-Tongue Basilisk do so. -ODY R - -Stonebrow, Krosan Hero -{3}{R}{G} -Legendary Creature - Centaur Warrior -4/4 -Trample -Whenever a creature you control with trample attacks, it gets +2/+2 until end of turn. -TSP R - -Stonecloaker -{2}{W} -Creature - Gargoyle -3/2 -Flash (You may cast this spell any time you could cast an instant.) -Flying -When Stonecloaker enters the battlefield, return a creature you control to its owner's hand. -When Stonecloaker enters the battlefield, exile target card from a graveyard. -PLC U - -Stoneforge Mystic -{1}{W} -Creature - Kor Artificer -1/2 -When Stoneforge Mystic enters the battlefield, you may search your library for an Equipment card, reveal it, put it into your hand, then shuffle your library. -{1}{W}, {T}: You may put an Equipment card from your hand onto the battlefield. -WWK R - -Stonehands -{2}{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +0/+2. -{R}: Enchanted creature gets +1/+0 until end of turn. -ICE C, ME2 C - -Stonehewer Giant -{3}{W}{W} -Creature - Giant Warrior -4/4 -Vigilance -{1}{W}, {T}: Search your library for an Equipment card and put it onto the battlefield. Attach it to a creature you control. Then shuffle your library. -MOR R - -Stonehewer Giant Avatar -Vanguard -Hand +1, life -5 -Whenever a creature enters the battlefield under your control, put a token onto the battlefield that's a copy of a random Equipment card with converted mana cost less than or equal to that creature's converted mana cost. Attach that Equipment to that creature. -VG S - -Stonehorn Dignitary -{3}{W} -Creature - Rhino Soldier -1/4 -When Stonehorn Dignitary enters the battlefield, target opponent skips his or her next combat phase. -M12 C - -Stoneshaker Shaman -{2}{R} -Creature - Human Shaman -1/1 -At the beginning of each player's end step, that player sacrifices an untapped land. -RAV U - -Stonewood Invocation -{3}{G} -Instant -Split second (As long as this spell is on the stack, players can't cast spells or activate abilities that aren't mana abilities.) -Target creature gets +5/+5 and gains shroud until end of turn. (It can't be the target of spells or abilities.) -TSP R - -Stonewood Invoker -{1}{G} -Creature - Elf Mutant -2/2 -{7}{G}: Stonewood Invoker gets +5/+5 until end of turn. -LGN C, EVG C - -Stonework Puma -{3} -Artifact Creature - Cat Ally -2/2 -ZEN C - -Stonybrook Angler -{1}{U} -Creature - Merfolk Wizard -1/2 -{1}{U}, {T}: You may tap or untap target creature. -LRW C - -Stonybrook Banneret -{1}{U} -Creature - Merfolk Wizard -1/1 -Islandwalk -Merfolk spells and Wizard spells you cast cost {1} less to cast. -MOR C - -Stonybrook Schoolmaster -{2}{W} -Creature - Merfolk Wizard -1/2 -Whenever Stonybrook Schoolmaster becomes tapped, you may put a 1/1 blue Merfolk Wizard creature token onto the battlefield. -MOR C - -Storage Matrix -{3} -Artifact -As long as Storage Matrix is untapped, each player chooses artifact, creature, or land during his or her untap step. That player can untap only permanents of the chosen type this step. -UDS R, 9ED R - -Storm Cauldron -{5} -Artifact -Each player may play an additional land during each of his or her turns. -Whenever a land is tapped for mana, return it to its owner's hand. -ALL R, 6ED R, 7ED R - -Storm Crow -{1}{U} -Creature - Bird -1/2 -Flying (This creature can't be blocked except by creatures with flying or reach.) -ALL C (x2), POR C, 6ED C, S99 C, 7ED C, 8ED C, 9ED C - -Storm Elemental -{5}{U} -Creature - Elemental -3/4 -Flying -{U}, Exile the top card of your library: Tap target creature with flying. -{U}, Exile the top card of your library: If the exiled card is a snow land, Storm Elemental gets +1/+1 until end of turn. -ALL U, ME2 U - -Storm Entity -{1}{R} -Creature - Elemental -1/1 -Haste -Storm Entity enters the battlefield with a +1/+1 counter on it for each other spell cast this turn. -FUT U - -Storm Front -{G} -Enchantment -{G}{G}: Tap target creature with flying. -TMP U - -Storm Herd -{8}{W}{W} -Sorcery -Put X 1/1 white Pegasus creature tokens with flying onto the battlefield, where X is your life total. -GPT R, COM R - -Storm Seeker -{3}{G} -Instant -Storm Seeker deals damage equal to the number of cards in target player's hand to that player. -LEG U, CHR U, MED U - -Storm Shaman -{2}{R} -Creature - Human Cleric Shaman -0/4 -{R}: Storm Shaman gets +1/+0 until end of turn. -ALL C (x2), 7ED U - -Storm Spirit -{3}{G}{W}{U} -Creature - Elemental Spirit -3/3 -Flying -{T}: Storm Spirit deals 2 damage to target creature. -ICE R, ME2 R - -Storm World -{R} -World Enchantment -At the beginning of each player's upkeep, Storm World deals X damage to that player, where X is 4 minus the number of cards in his or her hand. -LEG R, ME3 R - -Stormbind -{1}{R}{G} -Enchantment -{2}, Discard a card at random: Stormbind deals 2 damage to target creature or player. -ICE R, TSB S - -Stormblood Berserker -{1}{R} -Creature - Human Berserker -1/1 -Bloodthirst 2 (If an opponent was dealt damage this turn, this creature enters the battlefield with two +1/+1 counters on it.) -Stormblood Berserker can't be blocked except by two or more creatures. -M12 U - -Stormcaller's Boon -{2}{W}{U} -Enchantment -Sacrifice Stormcaller's Boon: Creatures you control gain flying until end of turn. -Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.) -ARB C - -Stormcloud Djinn -{4}{U} -Creature - Djinn -3/3 -Flying -Stormcloud Djinn can block only creatures with flying. -{R}{R}: Stormcloud Djinn gets +2/+0 until end of turn and deals 1 damage to you. -TSP U - -Stormfront Pegasus -{1}{W} -Creature - Pegasus -2/1 -Flying -M10 C, M11 C, M12 C - -Stormfront Riders -{4}{W} -Creature - Human Soldier -4/3 -Flying -When Stormfront Riders enters the battlefield, return two creatures you control to their owner's hand. -Whenever Stormfront Riders or another creature is returned to your hand from the battlefield, put a 1/1 white Soldier creature token onto the battlefield. -PLC U, EVT U - -Stormscale Anarch -{2}{R}{R} -Creature - Viashino Shaman -2/2 -{2}{R}, Discard a card at random: Stormscale Anarch deals 2 damage to target creature or player. If the discarded card was multicolored, Stormscale Anarch deals 4 damage to that creature or player instead. -DIS R - -Stormscape Apprentice -{U} -Creature - Human Wizard -1/1 -{W}, {T}: Tap target creature. -{B}, {T}: Target player loses 1 life. -INV C - -Stormscape Battlemage -{2}{U} -Creature - Metathran Wizard -2/2 -Kicker {W} and/or {2}{B} (You may pay an additional {W} and/or {2}{B} as you cast this spell.) -When Stormscape Battlemage enters the battlefield, if it was kicked with its {W} kicker, you gain 3 life. -When Stormscape Battlemage enters the battlefield, if it was kicked with its {2}{B} kicker, destroy target nonblack creature. That creature can't be regenerated. -PLS U - -Stormscape Familiar -{1}{U} -Creature - Bird -1/1 -Flying -White spells and black spells you cast cost {1} less to cast. -PLS C, TSB S - -Stormscape Master -{2}{U}{U} -Creature - Human Wizard -2/2 -{W}{W}, {T}: Target creature gains protection from the color of your choice until end of turn. -{B}{B}, {T}: Target player loses 2 life and you gain 2 life. -INV R - -Stormtide Leviathan -{5}{U}{U}{U} -Creature - Leviathan -8/8 -Islandwalk (This creature is unblockable as long as defending player controls an Island.) -All lands are Islands in addition to their other types. -Creatures without flying or islandwalk can't attack. -M11 R - -Stormwatch Eagle -{3}{U} -Creature - Bird -2/1 -Flying -Sacrifice a land: Return Stormwatch Eagle to its owner's hand. -PCY C - -Story Circle -{1}{W}{W} -Enchantment -As Story Circle enters the battlefield, choose a color. -{W}: The next time a source of your choice of the chosen color would deal damage to you this turn, prevent that damage. -MMQ U, 8ED R, 9ED R, 10E R - -Strafe -{R} -Sorcery -Strafe deals 3 damage to target nonred creature. -PLS U - -Strands of Night -{2}{B}{B} -Enchantment -{B}{B}, Pay 2 life, Sacrifice a Swamp: Return target creature card from your graveyard to the battlefield. -WTH U, 6ED U, 7ED U - -Strands of Undeath -{3}{B} -Enchantment - Aura -Enchant creature -When Strands of Undeath enters the battlefield, target player discards two cards. -{B}: Regenerate enchanted creature. -RAV C - -Strandwalker -{5} -Artifact - Equipment -Living weapon (When this Equipment enters the battlefield, put a 0/0 black Germ creature token onto the battlefield, then attach this to it.) -Equipped creature gets +2/+4 and has reach. -Equip {4} -MBS U - -Strange Inversion -{2}{R} -Instant - Arcane -Switch target creature's power and toughness until end of turn. -Splice onto Arcane {1}{R} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -CHK U - -Stranglehold -{3}{R} -Enchantment -Your opponents can't search libraries. -If an opponent would begin an extra turn, that player skips that turn instead. -COM R - -Strangling Soot -{2}{B} -Instant -Destroy target creature with toughness 3 or less. -Flashback {5}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -TSP C - -Strata Scythe -{3} -Artifact - Equipment -Imprint - When Strata Scythe enters the battlefield, search your library for a land card, exile it, then shuffle your library. -Equipped creature gets +1/+1 for each land on the battlefield with the same name as the exiled card. -Equip {3} -SOM R - -Stratadon -{10} -Artifact Creature - Beast -5/5 -Domain - Stratadon costs {1} less to cast for each basic land type among lands you control. -Trample -PLS U - -Strategic Planning -{1}{U} -Sorcery -Look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard. -PTK U, ME3 C - -Stratozeppelid -{4}{U} -Creature - Beast -4/4 -Flying -Stratozeppelid can block only creatures with flying. -GPT U - -Straw Golem -{1} -Artifact Creature - Golem -2/3 -When an opponent casts a creature spell, sacrifice Straw Golem. -WTH U - -Straw Soldiers -{1}{U} -Creature - Scarecrow Soldier -1/3 -PTK C - -Stream Hopper -{U/R} -Creature - Goblin -1/1 -{U/R}: Stream Hopper gains flying until end of turn. -EVE C - -Stream of Acid -{2}{B}{B} -Sorcery -Destroy target land or nonblack creature. -S99 U - -Stream of Consciousness -{1}{U} -Instant - Arcane -Target player shuffles up to four target cards from his or her graveyard into his or her library. -BOK U - -Stream of Life -{X}{G} -Sorcery -Target player gains X life. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, 6ED C, 7ED C, 8ED U, 9ED U - -Stream of Unconsciousness -{U} -Tribal Instant - Wizard -Target creature gets -4/-0 until end of turn. If you control a Wizard, draw a card. -MOR C - -Streambed Aquitects -{1}{U}{U} -Creature - Merfolk Scout -2/3 -{T}: Target Merfolk creature gets +1/+1 and gains islandwalk until end of turn. -{T}: Target land becomes an Island until end of turn. -LRW C - -Street Savvy -{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +0/+2 and can block creatures with landwalk abilities as though they didn't have those abilities. -DIS C - -Street Wraith -{3}{B}{B} -Creature - Wraith -3/4 -Swampwalk -Cycling-Pay 2 life. (Pay 2 life, Discard this card: Draw a card.) -FUT U - -Streetbreaker Wurm -{3}{R}{G} -Creature - Wurm -6/4 -GPT C - -Strength in Numbers -{1}{G} -Instant -Until end of turn, target creature gains trample and gets +X/+X, where X is the number of attacking creatures. -TSP C - -Strength of Cedars -{4}{G} -Instant - Arcane -Target creature gets +X/+X until end of turn, where X is the number of lands you control. -CHK U - -Strength of Isolation -{1}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+2 and has protection from black. -Madness {W} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -TOR U - -Strength of Lunacy -{1}{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+1 and has protection from white. -Madness {B} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -TOR U - -Strength of Night -{2}{G} -Instant -Kicker {B} (You may pay an additional {B} as you cast this spell.) -Creatures you control get +1/+1 until end of turn. If Strength of Night was kicked, Zombie creatures you control get an additional +2/+2 until end of turn. -APC C - -Strength of Unity -{3}{W} -Enchantment - Aura -Enchant creature -Domain - Enchanted creature gets +1/+1 for each basic land type among lands you control. -INV C - -Strength of the Tajuru -{X}{G}{G} -Instant -Multikicker {1} (You may pay an additional {1} any number of times as you cast this spell.) -Choose target creature, then choose another target creature for each time Strength of the Tajuru was kicked. Put X +1/+1 counters on each of them. -WWK R - -Strider Harness -{3} -Artifact - Equipment -Equipped creature gets +1/+1 and has haste. -Equip {1} -SOM C - -Strip Bare -{W} -Instant -Destroy all Auras and Equipment attached to target creature. -SHM C - -Strip Mine -Land -{T}: Add {1} to your mana pool. -{T}, Sacrifice Strip Mine: Destroy target land. -ATQ U, ATQ R (x3), 4ED U, FVE M, ME4 R - -Striped Bears -{3}{G} -Creature - Bear -2/2 -When Striped Bears enters the battlefield, draw a card. -WTH C - -Stroke of Genius -{X}{2}{U} -Instant -Target player draws X cards. -USG R - -Stromgald Cabal -{1}{B}{B} -Creature - Human Knight -2/2 -{T}, Pay 1 life: Counter target white spell. -ICE R, 5ED R, 6ED R, ME2 R - -Stromgald Crusader -{B}{B} -Creature - Zombie Knight -2/1 -Protection from white -{B}: Stromgald Crusader gains flying until end of turn. -{B}{B}: Stromgald Crusader gets +1/+0 until end of turn. -CSP U - -Stromgald Spy -{3}{B} -Creature - Human Rogue -2/4 -Whenever Stromgald Spy attacks and isn't blocked, you may have defending player play with his or her hand revealed for as long as Stromgald Spy remains on the battlefield. If you do, Stromgald Spy assigns no combat damage this turn. -ALL U - -Strongarm Tactics -{1}{B} -Sorcery -Each player discards a card. Then each player who didn't discard a creature card this way loses 4 life. -ONS R - -Strongarm Thug -{2}{B} -Creature - Human Mercenary -1/1 -When Strongarm Thug enters the battlefield, you may return target Mercenary card from your graveyard to your hand. -MMQ U - -Stronghold Assassin -{1}{B}{B} -Creature - Zombie Assassin -2/1 -{T}, Sacrifice a creature: Destroy target nonblack creature. -STH R, 7ED R - -Stronghold Biologist -{2}{U} -Creature - Human Spellshaper -1/1 -{U}{U}, {T}, Discard a card: Counter target creature spell. -NEM U - -Stronghold Discipline -{2}{B}{B} -Sorcery -Each player loses 1 life for each creature he or she controls. -NEM C, 10E U - -Stronghold Furnace -Plane - Rath -If a source would deal damage to a creature or player, it deals double that damage to that creature or player instead. -Whenever you roll {C}, Stronghold Furnace deals 1 damage to target creature or player. -HOP C - -Stronghold Gambit -{1}{R} -Sorcery -Each player chooses a card in his or her hand. Then each player reveals his or her chosen card. The owner of each creature card revealed this way with the lowest converted mana cost puts it onto the battlefield. -NEM R - -Stronghold Machinist -{2}{U} -Creature - Human Spellshaper -1/1 -{U}{U}, {T}, Discard a card: Counter target noncreature spell. -NEM U - -Stronghold Overseer -{3}{B}{B}{B} -Creature - Demon -5/5 -Flying -Shadow (This creature can block or be blocked by only creatures with shadow.) -{B}{B}: Creatures with shadow get +1/+0 until end of turn and creatures without shadow get -1/-0 until end of turn. -TSP R - -Stronghold Rats -{2}{B} -Creature - Rat -2/1 -Shadow (This creature can block or be blocked by only creatures with shadow.) -Whenever Stronghold Rats deals combat damage to a player, each player discards a card. -FUT U - -Stronghold Taskmaster -{2}{B}{B} -Creature - Giant Minion -4/3 -Other black creatures get -1/-1. -STH U - -Stronghold Zeppelin -{2}{U}{U} -Creature - Human -3/3 -Flying -Stronghold Zeppelin can block only creatures with flying. -NEM U - -Struggle for Sanity -{2}{B}{B} -Sorcery -Target opponent reveals his or her hand. That player exiles a card from it, then you exile a card from it. Repeat this process until all cards in that hand have been exiled. That player returns the cards he or she exiled this way to his or her hand and puts the rest into his or her graveyard. -CHK U - -Student of Elements -{1}{U} -Creature - Human Wizard -1/1 -When Student of Elements has flying, flip it. ----- -Tobita, Master of Winds -Legendary Creature - Human Wizard -3/3 -Creatures you control have flying. -CHK U - -Student of Warfare -{W} -Creature - Human Knight -1/1 -Level up {W} ({W}: Put a level counter on this. Level up only as a sorcery.) -LEVEL 2-6 -3/3 -First strike -LEVEL 7+ -4/4 -Double strike -ROE R - -Stuffy Doll -{5} -Artifact Creature - Construct -0/1 -As Stuffy Doll enters the battlefield, choose a player. -Stuffy Doll is indestructible. -Whenever Stuffy Doll is dealt damage, it deals that much damage to the chosen player. -{T}: Stuffy Doll deals 1 damage to itself. -TSP R - -Stuffy Doll Avatar -Vanguard -Hand +0, life -6 -{0}: If damage would be dealt to you this turn by a source of your choice, prevent that damage. Stuffy Doll Avatar deals damage to you and target opponent equal to half the damage prevented this way, rounded up. Activate this ability only once each turn. -VG S - -Stun -{1}{R} -Instant -Target creature can't block this turn. -Draw a card. -TMP C, INV C, 10E C - -Stun Sniper -{R}{W} -Creature - Human Archer -1/1 -{1}, {T}: Stun Sniper deals 1 damage to target creature. Tap that creature. -ARB U - -Stunted Growth -{3}{G}{G} -Sorcery -Target player chooses three cards from his or her hand and puts them on top of his or her library in any order. -ICE R, ME2 R - -Stupefying Touch -{1}{U} -Enchantment - Aura -Enchant creature -When Stupefying Touch enters the battlefield, draw a card. -Enchanted creature's activated abilities can't be activated. -TOR U - -Stupor -{2}{B} -Sorcery -Target opponent discards a card at random, then discards a card. -MIR U, 6ED U, TSB S - -Sturdy Hatchling -{3}{G/U} -Creature - Elemental -6/6 -Sturdy Hatchling enters the battlefield with four -1/-1 counters on it. -{G/U}: Sturdy Hatchling gains shroud until end of turn. -Whenever you cast a green spell, remove a -1/-1 counter from Sturdy Hatchling. -Whenever you cast a blue spell, remove a -1/-1 counter from Sturdy Hatchling. -EVE U - -Su-Chi -{4} -Artifact Creature - Construct -4/4 -When Su-Chi dies, add {4} to your mana pool. -ATQ U, MED R - -Subdue -{G} -Instant -Prevent all combat damage that would be dealt by target creature this turn. That creature gets +0/+X until end of turn, where X is its converted mana cost. -LEG C - -Submerge -{4}{U} -Instant -If an opponent controls a Forest and you control an Island, you may cast Submerge without paying its mana cost. -Put target creature on top of its owner's library. -NEM U - -Subterranean Hangar -Land -Subterranean Hangar enters the battlefield tapped. -{T}: Put a storage counter on Subterranean Hangar. -{T}, Remove any number of storage counters from Subterranean Hangar: Add {B} to your mana pool for each storage counter removed this way. -MMQ U - -Subterranean Shambler -{3}{R} -Creature - Elemental -2/3 -Echo {3}{R} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -When Subterranean Shambler enters the battlefield or leaves the battlefield, it deals 1 damage to each creature without flying. -TSP C - -Subterranean Spirit -{3}{R}{R} -Creature - Elemental Spirit -3/3 -Protection from red -{T}: Subterranean Spirit deals 1 damage to each creature without flying. -MIR R - -Subversion -{3}{B}{B} -Enchantment -At the beginning of your upkeep, each opponent loses 1 life. You gain life equal to the life lost this way. -ULG R, BRB R - -Sudden Death -{1}{B}{B} -Instant -Split second (As long as this spell is on the stack, players can't cast spells or activate abilities that aren't mana abilities.) -Target creature gets -4/-4 until end of turn. -TSP U - -Sudden Impact -{3}{R} -Instant -Sudden Impact deals damage equal to the number of cards in target player's hand to that player. -TMP U, 7ED U, 8ED U, 9ED U, 10E U, H10 U - -Sudden Shock -{1}{R} -Instant -Split second (As long as this spell is on the stack, players can't cast spells or activate abilities that aren't mana abilities.) -Sudden Shock deals 2 damage to target creature or player. -TSP U - -Sudden Spoiling -{1}{B}{B} -Instant -Split second (As long as this spell is on the stack, players can't cast spells or activate abilities that aren't mana abilities.) -Creatures target player controls become 0/2 and lose all abilities until end of turn. -TSP R - -Sudden Strength -{3}{G} -Instant -Target creature gets +3/+3 until end of turn. -Draw a card. -JUD C - -Suffer the Past -{X}{B} -Instant -Exile X target cards from target player's graveyard. For each card exiled this way, that player loses 1 life and you gain 1 life. -ROE U - -Suffocating Blast -{1}{U}{U}{R} -Instant -Counter target spell and Suffocating Blast deals 3 damage to target creature. -APC R - -Suffocation -{1}{U} -Instant -Cast Suffocation only if you were dealt damage this turn by a red instant or sorcery spell. -Suffocation deals 4 damage to the controller of the last red instant or sorcery spell that dealt damage to you this turn. -Draw a card at the beginning of the next turn's upkeep. -ALL U - -Suicidal Charge -{3}{B}{R} -Enchantment -Sacrifice Suicidal Charge: Creatures your opponents control get -1/-1 until end of turn. Those creatures attack this turn if able. -CON C - -Sulam Djinn -{5}{G} -Creature - Djinn -6/6 -Trample -Sulam Djinn gets -2/-2 as long as green is the most common color among all permanents or is tied for most common. -INV U - -Suleiman's Legacy -{R}{W} -Enchantment -When Suleiman's Legacy enters the battlefield, destroy all Djinns and Efreets. They can't be regenerated. -Whenever a Djinn or Efreet enters the battlefield, destroy it. It can't be regenerated. -VIS R - -Sulfur Elemental -{2}{R} -Creature - Elemental -3/2 -Flash (You may cast this spell any time you could cast an instant.) -Split second (As long as this spell is on the stack, players can't cast spells or activate abilities that aren't mana abilities.) -White creatures get +1/-1. -PLC U - -Sulfur Vent -Land -Sulfur Vent enters the battlefield tapped. -{T}: Add {B} to your mana pool. -{T}, Sacrifice Sulfur Vent: Add {U}{R} to your mana pool. -INV C - -Sulfuric Vapors -{3}{R} -Enchantment -If a red spell would deal damage to a permanent or player, it deals that much damage plus 1 to that permanent or player instead. -USG R - -Sulfuric Vortex -{1}{R}{R} -Enchantment -At the beginning of each player's upkeep, Sulfuric Vortex deals 2 damage to that player. -If a player would gain life, that player gains no life instead. -SCG R - -Sulfurous Blast -{2}{R}{R} -Instant -Sulfurous Blast deals 2 damage to each creature and each player. If you cast this spell during your main phase, Sulfurous Blast deals 3 damage to each creature and each player instead. -TSP U, COM U - -Sulfurous Springs -Land -{T}: Add {1} to your mana pool. -{T}: Add {B} or {R} to your mana pool. Sulfurous Springs deals 1 damage to you. -ICE R, 5ED R, 6ED R, 7ED R, 9ED R, 10E R - -Summer Bloom -{1}{G} -Sorcery -You may play up to three additional lands this turn. -VIS U, POR R, 6ED U, S99 R, 9ED U - -Summit Apes -{3}{G} -Creature - Ape -5/2 -As long as you control a Mountain, Summit Apes can't be blocked except by two or more creatures. -WWK U - -Summon the School -{3}{W} -Tribal Sorcery - Merfolk -Put two 1/1 blue Merfolk Wizard creature tokens onto the battlefield. -Tap four untapped Merfolk you control: Return Summon the School from your graveyard to your hand. -LRW U - -Summoner's Bane -{2}{U}{U} -Instant -Counter target creature spell. Put a 2/2 blue Illusion creature token onto the battlefield. -ZEN U - -Summoner's Egg -{4} -Artifact Creature - Construct -0/4 -Imprint - When Summoner's Egg enters the battlefield, you may exile a card from your hand face down. -When Summoner's Egg dies, turn the exiled card face up. If it's a creature card, put it onto the battlefield under your control. -5DN R - -Summoner's Pact -{0} -Instant -Summoner's Pact is green. -Search your library for a green creature card, reveal it, and put it into your hand. Then shuffle your library. -At the beginning of your next upkeep, pay {2}{G}{G}. If you don't, you lose the game. -FUT R - -Summoning Station -{7} -Artifact -{T}: Put a 2/2 colorless Pincher creature token onto the battlefield. -Whenever an artifact is put into a graveyard from the battlefield, you may untap Summoning Station. -5DN R - -Summoning Trap -{4}{G}{G} -Instant - Trap -If a creature spell you cast this turn was countered by a spell or ability an opponent controlled, you may pay {0} rather than pay Summoning Trap's mana cost. -Look at the top seven cards of your library. You may put a creature card from among them onto the battlefield. Put the rest on the bottom of your library in any order. -ZEN R - -Sun Ce, Young Conquerer -{3}{U}{U} -Legendary Creature - Human Soldier -3/3 -Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -When Sun Ce, Young Conquerer enters the battlefield, you may return target creature to its owner's hand. -PTK R, ME3 U - -Sun Clasp -{1}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+3. -{W}: Return enchanted creature to its owner's hand. -VIS C, BRB C - -Sun Droplet -{2} -Artifact -Whenever you're dealt damage, put that many charge counters on Sun Droplet. -At the beginning of each upkeep, you may remove a charge counter from Sun Droplet. If you do, you gain 1 life. -MRD U, ARC U - -Sun Quan, Lord of Wu -{4}{U}{U} -Legendary Creature - Human Soldier -4/4 -Creatures you control have horsemanship. (They can't be blocked except by creatures with horsemanship.) -PTK R, ME3 R - -Sun Titan -{4}{W}{W} -Creature - Giant -6/6 -Vigilance -Whenever Sun Titan enters the battlefield or attacks, you may return target permanent card with converted mana cost 3 or less from your graveyard to the battlefield. -M11 M, M12 M - -Sun's Bounty -{1}{W} -Instant -You gain 4 life. -Recover {1}{W} (When a creature is put into your graveyard from the battlefield, you may pay {1}{W}. If you do, return this card from your graveyard to your hand. Otherwise, exile this card.) -CSP C - -Sunastian Falconer -{3}{R}{G} -Legendary Creature - Human Shaman -4/4 -{T}: Add {2} to your mana pool. -LEG U, ME3 U - -Sunbeam Spellbomb -{1} -Artifact -{W}, Sacrifice Sunbeam Spellbomb: You gain 5 life. -{1}, Sacrifice Sunbeam Spellbomb: Draw a card. -MRD C - -Sunblast Angel -{4}{W}{W} -Creature - Angel -4/5 -Flying -When Sunblast Angel enters the battlefield, destroy all tapped creatures. -SOM R - -Suncrusher -{9} -Artifact Creature - Construct -3/3 -Sunburst (This enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.) -{4}, {T}, Remove a +1/+1 counter from Suncrusher: Destroy target creature. -{2}, Remove a +1/+1 counter from Suncrusher: Return Suncrusher to its owner's hand. -5DN R - -Sunder -{3}{U}{U} -Instant -Return all lands to their owners' hands. -USG R - -Sunder from Within -{2}{R}{R} -Sorcery - Arcane -Destroy target artifact or land. -SOK U - -Sundering Titan -{8} -Artifact Creature - Golem -7/10 -When Sundering Titan enters the battlefield or leaves the battlefield, choose a land of each basic land type, then destroy those lands. -DST R, ARC R, FVR M - -Sundering Vitae -{2}{G} -Instant -Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.) -Destroy target artifact or enchantment. -RAV C - -Sundial of the Infinite -{2} -Artifact -{1}, {T}: End the turn. Activate this ability only during your turn. (Exile all spells and abilities on the stack. Discard down to your maximum hand size. Damage wears off, and "this turn" and "until end of turn" effects end.) -M12 R - -Sunfire Balm -{2}{W} -Instant -Prevent the next 4 damage that would be dealt to target creature or player this turn. -Cycling {1}{W} ({1}{W}, Discard this card: Draw a card.) -When you cycle Sunfire Balm, you may prevent the next 1 damage that would be dealt to target creature or player this turn. -ONS U - -Sunflare Shaman -{1}{R} -Creature - Elemental Shaman -2/1 -{1}{R}, {T}: Sunflare Shaman deals X damage to target creature or player and X damage to itself, where X is the number of Elemental cards in your graveyard. -MOR C - -Sunforger -{3} -Artifact - Equipment -Equipped creature gets +4/+0. -{R}{W}, Unattach Sunforger: Search your library for a red or white instant card with converted mana cost 4 or less and cast that card without paying its mana cost. Then shuffle your library. -Equip {3} -RAV R - -Sunglasses of Urza -{3} -Artifact -You may spend white mana as though it were red mana. -LEA R, LEB R, 2ED R, 3ED R, 4ED R - -Sungrass Egg -{1} -Artifact -{2}, {T}, Sacrifice Sungrass Egg: Add {G}{W} to your mana pool. Draw a card. -ODY U - -Sungrass Prairie -Land -{1}, {T}: Add {G}{W} to your mana pool. -ODY R - -Sunhome Enforcer -{2}{R}{W} -Creature - Giant Soldier -2/4 -Whenever Sunhome Enforcer deals combat damage, you gain that much life. -{1}{R}: Sunhome Enforcer gets +1/+0 until end of turn. -RAV U - -Sunhome, Fortress of the Legion -Land -{T}: Add {1} to your mana pool. -{2}{R}{W}, {T}: Target creature gains double strike until end of turn. -RAV U, HOP U - -Sunken City -{U}{U} -Enchantment -At the beginning of your upkeep, sacrifice Sunken City unless you pay {U}{U}. -Blue creatures get +1/+1. -DRK C, 4ED C, MED U - -Sunken Field -{1}{U} -Enchantment - Aura -Enchant land -Enchanted land has "{T}: Counter target spell unless its controller pays {1}." -PCY U - -Sunken Hope -{3}{U}{U} -Enchantment -At the beginning of each player's upkeep, that player returns a creature he or she controls to its owner's hand. -PLS R, 10E R - -Sunken Ruins -Land -{T}: Add {1} to your mana pool. -{U/B}, {T}: Add {U}{U}, {U}{B}, or {B}{B} to your mana pool. -SHM R - -Sunlance -{W} -Sorcery -Sunlance deals 3 damage to target nonwhite creature. -PLC C, EVT C - -Sunpetal Grove -Land -Sunpetal Grove enters the battlefield tapped unless you control a Forest or a Plains. -{T}: Add {G} or {W} to your mana pool. -M10 R, M11 R, M12 R - -Sunrise Sovereign -{5}{R} -Creature - Giant Warrior -5/5 -Other Giant creatures you control get +2/+2 and have trample. -LRW R - -Sunscape Apprentice -{W} -Creature - Human Wizard -1/1 -{G}, {T}: Target creature gets +1/+1 until end of turn. -{U}, {T}: Put target creature you control on top of its owner's library. -INV C - -Sunscape Battlemage -{2}{W} -Creature - Human Wizard -2/2 -Kicker {1}{G} and/or {2}{U} (You may pay an additional {1}{G} and/or {2}{U} as you cast this spell.) -When Sunscape Battlemage enters the battlefield, if it was kicked with its {1}{G} kicker, destroy target creature with flying. -When Sunscape Battlemage enters the battlefield, if it was kicked with its {2}{U} kicker, draw two cards. -PLS U, PVC U - -Sunscape Familiar -{1}{W} -Creature - Wall -0/3 -Defender (This creature can't attack.) -Green spells and blue spells you cast cost {1} less to cast. -PLS C - -Sunscape Master -{2}{W}{W} -Creature - Human Wizard -2/2 -{G}{G}, {T}: Creatures you control get +2/+2 until end of turn. -{U}{U}, {T}: Return target creature to its owner's hand. -INV R - -Sunscour -{5}{W}{W} -Sorcery -You may exile two white cards from your hand rather than pay Sunscour's mana cost. -Destroy all creatures. -CSP R - -Sunseed Nurturer -{2}{W} -Creature - Human Druid Wizard -1/1 -At the beginning of your end step, if you control a creature with power 5 or greater, you may gain 2 life. -{T}: Add {1} to your mana pool. -ALA U - -Sunspear Shikari -{1}{W} -Creature - Cat Soldier -2/2 -As long as Sunspear Shikari is equipped, it has first strike and lifelink. -SOM C - -Sunspring Expedition -{W} -Enchantment -Landfall - Whenever a land enters the battlefield under your control, you may put a quest counter on Sunspring Expedition. -Remove three quest counters from Sunspring Expedition and sacrifice it: You gain 8 life. -ZEN C - -Sunstone -{3} -Artifact -{2}, Sacrifice a snow land: Prevent all combat damage that would be dealt this turn. -ICE U - -Sunstrike Legionnaire -{1}{W} -Creature - Human Soldier -1/2 -Sunstrike Legionnaire doesn't untap during your untap step. -Whenever another creature enters the battlefield, untap Sunstrike Legionnaire. -{T}: Tap target creature with converted mana cost 3 or less. -LGN R - -Suntail Hawk -{W} -Creature - Bird -1/1 -Flying (This creature can't be blocked except by creatures with flying or reach.) -JUD C, 8ED C, 9ED C, 10E C - -Suntouched Myr -{3} -Artifact Creature - Myr -0/0 -Sunburst (This enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.) -5DN C, HOP C - -Sunweb -{3}{W} -Creature - Wall -5/6 -Defender (This creature can't attack.) -Flying -Sunweb can't block creatures with power 2 or less. -MIR R, 6ED R, 7ED R, 8ED R - -Superior Numbers -{G}{G} -Sorcery -Superior Numbers deals damage to target creature equal to the number of creatures you control in excess of the number of creatures target opponent controls. -MIR U - -Supply -{X}{G}{W} -Sorcery -Put X 1/1 green Saproling creature tokens onto the battlefield. ----- -Demand -{1}{W}{U} -Sorcery -Search your library for a multicolored card, reveal it, and put it into your hand. Then shuffle your library. -DIS U - -Suppress -{2}{B} -Sorcery -Target player exiles all cards from his or her hand face down. At the beginning of the end step of that player's next turn, that player returns those cards to his or her hand. -APC U - -Suppression Field -{1}{W} -Enchantment -Activated abilities cost {2} more to activate unless they're mana abilities. -RAV U - -Supreme Exemplar -{6}{U} -Creature - Elemental -10/10 -Flying -Champion an Elemental (When this enters the battlefield, sacrifice it unless you exile another Elemental you control. When this leaves the battlefield, that card returns to the battlefield.) -MOR R - -Supreme Inquisitor -{3}{U}{U} -Creature - Human Wizard -1/3 -Tap five untapped Wizards you control: Search target player's library for up to five cards and exile them. Then that player shuffles his or her library. -ONS R - -Suq'Ata Assassin -{1}{B}{B} -Creature - Human Assassin -1/1 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -Whenever Suq'Ata Assassin attacks and isn't blocked, defending player gets a poison counter. (A player with ten or more poison counters loses the game.) -VIS U - -Suq'Ata Firewalker -{1}{U}{U} -Creature - Human Wizard -0/1 -Suq'Ata Firewalker can't be the target of red spells or abilities from red sources. -{T}: Suq'Ata Firewalker deals 1 damage to target creature or player. -MIR U - -Suq'Ata Lancer -{2}{R} -Creature - Human Knight -2/2 -Haste -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -VIS C, TSB S - -Surestrike Trident -{2} -Artifact - Equipment -Equipped creature has first strike and "{T}, Unattach Surestrike Trident: This creature deals damage equal to its power to target player." -Equip {4} ({4}: Attach to target creature you control. Equip only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.) -DST U - -Surge Node -{1} -Artifact -Surge Node enters the battlefield with six charge counters on it. -{1}, {T}, Remove a charge counter from Surge Node: Put a charge counter on target artifact. -NPH U - -Surge of Strength -{R}{G} -Instant -As an additional cost to cast Surge of Strength, discard a red or green card. -Target creature gains trample and gets +X/+0 until end of turn, where X is that creature's converted mana cost. -ALL U - -Surge of Thoughtweft -{1}{W} -Tribal Instant - Kithkin -Creatures you control get +1/+1 until end of turn. If you control a Kithkin, draw a card. -LRW C - -Surge of Zeal -{R} -Instant -Radiance - Target creature and each other creature that shares a color with it gain haste until end of turn. -RAV C - -Surgespanner -{2}{U}{U} -Creature - Merfolk Wizard -2/2 -Whenever Surgespanner becomes tapped, you may pay {1}{U}. If you do, return target permanent to its owner's hand. -LRW R - -Surgical Extraction -{B/P} -Instant -({B/P} can be paid with either {B} or 2 life.) -Choose target card in a graveyard other than a basic land card. Search its owner's graveyard, hand, and library for any number of cards with the same name as that card and exile them. Then that player shuffles his or her library. -NPH R - -Surging AEther -{3}{U} -Instant -Ripple 4 (When you cast this spell, you may reveal the top four cards of your library. You may cast any revealed cards with the same name as this spell without paying their mana costs. Put the rest on the bottom of your library.) -Return target permanent to its owner's hand. -CSP C - -Surging Dementia -{1}{B} -Sorcery -Ripple 4 (When you cast this spell, you may reveal the top four cards of your library. You may cast any revealed cards with the same name as this spell without paying their mana costs. Put the rest on the bottom of your library.) -Target player discards a card. -CSP C - -Surging Flame -{1}{R} -Instant -Ripple 4 (When you cast this spell, you may reveal the top four cards of your library. You may cast any revealed cards with the same name as this spell without paying their mana costs. Put the rest on the bottom of your library.) -Surging Flame deals 2 damage to target creature or player. -CSP C - -Surging Might -{2}{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2. -Ripple 4 (When you cast this spell, you may reveal the top four cards of your library. You may cast any revealed cards with the same name as this spell without paying their mana costs. Put the rest on the bottom of your library.) -CSP C - -Surging Sentinels -{2}{W} -Creature - Human Soldier -2/1 -First strike -Ripple 4 (When you cast this spell, you may reveal the top four cards of your library. You may cast any revealed cards with the same name as this spell without paying their mana costs. Put the rest on the bottom of your library.) -CSP C - -Surprise Deployment -{3}{W} -Instant -Cast Surprise Deployment only during combat. -You may put a nonwhite creature card from your hand onto the battlefield. At the beginning of the next end step, return that creature to your hand. (Return it only if it's on the battlefield.) -PLS U - -Surrakar Banisher -{4}{U} -Creature - Surrakar -3/3 -When Surrakar Banisher enters the battlefield, you may return target tapped creature to its owner's hand. -WWK C - -Surrakar Marauder -{1}{B} -Creature - Surrakar -2/1 -Landfall - Whenever a land enters the battlefield under your control, Surrakar Marauder gains intimidate until end of turn. (It can't be blocked except by artifact creatures and/or creatures that share a color with it.) -ZEN C - -Surrakar Spellblade -{1}{U}{U} -Creature - Surrakar -2/1 -Whenever you cast an instant or sorcery spell, you may put a charge counter on Surrakar Spellblade. -Whenever Surrakar Spellblade deals combat damage to a player, you may draw X cards, where X is the number of charge counters on it. -ROE R - -Surreal Memoir -{3}{R} -Sorcery -Return an instant card at random from your graveyard to your hand. -Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -ROE U - -Surrender Your Thoughts -Scheme -When you set this scheme in motion, target opponent chooses self or others. If that player chooses self, he or she discards four cards. If the player chooses others, each of your other opponents discards two cards. -ARC C - -Surveilling Sprite -{1}{U} -Creature - Faerie Rogue -1/1 -Flying -When Surveilling Sprite dies, you may draw a card. -RAV C - -Survival Cache -{2}{W} -Sorcery -You gain 2 life. Then if you have more life than an opponent, draw a card. -Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -ROE U - -Survival of the Fittest -{1}{G} -Enchantment -{G}, Discard a creature card: Search your library for a creature card, reveal that card, and put it into your hand. Then shuffle your library. -EXO R - -Survivor of the Unseen -{2}{U} -Creature - Human Wizard -2/1 -Cumulative upkeep {2} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -{T}: Draw two cards, then put a card from your hand on top of your library. -CSP C - -Sustainer of the Realm -{2}{W}{W} -Creature - Angel -2/3 -Flying -Whenever Sustainer of the Realm blocks, it gets +0/+2 until end of turn. -ULG U, 7ED U, DVD U - -Sustaining Spirit -{1}{W} -Creature - Angel Spirit -0/3 -Cumulative upkeep {1}{W} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -Damage that would reduce your life total to less than 1 reduces it to 1 instead. -ALL R, ME2 R - -Sustenance -{1}{G} -Enchantment -{1}, Sacrifice a land: Target creature gets +1/+1 until end of turn. -MMQ U - -Suture Priest -{1}{W} -Creature - Cleric -1/1 -Whenever another creature enters the battlefield under your control, you may gain 1 life. -Whenever a creature enters the battlefield under an opponent's control, you may have that player lose 1 life. -NPH C - -Suture Spirit -{1}{W} -Creature - Spirit -1/1 -Flying -{W/B}{W/B}{W/B}: Regenerate target creature. -EVE U - -Sutured Ghoul -{4}{B}{B}{B} -Creature - Zombie -*/* -Trample -As Sutured Ghoul enters the battlefield, exile any number of creature cards from your graveyard. -Sutured Ghoul's power is equal to the total power of the exiled cards and its toughness is equal to their total toughness. -JUD R, M12 R - -Svogthos, the Restless Tomb -Land -{T}: Add {1} to your mana pool. -{3}{B}{G}: Until end of turn, Svogthos, the Restless Tomb becomes a black and green Plant Zombie creature with "This creature's power and toughness are each equal to the number of creature cards in your graveyard." It's still a land. -RAV U, COM U - -Svyelunite Priest -{1}{U} -Creature - Merfolk Cleric -1/1 -{U}{U}, {T}: Target creature gains shroud until end of turn. Activate this ability only during your upkeep. (It can't be the target of spells or abilities.) -FEM U - -Svyelunite Temple -Land -Svyelunite Temple enters the battlefield tapped. -{T}: Add {U} to your mana pool. -{T}, Sacrifice Svyelunite Temple: Add {U}{U} to your mana pool. -FEM U, 5ED U, 6ED U, BTD U, ME2 U - -Swallowing Plague -{X}{B}{B} -Sorcery - Arcane -Swallowing Plague deals X damage to target creature and you gain X life. -CHK U - -Swamp -Basic Land - Swamp -B -LEA L (x2), LEB L (x3), 2ED L (x3), 3ED L (x3), 4ED L (x3), ICE L (x3), MIR L (x4), 5ED L (x4), POR L (x4), TMP L (x4), P02 L (x3), UGL C, USG L (x4), 6ED L (x4), PTK L (x3), S99 L (x4), MMQ L (x4), BRB L (x4), S00 L (x2), INV L (x4), BTD L (x3), 7ED L (x4), ODY L (x4), ONS L (x4), 8ED L (x4), MRD L (x4), CHK L (x4), UNH L, 9ED L (x4), RAV L (x4), TSP L (x4), 10E L (x4), MED L (x3), LRW L (x4), SHM L (x4), ALA L (x4), DVD L (x4), M10 L (x4), HOP L (x5), ME3 L (x3), ZEN L (x8), GVL L (x4), H09 L, PVC L (x4), ROE L (x4), ARC L (x3), M11 L (x4), SOM L (x4), MBS L (x2), NPH L (x2), COM L (x4), M12 L (x4) - -Swamp Mosquito -{1}{B} -Creature - Insect -0/1 -Flying -Whenever Swamp Mosquito attacks and isn't blocked, defending player gets a poison counter. (A player with ten or more poison counters loses the game.) -ALL C (x2), TSB S - -Swans of Bryn Argoll -{2}{W/U}{W/U} -Creature - Bird Spirit -4/3 -Flying -If a source would deal damage to Swans of Bryn Argoll, prevent that damage. The source's controller draws cards equal to the damage prevented this way. -SHM R - -Swarm of Rats -{1}{B} -Creature - Rat -*/1 -Swarm of Rats's power is equal to the number of Rats you control. -P02 C, 8ED U, 9ED U - -Swarmyard -Land -{T}: Add {1} to your mana pool. -{T}: Regenerate target Insect, Rat, Spider, or Squirrel. -TSP R - -Swat -{1}{B}{B} -Instant -Destroy target creature with power 2 or less. -Cycling {2} ({2}, Discard this card: Draw a card.) -ULG C, ONS C - -Sway of Illusion -{1}{U} -Instant -Any number of target creatures become the color of your choice until end of turn. -Draw a card. -INV U - -Sway of the Stars -{8}{U}{U} -Sorcery -Each player shuffles his or her hand, graveyard, and permanents he or she owns into his or her library, then draws seven cards. Each player's life total becomes 7. -BOK R - -Swell of Courage -{3}{W}{W} -Instant -Creatures you control get +2/+2 until end of turn. -Reinforce X-{X}{W}{W} ({X}{W}{W}, Discard this card: Put X +1/+1 counters on target creature.) -MOR U, EVT U - -Swelter -{3}{R} -Sorcery -Swelter deals 2 damage to each of two target creatures. -JUD U - -Swerve -{U}{R} -Instant -Change the target of target spell with a single target. -ALA U - -Swift Maneuver -{1}{W} -Instant -Prevent the next 2 damage that would be dealt to target creature or player this turn. -Draw a card at the beginning of the next turn's upkeep. -CSP C - -Swift Silence -{2}{W}{U}{U} -Instant -Counter all other spells. Draw a card for each spell countered this way. -DIS R - -Swiftfoot Boots -{2} -Artifact - Equipment -Equipped creature has hexproof and haste. (It can't be the target of spells or abilities your opponents control, and it can attack and {T} as soon as it comes under your control.) -Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) -M12 U - -Swirl the Mists -{2}{U}{U} -Enchantment -As Swirl the Mists enters the battlefield, choose a color word. -All instances of color words in the text of spells and permanents are changed to the chosen color word. -CHK R - -Swirling Sandstorm -{3}{R} -Sorcery -Threshold - Swirling Sandstorm deals 5 damage to each creature without flying if seven or more cards are in your graveyard. -JUD C - -Swirling Spriggan -{2}{G}{G} -Creature - Goblin Shaman -3/3 -{G/U}{G/U}: Target creature you control becomes the color or colors of your choice until end of turn. -EVE U - -Swooping Talon -{4}{W}{W} -Creature - Bird Soldier -2/6 -Flying -{1}: Swooping Talon loses flying until end of turn. -Provoke (When this attacks, you may have target creature defending player controls untap and block it if able.) -LGN U - -Sword Dancer -{1}{W} -Creature - Human Rebel -1/2 -{W}{W}: Target attacking creature gets -1/-0 until end of turn. -PCY U, 8ED U - -Sword of Body and Mind -{3} -Artifact - Equipment -Equipped creature gets +2/+2 and has protection from green and from blue. -Whenever equipped creature deals combat damage to a player, you put a 2/2 green Wolf creature token onto the battlefield and that player puts the top ten cards of his or her library into his or her graveyard. -Equip {2} -FVR M, SOM M - -Sword of Feast and Famine -{3} -Artifact - Equipment -Equipped creature gets +2/+2 and has protection from black and from green. -Whenever equipped creature deals combat damage to a player, that player discards a card and you untap all lands you control. -Equip {2} -MBS M - -Sword of Fire and Ice -{3} -Artifact - Equipment -Equipped creature gets +2/+2 and has protection from red and from blue. -Whenever equipped creature deals combat damage to a player, Sword of Fire and Ice deals 2 damage to target creature or player and you draw a card. -Equip {2} -DST R - -Sword of Kaldra -{4} -Legendary Artifact - Equipment -Equipped creature gets +5/+5. -Whenever equipped creature deals damage to a creature, exile that creature. -Equip {4} ({4}: Attach to target creature you control. Equip only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.) -PRO R, MRD R - -Sword of Light and Shadow -{3} -Artifact - Equipment -Equipped creature gets +2/+2 and has protection from white and from black. -Whenever equipped creature deals combat damage to a player, you gain 3 life and you may return up to one target creature card from your graveyard to your hand. -Equip {2} -DST R - -Sword of Vengeance -{3} -Artifact - Equipment -Equipped creature gets +2/+0 and has first strike, vigilance, trample, and haste. -Equip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) -M11 R - -Sword of War and Peace -{3} -Artifact - Equipment -Equipped creature gets +2/+2 and has protection from red and from white. -Whenever equipped creature deals combat damage to a player, Sword of War and Peace deals damage to that player equal to the number of cards in his or her hand and you gain 1 life for each card in your hand. -Equip {2} -NPH M - -Sword of the Ages -{6} -Artifact -Sword of the Ages enters the battlefield tapped. -{T}, Exile Sword of the Ages and any number of creatures you control: Sword of the Ages deals X damage to target creature or player, where X is the total power of the creatures exiled this way. -LEG R, ME3 R - -Sword of the Chosen -{2} -Legendary Artifact -{T}: Target legendary creature gets +2/+2 until end of turn. -STH R - -Sword of the Meek -{2} -Artifact - Equipment -Equipped creature gets +1/+2. -Equip {2} -Whenever a 1/1 creature enters the battlefield under your control, you may return Sword of the Meek from your graveyard to the battlefield, then attach it to that creature. -FUT U - -Sword of the Paruns -{4} -Artifact - Equipment -As long as equipped creature is tapped, tapped creatures you control get +2/+0. -As long as equipped creature is untapped, untapped creatures you control get +0/+2. -{3}: You may tap or untap equipped creature. -Equip {3} -GPT R - -Swords to Plowshares -{W} -Instant -Exile target creature. Its controller gains life equal to its power. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, ICE U, BRB U, ME2 U, EVT U, ME4 U - -Sworn Defender -{2}{W}{W} -Creature - Human Knight -1/3 -{1}: Sworn Defender's power becomes the toughness of target creature blocking or being blocked by Sworn Defender minus 1 until end of turn, and Sworn Defender's toughness becomes 1 plus the power of that creature until end of turn. -ALL R - -Sygg, River Cutthroat -{U/B}{U/B} -Legendary Creature - Merfolk Rogue -1/3 -At the beginning of each end step, if an opponent lost 3 or more life this turn, you may draw a card. (Damage causes loss of life.) -SHM R - -Sygg, River Guide -{W}{U} -Legendary Creature - Merfolk Wizard -2/2 -Islandwalk -{1}{W}: Target Merfolk you control gains protection from the color of your choice until end of turn. -LRW R - -Sylvan Basilisk -{3}{G}{G} -Creature - Basilisk -2/4 -Whenever Sylvan Basilisk becomes blocked by a creature, destroy that creature. -P02 R, S99 R, 10E U - -Sylvan Bounty -{5}{G} -Instant -Target player gains 8 life. -Basic landcycling {1}{G} ({1}{G}, Discard this card: Search your library for a basic land card, reveal it, and put it into your hand. Then shuffle your library.) -CON C - -Sylvan Echoes -{G} -Enchantment -Whenever you clash and win, you may draw a card. (This ability triggers after the clash ends.) -LRW U - -Sylvan Hierophant -{1}{G} -Creature - Human Cleric -1/2 -When Sylvan Hierophant dies, exile Sylvan Hierophant, then return another target creature card from your graveyard to your hand. -WTH U - -Sylvan Library -{1}{G} -Enchantment -At the beginning of your draw step, you may draw two additional cards. If you do, choose two cards in your hand drawn this turn. For each of those cards, pay 4 life or put the card on top of your library. -LEG U, 4ED R, 5ED R, MED R - -Sylvan Messenger -{3}{G} -Creature - Elf -2/2 -Trample -When Sylvan Messenger enters the battlefield, reveal the top four cards of your library. Put all Elf cards revealed this way into your hand and the rest on the bottom of your library in any order. -APC U, EVG U - -Sylvan Might -{1}{G} -Instant -Target creature gets +2/+2 and gains trample until end of turn. -Flashback {2}{G}{G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY U - -Sylvan Paradise -{G} -Instant -Any number of target creatures become green until end of turn. -LEG U - -Sylvan Ranger -{1}{G} -Creature - Elf Scout -1/1 -When Sylvan Ranger enters the battlefield, you may search your library for a basic land card, reveal it, put it into your hand, then shuffle your library. -M11 C - -Sylvan Safekeeper -{G} -Creature - Human Wizard -1/1 -Sacrifice a land: Target creature you control gains shroud until end of turn. (It can't be the target of spells or abilities.) -JUD R - -Sylvan Scrying -{1}{G} -Sorcery -Search your library for a land card, reveal it, and put it into your hand. Then shuffle your library. -MRD U, 10E U - -Sylvan Tutor -{G} -Sorcery -Search your library for a creature card and reveal that card. Shuffle your library, then put the card on top of it. -POR R, ME4 U - -Sylvan Yeti -{2}{G}{G} -Creature - Yeti -*/4 -Sylvan Yeti's power is equal to the number of cards in your hand. -P02 R, S99 R - -Sylvok Explorer -{1}{G} -Creature - Human Druid -1/1 -{T}: Add to your mana pool one mana of any color that a land an opponent controls could produce. -5DN C - -Sylvok Lifestaff -{1} -Artifact - Equipment -Equipped creature gets +1/+0. -Whenever equipped creature dies, you gain 3 life. -Equip {1} -SOM C - -Sylvok Replica -{3} -Artifact Creature - Shaman -1/3 -{G}, Sacrifice Sylvok Replica: Destroy target artifact or enchantment. -SOM C - -Symbiosis -{1}{G} -Instant -Two target creatures each get +2/+2 until end of turn. -USG C, BRB C - -Symbiotic Beast -{4}{G}{G} -Creature - Insect Beast -4/4 -When Symbiotic Beast dies, put four 1/1 green Insect creature tokens onto the battlefield. -ONS U - -Symbiotic Deployment -{2}{G} -Enchantment -Skip your draw step. -{1}, Tap two untapped creatures you control: Draw a card. -APC R - -Symbiotic Elf -{3}{G} -Creature - Elf -2/2 -When Symbiotic Elf dies, put two 1/1 green Insect creature tokens onto the battlefield. -ONS C - -Symbiotic Wurm -{5}{G}{G}{G} -Creature - Wurm -7/7 -When Symbiotic Wurm dies, put seven 1/1 green Insect creature tokens onto the battlefield. -ONS R, COM R - -Symbol of Unsummoning -{2}{U} -Sorcery -Return target creature to its owner's hand. -Draw a card. -POR C, ME4 C - -Synapse Sliver -{4}{U} -Creature - Sliver -3/3 -Whenever a Sliver deals combat damage to a player, its controller may draw a card. -LGN R - -Synchronous Sliver -{4}{U} -Creature - Sliver -3/3 -All Sliver creatures have vigilance. -PLC C - -Syncopate -{X}{U} -Instant -Counter target spell unless its controller pays {X}. If that spell is countered this way, exile it instead of putting it into its owner's graveyard. -ODY C - -Synod Artificer -{2}{U} -Creature - Vedalken Artificer -1/2 -{X}, {T}: Tap X target noncreature artifacts. -{X}, {T}: Untap X target noncreature artifacts. -DST R - -Synod Centurion -{4} -Artifact Creature - Construct -4/4 -When you control no other artifacts, sacrifice Synod Centurion. -5DN U, ARC U, EVT U - -Synod Sanctum -{1} -Artifact -{2}, {T}: Exile target permanent you control. -{2}, Sacrifice Synod Sanctum: Return all cards exiled with Synod Sanctum to the battlefield under your control. -MRD U, ARC U - -Syphon Flesh -{4}{B} -Sorcery -Each other player sacrifices a creature. You put a 2/2 black Zombie creature token onto the battlefield for each creature sacrificed this way. -COM U - -Syphon Life -{1}{B}{B} -Sorcery -Target player loses 2 life and you gain 2 life. -Retrace (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) -EVE U - -Syphon Mind -{3}{B} -Sorcery -Each other player discards a card. You draw a card for each card discarded this way. -ONS C, HOP C, COM C - -Syphon Soul -{2}{B} -Sorcery -Syphon Soul deals 2 damage to each other player. You gain life equal to the damage dealt this way. -LEG C, 6ED C, BRB C, ONS C, HOP C - -Szadek, Lord of Secrets -{3}{U}{U}{B}{B} -Legendary Creature - Vampire -5/5 -Flying -If Szadek, Lord of Secrets would deal combat damage to a player, instead put that many +1/+1 counters on Szadek and that player puts that many cards from the top of his or her library into his or her graveyard. -RAV R, COM R - -Tablet of Epityr -{1} -Artifact -Whenever an artifact you control is put into a graveyard from the battlefield, you may pay {1}. If you do, you gain 1 life. -ATQ C, ME4 C - -Tahngarth -Vanguard -Hand -1, life +7 -Creatures you control have haste. -VG S - -Tahngarth's Glare -{R} -Sorcery -Look at the top three cards of target opponent's library, then put them back in any order. That player looks at the top three cards of your library, then puts them back in any order. -APC C - -Tahngarth's Rage -{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +3/+0 as long as it's attacking. Otherwise, it gets -2/-1. -TMP U - -Tahngarth, Talruum Hero -{3}{R}{R} -Legendary Creature - Minotaur Warrior -4/4 -Vigilance -{1}{R}, {T}: Tahngarth, Talruum Hero deals damage equal to its power to target creature. That creature deals damage equal to its power to Tahngarth. -PLS R (x2) - -Taiga -Land - Mountain Forest -LEA R, LEB R, 2ED R, 3ED R, ME2 R, ME4 R - -Tainted AEther -{2}{B}{B} -Enchantment -Whenever a creature enters the battlefield, its controller sacrifices a creature or land. -USG R, 7ED R - -Tainted Field -Land -{T}: Add {1} to your mana pool. -{T}: Add {W} or {B} to your mana pool. Activate this ability only if you control a Swamp. -TOR U - -Tainted Isle -Land -{T}: Add {1} to your mana pool. -{T}: Add {U} or {B} to your mana pool. Activate this ability only if you control a Swamp. -TOR U - -Tainted Pact -{1}{B} -Instant -Exile the top card of your library. You may put that card into your hand unless it has the same name as another card exiled this way. Repeat this process until you put a card into your hand or you exile two cards with the same name, whichever comes first. -ODY R - -Tainted Peak -Land -{T}: Add {1} to your mana pool. -{T}: Add {B} or {R} to your mana pool. Activate this ability only if you control a Swamp. -TOR U - -Tainted Sigil -{1}{W}{B} -Artifact -{T}, Sacrifice Tainted Sigil: You gain life equal to the total life lost by all players this turn. (Damage causes loss of life.) -ARB U - -Tainted Specter -{3}{B} -Creature - Specter -2/2 -Flying -{1}{B}{B}, {T}: Target player discards a card unless he or she puts a card from his or her hand on top of his or her library. If that player discards a card this way, Tainted Specter deals 1 damage to each creature and each player. Activate this ability only any time you could cast a sorcery. -MIR R - -Tainted Strike -{B} -Instant -Target creature gets +1/+0 and gains infect until end of turn. (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -SOM C - -Tainted Well -{2}{B} -Enchantment - Aura -Enchant land -When Tainted Well enters the battlefield, draw a card. -Enchanted land is a Swamp. -INV C - -Tainted Wood -Land -{T}: Add {1} to your mana pool. -{T}: Add {B} or {G} to your mana pool. Activate this ability only if you control a Swamp. -TOR U - -Taj-Nar Swordsmith -{3}{W} -Creature - Cat Soldier -2/3 -When Taj-Nar Swordsmith enters the battlefield, you may pay {X}. If you do, search your library for an Equipment card with converted mana cost X or less and put that card onto the battlefield. Then shuffle your library. -MRD U - -Tajuru Archer -{2}{G} -Creature - Elf Archer Ally -1/2 -Whenever Tajuru Archer or another Ally enters the battlefield under your control, you may have Tajuru Archer deal damage to target creature with flying equal to the number of Allies you control. -ZEN U - -Tajuru Preserver -{1}{G} -Creature - Elf Shaman -2/1 -Spells and abilities your opponents control can't cause you to sacrifice permanents. -ROE R - -Takara -Vanguard -Hand +3, life -8 -Sacrifice a creature: Takara deals 1 damage to target creature or player. -VG S - -Take Possession -{5}{U}{U} -Enchantment - Aura -Split second (As long as this spell is on the stack, players can't cast spells or activate abilities that aren't mana abilities.) -Enchant permanent -You control enchanted permanent. -FUT R - -Takeno's Cavalry -{3}{W} -Creature - Human Samurai Archer -1/1 -Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -{T}: Takeno's Cavalry deals 1 damage to target attacking or blocking Spirit. -BOK C - -Takeno, Samurai General -{5}{W} -Legendary Creature - Human Samurai -3/3 -Bushido 2 (When this blocks or becomes blocked, it gets +2/+2 until end of turn.) -Each other Samurai creature you control gets +1/+1 for each point of bushido it has. -CHK R - -Takenuma Bleeder -{2}{B} -Creature - Ogre Shaman -3/3 -Whenever Takenuma Bleeder attacks or blocks, you lose 1 life if you don't control a Demon. -BOK C - -Takklemaggot -{2}{B}{B} -Enchantment - Aura -Enchant creature -At the beginning of the upkeep of enchanted creature's controller, put a -0/-1 counter on that creature. -When enchanted creature dies, that creature's controller chooses a creature that Takklemaggot could enchant. If he or she does, return Takklemaggot to the battlefield under your control attached to that creature. If he or she doesn't, return Takklemaggot to the battlefield under your control as a non-Aura enchantment. It loses "enchant creature" and gains "At the beginning of that player's upkeep, Takklemaggot deals 1 damage to him or her." -LEG U, CHR U, ME3 U - -Talara's Bane -{1}{B} -Sorcery -Target opponent reveals his or her hand. You choose a green or white creature card from it. You gain life equal that creature card's toughness, then that player discards that card. -EVE C - -Talara's Battalion -{1}{G} -Creature - Elf Warrior -4/3 -Trample -Cast Talara's Battalion only if you've cast another green spell this turn. -EVE R - -Talas Air Ship -{3}{U} -Creature - Human Pirate -3/2 -Flying -P02 C - -Talas Explorer -{1}{U} -Creature - Human Pirate Scout -1/1 -Flying -When Talas Explorer enters the battlefield, look at target opponent's hand. -P02 C - -Talas Merchant -{1}{U} -Creature - Human Pirate -1/3 -P02 C - -Talas Researcher -{4}{U} -Creature - Human Pirate Wizard -1/1 -{T}: Draw a card. Activate this ability only during your turn, before attackers are declared. -P02 R, ME4 U - -Talas Scout -{1}{U} -Creature - Human Pirate Scout -1/2 -Flying -P02 C - -Talas Warrior -{1}{U}{U} -Creature - Human Pirate Warrior -2/2 -Talas Warrior is unblockable. -P02 R - -Talisman of Dominance -{2} -Artifact -{T}: Add {1} to your mana pool. -{T}: Add {U} or {B} to your mana pool. Talisman of Dominance deals 1 damage to you. -MRD U - -Talisman of Impulse -{2} -Artifact -{T}: Add {1} to your mana pool. -{T}: Add {R} or {G} to your mana pool. Talisman of Impulse deals 1 damage to you. -MRD U - -Talisman of Indulgence -{2} -Artifact -{T}: Add {1} to your mana pool. -{T}: Add {B} or {R} to your mana pool. Talisman of Indulgence deals 1 damage to you. -MRD U - -Talisman of Progress -{2} -Artifact -{T}: Add {1} to your mana pool. -{T}: Add {W} or {U} to your mana pool. Talisman of Progress deals 1 damage to you. -MRD U - -Talisman of Unity -{2} -Artifact -{T}: Add {1} to your mana pool. -{T}: Add {G} or {W} to your mana pool. Talisman of Unity deals 1 damage to you. -MRD U - -Tallowisp -{1}{W} -Creature - Spirit -1/3 -Whenever you cast a Spirit or Arcane spell, you may search your library for an Aura card with enchant creature, reveal it, and put it into your hand. If you do, shuffle your library. -BOK U - -Talon Sliver -{1}{W} -Creature - Sliver -1/1 -All Sliver creatures have first strike. -TMP C - -Talon Trooper -{1}{W}{U} -Creature - Bird Scout -2/3 -Flying -ARB C - -Talon of Pain -{4} -Artifact -Whenever a source you control other than Talon of Pain deals damage to an opponent, put a charge counter on Talon of Pain. -{X}, {T}, Remove X charge counters from Talon of Pain: Talon of Pain deals X damage to target creature or player. -DST U - -Talonrend -{4}{U} -Creature - Elemental -0/5 -Flying -{U/R}: Talonrend gets +1/-1 until end of turn. -EVE U - -Talruum Champion -{4}{R} -Creature - Minotaur -3/3 -First strike -Whenever Talruum Champion blocks or becomes blocked by a creature, that creature loses first strike until end of turn. -VIS C - -Talruum Minotaur -{2}{R}{R} -Creature - Minotaur Berserker -3/3 -Haste -MIR C, 6ED C, BTD C - -Talruum Piper -{4}{R} -Creature - Minotaur -3/3 -All creatures with flying able to block Talruum Piper do so. -VIS U - -Talus Paladin -{3}{W} -Creature - Human Knight Ally -2/3 -Whenever Talus Paladin or another Ally enters the battlefield under your control, you may have Allies you control gain lifelink until end of turn, and you may put a +1/+1 counter on Talus Paladin. -WWK R - -Tamanoa -{R}{G}{W} -Creature - Spirit -2/4 -Whenever a noncreature source you control deals damage, you gain that much life. -CSP R - -Tangle -{1}{G} -Instant -Prevent all combat damage that would be dealt this turn. -Each attacking creature doesn't untap during its controller's next untap step. -INV U - -Tangle Angler -{3}{G} -Creature - Horror -1/5 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -{G}: Target creature blocks Tangle Angler this turn if able. -SOM U - -Tangle Asp -{1}{G} -Creature - Snake -1/2 -Whenever Tangle Asp blocks or becomes blocked by a creature, destroy that creature at end of combat. -5DN C - -Tangle Golem -{7} -Artifact Creature - Golem -5/4 -Affinity for Forests (This spell costs {1} less to cast for each Forest you control.) -DST C - -Tangle Hulk -{5} -Artifact Creature - Beast -5/3 -{2}{G}: Regenerate Tangle Hulk. -MBS C - -Tangle Kelp -{U} -Enchantment - Aura -Enchant creature -When Tangle Kelp enters the battlefield, tap enchanted creature. -Enchanted creature doesn't untap during its controller's untap step if it attacked during its controller's last turn. -DRK U - -Tangle Mantis -{2}{G}{G} -Creature - Insect -3/4 -Trample -MBS C - -Tangle Spider -{4}{G}{G} -Creature - Spider -3/4 -Flash (You may cast this spell any time you could cast an instant.) -Reach (This creature can block creatures with flying.) -DST C, 10E U - -Tangle Wire -{3} -Artifact -Fading 4 (This artifact enters the battlefield with four fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.) -At the beginning of each player's upkeep, that player taps an untapped artifact, creature, or land he or she controls for each fade counter on Tangle Wire. -NEM R - -Tanglebloom -{1} -Artifact -{1}, {T}: You gain 1 life. -MRD C, 9ED U - -Tangleroot -{3} -Artifact -Whenever a player casts a creature spell, that player adds {G} to his or her mana pool. -MRD R - -Tanglesap -{1}{G} -Instant -Prevent all combat damage that would be dealt this turn by creatures without trample. -ZEN C - -Tanglewalker -{2}{G} -Creature - Dryad -2/2 -Each creature you control is unblockable as long as defending player controls an artifact land. -DST U - -Taniwha -{3}{U}{U} -Legendary Creature - Serpent -7/7 -Trample -Phasing (This phases in or out before you untap during each of your untap steps. While it's phased out, it's treated as though it doesn't exist.) -At the beginning of your upkeep, all lands you control phase out. (They phase in before you untap during your next untap step.) -MIR R - -Taoist Hermit -{2}{G} -Creature - Human Mystic -2/2 -Hexproof (This creature can't be the target of spells or abilities your opponents control.) -PTK U - -Taoist Mystic -{2}{G} -Creature - Human Mystic -2/2 -Taoist Mystic can't be blocked by creatures with horsemanship. -PTK R - -Tar Fiend -{5}{B} -Creature - Elemental -4/4 -Devour 2 (As this enters the battlefield, you may sacrifice any number of creatures. This creature enters the battlefield with twice that many +1/+1 counters on it.) -When Tar Fiend enters the battlefield, target player discards a card for each creature it devoured. -ALA R - -Tar Pit Warrior -{2}{B} -Creature - Cyclops Warrior -3/4 -When Tar Pit Warrior becomes the target of a spell or ability, sacrifice it. -VIS C, BTD C - -Tar Pitcher -{3}{R} -Creature - Goblin Shaman -2/2 -{T}, Sacrifice a Goblin: Tar Pitcher deals 2 damage to target creature or player. -LRW U, EVG U - -Tarfire -{R} -Tribal Instant - Goblin -Tarfire deals 2 damage to target creature or player. -LRW C, EVG C - -Tariel, Reckoner of Souls -{4}{W}{B}{R} -Legendary Creature - Angel -4/7 -Flying, vigilance -{T}: Choose a creature card at random from target opponent's graveyard. Put that card onto the battlefield under your control. -COM M - -Tariff -{1}{W} -Sorcery -Each player sacrifices the creature he or she controls with the highest converted mana cost unless he or she pays that creature's mana cost. If two creatures a player controls are tied for highest cost, that player chooses one. -WTH R, 6ED R - -Tarmogoyf -{1}{G} -Creature - Lhurgoyf -*/1+* -Tarmogoyf's power is equal to the number of card types among cards in all graveyards and its toughness is equal to that number plus 1. (Artifact, creature, enchantment, instant, land, planeswalker, sorcery, and tribal are card types.) -FUT R - -Tarnished Citadel -Land -{T}: Add {1} to your mana pool. -{T}: Add one mana of any color to your mana pool. Tarnished Citadel deals 3 damage to you. -ODY R - -Tarox Bladewing -{2}{R}{R}{R} -Legendary Creature - Dragon -4/3 -Flying, haste -Grandeur - Discard another card named Tarox Bladewing: Tarox Bladewing gets +X/+X until end of turn, where X is its power. -FUT R - -Tarpan -{G} -Creature - Horse -1/1 -When Tarpan dies, you gain 1 life. -ICE C, 5ED C - -Task Force -{2}{W} -Creature - Human Rebel -1/3 -Whenever Task Force becomes the target of a spell or ability, it gets +0/+3 until end of turn. -MMQ C - -Task Mage Assembly -{2}{R} -Enchantment -When there are no creatures on the battlefield, sacrifice Task Mage Assembly. -{2}: Task Mage Assembly deals 1 damage to target creature. Any player may activate this ability but only any time he or she could cast a sorcery. -PCY R - -Taste for Mayhem -{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+0. -Hellbent - Enchanted creature gets an additional +2/+0 as long as you have no cards in hand. -DIS C - -Taste of Blood -{B} -Sorcery -Taste of Blood deals 1 damage to target player and you gain 1 life. -M12 C - -Taste of Paradise -{3}{G} -Sorcery -As an additional cost to cast Taste of Paradise, you may pay {1}{G} any number of times. -You gain 3 life plus an additional 3 life for each additional {1}{G} you paid. -ALL C (x2) - -Tatsumasa, the Dragon's Fang -{6} -Legendary Artifact - Equipment -Equipped creature gets +5/+5. -{6}, Exile Tatsumasa, the Dragon's Fang: Put a 5/5 blue Dragon Spirit creature token with flying onto the battlefield. Return Tatsumasa to the battlefield under its owner's control when that token dies. -Equip {3} -CHK R - -Tattered Drake -{4}{U} -Creature - Zombie Drake -2/2 -Flying -{B}: Regenerate Tattered Drake. -RAV C - -Tatterkite -{3} -Artifact Creature - Scarecrow -2/1 -Flying -Tatterkite can't have counters placed on it. -SHM U - -Tattermunge Duo -{2}{R/G} -Creature - Goblin Warrior Shaman -2/3 -Whenever you cast a red spell, Tattermunge Duo gets +1/+1 until end of turn. -Whenever you cast a green spell, Tattermunge Duo gains forestwalk until end of turn. -SHM C - -Tattermunge Maniac -{R/G} -Creature - Goblin Warrior -2/1 -Tattermunge Maniac attacks each turn if able. -SHM U - -Tattermunge Witch -{1}{R/G} -Creature - Goblin Shaman -2/1 -{R}{G}: Each blocked creature gets +1/+0 and gains trample until end of turn. -SHM U - -Tattoo Ward -{2}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+1 and has protection from enchantments. This effect doesn't remove Tattoo Ward. -Sacrifice Tattoo Ward: Destroy target enchantment. -ODY U - -Taunt -{U} -Sorcery -During target player's next turn, creatures that player controls attack you if able. -POR R - -Taunting Challenge -{1}{G}{G} -Sorcery -All creatures able to block target creature this turn do so. -PTK R - -Taunting Elf -{G} -Creature - Elf -0/1 -All creatures able to block Taunting Elf do so. -UDS C, ONS C - -Taurean Mauler -{2}{R} -Creature - Shapeshifter -2/2 -Changeling (This card is every creature type at all times.) -Whenever an opponent casts a spell, you may put a +1/+1 counter on Taurean Mauler. -MOR R, HOP R, ARC R - -Tawnos -Vanguard -Hand +3, life -4 -You may cast artifact, creature, and enchantment spells as though they had flash. -VG S - -Tawnos's Coffin -{4} -Artifact -You may choose not to untap Tawnos's Coffin during your untap step. -{3}, {T}: Exile target creature and all Auras attached to it. Note the number and kind of counters that were on that creature. When Tawnos's Coffin leaves the battlefield or becomes untapped, return the exiled card to the battlefield under its owner's control tapped with the noted number and kind of counters on it, and if you do, return the exiled Aura cards to the battlefield under their owner's control attached to that permanent. -ATQ R, MED R - -Tawnos's Wand -{4} -Artifact -{2}, {T}: Target creature with power 2 or less is unblockable this turn. -ATQ U, 4ED U, ME4 C - -Tawnos's Weaponry -{2} -Artifact -You may choose not to untap Tawnos's Weaponry during your untap step. -{2}, {T}: Target creature gets +1/+1 for as long as Tawnos's Weaponry remains tapped. -ATQ U, 4ED U, 5ED U, ME4 U - -Tazeem -Plane - Zendikar -Creatures can't block. -Whenever you roll {C}, draw a card for each land you control. -HOP S - -Teardrop Kami -{U} -Creature - Spirit -1/1 -Sacrifice Teardrop Kami: You may tap or untap target creature. -BOK C - -Tears of Rage -{2}{R}{R} -Instant -Cast Tears of Rage only during the declare attackers step. -Attacking creatures you control get +X/+0 until end of turn, where X is the number of attacking creatures. Sacrifice those creatures at the beginning of the next end step. -DST U - -Tectonic Break -{X}{R}{R} -Sorcery -Each player sacrifices X lands. -MMQ R - -Tectonic Edge -Land -{T}: Add {1} to your mana pool. -{1}, {T}, Sacrifice Tectonic Edge: Destroy target nonbasic land. Activate this ability only if an opponent controls four or more lands. -WWK U - -Tectonic Fiend -{4}{R}{R} -Creature - Elemental -7/7 -Echo {4}{R}{R} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -Tectonic Fiend attacks each turn if able. -TSP U - -Tectonic Instability -{2}{R} -Enchantment -Whenever a land enters the battlefield, tap all lands its controller controls. -INV R - -Tectonic Rift -{3}{R} -Sorcery -Destroy target land. Creatures without flying can't block this turn. -M12 U - -Teeka's Dragon -{9} -Artifact Creature - Dragon -5/5 -Flying; trample; rampage 4 (Whenever this creature becomes blocked, it gets +4/+4 until end of turn for each creature blocking it beyond the first.) -MIR R - -Teetering Peaks -Land -Teetering Peaks enters the battlefield tapped. -When Teetering Peaks enters the battlefield, target creature gets +2/+0 until end of turn. -{T}: Add {R} to your mana pool. -ZEN C, H10 C - -Teferi's Care -{2}{W} -Enchantment -{W}, Sacrifice an enchantment: Destroy target enchantment. -{3}{U}{U}: Counter target enchantment spell. -INV U - -Teferi's Curse -{1}{U} -Enchantment - Aura -Enchant artifact or creature -Enchanted permanent has phasing. (It phases in or out before its controller untaps during each of his or her untap steps. While it's phased out, it's treated as though it doesn't exist.) -MIR C - -Teferi's Drake -{2}{U} -Creature - Drake -3/2 -Flying -Phasing (This phases in or out before you untap during each of your untap steps. While it's phased out, it's treated as though it doesn't exist.) -MIR C - -Teferi's Honor Guard -{2}{W} -Creature - Human Knight -2/2 -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -{U}{U}: Teferi's Honor Guard phases out. (While it's phased out, it's treated as though it doesn't exist. It phases in before you untap during your next untap step.) -VIS U - -Teferi's Imp -{2}{U} -Creature - Imp -1/1 -Flying -Phasing (This phases in or out before you untap during each of your untap steps. While it's phased out, it's treated as though it doesn't exist.) -Whenever Teferi's Imp phases out, discard a card. -Whenever Teferi's Imp phases in, draw a card. -MIR R - -Teferi's Isle -Legendary Land -Phasing (This phases in or out before you untap during each of your untap steps. While it's phased out, it's treated as though it doesn't exist.) -Teferi's Isle enters the battlefield tapped. -{T}: Add {U}{U} to your mana pool. -MIR R - -Teferi's Moat -{3}{W}{U} -Enchantment -As Teferi's Moat enters the battlefield, choose a color. -Creatures of the chosen color without flying can't attack you. -INV R, TSB S - -Teferi's Puzzle Box -{4} -Artifact -At the beginning of each player's draw step, that player puts the cards in his or her hand on the bottom of his or her library in any order, then draws that many cards. -VIS R, 6ED R, 7ED R, 8ED R, 9ED R - -Teferi's Realm -{1}{U}{U} -World Enchantment -At the beginning of each player's upkeep, that player chooses artifact, creature, land, or non-Aura enchantment. All nontoken permanents of that type phase out. (While they're phased out, they're treated as though they don't exist. Each one phases in before its controller untaps during his or her next untap step.) -VIS R - -Teferi's Response -{1}{U} -Instant -Counter target spell or ability an opponent controls that targets a land you control. If a permanent's ability is countered this way, destroy that permanent. -Draw two cards. -INV R - -Teferi's Veil -{1}{U} -Enchantment -Whenever a creature you control attacks, it phases out at end of combat. (While it's phased out, it's treated as though it doesn't exist. It phases in before you untap during your next untap step.) -WTH U - -Teferi, Mage of Zhalfir -{2}{U}{U}{U} -Legendary Creature - Human Wizard -3/4 -Flash (You may cast this spell any time you could cast an instant.) -Creature cards you own that aren't on the battlefield have flash. -Each opponent can cast spells only any time he or she could cast a sorcery. -TSP R - -Tek -{5} -Artifact Creature - Dragon -2/2 -Tek gets +0/+2 as long as you control a Plains, has flying as long as you control an Island, gets +2/+0 as long as you control a Swamp, has first strike as long as you control a Mountain, and has trample as long as you control a Forest. -INV R - -Tel-Jilad Archers -{4}{G} -Creature - Elf Archer -2/4 -Protection from artifacts; reach (This creature can block creatures with flying.) -MRD C - -Tel-Jilad Chosen -{1}{G} -Creature - Elf Warrior -2/1 -Protection from artifacts -MRD C - -Tel-Jilad Defiance -{1}{G} -Instant -Target creature gains protection from artifacts until end of turn. -Draw a card. -SOM C - -Tel-Jilad Exile -{3}{G} -Creature - Troll Warrior -2/3 -{1}{G}: Regenerate Tel-Jilad Exile. -MRD C - -Tel-Jilad Fallen -{2}{G}{G} -Creature - Elf Warrior -3/1 -Protection from artifacts -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -SOM C - -Tel-Jilad Justice -{1}{G} -Instant -Destroy target artifact. -Scry 2. (To scry 2, look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) -5DN U - -Tel-Jilad Lifebreather -{4}{G} -Creature - Troll Shaman -3/2 -{G}, {T}, Sacrifice a Forest: Regenerate target creature. -5DN C - -Tel-Jilad Outrider -{3}{G} -Creature - Elf Warrior -3/1 -Protection from artifacts -DST C - -Tel-Jilad Stylus -{1} -Artifact -{T}: Put target permanent you own on the bottom of your library. -MRD U - -Tel-Jilad Wolf -{2}{G} -Creature - Wolf -2/2 -Whenever Tel-Jilad Wolf becomes blocked by an artifact creature, Tel-Jilad Wolf gets +3/+3 until end of turn. -DST C - -Telekinesis -{U}{U} -Instant -Tap target creature. Prevent all combat damage that would be dealt by that creature this turn. It doesn't untap during its controller's next two untap steps. -LEG R, MED C - -Telekinetic Bonds -{2}{U}{U}{U} -Enchantment -Whenever a player discards a card, you may pay {1}{U}. If you do, you may tap or untap target permanent. -JUD R - -Telekinetic Sliver -{2}{U}{U} -Creature - Sliver -2/2 -All Slivers have "{T}: Tap target permanent." -TSP U - -Telemin Performance -{3}{U}{U} -Sorcery -Target opponent reveals cards from the top of his or her library until he or she reveals a creature card. That player puts all noncreature cards revealed this way into his or her graveyard, then you put the creature card onto the battlefield under your control. -CON R - -Telepathic Spies -{2}{U} -Creature - Human Wizard -2/2 -When Telepathic Spies enters the battlefield, look at target opponent's hand. -UDS C, 7ED C - -Telepathy -{U} -Enchantment -Your opponents play with their hands revealed. -USG U, 7ED U, 8ED U, 9ED U, 10E U, M10 U - -Teleport -{U}{U}{U} -Instant -Cast Teleport only during the declare attackers step. -Target creature is unblockable this turn. -LEG R, CHR R - -Telethopter -{4} -Artifact Creature - Thopter -3/1 -Tap an untapped creature you control: Telethopter gains flying until end of turn. -TMP U - -Telim'Tor -{4}{R} -Legendary Creature - Human Knight -2/2 -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -Whenever Telim'Tor attacks, all attacking creatures with flanking get +1/+1 until end of turn. -MIR R - -Telim'Tor's Darts -{2} -Artifact -{2}, {T}: Telim'Tor's Darts deals 1 damage to target player. -MIR U - -Telim'Tor's Edict -{R} -Instant -Exile target permanent you own or control. -Draw a card at the beginning of the next turn's upkeep. -MIR R - -Teller of Tales -{3}{U}{U} -Creature - Spirit -3/3 -Flying -Whenever you cast a Spirit or Arcane spell, you may tap or untap target creature. -CHK C - -Telling Time -{1}{U} -Instant -Look at the top three cards of your library. Put one of those cards into your hand, one on top of your library, and one on the bottom of your library. -RAV U, 10E U - -Tember City -Plane - Kinshala -Whenever a player taps a land for mana, Tember City deals 1 damage to that player. -Whenever you roll {C}, each other player sacrifices a nonland permanent. -HOP P - -Temper -{X}{1}{W} -Instant -Prevent the next X damage that would be dealt to target creature this turn. For each 1 damage prevented this way, put a +1/+1 counter on that creature. -STH U - -Tempered Steel -{1}{W}{W} -Enchantment -Artifact creatures you control get +2/+2. -SOM R - -Tempest Drake -{1}{W}{U} -Creature - Drake -2/2 -Flying, vigilance -VIS U - -Tempest Efreet -{1}{R}{R}{R} -Creature - Efreet -3/3 -Remove Tempest Efreet from your deck before playing if you're not playing for ante. -{T}, Sacrifice Tempest Efreet: Target opponent may pay 10 life. If that player doesn't, he or she reveals a card at random from his or her hand. Exchange ownership of the revealed card and Tempest Efreet. Put the revealed card into your hand and Tempest Efreet from anywhere into that player's graveyard. -LEG R, 4ED R - -Tempest Owl -{1}{U} -Creature - Bird -1/2 -Kicker {4}{U} (You may pay an additional {4}{U} as you cast this spell.) -Flying -When Tempest Owl enters the battlefield, if it was kicked, tap up to three target permanents. -ZEN C - -Tempest of Light -{2}{W} -Instant -Destroy all enchantments. -MRD U, 9ED U, 10E U, M10 U - -Temple Acolyte -{1}{W} -Creature - Human Cleric -1/3 -When Temple Acolyte enters the battlefield, you gain 3 life. -P02 C, EVT C, ME4 C - -Temple Bell -{3} -Artifact -{T}: Each player draws a card. -M11 R - -Temple Elder -{2}{W} -Creature - Human Cleric -1/2 -{T}: You gain 1 life. Activate this ability only during your turn, before attackers are declared. -P02 U - -Temple Garden -Land - Forest Plains -({T}: Add {G} or {W} to your mana pool.) -As Temple Garden enters the battlefield, you may pay 2 life. If you don't, Temple Garden enters the battlefield tapped. -RAV R - -Temple of the False God -Land -{T}: Add {2} to your mana pool. Activate this ability only if you control five or more lands. -SCG U, COM U - -Temporal Adept -{1}{U}{U} -Creature - Human Wizard -1/1 -{U}{U}{U}, {T}: Return target permanent to its owner's hand. -UDS R, 7ED R, 8ED R, 9ED R - -Temporal Aperture -{2} -Artifact -{5}, {T}: Shuffle your library, then reveal the top card. Until end of turn, for as long as that card remains on top of your library, play with the top card of your library revealed and you may play that card without paying its mana cost. (If it has X in its mana cost, X is 0.) -USG R - -Temporal Cascade -{5}{U}{U} -Sorcery -Choose one - Each player shuffles his or her hand and graveyard into his or her library; or each player draws seven cards. -Entwine {2} (Choose both if you pay the entwine cost.) -MRD R - -Temporal Distortion -{3}{U}{U} -Enchantment -Whenever a creature or land becomes tapped, put an hourglass counter on it. -Permanents with hourglass counters on them don't untap during their controllers' untap steps. -At the beginning of each player's upkeep, remove all hourglass counters from permanents that player controls. -INV R - -Temporal Eddy -{2}{U}{U} -Sorcery -Put target creature or land on top of its owner's library. -TSP C - -Temporal Extortion -{B}{B}{B}{B} -Sorcery -When you cast Temporal Extortion, any player may pay half his or her life, rounded up. If a player does, counter Temporal Extortion. -Take an extra turn after this one. -PLC R - -Temporal Fissure -{4}{U} -Sorcery -Return target permanent to its owner's hand. -Storm (When you cast this spell, copy it for each spell cast before it this turn. You may choose new targets for the copies.) -SCG C - -Temporal Isolation -{1}{W} -Enchantment - Aura -Flash (You may cast this spell any time you could cast an instant.) -Enchant creature -Enchanted creature has shadow. (It can block or be blocked by only creatures with shadow.) -Prevent all damage that would be dealt by enchanted creature. -TSP C - -Temporal Manipulation -{3}{U}{U} -Sorcery -Take an extra turn after this one. -P02 R, ME2 R - -Temporal Spring -{1}{G}{U} -Sorcery -Put target permanent on top of its owner's library. -APC C - -Temporary Insanity -{3}{R} -Instant -Untap target creature with power less than the number of cards in your graveyard and gain control of it until end of turn. That creature gains haste until end of turn. -TOR U, DDG U - -Temporary Truce -{1}{W} -Sorcery -Each player may draw up to two cards. For each card less than two a player draws this way, that player gains 2 life. -POR R - -Tempting Licid -{2}{G} -Creature - Licid -2/2 -{G}, {T}: Tempting Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {G} to end this effect. -All creatures able to block enchanted creature do so. -STH U - -Tempting Wurm -{1}{G} -Creature - Wurm -5/5 -When Tempting Wurm enters the battlefield, each opponent may put any number of artifact, creature, enchantment, and/or land cards from his or her hand onto the battlefield. -ONS R - -Tendo Ice Bridge -Land -Tendo Ice Bridge enters the battlefield with a charge counter on it. -{T}: Add {1} to your mana pool. -{T}, Remove a charge counter from Tendo Ice Bridge: Add one mana of any color to your mana pool. -BOK R - -Tendrils of Agony -{2}{B}{B} -Sorcery -Target player loses 2 life and you gain 2 life. -Storm (When you cast this spell, copy it for each spell cast before it this turn. You may choose new targets for the copies.) -SCG U - -Tendrils of Corruption -{3}{B} -Instant -Tendrils of Corruption deals X damage to target creature and you gain X life, where X is the number of Swamps you control. -TSP C, M10 C, GVL C, PVC C - -Tendrils of Despair -{B} -Sorcery -As an additional cost to cast Tendrils of Despair, sacrifice a creature. -Target opponent discards two cards. -WTH C - -Teneb, the Harvester -{3}{B}{G}{W} -Legendary Creature - Dragon -6/6 -Flying -Whenever Teneb, the Harvester deals combat damage to a player, you may pay {2}{B}. If you do, put target creature card from a graveyard onto the battlefield under your control. -PLC R, COM R - -Tenza, Godo's Maul -{3} -Legendary Artifact - Equipment -Equipped creature gets +1/+1. As long as it's legendary, it gets an additional +2/+2. As long as it's red, it has trample. -Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) -CHK U - -Tephraderm -{4}{R} -Creature - Beast -4/5 -Whenever a creature deals damage to Tephraderm, Tephraderm deals that much damage to that creature. -Whenever a spell deals damage to Tephraderm, Tephraderm deals that much damage to that spell's controller. -ONS R - -Terashi's Cry -{3}{W} -Sorcery - Arcane -Tap up to three target creatures. -CHK C - -Terashi's Grasp -{2}{W} -Sorcery - Arcane -Destroy target artifact or enchantment. You gain life equal to its converted mana cost. -BOK C - -Terashi's Verdict -{1}{W} -Instant - Arcane -Destroy target attacking creature with power 3 or less. -BOK U - -Terastodon -{6}{G}{G} -Creature - Elephant -9/9 -When Terastodon enters the battlefield, you may destroy up to three target noncreature permanents. For each permanent put into a graveyard this way, its controller puts a 3/3 green Elephant creature token onto the battlefield. -WWK R - -Teremko Griffin -{3}{W} -Creature - Griffin -2/2 -Flying; banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -MIR C - -Terminal Moraine -Land -{T}: Add {1} to your mana pool. -{2}, {T}, Sacrifice Terminal Moraine: Search your library for a basic land card and put that card onto the battlefield tapped. Then shuffle your library. -PLS U - -Terminate -{B}{R} -Instant -Destroy target creature. It can't be regenerated. -PLS C, ARB C, ARC C, COM C - -Teroh's Faithful -{3}{W} -Creature - Human Cleric -1/4 -When Teroh's Faithful enters the battlefield, you gain 4 life. -TOR C - -Teroh's Vanguard -{3}{W} -Creature - Human Nomad -2/3 -Flash -Threshold - As long as seven or more cards are in your graveyard, Teroh's Vanguard has "When Teroh's Vanguard enters the battlefield, creatures you control gain protection from black until end of turn." -TOR U - -Terra Eternal -{2}{W} -Enchantment -All lands are indestructible. -WWK R - -Terra Stomper -{3}{G}{G}{G} -Creature - Beast -8/8 -Terra Stomper can't be countered. -Trample -ZEN R - -Terraformer -{2}{U} -Creature - Human Wizard -2/2 -{1}: Choose a basic land type. Each land you control becomes that type until end of turn. -RAV C - -Terrain Generator -Land -{T}: Add {1} to your mana pool. -{2}, {T}: You may put a basic land card from your hand onto the battlefield tapped. -NEM U, JVC U - -Terramorphic Expanse -Land -{T}, Sacrifice Terramorphic Expanse: Search your library for a basic land card and put it onto the battlefield tapped. Then shuffle your library. -TSP C, 10E C, M10 C, HOP C, H09 C, PVC C, ARC C, M11 C, COM C - -Terrarion -{1} -Artifact -Terrarion enters the battlefield tapped. -{2}, {T}, Sacrifice Terrarion: Add two mana in any combination of colors to your mana pool. -When Terrarion is put into a graveyard from the battlefield, draw a card. -RAV C - -Terravore -{1}{G}{G} -Creature - Lhurgoyf -*/* -Trample -Terravore's power and toughness are each equal to the number of land cards in all graveyards. -ODY R - -Territorial Baloth -{4}{G} -Creature - Beast -4/4 -Landfall - Whenever a land enters the battlefield under your control, Territorial Baloth gets +2/+2 until end of turn. -ZEN C - -Territorial Dispute -{4}{R}{R} -Enchantment -At the beginning of your upkeep, sacrifice Territorial Dispute unless you sacrifice a land. -Players can't play lands. -MMQ R - -Terror -{1}{B} -Instant -Destroy target nonartifact, nonblack creature. It can't be regenerated. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, 6ED C, BRB C, S00 C, BTD C, MRD C, 10E C, ME4 C - -Test of Endurance -{2}{W}{W} -Enchantment -At the beginning of your upkeep, if you have 50 or more life, you win the game. -JUD R - -Test of Faith -{1}{W} -Instant -Prevent the next 3 damage that would be dealt to target creature this turn, and put a +1/+1 counter on that creature for each 1 damage prevented this way. -DST U, DDG U - -Testament of Faith -{W} -Enchantment -{X}: Testament of Faith becomes an X/X Wall creature with defender until end of turn. It's still an enchantment. -ODY U - -Tethered Griffin -{W} -Creature - Griffin -2/3 -Flying -When you control no enchantments, sacrifice Tethered Griffin. -UDS R - -Tethered Skirge -{2}{B} -Creature - Imp -2/2 -Flying -Whenever Tethered Skirge becomes the target of a spell or ability, you lose 1 life. -ULG U - -Tetravus -{6} -Artifact Creature - Construct -1/1 -Flying -Tetravus enters the battlefield with three +1/+1 counters on it. -At the beginning of your upkeep, you may remove any number of +1/+1 counters from Tetravus. If you do, put that many 1/1 colorless Tetravite artifact creature tokens onto the battlefield. They each have flying and "This creature can't be enchanted." -At the beginning of your upkeep, you may exile any number of tokens put onto the battlefield with Tetravus. If you do, put that many +1/+1 counters on Tetravus. -ATQ R, 4ED R, ME4 R - -Tetsuo Umezawa -{U}{B}{R} -Legendary Creature - Human Archer -3/3 -Tetsuo Umezawa can't be the target of Aura spells. -{U}{B}{B}{R}, {T}: Destroy target tapped or blocking creature. -LEG R, ME3 R - -Teysa, Orzhov Scion -{1}{W}{B} -Legendary Creature - Human Advisor -2/3 -Sacrifice three white creatures: Exile target creature. -Whenever another black creature you control dies, put a 1/1 white Spirit creature token with flying onto the battlefield. -GPT R - -Teysa, Orzhov Scion Avatar -Vanguard -Hand +0, life -2 -Whenever a nontoken creature dies, put a 1/1 white Spirit creature token with flying onto the battlefield. -VG S - -Tezzeret the Seeker -{3}{U}{U} -Planeswalker - Tezzeret -4 -[+1] Untap up to two target artifacts. --X: Search your library for an artifact card with converted mana cost X or less and put it onto the battlefield. Then shuffle your library. -[-5] Artifacts you control become 5/5 artifact creatures until end of turn. -ALA M, EVT M - -Tezzeret's Gambit -{3}{U/P} -Sorcery -({U/P} can be paid with either {U} or 2 life.) -Draw two cards, then proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.) -NPH U - -Tezzeret, Agent of Bolas -{2}{U}{B} -Planeswalker - Tezzeret -3 -[+1] Look at the top five cards of your library. You may reveal an artifact card from among them and put it into your hand. Put the rest on the bottom of your library in any order. -[-1] Target artifact becomes a 5/5 artifact creature. -[-4] Target player loses X life and you gain X life, where X is twice the number of artifacts you control. -MBS M - -Thada Adel, Acquisitor -{1}{U}{U} -Legendary Creature - Merfolk Rogue -2/2 -Islandwalk -Whenever Thada Adel, Acquisitor deals combat damage to a player, search that player's library for an artifact card and exile it. Then that player shuffles his or her library. Until end of turn, you may play that card. -WWK R - -Thalakos Deceiver -{3}{U} -Creature - Thalakos Wizard -1/1 -Shadow (This creature can block or be blocked by only creatures with shadow.) -Whenever Thalakos Deceiver attacks and isn't blocked, you may sacrifice it. If you do, gain control of target creature. (This effect lasts indefinitely.) -STH R - -Thalakos Dreamsower -{2}{U} -Creature - Thalakos Wizard -1/1 -Shadow (This creature can block or be blocked by only creatures with shadow.) -You may choose not to untap Thalakos Dreamsower during your untap step. -Whenever Thalakos Dreamsower deals damage to an opponent, tap target creature. That creature doesn't untap during its controller's untap step for as long as Thalakos Dreamsower remains tapped. -TMP U - -Thalakos Drifters -{2}{U}{U} -Creature - Thalakos -3/3 -Discard a card: Thalakos Drifters gains shadow until end of turn. (This creature can block or be blocked by only creatures with shadow.) -EXO R - -Thalakos Lowlands -Land -{T}: Add {1} to your mana pool. -{T}: Add {W} or {U} to your mana pool. Thalakos Lowlands doesn't untap during your next untap step. -TMP U, BRB U - -Thalakos Mistfolk -{2}{U} -Creature - Thalakos Illusion -2/1 -Shadow (This creature can block or be blocked by only creatures with shadow.) -{U}: Put Thalakos Mistfolk on top of its owner's library. -TMP C - -Thalakos Scout -{2}{U} -Creature - Thalakos Soldier Scout -2/1 -Shadow (This creature can block or be blocked by only creatures with shadow.) -Discard a card: Return Thalakos Scout to its owner's hand. -EXO C - -Thalakos Seer -{U}{U} -Creature - Thalakos Wizard -1/1 -Shadow (This creature can block or be blocked by only creatures with shadow.) -When Thalakos Seer leaves the battlefield, draw a card. -TMP C - -Thalakos Sentry -{1}{U} -Creature - Thalakos Soldier -1/2 -Shadow (This creature can block or be blocked by only creatures with shadow) -TMP C - -Thallid -{G} -Creature - Fungus -1/1 -At the beginning of your upkeep, put a spore counter on Thallid. -Remove three spore counters from Thallid: Put a 1/1 green Saproling creature token onto the battlefield. -FEM C (x4), TSB S, ME2 C - -Thallid Devourer -{1}{G}{G} -Creature - Fungus -2/2 -At the beginning of your upkeep, put a spore counter on Thallid Devourer. -Remove three spore counters from Thallid Devourer: Put a 1/1 green Saproling creature token onto the battlefield. -Sacrifice a Saproling: Thallid Devourer gets +1/+2 until end of turn. -FEM U, ME2 C - -Thallid Germinator -{2}{G} -Creature - Fungus -2/2 -At the beginning of your upkeep, put a spore counter on Thallid Germinator. -Remove three spore counters from Thallid Germinator: Put a 1/1 green Saproling creature token onto the battlefield. -Sacrifice a Saproling: Target creature gets +1/+1 until end of turn. -TSP C - -Thallid Shell-Dweller -{1}{G} -Creature - Fungus -0/5 -Defender -At the beginning of your upkeep, put a spore counter on Thallid Shell-Dweller. -Remove three spore counters from Thallid Shell-Dweller: Put a 1/1 green Saproling creature token onto the battlefield. -TSP C - -That Which Was Taken -{5} -Legendary Artifact -{4}, {T}: Put a divinity counter on target permanent other than That Which Was Taken. -Each permanent with a divinity counter on it is indestructible. -BOK R - -Thaumatog -{1}{G}{W} -Creature - Atog -1/2 -Sacrifice a land: Thaumatog gets +1/+1 until end of turn. -Sacrifice an enchantment: Thaumatog gets +1/+1 until end of turn. -ODY U - -Thawing Glaciers -Land -Thawing Glaciers enters the battlefield tapped. -{1}, {T}: Search your library for a basic land card, put that card onto the battlefield tapped, then shuffle your library. Return Thawing Glaciers to its owner's hand at the beginning of the next cleanup step. -ALL R, MED R - -The AEther Flues -Plane - Iquatana -When you planeswalk to The AEther Flues or at the beginning of your upkeep, you may sacrifice a creature. If you do, reveal cards from the top of your library until you reveal a creature card, put that card onto the battlefield, then shuffle all other cards revealed this way into your library. -Whenever you roll {C}, you may put a creature card from your hand onto the battlefield. -HOP C - -The Abyss -{3}{B} -World Enchantment -At the beginning of each player's upkeep, destroy target nonartifact creature that player controls of his or her choice. It can't be regenerated. -LEG R, ME3 R - -The Brute -{1}{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+0. -{R}{R}{R}: Regenerate enchanted creature. -LEG C, 4ED C, 5ED C - -The Dark Barony -Plane - Ulgrotha -Whenever a nonblack card is put into a player's graveyard from anywhere, that player loses 1 life. -Whenever you roll {C}, each opponent discards a card. -HOP C - -The Dead Shall Serve -Scheme -When you set this scheme in motion, for each opponent, put up to one target creature card from that player's graveyard onto the battlefield under your control. Each of those creatures attacks its owner each combat if able. -ARC C - -The Eon Fog -Plane - Equilor -Players skip their untap steps. -Whenever you roll {C}, untap all permanents you control. -HOP C - -The Fallen -{1}{B}{B}{B} -Creature - Zombie -2/3 -At the beginning of your upkeep, The Fallen deals 1 damage to each opponent it has dealt damage to this game. -DRK U, CHR U, MED U - -The Fate of the Flammable -Scheme -When you set this scheme in motion, target opponent chooses self or others. If that player chooses self, this scheme deals 6 damage to him or her. If the player chooses others, this scheme deals 3 damage to each of your other opponents. -ARC C - -The Fourth Sphere -Plane - Phyrexia -At the beginning of your upkeep, sacrifice a nonblack creature. -Whenever you roll {C}, put a 2/2 black Zombie creature token onto the battlefield. -HOP C - -The Great Forest -Plane - Lorwyn -Each creature assigns combat damage equal to its toughness rather than its power. -Whenever you roll {C}, creatures you control get +0/+2 and gain trample until end of turn. -HOP C - -The Hippodrome -Plane - Segovia -All creatures get -5/-0. -Whenever you roll {C}, you may destroy target creature if its power is 0 or less. -HOP C - -The Hive -{5} -Artifact -{5}, {T}: Put a 1/1 colorless Insect artifact creature token with flying named Wasp onto the battlefield. (It can't be blocked except by creatures with flying or reach.) -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, 6ED R, 10E R - -The Iron Guardian Stirs -Scheme -When you set this scheme in motion, put a 4/6 colorless Golem artifact creature token onto the battlefield. -ARC C - -The Lady of the Mountain -{4}{R}{G} -Legendary Creature - Giant -5/5 -LEG U, ME3 C - -The Maelstrom -Plane - Alara -When you planeswalk to The Maelstrom or at the beginning of your upkeep, you may reveal the top card of your library. If it's a permanent card, you may put it onto the battlefield. If you revealed a card but didn't put it onto the battlefield, put it on the bottom of your library. -Whenever you roll {C}, return target permanent card from your graveyard to the battlefield. -HOP C - -The Mimeoplasm -{2}{G}{U}{B} -Legendary Creature - Ooze -0/0 -As The Mimeoplasm enters the battlefield, you may exile two creature cards from graveyards. If you do, it enters the battlefield as a copy of one of those cards with a number of additional +1/+1 counters on it equal to the power of the other card. -COM M - -The Pieces Are Coming Together -Scheme -When you set this scheme in motion, draw two cards. Artifact spells you cast this turn cost {2} less to cast. -ARC C - -The Rack -{1} -Artifact -As The Rack enters the battlefield, choose an opponent. -At the beginning of the chosen player's upkeep, The Rack deals X damage to that player, where X is 3 minus the number of cards in his or her hand. -ATQ U, 3ED U, 4ED U, TSB S - -The Tabernacle at Pendrell Vale -Legendary Land -All creatures have "At the beginning of your upkeep, destroy this creature unless you pay {1}." -LEG R, ME3 R - -The Unspeakable -{6}{U}{U}{U} -Legendary Creature - Spirit -6/7 -Flying, trample -Whenever The Unspeakable deals combat damage to a player, you may return target Arcane card from your graveyard to your hand. -CHK R - -The Very Soil Shall Shake -Ongoing Scheme -(An ongoing scheme remains face up until it's abandoned.) -Creatures you control get +2/+2 and have trample. -When a creature you control dies, abandon this scheme. -ARC C - -The Wretched -{3}{B}{B} -Creature - Demon -2/5 -At end of combat, gain control of all creatures blocking The Wretched for as long as you control The Wretched. -LEG R, CHR R, 5ED R, ME3 U - -Theft of Dreams -{2}{U} -Sorcery -Draw a card for each tapped creature target opponent controls. -POR U, P02 U, EXO C, ME4 U - -Thelon of Havenwood -{G}{G} -Legendary Creature - Elf Druid -2/2 -Each Fungus creature gets +1/+1 for each spore counter on it. -{B}{G}, Exile a Fungus card from a graveyard: Put a spore counter on each Fungus on the battlefield. -TSP R - -Thelon's Chant -{1}{G}{G} -Enchantment -At the beginning of your upkeep, sacrifice Thelon's Chant unless you pay {G}. -Whenever a player puts a Swamp onto the battlefield, Thelon's Chant deals 3 damage to that player unless he or she puts a -1/-1 counter on a creature he or she controls. -FEM U - -Thelon's Curse -{G}{G} -Enchantment -Blue creatures don't untap during their controllers' untap steps. -At the beginning of each player's upkeep, that player may choose any number of tapped blue creatures he or she controls and pay {U} for each creature chosen this way. If the player does, untap those creatures. -FEM R - -Thelonite Druid -{2}{G} -Creature - Human Cleric Druid -1/1 -{1}{G}, {T}, Sacrifice a creature: Forests you control become 2/3 creatures until end of turn. They're still lands. -FEM U, ME2 R - -Thelonite Hermit -{3}{G} -Creature - Elf Shaman -1/1 -Saproling creatures get +1/+1. -Morph {3}{G}{G} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Thelonite Hermit is turned face up, put four 1/1 green Saproling creature tokens onto the battlefield. -TSP R, ARC R - -Thelonite Monk -{2}{G}{G} -Creature - Insect Monk Cleric -1/2 -{T}, Sacrifice a green creature: Target land becomes a Forest. (This effect lasts indefinitely.) -FEM R - -Thermal Blast -{4}{R} -Instant -Thermal Blast deals 3 damage to target creature. -Threshold - Thermal Blast deals 5 damage to that creature instead if seven or more cards are in your graveyard. -ODY C - -Thermal Flux -{U} -Instant -Choose one - Target nonsnow permanent becomes snow until end of turn; or target snow permanent isn't snow until end of turn. -Draw a card at the beginning of the next turn's upkeep. -CSP C - -Thermal Glider -{2}{W} -Creature - Human Rebel -2/1 -Flying, protection from red -MMQ C - -Thermal Navigator -{3} -Artifact Creature - Construct -2/2 -Sacrifice an artifact: Thermal Navigator gains flying until end of turn. -5DN C - -Thermokarst -{1}{G}{G} -Sorcery -Destroy target land. If that land was a snow land, you gain 1 life. -ICE U, ME2 C - -Thermopod -{4}{R} -Snow Creature - Slug -4/3 -{S}: Thermopod gains haste until end of turn. ({S} can be paid with one mana from a snow permanent.) -Sacrifice a creature: Add {R} to your mana pool. -CSP C - -Thick-Skinned Goblin -{1}{R} -Creature - Goblin Shaman -2/1 -You may pay {0} rather than pay the echo cost for permanents you control. -{R}: Thick-Skinned Goblin gains protection from red until end of turn. -TSP U - -Thicket Basilisk -{3}{G}{G} -Creature - Basilisk -2/4 -Whenever Thicket Basilisk blocks or becomes blocked by a non-Wall creature, destroy that creature at end of combat. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, 6ED U, MED U - -Thicket Elemental -{3}{G}{G} -Creature - Elemental -4/4 -Kicker {1}{G} (You may pay an additional {1}{G} as you cast this spell.) -When Thicket Elemental enters the battlefield, if it was kicked, you may reveal cards from the top of your library until you reveal a creature card. If you do, put that card onto the battlefield and shuffle all other cards revealed this way into your library. -INV R - -Thief of Hope -{2}{B} -Creature - Spirit -2/2 -Whenever you cast a Spirit or Arcane spell, target opponent loses 1 life and you gain 1 life. -Soulshift 2 (When this creature dies, you may return target Spirit card with converted mana cost 2 or less from your graveyard to your hand.) -CHK U - -Thieves' Auction -{4}{R}{R}{R} -Sorcery -Exile all nontoken permanents. Starting with you, each player chooses one of the exiled cards and puts it onto the battlefield tapped under his or her control. Repeat this process until all cards exiled this way have been chosen. -MMQ R, 8ED R - -Thieves' Fortune -{2}{U} -Tribal Instant - Rogue -Prowl {U} (You may cast this for its prowl cost if you dealt combat damage to a player this turn with a Rogue.) -Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order. -MOR U - -Thieving Magpie -{2}{U}{U} -Creature - Bird -1/3 -Flying (This creature can't be blocked except by creatures with flying or reach.) -Whenever Thieving Magpie deals damage to an opponent, draw a card. -UDS U, 7ED U, 8ED U, 9ED U, 10E U - -Thieving Sprite -{2}{B} -Creature - Faerie Rogue -1/1 -Flying -When Thieving Sprite enters the battlefield, target player reveals X cards from his or her hand, where X is the number of Faeries you control. You choose one of those cards. That player discards that card. -LRW C - -Thing from the Deep -{6}{U}{U}{U} -Creature - Leviathan -9/9 -Whenever Thing from the Deep attacks, sacrifice it unless you sacrifice an Island. -POR R, ME4 R - -Think Tank -{2}{U} -Enchantment -At the beginning of your upkeep, look at the top card of your library. You may put that card into your graveyard. -ODY U - -Think Twice -{1}{U} -Instant -Draw a card. -Flashback {2}{U} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -TSP C - -Thirst -{2}{U} -Enchantment - Aura -Enchant creature -When Thirst enters the battlefield, tap enchanted creature. -Enchanted creature doesn't untap during its controller's untap step. -At the beginning of your upkeep, sacrifice Thirst unless you pay {U}. -MIR C - -Thirst for Knowledge -{2}{U} -Instant -Draw three cards. Then discard two cards unless you discard an artifact card. -MRD U, HOP U, EVT U - -Thistledown Duo -{2}{W/U} -Creature - Kithkin Soldier Wizard -2/2 -Whenever you cast a white spell, Thistledown Duo gets +1/+1 until end of turn. -Whenever you cast a blue spell, Thistledown Duo gains flying until end of turn. -SHM C - -Thistledown Liege -{1}{W/U}{W/U}{W/U} -Creature - Kithkin Knight -1/3 -Flash -Other white creatures you control get +1/+1. -Other blue creatures you control get +1/+1. -SHM R - -Thopter Assembly -{6} -Artifact Creature - Thopter -5/5 -Flying -At the beginning of your upkeep, if you control no Thopters other than Thopter Assembly, return Thopter Assembly to its owner's hand and put five 1/1 colorless Thopter artifact creature tokens with flying onto the battlefield. -MBS R - -Thopter Foundry -{W/B}{U} -Artifact -{1}, Sacrifice a nontoken artifact: Put a 1/1 blue Thopter artifact creature token with flying onto the battlefield. You gain 1 life. -ARB U - -Thopter Squadron -{5} -Artifact Creature - Thopter -0/0 -Flying -Thopter Squadron enters the battlefield with three +1/+1 counters on it. -{1}, Remove a +1/+1 counter from Thopter Squadron: Put a 1/1 colorless Thopter artifact creature token with flying onto the battlefield. Activate this ability only any time you could cast a sorcery. -{1}, Sacrifice another Thopter: Put a +1/+1 counter on Thopter Squadron. Activate this ability only any time you could cast a sorcery. -EXO R - -Thorn Elemental -{5}{G}{G} -Creature - Elemental -7/7 -You may have Thorn Elemental assign its combat damage as though it weren't blocked. -UDS R, S99 R, 7ED R, 8ED R - -Thorn Thallid -{1}{G}{G} -Creature - Fungus -2/2 -At the beginning of your upkeep, put a spore counter on Thorn Thallid. -Remove three spore counters from Thorn Thallid: Thorn Thallid deals 1 damage to target creature or player. -FEM C (x4), MED C - -Thorn of Amethyst -{2} -Artifact -Noncreature spells cost {1} more to cast. -LRW R - -Thorn-Thrash Viashino -{3}{R} -Creature - Viashino Warrior -2/2 -Devour 2 (As this enters the battlefield, you may sacrifice any number of creatures. This creature enters the battlefield with twice that many +1/+1 counters on it.) -{G}: Thorn-Thrash Viashino gains trample until end of turn. -ALA C - -Thornbite Staff -{2} -Tribal Artifact - Shaman Equipment -Equipped creature has "{2}, {T}: This creature deals 1 damage to target creature or player" and "Whenever a creature dies, untap this creature." -Whenever a Shaman creature enters the battlefield, you may attach Thornbite Staff to it. -Equip {4} -MOR U - -Thornling -{3}{G}{G} -Creature - Elemental Shapeshifter -4/4 -{G}: Thornling gains haste until end of turn. -{G}: Thornling gains trample until end of turn. -{G}: Thornling is indestructible this turn. -{1}: Thornling gets +1/-1 until end of turn. -{1}: Thornling gets -1/+1 until end of turn. -CON M - -Thornscape Apprentice -{G} -Creature - Human Wizard -1/1 -{W}, {T}: Tap target creature. -{R}, {T}: Target creature gains first strike until end of turn. -INV C, PVC C - -Thornscape Battlemage -{2}{G} -Creature - Elf Wizard -2/2 -Kicker {R} and/or {W} (You may pay an additional {R} and/or {W} as you cast this spell.) -When Thornscape Battlemage enters the battlefield, if it was kicked with its {R} kicker, it deals 2 damage to target creature or player. -When Thornscape Battlemage enters the battlefield, if it was kicked with its {W} kicker, destroy target artifact. -PLS U, TSB S, PVC U - -Thornscape Familiar -{1}{G} -Creature - Insect -2/1 -Red spells and white spells you cast cost {1} less to cast. -PLS C - -Thornscape Master -{2}{G}{G} -Creature - Human Wizard -2/2 -{R}{R}, {T}: Thornscape Master deals 2 damage to target creature. -{W}{W}, {T}: Target creature gains protection from the color of your choice until end of turn. -INV R - -Thorntooth Witch -{5}{B} -Creature - Treefolk Shaman -3/4 -Whenever you cast a Treefolk spell, you may have target creature get +3/-3 until end of turn. -LRW U - -Thornwatch Scarecrow -{6} -Artifact Creature - Scarecrow -4/4 -Thornwatch Scarecrow has wither as long as you control a green creature. (It deals damage to creatures in the form of -1/-1 counters.) -Thornwatch Scarecrow has vigilance as long as you control a white creature. -SHM C - -Thornweald Archer -{1}{G} -Creature - Elf Archer -2/1 -Reach (This creature can block creatures with flying.) -Deathtouch (Any amount of damage this deals to a creature is enough to destroy it.) -FUT C - -Thornwind Faeries -{1}{U}{U} -Creature - Faerie -1/1 -Flying -{T}: Thornwind Faeries deals 1 damage to target creature or player. -ULG C - -Thought Courier -{1}{U} -Creature - Human Wizard -1/1 -{T}: Draw a card, then discard a card. -5DN C, 9ED U - -Thought Devourer -{2}{U}{U} -Creature - Beast -4/4 -Flying -Your maximum hand size is reduced by four. -ODY R - -Thought Dissector -{4} -Artifact -{X}, {T}: Target opponent reveals cards from the top of his or her library until an artifact card or X cards are revealed, whichever comes first. If an artifact card is revealed this way, put it onto the battlefield under your control and sacrifice Thought Dissector. Put the rest of the revealed cards into that player's graveyard. -DST R - -Thought Eater -{1}{U} -Creature - Beast -2/2 -Flying -Your maximum hand size is reduced by three. -ODY U - -Thought Gorger -{2}{B}{B} -Creature - Horror -2/2 -Trample -When Thought Gorger enters the battlefield, put a +1/+1 counter on it for each card in your hand. If you do, discard your hand. -When Thought Gorger leaves the battlefield, draw a card for each +1/+1 counter on it. -ROE R - -Thought Hemorrhage -{2}{B}{R} -Sorcery -Name a nonland card. Target player reveals his or her hand. Thought Hemorrhage deals 3 damage to that player for each card with that name revealed this way. Search that player's graveyard, hand, and library for all cards with that name and exile them. Then that player shuffles his or her library. -ARB R - -Thought Lash -{2}{U}{U} -Enchantment -Cumulative upkeep-Exile the top card of your library. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -When Thought Lash's cumulative upkeep isn't paid, exile all cards from your library. -Exile the top card of your library: Prevent the next 1 damage that would be dealt to you this turn. -ALL R, ME2 R - -Thought Nibbler -{U} -Creature - Beast -1/1 -Flying -Your maximum hand size is reduced by two. -ODY C - -Thought Prison -{5} -Artifact -Imprint - When Thought Prison enters the battlefield, you may have target player reveal his or her hand. If you do, choose a nonland card from it and exile that card. -Whenever a player casts a spell that shares a color or converted mana cost with the exiled card, Thought Prison deals 2 damage to that player. -MRD U - -Thought Reflection -{4}{U}{U}{U} -Enchantment -If you would draw a card, draw two cards instead. -SHM R - -Thoughtbind -{2}{U} -Instant -Counter target spell with converted mana cost 4 or less. -CHK C - -Thoughtbound Primoc -{2}{R} -Creature - Bird Beast -2/3 -Flying -At the beginning of your upkeep, if a player controls more Wizards than each other player, the player who controls the most Wizards gains control of Thoughtbound Primoc. -ONS U - -Thoughtcast -{4}{U} -Sorcery -Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -Draw two cards. -MRD C, EVT C - -Thoughtcutter Agent -{U}{B} -Artifact Creature - Human Rogue -1/1 -{U}{B}, {T}: Target player loses 1 life and reveals his or her hand. -ALA U - -Thoughtlace -{U} -Instant -Target spell or permanent becomes blue. (Mana symbols on that permanent remain unchanged.) -LEA R, LEB R, 2ED R, 3ED R, 4ED R - -Thoughtleech -{G}{G} -Enchantment -Whenever an Island an opponent controls becomes tapped, you may gain 1 life. -ICE U, 7ED U - -Thoughtpicker Witch -{B} -Creature - Human Wizard -1/1 -{1}, Sacrifice a creature: Look at the top two cards of target opponent's library, then exile one of them. -RAV C - -Thoughts of Ruin -{2}{R}{R} -Sorcery -Each player sacrifices a land for each card in your hand. -SOK R - -Thoughtseize -{B} -Sorcery -Target player reveals his or her hand. You choose a nonland card from it. That player discards that card. You lose 2 life. -LRW R - -Thoughtweft Gambit -{4}{W/U}{W/U} -Instant -Tap all creatures your opponents control and untap all creatures you control. -SHM U - -Thoughtweft Trio -{2}{W}{W} -Creature - Kithkin Soldier -5/5 -First strike, vigilance -Champion a Kithkin (When this enters the battlefield, sacrifice it unless you exile another Kithkin you control. When this leaves the battlefield, that card returns to the battlefield.) -Thoughtweft Trio can block any number of creatures. -LRW R - -Thousand-Year Elixir -{3} -Artifact -You may activate abilities of creatures you control as though those creatures had haste. -{1}, {T}: Untap target creature. -LRW R - -Thousand-legged Kami -{6}{G}{G} -Creature - Spirit -6/6 -Soulshift 7 (When this creature dies, you may return target Spirit card with converted mana cost 7 or less from your graveyard to your hand.) -CHK U - -Thran Dynamo -{4} -Artifact -{T}: Add {3} to your mana pool. -UDS U, ARC U - -Thran Forge -{3} -Artifact -{2}: Until end of turn, target nonartifact creature gets +1/+0 and becomes an artifact in addition to its other types. -WTH U - -Thran Foundry -{1} -Artifact -{1}, {T}, Exile Thran Foundry: Target player shuffles his or her graveyard into his or her library. -UDS U - -Thran Golem -{5} -Artifact Creature - Golem -3/3 -As long as Thran Golem is enchanted, it gets +2/+2 and has flying, first strike, and trample. -UDS R, 9ED R, M12 U - -Thran Lens -{2} -Artifact -All permanents are colorless. -ULG R - -Thran Quarry -Land -At the beginning of the end step, if you control no creatures, sacrifice Thran Quarry. -{T}: Add one mana of any color to your mana pool. -USG R - -Thran Tome -{4} -Artifact -{5}, {T}: Reveal the top three cards of your library. Target opponent chooses one of those cards. Put that card into your graveyard, then draw two cards. -WTH R - -Thran Turbine -{1} -Artifact -At the beginning of your upkeep, you may add {1} or {2} to your mana pool. You can't spend this mana to cast spells. -USG U - -Thran War Machine -{4} -Artifact Creature - Construct -4/5 -Echo {4} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -Thran War Machine attacks each turn if able. -ULG U - -Thran Weaponry -{4} -Artifact -Echo {4} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -You may choose not to untap Thran Weaponry during your untap step. -{2}, {T}: All creatures get +2/+2 for as long as Thran Weaponry remains tapped. -ULG R - -Thrashing Mudspawn -{3}{B}{B} -Creature - Beast -4/4 -Whenever Thrashing Mudspawn is dealt damage, you lose that much life. -Morph {1}{B}{B} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS U - -Thrashing Wumpus -{3}{B}{B} -Creature - Beast -3/3 -{B}: Thrashing Wumpus deals 1 damage to each creature and each player. -MMQ R - -Thraximundar -{4}{U}{B}{R} -Legendary Creature - Zombie Assassin -6/6 -Haste -Whenever Thraximundar attacks, defending player sacrifices a creature. -Whenever a player sacrifices a creature, you may put a +1/+1 counter on Thraximundar. -ARB M - -Threads of Disloyalty -{1}{U}{U} -Enchantment - Aura -Enchant creature with converted mana cost 2 or less -You control enchanted creature. -BOK R - -Threaten -{2}{R} -Sorcery -Untap target creature and gain control of it until end of turn. That creature gains haste until end of turn. (It can attack and {T} this turn.) -ONS U, 9ED U, 10E U - -Three Dreams -{4}{W} -Sorcery -Search your library for up to three Aura cards with different names, reveal them, and put them into your hand. Then shuffle your library. -RAV R - -Three Tragedies -{3}{B}{B} -Sorcery - Arcane -Target player discards three cards. -BOK U - -Three Visits -{1}{G} -Sorcery -Search your library for a Forest card and put that card onto the battlefield. Then shuffle your library. -PTK C, ME3 C - -Three Wishes -{1}{U}{U} -Instant -Exile the top three cards of your library face down. You may look at those cards for as long as they remain exiled. Until your next turn, you may play those cards. At the beginning of your next upkeep, put any of those cards you didn't play into your graveyard. -VIS R - -Thresher Beast -{3}{G}{G} -Creature - Beast -4/4 -Whenever Thresher Beast becomes blocked, defending player sacrifices a land. -PCY C - -Thrill of the Hunt -{G} -Instant -Target creature gets +1/+2 until end of turn. -Flashback {W} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -TSP C - -Thriss, Nantuko Primus -{5}{G}{G} -Legendary Creature - Insect Druid -5/5 -{G}, {T}: Target creature gets +5/+5 until end of turn. -JUD R - -Thrive -{X}{G} -Sorcery -Put a +1/+1 counter on each of X target creatures. -PCY C, DIS C - -Throat Slitter -{4}{B} -Creature - Rat Ninja -2/2 -Ninjutsu {2}{B} ({2}{B}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -Whenever Throat Slitter deals combat damage to a player, destroy target nonblack creature that player controls. -BOK U - -Throne of Bone -{1} -Artifact -Whenever a player casts a black spell, you may pay {1}. If you do, you gain 1 life. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, 6ED U, 7ED U, 8ED U - -Throne of Empires -{4} -Artifact -{1}, {T}: Put a 1/1 white Soldier creature token onto the battlefield. Put five of those tokens onto the battlefield instead if you control artifacts named Crown of Empires and Scepter of Empires. -M12 R - -Throne of Geth -{2} -Artifact -{T}, Sacrifice an artifact: Proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.) -SOM U - -Through the Breach -{4}{R} -Instant - Arcane -You may put a creature card from your hand onto the battlefield. That creature gains haste. Sacrifice that creature at the beginning of the next end step. -Splice onto Arcane {2}{R}{R} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -CHK R - -Thrull Champion -{4}{B} -Creature - Thrull -2/2 -Thrull creatures get +1/+1. -{T}: Gain control of target Thrull for as long as you control Thrull Champion. -FEM R, MED R - -Thrull Retainer -{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+1. -Sacrifice Thrull Retainer: Regenerate enchanted creature. -FEM U, 5ED U, MED C - -Thrull Surgeon -{1}{B} -Creature - Thrull -1/1 -{1}{B}, Sacrifice Thrull Surgeon: Look at target player's hand and choose a card from it. That player discards that card. Activate this ability only any time you could cast a sorcery. -EXO C, 10E U - -Thrull Wizard -{2}{B} -Creature - Thrull Wizard -1/1 -{1}{B}: Counter target black spell unless that spell's controller pays {B} or {3}. -FEM U - -Thrumming Stone -{5} -Legendary Artifact -Spells you cast have ripple 4. (Whenever you cast a spell, you may reveal the top four cards of your library. You may cast any revealed cards with the same name as the spell without paying their mana costs. Put the rest on the bottom of your library.) -CSP R - -Thrummingbird -{1}{U} -Creature - Bird Horror -1/1 -Flying -Whenever Thrummingbird deals combat damage to a player, proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.) -SOM U - -Thrun, the Last Troll -{2}{G}{G} -Legendary Creature - Troll Shaman -4/4 -Thrun, the Last Troll can't be countered. -Hexproof (This creature can't be the target of spells or abilities your opponents control.) -{1}{G}: Regenerate Thrun. -MBS M - -Thumbscrews -{2} -Artifact -At the beginning of your upkeep, if you have five or more cards in hand, Thumbscrews deals 1 damage to target opponent. -TMP R - -Thunder Dragon -{5}{R}{R} -Creature - Dragon -5/5 -Flying -When Thunder Dragon enters the battlefield, it deals 3 damage to each creature without flying. -S99 R, FVD R, ME4 R, DDG R - -Thunder Spirit -{1}{W}{W} -Creature - Elemental Spirit -2/2 -Flying, first strike -LEG R, MED U - -Thunder Strike -{1}{R} -Instant -Target creature gets +2/+0 and gains first strike until end of turn. (It deals combat damage before creatures without first strike.) -M11 C - -Thunder Totem -{3} -Artifact -{T}: Add {W} to your mana pool. -{1}{W}{W}: Thunder Totem becomes a 2/2 white Spirit artifact creature with flying and first strike until end of turn. -TSP U - -Thunder Wall -{1}{U}{U} -Creature - Wall -0/2 -Defender (This creature can't attack.) -Flying -{U}: Thunder Wall gets +1/+1 until end of turn. -ICE U, ME2 U - -Thunder of Hooves -{3}{R} -Sorcery -Thunder of Hooves deals X damage to each creature without flying and each player, where X is the number of Beasts on the battlefield. -ONS U - -Thunder-Thrash Elder -{2}{R} -Creature - Viashino Warrior -1/1 -Devour 3 (As this enters the battlefield, you may sacrifice any number of creatures. This creature enters the battlefield with three times that many +1/+1 counters on it.) -ALA U - -Thunderblade Charge -{1}{R}{R} -Sorcery -Thunderblade Charge deals 3 damage to target creature or player. -Whenever one or more creatures you control deal combat damage to a player, if Thunderblade Charge is in your graveyard, you may pay {2}{R}{R}{R}. If you do, you may cast it without paying its mana cost. -FUT R - -Thunderblust -{2}{R}{R}{R} -Creature - Elemental -7/2 -Haste -Thunderblust has trample as long as it has a -1/-1 counter on it. -Persist (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) -EVE R - -Thunderbolt -{1}{R} -Instant -Choose one - Thunderbolt deals 3 damage to target player; or Thunderbolt deals 4 damage to target creature with flying. -WTH C, BTD C, H10 C - -Thunderclap -{2}{R} -Instant -You may sacrifice a Mountain rather than pay Thunderclap's mana cost. -Thunderclap deals 3 damage to target creature. -MMQ C - -Thundercloud Elemental -{5}{U}{U} -Creature - Elemental -3/4 -Flying -{3}{U}: Tap all creatures with toughness 2 or less. -{3}{U}: All other creatures lose flying until end of turn. -SCG U - -Thundercloud Shaman -{3}{R}{R} -Creature - Giant Shaman -4/4 -When Thundercloud Shaman enters the battlefield, it deals damage equal to the number of Giants you control to each non-Giant creature. -LRW U - -Thunderheads -{2}{U} -Instant -Replicate {2}{U} (When you cast this spell, copy it for each time you paid its replicate cost.) -Put a 3/3 blue Weird creature token with defender and flying onto the battlefield. Exile it at the beginning of the next end step. -GPT U - -Thundering Giant -{3}{R}{R} -Creature - Giant -4/3 -Haste (This creature can attack and {T} as soon as it comes under your control.) -USG U, BTD U, 10E U - -Thundering Tanadon -{4}{G/P}{G/P} -Artifact Creature - Beast -5/4 -({G/P} can be paid with either {G} or 2 life.) -Trample -NPH C - -Thundering Wurm -{2}{G} -Creature - Wurm -4/4 -When Thundering Wurm enters the battlefield, sacrifice it unless you discard a land card. -POR R - -Thundermare -{5}{R} -Creature - Elemental Horse -5/5 -Haste (This creature can attack the turn it comes under your control.) -When Thundermare enters the battlefield, tap all other creatures. -POR R, WTH R, 9ED R - -Thunderscape Apprentice -{R} -Creature - Human Wizard -1/1 -{B}, {T}: Target player loses 1 life. -{G}, {T}: Target creature gets +1/+1 until end of turn. -INV C - -Thunderscape Battlemage -{2}{R} -Creature - Human Wizard -2/2 -Kicker {1}{B} and/or {G} (You may pay an additional {1}{B} and/or {G} as you cast this spell.) -When Thunderscape Battlemage enters the battlefield, if it was kicked with its {1}{B} kicker, target player discards two cards. -When Thunderscape Battlemage enters the battlefield, if it was kicked with its {G} kicker, destroy target enchantment. -PLS U, PVC U - -Thunderscape Familiar -{1}{R} -Creature - Kavu -1/1 -First strike -Black spells and green spells you cast cost {1} less to cast. -PLS C - -Thunderscape Master -{2}{R}{R} -Creature - Human Wizard -2/2 -{B}{B}, {T}: Target player loses 2 life and you gain 2 life. -{G}{G}, {T}: Creatures you control get +2/+2 until end of turn. -INV R - -Thundersong Trumpeter -{R}{W} -Creature - Human Soldier -2/1 -{T}: Target creature can't attack or block this turn. -RAV C - -Thunderstaff -{3} -Artifact -As long as Thunderstaff is untapped, if a creature would deal combat damage to you, prevent 1 of that damage. -{2}, {T}: Attacking creatures get +1/+0 until end of turn. -DST U, ARC U - -Thwart -{2}{U}{U} -Instant -You may return three Islands you control to their owner's hand rather than pay Thwart's mana cost. -Counter target spell. -MMQ U - -Tibor and Lumia -{2}{U}{R} -Legendary Creature - Human Wizard -3/3 -Whenever you cast a blue spell, target creature gains flying until end of turn. -Whenever you cast a red spell, Tibor and Lumia deals 1 damage to each creature without flying. -GPT R - -Ticking Gnomes -{3} -Artifact Creature - Gnome -3/3 -Echo {3} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -Sacrifice Ticking Gnomes: Ticking Gnomes deals 1 damage to target creature or player. -ULG U - -Tidal Bore -{1}{U} -Instant -You may return an Island you control to its owner's hand rather than pay Tidal Bore's mana cost. -You may tap or untap target creature. -MMQ C - -Tidal Control -{1}{U}{U} -Enchantment -Cumulative upkeep {2} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -Pay 2 life or {2}: Counter target red or green spell. Any player may activate this ability. -ALL R - -Tidal Courier -{3}{U} -Creature - Merfolk -1/2 -When Tidal Courier enters the battlefield, reveal the top four cards of your library. Put all Merfolk cards revealed this way into your hand and the rest on the bottom of your library in any order. -{3}{U}: Tidal Courier gains flying until end of turn. -APC U - -Tidal Flats -{U} -Enchantment -{U}{U}: For each attacking creature without flying, its controller may pay {1}. If he or she doesn't, creatures you control blocking that creature gain first strike until end of turn. -FEM C (x3) - -Tidal Influence -{2}{U} -Enchantment -Cast Tidal Influence only if no permanents named Tidal Influence are on the battlefield. -Tidal Influence enters the battlefield with a tide counter on it. -At the beginning of your upkeep, put a tide counter on Tidal Influence. -As long as there is exactly one tide counter on Tidal Influence, all blue creatures get -2/-0. -As long as there are exactly three tide counters on Tidal Influence, all blue creatures get +2/+0. -Whenever there are four tide counters on Tidal Influence, remove all tide counters from it. -FEM U - -Tidal Kraken -{5}{U}{U}{U} -Creature - Kraken -6/6 -Tidal Kraken is unblockable. -MMQ R, 8ED R, 9ED R - -Tidal Surge -{1}{U} -Sorcery -Tap up to three target creatures without flying. -POR C, STH C, P02 C, 6ED C - -Tidal Visionary -{U} -Creature - Merfolk Wizard -1/1 -{T}: Target creature becomes the color of your choice until end of turn. -INV C - -Tidal Warrior -{U} -Creature - Merfolk Warrior -1/1 -{T}: Target land becomes an Island until end of turn. -STH C - -Tidal Wave -{2}{U} -Instant -Put a 5/5 blue Wall creature token with defender onto the battlefield. Sacrifice it at the beginning of the next end step. -MIR U - -Tide of War -{4}{R}{R} -Enchantment -Whenever one or more creatures block, flip a coin. If you win the flip, each blocking creature is sacrificed by its controller. If you lose the flip, each blocked creature is sacrificed by its controller. -CHK R - -Tideforce Elemental -{2}{U} -Creature - Elemental -2/1 -{U}, {T}: You may tap or untap another target creature. -Landfall - Whenever a land enters the battlefield under your control, you may untap Tideforce Elemental. -WWK U - -Tidehollow Sculler -{W}{B} -Artifact Creature - Zombie -2/2 -When Tidehollow Sculler enters the battlefield, target opponent reveals his or her hand and you choose a nonland card from it. Exile that card. -When Tidehollow Sculler leaves the battlefield, return the exiled card to its owner's hand. -ALA U - -Tidehollow Strix -{U}{B} -Artifact Creature - Bird -2/1 -Flying -Deathtouch (Any amount of damage this deals to a creature is enough to destroy it.) -ALA C - -Tideshaper Mystic -{U} -Creature - Merfolk Wizard -1/1 -{T}: Target land becomes the basic land type of your choice until end of turn. Activate this ability only during your turn. -LRW C - -Tidespout Tyrant -{5}{U}{U}{U} -Creature - Djinn -5/5 -Flying -Whenever you cast a spell, return target permanent to its owner's hand. -DIS R - -Tidewalker -{2}{U} -Creature - Elemental -*/* -Tidewalker enters the battlefield with a time counter on it for each Island you control. -Vanishing (At the beginning of your upkeep, remove a time counter from this permanent. When the last is removed, sacrifice it.) -Tidewalker's power and toughness are each equal to the number of time counters on it. -PLC U - -Tidewater Minion -{3}{U}{U} -Creature - Elemental Minion -4/4 -Defender (This creature can't attack.) -{4}: Tidewater Minion loses defender until end of turn. -{T}: Untap target permanent. -RAV C - -Tidings -{3}{U}{U} -Sorcery -Draw four cards. -S99 U, 9ED U, 10E U - -Tiger Claws -{2}{G} -Enchantment - Aura -Flash -Enchant creature -Enchanted creature gets +1/+1 and has trample. -MMQ C - -Tigereye Cameo -{3} -Artifact -{T}: Add {G} or {W} to your mana pool. -INV U - -Tilling Treefolk -{2}{G} -Creature - Treefolk Druid -1/3 -When Tilling Treefolk enters the battlefield, you may return up to two target land cards from your graveyard to your hand. -EVE C - -Timber Protector -{4}{G} -Creature - Treefolk Warrior -4/6 -Other Treefolk creatures you control get +1/+1. -Other Treefolk and Forests you control are indestructible. -LRW R - -Timber Wolves -{G} -Creature - Wolf -1/1 -Banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -LEA R, LEB R, 2ED R, 3ED R, 4ED R - -Timberland Ruins -Land -Timberland Ruins enters the battlefield tapped. -{T}: Add {G} to your mana pool. -{T}, Sacrifice Timberland Ruins: Add one mana of any color to your mana pool. -ODY C - -Timberline Ridge -Land -Timberline Ridge doesn't untap during your untap step if it has a depletion counter on it. -At the beginning of your upkeep, remove a depletion counter from Timberline Ridge. -{T}: Add {R} or {G} to your mana pool. Put a depletion counter on Timberline Ridge. -ICE R - -Timbermare -{3}{G} -Creature - Elemental Horse -5/5 -Haste -Echo {5}{G} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -When Timbermare enters the battlefield, tap all other creatures. -PLC R - -Timbermaw Larva -{3}{G} -Creature - Beast -2/2 -Whenever Timbermaw Larva attacks, it gets +1/+1 until end of turn for each Forest you control. -ZEN C - -Timberwatch Elf -{2}{G} -Creature - Elf -1/2 -{T}: Target creature gets +X/+X until end of turn, where X is the number of Elves on the battlefield. -LGN C, EVG C - -Time Bomb -{4} -Artifact -At the beginning of your upkeep, put a time counter on Time Bomb. -{1}, {T}, Sacrifice Time Bomb: Time Bomb deals damage equal to the number of time counters on it to each creature and each player. -ICE R, 5ED R, ME2 R - -Time Ebb -{2}{U} -Sorcery -Put target creature on top of its owner's library. -POR C, TMP C, P02 C, S99 C, S00 C, 9ED C - -Time Elemental -{2}{U} -Creature - Elemental -0/2 -When Time Elemental attacks or blocks, at end of combat, sacrifice it and it deals 5 damage to you. -{2}{U}{U}, {T}: Return target permanent that isn't enchanted to its owner's hand. -LEG R, 4ED R, 5ED R, MED R - -Time Reversal -{3}{U}{U} -Sorcery -Each player shuffles his or her hand and graveyard into his or her library, then draws seven cards. Exile Time Reversal. -M11 M, M12 M - -Time Sieve -{U}{B} -Artifact -{T}, Sacrifice five artifacts: Take an extra turn after this one. -ARB R - -Time Spiral -{4}{U}{U} -Sorcery -Exile Time Spiral. Each player shuffles his or her graveyard and hand into his or her library, then draws seven cards. You untap up to six lands. -USG R - -Time Stop -{4}{U}{U} -Instant -End the turn. (Exile all spells and abilities on the stack, including this card. The player whose turn it is discards down to his or her maximum hand size. Damage wears off, and "this turn" and "until end of turn" effects end.) -CHK R, 10E R - -Time Stretch -{8}{U}{U} -Sorcery -Target player takes two extra turns after this one. -ODY R, 10E R - -Time Vault -{2} -Artifact -Time Vault enters the battlefield tapped. -Time Vault doesn't untap during your untap step. -If you would begin your turn while Time Vault is tapped, you may skip that turn instead. If you do, untap Time Vault. -{T}: Take an extra turn after this one. -LEA R, LEB R, 2ED R, ME4 R - -Time Walk -{1}{U} -Sorcery -Take an extra turn after this one. -LEA R, LEB R, 2ED R - -Time Warp -{3}{U}{U} -Sorcery -Target player takes an extra turn after this one. -TMP R, S99 R, M10 M - -Time and Tide -{U}{U} -Instant -Simultaneously, all phased-out creatures phase in and all creatures with phasing phase out. -VIS U - -Time of Heroes -{1}{W} -Enchantment -Each creature you control with a level counter on it gets +2/+2. -ROE U - -Time of Need -{1}{G} -Sorcery -Search your library for a legendary creature card, reveal it, and put it into your hand. Then shuffle your library. -CHK U - -Timebender -{U} -Creature - Human Wizard -1/1 -Morph {U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Timebender is turned face up, choose one - Remove two time counters from target permanent or suspended card; or put two time counters on target permanent with a time counter on it or suspended card. -PLC U - -Timecrafting -{X}{R} -Instant -Choose one - Remove X time counters from target permanent or suspended card; or put X time counters on target permanent with a time counter on it or suspended card. -PLC U - -Timely Reinforcements -{2}{W} -Sorcery -If you have less life than an opponent, you gain 6 life. If you control fewer creatures than an opponent, put three 1/1 white Soldier creature tokens onto the battlefield. -M12 U - -Timesifter -{5} -Artifact -At the beginning of each upkeep, each player exiles the top card of his or her library. The player who exiled the card with the highest converted mana cost takes an extra turn after this one. If two or more players' cards are tied for highest cost, the tied players repeat this process until the tie is broken. -MRD R - -Timetwister -{2}{U} -Sorcery -Each player shuffles his or her hand and graveyard into his or her library, then draws seven cards. (Then put Timetwister into its owner's graveyard.) -LEA R, LEB R, 2ED R - -Timid Drake -{2}{U} -Creature - Drake -3/3 -Flying -When another creature enters the battlefield, return Timid Drake to its owner's hand. -WTH U, MMQ U - -Timmerian Fiends -{1}{B}{B} -Creature - Horror -1/1 -Remove Timmerian Fiends from your deck before playing if you're not playing for ante. -{B}{B}{B}, Sacrifice Timmerian Fiends: The owner of target artifact may ante the top card of his or her library. If that player doesn't, exchange ownership of that artifact and Timmerian Fiends. Put the artifact card into your graveyard and Timmerian Fiends from anywhere into that player's graveyard. This change in ownership is permanent. -HML R - -Tin Street Hooligan -{1}{R} -Creature - Goblin Rogue -2/1 -When Tin Street Hooligan enters the battlefield, if {G} was spent to cast Tin Street Hooligan, destroy target artifact. -GPT C - -Tin-Wing Chimera -{4} -Artifact Creature - Chimera -2/2 -Flying -Sacrifice Tin-Wing Chimera: Put a +2/+2 counter on target Chimera creature. It gains flying. (This effect lasts indefinitely.) -VIS U - -Tinder Farm -Land -Tinder Farm enters the battlefield tapped. -{T}: Add {G} to your mana pool. -{T}, Sacrifice Tinder Farm: Add {R}{W} to your mana pool. -INV C - -Tinder Wall -{G} -Creature - Plant Wall -0/3 -Defender (This creature can't attack.) -Sacrifice Tinder Wall: Add {R}{R} to your mana pool. -{R}, Sacrifice Tinder Wall: Tinder Wall deals 2 damage to target creature it's blocking. -ICE C, ME2 C - -Tine Shrike -{3}{W} -Creature - Bird -2/1 -Flying -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -MBS C - -Tinker -{2}{U} -Sorcery -As an additional cost to cast Tinker, sacrifice an artifact. -Search your library for an artifact card and put that card onto the battlefield. Then shuffle your library. -ULG U, FVE M - -Tireless Missionaries -{4}{W} -Creature - Human Cleric -2/3 -When Tireless Missionaries enters the battlefield, you gain 3 life. -M11 C - -Tireless Tribe -{W} -Creature - Human Nomad -1/1 -Discard a card: Tireless Tribe gets +0/+4 until end of turn. -ODY C - -Titan Forge -{3} -Artifact -{3}, {T}: Put a charge counter on Titan Forge. -{T}, Remove three charge counters from Titan Forge: Put a 9/9 colorless Golem artifact creature token onto the battlefield. -MBS R - -Titan's Revenge -{X}{R}{R} -Sorcery -Titan's Revenge deals X damage to target creature or player. Clash with an opponent. If you win, return Titan's Revenge to its owner's hand. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -MOR R - -Titania -Vanguard -Hand +2, life -5 -You may play an additional land on each of your turns. -VG S - -Titania's Boon -{3}{G} -Sorcery -Put a +1/+1 counter on each creature you control. -USG U - -Titania's Chosen -{2}{G} -Creature - Elf Archer -1/1 -Whenever a player casts a green spell, put a +1/+1 counter on Titania's Chosen. -USG U - -Titania's Song -{3}{G} -Enchantment -Each noncreature artifact loses all abilities and becomes an artifact creature with power and toughness each equal to its converted mana cost. If Titania's Song leaves the battlefield, this effect continues until end of turn. -ATQ U, 3ED R, 4ED R, 5ED R, ME4 R - -Titanic Bulvox -{6}{G}{G} -Creature - Beast -7/4 -Trample -Morph {4}{G}{G}{G} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -SCG C - -Titanic Growth -{1}{G} -Instant -Target creature gets +4/+4 until end of turn. -M12 C - -Titanic Ultimatum -{R}{R}{G}{G}{G}{W}{W} -Sorcery -Until end of turn, creatures you control get +5/+5 and gain first strike, lifelink, and trample. -ALA R - -Titanium Golem -{5} -Artifact Creature - Golem -3/3 -{1}{W}: Titanium Golem gains first strike until end of turn. -MRD C - -Tithe -{W} -Instant -Search your library for a Plains card. If target opponent controls more lands than you, you may search your library for an additional Plains card. Reveal those cards and put them into your hand. Then shuffle your library. -VIS R - -Tivadar of Thorn -{1}{W}{W} -Legendary Creature - Human Knight -2/2 -First strike, protection from red -When Tivadar of Thorn enters the battlefield, destroy target Goblin. -TSP R - -Tivadar's Crusade -{1}{W}{W} -Sorcery -Destroy all Goblins. -DRK U, MED U - -To Arms! -{1}{W} -Instant -Untap all creatures you control. -Draw a card. -GPT U - -Tobias Andrion -{3}{W}{U} -Legendary Creature - Human Advisor -4/4 -LEG U, CHR U, ME3 C - -Toil to Renown -{1}{G} -Sorcery -You gain 1 life for each tapped artifact, creature, and land you control. -SHM C - -Toils of Night and Day -{2}{U} -Instant - Arcane -You may tap or untap target permanent, then you may tap or untap another target permanent. -BOK C - -Tolaria -Legendary Land -{T}: Add {U} to your mana pool. -{T}: Target creature loses banding and all "bands with other" abilities until end of turn. Activate this ability only during any upkeep step. -LEG U - -Tolaria West -Land -Tolaria West enters the battlefield tapped. -{T}: Add {U} to your mana pool. -Transmute {1}{U}{U} ({1}{U}{U}, Discard this card: Search your library for a card with converted mana cost 0, reveal it, and put it into your hand. Then shuffle your library. Transmute only as a sorcery.) -FUT U - -Tolarian Academy -Legendary Land -{T}: Add {U} to your mana pool for each artifact you control. -USG R - -Tolarian Drake -{2}{U} -Creature - Drake -2/4 -Flying -Phasing (This phases in or out before you untap during each of your untap steps. While it's phased out, it's treated as though it doesn't exist.) -WTH C - -Tolarian Emissary -{2}{U} -Creature - Human Wizard -1/2 -Kicker {1}{W} (You may pay an additional {1}{W} as you cast this spell.) -Flying -When Tolarian Emissary enters the battlefield, if it was kicked, destroy target enchantment. -INV U - -Tolarian Entrancer -{1}{U} -Creature - Human Wizard -1/1 -Whenever Tolarian Entrancer becomes blocked by a creature, gain control of that creature at end of combat. -WTH R - -Tolarian Sentinel -{3}{U} -Creature - Human Spellshaper -1/3 -Flying -{U}, {T}, Discard a card: Return target permanent you control to its owner's hand. -TSP C - -Tolarian Serpent -{5}{U}{U} -Creature - Serpent -7/7 -At the beginning of your upkeep, put the top seven cards of your library into your graveyard. -WTH R - -Tolarian Winds -{1}{U} -Instant -Discard all the cards in your hand, then draw that many cards. -USG C, BTD C, 7ED C - -Tolsimir Wolfblood -{4}{G}{W} -Legendary Creature - Elf Warrior -3/4 -Other green creatures you control get +1/+1. -Other white creatures you control get +1/+1. -{T}: Put a legendary 2/2 green and white Wolf creature token named Voja onto the battlefield. -RAV R - -Tomb Hex -{2}{B} -Instant -Target creature gets -2/-2 until end of turn. -Landfall - If you had a land enter the battlefield under your control this turn, that creature gets -4/-4 until end of turn instead. -WWK C - -Tomb of Urami -Legendary Land -{T}: Add {B} to your mana pool. Tomb of Urami deals 1 damage to you if you don't control an Ogre. -{2}{B}{B}, {T}, Sacrifice all lands you control: Put a legendary 5/5 black Demon Spirit creature token with flying named Urami onto the battlefield. -SOK R - -Tombfire -{B} -Sorcery -Target player exiles all cards with flashback from his or her graveyard. -ODY R - -Tombstalker -{6}{B}{B} -Creature - Demon -5/5 -Flying -Delve (You may exile any number of cards from your graveyard as you cast this spell. It costs {1} less to cast for each card exiled this way.) -FUT R - -Tombstone Stairwell -{2}{B}{B} -World Enchantment -Cumulative upkeep {1}{B} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -At the beginning of each upkeep, if Tombstone Stairwell is on the battlefield, each player puts a 2/2 black Zombie creature token with haste named Tombspawn onto the battlefield for each creature card in his or her graveyard. -At the beginning of each end step or when Tombstone Stairwell leaves the battlefield, destroy all tokens put onto the battlefield with Tombstone Stairwell. They can't be regenerated. -MIR R - -Tome Scour -{U} -Sorcery -Target player puts the top five cards of his or her library into his or her graveyard. -M10 C, M11 C - -Tomorrow, Azami's Familiar -{5}{U} -Legendary Creature - Spirit -1/5 -If you would draw a card, look at the top three cards of your library instead. Put one of those cards into your hand and the rest on the bottom of your library in any order. -BOK R - -Tonic Peddler -{1}{W} -Creature - Human Spellshaper -1/1 -{W}, {T}, Discard a card: Target player gains 3 life. -MMQ U - -Tooth and Claw -{3}{R} -Enchantment -Sacrifice two creatures: Put a 3/1 red Beast creature token named Carnivore onto the battlefield. -TMP R - -Tooth and Nail -{5}{G}{G} -Sorcery -Choose one - Search your library for up to two creature cards, reveal them, put them into your hand, then shuffle your library; or put up to two creature cards from your hand onto the battlefield. -Entwine {2} (Choose both if you pay the entwine cost.) -MRD R - -Tooth of Chiss-Goria -{3} -Artifact -Flash -Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -{T}: Target creature gets +1/+0 until end of turn. -MRD C - -Tooth of Ramos -{3} -Artifact -{T}: Add {W} to your mana pool. -Sacrifice Tooth of Ramos: Add {W} to your mana pool. -MMQ R - -Tooth, Claw, and Tail -Scheme -When you set this scheme in motion, destroy up to three target nonland permanents. -ARC C - -Topan Ascetic -{2}{G} -Creature - Human Monk -2/2 -Tap an untapped creature you control: Topan Ascetic gets +1/+1 until end of turn. -ALA U - -Topple -{2}{W} -Sorcery -Exile target creature with the greatest power. (If two or more creatures are tied for greatest power, target any one of them.) -NEM C - -Tor Giant -{3}{R} -Creature - Giant -3/3 -ICE C - -Tor Wauki -{2}{B}{B}{R} -Legendary Creature - Human Archer -3/3 -{T}: Tor Wauki deals 2 damage to target attacking or blocking creature. -LEG U, CHR U, ME3 U - -Torch Drake -{3}{U} -Creature - Drake -2/2 -Flying -{1}{R}: Torch Drake gets +1/+0 until end of turn. -GPT C - -Torch Slinger -{2}{R} -Creature - Goblin Shaman -2/2 -Kicker {1}{R} (You may pay an additional {1}{R} as you cast this spell.) -When Torch Slinger enters the battlefield, if it was kicked, it deals 2 damage to target creature. -ZEN C - -Torch Song -{2}{R} -Enchantment -At the beginning of your upkeep, you may put a verse counter on Torch Song. -{2}{R}, Sacrifice Torch Song: Torch Song deals X damage to target creature or player, where X is the number of verse counters on Torch Song. -USG U - -Torchling -{3}{R}{R} -Creature - Shapeshifter -3/3 -{R}: Untap Torchling. -{R}: Target creature blocks Torchling this turn if able. -{R}: Change the target of target spell that targets only Torchling. -{1}: Torchling gets +1/-1 until end of turn. -{1}: Torchling gets -1/+1 until end of turn. -PLC R - -Torii Watchward -{4}{W} -Creature - Spirit -3/3 -Vigilance (Attacking doesn't cause this creature to tap.) -Soulshift 4 (When this creature dies, you may return target Spirit card with converted mana cost 4 or less from your graveyard to your hand.) -SOK C - -Torment -{1}{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets -3/-0. -STH C - -Tormented Angel -{3}{W} -Creature - Angel -1/5 -Flying -UDS C - -Tormented Soul -{B} -Creature - Spirit -1/1 -Tormented Soul can't block and is unblockable. -M12 C - -Tormentor Exarch -{3}{R} -Creature - Cleric -2/2 -When Tormentor Exarch enters the battlefield, choose one - Target creature gets +2/+0 until end of turn; or target creature gets -0/-2 until end of turn. -NPH U - -Tormod's Crypt -{0} -Artifact -{T}, Sacrifice Tormod's Crypt: Exile all cards from target player's graveyard. -DRK U, CHR C, TSB S - -Tornado -{4}{G} -Enchantment -Cumulative upkeep {G} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -{2}{G}, Pay 3 life for each velocity counter on Tornado: Destroy target permanent and put a velocity counter on Tornado. Activate this ability only once each turn. -ALL R, MED R - -Tornado Elemental -{5}{G}{G} -Creature - Elemental -6/6 -When Tornado Elemental enters the battlefield, it deals 6 damage to each creature with flying. -You may have Tornado Elemental assign its combat damage as though it weren't blocked. -5DN R, HOP R - -Tornellan Protector -{2}{W} -Creature - Human Cleric -1/2 -{T}: Choose a number from 1 to 3 at random. Until end of turn, if a source would deal damage to target creature or player, it deals that much damage minus the chosen number to that creature or player instead. -SDC S - -Torpid Moloch -{R} -Creature - Lizard -3/2 -Defender (This creature can't attack.) -Sacrifice three lands: Torpid Moloch loses defender until end of turn. -RAV C - -Torpor Dust -{2}{U/B} -Enchantment - Aura -Flash -Enchant creature -Enchanted creature gets -3/-0. -SHM C - -Torpor Orb -{2} -Artifact -Creatures entering the battlefield don't cause abilities to trigger. -NPH R - -Torrent of Fire -{3}{R}{R} -Sorcery -Torrent of Fire deals damage equal to the highest converted mana cost among permanents you control to target creature or player. -SCG C - -Torrent of Lava -{X}{R}{R} -Sorcery -Torrent of Lava deals X damage to each creature without flying. -As long as Torrent of Lava is on the stack, each creature has "{T}: Prevent the next 1 damage that would be dealt to this creature by Torrent of Lava this turn." -MIR R - -Torrent of Souls -{4}{B/R} -Sorcery -Return up to one target creature card from your graveyard to the battlefield if {B} was spent to cast Torrent of Souls. Creatures target player controls get +2/+0 and gain haste until end of turn if {R} was spent to cast Torrent of Souls. (Do both if {B}{R} was spent.) -SHM U, ARC U - -Torrent of Stone -{3}{R} -Instant - Arcane -Torrent of Stone deals 4 damage to target creature. -Splice onto Arcane-Sacrifice two Mountains. (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -BOK C - -Torsten Von Ursus -{3}{G}{G}{W} -Legendary Creature - Human Soldier -5/5 -LEG U, ME3 C - -Tortoise Formation -{3}{U} -Instant -Creatures you control gain shroud until end of turn. (They can't be the targets of spells or abilities.) -ALA C - -Torture -{B} -Enchantment - Aura -Enchant creature -{1}{B}: Put a -1/-1 counter on enchanted creature. -HML C (x2), 5ED C, SHM C - -Torture Chamber -{3} -Artifact -At the beginning of your upkeep, put a pain counter on Torture Chamber. -At the beginning of your end step, Torture Chamber deals damage to you equal to the number of pain counters on it. -{1}, {T}, Remove all pain counters from Torture Chamber: Torture Chamber deals damage to target creature equal to the number of pain counters removed this way. -TMP R - -Tortured Existence -{B} -Enchantment -{B}, Discard a creature card: Return target creature card from your graveyard to your hand. -STH C - -Toshiro Umezawa -{1}{B}{B} -Legendary Creature - Human Samurai -2/2 -Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -Whenever a creature an opponent controls dies, you may cast target instant card from your graveyard. If that card would be put into a graveyard this turn, exile it instead. -BOK R - -Total War -{3}{R} -Enchantment -Whenever a player attacks with one or more creatures, destroy all untapped non-Wall creatures that player controls that didn't attack, except for creatures the player hasn't controlled continuously since the beginning of the turn. -ICE R - -Totem Speaker -{4}{G} -Creature - Elf Druid -3/3 -Whenever a Beast enters the battlefield, you may gain 3 life. -LGN U - -Totem-Guide Hartebeest -{4}{W} -Creature - Antelope -2/5 -When Totem-Guide Hartebeest enters the battlefield, you may search your library for an Aura card, reveal it, put it into your hand, then shuffle your library. -ROE C - -Touch of Brilliance -{3}{U} -Sorcery -Draw two cards. -POR C, P02 C, S99 C - -Touch of Darkness -{B} -Instant -Any number of target creatures become black until end of turn. -LEG U - -Touch of Death -{2}{B} -Sorcery -Touch of Death deals 1 damage to target player. You gain 1 life. -Draw a card at the beginning of the next turn's upkeep. -ICE C, 5ED C - -Touch of Invisibility -{3}{U} -Sorcery -Target creature is unblockable this turn. -Draw a card. -ODY C - -Touch of Vitae -{2}{G} -Instant -Until end of turn, target creature gains haste and "{0}: Untap this creature. Activate this ability only once." -Draw a card at the beginning of the next turn's upkeep. -ICE U - -Touchstone -{2} -Artifact -{T}: Tap target artifact you don't control. -WTH U - -Tourach's Chant -{1}{B}{B} -Enchantment -At the beginning of your upkeep, sacrifice Tourach's Chant unless you pay {B}. -Whenever a player puts a Forest onto the battlefield, Tourach's Chant deals 3 damage to that player unless he or she puts a -1/-1 counter on a creature he or she controls. -FEM U - -Tourach's Gate -{1}{B}{B} -Enchantment - Aura -Enchant land you control -Sacrifice a Thrull: Put three time counters on Tourach's Gate. -At the beginning of your upkeep, remove a time counter from Tourach's Gate. If there are no time counters on Tourach's Gate, sacrifice it. -Enchanted land has "{T}: Attacking creatures you control get +2/-1 until end of turn." -FEM R - -Tower Above -{2/G}{2/G}{2/G} -Sorcery -({2/G} can be paid with any two mana or with {G}. This card's converted mana cost is 6.) -Until end of turn, target creature gets +4/+4 and gains trample, wither, and "When this creature attacks, target creature blocks it this turn if able." (It deals damage to creatures in the form of -1/-1 counters.) -SHM U - -Tower Drake -{2}{U} -Creature - Drake -2/1 -Flying -{W}: Tower Drake gets +0/+1 until end of turn. -INV C - -Tower Gargoyle -{1}{W}{U}{B} -Artifact Creature - Gargoyle -4/4 -Flying -ALA U - -Tower of Calamities -{4} -Artifact -{8}, {T}: Tower of Calamities deals 12 damage to target creature. -SOM R - -Tower of Champions -{4} -Artifact -{8}, {T}: Target creature gets +6/+6 until end of turn. -MRD R - -Tower of Coireall -{2} -Artifact -{T}: Target creature can't be blocked by Walls this turn. -DRK U - -Tower of Eons -{4} -Artifact -{8}, {T}: You gain 10 life. -MRD R - -Tower of Fortunes -{4} -Artifact -{8}, {T}: Draw four cards. -MRD R - -Tower of Murmurs -{4} -Artifact -{8}, {T}: Target player puts the top eight cards of his or her library into his or her graveyard. -MRD R - -Tower of the Magistrate -Land -{T}: Add {1} to your mana pool. -{1}, {T}: Target creature gains protection from artifacts until end of turn. -MMQ R - -Towering Baloth -{6}{G}{G} -Creature - Beast -7/6 -Morph {6}{G} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS U - -Town Sentry -{2}{W} -Creature - Human Soldier -2/2 -Whenever Town Sentry blocks, it gets +0/+2 until end of turn. -P02 C - -Toxic Iguanar -{R} -Creature - Lizard -1/1 -Toxic Iguanar has deathtouch as long as you control a green permanent. (Any amount of damage a creature with deathtouch deals to a creature is enough to destroy it.) -CON C - -Toxic Nim -{4}{B}{B} -Creature - Zombie -4/1 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -{B}: Regenerate Toxic Nim. -NPH C - -Toxic Stench -{1}{B} -Instant -Target nonblack creature gets -1/-1 until end of turn. -Threshold - If seven or more cards are in your graveyard, instead destroy that creature. It can't be regenerated. -JUD C - -Toxin Sliver -{3}{B} -Creature - Sliver -3/3 -Whenever a Sliver deals combat damage to a creature, destroy that creature. It can't be regenerated. -LGN R - -Toymaker -{2} -Artifact Creature - Spellshaper -1/1 -{1}, {T}, Discard a card: Target noncreature artifact becomes an artifact creature with power and toughness each equal to its converted mana cost until end of turn. (It retains its abilities.) -MMQ U - -Trace of Abundance -{R/W}{G} -Enchantment - Aura -Enchant land -Enchanted land has shroud. (It can't be the target of spells or abilities.) -Whenever enchanted land is tapped for mana, its controller adds one mana of any color to his or her mana pool (in addition to the mana the land produces). -ARB C - -Tracker -{2}{G} -Creature - Human -2/2 -{G}{G}, {T}: Tracker deals damage equal to its power to target creature. That creature deals damage equal to its power to Tracker. -DRK R, ME3 U - -Trade Caravan -{W} -Creature - Human Nomad -1/1 -At the beginning of your upkeep, put a currency counter on Trade Caravan. -Remove two currency counters from Trade Caravan: Untap target basic land. Activate this ability only during an opponent's upkeep. -HML C (x2) - -Trade Routes -{1}{U} -Enchantment -{1}: Return target land you control to its owner's hand. -{1}, Discard a land card: Draw a card. -MMQ R, 8ED R, 9ED R - -Trade Secrets -{1}{U}{U} -Sorcery -Target opponent draws two cards, then you draw up to four cards. That opponent may repeat this process as many times as he or she chooses. -ONS R, COM R - -Tradewind Rider -{3}{U} -Creature - Spirit -1/4 -Flying -{T}, Tap two untapped creatures you control: Return target permanent to its owner's hand. -TMP R - -Tradewind Rider Avatar -Vanguard -Hand +1, life +4 -{3}: Each player returns a permanent he or she controls to its owner's hand unless he or she pays 2 life. -VG S (x2) - -Tragic Poet -{W} -Creature - Human -1/1 -{T}, Sacrifice Tragic Poet: Return target enchantment card from your graveyard to your hand. -ULG C - -Trailblazer -{2}{G}{G} -Instant -Target creature is unblockable this turn. -ICE R - -Trailblazer's Boots -{2} -Artifact - Equipment -Equipped creature has nonbasic landwalk. (It's unblockable as long as defending player controls a nonbasic land.) -Equip {2} -ZEN U - -Train of Thought -{1}{U} -Sorcery -Replicate {1}{U} (When you cast this spell, copy it for each time you paid its replicate cost.) -Draw a card. -GPT C - -Trained Armodon -{1}{G}{G} -Creature - Elephant -3/3 -TMP C, 6ED C, 7ED C, 8ED C, 9ED C - -Trained Cheetah -{2}{G} -Creature - Cat -2/2 -Whenever Trained Cheetah becomes blocked, it gets +1/+1 until end of turn. -PTK U - -Trained Jackal -{G} -Creature - Hound -1/2 -PTK C - -Trained Orgg -{6}{R} -Creature - Orgg -6/6 -S99 R, S00 R, 7ED R - -Trained Pronghorn -{1}{W} -Creature - Antelope -1/1 -Discard a card: Prevent all damage that would be dealt to Trained Pronghorn this turn. -JUD C - -Training Drone -{3} -Artifact Creature - Drone -4/4 -Training Drone can't attack or block unless it's equipped. -MBS C - -Training Grounds -{U} -Enchantment -Activated abilities of creatures you control cost up to {2} less to activate. This effect can't reduce the amount of mana an ability costs to activate to less than one mana. -ROE R - -Traitor's Clutch -{4}{B} -Instant -Target creature gets +1/+0, becomes black, and gains shadow until end of turn. (It can block or be blocked by only creatures with shadow.) -Flashback {1}{B} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -TSP C - -Traitor's Roar -{4}{B/R} -Sorcery -Tap target untapped creature. It deals damage equal to its power to its controller. -Conspire (As you cast this spell, you may tap two untapped creatures you control that share a color with it. When you do, copy it and you may choose a new target for the copy.) -SHM C - -Traitorous Instinct -{3}{R} -Sorcery -Gain control of target creature until end of turn. Untap that creature. Until end of turn, it gets +2/+0 and gains haste. -ROE U - -Tranquil Domain -{1}{G} -Instant -Destroy all non-Aura enchantments. -MIR C - -Tranquil Garden -Land -{T}: Add {1} to your mana pool. -{T}: Add {G} or {W} to your mana pool. Tranquil Garden doesn't untap during your next untap step. -CHK U - -Tranquil Grove -{1}{G} -Enchantment -{1}{G}{G}: Destroy all other enchantments. -WTH R, 6ED R - -Tranquil Path -{4}{G} -Sorcery -Destroy all enchantments. -Draw a card. -APC C - -Tranquil Thicket -Land -Tranquil Thicket enters the battlefield tapped. -{T}: Add {G} to your mana pool. -Cycling {G} ({G}, Discard this card: Draw a card.) -ONS C, EVG C, ARC C, COM C - -Tranquility -{2}{G} -Sorcery -Destroy all enchantments. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, TMP C, 6ED C, MMQ C, BRB C, INV C, 7ED C - -Transcendence -{3}{W}{W}{W} -Enchantment -You don't lose the game for having 0 or less life. -When you have 20 or more life, you lose the game. -Whenever you lose life, you gain 2 life for each 1 life you lost. (Damage dealt to you causes you to lose life.) -TOR R - -Transcendent Master -{1}{W}{W} -Creature - Human Cleric Avatar -3/3 -Level up {1} ({1}: Put a level counter on this. Level up only as a sorcery.) -LEVEL 6-11 -6/6 -Lifelink -LEVEL 12+ -9/9 -Lifelink -Transcendent Master is indestructible. -ROE M - -Transguild Courier -{4} -Artifact Creature - Golem -3/3 -Transguild Courier is all colors (even if this card isn't on the battlefield). -DIS U - -Transluminant -{1}{G} -Creature - Dryad Shaman -2/2 -{W}, Sacrifice Transluminant: Put a 1/1 white Spirit creature token with flying onto the battlefield at the beginning of the next end step. -RAV C - -Transmogrifying Licid -{3} -Artifact Creature - Licid -2/2 -{1}, {T}: Transmogrifying Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {1} to end this effect. -Enchanted creature gets +1/+1 and is an artifact in addition to its other types. -EXO U - -Transmutation -{1}{B} -Instant -Switch target creature's power and toughness until end of turn. -LEG C, CHR C - -Transmute Artifact -{U}{U} -Sorcery -Sacrifice an artifact. If you do, search your library for an artifact card. If that card's converted mana cost is less than or equal to the sacrificed artifact's converted mana cost, put it onto the battlefield. If it's greater, you may pay {X}, where X is the difference. If you do, put it onto the battlefield. If you don't, put it into its owner's graveyard. Then shuffle your library. -ATQ U, ME4 R - -Trap Digger -{3}{W} -Creature - Human Soldier -1/3 -{2}{W}, {T}: Put a trap counter on target land you control. -Sacrifice a land with a trap counter on it: Trap Digger deals 3 damage to target attacking creature without flying. -SCG R - -Trap Runner -{2}{W}{W} -Creature - Human Soldier -2/3 -{T}: Target unblocked attacking creature becomes blocked. Activate this ability only during combat after blockers are declared. (This ability works on unblockable creatures.) -MMQ U - -Trapfinder's Trick -{1}{U} -Sorcery -Target player reveals his or her hand and discards all Trap cards. -ZEN C - -Trapjaw Kelpie -{4}{G/U}{G/U} -Creature - Beast -3/3 -Flash -Persist (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) -EVE C - -Trapmaker's Snare -{1}{U} -Instant -Search your library for a Trap card, reveal it, and put it into your hand. Then shuffle your library. -ZEN U - -Traproot Kami -{G} -Creature - Spirit -0/* -Defender; reach (This creature can block creatures with flying.) -Traproot Kami's toughness is equal to the number of Forests on the battlefield. -BOK C - -Trash for Treasure -{2}{R} -Sorcery -As an additional cost to cast Trash for Treasure, sacrifice an artifact. -Return target artifact card from your graveyard to the battlefield. -MRD R - -Traumatic Visions -{3}{U}{U} -Instant -Counter target spell. -Basic landcycling {1}{U} ({1}{U}, Discard this card: Search your library for a basic land card, reveal it, and put it into your hand. Then shuffle your library.) -CON C - -Traumatize -{3}{U}{U} -Sorcery -Target player puts the top half of his or her library, rounded down, into his or her graveyard. -ODY R, 9ED R, 10E R, M10 R, M11 R - -Traveler's Cloak -{2}{U} -Enchantment - Aura -Enchant creature -As Traveler's Cloak enters the battlefield, choose a land type. -When Traveler's Cloak enters the battlefield, draw a card. -Enchanted creature has landwalk of the chosen type. -INV C - -Traveling Plague -{3}{B}{B} -Enchantment - Aura -Enchant creature -At the beginning of each upkeep, put a plague counter on Traveling Plague. -Enchanted creature gets -1/-1 for each plague counter on Traveling Plague. -When enchanted creature leaves the battlefield, that creature's controller returns Traveling Plague from its owner's graveyard to the battlefield. -ODY R - -Treacherous Link -{1}{B} -Enchantment - Aura -Enchant creature -All damage that would be dealt to enchanted creature is dealt to its controller instead. -ULG U - -Treacherous Urge -{4}{B} -Instant -Target opponent reveals his or her hand. You may put a creature card from it onto the battlefield under your control. That creature has haste. Sacrifice it at the beginning of the next end step. -PLC U - -Treacherous Vampire -{4}{B} -Creature - Vampire -4/4 -Flying -Whenever Treacherous Vampire attacks or blocks, sacrifice it unless you exile a card from your graveyard. -Threshold - As long as seven or more cards are in your graveyard, Treacherous Vampire gets +2/+2 and has "When Treacherous Vampire dies, you lose 6 life." -JUD U - -Treacherous Werewolf -{2}{B} -Creature - Human Wolf Minion -2/2 -Threshold - As long as seven or more cards are in your graveyard, Treacherous Werewolf gets +2/+2 and has "When Treacherous Werewolf dies, you lose 4 life." -JUD C - -Treachery -{3}{U}{U} -Enchantment - Aura -Enchant creature -When Treachery enters the battlefield, untap up to five lands. -You control enchanted creature. -UDS R - -Treasure Hunt -{1}{U} -Sorcery -Reveal cards from the top of your library until you reveal a nonland card, then put all cards revealed this way into your hand. -WWK C - -Treasure Hunter -{2}{W} -Creature - Human -2/2 -When Treasure Hunter enters the battlefield, you may return target artifact card from your graveyard to your hand. -EXO U, 10E U - -Treasure Mage -{2}{U} -Creature - Human Wizard -2/2 -When Treasure Mage enters the battlefield, you may search your library for an artifact card with converted mana cost 6 or greater, reveal that card, and put it into your hand. If you do, shuffle your library. -MBS U - -Treasure Trove -{2}{U}{U} -Enchantment -{2}{U}{U}: Draw a card. -EXO U, 7ED U, 8ED U, 9ED U - -Tree Monkey -{G} -Creature - Ape -1/1 -Reach (This creature can block creatures with flying.) -P02 C, 9ED C - -Tree of Tales -Artifact Land -(Tree of Tales isn't a spell.) -{T}: Add {G} to your mana pool. -MRD C, HOP C - -Treefolk Harbinger -{G} -Creature - Treefolk Druid -0/3 -When Treefolk Harbinger enters the battlefield, you may search your library for a Treefolk or Forest card, reveal it, then shuffle your library and put that card on top of it. -LRW U - -Treefolk Healer -{4}{G} -Creature - Treefolk Cleric -2/3 -{2}{W}, {T}: Prevent the next 2 damage that would be dealt to target creature or player this turn. -INV U - -Treefolk Mystic -{3}{G} -Creature - Treefolk -2/4 -Whenever Treefolk Mystic blocks or becomes blocked by a creature, destroy all Auras attached to that creature. -ULG C - -Treefolk Seedlings -{2}{G} -Creature - Treefolk -2/* -Treefolk Seedlings's toughness is equal to the number of Forests you control. -USG U, 7ED U - -Treespring Lorian -{5}{G} -Creature - Beast -5/4 -Morph {5}{G} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS C - -Treetop Bracers -{1}{G} -Enchantment - Aura -Enchant creature (Target a creature as you cast this. This card enters the battlefield attached to that creature.) -Enchanted creature gets +1/+1 and can't be blocked except by creatures with flying. -NEM C, 9ED C, 10E C - -Treetop Defense -{1}{G} -Instant -Cast Treetop Defense only during the declare attackers step and only if you've been attacked this step. -Creatures you control gain reach until end of turn. (They can block creatures with flying.) -POR R - -Treetop Rangers -{2}{G} -Creature - Elf -2/2 -Treetop Rangers can't be blocked except by creatures with flying. -USG C - -Treetop Scout -{G} -Creature - Elf Scout -1/1 -Treetop Scout can't be blocked except by creatures with flying. -SCG C - -Treetop Sentinel -{2}{U}{U} -Creature - Bird Soldier -2/3 -Flying, protection from green -ODY U - -Treetop Village -Land -Treetop Village enters the battlefield tapped. -{T}: Add {G} to your mana pool. -{1}{G}: Treetop Village becomes a 3/3 green Ape creature with trample until end of turn. It's still a land. (If it would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.) -ULG U, 10E U, GVL U, DDG U - -Tremble -{1}{R} -Sorcery -Each player sacrifices a land. -ODY C - -Tremor -{R} -Sorcery -Tremor deals 1 damage to each creature without flying. -VIS C, P02 C, 6ED C, S99 C, MMQ C, 7ED C, 8ED C - -Trench Gorger -{6}{U}{U} -Creature - Leviathan -6/6 -Trample -When Trench Gorger enters the battlefield, you may search your library for any number of land cards, exile them, then shuffle your library. If you do, Trench Gorger's power and toughness each become equal to the number of cards exiled this way. -COM R - -Trench Wurm -{3}{B} -Creature - Wurm -3/3 -{2}{R}, {T}: Destroy target nonbasic land. -INV U - -Trenching Steed -{3}{W} -Creature - Horse Rebel -2/3 -Sacrifice a land: Trenching Steed gets +0/+3 until end of turn. -PCY C - -Trespasser il-Vec -{2}{B} -Creature - Human Rogue -3/1 -Discard a card: Trespasser il-Vec gains shadow until end of turn. (It can block or be blocked by only creatures with shadow.) -TSP C - -Trespassing Souleater -{3} -Artifact Creature - Construct -2/2 -{U/P}: Trespassing Souleater is unblockable this turn. ({U/P} can be paid with either {U} or 2 life.) -NPH C - -Tresserhorn Sinks -Snow Land -Tresserhorn Sinks enters the battlefield tapped. -{T}: Add {B} or {R} to your mana pool. -CSP U - -Tresserhorn Skyknight -{5}{B}{B} -Creature - Zombie Knight -5/3 -Flying -Prevent all damage that would be dealt to Tresserhorn Skyknight by creatures with first strike. -CSP U - -Treva's Attendant -{5} -Artifact Creature - Golem -3/3 -{1}, Sacrifice Treva's Attendant: Add {G}{W}{U} to your mana pool. -INV U - -Treva's Charm -{G}{W}{U} -Instant -Choose one - Destroy target enchantment; or exile target attacking creature; or draw a card, then discard a card. -PLS U, PVC U - -Treva's Ruins -Land - Lair -When Treva's Ruins enters the battlefield, sacrifice it unless you return a non-Lair land you control to its owner's hand. -{T}: Add {G}, {W}, or {U} to your mana pool. -PLS U - -Treva, the Renewer -{3}{G}{W}{U} -Legendary Creature - Dragon -6/6 -Flying -Whenever Treva, the Renewer deals combat damage to a player, you may pay {2}{W}. If you do, choose a color, then you gain 1 life for each permanent of that color. -INV R, PVC R - -Trial -{W}{U} -Instant -Return all creatures blocking or blocked by target creature to their owner's hand. ----- -Error -{U}{B} -Instant -Counter target multicolored spell. -DIS U - -Triangle of War -{1} -Artifact -{2}, Sacrifice Triangle of War: Choose target creature you control and target creature an opponent controls. Each of those creatures deals damage equal to its power to the other. -VIS R - -Triassic Egg -{4} -Artifact -{3}, {T}: Put a hatchling counter on Triassic Egg. -Sacrifice Triassic Egg: Choose one - You may put a creature card from your hand onto the battlefield; or return target creature card from your graveyard to the battlefield. Activate this ability only if two or more hatchling counters are on Triassic Egg. -LEG R, CHR R, ME4 R - -Tribal Flames -{1}{R} -Sorcery -Domain - Tribal Flames deals X damage to target creature or player, where X is the number of basic land types among lands you control. -INV C, TSB S, PVC C - -Tribal Forcemage -{1}{G} -Creature - Elf Wizard -1/1 -Morph {1}{G} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Tribal Forcemage is turned face up, creatures of the creature type of your choice get +2/+2 and gain trample until end of turn. -LGN R - -Tribal Golem -{6} -Artifact Creature - Golem -4/4 -Tribal Golem has trample as long as you control a Beast, haste as long as you control a Goblin, first strike as long as you control a Soldier, flying as long as you control a Wizard, and "{B}: Regenerate Tribal Golem" as long as you control a Zombie. -ONS R - -Tribal Unity -{X}{2}{G} -Instant -Creatures of the creature type of your choice get +X/+X until end of turn. -ONS U, HOP U - -Tribute to the Wild -{1}{G} -Instant -Each opponent sacrifices an artifact or enchantment. -COM U - -Trickbind -{1}{U} -Instant -Split second (As long as this spell is on the stack, players can't cast spells or activate abilities that aren't mana abilities.) -Counter target activated or triggered ability. If a permanent's ability is countered this way, activated abilities of that permanent can't be activated this turn. (Mana abilities can't be targeted.) -TSP R - -Trickery Charm -{U} -Instant -Choose one - Target creature gains flying until end of turn; or target creature becomes the creature type of your choice until end of turn; or look at the top four cards of your library, then put them back in any order. -ONS C - -Trickster Mage -{U} -Creature - Human Spellshaper -1/1 -{U}, {T}, Discard a card: You may tap or untap target artifact, creature, or land. -NEM C - -Triclopean Sight -{1}{W} -Enchantment - Aura -Flash -Enchant creature -When Triclopean Sight enters the battlefield, untap enchanted creature. -Enchanted creature gets +1/+1 and has vigilance. -LRW C - -Trigon of Corruption -{4} -Artifact -Trigon of Corruption enters the battlefield with three charge counters on it. -{B}{B}, {T}: Put a charge counter on Trigon of Corruption. -{2}, {T}, Remove a charge counter from Trigon of Corruption: Put a -1/-1 counter on target creature. -SOM U - -Trigon of Infestation -{4} -Artifact -Trigon of Infestation enters the battlefield with three charge counters on it. -{G}{G}, {T}: Put a charge counter on Trigon of Infestation. -{2}, {T}, Remove a charge counter from Trigon of Infestation: Put a 1/1 green Insect creature token with infect onto the battlefield. -SOM U - -Trigon of Mending -{2} -Artifact -Trigon of Mending enters the battlefield with three charge counters on it. -{W}{W}, {T}: Put a charge counter on Trigon of Mending. -{2}, {T}, Remove a charge counter from Trigon of Mending: Target player gains 3 life. -SOM U - -Trigon of Rage -{2} -Artifact -Trigon of Rage enters the battlefield with three charge counters on it. -{R}{R}, {T}: Put a charge counter on Trigon of Rage. -{2}, {T}, Remove a charge counter from Trigon of Rage: Target creature gets +3/+0 until end of turn. -SOM U - -Trigon of Thought -{5} -Artifact -Trigon of Thought enters the battlefield with three charge counters on it. -{U}{U}, {T}: Put a charge counter on Trigon of Thought. -{2}, {T}, Remove a charge counter from Trigon of Thought: Draw a card. -SOM U - -Trinisphere -{3} -Artifact -As long as Trinisphere is untapped, each spell that would cost less than three mana to cast costs three mana to cast. (Additional mana in the cost may be paid with any color of mana or colorless mana. For example, a spell that would cost {1}{B} to cast costs {2}{B} to cast instead.) -DST R, FVE M - -Trinket Mage -{2}{U} -Creature - Human Wizard -2/2 -When Trinket Mage enters the battlefield, you may search your library for an artifact card with converted mana cost 1 or less, reveal that card, and put it into your hand. If you do, shuffle your library. -5DN C, EVT C, SOM U - -Trip Noose -{2} -Artifact -{2}, {T}: Tap target creature. -SHM U, EVT U - -Trip Wire -{2}{G} -Sorcery -Destroy target creature with horsemanship. -PTK U, ME3 C - -Triskelavus -{7} -Artifact Creature - Construct -1/1 -Flying -Triskelavus enters the battlefield with three +1/+1 counters on it. -{1}, Remove a +1/+1 counter from Triskelavus: Put a 1/1 colorless Triskelavite artifact creature token with flying onto the battlefield. It has "Sacrifice this creature: This creature deals 1 damage to target creature or player." -TSP R, COM R - -Triskelion -{6} -Artifact Creature - Construct -1/1 -Triskelion enters the battlefield with three +1/+1 counters on it. -Remove a +1/+1 counter from Triskelion: Triskelion deals 1 damage to target creature or player. -ATQ R, 4ED R, MRD R, M11 R, EVT R - -Triumph of the Hordes -{2}{G}{G} -Sorcery -Until end of turn, creatures you control get +1/+1 and gain trample and infect. (Creatures with infect deal damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -NPH U - -Trokin High Guard -{3}{W} -Creature - Human Knight -3/3 -P02 C - -Troll Ascetic -{1}{G}{G} -Creature - Troll Shaman -3/2 -Hexproof (This creature can't be the target of spells or abilities your opponents control.) -{1}{G}: Regenerate Troll Ascetic. -MRD R, 10E R, COM R - -Troll-Horn Cameo -{3} -Artifact -{T}: Add {R} or {G} to your mana pool. -INV U - -Trollhide -{2}{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2 and has "{1}{G}: Regenerate this creature." (The next time the creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.) -M12 C - -Trolls of Tel-Jilad -{5}{G}{G} -Creature - Troll Shaman -5/6 -{1}{G}: Regenerate target green creature. -MRD U - -Tromp the Domains -{5}{G} -Sorcery -Domain - Until end of turn, creatures you control gain trample and get +1/+1 for each basic land type among lands you control. -TSP U - -Trophy Hunter -{2}{G} -Creature - Human Archer -2/3 -{1}{G}: Trophy Hunter deals 1 damage to target creature with flying. -Whenever a creature with flying dealt damage by Trophy Hunter this turn dies, put a +1/+1 counter on Trophy Hunter. -RAV U - -Tropical Island -Land - Forest Island -LEA R, LEB R, 2ED R, 3ED R, ME3 R, ME4 R - -Tropical Storm -{X}{G} -Sorcery -Tropical Storm deals X damage to each creature with flying and 1 additional damage to each blue creature. -MIR U - -Troubled Healer -{2}{W} -Creature - Human Cleric -1/2 -Sacrifice a land: Prevent the next 2 damage that would be dealt to target creature or player this turn. -PCY C - -Troublesome Spirit -{2}{U}{U} -Creature - Spirit -3/4 -Flying -At the beginning of your end step, tap all lands you control. -PCY R - -Truce -{2}{W} -Instant -Each player may draw up to two cards. For each card less than two a player draws this way, that player gains 2 life. -HML R, 5ED R - -True Believer -{W}{W} -Creature - Human Cleric -2/2 -You have shroud. (You can't be the target of spells or abilities.) -ONS R, 10E R - -True Conviction -{3}{W}{W}{W} -Enchantment -Creatures you control have double strike and lifelink. -SOM R - -Trumpet Blast -{2}{R} -Instant -Attacking creatures get +2/+0 until end of turn. -UDS C, M10 C - -Trumpeting Armodon -{3}{G} -Creature - Elephant -3/3 -{1}{G}: Target creature blocks Trumpeting Armodon this turn if able. -TMP U, BRB U - -Trusted Advisor -{U} -Creature - Human Advisor -1/2 -Your maximum hand size is increased by two. -At the beginning of your upkeep, return a blue creature you control to its owner's hand. -SOK U - -Trusty Machete -{1} -Artifact - Equipment -Equipped creature gets +2/+1. -Equip {2} -ZEN U - -Truth or Tale -{1}{U} -Instant -Reveal the top five cards of your library and separate them into two piles. An opponent chooses one of those piles. Put a card from the chosen pile into your hand, then put all other cards revealed this way on the bottom of your library in any order. -TSP U - -Trygon Predator -{1}{G}{U} -Creature - Beast -2/3 -Flying -Whenever Trygon Predator deals combat damage to a player, you may destroy target artifact or enchantment that player controls. -DIS U - -Tsabo Tavoc -{5}{B}{R} -Legendary Creature - Horror -7/4 -First strike, protection from legendary creatures -{B}{B}, {T}: Destroy target legendary creature. It can't be regenerated. -INV R - -Tsabo's Assassin -{2}{B}{B} -Creature - Zombie Assassin -1/1 -{T}: Destroy target creature if it shares a color with the most common color among all permanents or a color tied for most common. A creature destroyed this way can't be regenerated. -INV R - -Tsabo's Decree -{5}{B} -Instant -Choose a creature type. Target player reveals his or her hand and discards all creature cards of that type. Then destroy all creatures of that type that player controls. They can't be regenerated. -INV R - -Tsabo's Web -{2} -Artifact -When Tsabo's Web enters the battlefield, draw a card. -Each land with an activated ability that isn't a mana ability doesn't untap during its controller's untap step. -INV R - -Tsunami -{3}{G} -Sorcery -Destroy all Islands. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, ME4 R - -Tukatongue Thallid -{G} -Creature - Fungus -1/1 -When Tukatongue Thallid dies, put a 1/1 green Saproling creature token onto the battlefield. -CON C - -Tuknir Deathlock -{R}{R}{G}{G} -Legendary Creature - Human Wizard -2/2 -Flying -{R}{G}, {T}: Target creature gets +2/+2 until end of turn. -LEG R, ME3 U - -Tuktuk Grunts -{4}{R} -Creature - Goblin Warrior Ally -2/2 -Haste -Whenever Tuktuk Grunts or another Ally enters the battlefield under your control, you may put a +1/+1 counter on Tuktuk Grunts. -ZEN C - -Tuktuk Scrapper -{3}{R} -Creature - Goblin Artificer Ally -2/2 -Whenever Tuktuk Scrapper or another Ally enters the battlefield under your control, you may destroy target artifact. If that artifact is put into a graveyard this way, Tuktuk Scrapper deals damage to that artifact's controller equal to the number of Allies you control. -WWK U - -Tuktuk the Explorer -{2}{R} -Legendary Creature - Goblin -1/1 -Haste -When Tuktuk the Explorer dies, put a legendary 5/5 colorless Goblin Golem artifact creature token named Tuktuk the Returned onto the battlefield. -ROE R - -Tumble Magnet -{3} -Artifact -Tumble Magnet enters the battlefield with three charge counters on it. -{T}, Remove a charge counter from Tumble Magnet: Tap target artifact or creature. -SOM C - -Tundra -Land - Plains Island -LEA R, LEB R, 2ED R, 3ED R, ME2 R, ME4 R - -Tundra Kavu -{2}{R} -Creature - Kavu -2/2 -{T}: Target land becomes a Plains or an Island until end of turn. -APC C - -Tundra Wolves -{W} -Creature - Wolf -1/1 -First strike (This creature deals combat damage before creatures without first strike.) -LEG C, 4ED C, 5ED C, 6ED C, 8ED C, 10E C - -Tunnel -{R} -Instant -Destroy target Wall. It can't be regenerated. -LEA U, LEB U, 2ED U, 3ED U, 4ED U - -Tunnel Ignus -{1}{R} -Creature - Elemental -2/1 -Whenever a land enters the battlefield under an opponent's control, if that player had another land enter the battlefield under his or her control this turn, Tunnel Ignus deals 3 damage to that player. -SOM R - -Tunnel Vision -{5}{U} -Sorcery -Name a card. Target player reveals cards from the top of his or her library until the named card is revealed. If it is, that player puts the rest of the revealed cards into his or her graveyard and puts the named card on top of his or her library. Otherwise, the player shuffles his or her library. -RAV R - -Tunneler Wurm -{6}{G}{G} -Creature - Wurm -6/6 -Discard a card: Regenerate Tunneler Wurm. -JUD U - -Turbulent Dreams -{U}{U} -Sorcery -As an additional cost to cast Turbulent Dreams, discard X cards. -Return X target nonland permanents to their owners' hands. -TOR R - -Turf Wound -{2}{R} -Instant -Target player can't play land cards this turn. -Draw a card. -INV C - -Turn Aside -{U} -Instant -Counter target spell that targets a permanent you control. -SOM C - -Turn the Tables -{3}{W}{W} -Instant -All combat damage that would be dealt to you this turn is dealt to target attacking creature instead. -DST R - -Turn the Tide -{1}{U} -Instant -Creatures your opponents control get -2/-0 until end of turn. -MBS C - -Turn to Dust -{G} -Instant -Destroy target Equipment. Add {G} to your mana pool. -MRD C - -Turn to Frog -{1}{U} -Instant -Target creature loses all abilities and becomes a 1/1 blue Frog until end of turn. -M12 U - -Turn to Mist -{1}{W/U} -Instant -Exile target creature. Return that card to the battlefield under its owner's control at the beginning of the next end step. -SHM C - -Turn to Slag -{3}{R}{R} -Sorcery -Turn to Slag deals 5 damage to target creature. Destroy all Equipment attached to that creature. -SOM C - -Turnabout -{2}{U}{U} -Instant -Choose artifact, creature, or land. Tap all untapped permanents of the chosen type target player controls, or untap all tapped permanents of that type that player controls. -USG U - -Turntimber Basilisk -{1}{G}{G} -Creature - Basilisk -2/1 -Deathtouch (Any amount of damage this deals to a creature is enough to destroy it.) -Landfall - Whenever a land enters the battlefield under your control, you may have target creature block Turntimber Basilisk this turn if able. -ZEN U - -Turntimber Grove -Land -Turntimber Grove enters the battlefield tapped. -When Turntimber Grove enters the battlefield, target creature gets +1/+1 until end of turn. -{T}: Add {G} to your mana pool. -ZEN C - -Turntimber Ranger -{3}{G}{G} -Creature - Elf Scout Ally -2/2 -Whenever Turntimber Ranger or another Ally enters the battlefield under your control, you may put a 2/2 green Wolf creature token onto the battlefield. If you do, put a +1/+1 counter on Turntimber Ranger. -ZEN R - -Turri Island -Plane - Ir -Creature spells cost {2} less to cast. -Whenever you roll {C}, reveal the top three cards of your library. Put all creature cards revealed this way into your hand and the rest into your graveyard. -HOP C - -Turtleshell Changeling -{3}{U} -Creature - Shapeshifter -1/4 -Changeling (This card is every creature type at all times.) -{1}{U}: Switch Turtleshell Changeling's power and toughness until end of turn. -LRW U - -Twiddle -{U} -Instant -You may tap or untap target artifact, creature, or land. -LEA C, LEB C, 2ED C, 4ED C, 5ED C, 7ED C, 8ED C - -Twigwalker -{2}{G} -Creature - Insect -2/2 -{1}{G}, Sacrifice Twigwalker: Two target creatures each get +2/+2 until end of turn. -ODY U - -Twilight Drover -{2}{W} -Creature - Spirit -1/1 -Whenever a creature token leaves the battlefield, put a +1/+1 counter on Twilight Drover. -{2}{W}, Remove a +1/+1 counter from Twilight Drover: Put two 1/1 white Spirit creature tokens with flying onto the battlefield. -RAV R - -Twilight Mire -Land -{T}: Add {1} to your mana pool. -{B/G}, {T}: Add {B}{B}, {B}{G}, or {G}{G} to your mana pool. -EVE R - -Twilight Shepherd -{3}{W}{W}{W} -Creature - Angel -5/5 -Flying, vigilance -When Twilight Shepherd enters the battlefield, return to your hand all cards in your graveyard that were put there from the battlefield this turn. -Persist (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) -SHM R, DVD R - -Twilight's Call -{4}{B}{B} -Sorcery -You may cast Twilight's Call any time you could cast an instant if you pay {2} more to cast it. -Each player returns all creature cards from his or her graveyard to the battlefield. -INV R - -Twinblade Slasher -{G} -Creature - Elf Warrior -1/1 -Wither (This deals damage to creatures in the form of -1/-1 counters.) -{1}{G}: Twinblade Slasher gets +2/+2 until end of turn. Activate this ability only once each turn. -EVE U - -Twincast -{U}{U} -Instant -Copy target instant or sorcery spell. You may choose new targets for the copy. -SOK R, 10E R, M10 R - -Twinning Glass -{4} -Artifact -{1}, {T}: You may cast a nonland card from your hand without paying its mana cost if it has the same name as a spell that was cast this turn. -LRW R - -Twinstrike -{3}{B}{R} -Instant -Twinstrike deals 2 damage to each of two target creatures. -Hellbent - Destroy those creatures instead if you have no cards in hand. -DIS U - -Twist Allegiance -{6}{R} -Sorcery -You and target opponent each gain control of all creatures the other controls until end of turn. Untap those creatures. Those creatures gain haste until end of turn. -BOK R - -Twisted Abomination -{5}{B} -Creature - Zombie Mutant -5/3 -{B}: Regenerate Twisted Abomination. -Swampcycling {2} ({2}, Discard this card: Search your library for a Swamp card, reveal it, and put it into your hand. Then shuffle your library.) -SCG C, TSB S, GVL C, ARC C - -Twisted Experiment -{1}{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets +3/-1. -UDS C - -Twisted Image -{U} -Instant -Switch target creature's power and toughness until end of turn. -Draw a card. -SOM U - -Twisted Justice -{4}{U}{B} -Sorcery -Target player sacrifices a creature. You draw cards equal to that creature's power. -RAV U - -Twitch -{2}{U} -Instant -You may tap or untap target artifact, creature, or land. -Draw a card. -TMP C, 10E C, WWK C - -Two-Headed Dragon -{4}{R}{R} -Creature - Dragon -4/4 -Flying -{1}{R}: Two-Headed Dragon gets +2/+0 until end of turn. -Two-Headed Dragon can't be blocked except by two or more creatures. -Two-Headed Dragon can block an additional creature. -MMQ R, 8ED R, FVD R, ARC R - -Two-Headed Giant of Foriys -{4}{R} -Creature - Giant -4/4 -Trample -Two-Headed Giant of Foriys can block an additional creature. -LEA R, LEB R, 2ED R, ME4 U - -Two-Headed Giant of Foriys Avatar -Vanguard -Hand +1, life -4 -Each creature you control can block an additional creature each combat. -Each creature you control can't be blocked except by two or more creatures. -VG S - -Two-Headed Sliver -{1}{R} -Creature - Sliver -1/1 -All Sliver creatures have "This creature can't be blocked except by two or more creatures." -TSP C - -Typhoon -{2}{G} -Sorcery -Typhoon deals damage to each opponent equal to the number of Islands that player controls. -LEG R - -Tyrannize -{3}{B/R}{B/R} -Sorcery -Target player discards his or her hand unless he or she pays 7 life. -SHM R - -Tyrranax -{4}{G}{G} -Creature - Beast -5/4 -{1}{G}: Tyrranax gets -1/+1 until end of turn. -5DN C - -Uba Mask -{4} -Artifact -If a player would draw a card, that player exiles that card face up instead. -Each player may play cards he or she exiled with Uba Mask this turn. -CHK R - -Uktabi Drake -{G} -Creature - Drake -2/1 -Flying, haste -Echo {1}{G}{G} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -PLC C - -Uktabi Efreet -{2}{G}{G} -Creature - Efreet -5/4 -Cumulative upkeep {G} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -WTH C - -Uktabi Faerie -{1}{G} -Creature - Faerie -1/1 -Flying -{3}{G}, Sacrifice Uktabi Faerie: Destroy target artifact. -MIR C - -Uktabi Orangutan -{2}{G} -Creature - Ape -2/2 -When Uktabi Orangutan enters the battlefield, destroy target artifact. -VIS U, 6ED U - -Uktabi Wildcats -{4}{G} -Creature - Cat -*/* -Uktabi Wildcats's power and toughness are each equal to the number of Forests you control. -{G}, Sacrifice a Forest: Regenerate Uktabi Wildcats. -MIR R, 6ED R, 7ED R - -Ulamog's Crusher -{8} -Creature - Eldrazi -8/8 -Annihilator 2 (Whenever this creature attacks, defending player sacrifices two permanents.) -Ulamog's Crusher attacks each turn if able. -ROE C - -Ulamog, the Infinite Gyre -{11} -Legendary Creature - Eldrazi -10/10 -When you cast Ulamog, the Infinite Gyre, destroy target permanent. -Annihilator 4 (Whenever this creature attacks, defending player sacrifices four permanents.) -Ulamog is indestructible. -When Ulamog is put into a graveyard from anywhere, its owner shuffles his or her graveyard into his or her library. -ROE M - -Ulasht, the Hate Seed -{2}{R}{G} -Legendary Creature - Hellion Hydra -0/0 -Ulasht, the Hate Seed enters the battlefield with a +1/+1 counter on it for each other red creature you control and a +1/+1 counter on it for each other green creature you control. -{1}, Remove a +1/+1 counter from Ulasht: Choose one - Ulasht deals 1 damage to target creature; or put a 1/1 green Saproling creature token onto the battlefield. -GPT R - -Umara Raptor -{2}{U} -Creature - Bird Ally -1/1 -Flying -Whenever Umara Raptor or another Ally enters the battlefield under your control, you may put a +1/+1 counter on Umara Raptor. -ZEN C - -Umbilicus -{4} -Artifact -At the beginning of each player's upkeep, that player returns a permanent he or she controls to its owner's hand unless he or she pays 2 life. -USG R - -Umbra Mystic -{2}{W} -Creature - Human Wizard -2/2 -Auras attached to permanents you control have totem armor. (If an enchanted permanent you control would be destroyed, instead remove all damage from it and destroy an Aura attached to it.) -ROE R - -Umbra Stalker -{4}{B}{B}{B} -Creature - Elemental -*/* -Chroma - Umbra Stalker's power and toughness are each equal to the number of black mana symbols in the mana costs of cards in your graveyard. -EVE R - -Umbral Mantle -{3} -Artifact - Equipment -Equipped creature has "{3}, {Q}: This creature gets +2/+2 until end of turn." ({Q} is the untap symbol.) -Equip {0} -SHM U - -Umezawa's Jitte -{2} -Legendary Artifact - Equipment -Whenever equipped creature deals combat damage, put two charge counters on Umezawa's Jitte. -Remove a charge counter from Umezawa's Jitte: Choose one - Equipped creature gets +2/+2 until end of turn; or target creature gets -1/-1 until end of turn; or you gain 2 life. -Equip {2} -BOK R - -Unbender Tine -{2}{W}{U} -Artifact -{T}: Untap another target permanent. -ARB U, ARC U - -Unblinking Bleb -{3}{U} -Creature - Illusion -1/3 -Morph {2}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -Whenever Unblinking Bleb or another permanent is turned face up, you may scry 2. (To scry 2, look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) -FUT C - -Unburden -{1}{B}{B} -Sorcery -Target player discards two cards. -Cycling {2} ({2}, Discard this card: Draw a card.) -SCG C - -Unchecked Growth -{2}{G} -Instant - Arcane -Target creature gets +4/+4 until end of turn. If it's a Spirit, it gains trample until end of turn. -BOK U - -Uncle Istvan -{1}{B}{B}{B} -Creature - Human -1/3 -Prevent all damage that would be dealt to Uncle Istvan by creatures. -DRK U, 4ED U, TSB S - -Uncontrollable Anger -{2}{R}{R} -Enchantment - Aura -Flash (You may cast this spell any time you could cast an instant.) -Enchant creature (Target a creature as you cast this. This card enters the battlefield attached to that creature.) -Enchanted creature gets +2/+2 and attacks each turn if able. -CHK C, 10E C - -Uncontrolled Infestation -{1}{R} -Enchantment - Aura -Enchant nonbasic land -When enchanted land becomes tapped, destroy it. -SCG C - -Undead Gladiator -{1}{B}{B} -Creature - Zombie Barbarian -3/1 -{1}{B}, Discard a card: Return Undead Gladiator from your graveyard to your hand. Activate this ability only during your upkeep. -Cycling {1}{B} ({1}{B}, Discard this card: Draw a card.) -ONS R - -Undead Leotau -{5}{B} -Creature - Zombie Cat -3/4 -{R}: Undead Leotau gets +1/-1 until end of turn. -Unearth {2}{B} ({2}{B}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) -ALA C - -Undead Slayer -{2}{W} -Creature - Human Cleric -2/2 -{W}, {T}: Exile target Skeleton, Vampire, or Zombie. -M10 U - -Undead Warchief -{2}{B}{B} -Creature - Zombie -1/1 -Zombie spells you cast cost {1} less to cast. -Zombie creatures you control get +2/+1. -SCG U, TSB S, HOP U - -Undercity Reaches -Plane - Ravnica -Whenever a creature deals combat damage to a player, its controller may draw a card. -Whenever you roll {C}, you have no maximum hand size for the rest of the game. -HOP C - -Undercity Shade -{4}{B} -Creature - Shade -1/1 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -{B}: Undercity Shade gets +1/+1 until end of turn. -RAV U - -Underground River -Land -{T}: Add {1} to your mana pool. -{T}: Add {U} or {B} to your mana pool. Underground River deals 1 damage to you. -ICE R, 5ED R, 6ED R, 7ED R, 9ED R, 10E R - -Underground Sea -Land - Island Swamp -LEA R, LEB R, 2ED R, 3ED R, ME2 R, ME4 R - -Undergrowth -{G} -Instant -As an additional cost to cast Undergrowth, you may pay {2}{R}. -Prevent all combat damage that would be dealt this turn. If its additional cost was paid, Undergrowth doesn't affect combat damage that would be dealt by red creatures. -ALL C (x2) - -Undermine -{U}{U}{B} -Instant -Counter target spell. Its controller loses 3 life. -INV R - -Undertaker -{1}{B} -Creature - Human Spellshaper -1/1 -{B}, {T}, Discard a card: Return target creature card from your graveyard to your hand. -MMQ C, TSB S - -Undertow -{2}{U} -Enchantment -Creatures with islandwalk can be blocked as though they didn't have islandwalk. -LEG U - -Underworld Dreams -{B}{B}{B} -Enchantment -Whenever an opponent draws a card, Underworld Dreams deals 1 damage to him or her. -LEG U, 8ED R, 9ED R, 10E R, M10 R - -Undiscovered Paradise -Land -{T}: Add one mana of any color to your mana pool. During your next untap step, as you untap your permanents, return Undiscovered Paradise to its owner's hand. -VIS R - -Undo -{1}{U}{U} -Sorcery -Return two target creatures to their owners' hands. -VIS C, P02 U, S99 U - -Undying Beast -{3}{B} -Creature - Beast -3/2 -When Undying Beast dies, put it on top of its owner's library. -POR C - -Undying Flames -{4}{R}{R} -Sorcery -Exile cards from the top of your library until you exile a nonland card. Undying Flames deals damage to target creature or player equal to that card's converted mana cost. -Epic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability. You may choose a new target for the copy.) -SOK R - -Undying Rage -{2}{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2 and can't block. -When Undying Rage is put into a graveyard from the battlefield, return Undying Rage to its owner's hand. -TSP U - -Unearth -{B} -Sorcery -Return target creature card with converted mana cost 3 or less from your graveyard to the battlefield. -Cycling {2} ({2}, Discard this card: Draw a card.) -ULG C - -Unearthly Blizzard -{2}{R} -Sorcery - Arcane -Up to three target creatures can't block this turn. -CHK C - -Unerring Sling -{3} -Artifact -{3}, {T}, Tap an untapped creature you control: Unerring Sling deals damage equal to the tapped creature's power to target attacking or blocking creature with flying. -MIR U - -Unforge -{2}{R} -Instant -Destroy target Equipment. If that Equipment was attached to a creature, Unforge deals 2 damage to that creature. -DST C - -Unfulfilled Desires -{1}{U}{B} -Enchantment -{1}, Pay 1 life: Draw a card, then discard a card. -MIR R - -Unhinge -{2}{B} -Sorcery -Target player discards a card. -Draw a card. -TOR C - -Unholy Citadel -Land -Black legendary creatures you control have "bands with other legendary creatures." (Any legendary creatures can attack in a band as long as at least one has "bands with other legendary creatures." Bands are blocked as a group. If at least two legendary creatures you control, one of which has "bands with other legendary creatures," are blocking or being blocked by the same creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -LEG U - -Unholy Grotto -Land -{T}: Add {1} to your mana pool. -{B}, {T}: Put target Zombie card from your graveyard on top of your library. -ONS R - -Unholy Strength -{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+1. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, 7ED C, 8ED C, 9ED C, 10E C, DVD C, M10 C, M11 C - -Unified Strike -{W} -Instant -Exile target attacking creature if its power is less than or equal to the number of Soldiers on the battlefield. -ONS C - -Unified Will -{1}{U} -Instant -Counter target spell if you control more creatures than that spell's controller. -ROE U - -Unifying Theory -{1}{U} -Enchantment -Whenever a player casts a spell, that player may pay {2}. If the player does, he or she draws a card. -ODY R - -Unlikely Alliance -{1}{W} -Enchantment -{1}{W}: Target nonattacking, nonblocking creature gets +0/+2 until end of turn. -ALL U - -Unliving Psychopath -{2}{B}{B} -Creature - Zombie Assassin -0/4 -{B}: Unliving Psychopath gets +1/-1 until end of turn. -{B}, {T}: Destroy target creature with power less than Unliving Psychopath's power. -DIS R - -Unmake -{W/B}{W/B}{W/B} -Instant -Exile target creature. -EVE C, ARC C - -Unmask -{3}{B} -Sorcery -You may exile a black card from your hand rather than pay Unmask's mana cost. -Target player reveals his or her hand. You choose a nonland card from it. That player discards that card. -MMQ R - -Unnatural Hunger -{3}{B}{B} -Enchantment - Aura -Enchant creature -At the beginning of the upkeep of enchanted creature's controller, Unnatural Hunger deals damage to that player equal to that creature's power unless he or she sacrifices another creature. -MMQ R - -Unnatural Predation -{G} -Instant -Target creature gets +1/+1 and gains trample until end of turn. -MBS C - -Unnatural Selection -{1}{U} -Enchantment -{1}: Choose a creature type other than Wall. Target creature becomes that type until end of turn. -APC R - -Unnatural Speed -{R} -Instant - Arcane -Target creature gains haste until end of turn. -CHK C - -Unnerve -{3}{B} -Sorcery -Each opponent discards two cards. -USG C, BRB C, COM C - -Unnerving Assault -{2}{U/R} -Instant -Creatures your opponents control get -1/-0 until end of turn if {U} was spent to cast Unnerving Assault, and creatures you control get +1/+0 until end of turn if {R} was spent to cast it. (Do both if {U}{R} was spent.) -EVE U - -Unquestioned Authority -{2}{W} -Enchantment - Aura -Enchant creature -When Unquestioned Authority enters the battlefield, draw a card. -Enchanted creature has protection from creatures. -JUD U - -Unscythe, Killer of Kings -{U}{B}{B}{R} -Legendary Artifact - Equipment -Equipped creature gets +3/+3 and has first strike. -Whenever a creature dealt damage by equipped creature this turn dies, you may exile that card. If you do, put a 2/2 black Zombie creature token onto the battlefield. -Equip {2} -ARB R - -Unseen Walker -{1}{G} -Creature - Dryad -1/1 -Forestwalk -{1}{G}{G}: Target creature gains forestwalk until end of turn. -MIR U, 6ED U - -Unspeakable Symbol -{1}{B}{B} -Enchantment -Pay 3 life: Put a +1/+1 counter on target creature. -SCG U - -Unstable Footing -{R} -Instant -Kicker {3}{R} (You may pay an additional {3}{R} as you cast this spell.) -Damage can't be prevented this turn. If Unstable Footing was kicked, it deals 5 damage to target player. -ZEN U - -Unstable Frontier -Land -{T}: Add {1} to your mana pool. -{T}: Target land you control becomes the basic land type of your choice until end of turn. -CON U - -Unstable Hulk -{1}{R}{R} -Creature - Goblin Mutant -2/2 -Morph {3}{R}{R} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Unstable Hulk is turned face up, it gets +6/+6 and gains trample until end of turn. You skip your next turn. -LGN R - -Unstable Mutation -{U} -Enchantment - Aura -Enchant creature -Enchanted creature gets +3/+3. -At the beginning of the upkeep of enchanted creature's controller, put a -1/-1 counter on that creature. -ARN C, 3ED C, 4ED C, 5ED C, TSB S - -Unstable Shapeshifter -{3}{U} -Creature - Shapeshifter -0/1 -Whenever another creature enters the battlefield, Unstable Shapeshifter becomes a copy of that creature and gains this ability. -TMP R - -Unstoppable Ash -{3}{G} -Creature - Treefolk Warrior -5/5 -Trample -Champion a Treefolk or Warrior (When this enters the battlefield, sacrifice it unless you exile another Treefolk or Warrior you control. When this leaves the battlefield, that card returns to the battlefield.) -Whenever a creature you control becomes blocked, it gets +0/+5 until end of turn. -MOR R - -Unsummon -{U} -Instant -Return target creature to its owner's hand. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, 6ED C, 7ED C, 8ED C, 10E C, CON C, M10 C, M11 C, M12 C - -Untaidake, the Cloud Keeper -Legendary Land -Untaidake, the Cloud Keeper enters the battlefield tapped. -{T}, Pay 2 life: Add {2} to your mana pool. Spend this mana only to cast legendary spells. -CHK R - -Untamed Might -{X}{G} -Instant -Target creature gets +X/+X until end of turn. -SOM C - -Untamed Wilds -{2}{G} -Sorcery -Search your library for a basic land card and put that card onto the battlefield. Then shuffle your library. -LEG U, 4ED U, 5ED U, POR U, P02 U, 6ED U, S99 U, 7ED U - -Unwilling Recruit -{X}{R}{R}{R} -Sorcery -Gain control of target creature until end of turn. Untap that creature. It gets +X/+0 and gains haste until end of turn. -EVE U - -Unwinding Clock -{4} -Artifact -Untap all artifacts you control during each other player's untap step. -NPH R - -Unworthy Dead -{1}{B} -Creature - Skeleton -1/1 -{B}: Regenerate Unworthy Dead. -USG C - -Unyaro Bee Sting -{3}{G} -Sorcery -Unyaro Bee Sting deals 2 damage to target creature or player. -MIR U - -Unyaro Bees -{G}{G}{G} -Creature - Insect -0/1 -Flying -{G}: Unyaro Bees gets +1/+1 until end of turn. -{3}{G}, Sacrifice Unyaro Bees: Unyaro Bees deals 2 damage to target creature or player. -TSP R - -Unyaro Griffin -{3}{W} -Creature - Griffin -2/2 -Flying -Sacrifice Unyaro Griffin: Counter target red instant or sorcery spell. -MIR U, 6ED U - -Updraft -{1}{U} -Instant -Target creature gains flying until end of turn. -Draw a card at the beginning of the next turn's upkeep. -ICE U, 5ED C - -Upheaval -{4}{U}{U} -Sorcery -Return all permanents to their owners' hands. -ODY R - -Uphill Battle -{2}{R} -Enchantment -Creatures played by your opponents enter the battlefield tapped. -MMQ U - -Uproot -{3}{G} -Sorcery - Arcane -Put target land on top of its owner's library. -BOK C - -Upwelling -{3}{G} -Enchantment -Mana pools don't empty as steps and phases end. -SCG R, 10E R - -Ur-Drago -{3}{U}{U}{B}{B} -Legendary Creature - Elemental -4/4 -First strike -Creatures with swampwalk can be blocked as though they didn't have swampwalk. -LEG R - -Ur-Golem's Eye -{4} -Artifact -{T}: Add {2} to your mana pool. -DST C, 9ED U - -Urabrask the Hidden -{3}{R}{R} -Legendary Creature - Praetor -4/4 -Creatures you control have haste. -Creatures your opponents control enter the battlefield tapped. -NPH M - -Urborg -Legendary Land -{T}: Add {B} to your mana pool. -{T}: Target creature loses first strike or swampwalk until end of turn. -LEG U, ME3 U - -Urborg Drake -{1}{U}{B} -Creature - Drake -2/3 -Flying -Urborg Drake attacks each turn if able. -INV U - -Urborg Elf -{1}{G} -Creature - Elf Druid -1/1 -{T}: Add {G}, {U}, or {B} to your mana pool. -APC C - -Urborg Emissary -{2}{B} -Creature - Human Wizard -3/1 -Kicker {1}{U} (You may pay an additional {1}{U} as you cast this spell.) -When Urborg Emissary enters the battlefield, if it was kicked, return target permanent to its owner's hand. -INV U - -Urborg Justice -{B}{B} -Instant -Target opponent sacrifices a creature for each creature put into your graveyard from the battlefield this turn. -WTH R - -Urborg Mindsucker -{2}{B} -Creature - Horror -2/2 -{B}, Sacrifice Urborg Mindsucker: Target opponent discards a card at random. Activate this ability only any time you could cast a sorcery. -VIS C - -Urborg Panther -{2}{B} -Creature - Nightstalker Cat -2/2 -{B}, Sacrifice Urborg Panther: Destroy target creature blocking Urborg Panther. -Sacrifice a creature named Feral Shadow, a creature named Breathstealer, and Urborg Panther: Search your library for a card named Spirit of the Night and put that card onto the battlefield. Then shuffle your library. -MIR C - -Urborg Phantom -{2}{B} -Creature - Spirit Minion -3/1 -Urborg Phantom can't block. -{U}: Prevent all combat damage that would be dealt to and dealt by Urborg Phantom this turn. -INV C - -Urborg Shambler -{2}{B}{B} -Creature - Horror -4/3 -Other black creatures get -1/-1. -INV U - -Urborg Skeleton -{B} -Creature - Skeleton -0/1 -Kicker {3} (You may pay an additional {3} as you cast this spell.) -{B}: Regenerate Urborg Skeleton. -If Urborg Skeleton was kicked, it enters the battlefield with a +1/+1 counter on it. -INV C - -Urborg Stalker -{3}{B} -Creature - Horror -2/4 -At the beginning of each player's upkeep, if that player controls a nonblack, nonland permanent, Urborg Stalker deals 1 damage to that player. -WTH R - -Urborg Syphon-Mage -{2}{B} -Creature - Human Spellshaper -2/2 -{2}{B}, {T}, Discard a card: Each other player loses 2 life. You gain life equal to the life lost this way. -TSP C, GVL C, ARC C - -Urborg Uprising -{4}{B} -Sorcery -Return up to two target creature cards from your graveyard to your hand. -Draw a card. -APC C - -Urborg Volcano -Land -Urborg Volcano enters the battlefield tapped. -{T}: Add {B} or {R} to your mana pool. -INV U, 8ED U - -Urborg, Tomb of Yawgmoth -Legendary Land -Each land is a Swamp in addition to its other land types. -PLC R - -Urge to Feed -{B}{B} -Instant -Target creature gets -3/-3 until end of turn. You may tap any number of untapped Vampire creatures you control. If you do, put a +1/+1 counter on each of those Vampires. -WWK U - -Uril, the Miststalker -{2}{R}{G}{W} -Legendary Creature - Beast -5/5 -Hexproof (This creature can't be the target of spells or abilities your opponents control.) -Uril, the Miststalker gets +2/+2 for each Aura attached to it. -ARB M - -Ursapine -{3}{G}{G} -Creature - Beast -3/3 -{G}: Target creature gets +1/+1 until end of turn. -RAV R - -Ursine Fylgja -{4}{W} -Creature - Spirit Bear -3/3 -Ursine Fylgja enters the battlefield with four healing counters on it. -Remove a healing counter from Ursine Fylgja: Prevent the next 1 damage that would be dealt to Ursine Fylgja this turn. -{2}{W}: Put a healing counter on Ursine Fylgja. -CSP U - -Urza -Vanguard -Hand -1, life +10 -{3}: Urza deals 1 damage to target creature or player. -VG S - -Urza's Armor -{6} -Artifact -If a source would deal damage to you, prevent 1 of that damage. -USG U, 8ED R - -Urza's Avenger -{6} -Artifact Creature - Shapeshifter -4/4 -{0}: Urza's Avenger gets -1/-1 and gains your choice of banding, flying, first strike, or trample until end of turn. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -ATQ R, 4ED R, 5ED R - -Urza's Bauble -{0} -Artifact -{T}, Sacrifice Urza's Bauble: Look at a card at random in target player's hand. You draw a card at the beginning of the next turn's upkeep. -ICE U, 5ED U, MED U - -Urza's Blueprints -{6} -Artifact -Echo {6} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -{T}: Draw a card. -ULG R - -Urza's Chalice -{1} -Artifact -Whenever a player casts an artifact spell, you may pay {1}. If you do, you gain 1 life. -ATQ C, MED C, ME4 C - -Urza's Engine -{5} -Artifact Creature - Juggernaut -1/5 -Trample -{3}: Urza's Engine gains banding until end of turn. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -{3}: Attacking creatures banded with Urza's Engine gain trample until end of turn. -ALL U - -Urza's Factory -Land - Urza's -{T}: Add {1} to your mana pool. -{7}, {T}: Put a 2/2 colorless Assembly-Worker artifact creature token onto the battlefield. -TSP U - -Urza's Filter -{4} -Artifact -Multicolored spells cost up to {2} less to cast. -INV R - -Urza's Guilt -{2}{U}{B} -Sorcery -Each player draws two cards, then discards three cards, then loses 4 life. -PLS R - -Urza's Incubator -{3} -Artifact -As Urza's Incubator enters the battlefield, choose a creature type. -Creature spells of the chosen type cost {2} less to cast. -UDS R - -Urza's Mine -Land - Urza's Mine -{T}: Add {1} to your mana pool. If you control an Urza's Power-Plant and an Urza's Tower, add {2} to your mana pool instead. -ATQ U (x2), ATQ C (x2), CHR U (x4), 5ED C, 8ED U, 9ED U, ME4 L (x4) - -Urza's Miter -{3} -Artifact -Whenever an artifact you control is put into a graveyard from the battlefield, if it wasn't sacrificed, you may pay {3}. If you do, draw a card. -ATQ R, ME4 R - -Urza's Power Plant -Land - Urza's Power-Plant -{T}: Add {1} to your mana pool. If you control an Urza's Mine and an Urza's Tower, add {2} to your mana pool instead. -ATQ U (x2), ATQ C (x2), CHR U (x4), 5ED C, 8ED U, 9ED U, ME4 L (x4) - -Urza's Rage -{2}{R} -Instant -Kicker {8}{R} (You may pay an additional {8}{R} as you cast this spell.) -Urza's Rage can't be countered by spells or abilities. -Urza's Rage deals 3 damage to target creature or player. If Urza's Rage was kicked, instead it deals 10 damage to that creature or player and the damage can't be prevented. -INV R, PVC M - -Urza's Tower -Land - Urza's Tower -{T}: Add {1} to your mana pool. If you control an Urza's Mine and an Urza's Power-Plant, add {3} to your mana pool instead. -ATQ U (x3), ATQ C, CHR U (x4), 5ED C, 8ED U, 9ED U, ME4 L (x4) - -Uthden Troll -{2}{R} -Creature - Troll -2/2 -{R}: Regenerate Uthden Troll. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, BRB U, TSB S - -Utopia Mycon -{G} -Creature - Fungus -0/2 -At the beginning of your upkeep, put a spore counter on Utopia Mycon. -Remove three spore counters from Utopia Mycon: Put a 1/1 green Saproling creature token onto the battlefield. -Sacrifice a Saproling: Add one mana of any color to your mana pool. -FUT U - -Utopia Sprawl -{G} -Enchantment - Aura -Enchant Forest -As Utopia Sprawl enters the battlefield, choose a color. -Whenever enchanted Forest is tapped for mana, its controller adds one mana of the chosen color to his or her mana pool (in addition to the mana the land produces). -DIS C - -Utopia Tree -{1}{G} -Creature - Plant -0/2 -{T}: Add one mana of any color to your mana pool. -INV R, 9ED R - -Utopia Vow -{1}{G} -Enchantment - Aura -Enchant creature -Enchanted creature can't attack or block. -Enchanted creature has "{T}: Add one mana of any color to your mana pool." -PLC C - -Utvara Scalper -{1}{R} -Creature - Goblin Scout -1/2 -Flying -Utvara Scalper attacks each turn if able. -DIS C - -Uyo, Silent Prophet -{4}{U}{U} -Legendary Creature - Moonfolk Wizard -4/4 -Flying -{2}, Return two lands you control to their owner's hand: Copy target instant or sorcery spell. You may choose new targets for the copy. -CHK R - -Vacuumelt -{2}{U} -Sorcery -Replicate {2}{U} (When you cast this spell, copy it for each time you paid its replicate cost. You may choose new targets for the copies.) -Return target creature to its owner's hand. -GPT U - -Vaevictis Asmadi -{2}{B}{B}{R}{R}{G}{G} -Legendary Creature - Elder Dragon -7/7 -Flying -At the beginning of your upkeep, sacrifice Vaevictis Asmadi unless you pay {B}{R}{G}. -{B}: Vaevictis Asmadi gets +1/+0 until end of turn. -{R}: Vaevictis Asmadi gets +1/+0 until end of turn. -{G}: Vaevictis Asmadi gets +1/+0 until end of turn. -LEG R, CHR R, ME3 R - -Vagrant Plowbeasts -{5}{G}{W} -Creature - Beast -6/6 -{1}: Regenerate target creature with power 5 or greater. -CON U - -Valakut Fireboar -{4}{R} -Creature - Elemental Boar -1/7 -Whenever Valakut Fireboar attacks, switch its power and toughness until end of turn. -ROE U - -Valakut, the Molten Pinnacle -Land -Valakut, the Molten Pinnacle enters the battlefield tapped. -Whenever a Mountain enters the battlefield under your control, if you control at least five other Mountains, you may have Valakut, the Molten Pinnacle deal 3 damage to target creature or player. -{T}: Add {R} to your mana pool. -ZEN R - -Valeron Outlander -{G}{W} -Creature - Human Scout -2/2 -Protection from black -CON C - -Valiant Guard -{W} -Creature - Human Soldier -0/3 -CON C - -Valley Rannet -{4}{R}{G} -Creature - Beast -6/3 -Mountaincycling {2}, forestcycling {2} ({2}, Discard this card: Search your library for a Mountain or Forest card, reveal it, and put it into your hand. Then shuffle your library.) -ARB C, COM C - -Valleymaker -{5}{R/G} -Creature - Giant Shaman -5/5 -{T}, Sacrifice a Mountain: Valleymaker deals 3 damage to target creature. -{T}, Sacrifice a Forest: Choose a player. That player adds {G}{G}{G} to his or her mana pool. -SHM R - -Valor -{3}{W} -Creature - Incarnation -2/2 -First strike -As long as Valor is in your graveyard and you control a Plains, creatures you control have first strike. -JUD U, TSB S - -Valor Made Real -{W} -Instant -Target creature can block any number of creatures this turn. -DIS C - -Valorous Charge -{1}{W}{W} -Sorcery -White creatures get +2/+0 until end of turn. -POR U - -Vampire Aristocrat -{2}{B} -Creature - Vampire Rogue -2/2 -Sacrifice a creature: Vampire Aristocrat gets +2/+2 until end of turn. -M10 C - -Vampire Bats -{B} -Creature - Bat -0/1 -Flying (This creature can't be blocked except by creatures with flying or reach.) -{B}: Vampire Bats gets +1/+0 until end of turn. Activate this ability no more than twice each turn. -LEG C, 4ED C, 5ED C, 10E C, GVL C - -Vampire Hexmage -{B}{B} -Creature - Vampire Shaman -2/1 -First strike -Sacrifice Vampire Hexmage: Remove all counters from target permanent. -ZEN U - -Vampire Hounds -{2}{B} -Creature - Vampire Hound -2/2 -Discard a creature card: Vampire Hounds gets +2/+2 until end of turn. -EXO C - -Vampire Lacerator -{B} -Creature - Vampire Warrior -2/2 -At the beginning of your upkeep, you lose 1 life unless an opponent has 10 or less life. -ZEN C - -Vampire Nighthawk -{1}{B}{B} -Creature - Vampire Shaman -2/3 -Flying -Deathtouch (Any amount of damage this deals to a creature is enough to destroy it.) -Lifelink (Damage dealt by this creature also causes you to gain that much life.) -ZEN U, COM U - -Vampire Nocturnus -{1}{B}{B}{B} -Creature - Vampire -3/3 -Play with the top card of your library revealed. -As long as the top card of your library is black, Vampire Nocturnus and other Vampire creatures you control get +2/+1 and have flying. -M10 M - -Vampire Nocturnus Avatar -Vanguard -Hand -1, life -2 -Play with the top card of your library revealed. -As long as the top card of your library is black, black creatures you control get +2/+1. -VG S - -Vampire Outcasts -{2}{B}{B} -Creature - Vampire -2/2 -Bloodthirst 2 (If an opponent was dealt damage this turn, this creature enters the battlefield with two +1/+1 counters on it.) -Lifelink (Damage dealt by this creature also causes you to gain that much life.) -M12 U - -Vampire's Bite -{B} -Instant -Kicker {2}{B} (You may pay an additional {2}{B} as you cast this spell.) -Target creature gets +3/+0 until end of turn. If Vampire's Bite was kicked, that creature gains lifelink until end of turn. (Damage dealt by the creature also causes its controller to gain that much life.) -ZEN C - -Vampiric Dragon -{6}{B}{R} -Creature - Vampire Dragon -5/5 -Flying -Whenever a creature dealt damage by Vampiric Dragon this turn dies, put a +1/+1 counter on Vampiric Dragon. -{1}{R}: Vampiric Dragon deals 1 damage to target creature. -ODY R, ARC R - -Vampiric Embrace -{2}{B}{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2 and has flying. -Whenever a creature dealt damage by enchanted creature this turn dies, put a +1/+1 counter on that creature. -USG U - -Vampiric Feast -{5}{B}{B} -Sorcery -Vampiric Feast deals 4 damage to target creature or player and you gain 4 life. -POR U - -Vampiric Link -{B} -Enchantment - Aura -Enchant creature -Whenever enchanted creature deals damage, you gain that much life. -PLC C - -Vampiric Sliver -{3}{B} -Creature - Sliver -3/3 -All Sliver creatures have "Whenever a creature dealt damage by this creature this turn dies, put a +1/+1 counter on this creature." -TSP U - -Vampiric Spirit -{2}{B}{B} -Creature - Spirit -4/3 -Flying -When Vampiric Spirit enters the battlefield, you lose 4 life. -P02 R, 8ED R - -Vampiric Touch -{2}{B} -Sorcery -Vampiric Touch deals 2 damage to target opponent and you gain 2 life. -POR C - -Vampiric Tutor -{B} -Instant -Search your library for a card, then shuffle your library and put that card on top of it. You lose 2 life. -VIS R, 6ED R - -Vampirism -{1}{B} -Enchantment - Aura -Enchant creature -When Vampirism enters the battlefield, draw a card at the beginning of the next turn's upkeep. -Enchanted creature gets +1/+1 for each other creature you control. -Other creatures you control get -1/-1. -VIS U - -Vanish into Memory -{2}{W}{U} -Instant -Exile target creature. You draw cards equal to that creature's power. At the beginning of your next upkeep, return that card to the battlefield under its owner's control. If you do, discard cards equal to its toughness. -CSP U - -Vanishing -{U} -Enchantment - Aura -Enchant creature -{U}{U}: Enchanted creature phases out. (While it's phased out, it's treated as though it doesn't exist. It phases in before its controller untaps during his or her next untap step.) -VIS C - -Vanquish -{2}{W} -Instant -Destroy target blocking creature. -5DN U - -Vapor Snag -{U} -Instant -Return target creature to its owner's hand. Its controller loses 1 life. -NPH C - -Vapor Snare -{4}{U} -Enchantment - Aura -Enchant creature -You control enchanted creature. -At the beginning of your upkeep, sacrifice Vapor Snare unless you return a land you control to its owner's hand. -WWK U - -Vaporous Djinn -{2}{U}{U} -Creature - Djinn -3/4 -Flying -At the beginning of your upkeep, Vaporous Djinn phases out unless you pay {U}{U}. (While it's phased out, it's treated as though it doesn't exist. It phases in before you untap during your next untap step.) -MIR U - -Varchild's Crusader -{3}{R} -Creature - Human Knight -3/2 -{0}: Varchild's Crusader can't be blocked this turn except by Walls. Sacrifice Varchild's Crusader at the beginning of the next end step. -ALL C (x2), ME2 C - -Varchild's War-Riders -{1}{R} -Creature - Human Warrior -3/4 -Cumulative upkeep-Put a 1/1 red Survivor creature token onto the battlefield under an opponent's control. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -Trample; rampage 1 (Whenever this creature becomes blocked, it gets +1/+1 until end of turn for each creature blocking it beyond the first.) -ALL R, MED R - -Vassal's Duty -{3}{W} -Enchantment -{1}: The next 1 damage that would be dealt to target legendary creature you control this turn is dealt to you instead. -CHK R - -Vastwood Animist -{2}{G} -Creature - Elf Shaman Ally -1/1 -{T}: Target land you control becomes an X/X Elemental creature until end of turn, where X is the number of Allies you control. It's still a land. -WWK U - -Vastwood Gorger -{5}{G} -Creature - Wurm -5/6 -ZEN C, M12 C - -Vastwood Zendikon -{4}{G} -Enchantment - Aura -Enchant land -Enchanted land is a 6/4 green Elemental creature. It's still a land. -When enchanted land dies, return that card to its owner's hand. -WWK C - -Vault Skirge -{1}{B/P} -Artifact Creature - Imp -1/1 -({B/P} can be paid with either {B} or 2 life.) -Flying -Lifelink (Damage dealt by this creature also causes you to gain that much life.) -NPH C - -Vault Skyward -{U} -Instant -Target creature gains flying until end of turn. Untap it. -SOM C - -Vault of Whispers -Artifact Land -(Vault of Whispers isn't a spell.) -{T}: Add {B} to your mana pool. -MRD C, HOP C - -Vebulid -{B} -Creature - Horror -0/0 -Vebulid enters the battlefield with a +1/+1 counter on it. -At the beginning of your upkeep, you may put a +1/+1 counter on Vebulid. -When Vebulid attacks or blocks, destroy it at end of combat. -USG R - -Vec Townships -Land -{T}: Add {1} to your mana pool. -{T}: Add {G} or {W} to your mana pool. Vec Townships doesn't untap during your next untap step. -TMP U, BRB U - -Vectis Agents -{3}{U}{B} -Artifact Creature - Human Rogue -4/3 -{U}{B}: Vectis Agents gets -2/-0 until end of turn and is unblockable this turn. -CON C - -Vectis Dominator -{1}{W}{B} -Artifact Creature - Human Wizard -0/2 -{T}: Tap target creature unless its controller pays 2 life. -ARB C - -Vectis Silencers -{2}{U} -Artifact Creature - Human Rogue -1/2 -{2}{B}: Vectis Silencers gains deathtouch until end of turn. (Any amount of damage it deals to a creature is enough to destroy that creature.) -ALA C - -Vector Asp -{1} -Artifact Creature - Snake -1/1 -{B}: Vector Asp gains infect until end of turn. (It deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -SOM C - -Vedalken AEthermage -{1}{U} -Creature - Vedalken Wizard -1/2 -Flash (You may cast this spell any time you could cast an instant.) -When Vedalken AEthermage enters the battlefield, return target Sliver to its owner's hand. -Wizardcycling {3} ({3}, Discard this card: Search your library for a Wizard card, reveal it, and put it into your hand. Then shuffle your library.) -FUT C - -Vedalken Anatomist -{2}{U} -Creature - Vedalken Wizard -1/2 -{2}{U}, {T}: Put a -1/-1 counter on target creature. You may tap or untap that creature. -MBS U - -Vedalken Archmage -{2}{U}{U} -Creature - Vedalken Wizard -0/2 -Whenever you cast an artifact spell, draw a card. -MRD R - -Vedalken Certarch -{U} -Creature - Vedalken Wizard -1/1 -Metalcraft - {T}: Tap target artifact, creature, or land. Activate this ability only if you control three or more artifacts. -SOM C - -Vedalken Dismisser -{5}{U} -Creature - Vedalken Wizard -2/2 -When Vedalken Dismisser enters the battlefield, put target creature on top of its owner's library. -RAV C - -Vedalken Engineer -{1}{U} -Creature - Vedalken Artificer -1/1 -{T}: Add two mana of any one color to your mana pool. Spend this mana only to cast artifact spells or activate abilities of artifacts. -DST C, HOP C - -Vedalken Entrancer -{3}{U} -Creature - Vedalken Wizard -1/4 -{U}, {T}: Target player puts the top two cards of his or her library into his or her graveyard. -RAV C - -Vedalken Ghoul -{U}{B} -Creature - Vedalken Zombie -1/1 -Whenever Vedalken Ghoul becomes blocked, defending player loses 4 life. -ARB C - -Vedalken Heretic -{G}{U} -Creature - Vedalken Rogue -1/1 -Whenever Vedalken Heretic deals damage to an opponent, you may draw a card. -ARB R - -Vedalken Infuser -{3}{U} -Creature - Vedalken Wizard -1/4 -At the beginning of your upkeep, you may put a charge counter on target artifact. -MBS U - -Vedalken Mastermind -{U}{U} -Creature - Vedalken Wizard -1/2 -{U}, {T}: Return target permanent you control to its owner's hand. -5DN U, 10E U - -Vedalken Orrery -{4} -Artifact -You may cast nonland cards as though they had flash. -5DN R - -Vedalken Outlander -{W}{U} -Artifact Creature - Vedalken Scout -2/2 -Protection from red -CON C - -Vedalken Plotter -{2}{U} -Creature - Vedalken Wizard -1/1 -When Vedalken Plotter enters the battlefield, exchange control of target land you control and target land an opponent controls. -GPT U, COM U - -Vedalken Shackles -{3} -Artifact -You may choose not to untap Vedalken Shackles during your untap step. -{2}, {T}: Gain control of target creature with power less than or equal to the number of Islands you control for as long as Vedalken Shackles remains tapped. -5DN R - -Veil of Birds -{U} -Enchantment -When an opponent casts a spell, if Veil of Birds is an enchantment, Veil of Birds becomes a 1/1 Bird creature with flying. -USG C - -Veil of Secrecy -{1}{U} -Instant - Arcane -Target creature gains shroud until end of turn and is unblockable this turn. -Splice onto Arcane-Return a blue creature you control to its owner's hand. (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -BOK C - -Veiled Apparition -{1}{U} -Enchantment -When an opponent casts a spell, if Veiled Apparition is an enchantment, Veiled Apparition becomes a 3/3 Illusion creature with flying and "At the beginning of your upkeep, sacrifice Veiled Apparition unless you pay {1}{U}." -USG U - -Veiled Crocodile -{2}{U} -Enchantment -When a player has no cards in hand, if Veiled Crocodile is an enchantment, Veiled Crocodile becomes a 4/4 Crocodile creature. -USG R - -Veiled Sentry -{U} -Enchantment -When an opponent casts a spell, if Veiled Sentry is an enchantment, Veiled Sentry becomes an Illusion creature with power and toughness each equal to that spell's converted mana cost. -USG U - -Veiled Serpent -{2}{U} -Enchantment -When an opponent casts a spell, if Veiled Serpent is an enchantment, Veiled Serpent becomes a 4/4 Serpent creature that can't attack unless defending player controls an Island. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG C - -Veiling Oddity -{3}{U} -Creature - Illusion -2/3 -Suspend 4-{1}{U} (Rather than cast this card from your hand, you may pay {1}{U} and exile it with four time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -When the last time counter is removed from Veiling Oddity while it's exiled, creatures are unblockable this turn. -PLC C - -Veilstone Amulet -{3} -Artifact -Whenever you cast a spell, creatures you control can't be the targets of spells or abilities your opponents control this turn. -FUT R - -Vein Drinker -{4}{B}{B} -Creature - Vampire -4/4 -Flying -{R}, {T}: Vein Drinker deals damage equal to its power to target creature. That creature deals damage equal to its power to Vein Drinker. -Whenever a creature dealt damage by Vein Drinker this turn dies, put a +1/+1 counter on Vein Drinker. -ALA R - -Veinfire Borderpost -{1}{B}{R} -Artifact -You may pay {1} and return a basic land you control to its owner's hand rather than pay Veinfire Borderpost's mana cost. -Veinfire Borderpost enters the battlefield tapped. -{T}: Add {B} or {R} to your mana pool. -ARB C - -Veldrane of Sengir -{5}{B}{B} -Legendary Creature - Human Rogue -5/5 -{1}{B}{B}: Veldrane of Sengir gets -3/-0 and gains forestwalk until end of turn. -HML R - -Veldt -Land -Veldt doesn't untap during your untap step if it has a depletion counter on it. -At the beginning of your upkeep, remove a depletion counter from Veldt. -{T}: Add {G} or {W} to your mana pool. Put a depletion counter on Veldt. -ICE R - -Velican Dragon -{5}{R}{R} -Creature - Dragon -5/5 -Flying -Whenever Velican Dragon becomes blocked, it gets +X/+0 until end of turn, where X is a number chosen at random from 0 to 5. -SDC S - -Velis Vel -Plane - Lorwyn -Each creature gets +1/+1 for each other creature on the battlefield that shares at least one creature type with it. (For example, if two Elemental Shamans and an Elemental Spirit are on the battlefield, each gets +2/+2.) -Whenever you roll {C}, target creature gains all creature types until end of turn. -HOP C - -Venarian Glimmer -{X}{U} -Instant -Target player reveals his or her hand. You choose a nonland card with converted mana cost X or less from it. That player discards that card. -PLC U - -Venarian Gold -{X}{U}{U} -Enchantment - Aura -Enchant creature -When Venarian Gold enters the battlefield, tap enchanted creature and put X sleep counters on it. -Enchanted creature doesn't untap during its controller's untap step if it has a sleep counter on it. -At the beginning of the upkeep of enchanted creature's controller, remove a sleep counter from that creature. -LEG C - -Vendetta -{B} -Instant -Destroy target nonblack creature. It can't be regenerated. You lose life equal to that creature's toughness. -MMQ C, ROE C - -Vendilion Clique -{1}{U}{U} -Legendary Creature - Faerie Wizard -3/1 -Flash -Flying -When Vendilion Clique enters the battlefield, look at target player's hand. You may choose a nonland card from it. If you do, that player reveals the chosen card, puts it on the bottom of his or her library, then draws a card. -MOR R - -Venerable Kumo -{4}{G} -Creature - Spirit -2/3 -Reach (This creature can block creatures with flying.) -Soulshift 4 (When this creature dies, you may return target Spirit card with converted mana cost 4 or less from your graveyard to your hand.) -CHK C - -Venerable Monk -{2}{W} -Creature - Human Monk Cleric -2/2 -When Venerable Monk enters the battlefield, you gain 2 life. -POR U, STH C, 6ED C, S99 C, S00 C, 7ED C, 8ED C, 9ED C, 10E C, DVD C - -Venerated Teacher -{2}{U} -Creature - Human Wizard -2/2 -When Venerated Teacher enters the battlefield, put two level counters on each creature you control with level up. -ROE C - -Vengeance -{3}{W} -Sorcery -Destroy target tapped creature. -POR U, P02 U, PTK U, S99 U, 7ED U, 8ED U, 9ED U - -Vengeful Archon -{4}{W}{W}{W} -Creature - Archon -7/7 -Flying -{X}: Prevent the next X damage that would be dealt to you this turn. If damage is prevented this way, Vengeful Archon deals that much damage to target player. -M11 R - -Vengeful Dead -{3}{B} -Creature - Zombie -3/2 -Whenever Vengeful Dead or another Zombie dies, each opponent loses 1 life. -SCG C - -Vengeful Dreams -{W}{W} -Instant -As an additional cost to cast Vengeful Dreams, discard X cards. -Exile X target attacking creatures. -TOR R - -Vengeful Firebrand -{3}{R} -Creature - Elemental Warrior -5/2 -Vengeful Firebrand has haste as long as a Warrior card is in your graveyard. -{R}: Vengeful Firebrand gets +1/+0 until end of turn. -MOR R - -Vengeful Pharaoh -{2}{B}{B}{B} -Creature - Zombie -5/4 -Deathtouch (Any amount of damage this deals to a creature is enough to destroy it.) -Whenever combat damage is dealt to you or a planeswalker you control, if Vengeful Pharaoh is in your graveyard, destroy target attacking creature, then put Vengeful Pharaoh on top of your library. -M12 R - -Vengeful Rebirth -{4}{R}{G} -Sorcery -Return target card from your graveyard to your hand. If you return a nonland card to your hand this way, Vengeful Rebirth deals damage equal to that card's converted mana cost to target creature or player. -Exile Vengeful Rebirth. -ARB U, COM U - -Vengevine -{2}{G}{G} -Creature - Elemental -4/3 -Haste -Whenever you cast a spell, if it's the second creature spell you cast this turn, you may return Vengevine from your graveyard to the battlefield. -ROE M - -Venom -{1}{G}{G} -Enchantment - Aura -Enchant creature -Whenever enchanted creature blocks or becomes blocked by a non-Wall creature, destroy the other creature at end of combat. -DRK C, 4ED C, 5ED C - -Venomous Breath -{3}{G} -Instant -Choose target creature. At end of combat, destroy all creatures that blocked or were blocked by it this turn. -ICE U, MMQ U - -Venomous Dragonfly -{3}{G} -Creature - Insect -1/1 -Flying -Whenever Venomous Dragonfly blocks or becomes blocked by a creature, destroy that creature at end of combat. -MMQ C - -Venomous Fangs -{2}{G} -Enchantment - Aura -Enchant creature -Whenever enchanted creature deals damage to a creature, destroy the other creature. -USG C - -Venomous Vines -{2}{G}{G} -Sorcery -Destroy target enchanted permanent. -JUD C - -Venomspout Brackus -{6}{G} -Creature - Beast -5/5 -{1}{G}, {T}: Venomspout Brackus deals 5 damage to target attacking or blocking creature with flying. -Morph {3}{G}{G} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS U - -Venser's Diffusion -{2}{U} -Instant -Return target nonland permanent or suspended card to its owner's hand. -FUT C - -Venser's Journal -{5} -Artifact -You have no maximum hand size. -At the beginning of your upkeep, you gain 1 life for each card in your hand. -SOM R - -Venser's Sliver -{5} -Artifact Creature - Sliver -3/3 -TSP C - -Venser, Shaper Savant -{2}{U}{U} -Legendary Creature - Human Wizard -2/2 -Flash (You may cast this spell any time you could cast an instant.) -When Venser, Shaper Savant enters the battlefield, return target spell or permanent to its owner's hand. -FUT R - -Venser, the Sojourner -{3}{W}{U} -Planeswalker - Venser -3 -[+2] Exile target permanent you own. Return it to the battlefield under your control at the beginning of the next end step. -[-1] Creatures are unblockable this turn. -[-8] You get an emblem with "Whenever you cast a spell, exile target permanent." -SOM M - -Vent Sentinel -{3}{R} -Creature - Elemental -2/4 -Defender -{1}{R}, {T}: Vent Sentinel deals damage to target player equal to the number of creatures with defender you control. -ROE C - -Ventifact Bottle -{3} -Artifact -{X}{1}, {T}: Put X charge counters on Ventifact Bottle. Activate this ability only any time you could cast a sorcery. -At the beginning of your precombat main phase, if Ventifact Bottle has a charge counter on it, tap it and remove all charge counters from it. Add {1} to your mana pool for each charge counter removed this way. -MIR R - -Verdant Catacombs -Land -{T}, Pay 1 life, Sacrifice Verdant Catacombs: Search your library for a Swamp or Forest card and put it onto the battlefield. Then shuffle your library. -ZEN R - -Verdant Eidolon -{3}{G} -Creature - Spirit -2/2 -{G}, Sacrifice Verdant Eidolon: Add three mana of any one color to your mana pool. -Whenever you cast a multicolored spell, you may return Verdant Eidolon from your graveyard to your hand. -DIS C - -Verdant Embrace -{3}{G}{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +3/+3 and has "At the beginning of each upkeep, put a 1/1 green Saproling creature token onto the battlefield." -TSP R - -Verdant Field -{2}{G} -Enchantment - Aura -Enchant land -Enchanted land has "{T}: Target creature gets +1/+1 until end of turn." -PCY U - -Verdant Force -{5}{G}{G}{G} -Creature - Elemental -7/7 -At the beginning of each upkeep, put a 1/1 green Saproling creature token onto the battlefield. -TMP R, 9ED R, 10E R, HOP R - -Verdant Succession -{4}{G} -Enchantment -Whenever a green nontoken creature dies, that creature's controller may search his or her library for a card with the same name as that creature and put it onto the battlefield. If that player does, he or she shuffles his or her library. -ODY R - -Verdant Touch -{1}{G} -Sorcery -Buyback {3} (You may pay an additional {3} as you cast this spell. If you do, put this card into your hand as it resolves.) -Target land becomes a 2/2 creature that's still a land. (This effect lasts indefinitely.) -STH R - -Verdeloth the Ancient -{4}{G}{G} -Legendary Creature - Treefolk -4/7 -Kicker {X} (You may pay an additional {X} as you cast this spell.) -Saproling creatures and other Treefolk creatures get +1/+1. -When Verdeloth the Ancient enters the battlefield, if it was kicked, put X 1/1 green Saproling creature tokens onto the battlefield. -INV R, TSB S, ARC R - -Verdigris -{2}{G} -Instant -Destroy target artifact. -TMP U - -Verduran Emissary -{2}{G} -Creature - Human Wizard -2/3 -Kicker {1}{R} (You may pay an additional {1}{R} as you cast this spell.) -When Verduran Emissary enters the battlefield, if it was kicked, destroy target artifact. It can't be regenerated. -INV U, PVC U - -Verduran Enchantress -{1}{G}{G} -Creature - Human Druid -0/2 -Whenever you cast an enchantment spell, you may draw a card. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, 6ED R, 7ED R, 8ED R, 9ED R - -Vermiculos -{4}{B} -Creature - Horror -1/1 -Whenever an artifact enters the battlefield, Vermiculos gets +4/+4 until end of turn. -MRD R - -Vernal Bloom -{3}{G} -Enchantment -Whenever a Forest is tapped for mana, its controller adds {G} to his or her mana pool (in addition to the mana the land produces). -USG R, 7ED R, 8ED R - -Vernal Equinox -{3}{G} -Enchantment -Any player may cast creature and enchantment cards as though they had flash. -MMQ R - -Vertigo -{R} -Instant -Vertigo deals 2 damage to target creature with flying. That creature loses flying until end of turn. -ICE U, 6ED U - -Vertigo Spawn -{1}{U} -Creature - Illusion -0/3 -Defender (This creature can't attack.) -Whenever Vertigo Spawn blocks a creature, tap that creature. That creature doesn't untap during its controller's next untap step. -GPT U - -Vesper Ghoul -{2}{B} -Creature - Zombie Druid -1/1 -{T}, Pay 1 life: Add one mana of any color to your mana pool. -DIS C - -Vesuva -Land -You may have Vesuva enter the battlefield tapped as a copy of any land on the battlefield. -TSP R - -Vesuvan Doppelganger -{3}{U}{U} -Creature - Shapeshifter -0/0 -You may have Vesuvan Doppelganger enter the battlefield as a copy of any creature on the battlefield except it doesn't copy that creature's color and it gains "At the beginning of your upkeep, you may have this creature become a copy of target creature except it doesn't copy that creature's color. If you do, this creature gains this ability." -LEA R, LEB R, 2ED R, 3ED R, MED R - -Vesuvan Shapeshifter -{3}{U}{U} -Creature - Shapeshifter -0/0 -As Vesuvan Shapeshifter enters the battlefield or is turned face up, you may choose another creature on the battlefield. If you do, until Vesuvan Shapeshifter is turned face down, it becomes a copy of that creature and gains "At the beginning of your upkeep, you may turn this creature face down." -Morph {1}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -TSP R - -Veteran Armorer -{1}{W} -Creature - Human Soldier -2/2 -Other creatures you control get +0/+1. -RAV C - -Veteran Armorsmith -{W}{W} -Creature - Human Soldier -2/3 -Other Soldier creatures you control get +0/+1. -M10 C - -Veteran Bodyguard -{3}{W}{W} -Creature - Human -2/5 -As long as Veteran Bodyguard is untapped, all damage that would be dealt to you by unblocked creatures is dealt to Veteran Bodyguard instead. -LEA R, LEB R, 2ED R, 3ED R, ME4 R - -Veteran Brawlers -{1}{R} -Creature - Human Soldier -4/4 -Veteran Brawlers can't attack if defending player controls an untapped land. -Veteran Brawlers can't block if you control an untapped land. -PCY R - -Veteran Cavalier -{W}{W} -Creature - Human Knight -2/2 -Vigilance (Attacking doesn't cause this creature to tap.) -S99 U, 9ED C - -Veteran Explorer -{G} -Creature - Human Soldier Scout -1/1 -When Veteran Explorer dies, each player may search his or her library for up to two basic land cards and put them onto the battlefield. Then each player who searched his or her library this way shuffles it. -WTH U, COM U - -Veteran Swordsmith -{2}{W} -Creature - Human Soldier -3/2 -Other Soldier creatures you control get +1/+0. -M10 C - -Veteran of the Depths -{3}{W} -Creature - Merfolk Soldier -2/2 -Whenever Veteran of the Depths becomes tapped, you may put a +1/+1 counter on it. -LRW U - -Veteran's Armaments -{2} -Tribal Artifact - Soldier Equipment -Equipped creature has "Whenever this creature attacks or blocks, it gets +1/+1 until end of turn for each attacking creature." -Whenever a Soldier creature enters the battlefield, you may attach Veteran's Armaments to it. -Equip {2} -MOR U - -Veteran's Reflexes -{W} -Instant -Target creature gets +1/+1 until end of turn. Untap that creature. -WWK C - -Veteran's Voice -{R} -Enchantment - Aura -Enchant creature you control -Tap enchanted creature: Target creature other than the creature tapped this way gets +2/+1 until end of turn. Activate this ability only if enchanted creature is untapped. -ALL C (x2) - -Vex -{2}{U} -Instant -Counter target spell. That spell's controller may draw a card. -DST C - -Vexing Arcanix -{4} -Artifact -{3}, {T}: Target player names a card, then reveals the top card of his or her library. If it's the named card, the player puts it into his or her hand. Otherwise, the player puts it into his or her graveyard and Vexing Arcanix deals 2 damage to him or her. -ICE R, 8ED R - -Vexing Beetle -{4}{G} -Creature - Insect -3/3 -Vexing Beetle can't be countered. -Vexing Beetle gets +3/+3 as long as no opponent controls a creature. -LGN R - -Vexing Shusher -{R/G}{R/G} -Creature - Goblin Shaman -2/2 -Vexing Shusher can't be countered. -{R/G}: Target spell can't be countered by spells or abilities. -SHM R - -Vexing Sphinx -{1}{U}{U} -Creature - Sphinx -4/4 -Flying -Cumulative upkeep-Discard a card. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -When Vexing Sphinx dies, draw a card for each age counter on it. -CSP R - -Vhati il-Dal -{2}{B}{G} -Legendary Creature - Human Warrior -3/3 -{T}: Target creature's power or toughness becomes 1 until end of turn. -TMP R, TSB S - -Viashino Bey -{2}{R}{R} -Creature - Viashino -4/3 -If Viashino Bey attacks, all creatures you control attack if able. -ULG C - -Viashino Bladescout -{1}{R}{R} -Creature - Viashino Scout -2/1 -Flash (You may cast this spell any time you could cast an instant.) -When Viashino Bladescout enters the battlefield, target creature gains first strike until end of turn. -TSP C - -Viashino Cutthroat -{2}{R}{R} -Creature - Viashino -5/3 -Haste -At the beginning of the end step, return Viashino Cutthroat to its owner's hand. -ULG U - -Viashino Fangtail -{2}{R}{R} -Creature - Viashino Warrior -3/3 -{T}: Viashino Fangtail deals 1 damage to target creature or player. -RAV C - -Viashino Grappler -{2}{R} -Creature - Viashino -3/1 -{G}: Viashino Grappler gains trample until end of turn. -INV C - -Viashino Heretic -{2}{R} -Creature - Viashino -1/3 -{1}{R}, {T}: Destroy target artifact. Viashino Heretic deals damage to that artifact's controller equal to the artifact's converted mana cost. -ULG U - -Viashino Outrider -{2}{R} -Creature - Viashino -4/3 -Echo {2}{R} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -USG C - -Viashino Runner -{3}{R} -Creature - Viashino -3/2 -Viashino Runner can't be blocked except by two or more creatures. -USG C, 10E C - -Viashino Sandscout -{1}{R} -Creature - Viashino Scout -2/1 -Haste (This creature can attack and {T} as soon as it comes under your control.) -At the beginning of the end step, return Viashino Sandscout to its owner's hand. (Return it only if it's on the battlefield.) -ULG C, 10E C - -Viashino Sandstalker -{1}{R}{R} -Creature - Viashino Warrior -4/2 -Haste (This creature can attack the turn it comes under your control.) -At the beginning of the end step, return Viashino Sandstalker to its owner's hand. (Return it only if it's on the battlefield.) -VIS U, 8ED U, 9ED U - -Viashino Sandswimmer -{2}{R}{R} -Creature - Viashino -3/2 -{R}: Flip a coin. If you win the flip, return Viashino Sandswimmer to its owner's hand. If you lose the flip, sacrifice Viashino Sandswimmer. -USG R - -Viashino Skeleton -{3}{R} -Creature - Viashino Skeleton -2/1 -{1}{B}, Discard a card: Regenerate Viashino Skeleton. -ALA C - -Viashino Slasher -{1}{R} -Creature - Viashino Warrior -1/2 -{R}: Viashino Slasher gets +1/-1 until end of turn. -RAV C - -Viashino Slaughtermaster -{1}{R} -Creature - Viashino Warrior -1/1 -Double strike -{B}{G}: Viashino Slaughtermaster gets +1/+1 until end of turn. Activate this ability only once each turn. -CON U - -Viashino Spearhunter -{2}{R} -Creature - Viashino Warrior -2/1 -First strike (This creature deals combat damage before creatures without first strike.) -M10 C - -Viashino Warrior -{3}{R} -Creature - Viashino Warrior -4/2 -MIR C, 6ED C, BTD C - -Viashino Weaponsmith -{3}{R} -Creature - Viashino -2/2 -Whenever Viashino Weaponsmith becomes blocked by a creature, Viashino Weaponsmith gets +2/+2 until end of turn. -USG C - -Viashivan Dragon -{2}{R}{R}{G}{G} -Creature - Dragon -4/4 -Flying -{R}: Viashivan Dragon gets +1/+0 until end of turn. -{G}: Viashivan Dragon gets +0/+1 until end of turn. -VIS R - -Vibrating Sphere -{4} -Artifact -As long as it's your turn, creatures you control get +2/+0. -As long as it's not your turn, creatures you control get -0/-2. -ICE R, ME4 R - -Vicious Betrayal -{3}{B}{B} -Sorcery -As an additional cost to cast Vicious Betrayal, sacrifice any number of creatures. -Target creature gets +2/+2 until end of turn for each creature sacrificed this way. -5DN C - -Vicious Hunger -{B}{B} -Sorcery -Vicious Hunger deals 2 damage to target creature and you gain 2 life. -NEM C, 8ED C, GVL C - -Vicious Kavu -{1}{B}{R} -Creature - Kavu -2/2 -Whenever Vicious Kavu attacks, it gets +2/+0 until end of turn. -INV U - -Vicious Shadows -{6}{R} -Enchantment -Whenever a creature dies, you may have Vicious Shadows deal damage to target player equal to the number of cards in that player's hand. -ALA R - -Victimize -{2}{B} -Sorcery -Choose two target creature cards in your graveyard. Sacrifice a creature. If you do, return the chosen cards to the battlefield tapped. -USG U - -Victorious Destruction -{4}{R} -Sorcery -Destroy target artifact or land. Its controller loses 1 life. -NPH C - -Victory's Herald -{3}{W}{W}{W} -Creature - Angel -4/4 -Flying -Whenever Victory's Herald attacks, attacking creatures gain flying and lifelink until end of turn. -MBS R - -Victual Sliver -{G}{W} -Creature - Sliver -2/2 -All Slivers have "{2}, Sacrifice this permanent: You gain 4 life." -STH U, H09 U - -View from Above -{1}{U} -Instant -Target creature gains flying until end of turn. If you control a white permanent, return View from Above to its owner's hand. -CON U - -Vigean Graftmage -{2}{U} -Creature - Vedalken Wizard Mutant -0/0 -Graft 2 (This creature enters the battlefield with two +1/+1 counters on it. Whenever another creature enters the battlefield, you may move a +1/+1 counter from this creature onto it.) -{1}{U}: Untap target creature with a +1/+1 counter on it. -DIS U - -Vigean Hydropon -{1}{G}{U} -Creature - Plant Mutant -0/0 -Graft 5 (This creature enters the battlefield with five +1/+1 counters on it. Whenever another creature enters the battlefield, you may move a +1/+1 counter from this creature onto it.) -Vigean Hydropon can't attack or block. -DIS C - -Vigean Intuition -{3}{G}{U} -Instant -Choose a card type, then reveal the top four cards of your library. Put all cards of the chosen type revealed this way into your hand and the rest into your graveyard. (Artifact, creature, enchantment, instant, land, planeswalker, sorcery, and tribal are card types.) -DIS U - -Vigil for the Lost -{3}{W} -Enchantment -Whenever a creature you control dies, you may pay {X}. If you do, you gain X life. -SOM U - -Vigilance -{W} -Enchantment - Aura -Enchant creature -Enchanted creature has vigilance. (Attacking doesn't cause it to tap.) -CHK C - -Vigilant Drake -{4}{U} -Creature - Drake -3/3 -Flying -{2}{U}: Untap Vigilant Drake. -ULG C, BTD C, 7ED C - -Vigilant Martyr -{W} -Creature - Human Cleric -1/1 -Sacrifice Vigilant Martyr: Regenerate target creature. -{W}{W}, {T}, Sacrifice Vigilant Martyr: Counter target spell that targets an enchantment. -MIR U - -Vigilant Sentry -{1}{W}{W} -Creature - Human Nomad -2/2 -Threshold - As long as seven or more cards are in your graveyard, Vigilant Sentry gets +1/+1 and has "{T}: Target attacking or blocking creature gets +3/+3 until end of turn." -JUD C - -Vigor -{3}{G}{G}{G} -Creature - Elemental Incarnation -6/6 -Trample -If damage would be dealt to a creature you control other than Vigor, prevent that damage. Put a +1/+1 counter on that creature for each 1 damage prevented this way. -When Vigor is put into a graveyard from anywhere, shuffle it into its owner's library. -LRW R - -Vigor Mortis -{2}{B}{B} -Sorcery -Return target creature card from your graveyard to the battlefield. If {G} was spent to cast Vigor Mortis, that creature enters the battlefield with an additional +1/+1 counter on it. -RAV U - -Vigorous Charge -{G} -Instant -Kicker {W} (You may pay an additional {W} as you cast this spell.) -Target creature gains trample until end of turn. Whenever that creature deals combat damage this turn, if Vigorous Charge was kicked, you gain life equal to that damage. -INV C - -Vile Consumption -{1}{U}{B} -Enchantment -All creatures have "At the beginning of your upkeep, sacrifice this creature unless you pay 1 life." -INV R - -Vile Deacon -{2}{B}{B} -Creature - Human Cleric -2/2 -Whenever Vile Deacon attacks, it gets +X/+X until end of turn, where X is the number of Clerics on the battlefield. -LGN C - -Vile Requiem -{2}{B}{B} -Enchantment -At the beginning of your upkeep, you may put a verse counter on Vile Requiem. -{1}{B}, Sacrifice Vile Requiem: Destroy up to X target nonblack creatures, where X is the number of verse counters on Vile Requiem. They can't be regenerated. -USG U - -Village Elder -{G} -Creature - Human Druid -1/1 -{G}, {T}, Sacrifice a Forest: Regenerate target creature. -MIR C, BRB C - -Villainous Ogre -{2}{B} -Creature - Ogre Warrior -3/2 -Villainous Ogre can't block. -As long as you control a Demon, Villainous Ogre has "{B}: Regenerate Villainous Ogre." -CHK C - -Vindicate -{1}{W}{B} -Sorcery -Destroy target permanent. -APC R - -Vindictive Mob -{4}{B}{B} -Creature - Human Berserker -5/5 -When Vindictive Mob enters the battlefield, sacrifice a creature. -Vindictive Mob can't be blocked by Saprolings. -RAV U - -Vine Dryad -{3}{G} -Creature - Dryad -1/3 -Flash -Forestwalk -You may exile a green card from your hand rather than pay Vine Dryad's mana cost. -MMQ R - -Vine Kami -{6}{G} -Creature - Spirit -4/4 -Vine Kami can't be blocked except by two or more creatures. -Soulshift 6 (When this creature dies, you may return target Spirit card with converted mana cost 6 or less from your graveyard to your hand.) -CHK C - -Vine Trellis -{1}{G} -Creature - Plant Wall -0/4 -Defender (This creature can't attack.) -{T}: Add {G} to your mana pool. -MMQ C, 8ED C, GVL C - -Vinelasher Kudzu -{1}{G} -Creature - Plant -1/1 -Whenever a land enters the battlefield under your control, put a +1/+1 counter on Vinelasher Kudzu. -RAV R - -Vines of Vastwood -{G} -Instant -Kicker {G} (You may pay an additional {G} as you cast this spell.) -Target creature can't be the target of spells or abilities your opponents control this turn. If Vines of Vastwood was kicked, that creature gets +4/+4 until end of turn. -ZEN C - -Vintara Elephant -{4}{G} -Creature - Elephant -4/3 -Trample -{3}: Vintara Elephant loses trample until end of turn. Any player may activate this ability. -PCY C - -Vintara Snapper -{G}{G} -Creature - Turtle -2/2 -Vintara Snapper has shroud as long as you control no untapped lands. (It can't be the target of spells or abilities.) -PCY U - -Violent Eruption -{1}{R}{R}{R} -Instant -Violent Eruption deals 4 damage divided as you choose among any number of target creatures and/or players. -Madness {1}{R}{R} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -TOR U - -Violent Outburst -{1}{R}{G} -Instant -Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.) -Creatures you control get +1/+0 until end of turn. -ARB C - -Violent Ultimatum -{B}{B}{R}{R}{R}{G}{G} -Sorcery -Destroy three target permanents. -ALA R - -Violet Pall -{4}{B} -Tribal Instant - Faerie -Destroy target nonblack creature. Put a 1/1 black Faerie Rogue creature token with flying onto the battlefield. -MOR C - -Viral Drake -{3}{U} -Creature - Drake -1/4 -Flying -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -{3}{U}: Proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.) -NPH U - -Viridescent Wisps -{G} -Instant -Target creature becomes green and gets +1/+0 until end of turn. -Draw a card. -SHM C - -Viridian Acolyte -{G} -Creature - Elf Shaman -1/1 -{1}, {T}: Add one mana of any color to your mana pool. -DST C - -Viridian Betrayers -{1}{G}{G} -Creature - Elf Warrior -3/1 -Viridian Betrayers has infect as long as an opponent is poisoned. (It deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -NPH C - -Viridian Claw -{2} -Artifact - Equipment -Equipped creature gets +1/+0 and has first strike. -Equip {1} -MBS U - -Viridian Corrupter -{1}{G}{G} -Creature - Elf Shaman -2/2 -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -When Viridian Corrupter enters the battlefield, destroy target artifact. -MBS U - -Viridian Emissary -{1}{G} -Creature - Elf Scout -2/1 -When Viridian Emissary dies, you may search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. -MBS C - -Viridian Harvest -{G} -Enchantment - Aura -Enchant artifact -When enchanted artifact is put into a graveyard, you gain 6 life. -NPH C - -Viridian Joiner -{2}{G} -Creature - Elf Druid -1/2 -{T}: Add to your mana pool an amount of {G} equal to Viridian Joiner's power. -MRD C - -Viridian Longbow -{1} -Artifact - Equipment -Equipped creature has "{T}: This creature deals 1 damage to target creature or player." -Equip {3} ({3}: Attach to target creature you control. Equip only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.) -MRD C - -Viridian Lorebearers -{3}{G} -Creature - Elf Shaman -3/3 -{3}{G}, {T}: Target creature gets +X/+X until end of turn, where X is the number of artifacts your opponents control. -5DN U - -Viridian Revel -{1}{G}{G} -Enchantment -Whenever an artifact is put into an opponent's graveyard from the battlefield, you may draw a card. -SOM U - -Viridian Scout -{3}{G} -Creature - Elf Warrior Scout -1/2 -{2}{G}, Sacrifice Viridian Scout: Viridian Scout deals 2 damage to target creature with flying. -5DN C - -Viridian Shaman -{2}{G} -Creature - Elf Shaman -2/2 -When Viridian Shaman enters the battlefield, destroy target artifact. -MRD U, 9ED U, 10E U - -Viridian Zealot -{G}{G} -Creature - Elf Warrior -2/1 -{1}{G}, Sacrifice Viridian Zealot: Destroy target artifact or enchantment. -DST R - -Viridian Zealot Avatar -Vanguard -Hand +0, life +2 -{2}, Sacrifice a creature: Destroy target artifact or enchantment. Search your library for a card with the same name as the sacrificed creature, reveal that card, and put it into your hand. Then shuffle your library. -VG S - -Virtue's Ruin -{2}{B} -Sorcery -Destroy all white creatures. -POR U - -Virtuous Charge -{2}{W} -Sorcery -Creatures you control get +1/+1 until end of turn. -PTK C - -Virulent Sliver -{G} -Creature - Sliver -1/1 -All Sliver creatures have poisonous 1. (Whenever a Sliver deals combat damage to a player, that player gets a poison counter. A player with ten or more poison counters loses the game.) -FUT C, H09 C - -Virulent Swipe -{B} -Instant -Target creature gets +2/+0 and gains deathtouch until end of turn. -Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -ROE U - -Virulent Wound -{B} -Instant -Put a -1/-1 counter on target creature. When that creature dies this turn, its controller gets a poison counter. -MBS C - -Visara the Dreadful -{3}{B}{B}{B} -Legendary Creature - Gorgon -5/5 -Flying -{T}: Destroy target creature. It can't be regenerated. -ONS R - -Viscera Dragger -{3}{B} -Creature - Zombie Ogre Warrior -3/3 -Cycling {2} ({2}, Discard this card: Draw a card.) -Unearth {1}{B} ({1}{B}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) -ALA C - -Viscera Seer -{B} -Creature - Vampire Wizard -1/1 -Sacrifice a creature: Scry 1. (To scry 1, look at the top card of your library, then you may put that card on the bottom of your library.) -M11 C - -Viscerid Armor -{1}{U} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+1. -{1}{U}: Return Viscerid Armor to its owner's hand. -ALL C (x2), ME2 C - -Viscerid Deepwalker -{4}{U} -Creature - Homarid Warrior -2/3 -{U}: Viscerid Deepwalker gets +1/+0 until end of turn. -Suspend 4-{U} (Rather than cast this card from your hand, you may pay {U} and exile it with four time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -TSP C - -Viscerid Drone -{1}{U} -Creature - Homarid Drone -1/2 -{T}, Sacrifice a creature and a Swamp: Destroy target nonartifact creature. It can't be regenerated. -{T}, Sacrifice a creature and a snow Swamp: Destroy target creature. It can't be regenerated. -ALL U, ME2 U - -Viscid Lemures -{4}{B} -Creature - Spirit -4/3 -{0}: Viscid Lemures gets -1/-0 and gains swampwalk until end of turn. -TSP C - -Viseling -{4} -Artifact Creature - Construct -2/2 -At the beginning of each opponent's upkeep, Viseling deals X damage to that player, where X is the number of cards in his or her hand minus 4. -NEM U - -Vish Kal, Blood Arbiter -{4}{W}{B}{B} -Legendary Creature - Vampire -5/5 -Flying, lifelink -Sacrifice a creature: Put X +1/+1 counters on Vish Kal, Blood Arbiter, where X is the sacrificed creature's power. -Remove all +1/+1 counters from Vish Kal: Target creature gets -1/-1 until end of turn for each +1/+1 counter removed this way. -COM R - -Vision Charm -{U} -Instant -Choose one - Target player puts the top four cards of his or her library into his or her graveyard; or choose a land type and a basic land type, and each land of the first chosen type becomes the second chosen type until end of turn; or target artifact phases out. (While it's phased out, it's treated as though it doesn't exist. It phases in before its controller untaps during his or her next untap step.) -VIS C - -Vision Skeins -{1}{U} -Instant -Each player draws two cards. -DIS C, COM C - -Visions -{W} -Sorcery -Look at the top five cards of target player's library. You may then have that player shuffle that library. -LEG U, 4ED U - -Visions of Beyond -{U} -Instant -Draw a card. If a graveyard has twenty or more cards in it, draw three cards instead. -M12 R - -Vital Splicer -{3}{G} -Creature - Human Artificer -1/1 -When Vital Splicer enters the battlefield, put a 3/3 colorless Golem artifact creature token onto the battlefield. -{1}: Regenerate target Golem you control. -NPH U - -Vital Surge -{1}{G} -Instant - Arcane -You gain 3 life. -Splice onto Arcane {1}{G} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -BOK C - -Vitality Charm -{G} -Instant -Choose one - Put a 1/1 green Insect creature token onto the battlefield; or target creature gets +1/+1 and gains trample until end of turn; or regenerate target Beast. -ONS C - -Vitalize -{G} -Instant -Untap all creatures you control. -WTH C, 6ED C - -Vitalizing Cascade -{X}{G}{W} -Instant -You gain X plus 3 life. -MIR U - -Vitalizing Wind -{8}{G} -Instant -Creatures you control get +7/+7 until end of turn. -PCY R - -Vitaspore Thallid -{1}{G} -Creature - Fungus -1/1 -At the beginning of your upkeep, put a spore counter on Vitaspore Thallid. -Remove three spore counters from Vitaspore Thallid: Put a 1/1 green Saproling creature token onto the battlefield. -Sacrifice a Saproling: Target creature gains haste until end of turn. -PLC C - -Vithian Renegades -{1}{R}{G} -Creature - Human Shaman -3/2 -When Vithian Renegades enters the battlefield, destroy target artifact. -ARB U - -Vithian Stinger -{2}{R} -Creature - Human Shaman -0/1 -{T}: Vithian Stinger deals 1 damage to target creature or player. -Unearth {1}{R} ({1}{R}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) -ALA C - -Vitu-Ghazi, the City-Tree -Land -{T}: Add {1} to your mana pool. -{2}{G}{W}, {T}: Put a 1/1 green Saproling creature token onto the battlefield. -RAV U, ARC U - -Vivid Crag -Land -Vivid Crag enters the battlefield tapped with two charge counters on it. -{T}: Add {R} to your mana pool. -{T}, Remove a charge counter from Vivid Crag: Add one mana of any color to your mana pool. -LRW U, COM U - -Vivid Creek -Land -Vivid Creek enters the battlefield tapped with two charge counters on it. -{T}: Add {U} to your mana pool. -{T}, Remove a charge counter from Vivid Creek: Add one mana of any color to your mana pool. -LRW U, H09 U, COM U - -Vivid Grove -Land -Vivid Grove enters the battlefield tapped with two charge counters on it. -{T}: Add {G} to your mana pool. -{T}, Remove a charge counter from Vivid Grove: Add one mana of any color to your mana pool. -LRW U, H09 U, COM U - -Vivid Marsh -Land -Vivid Marsh enters the battlefield tapped with two charge counters on it. -{T}: Add {B} to your mana pool. -{T}, Remove a charge counter from Vivid Marsh: Add one mana of any color to your mana pool. -LRW U, COM U - -Vivid Meadow -Land -Vivid Meadow enters the battlefield tapped with two charge counters on it. -{T}: Add {W} to your mana pool. -{T}, Remove a charge counter from Vivid Meadow: Add one mana of any color to your mana pool. -LRW U, COM U - -Vivify -{2}{G} -Instant -Target land becomes a 3/3 creature until end of turn. It's still a land. -Draw a card. -ODY U - -Vivisection -{3}{U} -Sorcery -As an additional cost to cast Vivisection, sacrifice a creature. -Draw three cards. -MBS C - -Vizzerdrix -{6}{U} -Creature - Rabbit Beast -6/6 -S99 R, S00 R, 7ED R, 8ED R, 9ED R - -Vodalian Hypnotist -{1}{U} -Creature - Merfolk Wizard -1/1 -{2}{B}, {T}: Target player discards a card. Activate this ability only any time you could cast a sorcery. -INV U - -Vodalian Illusionist -{2}{U} -Creature - Merfolk Wizard -2/2 -{U}{U}, {T}: Target creature phases out. (While it's phased out, it's treated as though it doesn't exist. It phases in before its controller untaps during his or her next untap step.) -WTH U - -Vodalian Knights -{1}{U}{U} -Creature - Merfolk Knight -2/2 -First strike -Vodalian Knights can't attack unless defending player controls an Island. -When you control no Islands, sacrifice Vodalian Knights. -{U}: Vodalian Knights gains flying until end of turn. -FEM R, MED U - -Vodalian Mage -{2}{U} -Creature - Merfolk Wizard -1/1 -{U}, {T}: Counter target spell unless its controller pays {1}. -FEM C (x3) - -Vodalian Merchant -{1}{U} -Creature - Merfolk -1/2 -When Vodalian Merchant enters the battlefield, draw a card, then discard a card. -INV C - -Vodalian Mystic -{1}{U} -Creature - Merfolk Wizard -1/1 -{T}: Target instant or sorcery spell becomes the color of your choice. -APC U - -Vodalian Serpent -{3}{U} -Creature - Serpent -2/2 -Kicker {2} (You may pay an additional {2} as you cast this spell.) -Vodalian Serpent can't attack unless defending player controls an Island. -If Vodalian Serpent was kicked, it enters the battlefield with four +1/+1 counters on it. -INV C - -Vodalian Soldiers -{1}{U} -Creature - Merfolk Soldier -1/2 -FEM C (x4), 5ED C, 6ED C - -Vodalian War Machine -{1}{U}{U} -Creature - Wall -0/4 -Defender (This creature can't attack.) -Tap an untapped Merfolk you control: Vodalian War Machine can attack this turn as though it didn't have defender. -Tap an untapped Merfolk you control: Vodalian War Machine gets +2/+1 until end of turn. -When Vodalian War Machine dies, destroy all Merfolk tapped this turn to pay for its abilities. -FEM R - -Vodalian Zombie -{U}{B} -Creature - Merfolk Zombie -2/2 -Protection from green -INV C - -Voice of All -{2}{W}{W} -Creature - Angel -2/2 -Flying -As Voice of All enters the battlefield, choose a color. -Voice of All has protection from the chosen color. -PLS U, 10E R, COM R - -Voice of Duty -{3}{W} -Creature - Angel -2/2 -Flying, protection from green -UDS U - -Voice of Grace -{3}{W} -Creature - Angel -2/2 -Flying, protection from black -USG U - -Voice of Law -{3}{W} -Creature - Angel -2/2 -Flying, protection from red -USG U - -Voice of Reason -{3}{W} -Creature - Angel -2/2 -Flying, protection from blue -UDS U - -Voice of Truth -{3}{W} -Creature - Angel -2/2 -Flying, protection from white -NEM U - -Voice of the Woods -{3}{G}{G} -Creature - Elf -2/2 -Tap five untapped Elves you control: Put a 7/7 green Elemental creature token with trample onto the battlefield. -ONS R, EVG R - -Voices from the Void -{4}{B} -Sorcery -Domain - Target player discards a card for each basic land type among lands you control. -CON U - -Void -{3}{B}{R} -Sorcery -Choose a number. Destroy all artifacts and creatures with converted mana cost equal to that number. Then target player reveals his or her hand and discards all nonland cards with converted mana cost equal to the number. -INV R, TSB S - -Void Maw -{4}{B}{B} -Creature - Horror -4/5 -Trample -If another creature would die, exile it instead. -Put a card exiled with Void Maw into its owner's graveyard: Void Maw gets +2/+2 until end of turn. -CSP R - -Voidmage Apprentice -{1}{U} -Creature - Human Wizard -1/1 -Morph {2}{U}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Voidmage Apprentice is turned face up, counter target spell. -LGN C, JVC C - -Voidmage Husher -{3}{U} -Creature - Human Wizard -2/2 -Flash (You may cast this spell any time you could cast an instant.) -When Voidmage Husher enters the battlefield, counter target activated ability. (Mana abilities can't be targeted.) -Whenever you cast a spell, you may return Voidmage Husher to its owner's hand. -TSP U - -Voidmage Prodigy -{U}{U} -Creature - Human Wizard -2/1 -{U}{U}, Sacrifice a Wizard: Counter target spell. -Morph {U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS R, TSB S - -Voidslime -{G}{U}{U} -Instant -Counter target spell, activated ability, or triggered ability. (Mana abilities can't be targeted.) -DIS R - -Voidstone Gargoyle -{3}{W}{W} -Creature - Gargoyle -3/3 -Flying -As Voidstone Gargoyle enters the battlefield, name a nonland card. -The named card can't be cast. -Activated abilities of sources with the chosen name can't be activated. -PLC R - -Volcanic Awakening -{4}{R}{R} -Sorcery -Destroy target land. -Storm (When you cast this spell, copy it for each spell cast before it this turn. You may choose new targets for the copies.) -TSP U - -Volcanic Dragon -{4}{R}{R} -Creature - Dragon -4/4 -Flying -Haste (This creature can attack and {T} as soon as it comes under your control.) -MIR R, POR R, 6ED R, S99 R, M12 U - -Volcanic Eruption -{X}{U}{U}{U} -Sorcery -Destroy X target Mountains. Volcanic Eruption deals damage to each creature and each player equal to the number of Mountains destroyed this way. -LEA R, LEB R, 2ED R, 3ED R, 4ED R - -Volcanic Fallout -{1}{R}{R} -Instant -Volcanic Fallout can't be countered. -Volcanic Fallout deals 2 damage to each creature and each player. -CON U, ARC U - -Volcanic Geyser -{X}{R}{R} -Instant -Volcanic Geyser deals X damage to target creature or player. -MIR U, 6ED U - -Volcanic Hammer -{1}{R} -Sorcery -Volcanic Hammer deals 3 damage to target creature or player. -POR C, P02 C, S99 C, 7ED C, 8ED C, 9ED C - -Volcanic Island -Land - Island Mountain -LEB R, 2ED R, 3ED R, ME3 R, ME4 R - -Volcanic Spray -{1}{R} -Sorcery -Volcanic Spray deals 1 damage to each creature without flying and each player. -Flashback {1}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY U - -Volcanic Strength -{1}{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2 and has mountainwalk. (It's unblockable as long as defending player controls a Mountain.) -M11 C - -Volcanic Submersion -{4}{R} -Sorcery -Destroy target artifact or land. -Cycling {2} ({2}, Discard this card: Draw a card.) -ALA C - -Volcanic Wind -{4}{R}{R} -Sorcery -Volcanic Wind deals X damage divided as you choose among any number of target creatures, where X is the number of creatures on the battlefield as you cast Volcanic Wind. -MMQ U - -Volcano Hellion -{2}{R}{R} -Creature - Hellion -6/5 -Volcano Hellion has echo {X}, where X is your life total. (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -When Volcano Hellion enters the battlefield, it deals an amount of damage of your choice to you and target creature. The damage can't be prevented. -PLC R - -Volcano Imp -{3}{B} -Creature - Imp -2/2 -Flying -{1}{R}: Volcano Imp gains first strike until end of turn. -PLS C - -Volition Reins -{3}{U}{U}{U} -Enchantment - Aura -Enchant permanent -When Volition Reins enters the battlefield, if enchanted permanent is tapped, untap it. -You control enchanted permanent. -SOM U - -Volley of Boulders -{8}{R} -Sorcery -Volley of Boulders deals 6 damage divided as you choose among any number of target creatures and/or players. -Flashback {R}{R}{R}{R}{R}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -ODY R - -Volrath -Vanguard -Hand +2, life -3 -Whenever a creature you control is put into your graveyard from the battlefield, you may put it on top of your library. -VG S - -Volrath the Fallen -{3}{B}{B}{B} -Legendary Creature - Shapeshifter -6/4 -{1}{B}, Discard a creature card: Volrath the Fallen gets +X/+X until end of turn, where X is the discarded card's converted mana cost. -NEM R - -Volrath's Curse -{1}{U} -Enchantment - Aura -Enchant creature -Enchanted creature can't attack or block, and its activated abilities can't be activated. That creature's controller may sacrifice a permanent for that player to ignore this effect until end of turn. -{1}{U}: Return Volrath's Curse to its owner's hand. -TMP C - -Volrath's Dungeon -{2}{B}{B} -Enchantment -Pay 5 life: Destroy Volrath's Dungeon. Any player may activate this ability but only during his or her turn. -Discard a card: Target player puts a card from his or her hand on top of his or her library. Activate this ability only any time you could cast a sorcery. -EXO R - -Volrath's Gardens -{1}{G} -Enchantment -{2}, Tap an untapped creature you control: You gain 2 life. Activate this ability only any time you could cast a sorcery. -STH R - -Volrath's Laboratory -{5} -Artifact -As Volrath's Laboratory enters the battlefield, choose a color and a creature type. -{5}, {T}: Put a 2/2 creature token of the chosen color and type onto the battlefield. -STH R - -Volrath's Shapeshifter -{1}{U}{U} -Creature - Shapeshifter -0/1 -As long as the top card of your graveyard is a creature card, Volrath's Shapeshifter has the full text of that card and has the text "{2}: Discard a card." (Volrath's Shapeshifter has that card's name, mana cost, color, types, abilities, power, and toughness.) -{2}: Discard a card. -STH R - -Volrath's Stronghold -Legendary Land -{T}: Add {1} to your mana pool. -{1}{B}, {T}: Put target creature card from your graveyard on top of your library. -STH R - -Volt Charge -{2}{R} -Instant -Volt Charge deals 3 damage to target creature or player. Proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.) -NPH C - -Voltaic Construct -{4} -Artifact Creature - Golem Construct -2/2 -{2}: Untap target artifact creature. -DST U - -Voltaic Key -{1} -Artifact -{1}, {T}: Untap target artifact. -USG U, PVC U, M11 U - -Volunteer Militia -{W} -Creature - Human Soldier -1/2 -P02 C, PTK C - -Volunteer Reserves -{1}{W} -Creature - Human Soldier -2/4 -Banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -WTH U - -Voodoo Doll -{6} -Artifact -At the beginning of your upkeep, put a pin counter on Voodoo Doll. -At the beginning of your end step, if Voodoo Doll is untapped, destroy Voodoo Doll and it deals damage to you equal to the number of pin counters on it. -{X}{X}, {T}: Voodoo Doll deals damage equal to the number of pin counters on it to target creature or player. X is the number of pin counters on Voodoo Doll. -LEG R, CHR R, ME3 R - -Voracious Cobra -{2}{R}{G} -Creature - Snake -2/2 -First strike -Whenever Voracious Cobra deals combat damage to a creature, destroy that creature. -INV U - -Voracious Dragon -{3}{R}{R} -Creature - Dragon -4/4 -Flying -Devour 1 (As this enters the battlefield, you may sacrifice any number of creatures. This creature enters the battlefield with that many +1/+1 counters on it.) -When Voracious Dragon enters the battlefield, it deals damage to target creature or player equal to twice the number of Goblins it devoured. -CON R, DDG R - -Voracious Hatchling -{3}{W/B} -Creature - Elemental -6/6 -Lifelink -Voracious Hatchling enters the battlefield with four -1/-1 counters on it. -Whenever you cast a white spell, remove a -1/-1 counter from Voracious Hatchling. -Whenever you cast a black spell, remove a -1/-1 counter from Voracious Hatchling. -EVE U - -Vorinclex, Voice of Hunger -{6}{G}{G} -Legendary Creature - Praetor -7/6 -Trample -Whenever you tap a land for mana, add one mana to your mana pool of any type that land produced. -Whenever an opponent taps a land for mana, that land doesn't untap during its controller's next untap step. -NPH M - -Vorosh, the Hunter -{3}{G}{U}{B} -Legendary Creature - Dragon -6/6 -Flying -Whenever Vorosh, the Hunter deals combat damage to a player, you may pay {2}{G}. If you do, put six +1/+1 counters on Vorosh. -PLC R, COM R - -Vorrac Battlehorns -{2} -Artifact - Equipment -Equipped creature has trample and can't be blocked by more than one creature. -Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.) -MRD C - -Votary of the Conclave -{W} -Creature - Human Soldier -1/1 -{2}{G}: Regenerate Votary of the Conclave. -RAV C - -Vow of Duty -{2}{W} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2, has vigilance, and can't attack you or a planeswalker you control. -COM U - -Vow of Flight -{2}{U} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2, has flying, and can't attack you or a planeswalker you control. -COM U - -Vow of Lightning -{2}{R} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2, has first strike, and can't attack you or a planeswalker you control. -COM U - -Vow of Malice -{2}{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2, has intimidate, and can't attack you or a planeswalker you control. -COM U - -Vow of Wildness -{2}{G} -Enchantment - Aura -Enchant creature -Enchanted creature gets +3/+3, has trample, and can't attack you or a planeswalker you control. -COM U - -Voyager Drake -{3}{U} -Creature - Drake -3/3 -Multikicker {U} (You may pay an additional {U} any number of times as you cast this spell.) -Flying -When Voyager Drake enters the battlefield, up to X target creatures gain flying until end of turn, where X is the number of times Voyager Drake was kicked. -WWK U - -Voyager Staff -{1} -Artifact -{2}, Sacrifice Voyager Staff: Exile target creature. Return the exiled card to the battlefield under its owner's control at the beginning of the next end step. -RAV U - -Vug Lizard -{1}{R}{R} -Creature - Lizard -3/4 -Mountainwalk -Echo {1}{R}{R} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -USG U - -Vulshok Battlegear -{3} -Artifact - Equipment -Equipped creature gets +3/+3. -Equip {3} ({3}: Attach to target creature you control. Equip only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.) -MRD U - -Vulshok Battlemaster -{4}{R} -Creature - Human Warrior -2/2 -Haste -When Vulshok Battlemaster enters the battlefield, attach all Equipment on the battlefield to it. (Control of the Equipment doesn't change.) -MRD R - -Vulshok Berserker -{3}{R} -Creature - Human Berserker -3/2 -Haste (This creature can attack and {T} as soon as it comes under your control.) -MRD C, M11 C - -Vulshok Gauntlets -{2} -Artifact - Equipment -Equipped creature gets +4/+2 and doesn't untap during its controller's untap step. -Equip {3} ({3}: Attach to target creature you control. Equip only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.) -MRD C - -Vulshok Heartstoker -{2}{R} -Creature - Human Shaman -2/2 -When Vulshok Heartstoker enters the battlefield, target creature gets +2/+0 until end of turn. -SOM C - -Vulshok Morningstar -{2} -Artifact - Equipment -Equipped creature gets +2/+2. -Equip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) -DST C, 9ED U - -Vulshok Refugee -{1}{R}{R} -Creature - Human Warrior -3/2 -Protection from red -NPH U - -Vulshok Replica -{3} -Artifact Creature - Berserker -3/1 -{1}{R}, Sacrifice Vulshok Replica: Vulshok Replica deals 3 damage to target player. -SOM C - -Vulshok Sorcerer -{1}{R}{R} -Creature - Human Shaman -1/1 -Haste -{T}: Vulshok Sorcerer deals 1 damage to target creature or player. -5DN C, H10 C - -Vulshok War Boar -{2}{R}{R} -Creature - Boar Beast -5/5 -When Vulshok War Boar enters the battlefield, sacrifice it unless you sacrifice an artifact. -DST U - -Vulturous Zombie -{3}{B}{G} -Creature - Plant Zombie -3/3 -Flying -Whenever a card is put into an opponent's graveyard from anywhere, put a +1/+1 counter on Vulturous Zombie. -RAV R, COM R - -Wail of the Nim -{2}{B} -Instant -Choose one - Regenerate each creature you control; or Wail of the Nim deals 1 damage to each creature and each player. -Entwine {B} (Choose both if you pay the entwine cost.) -MRD C - -Waiting in the Weeds -{1}{G}{G} -Sorcery -Each player puts a 1/1 green Cat creature token onto the battlefield for each untapped Forest he or she controls. -MIR R, 6ED R - -Wake Thrasher -{2}{U} -Creature - Merfolk Soldier -1/1 -Whenever a permanent you control becomes untapped, Wake Thrasher gets +1/+1 until end of turn. -EVE R - -Wake of Destruction -{3}{R}{R}{R} -Sorcery -Destroy target land and all other lands with the same name as that land. -UDS R - -Wake of Vultures -{3}{B} -Creature - Bird -3/1 -Flying -{1}{B}, Sacrifice a creature: Regenerate Wake of Vultures. -VIS C - -Wakestone Gargoyle -{3}{W} -Creature - Gargoyle -3/4 -Defender (This creature can't attack.) -Flying -{1}{W}: Creatures you control with defender can attack this turn as though they didn't have defender. -DIS R - -Waking Nightmare -{2}{B} -Sorcery - Arcane -Target player discards two cards. -CHK C - -Walk the Aeons -{4}{U}{U} -Sorcery -Buyback-Sacrifice three Islands. (You may sacrifice three Islands in addition to any other costs as you cast this spell. If you do, put this card into your hand as it resolves.) -Target player takes an extra turn after this one. -TSP R - -Walker of Secret Ways -{2}{U} -Creature - Human Ninja -1/2 -Ninjutsu {1}{U} ({1}{U}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -Whenever Walker of Secret Ways deals combat damage to a player, look at that player's hand. -{1}{U}: Return target Ninja you control to its owner's hand. Activate this ability only during your turn. -BOK U - -Walker of the Grove -{6}{G}{G} -Creature - Elemental -7/7 -When Walker of the Grove leaves the battlefield, put a 4/4 green Elemental creature token onto the battlefield. -Evoke {4}{G} (You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield.) -MOR U - -Walking Archive -{3} -Artifact Creature - Golem -1/1 -Defender (This creature can't attack.) -Walking Archive enters the battlefield with a +1/+1 counter on it. -At the beginning of each player's upkeep, that player draws a card for each +1/+1 counter on Walking Archive. -{2}{W}{U}: Put a +1/+1 counter on Walking Archive. -DIS R - -Walking Atlas -{2} -Artifact Creature - Construct -1/1 -{T}: You may put a land card from your hand onto the battlefield. -WWK C - -Walking Dead -{1}{B} -Creature - Zombie -1/1 -{B}: Regenerate Walking Dead. -LEG C - -Walking Desecration -{2}{B} -Creature - Zombie -1/1 -{B}, {T}: Creatures of the creature type of your choice attack this turn if able. -ONS U - -Walking Dream -{3}{U} -Creature - Illusion -3/3 -Walking Dream is unblockable. -Walking Dream doesn't untap during your untap step if an opponent controls two or more creatures. -STH U - -Walking Sponge -{1}{U} -Creature - Sponge -1/1 -{T}: Target creature loses your choice of flying, first strike, or trample until end of turn. -ULG U - -Walking Wall -{4} -Artifact Creature - Wall -0/6 -Defender -{3}: Walking Wall gets +3/-1 until end of turn and can attack this turn as though it didn't have defender. Activate this ability only once each turn. -ICE U, MED U - -Wall of Air -{1}{U}{U} -Creature - Wall -1/5 -Defender, flying (This creature can't attack, and it can block creatures with flying.) -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, 6ED U, 7ED U, 8ED U, 10E U - -Wall of Blood -{2}{B} -Creature - Wall -0/2 -Defender (This creature can't attack.) -Pay 1 life: Wall of Blood gets +1/+1 until end of turn. -MRD U - -Wall of Blossoms -{1}{G} -Creature - Plant Wall -0/4 -Defender (This creature can't attack.) -When Wall of Blossoms enters the battlefield, draw a card. -STH U - -Wall of Bone -{2}{B} -Creature - Skeleton Wall -1/4 -Defender (This creature can't attack.) -{B}: Regenerate Wall of Bone. (The next time this creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.) -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, 7ED U, M10 U, GVL U - -Wall of Brambles -{2}{G} -Creature - Plant Wall -2/3 -Defender (This creature can't attack.) -{G}: Regenerate Wall of Brambles. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U - -Wall of Caltrops -{1}{W} -Creature - Wall -2/1 -Defender (This creature can't attack.) -Whenever Wall of Caltrops blocks a creature, if no non-Wall creatures are blocking that creature, Wall of Caltrops gains banding until end of turn. (If any creatures with banding you control are blocking a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by.) -LEG C - -Wall of Corpses -{1}{B} -Creature - Wall -0/2 -Defender (This creature can't attack.) -{B}, Sacrifice Wall of Corpses: Destroy target creature Wall of Corpses is blocking. -MIR C - -Wall of Deceit -{1}{U} -Creature - Wall -0/5 -Defender (This creature can't attack.) -{3}: Turn Wall of Deceit face down. -Morph {U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -LGN U, JVC U - -Wall of Denial -{1}{W}{U} -Creature - Wall -0/8 -Defender, flying -Shroud (This creature can't be the target of spells or abilities.) -ARB U, COM U - -Wall of Diffusion -{1}{R} -Creature - Wall -0/5 -Defender (This creature can't attack.) -Wall of Diffusion can block creatures with shadow as though Wall of Diffusion had shadow. -TMP C - -Wall of Distortion -{2}{B}{B} -Creature - Wall -1/3 -Defender (This creature can't attack.) -{2}{B}, {T}: Target player discards a card. Activate this ability only any time you could cast a sorcery. -MMQ C - -Wall of Dust -{2}{R} -Creature - Wall -1/4 -Defender (This creature can't attack.) -Whenever Wall of Dust blocks a creature, that creature can't attack during its controller's next turn. -LEG U, 4ED U - -Wall of Earth -{1}{R} -Creature - Wall -0/6 -Defender (This creature can't attack.) -LEG C - -Wall of Essence -{1}{W} -Creature - Wall -0/4 -Defender (This creature can't attack.) -Whenever Wall of Essence is dealt combat damage, you gain that much life. -STH U - -Wall of Faith -{3}{W} -Creature - Wall -0/5 -Defender (This creature can't attack.) -{W}: Wall of Faith gets +0/+1 until end of turn. -M10 C - -Wall of Fire -{1}{R}{R} -Creature - Wall -0/5 -Defender (This creature can't attack.) -{R}: Wall of Fire gets +1/+0 until end of turn. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, 6ED U, 7ED U, 10E U, M10 U - -Wall of Frost -{1}{U}{U} -Creature - Wall -0/7 -Defender (This creature can't attack.) -Whenever Wall of Frost blocks a creature, that creature doesn't untap during its controller's next untap step. -M10 U, M11 U - -Wall of Glare -{1}{W} -Creature - Wall -0/5 -Defender (This creature can't attack.) -Wall of Glare can block any number of creatures. -UDS C - -Wall of Granite -{2}{R} -Creature - Wall -0/7 -Defender (This creature can't attack.) -POR U - -Wall of Heat -{2}{R} -Creature - Wall -2/6 -Defender (This creature can't attack.) -LEG C, CHR C, BRB C - -Wall of Hope -{W} -Creature - Wall -0/3 -Defender (This creature can't attack.) -Whenever Wall of Hope is dealt damage, you gain that much life. -LGN C - -Wall of Ice -{2}{G} -Creature - Wall -0/7 -Defender (This creature can't attack.) -LEA U, LEB U, 2ED U, 3ED U, 4ED U - -Wall of Junk -{2} -Artifact Creature - Wall -0/7 -Defender (This creature can't attack.) -Whenever Wall of Junk blocks, return it to its owner's hand at end of combat. (Return it only if it's on the battlefield.) -USG U - -Wall of Kelp -{U}{U} -Creature - Plant Wall -0/3 -Defender (This creature can't attack.) -{U}{U}, {T}: Put a 0/1 blue Plant Wall creature token with defender named Kelp onto the battlefield. -HML R, ME2 C - -Wall of Lava -{1}{R}{R} -Creature - Wall -1/3 -Defender (This creature can't attack.) -{R}: Wall of Lava gets +1/+1 until end of turn. -ICE U - -Wall of Light -{2}{W} -Creature - Wall -1/5 -Defender (This creature can't attack.) -Protection from black -LEG U, ME3 C - -Wall of Mulch -{1}{G} -Creature - Wall -0/4 -Defender (This creature can't attack.) -{G}, Sacrifice a Wall: Draw a card. -ONS U - -Wall of Nets -{1}{W}{W} -Creature - Wall -0/7 -Defender (This creature can't attack.) -At end of combat, exile all creatures blocked by Wall of Nets. -When Wall of Nets leaves the battlefield, return all cards exiled with Wall of Nets to the battlefield under their owners' control. -EXO R - -Wall of Omens -{1}{W} -Creature - Wall -0/4 -Defender -When Wall of Omens enters the battlefield, draw a card. -ROE U, COM U - -Wall of Opposition -{3}{R}{R} -Creature - Wall -0/6 -Defender (This creature can't attack.) -{1}: Wall of Opposition gets +1/+0 until end of turn. -LEG R, CHR U - -Wall of Pine Needles -{3}{G} -Creature - Plant Wall -3/3 -Defender (This creature can't attack.) -{G}: Regenerate Wall of Pine Needles. -ICE U - -Wall of Putrid Flesh -{2}{B} -Creature - Wall -2/4 -Defender (This creature can't attack.) -Protection from white -Prevent all damage that would be dealt to Wall of Putrid Flesh by enchanted creatures. -LEG U - -Wall of Razors -{1}{R} -Creature - Wall -4/1 -Defender (This creature can't attack.) -First strike -STH U - -Wall of Resistance -{1}{W} -Creature - Wall -0/3 -Defender (This creature can't attack.) -Flying -At the beginning of each end step, if Wall of Resistance was dealt damage this turn, put a +0/+1 counter on it. -MIR C - -Wall of Reverence -{3}{W} -Creature - Spirit Wall -1/6 -Defender, flying -At the beginning of your end step, you may gain life equal to the power of target creature you control. -CON R - -Wall of Roots -{1}{G} -Creature - Plant Wall -0/5 -Defender -Put a -0/-1 counter on Wall of Roots: Add {G} to your mana pool. Activate this ability only once each turn. -MIR C, TSB S, ARC C - -Wall of Shadows -{1}{B}{B} -Creature - Wall -0/1 -Defender (This creature can't attack.) -Prevent all damage that would be dealt to Wall of Shadows by creatures it's blocking. -Wall of Shadows can't be the target of spells that can target only Walls or of abilities that can target only Walls. -LEG C, CHR C - -Wall of Shards -{1}{W} -Snow Creature - Wall -1/8 -Defender, flying -Cumulative upkeep-An opponent gains 1 life. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -CSP U - -Wall of Shields -{3} -Artifact Creature - Wall -0/4 -Defender (This creature can't attack.) -Banding (If any creatures with banding you control are blocking a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by.) -ICE U - -Wall of Souls -{1}{B} -Creature - Wall -0/4 -Defender (This creature can't attack.) -Whenever Wall of Souls is dealt combat damage, it deals that much damage to target opponent. -STH U - -Wall of Spears -{3} -Artifact Creature - Wall -2/3 -Defender (This creature can't attack.) -First strike -ATQ U, 4ED C, 5ED C, 7ED U, 8ED U - -Wall of Stone -{1}{R}{R} -Creature - Wall -0/8 -Defender (This creature can't attack.) -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, 8ED U - -Wall of Swords -{3}{W} -Creature - Wall -3/5 -Defender, flying (This creature can't attack, and it can block creatures with flying.) -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, POR U, 6ED U, 7ED U, 8ED U, 10E U - -Wall of Tanglecord -{2} -Artifact Creature - Wall -0/6 -Defender -{G}: Wall of Tanglecord gains reach until end of turn. (It can block creatures with flying.) -SOM C - -Wall of Tears -{1}{U} -Creature - Wall -0/4 -Defender (This creature can't attack.) -Whenever Wall of Tears blocks a creature, return that creature to its owner's hand at end of combat. -STH U - -Wall of Tombstones -{1}{B} -Creature - Wall -0/1 -Defender (This creature can't attack.) -At the beginning of your upkeep, Wall of Tombstones's toughness becomes 1 plus the number of creature cards in your graveyard. (This effect lasts indefinitely.) -LEG U - -Wall of Torches -{1}{R} -Creature - Wall -4/1 -Defender (This creature can't attack.) -M12 C - -Wall of Vapor -{3}{U} -Creature - Wall -0/1 -Defender (This creature can't attack.) -Prevent all damage that would be dealt to Wall of Vapor by creatures it's blocking. -LEG C, CHR C - -Wall of Vines -{G} -Creature - Plant Wall -0/3 -Defender (This creature can't attack.) -Reach (This creature can block creatures with flying.) -M11 C - -Wall of Vipers -{2}{B} -Creature - Snake Wall -2/4 -Defender (This creature can't attack.) -{3}: Destroy Wall of Vipers and target creature it's blocking. Any player may activate this ability. -PCY U - -Wall of Water -{1}{U}{U} -Creature - Wall -0/5 -Defender (This creature can't attack.) -{U}: Wall of Water gets +1/+0 until end of turn. -LEA U, LEB U, 2ED U, 3ED U, 4ED U - -Wall of Wonder -{2}{U}{U} -Creature - Wall -1/5 -Defender (This creature can't attack.) -{2}{U}{U}: Wall of Wonder gets +4/-4 until end of turn and can attack this turn as though it didn't have defender. -LEG U, CHR U, 7ED R - -Wall of Wood -{G} -Creature - Wall -0/3 -Defender (This creature can't attack.) -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 10E C - -Wallop -{1}{G} -Sorcery -Destroy target blue or black creature with flying. -INV U - -Wand of Denial -{2} -Artifact -{T}: Look at the top card of target player's library. If it's a nonland card, you may pay 2 life. If you do, put it into that player's graveyard. -VIS R, 6ED R - -Wand of Ith -{4} -Artifact -{3}, {T}: Target player reveals a card at random from his or her hand. If it's a land card, that player discards it unless he or she pays 1 life. If it isn't a land card, the player discards it unless he or she pays life equal to its converted mana cost. Activate this ability only during your turn. -DRK U - -Wand of the Elements -{4} -Artifact -{T}, Sacrifice an Island: Put a 2/2 blue Elemental creature token with flying onto the battlefield. -{T}, Sacrifice a Mountain: Put a 3/3 red Elemental creature token onto the battlefield. -DST R - -Wanderbrine Rootcutters -{2}{U/B}{U/B} -Creature - Merfolk Rogue -3/3 -Wanderbrine Rootcutters can't be blocked by green creatures. -SHM C - -Wanderer's Twig -{1} -Artifact -{1}, Sacrifice Wanderer's Twig: Search your library for a basic land card, reveal it, and put it into your hand. Then shuffle your library. -LRW C - -Wanderguard Sentry -{4}{U} -Creature - Drone -3/3 -When Wanderguard Sentry enters the battlefield, look at target opponent's hand. -MRD C, 9ED C - -Wandering Eye -{2}{U} -Creature - Illusion -1/3 -Flying -Players play with their hands revealed. -NEM C - -Wandering Goblins -{2}{R} -Creature - Goblin Warrior -0/3 -Domain - {3}: Wandering Goblins gets +1/+0 until end of turn for each basic land type among lands you control. -CON C - -Wandering Graybeard -{3}{W}{W} -Creature - Giant Wizard -4/4 -Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Wandering Graybeard, you may reveal it. If you do, you gain 4 life. -MOR U - -Wandering Mage -{W}{U}{B} -Creature - Human Cleric Wizard -0/3 -{W}, Pay 1 life: Prevent the next 2 damage that would be dealt to target creature this turn. -{U}: Prevent the next 1 damage that would be dealt to target Cleric or Wizard creature this turn. -{B}, Put a -1/-1 counter on a creature you control: Prevent the next 2 damage that would be dealt to target player this turn. -ALL R, ME3 R - -Wandering Ones -{U} -Creature - Spirit -1/1 -CHK C - -Wandering Stream -{2}{G} -Sorcery -Domain - You gain 2 life for each basic land type among lands you control. -INV C - -Wanderlust -{2}{G} -Enchantment - Aura -Enchant creature -At the beginning of the upkeep of enchanted creature's controller, Wanderlust deals 1 damage to that player. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, MED C - -Wanderwine Hub -Land -As Wanderwine Hub enters the battlefield, you may reveal a Merfolk card from your hand. If you don't, Wanderwine Hub enters the battlefield tapped. -{T}: Add {W} or {U} to your mana pool. -LRW R - -Wanderwine Prophets -{4}{U}{U} -Creature - Merfolk Wizard -4/4 -Champion a Merfolk (When this enters the battlefield, sacrifice it unless you exile another Merfolk you control. When this leaves the battlefield, that card returns to the battlefield.) -Whenever Wanderwine Prophets deals combat damage to a player, you may sacrifice a Merfolk. If you do, take an extra turn after this one. -LRW R - -Waning Wurm -{3}{B} -Creature - Zombie Wurm -7/6 -Vanishing 2 (This permanent enters the battlefield with two time counters on it. At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.) -PLC U - -War Barge -{4} -Artifact -{3}: Target creature gains islandwalk until end of turn. When War Barge leaves the battlefield this turn, destroy that creature. A creature destroyed this way can't be regenerated. -DRK U, TSB S - -War Cadence -{2}{R} -Enchantment -{X}{R}: This turn, creatures can't block unless their controller pays {X} for each blocking creature he or she controls. -MMQ U - -War Chariot -{3} -Artifact -{3}, {T}: Target creature gains trample until end of turn. -ICE U - -War Dance -{G} -Enchantment -At the beginning of your upkeep, you may put a verse counter on War Dance. -Sacrifice War Dance: Target creature gets +X/+X until end of turn, where X is the number of verse counters on War Dance. -USG U - -War Elemental -{R}{R}{R} -Creature - Elemental -1/1 -When War Elemental enters the battlefield, sacrifice it unless an opponent was dealt damage this turn. -Whenever an opponent is dealt damage, put that many +1/+1 counters on War Elemental. -MRD R - -War Elephant -{3}{W} -Creature - Elephant -2/2 -Trample; banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -ARN C (x2), CHR C - -War Mammoth -{3}{G} -Creature - Elephant -3/3 -Trample -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, ME4 C - -War Priest of Thune -{1}{W} -Creature - Human Cleric -2/2 -When War Priest of Thune enters the battlefield, you may destroy target enchantment. -M11 U - -War Report -{3}{W} -Instant -You gain life equal to the number of creatures on the battlefield plus the number of artifacts on the battlefield. -NPH C - -War Tax -{2}{U} -Enchantment -{X}{U}: This turn, creatures can't attack unless their controller pays {X} for each attacking creature he or she controls. -MMQ U - -War's Toll -{3}{R} -Enchantment -Whenever an opponent taps a land for mana, tap all lands that player controls. -If a creature an opponent controls attacks, all creatures that opponent controls attack if able. -DIS R - -War-Spike Changeling -{3}{R} -Creature - Shapeshifter -3/3 -Changeling (This card is every creature type at all times.) -{R}: War-Spike Changeling gains first strike until end of turn. -MOR C - -War-Torch Goblin -{R} -Creature - Goblin Warrior -1/1 -{R}, Sacrifice War-Torch Goblin: War-Torch Goblin deals 2 damage to target blocking creature. -RAV C - -Warbreak Trumpeter -{R} -Creature - Goblin -1/1 -Morph {X}{X}{R} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Warbreak Trumpeter is turned face up, put X 1/1 red Goblin creature tokens onto the battlefield. -LGN U - -Ward Sliver -{4}{W} -Creature - Sliver -2/2 -As Ward Sliver enters the battlefield, choose a color. -All Slivers have protection from the chosen color. -LGN U - -Ward of Bones -{6} -Artifact -Each opponent who controls more creatures than you can't play creature cards. The same is true for artifacts, enchantments, and lands. -EVE R - -Ward of Lights -{W}{W} -Enchantment - Aura -You may cast Ward of Lights as though it had flash. If you cast it any time a sorcery couldn't have been cast, the controller of the permanent it becomes sacrifices it at the beginning of the next cleanup step. -Enchant creature -As Ward of Lights enters the battlefield, choose a color. -Enchanted creature has protection from the chosen color. This effect doesn't remove Ward of Lights. -MIR C - -Ward of Piety -{1}{W} -Enchantment - Aura -Enchant creature -{1}{W}: The next 1 damage that would be dealt to enchanted creature this turn is dealt to target creature or player instead. -BOK U - -Wargate -{X}{G}{W}{U} -Sorcery -Search your library for a permanent card with converted mana cost X or less, put it onto the battlefield, then shuffle your library. -ARB R - -Warlord's Axe -{3} -Artifact - Equipment -Equipped creature gets +3/+1. -Equip {4} ({4}: Attach to target creature you control. Equip only as a sorcery.) -M11 U - -Warmonger -{3}{R} -Creature - Minotaur Monger -3/3 -{2}: Warmonger deals 1 damage to each creature without flying and each player. Any player may activate this ability. -MMQ U - -Warmonger's Chariot -{2} -Artifact - Equipment -Equipped creature gets +2/+2. -As long as equipped creature has defender, it can attack as though it didn't have defender. -Equip {3} -ROE U - -Warmth -{1}{W} -Enchantment -Whenever an opponent casts a red spell, you gain 2 life. -TMP U, 6ED U - -Warning -{W} -Instant -Prevent all combat damage that would be dealt by target attacking creature this turn. -ICE C, ME2 C - -Warp Artifact -{B}{B} -Enchantment - Aura -Enchant artifact -At the beginning of the upkeep of enchanted artifact's controller, Warp Artifact deals 1 damage to that player. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, ME4 C - -Warp World -{5}{R}{R}{R} -Sorcery -Each player shuffles all permanents he or she owns into his or her library, then reveals that many cards from the top of his or her library. Each player puts all artifact, creature, and land cards revealed this way onto the battlefield, then does the same for enchantment cards, then puts all cards revealed this way that weren't put onto the battlefield on the bottom of his or her library. -RAV R, 10E R, M10 R - -Warpath -{3}{R} -Instant -Warpath deals 3 damage to each blocking creature and each blocked creature. -MMQ U - -Warpath Ghoul -{2}{B} -Creature - Zombie -3/2 -M10 C, M12 C - -Warped Devotion -{2}{B} -Enchantment -Whenever a permanent is returned to a player's hand, that player discards a card. -PLS U, 8ED R - -Warped Researcher -{4}{U} -Creature - Human Wizard Mutant -3/4 -Whenever a player cycles a card, Warped Researcher gains flying and shroud until end of turn. (It can't be the target of spells or abilities.) -LGN U - -Warping Wurm -{2}{G}{U} -Creature - Wurm -1/1 -Phasing (This phases in or out before you untap during each of your untap steps. While it's phased out, it's treated as though it doesn't exist.) -At the beginning of your upkeep, Warping Wurm phases out unless you pay {2}{G}{U}. -When Warping Wurm phases in, put a +1/+1 counter on it. -MIR R - -Warren Instigator -{R}{R} -Creature - Goblin Berserker -1/1 -Double strike -Whenever Warren Instigator deals damage to an opponent, you may put a Goblin creature card from your hand onto the battlefield. -ZEN M - -Warren Pilferers -{4}{B} -Creature - Goblin Rogue -3/3 -When Warren Pilferers enters the battlefield, return target creature card from your graveyard to your hand. If that card is a Goblin card, Warren Pilferers gains haste until end of turn. -LRW C - -Warren Weirding -{1}{B} -Tribal Sorcery - Goblin -Target player sacrifices a creature. If a Goblin is sacrificed this way, that player puts two 1/1 black Goblin Rogue creature tokens onto the battlefield, and those tokens gain haste until end of turn. -MOR U - -Warren-Scourge Elf -{1}{G} -Creature - Elf Warrior -1/1 -Protection from Goblins -LRW C - -Warrior Angel -{4}{W}{W} -Creature - Angel Warrior -3/4 -Flying -Whenever Warrior Angel deals damage, you gain that much life. -STH R - -Warrior en-Kor -{W}{W} -Creature - Kor Warrior Knight -2/2 -{0}: The next 1 damage that would be dealt to Warrior en-Kor this turn is dealt to target creature you control instead. -STH U - -Warrior's Charge -{2}{W} -Sorcery -Creatures you control get +1/+1 until end of turn. -POR C (x2) - -Warrior's Honor -{2}{W} -Instant -Creatures you control get +1/+1 until end of turn. -VIS C, 6ED C, 9ED C, 10E C - -Warrior's Oath -{R}{R} -Sorcery -Take an extra turn after this one. At the beginning of that turn's end step, you lose the game. -PTK R - -Warrior's Stand -{1}{W} -Instant -Cast Warrior's Stand only during the declare attackers step and only if you've been attacked this step. -Creatures you control get +2/+2 until end of turn. -P02 U, PTK U - -Warstorm Surge -{5}{R} -Enchantment -Whenever a creature enters the battlefield under your control, it deals damage equal to its power to target creature or player. -M12 R - -Warthog -{1}{G}{G} -Creature - Boar -3/2 -Swampwalk -VIS C, 6ED U - -Wash Out -{3}{U} -Sorcery -Return all permanents of the color of your choice to their owners' hands. -INV U - -Wasp Lancer -{U/B}{U/B}{U/B} -Creature - Faerie Soldier -3/2 -Flying -SHM U - -Waste Away -{4}{B} -Instant -As an additional cost to cast Waste Away, discard a card. -Target creature gets -5/-5 until end of turn. -TOR C - -Wasteland -Land -{T}: Add {1} to your mana pool. -{T}, Sacrifice Wasteland: Destroy target nonbasic land. -TMP U - -Watchdog -{3} -Artifact Creature - Hound -1/2 -Watchdog blocks each turn if able. -As long as Watchdog is untapped, all creatures attacking you get -1/-0. -TMP U - -Watcher Sliver -{3}{W} -Creature - Sliver -2/2 -All Sliver creatures get +0/+2. -TSP C - -Watchwing Scarecrow -{4} -Artifact Creature - Scarecrow -2/4 -Watchwing Scarecrow has vigilance as long as you control a white creature. -Watchwing Scarecrow has flying as long as you control a blue creature. -SHM C - -Watchwolf -{G}{W} -Creature - Wolf -3/3 -RAV U, ARC U - -Water Elemental -{3}{U}{U} -Creature - Elemental -5/4 -LEA U, LEB U, 2ED U, 3ED U, 4ED U, S99 U, ME4 U - -Water Servant -{2}{U}{U} -Creature - Elemental -3/4 -{U}: Water Servant gets +1/-1 until end of turn. -{U}: Water Servant gets -1/+1 until end of turn. -M11 U - -Water Wurm -{U} -Creature - Wurm -1/1 -Water Wurm gets +0/+1 as long as an opponent controls an Island. -DRK C - -Waterfront Bouncer -{1}{U} -Creature - Merfolk Spellshaper -1/1 -{U}, {T}, Discard a card: Return target creature to its owner's hand. -MMQ C - -Waterspout Djinn -{2}{U}{U} -Creature - Djinn -4/4 -Flying -At the beginning of your upkeep, sacrifice Waterspout Djinn unless you return an untapped Island you control to its owner's hand. -VIS U, JVC U - -Waterspout Elemental -{3}{U}{U} -Creature - Elemental -3/4 -Kicker {U} (You may pay an additional {U} as you cast this spell.) -Flying -When Waterspout Elemental enters the battlefield, if it was kicked, return all other creatures to their owners' hands and you skip your next turn. -PLS R - -Waterspout Weavers -{3}{U}{U} -Creature - Merfolk Wizard -3/3 -Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Waterspout Weavers, you may reveal it. If you do, each creature you control gains flying until end of turn. -MOR U - -Waterveil Cavern -Land -{T}: Add {1} to your mana pool. -{T}: Add {U} or {B} to your mana pool. Waterveil Cavern doesn't untap during your next untap step. -CHK U - -Watery Grave -Land - Island Swamp -({T}: Add {U} or {B} to your mana pool.) -As Watery Grave enters the battlefield, you may pay 2 life. If you don't, Watery Grave enters the battlefield tapped. -RAV R - -Wave Elemental -{2}{U}{U} -Creature - Elemental -2/3 -{U}, {T}, Sacrifice Wave Elemental: Tap up to three target creatures without flying. -MIR U - -Wave of Indifference -{X}{R} -Sorcery -X target creatures can't block this turn. -ONS C - -Wave of Reckoning -{4}{W} -Sorcery -Each creature deals damage to itself equal to its power. -MMQ R - -Wave of Terror -{2}{B} -Enchantment -Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -At the beginning of your draw step, destroy each creature with converted mana cost equal to the number of age counters on Wave of Terror. They can't be regenerated. -WTH R - -Waves of Aggression -{3}{R/W}{R/W} -Sorcery -Untap all creatures that attacked this turn. After this main phase, there is an additional combat phase followed by an additional main phase. -Retrace (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) -EVE R - -Waveskimmer Aven -{2}{G}{W}{U} -Creature - Bird Soldier -2/4 -Flying -Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.) -ALA C - -Wax -{G} -Instant -Target creature gets +2/+2 until end of turn. ----- -Wane -{W} -Instant -Destroy target enchantment. -INV U (x2), ARC U - -Waxmane Baku -{2}{W} -Creature - Spirit -2/2 -Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Waxmane Baku. -{1}, Remove X ki counters from Waxmane Baku: Tap X target creatures. -BOK C - -Wayfarer's Bauble -{1} -Artifact -{2}, {T}, Sacrifice Wayfarer's Bauble: Search your library for a basic land card and put that card onto the battlefield tapped. Then shuffle your library. -5DN C - -Wayfaring Giant -{5}{W} -Creature - Giant -1/3 -Domain - Wayfaring Giant gets +1/+1 for each basic land type among lands you control. -INV U - -Waylay -{2}{W} -Instant -Put three 2/2 white Knight creature tokens onto the battlefield. Exile them at the beginning of the next cleanup step. -USG U - -Wayward Angel -{4}{W}{W} -Creature - Angel Horror -4/4 -Flying, vigilance -Threshold - As long as seven or more cards are in your graveyard, Wayward Angel gets +3/+3, is black, has trample, and has "At the beginning of your upkeep, sacrifice a creature." -ODY R - -Wayward Soul -{2}{U}{U} -Creature - Spirit -3/2 -Flying -{U}: Put Wayward Soul on top of its owner's library. -EXO C, BTD C - -Weakness -{B} -Enchantment - Aura -Enchant creature -Enchanted creature gets -2/-1. -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, BRB C, M10 C, ME4 C - -Weakstone -{4} -Artifact -Attacking creatures get -1/-0. -ATQ U, ME4 U - -Wear Away -{G}{G} -Instant - Arcane -Destroy target artifact or enchantment. -Splice onto Arcane {3}{G} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) -CHK C - -Weathered Bodyguards -{5}{W} -Creature - Human Soldier -2/5 -As long as Weathered Bodyguards is untapped, all combat damage that would be dealt to you by unblocked creatures is dealt to Weathered Bodyguards instead. -Morph {3}{W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -TSP R - -Weathered Wayfarer -{W} -Creature - Human Nomad Cleric -1/1 -{W}, {T}: Search your library for a land card, reveal it, and put it into your hand. Then shuffle your library. Activate this ability only if an opponent controls more lands than you. -ONS R, 9ED R - -Weatherseed Elf -{G} -Creature - Elf -1/1 -{T}: Target creature gains forestwalk until end of turn. -ULG C - -Weatherseed Faeries -{2}{U} -Creature - Faerie -2/1 -Flying, protection from red -ULG C - -Weatherseed Totem -{3} -Artifact -{T}: Add {G} to your mana pool. -{2}{G}{G}{G}: Weatherseed Totem becomes a 5/3 green Treefolk artifact creature with trample until end of turn. -When Weatherseed Totem is put into a graveyard from the battlefield, if it was a creature, return this card to its owner's hand. -TSP U - -Weatherseed Treefolk -{2}{G}{G}{G} -Creature - Treefolk -5/3 -Trample -When Weatherseed Treefolk dies, return it to its owner's hand. -ULG R - -Weaver of Lies -{5}{U}{U} -Creature - Beast -4/4 -Morph {4}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Weaver of Lies is turned face up, turn any number of target creatures with morph other than Weaver of Lies face down. -LGN R - -Web -{G} -Enchantment - Aura -Enchant creature (Target a creature as you cast this. This card enters the battlefield attached to that creature.) -Enchanted creature gets +0/+2 and has reach. (It can block creatures with flying.) -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 9ED U - -Web of Inertia -{2}{U} -Enchantment -At the beginning of each opponent's combat, that player may exile a card from his or her graveyard. If the player doesn't, creatures he or she controls can't attack you this turn. -JUD U - -Wee Dragonauts -{1}{U}{R} -Creature - Faerie Wizard -1/3 -Flying -Whenever you cast an instant or sorcery spell, Wee Dragonauts gets +2/+0 until end of turn. -GPT C - -Weed Strangle -{3}{B}{B} -Sorcery -Destroy target creature. Clash with an opponent. If you win, you gain life equal to that creature's toughness. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -LRW C - -Weed-Pruner Poplar -{4}{B} -Creature - Treefolk Assassin -3/3 -At the beginning of your upkeep, target creature other than Weed-Pruner Poplar gets -1/-1 until end of turn. -MOR C - -Wei Ambush Force -{1}{B} -Creature - Human Soldier -1/1 -Whenever Wei Ambush Force attacks, it gets +2/+0 until end of turn. -PTK C - -Wei Assassins -{3}{B}{B} -Creature - Human Soldier Assassin -3/2 -When Wei Assassins enters the battlefield, target opponent chooses a creature he or she controls. Destroy it. -PTK U - -Wei Elite Companions -{4}{B} -Creature - Human Soldier -3/3 -Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -PTK U, ME3 C - -Wei Infantry -{1}{B} -Creature - Human Soldier -2/1 -PTK C, ME3 C - -Wei Night Raiders -{2}{B}{B} -Creature - Human Soldier -2/2 -Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -Whenever Wei Night Raiders deals damage to an opponent, that player discards a card. -PTK U, ME3 U - -Wei Scout -{1}{B} -Creature - Human Soldier Scout -1/1 -Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -PTK C - -Wei Strike Force -{2}{B} -Creature - Human Soldier -2/1 -Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -PTK C, ME3 C - -Weight of Conscience -{1}{W} -Enchantment - Aura -Enchant creature -Enchanted creature can't attack. -Tap two untapped creatures you control that share a creature type: Exile enchanted creature. -MOR C - -Weight of Spires -{R} -Instant -Weight of Spires deals damage to target creature equal to the number of nonbasic lands that creature's controller controls. -DIS U - -Weird Harvest -{X}{G}{G} -Sorcery -Each player may search his or her library for up to X creature cards, reveal those cards, and put them into his or her hand. Then each player who searched his or her library this way shuffles it. -ONS R, 9ED R - -Weirding Shaman -{1}{B} -Creature - Goblin Shaman -2/1 -{3}{B}, Sacrifice a Goblin: Put two 1/1 black Goblin Rogue creature tokens onto the battlefield. -MOR R - -Welding Jar -{0} -Artifact -Sacrifice Welding Jar: Regenerate target artifact. -MRD C - -Welkin Guide -{4}{W} -Creature - Bird Cleric -2/2 -Flying -When Welkin Guide enters the battlefield, target creature gets +2/+2 and gains flying until end of turn. -ALA C - -Welkin Hawk -{1}{W} -Creature - Bird -1/1 -Flying -When Welkin Hawk dies, you may search your library for a card named Welkin Hawk, reveal that card, put it into your hand, then shuffle your library. -EXO C - -Welkin Tern -{1}{U} -Creature - Bird -2/1 -Flying -Welkin Tern can block only creatures with flying. -ZEN C - -Well of Discovery -{6} -Artifact -At the beginning of your end step, if you control no untapped lands, draw a card. -PCY R - -Well of Knowledge -{3} -Artifact -{2}: Draw a card. Any player may activate this ability but only during his or her draw step. -WTH R - -Well of Life -{4} -Artifact -At the beginning of your end step, if you control no untapped lands, you gain 2 life. -PCY U - -Well of Lost Dreams -{4} -Artifact -Whenever you gain life, you may pay {X}, where X is less than or equal to the amount of life you gained. If you do, draw X cards. -DST R - -Well-Laid Plans -{2}{U} -Enchantment -Prevent all damage that would be dealt to a creature by another creature if they share a color. -INV R - -Wellgabber Apothecary -{4}{W} -Creature - Merfolk Cleric -2/3 -{1}{W}: Prevent all damage that would be dealt to target tapped Merfolk or Kithkin creature this turn. -LRW C - -Wellspring -{1}{G}{W} -Enchantment - Aura -Enchant land -When Wellspring enters the battlefield, gain control of enchanted land until end of turn. -At the beginning of your upkeep, untap enchanted land. You gain control of that land until end of turn. -MIR R - -Wellwisher -{1}{G} -Creature - Elf -1/1 -{T}: You gain 1 life for each Elf on the battlefield. -ONS C, EVG C - -Werebear -{1}{G} -Creature - Human Bear Druid -1/1 -{T}: Add {G} to your mana pool. -Threshold - Werebear gets +3/+3 as long as seven or more cards are in your graveyard. -ODY C - -Western Paladin -{2}{B}{B} -Creature - Zombie Knight -3/3 -{B}{B}, {T}: Destroy target white creature. -USG R, 7ED R, 8ED R - -Whalebone Glider -{2} -Artifact -{2}, {T}: Target creature with power 3 or less gains flying until end of turn. -ICE U - -Wheel and Deal -{3}{U} -Instant -Any number of target opponents each discards his or her hand and draws seven cards. -Draw a card. -ONS R - -Wheel of Fate -Sorcery -Wheel of Fate is red. -Suspend 4-{1}{R} (Rather than cast this card from your hand, pay {1}{R} and exile it with four time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) -Each player discards his or her hand, then draws seven cards. -TSP R - -Wheel of Fortune -{2}{R} -Sorcery -Each player discards his or her hand and draws seven cards. -LEA R, LEB R, 2ED R, 3ED R, ME4 R - -Wheel of Sun and Moon -{G/W}{G/W} -Enchantment - Aura -Enchant player -If a card would be put into enchanted player's graveyard from anywhere, instead that card is revealed and put on the bottom of that player's library. -SHM R - -Wheel of Torture -{3} -Artifact -At the beginning of each opponent's upkeep, Wheel of Torture deals X damage to that player, where X is 3 minus the number of cards in his or her hand. -ULG R - -Where Ancients Tread -{4}{R} -Enchantment -Whenever a creature with power 5 or greater enters the battlefield under your control, you may have Where Ancients Tread deal 5 damage to target creature or player. -ALA R - -Whetstone -{3} -Artifact -{3}: Each player puts the top two cards of his or her library into his or her graveyard. -USG R - -Whetwheel -{4} -Artifact -{X}{X}, {T}: Target player puts the top X cards of his or her library into his or her graveyard. -Morph {3} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -FUT R - -Which of You Burns Brightest? -Scheme -When you set this scheme in motion, you may pay {X}. If you do, this scheme deals X damage to target opponent and each creature he or she controls. -ARC C - -Whim of Volrath -{U} -Instant -Buyback {2} (You may pay an additional {2} as you cast this spell. If you do, put this card into your hand as it resolves.) -Change the text of target permanent by replacing all instances of one color word or basic land type with another until end of turn. (For example, you may change "nonred creature" to "nongreen creature" or "plainswalk" to "swampwalk.") -TMP R - -Whimsy -{X}{U}{U} -Sorcery -Perform X random actions from the following list: -Return a permanent that isn't enchanted chosen at random to its owner's hand. -Untap a artifact, creature or land chosen at random. -Tap a artifact, creature or land chosen at random. -Whimsy deals 4 damage to a creature or player chosen at random. -A player chosen at random draws three cards. -Destroy an artifact chosen at random. It can't be regenerated. That artifact's controller gains life equal to its converted mana cost. -Destroy an artifact or enchantment chosen at random. -A player chosen at random gains 3 life. -Prevent the next 3 damage that would be dealt to a creature or player chosen at random this turn. -Destroy a creature or land chosen at random. It can't be regenerated. -A player chosen at random puts the top two cards of his or her library into his or her graveyard. -Put a 1/1 colorless Insect artifact creature token with flying named Wasp onto the battlefield. (It can't be blocked except by creatures with flying or reach.) -Destroy all artifacts, creatures and enchantments. -Flip a coin. If you lose the flip, Whimsy deals 5 damage to you. If you win the flip, put a 5/5 colorless Djinn artifact creature token with flying onto the battlefield. -Choose a creature card at random from all players' decklists. For each player, flip a coin. If the flip ends up heads, put a token that's a copy of that creature card onto the battlefield under that player's control. -A player chosen at random discards a card. -Prevent all combat damage that would be dealt this turn. -Draw a card and reveal it. If it isn't a land card, discard it. -ASTRAL S - -Whimwader -{4}{U} -Creature - Elemental -6/4 -Whimwader can't attack unless defending player controls a blue permanent. -SHM C - -Whip Sergeant -{2}{R} -Creature - Human Soldier -2/1 -{R}: Target creature gains haste until end of turn. (It can attack this turn.) -PCY U, 9ED U - -Whip Silk -{G} -Enchantment - Aura -Enchant creature -Enchanted creature has reach. (It can block creatures with flying.) -{G}: Return Whip Silk to its owner's hand. -INV C - -Whip Vine -{2}{G} -Creature - Plant Wall -1/4 -Defender; reach (This creature can block creatures with flying.) -You may choose not to untap Whip Vine during your untap step. -{T}: Tap target creature with flying blocked by Whip Vine. That creature doesn't untap during its controller's untap step for as long as Whip Vine remains tapped. -ALL C (x2) - -Whip-Spine Drake -{3}{U}{U} -Creature - Drake -3/3 -Flying -Morph {2}{W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -FUT C - -Whipcorder -{W}{W} -Creature - Human Soldier Rebel -2/2 -{W}, {T}: Tap target creature. -Morph {W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -ONS U - -Whipflare -{1}{R} -Sorcery -Whipflare deals 2 damage to each nonartifact creature. -NPH U - -Whipgrass Entangler -{2}{W} -Creature - Human Cleric -1/3 -{1}{W}: Until end of turn, target creature gains "This creature can't attack or block unless its controller pays {1} for each Cleric on the battlefield." -LGN C - -Whipkeeper -{2}{R}{R} -Creature - Dwarf -1/1 -{T}: Whipkeeper deals damage to target creature equal to the damage already dealt to it this turn. -ODY U - -Whiplash Trap -{3}{U}{U} -Instant - Trap -If an opponent had two or more creatures enter the battlefield under his or her control this turn, you may pay {U} rather than pay Whiplash Trap's mana cost. -Return two target creatures to their owners' hands. -HOP C, ZEN C - -Whippoorwill -{G} -Creature - Bird -1/1 -{G}{G}, {T}: Target creature can't be regenerated this turn. Damage that would be dealt to that creature this turn can't be prevented or dealt instead to another creature or player. When the creature dies this turn, exile the creature. -DRK U - -Whipstitched Zombie -{1}{B} -Creature - Zombie -2/2 -At the beginning of your upkeep, sacrifice Whipstitched Zombie unless you pay {B}. -PCY C - -Whiptail Moloch -{4}{R} -Creature - Lizard -6/3 -When Whiptail Moloch enters the battlefield, it deals 3 damage to target creature you control. -DIS C - -Whiptail Wurm -{6}{G} -Creature - Wurm -8/5 -POR U, S99 U, ME4 U - -Whiptongue Frog -{2}{U} -Creature - Frog -1/3 -{U}: Whiptongue Frog gains flying until end of turn. -EXO C - -Whirling Catapult -{4} -Artifact -{2}, Exile the top two cards of your library: Whirling Catapult deals 1 damage to each creature with flying and each player. -ALL U, ME2 U - -Whirling Dervish -{G}{G} -Creature - Human Monk -1/1 -Protection from black -At the beginning of each end step, if Whirling Dervish dealt damage to an opponent this turn, put a +1/+1 counter on it. -LEG U, 4ED U, 5ED U, TSB S - -Whirlpool Drake -{3}{U} -Creature - Drake -2/2 -Flying -When Whirlpool Drake enters the battlefield, shuffle the cards from your hand into your library, then draw that many cards. -When Whirlpool Drake dies, shuffle the cards from your hand into your library, then draw that many cards. -APC U - -Whirlpool Rider -{1}{U} -Creature - Merfolk -1/1 -When Whirlpool Rider enters the battlefield, shuffle the cards from your hand into your library, then draw that many cards. -APC C - -Whirlpool Warrior -{2}{U} -Creature - Merfolk Warrior -2/2 -When Whirlpool Warrior enters the battlefield, shuffle the cards from your hand into your library, then draw that many cards. -{R}, Sacrifice Whirlpool Warrior: Each player shuffles the cards from his or her hand into his or her library, then draws that many cards. -APC R - -Whirlpool Whelm -{1}{U} -Instant -Clash with an opponent, then return target creature to its owner's hand. If you win, you may put that creature on top of its owner's library instead. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -LRW C, COM C - -Whirlwind -{2}{G}{G} -Sorcery -Destroy all creatures with flying. -USG R, S99 R - -Whispering Shade -{3}{B} -Creature - Shade -1/1 -Swampwalk -{B}: Whispering Shade gets +1/+1 until end of turn. -ODY C - -Whispering Specter -{1}{B}{B} -Creature - Specter -1/1 -Flying -Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -Whenever Whispering Specter deals combat damage to a player, you may sacrifice it. If you do, that player discards a card for each poison counter he or she has. -NPH U - -Whispers of the Muse -{U} -Instant -Buyback {5} (You may pay an additional {5} as you cast this spell. If you do, put this card into your hand as it resolves.) -Draw a card. -TMP U, TSB S - -Whispersilk Cloak -{3} -Artifact - Equipment -Equipped creature is unblockable. -Equipped creature has shroud. (It can't be the target of spells or abilities.) -Equip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) -DST C, 10E U, M10 U, PVC U, M11 U - -White Knight -{W}{W} -Creature - Human Knight -2/2 -First strike (This creature deals combat damage before creatures without first strike.) -Protection from black (This creature can't be blocked, targeted, dealt damage, or enchanted by anything black.) -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, LGN U, M10 U, M11 U, ME4 U, DDG U - -White Mana Battery -{4} -Artifact -{2}, {T}: Put a charge counter on White Mana Battery. -{T}, Remove any number of charge counters from White Mana Battery: Add {W} to your mana pool, then add an additional {W} to your mana pool for each charge counter removed this way. -LEG U, 4ED R - -White Scarab -{W} -Enchantment - Aura -Enchant creature -Enchanted creature can't be blocked by white creatures. -Enchanted creature gets +2/+2 as long as an opponent controls a white permanent. -ICE U - -White Shield Crusader -{W}{W} -Creature - Human Knight -2/1 -Protection from black -{W}: White Shield Crusader gains flying until end of turn. -{W}{W}: White Shield Crusader gets +1/+0 until end of turn. -CSP U - -White Sun's Zenith -{X}{W}{W}{W} -Instant -Put X 2/2 white Cat creature tokens onto the battlefield. Shuffle White Sun's Zenith into its owner's library. -MBS R - -White Ward -{W} -Enchantment - Aura -Enchant creature -Enchanted creature has protection from white. This effect doesn't remove White Ward. -LEA U, LEB U, 2ED U, 3ED U, 4ED U - -Whitemane Lion -{1}{W} -Creature - Cat -2/2 -Flash (You may cast this spell any time you could cast an instant.) -When Whitemane Lion enters the battlefield, return a creature you control to its owner's hand. -PLC C - -Whiteout -{1}{G} -Instant -All creatures lose flying until end of turn. -Sacrifice a snow land: Return Whiteout from your graveyard to your hand. -ICE U, ME2 C - -Whitesun's Passage -{1}{W} -Instant -You gain 5 life. -SOM C - -Wicked Akuba -{B}{B} -Creature - Spirit -2/2 -{B}: Target player dealt damage by Wicked Akuba this turn loses 1 life. -CHK C - -Wicked Pact -{1}{B}{B} -Sorcery -Destroy two target nonblack creatures. You lose 5 life. -POR R, S99 R, ME4 U - -Wicked Reward -{1}{B} -Instant -As an additional cost to cast Wicked Reward, sacrifice a creature. -Target creature gets +4/+2 until end of turn. -VIS C - -Wicker Warcrawler -{5} -Artifact Creature - Scarecrow -6/6 -Whenever Wicker Warcrawler attacks or blocks, put a -1/-1 counter on it at end of combat. -SHM U - -Wickerbough Elder -{3}{G} -Creature - Treefolk Shaman -4/4 -Wickerbough Elder enters the battlefield with a -1/-1 counter on it. -{G}, Remove a -1/-1 counter from Wickerbough Elder: Destroy target artifact or enchantment. -EVE C, ARC C - -Wielding the Green Dragon -{1}{G} -Sorcery -Target creature gets +4/+4 until end of turn. -PTK C - -Wiitigo -{3}{G}{G}{G} -Creature - Yeti -0/0 -Wiitigo enters the battlefield with six +1/+1 counters on it. -At the beginning of your upkeep, put a +1/+1 counter on Wiitigo if it has blocked or been blocked since your last upkeep. Otherwise, remove a +1/+1 counter from it. -ICE R, ME2 R - -Wild Aesthir -{2}{W} -Creature - Bird -1/1 -Flying, first strike -{W}{W}: Wild Aesthir gets +2/+0 until end of turn. Activate this ability only once each turn. -ALL C (x2), ME4 C - -Wild Cantor -{R/G} -Creature - Human Druid -1/1 -({R/G} can be paid with either {R} or {G}.) -Sacrifice Wild Cantor: Add one mana of any color to your mana pool. -GPT C - -Wild Colos -{2}{R} -Creature - Goat Beast -2/2 -Haste -UDS C - -Wild Dogs -{G} -Creature - Hound -2/1 -At the beginning of your upkeep, if a player has more life than each other player, the player with the most life gains control of Wild Dogs. -Cycling {2} ({2}, Discard this card: Draw a card.) -USG C - -Wild Elephant -{3}{G} -Creature - Elephant -3/3 -Trample -MIR C - -Wild Evocation -{5}{R} -Enchantment -At the beginning of each player's upkeep, that player reveals a card at random from his or her hand. If it's a land card, the player puts it onto the battlefield. Otherwise, the player casts it without paying its mana cost if able. -M11 R - -Wild Griffin -{2}{W} -Creature - Griffin -2/2 -Flying -P02 C, S99 C, S00 C, 10E C, M11 C, ME4 C - -Wild Growth -{G} -Enchantment - Aura -Enchant land -Whenever enchanted land is tapped for mana, its controller adds {G} to his or her mana pool (in addition to the mana the land produces). -LEA C, LEB C, 2ED C, 3ED C, 4ED C, ICE C, 5ED C, 6ED C, BTD C, 7ED C - -Wild Jhovall -{3}{R} -Creature - Cat -3/3 -MMQ C - -Wild Leotau -{2}{G}{G} -Creature - Cat -5/4 -At the beginning of your upkeep, sacrifice Wild Leotau unless you pay {G}. -CON C - -Wild Mammoth -{2}{G} -Creature - Elephant -3/4 -At the beginning of your upkeep, if a player controls more creatures than each other player, the player who controls the most creatures gains control of Wild Mammoth. -NEM U - -Wild Might -{1}{G} -Instant -Target creature gets +1/+1 until end of turn. That creature gets an additional +4/+4 until end of turn unless any player pays {2}. -PCY C - -Wild Mongrel -{1}{G} -Creature - Hound -2/2 -Discard a card: Wild Mongrel gets +1/+1 and becomes the color of your choice until end of turn. -ODY C, GVL C - -Wild Nacatl -{G} -Creature - Cat Warrior -1/1 -Wild Nacatl gets +1/+1 as long as you control a Mountain. -Wild Nacatl gets +1/+1 as long as you control a Plains. -ALA C - -Wild Ox -{3}{G} -Creature - Ox -3/3 -Swampwalk -P02 U, S99 U, ME4 U - -Wild Pair -{4}{G}{G} -Enchantment -Whenever a creature enters the battlefield, if you cast it from your hand, you may search your library for a creature card with the same total power and toughness and put it onto the battlefield. If you do, shuffle your library. -PLC R, H09 R - -Wild Research -{2}{R} -Enchantment -{1}{W}: Search your library for an enchantment card and reveal that card. Put it into your hand, then discard a card at random. Then shuffle your library. -{1}{U}: Search your library for an instant card and reveal that card. Put it into your hand, then discard a card at random. Then shuffle your library. -APC R - -Wild Ricochet -{2}{R}{R} -Instant -You may choose new targets for target instant or sorcery spell. Then copy that spell. You may choose new targets for the copy. -LRW R, COM R - -Wild Swing -{3}{R} -Sorcery -Choose three target nonenchantment permanents. Destroy one of them at random. -SHM U - -Wild Wurm -{3}{R} -Creature - Wurm -5/4 -When Wild Wurm enters the battlefield, flip a coin. If you lose the flip, return Wild Wurm to its owner's hand. -TMP U - -Wilderness Elemental -{1}{R}{G} -Creature - Elemental -*/3 -Trample -Wilderness Elemental's power is equal to the number of nonbasic lands your opponents control. -CSP U - -Wilderness Hypnotist -{2}{U}{U} -Creature - Merfolk Wizard -1/3 -{T}: Target red or green creature gets -2/-0 until end of turn. -EVE C - -Wildfield Borderpost -{1}{G}{W} -Artifact -You may pay {1} and return a basic land you control to its owner's hand rather than pay Wildfield Borderpost's mana cost. -Wildfield Borderpost enters the battlefield tapped. -{T}: Add {G} or {W} to your mana pool. -ARB C - -Wildfire -{4}{R}{R} -Sorcery -Each player sacrifices four lands. Wildfire deals 4 damage to each creature. -P02 R, USG R, 7ED R, 9ED R - -Wildfire Emissary -{3}{R} -Creature - Efreet -2/4 -Protection from white -{1}{R}: Wildfire Emissary gets +1/+0 until end of turn. -MIR U, BRB U, TSB S - -Wildheart Invoker -{2}{G}{G} -Creature - Elf Shaman -4/3 -{8}: Target creature gets +5/+5 and gains trample until end of turn. -ROE C - -Wildsize -{2}{G} -Instant -Target creature gets +2/+2 and gains trample until end of turn. -Draw a card. -GPT C, EVG C - -Wildslayer Elves -{3}{G} -Creature - Elf Warrior -3/3 -Wither (This deals damage to creatures in the form of -1/-1 counters.) -SHM C - -Will-o'-the-Wisp -{B} -Creature - Spirit -0/1 -Flying (This creature can't be blocked except by creatures with flying or reach.) -{B}: Regenerate Will-o'-the-Wisp. (The next time this creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.) -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 9ED R - -Willbender -{1}{U} -Creature - Human Wizard -1/2 -Morph {1}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Willbender is turned face up, change the target of target spell or ability with a single target. -LGN U, TSB S, JVC U - -Willow Dryad -{G} -Creature - Dryad -1/1 -Forestwalk -POR C - -Willow Elf -{G} -Creature - Elf -1/1 -S99 C, S00 C - -Willow Faerie -{1}{G} -Creature - Faerie -1/2 -Flying -HML C (x2) - -Willow Priestess -{2}{G}{G} -Creature - Faerie Druid -2/2 -{T}: You may put a Faerie permanent card from your hand onto the battlefield. -{2}{G}: Target green creature gains protection from black until end of turn. -HML R, ME3 U - -Willow Satyr -{2}{G}{G} -Creature - Satyr -1/1 -You may choose not to untap Willow Satyr during your untap step. -{T}: Gain control of target legendary creature for as long as you control Willow Satyr and Willow Satyr remains tapped. -LEG R, ME3 R - -Wilt-Leaf Cavaliers -{G/W}{G/W}{G/W} -Creature - Elf Knight -3/4 -Vigilance -SHM U, DDG U - -Wilt-Leaf Liege -{1}{G/W}{G/W}{G/W} -Creature - Elf Knight -4/4 -Other green creatures you control get +1/+1. -Other white creatures you control get +1/+1. -If a spell or ability an opponent controls causes you to discard Wilt-Leaf Liege, put it onto the battlefield instead of putting it into your graveyard. -SHM R - -Wind Dancer -{1}{U} -Creature - Faerie -1/1 -Flying -{T}: Target creature gains flying until end of turn. -TMP U, 7ED U - -Wind Drake -{2}{U} -Creature - Drake -2/2 -Flying -POR C, TMP C, 6ED C, S99 C, BRB C, S00 C, 7ED C, 8ED C, 9ED C, M10 C - -Wind Sail -{1}{U} -Sorcery -One or two target creatures gain flying until end of turn. -P02 C, S99 U - -Wind Shear -{2}{G} -Instant -Attacking creatures with flying get -2/-2 and lose flying until end of turn. -VIS U - -Wind Spirit -{4}{U} -Creature - Elemental Spirit -3/2 -Flying -Wind Spirit can't be blocked except by two or more creatures. -ICE U, 5ED U, 6ED U, ME2 U - -Wind Zendikon -{U} -Enchantment - Aura -Enchant land -Enchanted land is a 2/2 blue Elemental creature with flying. It's still a land. -When enchanted land dies, return that card to its owner's hand. -WWK C - -Windborn Muse -{3}{W} -Creature - Spirit -2/3 -Flying -Creatures can't attack you unless their controller pays {2} for each creature he or she controls that's attacking you. -LGN R, 10E R, COM R - -Windborne Charge -{2}{W}{W} -Sorcery -Two target creatures you control each get +2/+2 and gain flying until end of turn. -ZEN U - -Windbrisk Heights -Land -Hideaway (This land enters the battlefield tapped. When it does, look at the top four cards of your library, exile one face down, then put the rest on the bottom of your library.) -{T}: Add {W} to your mana pool. -{W}, {T}: You may play the exiled card without paying its mana cost if you attacked with three or more creatures this turn. -LRW R - -Windbrisk Raptor -{5}{W}{W} -Creature - Bird -5/7 -Flying -Attacking creatures you control have lifelink. -SHM R - -Windfall -{2}{U} -Sorcery -Each player discards his or her hand, then draws cards equal to the greatest number of cards a player discarded this way. -USG U, BRB U, COM U - -Winding Canyons -Land -{T}: Add {1} to your mana pool. -{2}, {T}: Until end of turn, you may play creature cards as though they had flash. -WTH R - -Winding Wurm -{4}{G} -Creature - Wurm -6/6 -Echo {4}{G} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -USG C - -Windreaper Falcon -{1}{R}{G} -Creature - Bird -1/1 -Flying, protection from blue -MIR U - -Windreaver -{3}{W}{U} -Creature - Elemental -1/3 -Flying -{W}: Windreaver gains vigilance until end of turn. -{W}: Windreaver gets +0/+1 until end of turn. -{U}: Switch Windreaver's power and toughness until end of turn. -{U}: Return Windreaver to its owner's hand. -DIS R - -Windrider Eel -{3}{U} -Creature - Fish -2/2 -Flying -Landfall - Whenever a land enters the battlefield under your control, Windrider Eel gets +2/+2 until end of turn. -ZEN C - -Winds of Change -{R} -Sorcery -Each player shuffles the cards from his or her hand into his or her library, then draws that many cards. -LEG U, 4ED R, 5ED R, POR R, MED U - -Winds of Rath -{3}{W}{W} -Sorcery -Destroy all creatures that aren't enchanted. They can't be regenerated. -TMP R - -Windscouter -{3}{U} -Creature - Human Scout -3/3 -Flying -Whenever Windscouter attacks or blocks, return it to its owner's hand at end of combat. (Return it only if it's on the battlefield.) -PCY U - -Windseeker Centaur -{1}{R}{R} -Creature - Centaur -2/2 -Vigilance -PRO S - -Windstorm -{X}{G} -Instant -Windstorm deals X damage to each creature with flying. -M10 U, GVL U - -Windswept Heath -Land -{T}, Pay 1 life, Sacrifice Windswept Heath: Search your library for a Forest or Plains card and put it onto the battlefield. Then shuffle your library. -ONS R - -Windwright Mage -{W}{U}{B} -Artifact Creature - Human Wizard -2/2 -Lifelink (Damage dealt by this creature also causes you to gain that much life.) -Windwright Mage has flying as long as an artifact card is in your graveyard. -ALA C - -Wine of Blood and Iron -{3} -Artifact -{4}: Target creature gets +X/+0 until end of turn, where X is its power. Sacrifice Wine of Blood and Iron at the beginning of the next end step. -SOK R - -Wing Puncture -{G} -Instant -Target creature you control deals damage equal to its power to target creature with flying. -SOM C - -Wing Shards -{1}{W}{W} -Instant -Target player sacrifices an attacking creature. -Storm (When you cast this spell, copy it for each spell cast before it this turn.) -SCG U - -Wing Snare -{2}{G} -Sorcery -Destroy target creature with flying. -ULG U, 7ED U, 8ED U - -Wing Splicer -{3}{U} -Creature - Human Artificer -1/1 -When Wing Splicer enters the battlefield, put a 3/3 colorless Golem artifact creature token onto the battlefield. -Golem creatures you control have flying. -NPH U - -Wing Storm -{2}{G} -Sorcery -Wing Storm deals damage to each player equal to twice the number of creatures with flying that player controls. -PCY U - -Wingbeat Warrior -{2}{W} -Creature - Bird Soldier Warrior -2/1 -Flying -Morph {2}{W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Wingbeat Warrior is turned face up, target creature gains first strike until end of turn. -LGN C - -Winged Coatl -{1}{G}{U} -Creature - Snake -1/1 -Flash -Flying -Deathtouch (Any amount of damage this deals to a creature is enough to destroy it.) -ARB C - -Winged Sliver -{1}{U} -Creature - Sliver -1/1 -All Sliver creatures have flying. -TMP C, H09 C - -Wingrattle Scarecrow -{3} -Artifact Creature - Scarecrow -2/2 -Wingrattle Scarecrow has flying as long as you control a blue creature. -Wingrattle Scarecrow has persist as long as you control a black creature. (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) -SHM C - -Wings of Aesthir -{W}{U} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+0 and has flying and first strike. -ICE U, ME2 U - -Wings of Hope -{W}{U} -Enchantment - Aura -Enchant creature -Enchanted creature gets +1/+3 and has flying. -INV C - -Wings of Velis Vel -{1}{U} -Tribal Instant - Shapeshifter -Changeling (This card is every creature type at all times.) -Target creature becomes 4/4, gains all creature types, and gains flying until end of turn. -LRW C - -Winnow -{1}{W} -Instant -Destroy target nonland permanent if another permanent with the same name is on the battlefield. -Draw a card. -INV R - -Winnower Patrol -{2}{G} -Creature - Elf Warrior -3/2 -Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Winnower Patrol, you may reveal it. If you do, put a +1/+1 counter on Winnower Patrol. -MOR C - -Winter Blast -{X}{G} -Sorcery -Tap X target creatures. Winter Blast deals 2 damage to each of those creatures with flying. -LEG R, 4ED U, 5ED U, MED U - -Winter Orb -{2} -Artifact -Players can't untap more than one land during their untap steps. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, MED R - -Winter Sky -{R} -Sorcery -Flip a coin. If you win the flip, Winter Sky deals 1 damage to each creature and each player. If you lose the flip, each player draws a card. -HML R - -Winter's Chill -{X}{U} -Instant -Cast Winter's Chill only during combat before blockers are declared. -X can't be greater than the number of snow lands you control. -Destroy X target attacking creatures at end of combat. For each attacking creature, its controller may pay {1} or {2} to prevent this effect. If that player pays only {1} for that creature, prevent all combat damage that would be dealt to and dealt by that creature this turn. -ICE R - -Winter's Grasp -{1}{G}{G} -Sorcery -Destroy target land. -POR U, TMP U - -Winter's Night -{R}{G}{W} -World Enchantment -Whenever a player taps a snow land for mana, that player adds one mana to his or her mana pool of any type that land produced. That land doesn't untap during its controller's next untap step. -ALL R, ME2 R - -Wintermoon Mesa -Land -Wintermoon Mesa enters the battlefield tapped. -{T}: Add {1} to your mana pool. -{2}, {T}, Sacrifice Wintermoon Mesa: Tap two target lands. -PCY R - -Wipe Away -{1}{U}{U} -Instant -Split second (As long as this spell is on the stack, players can't cast spells or activate abilities that aren't mana abilities.) -Return target permanent to its owner's hand. -TSP U - -Wipe Clean -{1}{W} -Instant -Exile target enchantment. -Cycling {3} ({3}, Discard this card: Draw a card.) -SCG C - -Wirecat -{4} -Artifact Creature - Cat -4/3 -Wirecat can't attack or block if an enchantment is on the battlefield. -USG U - -Wirefly Hive -{3} -Artifact -{3}, {T}: Flip a coin. If you win the flip, put a 2/2 colorless Insect artifact creature token with flying named Wirefly onto the battlefield. If you lose the flip, destroy all permanents named Wirefly. -DST U - -Wirewood Channeler -{3}{G} -Creature - Elf Druid -2/2 -{T}: Add X mana of any one color to your mana pool, where X is the number of Elves on the battlefield. -LGN U - -Wirewood Elf -{1}{G} -Creature - Elf Druid -1/2 -{T}: Add {G} to your mana pool. -ONS C - -Wirewood Guardian -{5}{G}{G} -Creature - Elf Mutant -6/6 -Forestcycling {2} ({2}, Discard this card: Search your library for a Forest card, reveal it, and put it into your hand. Then shuffle your library.) -SCG C - -Wirewood Herald -{1}{G} -Creature - Elf -1/1 -When Wirewood Herald dies, you may search your library for an Elf card, reveal that card, put it into your hand, then shuffle your library. -ONS C, EVG C - -Wirewood Hivemaster -{1}{G} -Creature - Elf -1/1 -Whenever another nontoken Elf enters the battlefield, you may put a 1/1 green Insect creature token onto the battlefield. -LGN U - -Wirewood Lodge -Land -{T}: Add {1} to your mana pool. -{G}, {T}: Untap target Elf. -ONS U, EVG U - -Wirewood Pride -{G} -Instant -Target creature gets +X/+X until end of turn, where X is the number of Elves on the battlefield. -ONS C - -Wirewood Savage -{2}{G} -Creature - Elf -2/2 -Whenever a Beast enters the battlefield, you may draw a card. -ONS C, GVL C - -Wirewood Symbiote -{G} -Creature - Insect -1/1 -Return an Elf you control to its owner's hand: Untap target creature. Activate this ability only once each turn. -SCG U, EVG U - -Wishmonger -{3}{W} -Creature - Unicorn Monger -3/3 -{2}: Target creature gains protection from the color of its controller's choice until end of turn. Any player may activate this ability. -MMQ U - -Wispmare -{2}{W} -Creature - Elemental -1/3 -Flying -When Wispmare enters the battlefield, destroy target enchantment. -Evoke {W} (You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield.) -LRW C - -Wistful Selkie -{G/U}{G/U}{G/U} -Creature - Merfolk Wizard -2/2 -When Wistful Selkie enters the battlefield, draw a card. -EVE U - -Wistful Thinking -{2}{U} -Sorcery -Target player draws two cards, then discards four cards. -PLC C - -Wit's End -{5}{B}{B} -Sorcery -Target player discards his or her hand. -DIS R - -Witch Engine -{5}{B} -Creature - Horror -4/4 -Swampwalk -{T}: Add {B}{B}{B}{B} to your mana pool. Target opponent gains control of Witch Engine. (Activate this ability only any time you could cast an instant.) -USG R - -Witch Hunter -{2}{W}{W} -Creature - Human Cleric -1/1 -{T}: Witch Hunter deals 1 damage to target player. -{1}{W}{W}, {T}: Return target creature an opponent controls to its owner's hand. -DRK R, CHR U, TSB S - -Witch's Mist -{2}{B} -Enchantment -{2}{B}, {T}: Destroy target creature that was dealt damage this turn. -FUT U - -Witch-Maw Nephilim -{G}{W}{U}{B} -Creature - Nephilim -1/1 -Whenever you cast a spell, you may put two +1/+1 counters on Witch-Maw Nephilim. -Whenever Witch-Maw Nephilim attacks, it gains trample until end of turn if its power is 10 or greater. -GPT R - -Withdraw -{U}{U} -Instant -Return target creature to its owner's hand. Then return another target creature to its owner's hand unless its controller pays {1}. -PCY C - -Withered Wretch -{B}{B} -Creature - Zombie Cleric -2/2 -{1}: Exile target card from a graveyard. -LGN U, TSB S, HOP U - -Withering Boon -{1}{B} -Instant -As an additional cost to cast Withering Boon, pay 3 life. -Counter target creature spell. -MIR U - -Withering Gaze -{2}{U} -Sorcery -Target opponent reveals his or her hand. You draw a card for each Forest and green card in it. -POR U, 9ED U - -Withering Hex -{B} -Enchantment - Aura -Enchant creature -Whenever a player cycles a card, put a plague counter on Withering Hex. -Enchanted creature gets -1/-1 for each plague counter on Withering Hex. -ONS U - -Withering Wisps -{1}{B}{B} -Enchantment -At the beginning of the end step, if no creatures are on the battlefield, sacrifice Withering Wisps. -{B}: Withering Wisps deals 1 damage to each creature and each player. Activate this ability no more times each turn than the number of snow Swamps you control. -ICE U, ME2 U - -Witherscale Wurm -{4}{G}{G} -Creature - Wurm -9/9 -Whenever Witherscale Wurm blocks or becomes blocked by a creature, that creature gains wither until end of turn. (It deals damage to creatures in the form of -1/-1 counters.) -Whenever Witherscale Wurm deals damage to an opponent, remove all -1/-1 counters from it. -SHM R - -Withstand -{2}{W} -Instant -Prevent the next 3 damage that would be dealt to target creature or player this turn. -Draw a card. -GPT C - -Withstand Death -{G} -Instant -Target creature is indestructible this turn. (Lethal damage and effects that say "destroy" don't destroy it. If its toughness is 0 or less, it's still put into its owner's graveyard.) -SOM C - -Wizard Mentor -{2}{U} -Creature - Human Wizard -2/2 -{T}: Return Wizard Mentor and target creature you control to their owner's hand. -USG C - -Wizard Replica -{3} -Artifact Creature - Wizard -1/3 -Flying -{U}, Sacrifice Wizard Replica: Counter target spell unless its controller pays {2}. -MRD C, HOP C - -Wizards' School -Land -{T}: Add {1} to your mana pool. -{1}, {T}: Add {U} to your mana pool. -{2}, {T}: Add {W} or {B} to your mana pool. -HML U - -Wizened Cenn -{W}{W} -Creature - Kithkin Cleric -2/2 -Other Kithkin creatures you control get +1/+1. -LRW U - -Wizened Snitches -{3}{U} -Creature - Faerie Rogue -1/3 -Flying -Players play with the top card of their libraries revealed. -RAV U - -Woebearer -{4}{B} -Creature - Zombie -2/3 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -Whenever Woebearer deals combat damage to a player, you may return target creature card from your graveyard to your hand. -MRD U - -Woebringer Demon -{3}{B}{B} -Creature - Demon -4/4 -Flying -At the beginning of each player's upkeep, that player sacrifices a creature. If the player can't, sacrifice Woebringer Demon. -RAV R - -Woeleecher -{5}{W} -Creature - Elemental -3/5 -{W}, {T}: Remove a -1/-1 counter from target creature. If you do, you gain 2 life. -SHM C - -Wojek Apothecary -{2}{W}{W} -Creature - Human Cleric -1/1 -Radiance - {T}: Prevent the next 1 damage that would be dealt to target creature and each other creature that shares a color with it this turn. -RAV U - -Wojek Embermage -{3}{R} -Creature - Human Wizard -1/2 -Radiance - {T}: Wojek Embermage deals 1 damage to target creature and each other creature that shares a color with it. -RAV U - -Wojek Siren -{W} -Instant -Radiance - Target creature and each other creature that shares a color with it get +1/+1 until end of turn. -RAV C - -Wolf Pack -{6}{G}{G} -Creature - Wolf -7/6 -You may have Wolf Pack assign its combat damage as though it weren't blocked. -PTK R, ME2 R - -Wolf-Skull Shaman -{1}{G} -Creature - Elf Shaman -2/2 -Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Wolf-Skull Shaman, you may reveal it. If you do, put a 2/2 green Wolf creature token onto the battlefield. -MOR U - -Wolfbriar Elemental -{2}{G}{G} -Creature - Elemental -4/4 -Multikicker {G} (You may pay an additional {G} any number of times as you cast this spell.) -When Wolfbriar Elemental enters the battlefield, put a 2/2 green Wolf creature token onto the battlefield for each time it was kicked. -WWK R - -Wolverine Pack -{2}{G}{G} -Creature - Wolverine -2/4 -Rampage 2 (Whenever this creature becomes blocked, it gets +2/+2 until end of turn for each creature blocking it beyond the first.) -LEG C, 5ED U - -Wonder -{3}{U} -Creature - Incarnation -2/2 -Flying -As long as Wonder is in your graveyard and you control an Island, creatures you control have flying. -JUD U, COM U - -Wood Elemental -{3}{G} -Creature - Elemental -*/* -As Wood Elemental enters the battlefield, sacrifice any number of untapped Forests. -Wood Elemental's power and toughness are each equal to the number of Forests sacrificed as it entered the battlefield. -LEG R, ME4 R - -Wood Elves -{2}{G} -Creature - Elf Scout -1/1 -When Wood Elves enters the battlefield, search your library for a Forest card and put that card onto the battlefield. Then shuffle your library. -POR R, EXO C, S99 U, 7ED C, 8ED C, 9ED C, EVG C - -Wood Sage -{G}{U} -Creature - Human Druid -1/1 -{T}: Name a creature card. Reveal the top four cards of your library and put all of them with that name into your hand. Put the rest into your graveyard. -TMP R - -Woodcloaker -{5}{G} -Creature - Elf -3/3 -Morph {2}{G}{G} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -When Woodcloaker is turned face up, target creature gains trample until end of turn. -SCG C - -Wooded Bastion -Land -{T}: Add {1} to your mana pool. -{G/W}, {T}: Add {G}{G}, {G}{W}, or {W}{W} to your mana pool. -SHM R - -Wooded Foothills -Land -{T}, Pay 1 life, Sacrifice Wooded Foothills: Search your library for a Mountain or Forest card and put it onto the battlefield. Then shuffle your library. -ONS R - -Wooden Sphere -{1} -Artifact -Whenever a player casts a green spell, you may pay {1}. If you do, you gain 1 life. -LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, 6ED U, 7ED U, 8ED U - -Woodfall Primus -{5}{G}{G}{G} -Creature - Treefolk Shaman -6/6 -Trample -When Woodfall Primus enters the battlefield, destroy target noncreature permanent. -Persist (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) -SHM R - -Woodland Changeling -{1}{G} -Creature - Shapeshifter -2/2 -Changeling (This card is every creature type at all times.) -LRW C - -Woodland Druid -{G} -Creature - Human Druid -1/2 -ODY C - -Woodland Guidance -{3}{G} -Sorcery -Return target card from your graveyard to your hand. Clash with an opponent. If you win, untap all Forests you control. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) -Exile Woodland Guidance. -LRW U - -Woodlurker Mimic -{1}{B/G} -Creature - Shapeshifter -2/1 -Whenever you cast a spell that's both black and green, Woodlurker Mimic becomes 4/5 and gains wither until end of turn. (It deals damage to creatures in the form of -1/-1 counters.) -EVE C - -Woodripper -{3}{G}{G} -Creature - Beast -4/6 -Fading 3 (This creature enters the battlefield with three fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.) -{1}, Remove a fade counter from Woodripper: Destroy target artifact. -NEM U - -Woodwraith Corrupter -{3}{B}{B}{G} -Creature - Elemental Horror -3/6 -{1}{B}{G}, {T}: Target Forest becomes a 4/4 black and green Elemental Horror creature. It's still a land. -RAV R - -Woodwraith Strangler -{2}{B}{G} -Creature - Plant Zombie -2/2 -Exile a creature card from your graveyard: Regenerate Woodwraith Strangler. -RAV C - -Woolly Mammoths -{1}{G}{G} -Creature - Elephant -3/2 -Woolly Mammoths has trample as long as you control a snow land. -ICE C, ME2 C - -Woolly Razorback -{2}{W}{W} -Creature - Boar Beast -7/7 -Woolly Razorback enters the battlefield with three ice counters on it. -As long as Woolly Razorback has an ice counter on it, prevent all combat damage it would deal and it has defender. -Whenever Woolly Razorback blocks, remove an ice counter from it. -CSP R - -Woolly Spider -{1}{G}{G} -Creature - Spider -2/3 -Reach (This creature can block creatures with flying.) -Whenever Woolly Spider blocks a creature with flying, Woolly Spider gets +0/+2 until end of turn. -ICE C, BTD C, ME2 U - -Woolly Thoctar -{R}{G}{W} -Creature - Beast -5/4 -ALA U - -Word of Binding -{X}{B}{B} -Sorcery -Tap X target creatures. -DRK C, 4ED C - -Word of Blasting -{1}{R} -Instant -Destroy target Wall. It can't be regenerated. Word of Blasting deals damage equal to that Wall's converted mana cost to the Wall's controller. -ICE U, 5ED U, MMQ U - -Word of Command -{B}{B} -Instant -Look at target opponent's hand and choose a card from it. You control that player until Word of Command finishes resolving. The player plays that card if able. While doing so, the player can activate mana abilities only if they're from lands he or she controls and only if mana they produce is spent to activate other mana abilities of lands he or she controls and/or play that card. If the chosen card is cast as a spell, you control the player while that spell is resolving. -LEA R, LEB R, 2ED R, ME4 R - -Word of Seizing -{3}{R}{R} -Instant -Split second (As long as this spell is on the stack, players can't cast spells or activate abilities that aren't mana abilities.) -Untap target permanent and gain control of it until end of turn. It gains haste until end of turn. -TSP R - -Word of Undoing -{U} -Instant -Return target creature and all white Auras you own attached to it to their owners' hands. -ICE C, MED C - -Words of War -{2}{R} -Enchantment -{1}: The next time you would draw a card this turn, Words of War deals 2 damage to target creature or player instead. -ONS R - -Words of Waste -{2}{B} -Enchantment -{1}: The next time you would draw a card this turn, each opponent discards a card instead. -ONS R - -Words of Wilding -{2}{G} -Enchantment -{1}: The next time you would draw a card this turn, put a 2/2 green Bear creature token onto the battlefield instead. -ONS R - -Words of Wind -{2}{U} -Enchantment -{1}: The next time you would draw a card this turn, each player returns a permanent he or she controls to its owner's hand instead. -ONS R - -Words of Wisdom -{1}{U} -Instant -You draw two cards, then each other player draws a card. -ODY C - -Words of Worship -{2}{W} -Enchantment -{1}: The next time you would draw a card this turn, you gain 5 life instead. -ONS R - -Workhorse -{6} -Artifact Creature - Horse -0/0 -Workhorse enters the battlefield with four +1/+1 counters on it. -Remove a +1/+1 counter from Workhorse: Add {1} to your mana pool. -EXO R - -World Queller -{3}{W}{W} -Creature - Avatar -4/4 -At the beginning of your upkeep, you may choose a card type. If you do, each player sacrifices a permanent of that type. -ZEN R - -World at War -{3}{R}{R} -Sorcery -After the first postcombat main phase this turn, there's an additional combat phase followed by an additional main phase. At the beginning of that combat, untap all creatures that attacked this turn. -Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -ROE R - -Worldgorger Dragon -{3}{R}{R}{R} -Creature - Nightmare Dragon -7/7 -Flying, trample -When Worldgorger Dragon enters the battlefield, exile all other permanents you control. -When Worldgorger Dragon leaves the battlefield, return the exiled cards to the battlefield under their owners' control. -JUD R - -Worldheart Phoenix -{3}{R} -Creature - Phoenix -2/2 -Flying -You may cast Worldheart Phoenix from your graveyard by paying {W}{U}{B}{R}{G} rather than paying its mana cost. If you do, it enters the battlefield with two +1/+1 counters on it. -CON R - -Worldly Counsel -{1}{U} -Instant -Domain - Look at the top X cards of your library, where X is the number of basic land types among lands you control. Put one of those cards into your hand and the rest on the bottom of your library in any order. -INV C, CON C - -Worldly Tutor -{G} -Instant -Search your library for a creature card and reveal that card. Shuffle your library, then put the card on top of it. -MIR U, 6ED U - -Worldpurge -{4}{W/U}{W/U}{W/U}{W/U} -Sorcery -Return all permanents to their owners' hands. Each player chooses up to seven cards in his or her hand, then shuffles the rest into his or her library. Empty all mana pools. -SHM R - -Worldslayer -{5} -Artifact - Equipment -Whenever equipped creature deals combat damage to a player, destroy all permanents other than Worldslayer. -Equip {5} ({5}: Attach to target creature you control. Equip only as a sorcery.) -MRD R, M12 R - -Worm Harvest -{2}{B/G}{B/G}{B/G} -Sorcery -Put a 1/1 black and green Worm creature token onto the battlefield for each land card in your graveyard. -Retrace (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) -EVE R - -Wormfang Behemoth -{3}{U}{U} -Creature - Nightmare Fish Beast -5/5 -When Wormfang Behemoth enters the battlefield, exile all cards from your hand. -When Wormfang Behemoth leaves the battlefield, return the exiled cards to their owner's hand. -JUD R - -Wormfang Crab -{3}{U} -Creature - Nightmare Crab -3/6 -Wormfang Crab is unblockable. -When Wormfang Crab enters the battlefield, an opponent chooses a permanent you control other than Wormfang Crab and exiles it. -When Wormfang Crab leaves the battlefield, return the exiled card to the battlefield under its owner's control. -JUD U - -Wormfang Drake -{2}{U} -Creature - Nightmare Drake -3/4 -Flying -When Wormfang Drake enters the battlefield, sacrifice it unless you exile a creature you control other than Wormfang Drake. -When Wormfang Drake leaves the battlefield, return the exiled card to the battlefield under its owner's control. -JUD C - -Wormfang Manta -{5}{U}{U} -Creature - Nightmare Fish Beast -6/1 -Flying -When Wormfang Manta enters the battlefield, you skip your next turn. -When Wormfang Manta leaves the battlefield, you take an extra turn after this one. -JUD R - -Wormfang Newt -{1}{U} -Creature - Nightmare Salamander Beast -2/2 -When Wormfang Newt enters the battlefield, exile a land you control. -When Wormfang Newt leaves the battlefield, return the exiled card to the battlefield under its owner's control. -JUD C - -Wormfang Turtle -{2}{U} -Creature - Nightmare Turtle Beast -2/4 -When Wormfang Turtle enters the battlefield, exile a land you control. -When Wormfang Turtle leaves the battlefield, return the exiled card to the battlefield under its owner's control. -JUD U - -Worms of the Earth -{2}{B}{B}{B} -Enchantment -Players can't play lands. -Lands can't enter the battlefield. -At the beginning of each upkeep, any player may sacrifice two lands or have Worms of the Earth deal 5 damage to him or her. If a player does either, destroy Worms of the Earth. -DRK R - -Wormwood Dryad -{2}{G} -Creature - Dryad -3/1 -{G}: Wormwood Dryad gains forestwalk until end of turn and deals 1 damage to you. -{B}: Wormwood Dryad gains swampwalk until end of turn and deals 1 damage to you. -TSP C - -Wormwood Treefolk -{3}{G}{G} -Creature - Treefolk -4/4 -{G}{G}: Wormwood Treefolk gains forestwalk until end of turn and deals 2 damage to you. -{B}{B}: Wormwood Treefolk gains swampwalk until end of turn and deals 2 damage to you. -DRK R, ME3 U - -Worn Powerstone -{3} -Artifact -Worn Powerstone enters the battlefield tapped. -{T}: Add {2} to your mana pool. -USG U, PVC U - -Worry Beads -{3} -Artifact -At the beginning of each player's upkeep, that player puts the top card of his or her library into his or her graveyard. -MMQ R - -Worship -{3}{W} -Enchantment -If you control a creature, damage that would reduce your life total to less than 1 reduces it to 1 instead. -USG R, 7ED R, 8ED R, 9ED R - -Wort, Boggart Auntie -{2}{B}{R} -Legendary Creature - Goblin Shaman -3/3 -Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -At the beginning of your upkeep, you may return target Goblin card from your graveyard to your hand. -LRW R - -Wort, the Raidmother -{4}{R/G}{R/G} -Legendary Creature - Goblin Shaman -3/3 -When Wort, the Raidmother enters the battlefield, put two 1/1 red and green Goblin Warrior creature tokens onto the battlefield. -Each red or green instant or sorcery spell you cast has conspire. (As you cast the spell, you may tap two untapped creatures you control that share a color with it. When you do, copy it and you may choose new targets for the copy.) -SHM R - -Worthy Cause -{W} -Instant -Buyback {2} (You may pay an additional {2} as you cast this spell. If you do, put this card into your hand as it resolves.) -As an additional cost to cast Worthy Cause, sacrifice a creature. -You gain life equal to the sacrificed creature's toughness. -TMP U - -Wound Reflection -{5}{B} -Enchantment -At the beginning of each end step, each opponent loses life equal to the life he or she lost this turn. (Damage causes loss of life.) -SHM R - -Wrap in Flames -{3}{R} -Sorcery -Wrap in Flames deals 1 damage to each of up to three target creatures. Those creatures can't block this turn. -ROE C - -Wrap in Vigor -{1}{G} -Instant -Regenerate each creature you control. -FUT C - -Wrath of God -{2}{W}{W} -Sorcery -Destroy all creatures. They can't be regenerated. -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, POR R, 6ED R, BRB R, 7ED R, 8ED R, 9ED R, 10E R - -Wrath of Marit Lage -{3}{U}{U} -Enchantment -When Wrath of Marit Lage enters the battlefield, tap all red creatures. -Red creatures don't untap during their controllers' untap steps. -ICE R, 8ED U - -Wreak Havoc -{2}{R}{G} -Sorcery -Wreak Havoc can't be countered by spells or abilities. -Destroy target artifact or land. -GPT U - -Wrecking Ball -{2}{B}{R} -Instant -Destroy target creature or land. -DIS C, COM C - -Wren's Run Packmaster -{3}{G} -Creature - Elf Warrior -5/5 -Champion an Elf (When this enters the battlefield, sacrifice it unless you exile another Elf you control. When this leaves the battlefield, that card returns to the battlefield.) -{2}{G}: Put a 2/2 green Wolf creature token onto the battlefield. -Each Wolf you control has deathtouch. (Any amount of damage it deals to a creature is enough to destroy that creature.) -LRW R - -Wren's Run Vanquisher -{1}{G} -Creature - Elf Warrior -3/3 -As an additional cost to cast Wren's Run Vanquisher, reveal an Elf card from your hand or pay {3}. -Deathtouch (Any amount of damage this deals to a creature is enough to destroy it.) -LRW U, EVG U - -Wrench Mind -{B}{B} -Sorcery -Target player discards two cards unless he or she discards an artifact card. -MRD C - -Wretched Anurid -{1}{B} -Creature - Zombie Frog Beast -3/3 -Whenever another creature enters the battlefield, you lose 1 life. -ONS C - -Wretched Banquet -{B} -Sorcery -Destroy target creature if it has the least power or is tied for least power among creatures on the battlefield. -CON C - -Wrexial, the Risen Deep -{3}{U}{U}{B} -Legendary Creature - Kraken -5/8 -Islandwalk, swampwalk -Whenever Wrexial, the Risen Deep deals combat damage to a player, you may cast target instant or sorcery card from that player's graveyard without paying its mana cost. If that card would be put into a graveyard this turn, exile it instead. -WWK M, COM M - -Wring Flesh -{B} -Instant -Target creature gets -3/-1 until end of turn. -M12 C - -Writ of Passage -{U} -Enchantment - Aura -Enchant creature -Whenever enchanted creature attacks, if its power is 2 or less, it's unblockable this turn. -Forecast - {1}{U}, Reveal Writ of Passage from your hand: Target creature with power 2 or less is unblockable this turn. (Activate this ability only during your upkeep and only once each turn.) -DIS C - -Wu Admiral -{4}{U} -Creature - Human Soldier -3/3 -Wu Admiral gets +1/+1 as long as an opponent controls an Island. -PTK U - -Wu Elite Cavalry -{3}{U} -Creature - Human Soldier -2/3 -Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -PTK C, ME3 C - -Wu Infantry -{1}{U} -Creature - Human Soldier -2/1 -PTK C - -Wu Light Cavalry -{1}{U} -Creature - Human Soldier -1/2 -Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -PTK C - -Wu Longbowman -{2}{U} -Creature - Human Soldier Archer -1/1 -{T}: Wu Longbowman deals 1 damage to target creature or player. Activate this ability only during your turn, before attackers are declared. -PTK U, ME3 C - -Wu Scout -{1}{U} -Creature - Human Soldier Scout -1/1 -Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -When Wu Scout enters the battlefield, look at target opponent's hand. -PTK C - -Wu Spy -{1}{U} -Creature - Human Soldier Rogue -1/1 -When Wu Spy enters the battlefield, look at the top two cards of target player's library. Put one of them into his or her graveyard. -PTK U - -Wu Warship -{2}{U} -Creature - Human Soldier -3/3 -Wu Warship can't attack unless defending player controls an Island. -PTK C, ME3 C - -Wurm's Tooth -{2} -Artifact -Whenever a player casts a green spell, you may gain 1 life. -DST U, 9ED U, 10E U, M10 U, M11 U, M12 U - -Wurmcalling -{X}{G} -Sorcery -Buyback {2}{G} (You may pay an additional {2}{G} as you cast this spell. If you do, put this card into your hand as it resolves.) -Put an X/X green Wurm creature token onto the battlefield. -TSP R - -Wurmcoil Engine -{6} -Artifact Creature - Wurm -6/6 -Deathtouch, lifelink -When Wurmcoil Engine dies, put a 3/3 colorless Wurm artifact creature token with deathtouch and a 3/3 colorless Wurm artifact creature token with lifelink onto the battlefield. -SOM M - -Wurmskin Forger -{5}{G}{G} -Creature - Elf Warrior -2/2 -When Wurmskin Forger enters the battlefield, distribute three +1/+1 counters among one, two, or three target creatures. -MRD C - -Wurmweaver Coil -{4}{G}{G} -Enchantment - Aura -Enchant green creature -Enchanted creature gets +6/+6. -{G}{G}{G}, Sacrifice Wurmweaver Coil: Put a 6/6 green Wurm creature token onto the battlefield. -GPT R - -Wydwen, the Biting Gale -{2}{U}{B} -Legendary Creature - Faerie Wizard -3/3 -Flash -Flying -{U}{B}, Pay 1 life: Return Wydwen, the Biting Gale to its owner's hand. -LRW R - -Wyluli Wolf -{1}{G} -Creature - Wolf -1/1 -{T}: Target creature gets +1/+1 until end of turn. -ARN C (x2), 5ED R, 6ED R, MED C - -Xantcha -Vanguard -Hand +1, life +3 -Sacrifice a permanent: Regenerate target creature. -VG S - -Xanthic Statue -{8} -Artifact -{5}: Until end of turn, Xanthic Statue becomes an 8/8 Golem artifact creature with trample. -WTH R - -Xantid Swarm -{G} -Creature - Insect -0/1 -Flying -Whenever Xantid Swarm attacks, defending player can't cast spells this turn. -SCG R - -Xathrid Demon -{3}{B}{B}{B} -Creature - Demon -7/7 -Flying, trample -At the beginning of your upkeep, sacrifice a creature other than Xathrid Demon, then each opponent loses life equal to the sacrificed creature's power. If you can't sacrifice a creature, tap Xathrid Demon and you lose 7 life. -M10 M - -Xenic Poltergeist -{1}{B}{B} -Creature - Spirit -1/1 -{T}: Until your next upkeep, target noncreature artifact becomes an artifact creature with power and toughness each equal to its converted mana cost. -ATQ U, 4ED R, 5ED R, ME4 U - -Xenograft -{4}{U} -Enchantment -As Xenograft enters the battlefield, choose a creature type. -Each creature you control is the chosen type in addition to its other types. -NPH R - -Xiahou Dun, the One-Eyed -{2}{B}{B} -Legendary Creature - Human Soldier -3/2 -Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -Sacrifice Xiahou Dun, the One-Eyed: Return target black card from your graveyard to your hand. Activate this ability only during your turn, before attackers are declared. -PTK R, ME3 U - -Xira Arien -{B}{R}{G} -Legendary Creature - Insect Wizard -1/2 -Flying -{B}{R}{G}, {T}: Target player draws a card. -LEG R, CHR R, ME3 R - -Xun Yu, Wei Advisor -{1}{B}{B} -Legendary Creature - Human Advisor -1/1 -{T}: Target creature you control gets +2/+0 until end of turn. Activate this ability only during your turn, before attackers are declared. -PTK R - -Yamabushi's Flame -{2}{R} -Instant -Yamabushi's Flame deals 3 damage to target creature or player. If a creature dealt damage this way would die this turn, exile it instead. -CHK C - -Yamabushi's Storm -{1}{R} -Sorcery -Yamabushi's Storm deals 1 damage to each creature. If a creature dealt damage this way would die this turn, exile it instead. -CHK C - -Yare -{2}{W} -Instant -Target creature defending player controls gets +3/+0 until end of turn. That creature can block up to two additional creatures this turn. -MIR R - -Yavimaya Ancients -{3}{G}{G} -Creature - Treefolk -2/7 -{G}: Yavimaya Ancients gets +1/-2 until end of turn. -ALL C (x2), ME2 U - -Yavimaya Ants -{2}{G}{G} -Creature - Insect -5/1 -Trample, haste -Cumulative upkeep {G}{G} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -ALL U, MED U - -Yavimaya Barbarian -{R}{G} -Creature - Elf Barbarian -2/2 -Protection from blue -INV C - -Yavimaya Coast -Land -{T}: Add {1} to your mana pool. -{T}: Add {G} or {U} to your mana pool. Yavimaya Coast deals 1 damage to you. -APC R, 9ED R, 10E R - -Yavimaya Dryad -{1}{G}{G} -Creature - Dryad -2/1 -Forestwalk -When Yavimaya Dryad enters the battlefield, you may search your library for a Forest card and put it onto the battlefield tapped under target player's control. If you do, shuffle your library. -TSP U, ARC U - -Yavimaya Elder -{1}{G}{G} -Creature - Human Druid -2/1 -When Yavimaya Elder dies, you may search your library for up to two basic land cards, reveal them, and put them into your hand. If you do, shuffle your library. -{2}, Sacrifice Yavimaya Elder: Draw a card. -UDS C, PVC C, COM C - -Yavimaya Enchantress -{2}{G} -Creature - Human Druid -2/2 -Yavimaya Enchantress gets +1/+1 for each enchantment on the battlefield. -UDS U, 7ED U, 8ED U, 9ED U, 10E U - -Yavimaya Gnats -{2}{G} -Creature - Insect -0/1 -Flying -{G}: Regenerate Yavimaya Gnats. -ICE U - -Yavimaya Granger -{2}{G} -Creature - Elf -2/2 -Echo {2}{G} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -When Yavimaya Granger enters the battlefield, you may search your library for a basic land card, put that card onto the battlefield tapped, then shuffle your library. -ULG C - -Yavimaya Hollow -Legendary Land -{T}: Add {1} to your mana pool. -{G}, {T}: Regenerate target creature. -UDS R - -Yavimaya Kavu -{2}{R}{G} -Creature - Kavu -*/* -Yavimaya Kavu's power is equal to the number of red creatures on the battlefield. -Yavimaya Kavu's toughness is equal to the number of green creatures on the battlefield. -INV U - -Yavimaya Scion -{4}{G} -Creature - Treefolk -4/4 -Protection from artifacts -ULG C - -Yavimaya Wurm -{4}{G}{G} -Creature - Wurm -6/4 -Trample (If this creature would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.) -ULG C, BTD C, M11 C - -Yavimaya's Embrace -{5}{G}{U}{U} -Enchantment - Aura -Enchant creature -You control enchanted creature. -Enchanted creature gets +2/+2 and has trample. -APC R - -Yawgmoth Demon -{4}{B}{B} -Creature - Demon -6/6 -Flying (This creature can't be blocked except by creatures with flying or reach.) -First strike (This creature deals combat damage before creatures without first strike.) -At the beginning of your upkeep, you may sacrifice an artifact. If you don't, tap Yawgmoth Demon and it deals 2 damage to you. -ATQ R, CHR R, 9ED R - -Yawgmoth's Agenda -{3}{B}{B} -Enchantment -You can't cast more than one spell each turn. -You may play cards from your graveyard. -If a card would be put into your graveyard from anywhere, exile it instead. -INV R - -Yawgmoth's Bargain -{4}{B}{B} -Enchantment -Skip your draw step. -Pay 1 life: Draw a card. -UDS R - -Yawgmoth's Edict -{1}{B} -Enchantment -Whenever an opponent casts a white spell, that player loses 1 life and you gain 1 life. -USG U, 7ED U - -Yawgmoth's Will -{2}{B} -Sorcery -Until end of turn, you may play cards from your graveyard. -If a card would be put into your graveyard from anywhere this turn, exile that card instead. -USG R - -Yawning Fissure -{4}{R} -Sorcery -Each opponent sacrifices a land. -M10 C - -Ydwen Efreet -{R}{R}{R} -Creature - Efreet -3/6 -Whenever Ydwen Efreet blocks, flip a coin. If you lose the flip, remove Ydwen Efreet from combat and it can't block this turn. Creatures it was blocking that had become blocked by only Ydwen Efreet this combat become unblocked. -ARN R, MED R - -Yellow Scarves Cavalry -{1}{R} -Creature - Human Soldier -1/1 -Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -Yellow Scarves Cavalry can't block. -PTK C - -Yellow Scarves General -{3}{R} -Creature - Human Soldier -2/2 -Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -Yellow Scarves General can't block. -PTK R - -Yellow Scarves Troops -{1}{R} -Creature - Human Soldier -2/2 -Yellow Scarves Troops can't block. -PTK C - -Yixlid Jailer -{1}{B} -Creature - Zombie Wizard -2/1 -Cards in graveyards lose all abilities. -FUT U - -Yoke of the Damned -{1}{B} -Enchantment - Aura -Enchant creature -When a creature dies, destroy enchanted creature. -CON C - -Yoked Plowbeast -{5}{W}{W} -Creature - Beast -5/5 -Cycling {2} ({2}, Discard this card: Draw a card.) -ALA C - -Yomiji, Who Bars the Way -{5}{W}{W} -Legendary Creature - Spirit -4/4 -Whenever a legendary permanent other than Yomiji, Who Bars the Way is put into a graveyard from the battlefield, return that card to its owner's hand. -BOK R - -Yore-Tiller Nephilim -{W}{U}{B}{R} -Creature - Nephilim -2/2 -Whenever Yore-Tiller Nephilim attacks, return target creature card from your graveyard to the battlefield tapped and attacking. -GPT R - -Yosei, the Morning Star -{4}{W}{W} -Legendary Creature - Dragon Spirit -5/5 -Flying -When Yosei, the Morning Star dies, target player skips his or her next untap step. Tap up to five target permanents that player controls. -CHK R - -Yotian Soldier -{3} -Artifact Creature - Soldier -1/4 -Vigilance -ATQ C, 4ED C, MRD C, ME4 C - -Young Wei Recruits -{1}{B} -Creature - Human Soldier -2/2 -Young Wei Recruits can't block. -PTK C, ME3 C - -Your Fate Is Thrice Sealed -Scheme -When you set this scheme in motion, reveal the top three cards of your library. Put all land cards revealed this way onto the battlefield and the rest into your hand. -ARC C - -Your Inescapable Doom -Ongoing Scheme -At the beginning of your end step, put a doom counter on this scheme, then this scheme deals damage equal to the number of doom counters on it to the opponent with the highest life total among your opponents. If two or more players are tied for highest life total, you choose one. -ARC P - -Your Puny Minds Cannot Fathom -Scheme -When you set this scheme in motion, draw four cards. You have no maximum hand size until your next turn. -ARC C - -Your Will Is Not Your Own -Scheme -When you set this scheme in motion, gain control of target creature an opponent controls until end of turn. Untap that creature. It gets +3/+3 and gains haste and trample until end of turn. -ARC C - -Youthful Knight -{1}{W} -Creature - Human Knight -2/1 -First strike (This creature deals combat damage before creatures without first strike.) -STH C, 10E C - -Yuan Shao's Infantry -{3}{R} -Creature - Human Soldier -2/2 -Whenever Yuan Shao's Infantry attacks alone, Yuan Shao's Infantry is unblockable this combat. -PTK U - -Yuan Shao, the Indecisive -{4}{R} -Legendary Creature - Human Soldier -2/3 -Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -Each creature you control can't be blocked by more than one creature. -PTK R - -Yuki-Onna -{3}{R} -Creature - Spirit -3/1 -When Yuki-Onna enters the battlefield, destroy target artifact. -Whenever you cast a Spirit or Arcane spell, you may return Yuki-Onna to its owner's hand. -SOK U - -Yukora, the Prisoner -{2}{B}{B} -Legendary Creature - Demon Spirit -5/5 -When Yukora, the Prisoner leaves the battlefield, sacrifice all non-Ogre creatures you control. -BOK R - -Zanam Djinn -{5}{U} -Creature - Djinn -5/6 -Flying -Zanam Djinn gets -2/-2 as long as blue is the most common color among all permanents or is tied for most common. -INV U - -Zap -{2}{R} -Instant -Zap deals 1 damage to target creature or player. -Draw a card. -INV C - -Zealot il-Vec -{2}{W} -Creature - Human Rebel -1/1 -Shadow (This creature can block or be blocked by only creatures with shadow.) -Whenever Zealot il-Vec attacks and isn't blocked, you may have it deal 1 damage to target creature. If you do, prevent all combat damage Zealot il-Vec would deal this turn. -TSP C - -Zealots en-Dal -{3}{W} -Creature - Human Soldier -2/4 -At the beginning of your upkeep, if all nonland permanents you control are white, you gain 1 life. -EXO U - -Zealous Guardian -{W/U} -Creature - Kithkin Soldier -1/1 -Flash -SHM C - -Zealous Inquisitor -{2}{W} -Creature - Human Cleric -2/2 -{1}{W}: The next 1 damage that would be dealt to Zealous Inquisitor this turn is dealt to target creature instead. -SCG C, 9ED U - -Zealous Persecution -{W}{B} -Instant -Until end of turn, creatures you control get +1/+1 and creatures your opponents control get -1/-1. -ARB U - -Zebra Unicorn -{2}{G}{W} -Creature - Unicorn -2/2 -Whenever Zebra Unicorn deals damage, you gain that much life. -MIR U - -Zedruu the Greathearted -{1}{R}{W}{U} -Legendary Creature - Minotaur Monk -2/4 -At the beginning of your upkeep, you gain X life and draw X cards, where X is the number of permanents you own that your opponents control. -{R}{W}{U}: Target opponent gains control of target permanent you control. -COM M - -Zektar Shrine Expedition -{1}{R} -Enchantment -Landfall - Whenever a land enters the battlefield under your control, you may put a quest counter on Zektar Shrine Expedition. -Remove three quest counters from Zektar Shrine Expedition and sacrifice it: Put a 7/1 red Elemental creature token with trample and haste onto the battlefield. Exile it at the beginning of the next end step. -ZEN C - -Zelyon Sword -{3} -Artifact -You may choose not to untap Zelyon Sword during your untap step. -{3}, {T}: Target creature gets +2/+0 for as long as Zelyon Sword remains tapped. -FEM R - -Zendikar Farguide -{4}{G} -Creature - Elemental -3/3 -Forestwalk -ZEN C - -Zephid -{4}{U}{U} -Creature - Illusion -3/4 -Flying; shroud (This permanent can't be the target of spells or abilities.) -USG R - -Zephid's Embrace -{2}{U}{U} -Enchantment - Aura -Enchant creature -Enchanted creature gets +2/+2 and has flying and shroud. (It can't be the target of spells or abilities.) -USG U - -Zephyr Falcon -{1}{U} -Creature - Bird -1/1 -Flying, vigilance -LEG C, 4ED C, 5ED C - -Zephyr Net -{1}{U} -Enchantment - Aura -Enchant creature -Enchanted creature has defender and flying. -LRW C - -Zephyr Spirit -{5}{U} -Creature - Spirit -0/6 -When Zephyr Spirit blocks, return it to its owner's hand. -RAV C - -Zephyr Sprite -{U} -Creature - Faerie -1/1 -Flying -M10 C - -Zerapa Minotaur -{2}{R}{R} -Creature - Minotaur -3/3 -First strike -{2}: Zerapa Minotaur loses first strike until end of turn. Any player may activate this ability. -PCY C - -Zhalfirin Commander -{2}{W} -Creature - Human Knight -2/2 -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -{1}{W}{W}: Target Knight creature gets +1/+1 until end of turn. -MIR U, TSB S, DDG U - -Zhalfirin Crusader -{1}{W}{W} -Creature - Human Knight -2/2 -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -{1}{W}: The next 1 damage that would be dealt to Zhalfirin Crusader this turn is dealt to target creature or player instead. -VIS R - -Zhalfirin Knight -{2}{W} -Creature - Human Knight -2/2 -Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -{W}{W}: Zhalfirin Knight gains first strike until end of turn. -MIR C - -Zhang Fei, Fierce Warrior -{4}{W}{W} -Legendary Creature - Human Soldier Warrior -4/4 -Vigilance; horsemanship (This creature can't be blocked except by creatures with horsemanship.) -PTK R, ME3 U - -Zhang He, Wei General -{3}{B}{B} -Legendary Creature - Human Soldier -4/2 -Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -Whenever Zhang He, Wei General attacks, each other creature you control gets +1/+0 until end of turn. -PTK R - -Zhang Liao, Hero of Hefei -{4}{B}{B} -Legendary Creature - Human Soldier -3/3 -Whenever Zhang Liao, Hero of Hefei deals damage to an opponent, that opponent discards a card. -PTK R - -Zhao Zilong, Tiger General -{3}{W}{W} -Legendary Creature - Human Soldier Warrior -3/3 -Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -Whenever Zhao Zilong, Tiger General blocks, it gets +1/+1 until end of turn. -PTK R - -Zhou Yu, Chief Commander -{5}{U}{U} -Legendary Creature - Human Soldier -8/8 -Zhou Yu, Chief Commander can't attack unless defending player controls an Island. -PTK R - -Zhuge Jin, Wu Strategist -{1}{U}{U} -Legendary Creature - Human Advisor -1/1 -{T}: Target creature is unblockable this turn. Activate this ability only during your turn, before attackers are declared. -PTK R - -Zirilan of the Claw -{3}{R}{R} -Legendary Creature - Viashino Shaman -3/4 -{1}{R}{R}, {T}: Search your library for a Dragon permanent card and put that card onto the battlefield. Then shuffle your library. That Dragon gains haste until end of turn. Exile it at the beginning of the next end step. -MIR R - -Zo-Zu the Punisher -{1}{R}{R} -Legendary Creature - Goblin Warrior -2/2 -Whenever a land enters the battlefield, Zo-Zu the Punisher deals 2 damage to that land's controller. -CHK R - -Zodiac Dog -{2}{R} -Creature - Hound -2/2 -Mountainwalk -PTK C - -Zodiac Dragon -{7}{R}{R} -Creature - Dragon -8/8 -When Zodiac Dragon is put into your graveyard from the battlefield, you may return it to your hand. -PTK R, ME3 R - -Zodiac Goat -{R} -Creature - Goat -1/1 -Mountainwalk -PTK C - -Zodiac Horse -{3}{G} -Creature - Horse -3/3 -Islandwalk -PTK U - -Zodiac Monkey -{1}{G} -Creature - Ape -2/1 -Forestwalk (This creature is unblockable as long as defending player controls a Forest.) -PTK C, 9ED C - -Zodiac Ox -{3}{G} -Creature - Ox -3/3 -Swampwalk -PTK U - -Zodiac Pig -{3}{B} -Creature - Boar -3/3 -Swampwalk -PTK U - -Zodiac Rabbit -{G} -Creature - Rabbit -1/1 -Forestwalk -PTK C - -Zodiac Rat -{B} -Creature - Rat -1/1 -Swampwalk -PTK C - -Zodiac Rooster -{1}{G} -Creature - Bird -2/1 -Plainswalk -PTK C - -Zodiac Snake -{2}{B} -Creature - Snake -2/2 -Swampwalk -PTK C - -Zodiac Tiger -{2}{G}{G} -Creature - Cat -3/4 -Forestwalk -PTK U - -Zoetic Cavern -Land -{T}: Add {1} to your mana pool. -Morph {2} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -FUT U, COM U - -Zof Shade -{3}{B} -Creature - Shade -2/2 -{2}{B}: Zof Shade gets +2/+2 until end of turn. -ROE C - -Zombie Assassin -{4}{B} -Creature - Zombie Assassin -3/2 -{T}, Exile two cards from your graveyard and Zombie Assassin: Destroy target nonblack creature. It can't be regenerated. -ODY C - -Zombie Boa -{4}{B} -Creature - Zombie Snake -3/3 -{1}{B}: Choose a color. Whenever Zombie Boa becomes blocked by a creature of that color this turn, destroy that creature. Activate this ability only any time you could cast a sorcery. -APC C - -Zombie Brute -{6}{B} -Creature - Zombie -5/4 -Amplify 1 (As this creature enters the battlefield, put a +1/+1 counter on it for each Zombie card you reveal in your hand.) -Trample -LGN U - -Zombie Cannibal -{B} -Creature - Zombie -1/1 -Whenever Zombie Cannibal deals combat damage to a player, you may exile target card from that player's graveyard. -ODY C - -Zombie Cutthroat -{3}{B}{B} -Creature - Zombie -3/4 -Morph-Pay 5 life. (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -SCG C - -Zombie Goliath -{4}{B} -Creature - Zombie Giant -4/3 -M10 C, M12 C - -Zombie Infestation -{1}{B} -Enchantment -Discard two cards: Put a 2/2 black Zombie creature token onto the battlefield. -ODY U, ARC U, M12 U - -Zombie Master -{1}{B}{B} -Creature - Zombie -2/3 -Other Zombie creatures have swampwalk. -Other Zombies have "{B}: Regenerate this permanent." -LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, 6ED R, ME4 U - -Zombie Mob -{2}{B}{B} -Creature - Zombie -2/0 -Zombie Mob enters the battlefield with a +1/+1 counter on it for each creature card in your graveyard. -When Zombie Mob enters the battlefield, exile all creature cards from your graveyard. -MIR U - -Zombie Musher -{3}{B} -Snow Creature - Zombie -2/3 -Snow landwalk -{S}: Regenerate Zombie Musher. ({S} can be paid with one mana from a snow permanent.) -CSP C - -Zombie Outlander -{U}{B} -Creature - Zombie Scout -2/2 -Protection from green -CON C - -Zombie Scavengers -{2}{B} -Creature - Zombie -3/1 -Exile the top creature card of your graveyard: Regenerate Zombie Scavengers. -WTH C - -Zombie Trailblazer -{B}{B}{B} -Creature - Zombie Scout -2/2 -Tap an untapped Zombie you control: Target land becomes a Swamp until end of turn. -Tap an untapped Zombie you control: Target creature gains swampwalk until end of turn. -TOR U - -Zombify -{3}{B} -Sorcery -Return target creature card from your graveyard to the battlefield. -ODY U, 8ED U, 9ED U, ARC U - -Zoologist -{3}{G} -Creature - Human Druid -1/2 -{3}{G}, {T}: Reveal the top card of your library. If it's a creature card, put it onto the battlefield. Otherwise, put it into your graveyard. -ODY R - -Zuberi, Golden Feather -{4}{W} -Legendary Creature - Griffin -3/3 -Flying -Other Griffin creatures get +1/+1. -MIR R - -Zulaport Enforcer -{B} -Creature - Human Warrior -1/1 -Level up {4} ({4}: Put a level counter on this. Level up only as a sorcery.) -LEVEL 1-2 -3/3 -LEVEL 3+ -5/5 -Zulaport Enforcer can't be blocked except by black creatures. -ROE C - -Zuo Ci, the Mocking Sage -{1}{G}{G} -Legendary Creature - Human Advisor -1/2 -Hexproof (This creature can't be the target of spells or abilities your opponents control.) -Zuo Ci, the Mocking Sage can't be blocked by creatures with horsemanship. -PTK R - -Zur the Enchanter -{1}{W}{U}{B} -Legendary Creature - Human Wizard -1/4 -Flying -Whenever Zur the Enchanter attacks, you may search your library for an enchantment card with converted mana cost 3 or less and put it onto the battlefield. If you do, shuffle your library. -CSP R - -Zur's Weirding -{3}{U} -Enchantment -Players play with their hands revealed. -If a player would draw a card, he or she reveals it instead. Then any other player may pay 2 life. If a player does, put that card into its owner's graveyard. Otherwise, that player draws a card. -ICE R, 5ED R, 6ED R, 8ED R, 9ED R - -Zuran Enchanter -{1}{U} -Creature - Human Wizard -1/1 -{2}{B}, {T}: Target player discards a card. Activate this ability only during your turn. -ICE C - -Zuran Orb -{0} -Artifact -Sacrifice a land: You gain 2 life. -ICE U, MED U, FVR M - -Zuran Spellcaster -{2}{U} -Creature - Human Wizard -1/1 -{T}: Zuran Spellcaster deals 1 damage to target creature or player. -ICE C, ME2 C - diff --git a/res/pics/BookIcon.png b/res/pics/BookIcon.png deleted file mode 100644 index 30d49b3a1e9..00000000000 Binary files a/res/pics/BookIcon.png and /dev/null differ diff --git a/res/pics/BoxIcon.png b/res/pics/BoxIcon.png deleted file mode 100644 index 46066a8a887..00000000000 Binary files a/res/pics/BoxIcon.png and /dev/null differ diff --git a/res/pics/GoldIcon.png b/res/pics/GoldIcon.png deleted file mode 100644 index 14464757ced..00000000000 Binary files a/res/pics/GoldIcon.png and /dev/null differ diff --git a/res/pics/HeartIcon.png b/res/pics/HeartIcon.png deleted file mode 100644 index 8337955e043..00000000000 Binary files a/res/pics/HeartIcon.png and /dev/null differ diff --git a/res/pics/icons/BookIcon.png b/res/pics/icons/BookIcon.png deleted file mode 100644 index 30d49b3a1e9..00000000000 Binary files a/res/pics/icons/BookIcon.png and /dev/null differ diff --git a/res/pics/icons/BookIconSmall.png b/res/pics/icons/BookIconSmall.png deleted file mode 100644 index 2daed1d745d..00000000000 Binary files a/res/pics/icons/BookIconSmall.png and /dev/null differ diff --git a/res/pics/icons/BottlesIconSmall.png b/res/pics/icons/BottlesIconSmall.png deleted file mode 100644 index ccf947ad704..00000000000 Binary files a/res/pics/icons/BottlesIconSmall.png and /dev/null differ diff --git a/res/pics/icons/BoxIcon.png b/res/pics/icons/BoxIcon.png deleted file mode 100644 index 46066a8a887..00000000000 Binary files a/res/pics/icons/BoxIcon.png and /dev/null differ diff --git a/res/pics/icons/BoxIconSmall.png b/res/pics/icons/BoxIconSmall.png deleted file mode 100644 index a847060ecda..00000000000 Binary files a/res/pics/icons/BoxIconSmall.png and /dev/null differ diff --git a/res/pics/icons/CoinIcon.png b/res/pics/icons/CoinIcon.png deleted file mode 100644 index daea3a2c935..00000000000 Binary files a/res/pics/icons/CoinIcon.png and /dev/null differ diff --git a/res/pics/icons/CoinIconSmall.png b/res/pics/icons/CoinIconSmall.png deleted file mode 100644 index 413208e33aa..00000000000 Binary files a/res/pics/icons/CoinIconSmall.png and /dev/null differ diff --git a/res/pics/icons/CoinStack.png b/res/pics/icons/CoinStack.png deleted file mode 100644 index 5c25da1242b..00000000000 Binary files a/res/pics/icons/CoinStack.png and /dev/null differ diff --git a/res/pics/icons/ElixirIcon.png b/res/pics/icons/ElixirIcon.png deleted file mode 100644 index c0548de793d..00000000000 Binary files a/res/pics/icons/ElixirIcon.png and /dev/null differ diff --git a/res/pics/icons/FoxIconSmall.png b/res/pics/icons/FoxIconSmall.png deleted file mode 100644 index ec27257e321..00000000000 Binary files a/res/pics/icons/FoxIconSmall.png and /dev/null differ diff --git a/res/pics/icons/GearIconSmall.png b/res/pics/icons/GearIconSmall.png deleted file mode 100644 index c92bb044e15..00000000000 Binary files a/res/pics/icons/GearIconSmall.png and /dev/null differ diff --git a/res/pics/icons/GoldIcon.png b/res/pics/icons/GoldIcon.png deleted file mode 100644 index 14464757ced..00000000000 Binary files a/res/pics/icons/GoldIcon.png and /dev/null differ diff --git a/res/pics/icons/GoldIconLarge.png b/res/pics/icons/GoldIconLarge.png deleted file mode 100644 index 69303512054..00000000000 Binary files a/res/pics/icons/GoldIconLarge.png and /dev/null differ diff --git a/res/pics/icons/GoldIconSmall.png b/res/pics/icons/GoldIconSmall.png deleted file mode 100644 index 9faf7e04c9b..00000000000 Binary files a/res/pics/icons/GoldIconSmall.png and /dev/null differ diff --git a/res/pics/icons/HeartIcon.png b/res/pics/icons/HeartIcon.png deleted file mode 100644 index 8337955e043..00000000000 Binary files a/res/pics/icons/HeartIcon.png and /dev/null differ diff --git a/res/pics/icons/LeafIconSmall.png b/res/pics/icons/LeafIconSmall.png deleted file mode 100644 index 513c4d6dcad..00000000000 Binary files a/res/pics/icons/LeafIconSmall.png and /dev/null differ diff --git a/res/pics/icons/Life.png b/res/pics/icons/Life.png deleted file mode 100644 index 55c4c2db04c..00000000000 Binary files a/res/pics/icons/Life.png and /dev/null differ diff --git a/res/pics/icons/MapIcon.png b/res/pics/icons/MapIcon.png deleted file mode 100644 index c882a8822c1..00000000000 Binary files a/res/pics/icons/MapIcon.png and /dev/null differ diff --git a/res/pics/icons/MapIconLarge.png b/res/pics/icons/MapIconLarge.png deleted file mode 100644 index 141de562272..00000000000 Binary files a/res/pics/icons/MapIconLarge.png and /dev/null differ diff --git a/res/pics/icons/ZeppelinIcon.png b/res/pics/icons/ZeppelinIcon.png deleted file mode 100644 index da38ce649d7..00000000000 Binary files a/res/pics/icons/ZeppelinIcon.png and /dev/null differ diff --git a/res/pics/icons/notesIcon.png b/res/pics/icons/notesIcon.png deleted file mode 100644 index fdf7d1a225d..00000000000 Binary files a/res/pics/icons/notesIcon.png and /dev/null differ diff --git a/res/pics_link/card-pictures_a.txt b/res/pics_link/card-pictures_a.txt deleted file mode 100644 index 4c687f6cc9a..00000000000 --- a/res/pics_link/card-pictures_a.txt +++ /dev/null @@ -1,556 +0,0 @@ -abandon_hope.jpg http://[server]/TE/Abandon%20Hope.full.jpg -abandoned_outpost.jpg http://[server]/OD/Abandoned%20Outpost.full.jpg -abbey_gargoyles.jpg http://[server]/HL/Abbey%20Gargoyles.full.jpg -abbey_matron.jpg http://[server]/HL/Abbey%20Matron1.full.jpg -abduction.jpg http://[server]/WL/Abduction.full.jpg -abeyance.jpg http://[server]/WL/Abeyance.full.jpg -abjure.jpg http://[server]/WL/Abjure.full.jpg -abolish.jpg http://[server]/PY/Abolish.full.jpg -abomination.jpg http://[server]/LG/Abomination.full.jpg -aboroth.jpg http://[server]/WL/Aboroth.full.jpg -aboshan_cephalid_emperor.jpg http://[server]/OD/Aboshan,%20Cephalid%20Emperor.full.jpg -aboshans_desire.jpg http://[server]/OD/Aboshan's%20Desire.full.jpg -about_face.jpg http://[server]/UL/About%20Face.full.jpg -absolute_grace.jpg http://[server]/US/Absolute%20Grace.full.jpg -absolute_law.jpg http://[server]/US/Absolute%20Law.full.jpg -absolver_thrull.jpg http://[server]/GP/Absolver%20Thrull.full.jpg -absorb.jpg http://[server]/IN/Absorb.full.jpg -absorb_vis.jpg http://[server]/CFX/Absorb%20Vis.full.jpg -abu_jafar.jpg http://[server]/CH/Abu%20Ja'far.full.jpg -abunas_chant.jpg http://[server]/FD/Abuna's%20Chant.full.jpg -abundance.jpg http://[server]/10E/Abundance.full.jpg -abyssal_gatekeeper.jpg http://[server]/WL/Abyssal%20Gatekeeper.full.jpg -abyssal_horror.jpg http://[server]/7E/Abyssal%20Horror.full.jpg -abyssal_hunter.jpg http://[server]/MI/Abyssal%20Hunter.full.jpg -abyssal_nightstalker.jpg http://[server]/P2/Abyssal%20Nightstalker.full.jpg -abyssal_nocturnus.jpg http://[server]/GP/Abyssal%20Nocturnus.full.jpg -abyssal_specter.jpg http://[server]/8E/Abyssal%20Specter.full.jpg -academy_rector.jpg http://[server]/UD/Academy%20Rector.full.jpg -academy_researchers.jpg http://[server]/10E/Academy%20Researchers.full.jpg -academy_ruins.jpg http://[server]/TSP/Academy%20Ruins.full.jpg -accelerate.jpg http://[server]/TO/Accelerate.full.jpg -accelerated_mutation.jpg http://[server]/SC/Accelerated%20Mutation.full.jpg -acceptable_losses.jpg http://[server]/OD/Acceptable%20Losses.full.jpg -accumulated_knowledge.jpg http://[server]/NE/Accumulated%20Knowledge.full.jpg -accursed_centaur.jpg http://[server]/ON/Accursed%20Centaur.full.jpg -ach!_hans_run!.jpg http://[server]/UNH/Ach!%20Hans,%20Run!.full.jpg -acid_rain.jpg http://[server]/LG/Acid%20Rain.full.jpg -acidic_dagger.jpg http://[server]/MI/Acidic%20Dagger.full.jpg -acidic_slime.jpg http://[server]/M10/Acidic%20Slime.full.jpg -acidic_sliver.jpg http://[server]/SH/Acidic%20Sliver.full.jpg -acidic_soil.jpg http://[server]/US/Acidic%20Soil.full.jpg -acolyte_of_xathrid.jpg http://[server]/M10/Acolyte%20of%20Xathrid.full.jpg -acorn_harvest.jpg http://[server]/TO/Acorn%20Harvest.full.jpg -acquire.jpg http://[server]/FD/Acquire.full.jpg -acridian.jpg http://[server]/US/Acridian.full.jpg -act_of_treason.jpg http://[server]/M10/Act%20of%20Treason.full.jpg -active_volcano.jpg http://[server]/LG/Active%20Volcano.full.jpg -ad_nauseam.jpg http://[server]/ALA/Ad%20Nauseam.full.jpg -adamaro_first_to_desire.jpg http://[server]/SOK/Adamaro,%20First%20to%20Desire.full.jpg -adarkar_sentinel.jpg http://[server]/IA/Adarkar%20Sentinel.full.jpg -adarkar_unicorn.jpg http://[server]/IA/Adarkar%20Unicorn.full.jpg -adarkar_valkyrie.jpg http://[server]/CS/Adarkar%20Valkyrie.full.jpg -adarkar_wastes.jpg http://[server]/10E/Adarkar%20Wastes.full.jpg -adarkar_windform.jpg http://[server]/CS/Adarkar%20Windform.full.jpg -adder_staff_boggart.jpg http://[server]/LRW/Adder-Staff%20Boggart.full.jpg -addle.jpg http://[server]/IN/Addle.full.jpg -adun_oakenshield.jpg http://[server]/LG/Adun%20Oakenshield.full.jpg -advance_scout.jpg http://[server]/TE/Advance%20Scout.full.jpg -advanced_hoverguard.jpg http://[server]/FD/Advanced%20Hoverguard.full.jpg -adventurers_guildhouse.jpg http://[server]/LG/Adventurers'%20Guildhouse.full.jpg -adventuring_gear.jpg http://[server]/ZEN/Adventuring%20Gear.full.jpg -advice_from_the_fae.jpg http://[server]/SHM/Advice%20from%20the%20Fae.full.jpg -aegis_of_honor.jpg http://[server]/OD/Aegis%20of%20Honor.full.jpg -aegis_of_the_meek.jpg http://[server]/IA/Aegis%20of%20the%20Meek.full.jpg -aeolipile.jpg http://[server]/FE/Aeolipile.full.jpg -aeon_chronicler.jpg http://[server]/PLC/Aeon%20Chronicler.full.jpg -aerathi_berserker.jpg http://[server]/LG/AErathi%20Berserker.full.jpg -aerial_caravan.jpg http://[server]/MM/Aerial%20Caravan.full.jpg -aerie_mystics.jpg http://[server]/CFX/Aerie%20Mystics.full.jpg -aerie_ouphes.jpg http://[server]/EVE/Aerie%20Ouphes.full.jpg -aesthetic_consultation.jpg http://[server]/UNH/Aesthetic%20Consultation.full.jpg -aesthir_glider.jpg http://[server]/AT/Aesthir%20Glider.full.jpg -aether_barrier.jpg http://[server]/NE/AEther%20Barrier.full.jpg -aether_burst.jpg http://[server]/OD/AEther%20Burst.full.jpg -aether_charge.jpg http://[server]/ON/AEther%20Charge.full.jpg -aether_figment.jpg http://[server]/ZEN/AEther%20Figment.full.jpg -aether_flash.jpg http://[server]/7E/Aether%20Flash.full.jpg -aether_membrane.jpg http://[server]/PLC/AEther%20Membrane.full.jpg -aether_mutation.jpg http://[server]/AP/AEther%20Mutation.full.jpg -aether_rift.jpg http://[server]/IN/AEther%20Rift.full.jpg -aether_shockwave.jpg http://[server]/SOK/Aether%20Shockwave.full.jpg -aether_snap.jpg http://[server]/DS/AEther%20Snap.full.jpg -aether_spellbomb.jpg http://[server]/MR/AEther%20Spellbomb.full.jpg -aether_sting.jpg http://[server]/UD/AEther%20Sting.full.jpg -aether_storm.jpg http://[server]/HL/AEther%20Storm.full.jpg -aether_tide.jpg http://[server]/EX/AEther%20Tide.full.jpg -aether_vial.jpg http://[server]/DS/AEther%20Vial.full.jpg -aether_web.jpg http://[server]/TSP/Aether%20Web.full.jpg -aetherflame_wall.jpg http://[server]/TSP/Aetherflame%20Wall.full.jpg -aethermages_touch.jpg http://[server]/DIS/AEthermage's%20Touch.full.jpg -aetherplasm.jpg http://[server]/GP/AEtherplasm.full.jpg -aethersnipe.jpg http://[server]/LRW/AEthersnipe.full.jpg -aethertow.jpg http://[server]/SHM/AEthertow.full.jpg -afflict.jpg http://[server]/OD/Afflict.full.jpg -afiya_grove.jpg http://[server]/MI/Afiya%20Grove.full.jpg -afterlife.jpg http://[server]/MM/Afterlife.full.jpg -aftershock.jpg http://[server]/TE/Aftershock.full.jpg -ageless_entity.jpg http://[server]/DS/Ageless%20Entity.full.jpg -ageless_sentinels.jpg http://[server]/SC/Ageless%20Sentinels.full.jpg -agent_of_masks.jpg http://[server]/GP/Agent%20of%20Masks.full.jpg -agent_of_shauku.jpg http://[server]/PY/Agent%20of%20Shauku.full.jpg -agent_of_stromgald.jpg http://[server]/AL/Agent%20of%20Stromgald1.full.jpg -aggravated_assault.jpg http://[server]/ON/Aggravated%20Assault.full.jpg -aggression.jpg http://[server]/IA/Aggression.full.jpg -aggressive_urge.jpg http://[server]/10E/Aggressive%20Urge.full.jpg -agility.jpg http://[server]/MI/Agility.full.jpg -agonizing_demise.jpg http://[server]/IN/Agonizing%20Demise.full.jpg -agonizing_memories.jpg http://[server]/10E/Agonizing%20Memories.full.jpg -agony_warp.jpg http://[server]/ALA/Agony%20Warp.full.jpg -agrus_kos_wojek_veteran.jpg http://[server]/RAV/Agrus%20Kos,%20Wojek%20Veteran.full.jpg -air_bladder.jpg http://[server]/NE/Air%20Bladder.full.jpg -air_elemental.jpg http://[server]/10E/Air%20Elemental.full.jpg -airborne_aid.jpg http://[server]/ON/Airborne%20Aid.full.jpg -airdrop_condor.jpg http://[server]/ON/Airdrop%20Condor.full.jpg -aisling_leprechaun.jpg http://[server]/LG/Aisling%20Leprechaun.full.jpg -ajani_goldmane.jpg http://[server]/M10/Ajani%20Goldmane.full.jpg -ajani_vengeant.jpg http://[server]/ALA/Ajani%20Vengeant.full.jpg -akki_avalanchers.jpg http://[server]/CHK/Akki%20Avalanchers.full.jpg -akki_blizzard_herder.jpg http://[server]/BOK/Akki%20Blizzard-Herder.full.jpg -akki_coalflinger.jpg http://[server]/CHK/Akki%20Coalflinger.full.jpg -akki_drillmaster.jpg http://[server]/SOK/Akki%20Drillmaster.full.jpg -akki_lavarunner.jpg http://[server]/CHK/Akki%20Lavarunner.full.jpg -akki_raider.jpg http://[server]/BOK/Akki%20Raider.full.jpg -akki_rockspeaker.jpg http://[server]/CHK/Akki%20Rockspeaker.full.jpg -akki_underling.jpg http://[server]/SOK/Akki%20Underling.full.jpg -akki_underminer.jpg http://[server]/CHK/Akki%20Underminer.full.jpg -akoum_refuge.jpg http://[server]/ZEN/Akoum%20Refuge.full.jpg -akrasan_squire.jpg http://[server]/ALA/Akrasan%20Squire.full.jpg -akroma_angel_of_fury.jpg http://[server]/PLC/Akroma,%20Angel%20of%20Fury.full.jpg -akroma_angel_of_wrath.jpg http://[server]/TSB/Akroma,%20Angel%20of%20Wrath.full.jpg -akromas_blessing.jpg http://[server]/ON/Akroma's%20Blessing.full.jpg -akromas_devoted.jpg http://[server]/LE/Akroma's%20Devoted.full.jpg -akromas_memorial.jpg http://[server]/FUT/Akroma's%20Memorial.full.jpg -akromas_vengeance.jpg http://[server]/ON/Akroma's%20Vengeance.full.jpg -akron_legionnaire.jpg http://[server]/LG/Akron%20Legionnaire.full.jpg -aku_djinn.jpg http://[server]/VI/Aku%20Djinn.full.jpg -akuta_born_of_ash.jpg http://[server]/SOK/Akuta,%20Born%20of%20Ash.full.jpg -al_abaras_carpet.jpg http://[server]/LG/Al-abara's%20Carpet.full.jpg -alabaster_dragon.jpg http://[server]/WL/Alabaster%20Dragon.full.jpg -alabaster_leech.jpg http://[server]/IN/Alabaster%20Leech.full.jpg -alabaster_potion.jpg http://[server]/LG/Alabaster%20Potion.full.jpg -alabaster_wall.jpg http://[server]/MM/Alabaster%20Wall.full.jpg -alaborn_cavalier.jpg http://[server]/P2/Alaborn%20Cavalier.full.jpg -alaborn_grenadier.jpg http://[server]/P2/Alaborn%20Grenadier.full.jpg -alaborn_musketeer.jpg http://[server]/P2/Alaborn%20Musketeer.full.jpg -alaborn_trooper.jpg http://[server]/P2/Alaborn%20Trooper.full.jpg -alaborn_veteran.jpg http://[server]/P2/Alaborn%20Veteran.full.jpg -alaborn_zealot.jpg http://[server]/P2/Alaborn%20Zealot.full.jpg -aladdin.jpg http://[server]/CH/Aladdin.full.jpg -aladdins_lamp.jpg http://[server]/R/Aladdin's%20Lamp.full.jpg -aladdins_ring.jpg http://[server]/9E/Aladdin's%20Ring.full.jpg -alarum.jpg http://[server]/MI/Alarum.full.jpg -albino_troll.jpg http://[server]/US/Albino%20Troll.full.jpg -alchors_tomb.jpg http://[server]/LG/Alchor's%20Tomb.full.jpg -aleatory.jpg http://[server]/MI/Aleatory.full.jpg -alert_shu_infantry.jpg http://[server]/P3/Alert%20Shu%20Infantry.full.jpg -alexi_zephyr_mage.jpg http://[server]/PY/Alexi,%20Zephyr%20Mage.full.jpg -alexis_cloak.jpg http://[server]/PY/Alexi's%20Cloak.full.jpg -algae_gharial.jpg http://[server]/ALA/Algae%20Gharial.full.jpg -ali_baba.jpg http://[server]/AN/Ali%20Baba.full.jpg -ali_from_cairo.jpg http://[server]/AN/Ali%20from%20Cairo.full.jpg -alibans_tower.jpg http://[server]/HL/Aliban's%20Tower1.full.jpg -all_hallows_eve.jpg http://[server]/LG/All%20Hallow's%20Eve.full.jpg -all_suns_dawn.jpg http://[server]/FD/All%20Suns'%20Dawn.full.jpg -allay.jpg http://[server]/EX/Allay.full.jpg -alley_grifters.jpg http://[server]/MM/Alley%20Grifters.full.jpg -allied_strategies.jpg http://[server]/PS/Allied%20Strategies.full.jpg -allosaurus_rider.jpg http://[server]/CS/Allosaurus%20Rider.full.jpg -alloy_golem.jpg http://[server]/IN/Alloy%20Golem.full.jpg -alluring_scent.jpg http://[server]/ST/Alluring%20Scent.full.jpg -alluring_siren.jpg http://[server]/M10/Alluring%20Siren.full.jpg -alms.jpg http://[server]/WL/Alms.full.jpg -alpha_kavu.jpg http://[server]/PS/Alpha%20Kavu.full.jpg -alpha_myr.jpg http://[server]/MR/Alpha%20Myr.full.jpg -alpha_status.jpg http://[server]/SC/Alpha%20Status.full.jpg -altar_golem.jpg http://[server]/EVE/Altar%20Golem.full.jpg -altar_of_bone.jpg http://[server]/IA/Altar%20of%20Bone.full.jpg -altar_of_dementia.jpg http://[server]/TE/Altar%20of%20Dementia.full.jpg -altar_of_shadows.jpg http://[server]/MR/Altar%20of%20Shadows.full.jpg -altars_light.jpg http://[server]/MR/Altar's%20Light.full.jpg -alter_reality.jpg http://[server]/TO/Alter%20Reality.full.jpg -aluren.jpg http://[server]/TE/Aluren.full.jpg -ambassador_laquatus.jpg http://[server]/10E/Ambassador%20Laquatus.full.jpg -ambassador_oak.jpg http://[server]/MOR/Ambassador%20Oak.full.jpg -amber_prison.jpg http://[server]/MI/Amber%20Prison.full.jpg -ambiguity.jpg http://[server]/UNH/Ambiguity.full.jpg -ambitions_cost.jpg http://[server]/8E/Ambition's%20Cost.full.jpg -ambush.jpg http://[server]/HL/Ambush.full.jpg -ambush_commander.jpg http://[server]/SC/Ambush%20Commander.full.jpg -ambush_party.jpg http://[server]/5E/Ambush%20Party.full.jpg -amnesia.jpg http://[server]/DK/Amnesia.full.jpg -amoeboid_changeling.jpg http://[server]/LRW/Amoeboid%20Changeling.full.jpg -amok.jpg http://[server]/SH/Amok.full.jpg -amphibious_kavu.jpg http://[server]/PS/Amphibious%20Kavu.full.jpg -amrou_kithkin.jpg http://[server]/LG/Amrou%20Kithkin.full.jpg -amrou_scout.jpg http://[server]/TSP/Amrou%20Scout.full.jpg -amrou_seekers.jpg http://[server]/TSP/Amrou%20Seekers.full.jpg -amugaba.jpg http://[server]/OD/Amugaba.full.jpg -amulet_of_kroog.jpg http://[server]/AQ/Amulet%20of%20Kroog.full.jpg -amulet_of_quoz.jpg http://[server]/IA/Amulet%20of%20Quoz.full.jpg -amulet_of_unmaking.jpg http://[server]/MI/Amulet%20of%20Unmaking.full.jpg -an_havva_constable.jpg http://[server]/HL/An-Havva%20Constable.full.jpg -an_havva_inn.jpg http://[server]/HL/An-Havva%20Inn.full.jpg -an_havva_township.jpg http://[server]/HL/An-Havva%20Township.full.jpg -an_zerrin_ruins.jpg http://[server]/HL/An-Zerrin%20Ruins.full.jpg -ana_battlemage.jpg http://[server]/PLC/Ana%20Battlemage.full.jpg -ana_disciple.jpg http://[server]/AP/Ana%20Disciple.full.jpg -ana_sanctuary.jpg http://[server]/AP/Ana%20Sanctuary.full.jpg -anaba_ancestor.jpg http://[server]/HL/Anaba%20Ancestor.full.jpg -anaba_bodyguard.jpg http://[server]/10E/Anaba%20Bodyguard.full.jpg -anaba_shaman.jpg http://[server]/9E/Anaba%20Shaman.full.jpg -anaba_spirit_crafter.jpg http://[server]/HL/Anaba%20Spirit%20Crafter.full.jpg -anaconda.jpg http://[server]/9E/Anaconda.full.jpg -anarchist.jpg http://[server]/9E/Anarchist.full.jpg -anarchy.jpg http://[server]/IA/Anarchy.full.jpg -anathemancer.jpg http://[server]/ARB/Anathemancer.full.jpg -anavolver.jpg http://[server]/AP/Anavolver.full.jpg -ancestors_chosen.jpg http://[server]/10E/Ancestor's%20Chosen.full.jpg -ancestors_prophet.jpg http://[server]/ON/Ancestor's%20Prophet.full.jpg -ancestral_knowledge.jpg http://[server]/WL/Ancestral%20Knowledge.full.jpg -ancestral_mask.jpg http://[server]/MM/Ancestral%20Mask.full.jpg -ancestral_memories.jpg http://[server]/MI/Ancestral%20Memories.full.jpg -ancestral_recall.jpg http://[server]/U/Ancestral%20Recall.full.jpg -ancestral_tribute.jpg http://[server]/OD/Ancestral%20Tribute.full.jpg -ancestral_vision.jpg http://[server]/TSP/Ancestral%20Vision.full.jpg -ancient_amphitheater.jpg http://[server]/LRW/Ancient%20Amphitheater.full.jpg -ancient_craving.jpg http://[server]/ST/Ancient%20Craving.full.jpg -ancient_den.jpg http://[server]/MR/Ancient%20Den.full.jpg -ancient_grudge.jpg http://[server]/TSP/Ancient%20Grudge.full.jpg -ancient_hydra.jpg http://[server]/NE/Ancient%20Hydra.full.jpg -ancient_kavu.jpg http://[server]/IN/Ancient%20Kavu.full.jpg -ancient_ooze.jpg http://[server]/SC/Ancient%20Ooze.full.jpg -ancient_runes.jpg http://[server]/TE/Ancient%20Runes.full.jpg -ancient_silverback.jpg http://[server]/9E/Ancient%20Silverback.full.jpg -ancient_spider.jpg http://[server]/PS/Ancient%20Spider.full.jpg -ancient_spring.jpg http://[server]/IN/Ancient%20Spring.full.jpg -ancient_tomb.jpg http://[server]/TE/Ancient%20Tomb.full.jpg -ancient_ziggurat.jpg http://[server]/CFX/Ancient%20Ziggurat.full.jpg -andradite_leech.jpg http://[server]/IN/Andradite%20Leech.full.jpg -angel_of_despair.jpg http://[server]/GP/Angel%20of%20Despair.full.jpg -angel_of_fury.jpg http://[server]/P2/Angel%20of%20Fury.full.jpg -angel_of_light.jpg http://[server]/ST/Angel%20of%20Light.full.jpg -angel_of_mercy.jpg http://[server]/10E/Angel%20of%20Mercy.full.jpg -angel_of_retribution.jpg http://[server]/TO/Angel%20of%20Retribution.full.jpg -angel_of_salvation.jpg http://[server]/FUT/Angel%20of%20Salvation.full.jpg -angelfire_crusader.jpg http://[server]/AP/Angelfire%20Crusader.full.jpg -angelic_benediction.jpg http://[server]/ALA/Angelic%20Benediction.full.jpg -angelic_blessing.jpg http://[server]/10E/Angelic%20Blessing.full.jpg -angelic_chorus.jpg http://[server]/10E/Angelic%20Chorus.full.jpg -angelic_curator.jpg http://[server]/UL/Angelic%20Curator.full.jpg -angelic_favor.jpg http://[server]/NE/Angelic%20Favor.full.jpg -angelic_page.jpg http://[server]/8E/Angelic%20Page.full.jpg -angelic_protector.jpg http://[server]/TE/Angelic%20Protector.full.jpg -angelic_renewal.jpg http://[server]/WL/Angelic%20Renewal.full.jpg -angelic_shield.jpg http://[server]/IN/Angelic%20Shield.full.jpg -angelic_voices.jpg http://[server]/LG/Angelic%20Voices.full.jpg -angelic_wall.jpg http://[server]/OD/Angelic%20Wall.full.jpg -angels_feather.jpg http://[server]/10E/Angel's%20Feather.full.jpg -angels_grace.jpg http://[server]/TSP/Angel's%20Grace.full.jpg -angels_herald.jpg http://[server]/ALA/Angel's%20Herald.full.jpg -angels_mercy.jpg http://[server]/M10/Angel's%20Mercy.full.jpg -angels_trumpet.jpg http://[server]/UL/Angel's%20Trumpet.full.jpg -angelsong.jpg http://[server]/ALA/Angelsong.full.jpg -anger.jpg http://[server]/JU/Anger.full.jpg -angry_mob.jpg http://[server]/DK/Angry%20Mob.full.jpg -angus_mackenzie.jpg http://[server]/LG/Angus%20Mackenzie.full.jpg -animal_boneyard.jpg http://[server]/OD/Animal%20Boneyard.full.jpg -animal_magnetism.jpg http://[server]/ON/Animal%20Magnetism.full.jpg -animate_artifact.jpg http://[server]/4E/Animate%20Artifact.full.jpg -animate_dead.jpg http://[server]/5E/Animate%20Dead.full.jpg -animate_land.jpg http://[server]/NE/Animate%20Land.full.jpg -animate_wall.jpg http://[server]/6E/Animate%20Wall.full.jpg -ankh_of_mishra.jpg http://[server]/6E/Ankh%20of%20Mishra.full.jpg -annex.jpg http://[server]/9E/Annex.full.jpg -annihilate.jpg http://[server]/IN/Annihilate.full.jpg -annul.jpg http://[server]/MR/Annul.full.jpg -anodet_lurker.jpg http://[server]/FD/Anodet%20Lurker.full.jpg -anoint.jpg http://[server]/TE/Anoint.full.jpg -ant_queen.jpg http://[server]/M10/Ant%20Queen.full.jpg -antagonism.jpg http://[server]/US/Antagonism.full.jpg -anthem_of_rakdos.jpg http://[server]/DIS/Anthem%20of%20Rakdos.full.jpg -anthroplasm.jpg http://[server]/UL/Anthroplasm.full.jpg -anti_magic_aura.jpg http://[server]/LG/Anti-Magic%20Aura.full.jpg -antler_skulkin.jpg http://[server]/EVE/Antler%20Skulkin.full.jpg -anurid_barkripper.jpg http://[server]/JU/Anurid%20Barkripper.full.jpg -anurid_brushhopper.jpg http://[server]/JU/Anurid%20Brushhopper.full.jpg -anurid_murkdiver.jpg http://[server]/ON/Anurid%20Murkdiver.full.jpg -anurid_scavenger.jpg http://[server]/TO/Anurid%20Scavenger.full.jpg -anurid_swarmsnapper.jpg http://[server]/JU/Anurid%20Swarmsnapper.full.jpg -anvil_of_bogardan.jpg http://[server]/VI/Anvil%20of%20Bogardan.full.jpg -apathy.jpg http://[server]/WL/Apathy.full.jpg -apes_of_rath.jpg http://[server]/TE/Apes%20of%20Rath.full.jpg -aphetto_alchemist.jpg http://[server]/ON/Aphetto%20Alchemist.full.jpg -aphetto_dredging.jpg http://[server]/ON/Aphetto%20Dredging.full.jpg -aphetto_exterminator.jpg http://[server]/LE/Aphetto%20Exterminator.full.jpg -aphetto_grifter.jpg http://[server]/ON/Aphetto%20Grifter.full.jpg -aphetto_runecaster.jpg http://[server]/SC/Aphetto%20Runecaster.full.jpg -aphetto_vulture.jpg http://[server]/ON/Aphetto%20Vulture.full.jpg -aphotic_wisps.jpg http://[server]/SHM/Aphotic%20Wisps.full.jpg -apocalypse.jpg http://[server]/TE/Apocalypse.full.jpg -apocalypse_chime.jpg http://[server]/HL/Apocalypse%20Chime.full.jpg -apocalypse_hydra.jpg http://[server]/CFX/Apocalypse%20Hydra.full.jpg -apothecary_initiate.jpg http://[server]/SHM/Apothecary%20Initiate.full.jpg -apprentice_necromancer.jpg http://[server]/UD/Apprentice%20Necromancer.full.jpg -apprentice_sorcerer.jpg http://[server]/P2/Apprentice%20Sorcerer.full.jpg -apprentice_wizard.jpg http://[server]/DK/Apprentice%20Wizard.full.jpg -aquamoeba.jpg http://[server]/TO/Aquamoeba.full.jpg -aquamorph_entity.jpg http://[server]/PLC/Aquamorph%20Entity.full.jpg -aquastrand_spider.jpg http://[server]/DIS/Aquastrand%20Spider.full.jpg -aquitects_will.jpg http://[server]/LRW/Aquitect's%20Will.full.jpg -araba_mothrider.jpg http://[server]/SOK/Araba%20Mothrider.full.jpg -arachnoid.jpg http://[server]/FD/Arachnoid.full.jpg -arashi_the_sky_asunder.jpg http://[server]/SOK/Arashi,%20the%20Sky%20Asunder.full.jpg -arbiter_of_knollridge.jpg http://[server]/LRW/Arbiter%20of%20Knollridge.full.jpg -arboria.jpg http://[server]/LG/Arboria.full.jpg -arc_blade.jpg http://[server]/FUT/Arc%20Blade.full.jpg -arc_lightning.jpg http://[server]/HOP/Arc%20Lightning.full.jpg -arc_mage.jpg http://[server]/NE/Arc%20Mage.full.jpg -arc_slogger.jpg http://[server]/MR/Arc-Slogger.full.jpg -arcades_sabboth.jpg http://[server]/LG/Arcades%20Sabboth.full.jpg -arcane_denial.jpg http://[server]/AL/Arcane%20Denial1.full.jpg -arcane_laboratory.jpg http://[server]/7E/Arcane%20Laboratory.full.jpg -arcane_sanctum.jpg http://[server]/ALA/Arcane%20Sanctum.full.jpg -arcane_spyglass.jpg http://[server]/DS/Arcane%20Spyglass.full.jpg -arcane_teachings.jpg http://[server]/10E/Arcane%20Teachings.full.jpg -arcanis_the_omnipotent.jpg http://[server]/10E/Arcanis%20the%20Omnipotent.full.jpg -arcanum_wings.jpg http://[server]/FUT/Arcanum%20Wings.full.jpg -arcbound_bruiser.jpg http://[server]/DS/Arcbound%20Bruiser.full.jpg -arcbound_crusher.jpg http://[server]/DS/Arcbound%20Crusher.full.jpg -arcbound_fiend.jpg http://[server]/DS/Arcbound%20Fiend.full.jpg -arcbound_hybrid.jpg http://[server]/DS/Arcbound%20Hybrid.full.jpg -arcbound_lancer.jpg http://[server]/DS/Arcbound%20Lancer.full.jpg -arcbound_overseer.jpg http://[server]/DS/Arcbound%20Overseer.full.jpg -arcbound_ravager.jpg http://[server]/DS/Arcbound%20Ravager.full.jpg -arcbound_reclaimer.jpg http://[server]/DS/Arcbound%20Reclaimer.full.jpg -arcbound_slith.jpg http://[server]/DS/Arcbound%20Slith.full.jpg -arcbound_stinger.jpg http://[server]/DS/Arcbound%20Stinger.full.jpg -arcbound_wanderer.jpg http://[server]/FD/Arcbound%20Wanderer.full.jpg -arcbound_worker.jpg http://[server]/DS/Arcbound%20Worker.full.jpg -archaeological_dig.jpg http://[server]/IN/Archaeological%20Dig.full.jpg -archangel.jpg http://[server]/VI/Archangel.full.jpg -archdemon_of_unx.jpg http://[server]/ALA/Archdemon%20of%20Unx.full.jpg -archery_training.jpg http://[server]/UD/Archery%20Training.full.jpg -architects_of_will.jpg http://[server]/ARB/Architects%20of%20Will.full.jpg -archive_trap.jpg http://[server]/ZEN/Archive%20Trap.full.jpg -archivist.jpg http://[server]/9E/Archivist.full.jpg -archmage_ascension.jpg http://[server]/ZEN/Archmage%20Ascension.full.jpg -archon_of_justice.jpg http://[server]/EVE/Archon%20of%20Justice.full.jpg -arctic_flats.jpg http://[server]/CS/Arctic%20Flats.full.jpg -arctic_foxes.jpg http://[server]/IA/Arctic%20Foxes.full.jpg -arctic_merfolk.jpg http://[server]/PS/Arctic%20Merfolk.full.jpg -arctic_nishoba.jpg http://[server]/CS/Arctic%20Nishoba.full.jpg -arctic_wolves.jpg http://[server]/WL/Arctic%20Wolves.full.jpg -arcum_dagsson.jpg http://[server]/CS/Arcum%20Dagsson.full.jpg -arcums_sleigh.jpg http://[server]/IA/Arcum's%20Sleigh.full.jpg -arcums_weathervane.jpg http://[server]/IA/Arcum's%20Weathervane.full.jpg -arcums_whistle.jpg http://[server]/IA/Arcum's%20Whistle.full.jpg -ardent_militia.jpg http://[server]/8E/Ardent%20Militia.full.jpg -ardent_plea.jpg http://[server]/ARB/Ardent%20Plea.full.jpg -ardent_soldier.jpg http://[server]/IN/Ardent%20Soldier.full.jpg -arena.jpg http://[server]/HPB/Arena.full.jpg -arena_of_the_ancients.jpg http://[server]/LG/Arena%20of%20the%20Ancients.full.jpg -arensons_aura.jpg http://[server]/IA/Arenson's%20Aura.full.jpg -argivian_archaeologist.jpg http://[server]/AQ/Argivian%20Archaeologist.full.jpg -argivian_blacksmith.jpg http://[server]/AQ/Argivian%20Blacksmith.full.jpg -argivian_find.jpg http://[server]/WL/Argivian%20Find.full.jpg -argivian_restoration.jpg http://[server]/WL/Argivian%20Restoration.full.jpg -argothian_elder.jpg http://[server]/US/Argothian%20Elder.full.jpg -argothian_enchantress.jpg http://[server]/US/Argothian%20Enchantress.full.jpg -argothian_pixies.jpg http://[server]/CH/Argothian%20Pixies.full.jpg -argothian_swine.jpg http://[server]/US/Argothian%20Swine.full.jpg -argothian_treefolk.jpg http://[server]/AQ/Argothian%20Treefolk.full.jpg -argothian_wurm.jpg http://[server]/US/Argothian%20Wurm.full.jpg -arid_mesa.jpg http://[server]/ZEN/Arid%20Mesa.full.jpg -ark_of_blight.jpg http://[server]/SC/Ark%20of%20Blight.full.jpg -armadillo_cloak.jpg http://[server]/IN/Armadillo%20Cloak.full.jpg -armageddon.jpg http://[server]/6E/Armageddon.full.jpg -armageddon_clock.jpg http://[server]/AQ/Armageddon%20Clock.full.jpg -armament_master.jpg http://[server]/ZEN/Armament%20Master.full.jpg -armed_response.jpg http://[server]/FD/Armed%20Response.full.jpg -armillary_sphere.jpg http://[server]/CFX/Armillary%20Sphere.full.jpg -armistice.jpg http://[server]/MM/Armistice.full.jpg -armor_of_faith.jpg http://[server]/IA/Armor%20of%20Faith.full.jpg -armor_of_thorns.jpg http://[server]/MI/Armor%20of%20Thorns.full.jpg -armor_sliver.jpg http://[server]/TE/Armor%20Sliver.full.jpg -armor_thrull.jpg http://[server]/FE/Armor%20Thrull1.full.jpg -armored_ascension.jpg http://[server]/M10/Armored%20Ascension.full.jpg -armored_galleon.jpg http://[server]/P2/Armored%20Galleon.full.jpg -armored_griffin.jpg http://[server]/P2/Armored%20Griffin.full.jpg -armored_guardian.jpg http://[server]/IN/Armored%20Guardian.full.jpg -armored_pegasus.jpg http://[server]/TE/Armored%20Pegasus.full.jpg -armorer_guildmage.jpg http://[server]/MI/Armorer%20Guildmage.full.jpg -arms_dealer.jpg http://[server]/MM/Arms%20Dealer.full.jpg -army_ants.jpg http://[server]/VI/Army%20Ants.full.jpg -army_of_allah.jpg http://[server]/AN/Army%20of%20Allah1.full.jpg -arnjlots_ascent.jpg http://[server]/IA/Arnjlot's%20Ascent.full.jpg -arrest.jpg http://[server]/MR/Arrest.full.jpg -arrogant_vampire.jpg http://[server]/PT/Arrogant%20Vampire.full.jpg -arrogant_wurm.jpg http://[server]/TO/Arrogant%20Wurm.full.jpg -arrow_volley_trap.jpg http://[server]/ZEN/Arrow%20Volley%20Trap.full.jpg -arsenal_thresher.jpg http://[server]/HOP/Arsenal%20Thresher.full.jpg -artful_looter.jpg http://[server]/UNH/Artful%20Looter.full.jpg -artifact_blast.jpg http://[server]/AQ/Artifact%20Blast.full.jpg -artifact_mutation.jpg http://[server]/IN/Artifact%20Mutation.full.jpg -artifact_possession.jpg http://[server]/AQ/Artifact%20Possession.full.jpg -artifact_ward.jpg http://[server]/AQ/Artifact%20Ward.full.jpg -artificers_intuition.jpg http://[server]/FD/Artificer's%20Intuition.full.jpg -artificial_evolution.jpg http://[server]/ON/Artificial%20Evolution.full.jpg -ascendant_evincar.jpg http://[server]/10E/Ascendant%20Evincar.full.jpg -ascending_aven.jpg http://[server]/ON/Ascending%20Aven.full.jpg -ashas_favor.jpg http://[server]/CFX/Asha's%20Favor.full.jpg -ashcoat_bear.jpg http://[server]/TSP/Ashcoat%20Bear.full.jpg -ashen_firebeast.jpg http://[server]/OD/Ashen%20Firebeast.full.jpg -ashen_ghoul.jpg http://[server]/IA/Ashen%20Ghoul.full.jpg -ashen_monstrosity.jpg http://[server]/BOK/Ashen%20Monstrosity.full.jpg -ashen_powder.jpg http://[server]/MI/Ashen%20Powder.full.jpg -ashen_skin_zubera.jpg http://[server]/CHK/Ashen-Skin%20Zubera.full.jpg -ashenmoor_cohort.jpg http://[server]/SHM/Ashenmoor%20Cohort.full.jpg -ashenmoor_gouger.jpg http://[server]/SHM/Ashenmoor%20Gouger.full.jpg -ashenmoor_liege.jpg http://[server]/SHM/Ashenmoor%20Liege.full.jpg -ashes_of_the_fallen.jpg http://[server]/SOK/Ashes%20of%20the%20Fallen.full.jpg -ashes_to_ashes.jpg http://[server]/DK/Ashes%20to%20Ashes.full.jpg -ashling_the_extinguisher.jpg http://[server]/EVE/Ashling,%20the%20Extinguisher.full.jpg -ashling_the_pilgrim.jpg http://[server]/LRW/Ashling%20the%20Pilgrim.full.jpg -ashlings_prerogative.jpg http://[server]/LRW/Ashling's%20Prerogative.full.jpg -ashnod.jpg http://[server]/VG/Ashnod.full.jpg -ashnods_altar.jpg http://[server]/6E/Ashnod's%20Altar.full.jpg -ashnods_battle_gear.jpg http://[server]/AQ/Ashnod's%20Battle%20Gear.full.jpg -ashnods_coupon.jpg http://[server]/UG/Ashnod's%20Coupon.full.jpg -ashnods_cylix.jpg http://[server]/AL/Ashnod's%20Cylix.full.jpg -ashnods_transmogrant.jpg http://[server]/CH/Ashnod's%20Transmogrant.full.jpg -asmira_holy_avenger.jpg http://[server]/MI/Asmira,%20Holy%20Avenger.full.jpg -aspect_of_mongoose.jpg http://[server]/TSP/Aspect%20of%20Mongoose.full.jpg -aspect_of_wolf.jpg http://[server]/5E/Aspect%20of%20Wolf.full.jpg -ass_whuppin.jpg http://[server]/UNH/Ass%20Whuppin'.full.jpg -assassinate.jpg http://[server]/M10/Assassinate.full.jpg -assassins_blade.jpg http://[server]/PT/Assassin's%20Blade.full.jpg -assault_battery.jpg http://[server]/HOP/Assault%20Battery.full.jpg -assault_zeppelid.jpg http://[server]/DIS/Assault%20Zeppelid.full.jpg -assaultbattery.jpg http://[server]/IN/AssaultBattery.full.jpg -assembly_hall.jpg http://[server]/MM/Assembly%20Hall.full.jpg -assembly_worker.jpg http://[server]/TSP/Assembly-Worker.full.jpg -assert_authority.jpg http://[server]/MR/Assert%20Authority.full.jpg -assquatch.jpg http://[server]/UNH/Assquatch.full.jpg -astral_slide.jpg http://[server]/ON/Astral%20Slide.full.jpg -astral_steel.jpg http://[server]/SC/Astral%20Steel.full.jpg -astrolabe.jpg http://[server]/AL/Astrolabe1.full.jpg -aswan_jaguar.jpg http://[server]/OV/Aswan%20Jaguar.full.jpg -atalya_samite_master.jpg http://[server]/IN/Atalya,%20Samite%20Master.full.jpg -atinlay_igpay.jpg http://[server]/UNH/Atinlay%20Igpay.full.jpg -atog.jpg http://[server]/MR/Atog.full.jpg -atogatog.jpg http://[server]/OD/Atogatog.full.jpg -attrition.jpg http://[server]/UD/Attrition.full.jpg -attunement.jpg http://[server]/US/Attunement.full.jpg -augur_il_vec.jpg http://[server]/FUT/Augur%20il-Vec.full.jpg -augur_of_skulls.jpg http://[server]/FUT/Augur%20of%20Skulls.full.jpg -augury_adept.jpg http://[server]/SHM/Augury%20Adept.full.jpg -aunties_hovel.jpg http://[server]/LRW/Auntie's%20Hovel.full.jpg -aunties_snitch.jpg http://[server]/MOR/Auntie's%20Snitch.full.jpg -aura_barbs.jpg http://[server]/BOK/Aura%20Barbs.full.jpg -aura_blast.jpg http://[server]/PS/Aura%20Blast.full.jpg -aura_extraction.jpg http://[server]/ON/Aura%20Extraction.full.jpg -aura_flux.jpg http://[server]/UL/Aura%20Flux.full.jpg -aura_fracture.jpg http://[server]/PY/Aura%20Fracture.full.jpg -aura_graft.jpg http://[server]/10E/Aura%20Graft.full.jpg -aura_mutation.jpg http://[server]/IN/Aura%20Mutation.full.jpg -aura_of_dominion.jpg http://[server]/CHK/Aura%20of%20Dominion.full.jpg -aura_of_silence.jpg http://[server]/10E/Aura%20of%20Silence.full.jpg -aura_shards.jpg http://[server]/IN/Aura%20Shards.full.jpg -aura_thief.jpg http://[server]/UD/Aura%20Thief.full.jpg -auramancer.jpg http://[server]/OD/Auramancer.full.jpg -auramancers_guise.jpg http://[server]/PLC/Auramancer's%20Guise.full.jpg -auratog.jpg http://[server]/TE/Auratog.full.jpg -auratouched_mage.jpg http://[server]/RAV/Auratouched%20Mage.full.jpg -aurification.jpg http://[server]/ON/Aurification.full.jpg -auriok_bladewarden.jpg http://[server]/MR/Auriok%20Bladewarden.full.jpg -auriok_champion.jpg http://[server]/FD/Auriok%20Champion.full.jpg -auriok_glaivemaster.jpg http://[server]/DS/Auriok%20Glaivemaster.full.jpg -auriok_salvagers.jpg http://[server]/FD/Auriok%20Salvagers.full.jpg -auriok_siege_sled.jpg http://[server]/DS/Auriok%20Siege%20Sled.full.jpg -auriok_steelshaper.jpg http://[server]/MR/Auriok%20Steelshaper.full.jpg -auriok_transfixer.jpg http://[server]/MR/Auriok%20Transfixer.full.jpg -auriok_windwalker.jpg http://[server]/FD/Auriok%20Windwalker.full.jpg -aurochs.jpg http://[server]/IA/Aurochs.full.jpg -aurochs_herd.jpg http://[server]/CS/Aurochs%20Herd.full.jpg -aurora_eidolon.jpg http://[server]/DIS/Aurora%20Eidolon.full.jpg -aurora_griffin.jpg http://[server]/PS/Aurora%20Griffin.full.jpg -auspicious_ancestor.jpg http://[server]/MI/Auspicious%20Ancestor.full.jpg -austere_command.jpg http://[server]/LRW/Austere%20Command.full.jpg -autochthon_wurm.jpg http://[server]/RAV/Autochthon%20Wurm.full.jpg -autumn_willow.jpg http://[server]/HL/Autumn%20Willow.full.jpg -avalanche.jpg http://[server]/IA/Avalanche.full.jpg -avalanche_riders.jpg http://[server]/FNM/Avalanche%20Riders.full.jpg -avarax.jpg http://[server]/ON/Avarax.full.jpg -avarice_totem.jpg http://[server]/FD/Avarice%20Totem.full.jpg -avatar_of_discord.jpg http://[server]/DIS/Avatar%20of%20Discord.full.jpg -avatar_of_fury.jpg http://[server]/PY/Avatar%20of%20Fury.full.jpg -avatar_of_hope.jpg http://[server]/8E/Avatar%20of%20Hope.full.jpg -avatar_of_me.jpg http://[server]/UNH/Avatar%20of%20Me.full.jpg -avatar_of_might.jpg http://[server]/10E/Avatar%20of%20Might.full.jpg -avatar_of_will.jpg http://[server]/PY/Avatar%20of%20Will.full.jpg -avatar_of_woe.jpg http://[server]/PY/Avatar%20of%20Woe.full.jpg -aven_archer.jpg http://[server]/OD/Aven%20Archer.full.jpg -aven_augur.jpg http://[server]/FUT/Aven%20Augur.full.jpg -aven_brigadier.jpg http://[server]/ON/Aven%20Brigadier.full.jpg -aven_cloudchaser.jpg http://[server]/10E/Aven%20Cloudchaser.full.jpg -aven_envoy.jpg http://[server]/LE/Aven%20Envoy.full.jpg -aven_farseer.jpg http://[server]/SC/Aven%20Farseer.full.jpg -aven_fateshaper.jpg http://[server]/ON/Aven%20Fateshaper.full.jpg -aven_fisher.jpg http://[server]/10E/Aven%20Fisher.full.jpg -aven_flock.jpg http://[server]/9E/Aven%20Flock.full.jpg -aven_fogbringer.jpg http://[server]/JU/Aven%20Fogbringer.full.jpg -aven_liberator.jpg http://[server]/SC/Aven%20Liberator.full.jpg -aven_mimeomancer.jpg http://[server]/ARB/Aven%20Mimeomancer.full.jpg -aven_mindcensor.jpg http://[server]/FUT/Aven%20Mindcensor.full.jpg -aven_redeemer.jpg http://[server]/LE/Aven%20Redeemer.full.jpg -aven_riftwatcher.jpg http://[server]/PLC/Aven%20Riftwatcher.full.jpg -aven_shrine.jpg http://[server]/OD/Aven%20Shrine.full.jpg -aven_smokeweaver.jpg http://[server]/OD/Aven%20Smokeweaver.full.jpg -aven_soulgazer.jpg http://[server]/ON/Aven%20Soulgazer.full.jpg -aven_squire.jpg http://[server]/CFX/Aven%20Squire.full.jpg -aven_trailblazer.jpg http://[server]/CFX/Aven%20Trailblazer.full.jpg -aven_trooper.jpg http://[server]/TO/Aven%20Trooper.full.jpg -aven_warcraft.jpg http://[server]/JU/Aven%20Warcraft.full.jpg -aven_warhawk.jpg http://[server]/LE/Aven%20Warhawk.full.jpg -aven_windreader.jpg http://[server]/10E/Aven%20Windreader.full.jpg -avenger_en_dal.jpg http://[server]/NE/Avenger%20en-Dal.full.jpg -avenging_angel.jpg http://[server]/TE/Avenging%20Angel.full.jpg -avenging_druid.jpg http://[server]/EX/Avenging%20Druid.full.jpg -avian_changeling.jpg http://[server]/LRW/Avian%20Changeling.full.jpg -avizoa.jpg http://[server]/WL/Avizoa.full.jpg -avoid_fate.jpg http://[server]/LG/Avoid%20Fate.full.jpg -awakener_druid.jpg http://[server]/M10/Awakener%20Druid.full.jpg -awakening.jpg http://[server]/SH/Awakening.full.jpg -awe_strike.jpg http://[server]/MR/Awe%20Strike.full.jpg -awesome_presence.jpg http://[server]/AL/Awesome%20Presence1.full.jpg -awol.jpg http://[server]/UNH/AWOL.full.jpg -axegrinder_giant.jpg http://[server]/LRW/Axegrinder%20Giant.full.jpg -axelrod_gunnarson.jpg http://[server]/LG/Axelrod%20Gunnarson.full.jpg -ayesha_tanaka.jpg http://[server]/LG/Ayesha%20Tanaka.full.jpg -aysen_abbey.jpg http://[server]/HL/Aysen%20Abbey.full.jpg -aysen_bureaucrats.jpg http://[server]/5E/Aysen%20Bureaucrats.full.jpg -aysen_crusader.jpg http://[server]/HL/Aysen%20Crusader.full.jpg -aysen_highway.jpg http://[server]/HL/Aysen%20Highway.full.jpg -ayumi_the_last_visitor.jpg http://[server]/SOK/Ayumi,%20the%20Last%20Visitor.full.jpg -azami_lady_of_scrolls.jpg http://[server]/CHK/Azami,%20Lady%20of%20Scrolls.full.jpg -azimaet_drake.jpg http://[server]/MI/Azimaet%20Drake.full.jpg -azorius_aethermage.jpg http://[server]/DIS/Azorius%20AEthermage.full.jpg -azorius_chancery.jpg http://[server]/DIS/Azorius%20Chancery.full.jpg -azorius_first_wing.jpg http://[server]/DIS/Azorius%20First-Wing.full.jpg -azorius_guildmage.jpg http://[server]/DIS/Azorius%20Guildmage.full.jpg -azorius_herald.jpg http://[server]/DIS/Azorius%20Herald.full.jpg -azorius_ploy.jpg http://[server]/DIS/Azorius%20Ploy.full.jpg -azorius_signet.jpg http://[server]/DIS/Azorius%20Signet.full.jpg -azure_drake.jpg http://[server]/9E/Azure%20Drake.full.jpg -azusa_lost_but_seeking.jpg http://[server]/CHK/Azusa,%20Lost%20but%20Seeking.full.jpg diff --git a/res/pics_link/card-pictures_b.txt b/res/pics_link/card-pictures_b.txt deleted file mode 100644 index 0802f2c9817..00000000000 --- a/res/pics_link/card-pictures_b.txt +++ /dev/null @@ -1,600 +0,0 @@ -b.f.m..jpg http://mtgpics.chutography.com/UG/B.F.M.%201.full.jpg -b_i_n_g_o.jpg http://[server]/UNH/B-I-N-G-O.full.jpg -back_to_basics.jpg http://[server]/US/Back%20to%20Basics.full.jpg -backdraft.jpg http://[server]/LG/Backdraft.full.jpg -backfire.jpg http://[server]/LG/Backfire.full.jpg -backlash.jpg http://[server]/IN/Backlash.full.jpg -backslide.jpg http://[server]/ON/Backslide.full.jpg -bad_ass.jpg http://[server]/UNH/Bad%20Ass.full.jpg -bad_moon.jpg http://[server]/5E/Bad%20Moon.full.jpg -bad_river.jpg http://[server]/MI/Bad%20River.full.jpg -badlands.jpg http://[server]/U/Badlands.full.jpg -bakis_curse.jpg http://[server]/HL/Baki's%20Curse.full.jpg -baku_altar.jpg http://[server]/BOK/Baku%20Altar.full.jpg -bala_ged_thief.jpg http://[server]/ZEN/Bala%20Ged%20Thief.full.jpg -balance.jpg http://[server]/4E/Balance.full.jpg -balance_of_power.jpg http://[server]/8E/Balance%20of%20Power.full.jpg -balancing_act.jpg http://[server]/OD/Balancing%20Act.full.jpg -balduvian_barbarians.jpg http://[server]/9E/Balduvian%20Barbarians.full.jpg -balduvian_bears.jpg http://[server]/IA/Balduvian%20Bears.full.jpg -balduvian_conjurer.jpg http://[server]/IA/Balduvian%20Conjurer.full.jpg -balduvian_dead.jpg http://[server]/AL/Balduvian%20Dead.full.jpg -balduvian_fallen.jpg http://[server]/CS/Balduvian%20Fallen.full.jpg -balduvian_frostwaker.jpg http://[server]/CS/Balduvian%20Frostwaker.full.jpg -balduvian_horde.jpg http://[server]/OV/Balduvian%20Horde.full.jpg -balduvian_hydra.jpg http://[server]/IA/Balduvian%20Hydra.full.jpg -balduvian_rage.jpg http://[server]/CS/Balduvian%20Rage.full.jpg -balduvian_shaman.jpg http://[server]/IA/Balduvian%20Shaman.full.jpg -balduvian_trading_post.jpg http://[server]/AL/Balduvian%20Trading%20Post.full.jpg -balduvian_war_makers.jpg http://[server]/AL/Balduvian%20War-Makers1.full.jpg -balduvian_warlord.jpg http://[server]/CS/Balduvian%20Warlord.full.jpg -balefire_liege.jpg http://[server]/EVE/Balefire%20Liege.full.jpg -baleful_stare.jpg http://[server]/9E/Baleful%20Stare.full.jpg -ball_lightning.jpg http://[server]/M10/Ball%20Lightning.full.jpg -ballista_squad.jpg http://[server]/10E/Ballista%20Squad.full.jpg -balloon_peddler.jpg http://[server]/MM/Balloon%20Peddler.full.jpg -ballynock_cohort.jpg http://[server]/SHM/Ballynock%20Cohort.full.jpg -ballynock_trapper.jpg http://[server]/EVE/Ballynock%20Trapper.full.jpg -ballyrush_banneret.jpg http://[server]/MOR/Ballyrush%20Banneret.full.jpg -balm_of_restoration.jpg http://[server]/FE/Balm%20of%20Restoration.full.jpg -baloth_cage_trap.jpg http://[server]/ZEN/Baloth%20Cage%20Trap.full.jpg -baloth_woodcrasher.jpg http://[server]/ZEN/Baloth%20Woodcrasher.full.jpg -balshan_beguiler.jpg http://[server]/OD/Balshan%20Beguiler.full.jpg -balshan_collaborator.jpg http://[server]/TO/Balshan%20Collaborator.full.jpg -balshan_griffin.jpg http://[server]/OD/Balshan%20Griffin.full.jpg -balthor_the_defiled.jpg http://[server]/JU/Balthor%20the%20Defiled.full.jpg -balthor_the_stout.jpg http://[server]/TO/Balthor%20the%20Stout.full.jpg -bamboozle.jpg http://[server]/OD/Bamboozle.full.jpg -bandage.jpg http://[server]/10E/Bandage.full.jpg -bane_of_the_living.jpg http://[server]/LE/Bane%20of%20the%20Living.full.jpg -banefire.jpg http://[server]/CFX/Banefire.full.jpg -baneslayer_angel.jpg http://[server]/M10/Baneslayer%20Angel.full.jpg -banewasp_affliction.jpg http://[server]/ALA/Banewasp%20Affliction.full.jpg -banishing_knack.jpg http://[server]/EVE/Banishing%20Knack.full.jpg -banshee.jpg http://[server]/CH/Banshee.full.jpg -banshees_blade.jpg http://[server]/MR/Banshee's%20Blade.full.jpg -bant_battlemage.jpg http://[server]/ALA/Bant%20Battlemage.full.jpg -bant_charm.jpg http://[server]/ALA/Bant%20Charm.full.jpg -bant_panorama.jpg http://[server]/ALA/Bant%20Panorama.full.jpg -bant_sojourners.jpg http://[server]/ARB/Bant%20Sojourners.full.jpg -bant_sureblade.jpg http://[server]/ARB/Bant%20Sureblade.full.jpg -barbarian_bully.jpg http://[server]/JU/Barbarian%20Bully.full.jpg -barbarian_general.jpg http://[server]/P3/Barbarian%20General.full.jpg -barbarian_guides.jpg http://[server]/IA/Barbarian%20Guides.full.jpg -barbarian_horde.jpg http://[server]/P3/Barbarian%20Horde.full.jpg -barbarian_lunatic.jpg http://[server]/OD/Barbarian%20Lunatic.full.jpg -barbarian_outcast.jpg http://[server]/TO/Barbarian%20Outcast.full.jpg -barbarian_riftcutter.jpg http://[server]/RAV/Barbarian%20Riftcutter.full.jpg -barbarian_ring.jpg http://[server]/OD/Barbarian%20Ring.full.jpg -barbary_apes.jpg http://[server]/LG/Barbary%20Apes.full.jpg -barbed_back_wurm.jpg http://[server]/MI/Barbed-Back%20Wurm.full.jpg -barbed_field.jpg http://[server]/PY/Barbed%20Field.full.jpg -barbed_foliage.jpg http://[server]/MI/Barbed%20Foliage.full.jpg -barbed_lightning.jpg http://[server]/DS/Barbed%20Lightning.full.jpg -barbed_sextant.jpg http://[server]/IA/Barbed%20Sextant.full.jpg -barbed_shocker.jpg http://[server]/TSP/Barbed%20Shocker.full.jpg -barbed_sliver.jpg http://[server]/TE/Barbed%20Sliver.full.jpg -barbed_wire.jpg http://[server]/MM/Barbed%20Wire.full.jpg -barbtooth_wurm.jpg http://[server]/ST/Barbtooth%20Wurm.full.jpg -bargain.jpg http://[server]/ST/Bargain.full.jpg -bargaining_table.jpg http://[server]/MM/Bargaining%20Table.full.jpg -barishi.jpg http://[server]/WL/Barishi.full.jpg -barkhide_mauler.jpg http://[server]/ON/Barkhide%20Mauler.full.jpg -barkshell_blessing.jpg http://[server]/SHM/Barkshell%20Blessing.full.jpg -barktooth_warbeard.jpg http://[server]/LG/Barktooth%20Warbeard.full.jpg -barls_cage.jpg http://[server]/DK/Barl's%20Cage.full.jpg -baron_sengir.jpg http://[server]/HL/Baron%20Sengir.full.jpg -barrel_down_sokenzan.jpg http://[server]/SOK/Barrel%20Down%20Sokenzan.full.jpg -barreling_attack.jpg http://[server]/MI/Barreling%20Attack.full.jpg -barren_glory.jpg http://[server]/FUT/Barren%20Glory.full.jpg -barren_moor.jpg http://[server]/ON/Barren%20Moor.full.jpg -barrenton_cragtreads.jpg http://[server]/SHM/Barrenton%20Cragtreads.full.jpg -barrenton_medic.jpg http://[server]/SHM/Barrenton%20Medic.full.jpg -barrin.jpg http://[server]/VG/Barrin.full.jpg -barrin_master_wizard.jpg http://[server]/US/Barrin,%20Master%20Wizard.full.jpg -barrins_codex.jpg http://[server]/US/Barrin's%20Codex.full.jpg -barrins_spite.jpg http://[server]/IN/Barrin's%20Spite.full.jpg -barrins_unmaking.jpg http://[server]/IN/Barrin's%20Unmaking.full.jpg -barrow_ghoul.jpg http://[server]/WL/Barrow%20Ghoul.full.jpg -bartel_runeaxe.jpg http://[server]/LG/Bartel%20Runeaxe.full.jpg -barter_in_blood.jpg http://[server]/MR/Barter%20in%20Blood.full.jpg -baru_fist_of_krosa.jpg http://[server]/FUT/Baru,%20Fist%20of%20Krosa.full.jpg -basal_sliver.jpg http://[server]/TSP/Basal%20Sliver.full.jpg -basal_thrull.jpg http://[server]/FE/Basal%20Thrull1.full.jpg -basalt_gargoyle.jpg http://[server]/TSP/Basalt%20Gargoyle.full.jpg -basalt_golem.jpg http://[server]/MI/Basalt%20Golem.full.jpg -basalt_monolith.jpg http://[server]/U/Basalt%20Monolith.full.jpg -bash_to_bits.jpg http://[server]/OD/Bash%20to%20Bits.full.jpg -basking_rootwalla.jpg http://[server]/TO/Basking%20Rootwalla.full.jpg -bathe_in_light.jpg http://[server]/RAV/Bathe%20in%20Light.full.jpg -baton_of_courage.jpg http://[server]/FD/Baton%20of%20Courage.full.jpg -baton_of_morale.jpg http://[server]/IA/Baton%20of%20Morale.full.jpg -battered_golem.jpg http://[server]/FD/Battered%20Golem.full.jpg -battering_craghorn.jpg http://[server]/ON/Battering%20Craghorn.full.jpg -battering_ram.jpg http://[server]/5E/Battering%20Ram.full.jpg -battering_sliver.jpg http://[server]/PLC/Battering%20Sliver.full.jpg -battering_wurm.jpg http://[server]/GP/Battering%20Wurm.full.jpg -battle_cry.jpg http://[server]/IA/Battle%20Cry.full.jpg -battle_frenzy.jpg http://[server]/IA/Battle%20Frenzy.full.jpg -battle_mad_ronin.jpg http://[server]/CHK/Battle-Mad%20Ronin.full.jpg -battle_mastery.jpg http://[server]/LRW/Battle%20Mastery.full.jpg -battle_of_wits.jpg http://[server]/OD/Battle%20of%20Wits.full.jpg -battle_rampart.jpg http://[server]/MM/Battle%20Rampart.full.jpg -battle_screech.jpg http://[server]/JU/Battle%20Screech.full.jpg -battle_squadron.jpg http://[server]/MM/Battle%20Squadron.full.jpg -battle_strain.jpg http://[server]/OD/Battle%20Strain.full.jpg -battlefield_forge.jpg http://[server]/10E/Battlefield%20Forge.full.jpg -battlefield_medic.jpg http://[server]/ON/Battlefield%20Medic.full.jpg -battlefield_percher.jpg http://[server]/NE/Battlefield%20Percher.full.jpg -battlefield_scrounger.jpg http://[server]/JU/Battlefield%20Scrounger.full.jpg -battlegate_mimic.jpg http://[server]/EVE/Battlegate%20Mimic.full.jpg -battlegrace_angel.jpg http://[server]/ALA/Battlegrace%20Angel.full.jpg -battlegrowth.jpg http://[server]/MR/Battlegrowth.full.jpg -battletide_alchemist.jpg http://[server]/MOR/Battletide%20Alchemist.full.jpg -battlewand_oak.jpg http://[server]/LRW/Battlewand%20Oak.full.jpg -battlewise_aven.jpg http://[server]/JU/Battlewise%20Aven.full.jpg -batwing_brume.jpg http://[server]/EVE/Batwing%20Brume.full.jpg -bay_falcon.jpg http://[server]/MI/Bay%20Falcon.full.jpg -bayou.jpg http://[server]/U/Bayou.full.jpg -bayou_dragonfly.jpg http://[server]/TE/Bayou%20Dragonfly.full.jpg -bazaar_of_baghdad.jpg http://[server]/AN/Bazaar%20of%20Baghdad.full.jpg -bazaar_of_wonders.jpg http://[server]/MI/Bazaar%20of%20Wonders.full.jpg -beacon_behemoth.jpg http://[server]/CFX/Beacon%20Behemoth.full.jpg -beacon_hawk.jpg http://[server]/DIS/Beacon%20Hawk.full.jpg -beacon_of_creation.jpg http://[server]/FD/Beacon%20of%20Creation.full.jpg -beacon_of_destiny.jpg http://[server]/LE/Beacon%20of%20Destiny.full.jpg -beacon_of_destruction.jpg http://[server]/10E/Beacon%20of%20Destruction.full.jpg -beacon_of_immortality.jpg http://[server]/10E/Beacon%20of%20Immortality.full.jpg -beacon_of_tomorrows.jpg http://[server]/FD/Beacon%20of%20Tomorrows.full.jpg -beacon_of_unrest.jpg http://[server]/10E/Beacon%20of%20Unrest.full.jpg -bear_cub.jpg http://[server]/P2/Bear%20Cub.full.jpg -bearscape.jpg http://[server]/OD/Bearscape.full.jpg -beast_attack.jpg http://[server]/OD/Beast%20Attack.full.jpg -beast_hunt.jpg http://[server]/HOP/Beast%20Hunt.full.jpg -beast_of_burden.jpg http://[server]/9E/Beast%20of%20Burden.full.jpg -beast_walkers.jpg http://[server]/HL/Beast%20Walkers.full.jpg -beastmaster_ascension.jpg http://[server]/ZEN/Beastmaster%20Ascension.full.jpg -beastmasters_magemark.jpg http://[server]/GP/Beastmaster's%20Magemark.full.jpg -beasts_of_bogardan.jpg http://[server]/LG/Beasts%20of%20Bogardan.full.jpg -beckon_apparition.jpg http://[server]/EVE/Beckon%20Apparition.full.jpg -bedlam.jpg http://[server]/7E/Bedlam.full.jpg -bee_sting.jpg http://[server]/PT/Bee%20Sting.full.jpg -befoul.jpg http://[server]/7E/Befoul.full.jpg -behemoth_sledge.jpg http://[server]/ARB/Behemoth%20Sledge.full.jpg -behemoths_herald.jpg http://[server]/ALA/Behemoth's%20Herald.full.jpg -belbes_armor.jpg http://[server]/NE/Belbe's%20Armor.full.jpg -belbes_percher.jpg http://[server]/NE/Belbe's%20Percher.full.jpg -belbes_portal.jpg http://[server]/NE/Belbe's%20Portal.full.jpg -belfry_spirit.jpg http://[server]/GP/Belfry%20Spirit.full.jpg -belligerent_hatchling.jpg http://[server]/EVE/Belligerent%20Hatchling.full.jpg -bellowing_fiend.jpg http://[server]/7E/Bellowing%20Fiend.full.jpg -belltower_sphinx.jpg http://[server]/RAV/Belltower%20Sphinx.full.jpg -beloved_chaplain.jpg http://[server]/OD/Beloved%20Chaplain.full.jpg -ben_ben_akki_hermit.jpg http://[server]/CHK/Ben-Ben,%20Akki%20Hermit.full.jpg -benalish_cavalry.jpg http://[server]/TSP/Benalish%20Cavalry.full.jpg -benalish_commander.jpg http://[server]/PLC/Benalish%20Commander.full.jpg -benalish_emissary.jpg http://[server]/IN/Benalish%20Emissary.full.jpg -benalish_heralds.jpg http://[server]/IN/Benalish%20Heralds.full.jpg -benalish_hero.jpg http://[server]/5E/Benalish%20Hero.full.jpg -benalish_infantry.jpg http://[server]/WL/Benalish%20Infantry.full.jpg -benalish_knight.jpg http://[server]/10E/Benalish%20Knight.full.jpg -benalish_lancer.jpg http://[server]/IN/Benalish%20Lancer.full.jpg -benalish_missionary.jpg http://[server]/WL/Benalish%20Missionary.full.jpg -benalish_trapper.jpg http://[server]/IN/Benalish%20Trapper.full.jpg -bend_or_break.jpg http://[server]/IN/Bend%20or%20Break.full.jpg -benediction_of_moons.jpg http://[server]/GP/Benediction%20of%20Moons.full.jpg -benevolent_ancestor.jpg http://[server]/RAV/Benevolent%20Ancestor.full.jpg -benevolent_bodyguard.jpg http://[server]/JU/Benevolent%20Bodyguard.full.jpg -benevolent_unicorn.jpg http://[server]/MI/Benevolent%20Unicorn.full.jpg -benthic_behemoth.jpg http://[server]/7E/Benthic%20Behemoth.full.jpg -benthic_djinn.jpg http://[server]/MI/Benthic%20Djinn.full.jpg -benthic_explorers.jpg http://[server]/AL/Benthic%20Explorers1.full.jpg -benthicore.jpg http://[server]/LRW/Benthicore.full.jpg -bequeathal.jpg http://[server]/EX/Bequeathal.full.jpg -bereavement.jpg http://[server]/7E/Bereavement.full.jpg -berserk.jpg http://[server]/U/Berserk.full.jpg -berserk_murlodont.jpg http://[server]/LE/Berserk%20Murlodont.full.jpg -berserkers_of_blood_ridge.jpg http://[server]/M10/Berserkers%20of%20Blood%20Ridge.full.jpg -beseech_the_queen.jpg http://[server]/SHM/Beseech%20the%20Queen.full.jpg -bestial_fury.jpg http://[server]/AL/Bestial%20Fury1.full.jpg -betrayal.jpg http://[server]/VI/Betrayal.full.jpg -betrayal_of_flesh.jpg http://[server]/MR/Betrayal%20of%20Flesh.full.jpg -betrothed_of_fire.jpg http://[server]/WL/Betrothed%20of%20Fire.full.jpg -bewilder.jpg http://[server]/TSP/Bewilder.full.jpg -bifurcate.jpg http://[server]/MM/Bifurcate.full.jpg -big_game_hunter.jpg http://[server]/PLC/Big%20Game%20Hunter.full.jpg -bile_urchin.jpg http://[server]/BOK/Bile%20Urchin.full.jpg -bind.jpg http://[server]/IN/Bind.full.jpg -binding_agony.jpg http://[server]/MI/Binding%20Agony.full.jpg -binding_grasp.jpg http://[server]/IA/Binding%20Grasp.full.jpg -biomantic_mastery.jpg http://[server]/DIS/Biomantic%20Mastery.full.jpg -bioplasm.jpg http://[server]/GP/Bioplasm.full.jpg -biorhythm.jpg http://[server]/9E/Biorhythm.full.jpg -birchlore_rangers.jpg http://[server]/ON/Birchlore%20Rangers.full.jpg -bird_maiden.jpg http://[server]/5E/Bird%20Maiden.full.jpg -birds_of_paradise.jpg http://[server]/M10/Birds%20of%20Paradise.full.jpg -biting_tether.jpg http://[server]/SHM/Biting%20Tether.full.jpg -bitter_ordeal.jpg http://[server]/FUT/Bitter%20Ordeal.full.jpg -bitterblossom.jpg http://[server]/MOR/Bitterblossom.full.jpg -bituminous_blast.jpg http://[server]/ARB/Bituminous%20Blast.full.jpg -black_carriage.jpg http://[server]/HL/Black%20Carriage.full.jpg -black_knight.jpg http://[server]/M10/Black%20Knight.full.jpg -black_lotus.jpg http://[server]/U/Black%20Lotus.full.jpg -black_mana_battery.jpg http://[server]/LG/Black%20Mana%20Battery.full.jpg -black_market.jpg http://[server]/MM/Black%20Market.full.jpg -black_poplar_shaman.jpg http://[server]/LRW/Black%20Poplar%20Shaman.full.jpg -black_scarab.jpg http://[server]/IA/Black%20Scarab.full.jpg -black_vise.jpg http://[server]/4E/Black%20Vise.full.jpg -black_ward.jpg http://[server]/4E/Black%20Ward.full.jpg -blacker_lotus.jpg http://[server]/OV/Blacker%20Lotus.full.jpg -blackmail.jpg http://[server]/9E/Blackmail.full.jpg -blade_of_the_bloodchief.jpg http://[server]/ZEN/Blade%20of%20the%20Bloodchief.full.jpg -blade_of_the_sixth_pride.jpg http://[server]/FUT/Blade%20of%20the%20Sixth%20Pride.full.jpg -blade_sliver.jpg http://[server]/LE/Blade%20Sliver.full.jpg -blademane_baku.jpg http://[server]/BOK/Blademane%20Baku.full.jpg -blades_of_velis_vel.jpg http://[server]/LRW/Blades%20of%20Velis%20Vel.full.jpg -bladetusk_boar.jpg http://[server]/ZEN/Bladetusk%20Boar.full.jpg -bladewing_the_risen.jpg http://[server]/SC/Bladewing%20the%20Risen.full.jpg -bladewings_thrall.jpg http://[server]/SC/Bladewing's%20Thrall.full.jpg -blanchwood_armor.jpg http://[server]/10E/Blanchwood%20Armor.full.jpg -blanchwood_treefolk.jpg http://[server]/US/Blanchwood%20Treefolk.full.jpg -blanket_of_night.jpg http://[server]/VI/Blanket%20of%20Night.full.jpg -blast_from_the_past.jpg http://[server]/UNH/Blast%20from%20the%20Past.full.jpg -blasted_landscape.jpg http://[server]/US/Blasted%20Landscape.full.jpg -blaster_mage.jpg http://[server]/MM/Blaster%20Mage.full.jpg -blasting_station.jpg http://[server]/FD/Blasting%20Station.full.jpg -blastoderm.jpg http://[server]/NE/Blastoderm.full.jpg -blatant_thievery.jpg http://[server]/ON/Blatant%20Thievery.full.jpg -blaze.jpg http://[server]/10E/Blaze.full.jpg -blaze_of_glory.jpg http://[server]/U/Blaze%20of%20Glory.full.jpg -blazethorn_scarecrow.jpg http://[server]/SHM/Blazethorn%20Scarecrow.full.jpg -blazing_archon.jpg http://[server]/RAV/Blazing%20Archon.full.jpg -blazing_blade_askari.jpg http://[server]/TSP/Blazing%20Blade%20Askari.full.jpg -blazing_effigy.jpg http://[server]/LG/Blazing%20Effigy.full.jpg -blazing_salvo.jpg http://[server]/OD/Blazing%20Salvo.full.jpg -blazing_shoal.jpg http://[server]/BOK/Blazing%20Shoal.full.jpg -blazing_specter.jpg http://[server]/IN/Blazing%20Specter.full.jpg -blazing_torch.jpg http://[server]/ZEN/Blazing%20Torch.full.jpg -blessed_breath.jpg http://[server]/CHK/Blessed%20Breath.full.jpg -blessed_orator.jpg http://[server]/9E/Blessed%20Orator.full.jpg -blessed_reversal.jpg http://[server]/8E/Blessed%20Reversal.full.jpg -blessed_wind.jpg http://[server]/PY/Blessed%20Wind.full.jpg -blessed_wine.jpg http://[server]/IA/Blessed%20Wine.full.jpg -blessing.jpg http://[server]/4E/Blessing.full.jpg -blessing_of_leeches.jpg http://[server]/BOK/Blessing%20of%20Leeches.full.jpg -blessing_of_the_nephilim.jpg http://[server]/DIS/Blessing%20of%20the%20Nephilim.full.jpg -blight.jpg http://[server]/6E/Blight.full.jpg -blight_sickle.jpg http://[server]/SHM/Blight%20Sickle.full.jpg -blighted_shaman.jpg http://[server]/MI/Blighted%20Shaman.full.jpg -blightning.jpg http://[server]/ALA/Blightning.full.jpg -blightsoil_druid.jpg http://[server]/MOR/Blightsoil%20Druid.full.jpg -blightspeaker.jpg http://[server]/PLC/Blightspeaker.full.jpg -blind_creeper.jpg http://[server]/FD/Blind%20Creeper.full.jpg -blind_fury.jpg http://[server]/MI/Blind%20Fury.full.jpg -blind_hunter.jpg http://[server]/GP/Blind%20Hunter.full.jpg -blind_phantasm.jpg http://[server]/FUT/Blind%20Phantasm.full.jpg -blind_seer.jpg http://[server]/IN/Blind%20Seer.full.jpg -blind_spot_giant.jpg http://[server]/LRW/Blind-Spot%20Giant.full.jpg -blind_with_anger.jpg http://[server]/CHK/Blind%20with%20Anger.full.jpg -blinding_angel.jpg http://[server]/9E/Blinding%20Angel.full.jpg -blinding_beam.jpg http://[server]/MR/Blinding%20Beam.full.jpg -blinding_light.jpg http://[server]/IN/Blinding%20Light.full.jpg -blinding_mage.jpg http://[server]/M10/Blinding%20Mage.full.jpg -blinding_powder.jpg http://[server]/BOK/Blinding%20Powder.full.jpg -blinking_spirit.jpg http://[server]/9E/Blinking%20Spirit.full.jpg -blinkmoth_infusion.jpg http://[server]/FD/Blinkmoth%20Infusion.full.jpg -blinkmoth_nexus.jpg http://[server]/DS/Blinkmoth%20Nexus.full.jpg -blinkmoth_urn.jpg http://[server]/MR/Blinkmoth%20Urn.full.jpg -blinkmoth_well.jpg http://[server]/MR/Blinkmoth%20Well.full.jpg -blister_beetle.jpg http://[server]/ALA/Blister%20Beetle.full.jpg -blistering_barrier.jpg http://[server]/MI/Blistering%20Barrier.full.jpg -blistering_dieflyn.jpg http://[server]/SHM/Blistering%20Dieflyn.full.jpg -blistering_firecat.jpg http://[server]/ON/Blistering%20Firecat.full.jpg -blitz_hellion.jpg http://[server]/ARB/Blitz%20Hellion.full.jpg -blizzard.jpg http://[server]/IA/Blizzard.full.jpg -blizzard_elemental.jpg http://[server]/BD/Blizzard%20Elemental.full.jpg -blizzard_specter.jpg http://[server]/CS/Blizzard%20Specter.full.jpg -bloated_toad.jpg http://[server]/UL/Bloated%20Toad.full.jpg -blockade_runner.jpg http://[server]/MM/Blockade%20Runner.full.jpg -blockbuster.jpg http://[server]/RAV/Blockbuster.full.jpg -blood_celebrant.jpg http://[server]/LE/Blood%20Celebrant.full.jpg -blood_clock.jpg http://[server]/SOK/Blood%20Clock.full.jpg -blood_crypt.jpg http://[server]/DIS/Blood%20Crypt.full.jpg -blood_cultist.jpg http://[server]/ALA/Blood%20Cultist.full.jpg -blood_frenzy.jpg http://[server]/TE/Blood%20Frenzy.full.jpg -blood_funnel.jpg http://[server]/RAV/Blood%20Funnel.full.jpg -blood_hound.jpg http://[server]/MM/Blood%20Hound.full.jpg -blood_knight.jpg http://[server]/PLC/Blood%20Knight.full.jpg -blood_lust.jpg http://[server]/5E/Blood%20Lust.full.jpg -blood_moon.jpg http://[server]/9E/Blood%20Moon.full.jpg -blood_oath.jpg http://[server]/MM/Blood%20Oath.full.jpg -blood_of_the_martyr.jpg http://[server]/DK/Blood%20of%20the%20Martyr.full.jpg -blood_pet.jpg http://[server]/7E/Blood%20Pet.full.jpg -blood_rites.jpg http://[server]/CHK/Blood%20Rites.full.jpg -blood_seeker.jpg http://[server]/ZEN/Blood%20Seeker.full.jpg -blood_speaker.jpg http://[server]/CHK/Blood%20Speaker.full.jpg -blood_tribute.jpg http://[server]/ZEN/Blood%20Tribute.full.jpg -blood_tyrant.jpg http://[server]/CFX/Blood%20Tyrant.full.jpg -blood_vassal.jpg http://[server]/US/Blood%20Vassal.full.jpg -bloodbond_march.jpg http://[server]/RAV/Bloodbond%20March.full.jpg -bloodbraid_elf.jpg http://[server]/ARB/Bloodbraid%20Elf.full.jpg -bloodchief_ascension.jpg http://[server]/ZEN/Bloodchief%20Ascension.full.jpg -bloodcurdler.jpg http://[server]/OD/Bloodcurdler.full.jpg -bloodcurdling_scream.jpg http://[server]/P2/Bloodcurdling%20Scream.full.jpg -bloodfire_colossus.jpg http://[server]/10E/Bloodfire%20Colossus.full.jpg -bloodfire_dwarf.jpg http://[server]/AP/Bloodfire%20Dwarf.full.jpg -bloodfire_infusion.jpg http://[server]/AP/Bloodfire%20Infusion.full.jpg -bloodfire_kavu.jpg http://[server]/AP/Bloodfire%20Kavu.full.jpg -bloodghast.jpg http://[server]/ZEN/Bloodghast.full.jpg -bloodhall_ooze.jpg http://[server]/CFX/Bloodhall%20Ooze.full.jpg -bloodied_ghost.jpg http://[server]/EVE/Bloodied%20Ghost.full.jpg -bloodletter.jpg http://[server]/UNH/Bloodletter.full.jpg -bloodletter_quill.jpg http://[server]/RAV/Bloodletter%20Quill.full.jpg -bloodline_shaman.jpg http://[server]/ON/Bloodline%20Shaman.full.jpg -bloodmark_mentor.jpg http://[server]/SHM/Bloodmark%20Mentor.full.jpg -bloodpyre_elemental.jpg http://[server]/ALA/Bloodpyre%20Elemental.full.jpg -bloodrock_cyclops.jpg http://[server]/10E/Bloodrock%20Cyclops.full.jpg -bloodscale_prowler.jpg http://[server]/GP/Bloodscale%20Prowler.full.jpg -bloodscent.jpg http://[server]/MR/Bloodscent.full.jpg -bloodshed_fever.jpg http://[server]/SHM/Bloodshed%20Fever.full.jpg -bloodshot_cyclops.jpg http://[server]/8E/Bloodshot%20Cyclops.full.jpg -bloodshot_trainee.jpg http://[server]/FUT/Bloodshot%20Trainee.full.jpg -bloodstained_mire.jpg http://[server]/ON/Bloodstained%20Mire.full.jpg -bloodstoke_howler.jpg http://[server]/LE/Bloodstoke%20Howler.full.jpg -bloodstone_cameo.jpg http://[server]/IN/Bloodstone%20Cameo.full.jpg -bloodthirsty_ogre.jpg http://[server]/CHK/Bloodthirsty%20Ogre.full.jpg -bloodthorn_taunter.jpg http://[server]/ALA/Bloodthorn%20Taunter.full.jpg -bloom_tender.jpg http://[server]/EVE/Bloom%20Tender.full.jpg -blossoming_wreath.jpg http://[server]/WL/Blossoming%20Wreath.full.jpg -blowfly_infestation.jpg http://[server]/SHM/Blowfly%20Infestation.full.jpg -blue_elemental_blast.jpg http://[server]/4E/Blue%20Elemental%20Blast.full.jpg -blue_mana_battery.jpg http://[server]/LG/Blue%20Mana%20Battery.full.jpg -blue_scarab.jpg http://[server]/IA/Blue%20Scarab.full.jpg -blue_ward.jpg http://[server]/4E/Blue%20Ward.full.jpg -blurred_mongoose.jpg http://[server]/IN/Blurred%20Mongoose.full.jpg -boa_constrictor.jpg http://[server]/MM/Boa%20Constrictor.full.jpg -boartusk_liege.jpg http://[server]/SHM/Boartusk%20Liege.full.jpg -body_double.jpg http://[server]/PLC/Body%20Double.full.jpg -body_of_jukai.jpg http://[server]/BOK/Body%20of%20Jukai.full.jpg -body_snatcher.jpg http://[server]/UD/Body%20Snatcher.full.jpg -bog_down.jpg http://[server]/PS/Bog%20Down.full.jpg -bog_elemental.jpg http://[server]/PY/Bog%20Elemental.full.jpg -bog_glider.jpg http://[server]/PY/Bog%20Glider.full.jpg -bog_gnarr.jpg http://[server]/AP/Bog%20Gnarr.full.jpg -bog_hoodlums.jpg http://[server]/LRW/Bog%20Hoodlums.full.jpg -bog_imp.jpg http://[server]/9E/Bog%20Imp.full.jpg -bog_initiate.jpg http://[server]/IN/Bog%20Initiate.full.jpg -bog_raiders.jpg http://[server]/ST/Bog%20Raiders.full.jpg -bog_rats.jpg http://[server]/6E/Bog%20Rats.full.jpg -bog_serpent.jpg http://[server]/PLC/Bog%20Serpent.full.jpg -bog_smugglers.jpg http://[server]/MM/Bog%20Smugglers.full.jpg -bog_strider_ash.jpg http://[server]/LRW/Bog-Strider%20Ash.full.jpg -bog_tatters.jpg http://[server]/ZEN/Bog%20Tatters.full.jpg -bog_witch.jpg http://[server]/MM/Bog%20Witch.full.jpg -bog_wraith.jpg http://[server]/M10/Bog%20Wraith.full.jpg -bog_wreckage.jpg http://[server]/OD/Bog%20Wreckage.full.jpg -bogardan_firefiend.jpg http://[server]/10E/Bogardan%20Firefiend.full.jpg -bogardan_hellkite.jpg http://[server]/M10/Bogardan%20Hellkite.full.jpg -bogardan_lancer.jpg http://[server]/FUT/Bogardan%20Lancer.full.jpg -bogardan_phoenix.jpg http://[server]/VI/Bogardan%20Phoenix.full.jpg -bogardan_rager.jpg http://[server]/TSP/Bogardan%20Rager.full.jpg -boggart_arsonists.jpg http://[server]/SHM/Boggart%20Arsonists.full.jpg -boggart_birth_rite.jpg http://[server]/LRW/Boggart%20Birth%20Rite.full.jpg -boggart_forager.jpg http://[server]/LRW/Boggart%20Forager.full.jpg -boggart_harbinger.jpg http://[server]/LRW/Boggart%20Harbinger.full.jpg -boggart_loggers.jpg http://[server]/LRW/Boggart%20Loggers.full.jpg -boggart_mob.jpg http://[server]/LRW/Boggart%20Mob.full.jpg -boggart_ram_gang.jpg http://[server]/SHM/Boggart%20Ram-Gang.full.jpg -boggart_shenanigans.jpg http://[server]/EVG/Boggart%20Shenanigans.full.jpg -boggart_sprite_chaser.jpg http://[server]/LRW/Boggart%20Sprite-Chaser.full.jpg -boil.jpg http://[server]/8E/Boil.full.jpg -boiling_blood.jpg http://[server]/WL/Boiling%20Blood.full.jpg -boiling_seas.jpg http://[server]/9E/Boiling%20Seas.full.jpg -bola_warrior.jpg http://[server]/NE/Bola%20Warrior.full.jpg -bold_defense.jpg http://[server]/ZEN/Bold%20Defense.full.jpg -boldwyr_heavyweights.jpg http://[server]/MOR/Boldwyr%20Heavyweights.full.jpg -boldwyr_intimidator.jpg http://[server]/FUT/Boldwyr%20Intimidator.full.jpg -bomb_squad.jpg http://[server]/OD/Bomb%20Squad.full.jpg -bond_of_agony.jpg http://[server]/DIS/Bond%20of%20Agony.full.jpg -bonded_fetch.jpg http://[server]/FUT/Bonded%20Fetch.full.jpg -bone_dancer.jpg http://[server]/WL/Bone%20Dancer.full.jpg -bone_flute.jpg http://[server]/DK/Bone%20Flute.full.jpg -bone_harvest.jpg http://[server]/MI/Bone%20Harvest.full.jpg -bone_mask.jpg http://[server]/MI/Bone%20Mask.full.jpg -bone_saw.jpg http://[server]/CFX/Bone%20Saw.full.jpg -bone_shaman.jpg http://[server]/IA/Bone%20Shaman.full.jpg -bone_shredder.jpg http://[server]/UL/Bone%20Shredder.full.jpg -bone_splinters.jpg http://[server]/ALA/Bone%20Splinters.full.jpg -boneknitter.jpg http://[server]/ON/Boneknitter.full.jpg -boneshard_slasher.jpg http://[server]/TO/Boneshard%20Slasher.full.jpg -bonesplitter.jpg http://[server]/MR/Bonesplitter.full.jpg -bonesplitter_sliver.jpg http://[server]/TSP/Bonesplitter%20Sliver.full.jpg -bonethorn_valesk.jpg http://[server]/SC/Bonethorn%20Valesk.full.jpg -booby_trap.jpg http://[server]/9E/Booby%20Trap.full.jpg -book_burning.jpg http://[server]/JU/Book%20Burning.full.jpg -book_of_rass.jpg http://[server]/CH/Book%20of%20Rass.full.jpg -boombust.jpg http://[server]/PLC/BoomBust.full.jpg -boomerang.jpg http://[server]/10E/Boomerang.full.jpg -boon_reflection.jpg http://[server]/SHM/Boon%20Reflection.full.jpg -booster_tutor.jpg http://[server]/UNH/Booster%20Tutor.full.jpg -borborygmos.jpg http://[server]/GP/Borborygmos.full.jpg -border_guard.jpg http://[server]/PT/Border%20Guard.full.jpg -border_patrol.jpg http://[server]/JU/Border%20Patrol.full.jpg -borderland_behemoth.jpg http://[server]/MOR/Borderland%20Behemoth.full.jpg -borderland_ranger.jpg http://[server]/M10/Borderland%20Ranger.full.jpg -boreal_centaur.jpg http://[server]/CS/Boreal%20Centaur.full.jpg -boreal_druid.jpg http://[server]/CS/Boreal%20Druid.full.jpg -boreal_griffin.jpg http://[server]/CS/Boreal%20Griffin.full.jpg -boreal_shelf.jpg http://[server]/CS/Boreal%20Shelf.full.jpg -boris_devilboon.jpg http://[server]/LG/Boris%20Devilboon.full.jpg -boros_fury_shield.jpg http://[server]/RAV/Boros%20Fury-Shield.full.jpg -boros_garrison.jpg http://[server]/HOP/Boros%20Garrison.full.jpg -boros_guildmage.jpg http://[server]/HOP/Boros%20Guildmage.full.jpg -boros_recruit.jpg http://[server]/RAV/Boros%20Recruit.full.jpg -boros_signet.jpg http://[server]/HOP/Boros%20Signet.full.jpg -boros_swiftblade.jpg http://[server]/HOP/Boros%20Swiftblade.full.jpg -borrowing_100000_arrows.jpg http://[server]/P3/Borrowing%20100,000%20Arrows.full.jpg -borrowing_the_east_wind.jpg http://[server]/P3/Borrowing%20the%20East%20Wind.full.jpg -boseiju_who_shelters_all.jpg http://[server]/CHK/Boseiju,%20Who%20Shelters%20All.full.jpg -bosh_iron_golem.jpg http://[server]/MR/Bosh,%20Iron%20Golem.full.jpg -bosium_strip.jpg http://[server]/WL/Bosium%20Strip.full.jpg -bosk_banneret.jpg http://[server]/MOR/Bosk%20Banneret.full.jpg -bosom_buddy.jpg http://[server]/UNH/Bosom%20Buddy.full.jpg -bottle_gnomes.jpg http://[server]/10E/Bottle%20Gnomes.full.jpg -bottle_of_suleiman.jpg http://[server]/6E/Bottle%20of%20Suleiman.full.jpg -bottled_cloister.jpg http://[server]/RAV/Bottled%20Cloister.full.jpg -bottomless_pit.jpg http://[server]/SH/Bottomless%20Pit.full.jpg -bottomless_vault.jpg http://[server]/FE/Bottomless%20Vault.full.jpg -bouncing_beebles.jpg http://[server]/UL/Bouncing%20Beebles.full.jpg -bound_in_silence.jpg http://[server]/FUT/Bound%20in%20Silence.full.jpg -bounddetermined.jpg http://[server]/DIS/BoundDetermined.full.jpg -bounteous_kirin.jpg http://[server]/SOK/Bounteous%20Kirin.full.jpg -bountiful_harvest.jpg http://[server]/M10/Bountiful%20Harvest.full.jpg -bounty_hunter.jpg http://[server]/TE/Bounty%20Hunter.full.jpg -bounty_of_the_hunt.jpg http://[server]/AL/Bounty%20of%20the%20Hunt.full.jpg -brace_for_impact.jpg http://[server]/DIS/Brace%20for%20Impact.full.jpg -brackwater_elemental.jpg http://[server]/CFX/Brackwater%20Elemental.full.jpg -braid_of_fire.jpg http://[server]/CS/Braid%20of%20Fire.full.jpg -braids_cabal_minion.jpg http://[server]/OD/Braids,%20Cabal%20Minion.full.jpg -braids_conjurer_adept.jpg http://[server]/PLC/Braids,%20Conjurer%20Adept.full.jpg -braidwood_cup.jpg http://[server]/UD/Braidwood%20Cup.full.jpg -braidwood_sextant.jpg http://[server]/UD/Braidwood%20Sextant.full.jpg -brain_freeze.jpg http://[server]/SC/Brain%20Freeze.full.jpg -brain_gorgers.jpg http://[server]/PLC/Brain%20Gorgers.full.jpg -brain_pry.jpg http://[server]/DIS/Brain%20Pry.full.jpg -brainbite.jpg http://[server]/ARB/Brainbite.full.jpg -braingeyser.jpg http://[server]/U/Braingeyser.full.jpg -brainspoil.jpg http://[server]/RAV/Brainspoil.full.jpg -brainstorm.jpg http://[server]/MM/Brainstorm.full.jpg -brainwash.jpg http://[server]/DK/Brainwash.full.jpg -bramble_creeper.jpg http://[server]/M10/Bramble%20Creeper.full.jpg -bramble_elemental.jpg http://[server]/RAV/Bramble%20Elemental.full.jpg -bramblewood_paragon.jpg http://[server]/MOR/Bramblewood%20Paragon.full.jpg -branching_bolt.jpg http://[server]/HOP/Branching%20Bolt.full.jpg -branchsnap_lorian.jpg http://[server]/LE/Branchsnap%20Lorian.full.jpg -brand.jpg http://[server]/US/Brand.full.jpg -brand_of_ill_omen.jpg http://[server]/IA/Brand%20of%20Ill%20Omen.full.jpg -branded_brawlers.jpg http://[server]/PY/Branded%20Brawlers.full.jpg -brass_gnat.jpg http://[server]/TSP/Brass%20Gnat.full.jpg -brass_herald.jpg http://[server]/8E/Brass%20Herald.full.jpg -brass_man.jpg http://[server]/AN/Brass%20Man.full.jpg -brass_secretary.jpg http://[server]/UD/Brass%20Secretary.full.jpg -brass_talon_chimera.jpg http://[server]/VI/Brass-Talon%20Chimera.full.jpg -brassclaw_orcs.jpg http://[server]/5E/Brassclaw%20Orcs.full.jpg -bravado.jpg http://[server]/US/Bravado.full.jpg -brave_the_elements.jpg http://[server]/ZEN/Brave%20the%20Elements.full.jpg -brawl.jpg http://[server]/MM/Brawl.full.jpg -brawn.jpg http://[server]/JU/Brawn.full.jpg -breach.jpg http://[server]/US/Breach.full.jpg -break_asunder.jpg http://[server]/SC/Break%20Asunder.full.jpg -break_open.jpg http://[server]/ON/Break%20Open.full.jpg -breaking_point.jpg http://[server]/JU/Breaking%20Point.full.jpg -breaking_wave.jpg http://[server]/IN/Breaking%20Wave.full.jpg -breakthrough.jpg http://[server]/TO/Breakthrough.full.jpg -breath_of_darigaaz.jpg http://[server]/IN/Breath%20of%20Darigaaz.full.jpg -breath_of_dreams.jpg http://[server]/IA/Breath%20of%20Dreams.full.jpg -breath_of_fury.jpg http://[server]/RAV/Breath%20of%20Fury.full.jpg -breath_of_life.jpg http://[server]/7E/Breath%20of%20Life.full.jpg -breath_of_malfegor.jpg http://[server]/ARB/Breath%20of%20Malfegor.full.jpg -breathstealer.jpg http://[server]/MI/Breathstealer.full.jpg -breathstealers_crypt.jpg http://[server]/VI/Breathstealer's%20Crypt.full.jpg -breeding_pit.jpg http://[server]/5E/Breeding%20Pit.full.jpg -breeding_pool.jpg http://[server]/DIS/Breeding%20Pool.full.jpg -breezekeeper.jpg http://[server]/VI/Breezekeeper.full.jpg -briar_patch.jpg http://[server]/MM/Briar%20Patch.full.jpg -briar_shield.jpg http://[server]/WL/Briar%20Shield.full.jpg -briarberry_cohort.jpg http://[server]/SHM/Briarberry%20Cohort.full.jpg -briarhorn.jpg http://[server]/HOP/Briarhorn.full.jpg -briarknit_kami.jpg http://[server]/SOK/Briarknit%20Kami.full.jpg -bribery.jpg http://[server]/8E/Bribery.full.jpg -bridge_from_below.jpg http://[server]/FUT/Bridge%20from%20Below.full.jpg -brightflame.jpg http://[server]/RAV/Brightflame.full.jpg -brighthearth_banneret.jpg http://[server]/MOR/Brighthearth%20Banneret.full.jpg -brightstone_ritual.jpg http://[server]/ON/Brightstone%20Ritual.full.jpg -brigid_hero_of_kinsbaile.jpg http://[server]/LRW/Brigid,%20Hero%20of%20Kinsbaile.full.jpg -brilliant_halo.jpg http://[server]/US/Brilliant%20Halo.full.jpg -brilliant_plan.jpg http://[server]/P3/Brilliant%20Plan.full.jpg -brilliant_ultimatum.jpg http://[server]/ALA/Brilliant%20Ultimatum.full.jpg -brimstone_dragon.jpg http://[server]/P2/Brimstone%20Dragon.full.jpg -brine_elemental.jpg http://[server]/TSP/Brine%20Elemental.full.jpg -brine_hag.jpg http://[server]/LG/Brine%20Hag.full.jpg -brine_seer.jpg http://[server]/UD/Brine%20Seer.full.jpg -brine_shaman.jpg http://[server]/IA/Brine%20Shaman.full.jpg -bringer_of_the_black_dawn.jpg http://[server]/FD/Bringer%20of%20the%20Black%20Dawn.full.jpg -bringer_of_the_blue_dawn.jpg http://[server]/FD/Bringer%20of%20the%20Blue%20Dawn.full.jpg -bringer_of_the_green_dawn.jpg http://[server]/FD/Bringer%20of%20the%20Green%20Dawn.full.jpg -bringer_of_the_red_dawn.jpg http://[server]/FD/Bringer%20of%20the%20Red%20Dawn.full.jpg -bringer_of_the_white_dawn.jpg http://[server]/FD/Bringer%20of%20the%20White%20Dawn.full.jpg -brink_of_madness.jpg http://[server]/UL/Brink%20of%20Madness.full.jpg -brion_stoutarm.jpg http://[server]/LRW/Brion%20Stoutarm.full.jpg -broken_ambitions.jpg http://[server]/LRW/Broken%20Ambitions.full.jpg -broken_dam.jpg http://[server]/P3/Broken%20Dam.full.jpg -broken_fall.jpg http://[server]/TE/Broken%20Fall.full.jpg -broken_visage.jpg http://[server]/HL/Broken%20Visage.full.jpg -brontotherium.jpg http://[server]/LE/Brontotherium.full.jpg -bronze_bombshell.jpg http://[server]/DIS/Bronze%20Bombshell.full.jpg -bronze_calendar.jpg http://[server]/UG/Bronze%20Calendar.full.jpg -bronze_horse.jpg http://[server]/LG/Bronze%20Horse.full.jpg -bronze_tablet.jpg http://[server]/AQ/Bronze%20Tablet.full.jpg -brood_of_cockroaches.jpg http://[server]/VI/Brood%20of%20Cockroaches.full.jpg -brood_sliver.jpg http://[server]/LE/Brood%20Sliver.full.jpg -broodhatch_nantuko.jpg http://[server]/ON/Broodhatch%20Nantuko.full.jpg -brooding_saurian.jpg http://[server]/CS/Brooding%20Saurian.full.jpg -broodmate_dragon.jpg http://[server]/ALA/Broodmate%20Dragon.full.jpg -broodstar.jpg http://[server]/MR/Broodstar.full.jpg -brothers_of_fire.jpg http://[server]/DK/Brothers%20of%20Fire.full.jpg -brothers_yamazaki.jpg http://[server]/CHK/Brothers%20Yamazaki1.full.jpg -browbeat.jpg http://[server]/JU/Browbeat.full.jpg -brown_ouphe.jpg http://[server]/MR/Brown%20Ouphe.full.jpg -browse.jpg http://[server]/6E/Browse.full.jpg -brush_with_death.jpg http://[server]/SH/Brush%20with%20Death.full.jpg -brushland.jpg http://[server]/10E/Brushland.full.jpg -brushstroke_paintermage.jpg http://[server]/UNH/Brushstroke%20Paintermage.full.jpg -brushwagg.jpg http://[server]/MI/Brushwagg.full.jpg -brutal_deceiver.jpg http://[server]/CHK/Brutal%20Deceiver.full.jpg -brutal_nightstalker.jpg http://[server]/P2/Brutal%20Nightstalker.full.jpg -brutal_suppression.jpg http://[server]/PY/Brutal%20Suppression.full.jpg -brute_force.jpg http://[server]/PLC/Brute%20Force.full.jpg -bubble_matrix.jpg http://[server]/WL/Bubble%20Matrix.full.jpg -bubbling_beebles.jpg http://[server]/UD/Bubbling%20Beebles.full.jpg -bubbling_muck.jpg http://[server]/UD/Bubbling%20Muck.full.jpg -budoka_gardener.jpg http://[server]/CHK/Budoka%20Gardener.full.jpg -budoka_pupil.jpg http://[server]/REL/Budoka%20Pupil.full.jpg -builders_bane.jpg http://[server]/MI/Builder's%20Bane.full.jpg -bull_aurochs.jpg http://[server]/CS/Bull%20Aurochs.full.jpg -bull_cerodon.jpg http://[server]/HOP/Bull%20Cerodon.full.jpg -bull_elephant.jpg http://[server]/VI/Bull%20Elephant.full.jpg -bull_hippo.jpg http://[server]/7E/Bull%20Hippo.full.jpg -bullwhip.jpg http://[server]/SH/Bullwhip.full.jpg -bulwark.jpg http://[server]/US/Bulwark.full.jpg -buoyancy.jpg http://[server]/MM/Buoyancy.full.jpg -burden_of_greed.jpg http://[server]/DS/Burden%20of%20Greed.full.jpg -bureaucracy.jpg http://[server]/UG/Bureaucracy.full.jpg -burgeoning.jpg http://[server]/SH/Burgeoning.full.jpg -buried_alive.jpg http://[server]/OD/Buried%20Alive.full.jpg -burn_trail.jpg http://[server]/SHM/Burn%20Trail.full.jpg -burning_cinder_fury_of_crimson_chaos_fire.jpg http://[server]/UG/Burning%20Cinder%20Fury%20of%20Crimson%20Chaos%20Fire.full.jpg -burning_cloak.jpg http://[server]/PT/Burning%20Cloak.full.jpg -burning_eye_zubera.jpg http://[server]/SOK/Burning-Eye%20Zubera.full.jpg -burning_fields.jpg http://[server]/P3/Burning%20Fields.full.jpg -burning_inquiry.jpg http://[server]/M10/Burning%20Inquiry.full.jpg -burning_of_xinye.jpg http://[server]/P3/Burning%20of%20Xinye.full.jpg -burning_palm_efreet.jpg http://[server]/MI/Burning%20Palm%20Efreet.full.jpg -burning_sands.jpg http://[server]/OD/Burning%20Sands.full.jpg -burning_shield_askari.jpg http://[server]/MI/Burning%20Shield%20Askari.full.jpg -burning_tree_bloodscale.jpg http://[server]/GP/Burning-Tree%20Bloodscale.full.jpg -burning_tree_shaman.jpg http://[server]/GP/Burning-Tree%20Shaman.full.jpg -burning_wish.jpg http://[server]/JU/Burning%20Wish.full.jpg -burnout.jpg http://[server]/AL/Burnout.full.jpg -burnt_offering.jpg http://[server]/IA/Burnt%20Offering.full.jpg -burr_grafter.jpg http://[server]/CHK/Burr%20Grafter.full.jpg -burrenton_bombardier.jpg http://[server]/MOR/Burrenton%20Bombardier.full.jpg -burrenton_forge_tender.jpg http://[server]/LRW/Burrenton%20Forge-Tender.full.jpg -burrenton_shield_bearers.jpg http://[server]/MOR/Burrenton%20Shield-Bearers.full.jpg -burrowing.jpg http://[server]/6E/Burrowing.full.jpg -burst_lightning.jpg http://[server]/ZEN/Burst%20Lightning.full.jpg -burst_of_energy.jpg http://[server]/UL/Burst%20of%20Energy.full.jpg -burst_of_speed.jpg http://[server]/M10/Burst%20of%20Speed.full.jpg -bursting_beebles.jpg http://[server]/UNH/Bursting%20Beebles.full.jpg -bushi_tenderfoot.jpg http://[server]/CHK/Bushi%20Tenderfoot.full.jpg -butcher_orgg.jpg http://[server]/ON/Butcher%20Orgg.full.jpg \ No newline at end of file diff --git a/res/pics_link/card-pictures_c.txt b/res/pics_link/card-pictures_c.txt deleted file mode 100644 index 231a4a1ab06..00000000000 --- a/res/pics_link/card-pictures_c.txt +++ /dev/null @@ -1,765 +0,0 @@ -cabal_archon.jpg http://[server]/ON/Cabal%20Archon.full.jpg -cabal_coffers.jpg http://[server]/TO/Cabal%20Coffers.full.jpg -cabal_conditioning.jpg http://[server]/SC/Cabal%20Conditioning.full.jpg -cabal_executioner.jpg http://[server]/ON/Cabal%20Executioner.full.jpg -cabal_inquisitor.jpg http://[server]/OD/Cabal%20Inquisitor.full.jpg -cabal_interrogator.jpg http://[server]/SC/Cabal%20Interrogator.full.jpg -cabal_patriarch.jpg http://[server]/OD/Cabal%20Patriarch.full.jpg -cabal_pit.jpg http://[server]/OD/Cabal%20Pit.full.jpg -cabal_ritual.jpg http://[server]/TO/Cabal%20Ritual.full.jpg -cabal_shrine.jpg http://[server]/OD/Cabal%20Shrine.full.jpg -cabal_slaver.jpg http://[server]/ON/Cabal%20Slaver.full.jpg -cabal_surgeon.jpg http://[server]/TO/Cabal%20Surgeon.full.jpg -cabal_therapy.jpg http://[server]/JU/Cabal%20Therapy.full.jpg -cabal_torturer.jpg http://[server]/TO/Cabal%20Torturer.full.jpg -cabal_trainee.jpg http://[server]/JU/Cabal%20Trainee.full.jpg -cache_raiders.jpg http://[server]/EVE/Cache%20Raiders.full.jpg -cackling_fiend.jpg http://[server]/US/Cackling%20Fiend.full.jpg -cackling_flames.jpg http://[server]/DIS/Cackling%20Flames.full.jpg -cackling_imp.jpg http://[server]/FD/Cackling%20Imp.full.jpg -cackling_witch.jpg http://[server]/MM/Cackling%20Witch.full.jpg -cadaverous_bloom.jpg http://[server]/MI/Cadaverous%20Bloom.full.jpg -cadaverous_knight.jpg http://[server]/MI/Cadaverous%20Knight.full.jpg -cage_of_hands.jpg http://[server]/CHK/Cage%20of%20Hands.full.jpg -cagemail.jpg http://[server]/JU/Cagemail.full.jpg -cairn_wanderer.jpg http://[server]/LRW/Cairn%20Wanderer.full.jpg -calciderm.jpg http://[server]/PLC/Calciderm.full.jpg -calciform_pools.jpg http://[server]/TSP/Calciform%20Pools.full.jpg -caldera_hellion.jpg http://[server]/ALA/Caldera%20Hellion.full.jpg -caldera_kavu.jpg http://[server]/PS/Caldera%20Kavu.full.jpg -caldera_lake.jpg http://[server]/TE/Caldera%20Lake.full.jpg -call_for_blood.jpg http://[server]/BOK/Call%20for%20Blood.full.jpg -call_of_the_herd.jpg http://[server]/OD/Call%20of%20the%20Herd.full.jpg -call_of_the_wild.jpg http://[server]/8E/Call%20of%20the%20Wild.full.jpg -call_the_skybreaker.jpg http://[server]/EVE/Call%20the%20Skybreaker.full.jpg -call_to_arms.jpg http://[server]/IA/Call%20to%20Arms.full.jpg -call_to_glory.jpg http://[server]/CHK/Call%20to%20Glory.full.jpg -call_to_heel.jpg http://[server]/ALA/Call%20to%20Heel.full.jpg -call_to_the_grave.jpg http://[server]/SC/Call%20to%20the%20Grave.full.jpg -call_to_the_netherworld.jpg http://[server]/TSP/Call%20to%20the%20Netherworld.full.jpg -caller_of_gales.jpg http://[server]/ZEN/Caller%20of%20Gales.full.jpg -caller_of_the_claw.jpg http://[server]/LE/Caller%20of%20the%20Claw.full.jpg -caller_of_the_hunt.jpg http://[server]/MM/Caller%20of%20the%20Hunt.full.jpg -callous_deceiver.jpg http://[server]/CHK/Callous%20Deceiver.full.jpg -callous_giant.jpg http://[server]/IN/Callous%20Giant.full.jpg -callous_oppressor.jpg http://[server]/ON/Callous%20Oppressor.full.jpg -callow_jushi.jpg http://[server]/BOK/Callow%20Jushi.full.jpg -calming_licid.jpg http://[server]/SH/Calming%20Licid.full.jpg -calming_verse.jpg http://[server]/PY/Calming%20Verse.full.jpg -caltrops.jpg http://[server]/7E/Caltrops.full.jpg -camel.jpg http://[server]/AN/Camel.full.jpg -camouflage.jpg http://[server]/U/Camouflage.full.jpg -cancel.jpg http://[server]/M10/Cancel.full.jpg -candelabra_of_tawnos.jpg http://[server]/AQ/Candelabra%20of%20Tawnos.full.jpg -candles_glow.jpg http://[server]/CHK/Candles'%20Glow.full.jpg -candles_of_leng.jpg http://[server]/TSP/Candles%20of%20Leng.full.jpg -canker_abomination.jpg http://[server]/EVE/Canker%20Abomination.full.jpg -cankerous_thirst.jpg http://[server]/EVE/Cankerous%20Thirst.full.jpg -cannibalize.jpg http://[server]/SH/Cannibalize.full.jpg -canopy_claws.jpg http://[server]/JU/Canopy%20Claws.full.jpg -canopy_crawler.jpg http://[server]/LE/Canopy%20Crawler.full.jpg -canopy_dragon.jpg http://[server]/MI/Canopy%20Dragon.full.jpg -canopy_spider.jpg http://[server]/10E/Canopy%20Spider.full.jpg -canopy_surge.jpg http://[server]/IN/Canopy%20Surge.full.jpg -cantivore.jpg http://[server]/OD/Cantivore.full.jpg -canyon_drake.jpg http://[server]/TE/Canyon%20Drake.full.jpg -canyon_minotaur.jpg http://[server]/M10/Canyon%20Minotaur.full.jpg -canyon_wildcat.jpg http://[server]/8E/Canyon%20Wildcat.full.jpg -cao_cao_lord_of_wei.jpg http://[server]/P3/Cao%20Cao,%20Lord%20of%20Wei.full.jpg -cao_ren_wei_commander.jpg http://[server]/P3/Cao%20Ren,%20Wei%20Commander.full.jpg -capashen_knight.jpg http://[server]/UD/Capashen%20Knight.full.jpg -capashen_standard.jpg http://[server]/UD/Capashen%20Standard.full.jpg -capashen_templar.jpg http://[server]/UD/Capashen%20Templar.full.jpg -capashen_unicorn.jpg http://[server]/IN/Capashen%20Unicorn.full.jpg -capricious_efreet.jpg http://[server]/M10/Capricious%20Efreet.full.jpg -capricious_sorcerer.jpg http://[server]/PT/Capricious%20Sorcerer.full.jpg -capsize.jpg http://[server]/TE/Capsize.full.jpg -captain_of_the_watch.jpg http://[server]/M10/Captain%20of%20the%20Watch.full.jpg -captain_sisay.jpg http://[server]/IN/Captain%20Sisay.full.jpg -captains_maneuver.jpg http://[server]/AP/Captain's%20Maneuver.full.jpg -captivating_glance.jpg http://[server]/LRW/Captivating%20Glance.full.jpg -captive_flame.jpg http://[server]/SOK/Captive%20Flame.full.jpg -capture_of_jingzhou.jpg http://[server]/P3/Capture%20of%20Jingzhou.full.jpg -captured_sunlight.jpg http://[server]/ARB/Captured%20Sunlight.full.jpg -carapace.jpg http://[server]/5E/Carapace.full.jpg -caravan_hurda.jpg http://[server]/ZEN/Caravan%20Hurda.full.jpg -carbonize.jpg http://[server]/SC/Carbonize.full.jpg -cardboard_carapace.jpg http://[server]/UG/Cardboard%20Carapace.full.jpg -cardpecker.jpg http://[server]/UNH/Cardpecker.full.jpg -careful_consideration.jpg http://[server]/TSP/Careful%20Consideration.full.jpg -careful_study.jpg http://[server]/OD/Careful%20Study.full.jpg -caregiver.jpg http://[server]/RAV/Caregiver.full.jpg -caribou_range.jpg http://[server]/IA/Caribou%20Range.full.jpg -carnage_altar.jpg http://[server]/ZEN/Carnage%20Altar.full.jpg -carnassid.jpg http://[server]/SH/Carnassid.full.jpg -carnival_of_souls.jpg http://[server]/UD/Carnival%20of%20Souls.full.jpg -carnivorous_death_parrot.jpg http://[server]/UNH/Carnivorous%20Death-Parrot.full.jpg -carnivorous_plant.jpg http://[server]/DK/Carnivorous%20Plant.full.jpg -carnophage.jpg http://[server]/EX/Carnophage.full.jpg -carom.jpg http://[server]/DIS/Carom.full.jpg -carpet_of_flowers.jpg http://[server]/US/Carpet%20of%20Flowers.full.jpg -carrier_pigeons.jpg http://[server]/AL/Carrier%20Pigeons1.full.jpg -carrion.jpg http://[server]/MI/Carrion.full.jpg -carrion_ants.jpg http://[server]/LG/Carrion%20Ants.full.jpg -carrion_beetles.jpg http://[server]/US/Carrion%20Beetles.full.jpg -carrion_feeder.jpg http://[server]/FNM/Carrion%20Feeder.full.jpg -carrion_howler.jpg http://[server]/RAV/Carrion%20Howler.full.jpg -carrion_rats.jpg http://[server]/TO/Carrion%20Rats.full.jpg -carrion_thrash.jpg http://[server]/ALA/Carrion%20Thrash.full.jpg -carrion_wall.jpg http://[server]/8E/Carrion%20Wall.full.jpg -carrion_wurm.jpg http://[server]/TO/Carrion%20Wurm.full.jpg -carrionette.jpg http://[server]/TE/Carrionette.full.jpg -carry_away.jpg http://[server]/DS/Carry%20Away.full.jpg -cartographer.jpg http://[server]/OD/Cartographer.full.jpg -carven_caryatid.jpg http://[server]/RAV/Carven%20Caryatid.full.jpg -cascade_bluffs.jpg http://[server]/EVE/Cascade%20Bluffs.full.jpg -castigate.jpg http://[server]/GP/Castigate.full.jpg -casting_of_bones.jpg http://[server]/CST/Casting%20of%20Bones.full.jpg -castle.jpg http://[server]/7E/Castle.full.jpg -castle_raptors.jpg http://[server]/TSP/Castle%20Raptors.full.jpg -castle_sengir.jpg http://[server]/HL/Castle%20Sengir.full.jpg -cat_burglar.jpg http://[server]/EX/Cat%20Burglar.full.jpg -cat_warriors.jpg http://[server]/6E/Cat%20Warriors.full.jpg -cataclysm.jpg http://[server]/EX/Cataclysm.full.jpg -catacomb_dragon.jpg http://[server]/MI/Catacomb%20Dragon.full.jpg -catalog.jpg http://[server]/8E/Catalog.full.jpg -catalyst_stone.jpg http://[server]/OD/Catalyst%20Stone.full.jpg -catapult_master.jpg http://[server]/ON/Catapult%20Master.full.jpg -catapult_squad.jpg http://[server]/ON/Catapult%20Squad.full.jpg -catastrophe.jpg http://[server]/US/Catastrophe.full.jpg -cateran_brute.jpg http://[server]/MM/Cateran%20Brute.full.jpg -cateran_enforcer.jpg http://[server]/MM/Cateran%20Enforcer.full.jpg -cateran_kidnappers.jpg http://[server]/MM/Cateran%20Kidnappers.full.jpg -cateran_overlord.jpg http://[server]/MM/Cateran%20Overlord.full.jpg -cateran_persuader.jpg http://[server]/MM/Cateran%20Persuader.full.jpg -cateran_slaver.jpg http://[server]/MM/Cateran%20Slaver.full.jpg -cateran_summons.jpg http://[server]/MM/Cateran%20Summons.full.jpg -caterwauling_boggart.jpg http://[server]/LRW/Caterwauling%20Boggart.full.jpg -cathartic_adept.jpg http://[server]/ALA/Cathartic%20Adept.full.jpg -cathedral_of_serra.jpg http://[server]/LG/Cathedral%20of%20Serra.full.jpg -cathodion.jpg http://[server]/MR/Cathodion.full.jpg -cauldron_dance.jpg http://[server]/IN/Cauldron%20Dance.full.jpg -cauldron_haze.jpg http://[server]/EVE/Cauldron%20Haze.full.jpg -cauldron_of_souls.jpg http://[server]/SHM/Cauldron%20of%20Souls.full.jpg -caustic_rain.jpg http://[server]/GP/Caustic%20Rain.full.jpg -caustic_tar.jpg http://[server]/OD/Caustic%20Tar.full.jpg -caustic_wasps.jpg http://[server]/MM/Caustic%20Wasps.full.jpg -cautery_sliver.jpg http://[server]/PLC/Cautery%20Sliver.full.jpg -cavalry_master.jpg http://[server]/TSP/Cavalry%20Master.full.jpg -cave_in.jpg http://[server]/MM/Cave-In.full.jpg -cave_people.jpg http://[server]/5E/Cave%20People.full.jpg -cave_sense.jpg http://[server]/MM/Cave%20Sense.full.jpg -cave_tiger.jpg http://[server]/US/Cave%20Tiger.full.jpg -cavern_crawler.jpg http://[server]/MM/Cavern%20Crawler.full.jpg -cavern_harpy.jpg http://[server]/PS/Cavern%20Harpy.full.jpg -cavern_thoctar.jpg http://[server]/ALA/Cavern%20Thoctar.full.jpg -caverns_of_despair.jpg http://[server]/LG/Caverns%20of%20Despair.full.jpg -caves_of_koilos.jpg http://[server]/10E/Caves%20of%20Koilos.full.jpg -cease_fire.jpg http://[server]/OD/Cease-Fire.full.jpg -ceaseless_searblades.jpg http://[server]/LRW/Ceaseless%20Searblades.full.jpg -celestial_ancient.jpg http://[server]/DIS/Celestial%20Ancient.full.jpg -celestial_convergence.jpg http://[server]/PY/Celestial%20Convergence.full.jpg -celestial_crusader.jpg http://[server]/TSP/Celestial%20Crusader.full.jpg -celestial_dawn.jpg http://[server]/6E/Celestial%20Dawn.full.jpg -celestial_gatekeeper.jpg http://[server]/LE/Celestial%20Gatekeeper.full.jpg -celestial_kirin.jpg http://[server]/SOK/Celestial%20Kirin.full.jpg -celestial_mantle.jpg http://[server]/ZEN/Celestial%20Mantle.full.jpg -celestial_prism.jpg http://[server]/4E/Celestial%20Prism.full.jpg -celestial_purge.jpg http://[server]/M10/Celestial%20Purge.full.jpg -celestial_sword.jpg http://[server]/IA/Celestial%20Sword.full.jpg -cemetery_gate.jpg http://[server]/HL/Cemetery%20Gate1.full.jpg -cemetery_puca.jpg http://[server]/SHM/Cemetery%20Puca.full.jpg -cemetery_reaper.jpg http://[server]/M10/Cemetery%20Reaper.full.jpg -cenns_enlistment.jpg http://[server]/EVE/Cenn's%20Enlistment.full.jpg -cenns_heir.jpg http://[server]/LRW/Cenn's%20Heir.full.jpg -cenns_tactician.jpg http://[server]/MOR/Cenn's%20Tactician.full.jpg -censorship.jpg http://[server]/UG/Censorship.full.jpg -centaur_archer.jpg http://[server]/IA/Centaur%20Archer.full.jpg -centaur_chieftain.jpg http://[server]/TO/Centaur%20Chieftain.full.jpg -centaur_courser.jpg http://[server]/M10/Centaur%20Courser.full.jpg -centaur_garden.jpg http://[server]/OD/Centaur%20Garden.full.jpg -centaur_glade.jpg http://[server]/ON/Centaur%20Glade.full.jpg -centaur_omenreader.jpg http://[server]/FUT/Centaur%20Omenreader.full.jpg -centaur_rootcaster.jpg http://[server]/JU/Centaur%20Rootcaster.full.jpg -centaur_safeguard.jpg http://[server]/RAV/Centaur%20Safeguard.full.jpg -centaur_veteran.jpg http://[server]/TO/Centaur%20Veteran.full.jpg -cephalid_aristocrat.jpg http://[server]/TO/Cephalid%20Aristocrat.full.jpg -cephalid_broker.jpg http://[server]/OD/Cephalid%20Broker.full.jpg -cephalid_coliseum.jpg http://[server]/OD/Cephalid%20Coliseum.full.jpg -cephalid_constable.jpg http://[server]/10E/Cephalid%20Constable.full.jpg -cephalid_illusionist.jpg http://[server]/TO/Cephalid%20Illusionist.full.jpg -cephalid_inkshrouder.jpg http://[server]/JU/Cephalid%20Inkshrouder.full.jpg -cephalid_looter.jpg http://[server]/OD/Cephalid%20Looter.full.jpg -cephalid_pathmage.jpg http://[server]/LE/Cephalid%20Pathmage.full.jpg -cephalid_retainer.jpg http://[server]/OD/Cephalid%20Retainer.full.jpg -cephalid_sage.jpg http://[server]/TO/Cephalid%20Sage.full.jpg -cephalid_scout.jpg http://[server]/OD/Cephalid%20Scout.full.jpg -cephalid_shrine.jpg http://[server]/OD/Cephalid%20Shrine.full.jpg -cephalid_snitch.jpg http://[server]/TO/Cephalid%20Snitch.full.jpg -cephalid_vandal.jpg http://[server]/TO/Cephalid%20Vandal.full.jpg -cerebral_vortex.jpg http://[server]/GP/Cerebral%20Vortex.full.jpg -ceremonial_guard.jpg http://[server]/MM/Ceremonial%20Guard.full.jpg -cerodon_yearling.jpg http://[server]/HOP/Cerodon%20Yearling.full.jpg -cerulean_sphinx.jpg http://[server]/RAV/Cerulean%20Sphinx.full.jpg -cerulean_wisps.jpg http://[server]/SHM/Cerulean%20Wisps.full.jpg -cerulean_wyvern.jpg http://[server]/MI/Cerulean%20Wyvern.full.jpg -cessation.jpg http://[server]/UL/Cessation.full.jpg -ceta_disciple.jpg http://[server]/AP/Ceta%20Disciple.full.jpg -ceta_sanctuary.jpg http://[server]/AP/Ceta%20Sanctuary.full.jpg -cetavolver.jpg http://[server]/AP/Cetavolver.full.jpg -chain_lightning.jpg http://[server]/LG/Chain%20Lightning.full.jpg -chain_of_acid.jpg http://[server]/ON/Chain%20of%20Acid.full.jpg -chain_of_plasma.jpg http://[server]/ON/Chain%20of%20Plasma.full.jpg -chain_of_silence.jpg http://[server]/ON/Chain%20of%20Silence.full.jpg -chain_of_smog.jpg http://[server]/ON/Chain%20of%20Smog.full.jpg -chain_of_vapor.jpg http://[server]/ON/Chain%20of%20Vapor.full.jpg -chain_stasis.jpg http://[server]/HL/Chain%20Stasis.full.jpg -chainbreaker.jpg http://[server]/SHM/Chainbreaker.full.jpg -chainer_dementia_master.jpg http://[server]/TO/Chainer,%20Dementia%20Master.full.jpg -chainers_edict.jpg http://[server]/TO/Chainer's%20Edict.full.jpg -chainflinger.jpg http://[server]/OD/Chainflinger.full.jpg -chains_of_mephistopheles.jpg http://[server]/LG/Chains%20of%20Mephistopheles.full.jpg -chalice_of_the_void.jpg http://[server]/MR/Chalice%20of%20the%20Void.full.jpg -chamber_of_manipulation.jpg http://[server]/OD/Chamber%20of%20Manipulation.full.jpg -chambered_nautilus.jpg http://[server]/MM/Chambered%20Nautilus.full.jpg -chameleon_blur.jpg http://[server]/TSP/Chameleon%20Blur.full.jpg -chameleon_colossus.jpg http://[server]/MOR/Chameleon%20Colossus.full.jpg -chameleon_spirit.jpg http://[server]/MM/Chameleon%20Spirit.full.jpg -champion_lancer.jpg http://[server]/ST/Champion%20Lancer.full.jpg -champions_victory.jpg http://[server]/P3/Champion's%20Victory.full.jpg -chance_encounter.jpg http://[server]/OD/Chance%20Encounter.full.jpg -chandler.jpg http://[server]/HL/Chandler.full.jpg -chandra_ablaze.jpg http://[server]/ZEN/Chandra%20Ablaze.full.jpg -chandra_nalaar.jpg http://[server]/M10/Chandra%20Nalaar.full.jpg -change_of_heart.jpg http://[server]/SH/Change%20of%20Heart.full.jpg -changeling_berserker.jpg http://[server]/LRW/Changeling%20Berserker.full.jpg -changeling_hero.jpg http://[server]/LRW/Changeling%20Hero.full.jpg -changeling_sentinel.jpg http://[server]/MOR/Changeling%20Sentinel.full.jpg -changeling_titan.jpg http://[server]/LRW/Changeling%20Titan.full.jpg -channel.jpg http://[server]/4E/Channel.full.jpg -channel_the_suns.jpg http://[server]/FD/Channel%20the%20Suns.full.jpg -chant_of_vitu_ghazi.jpg http://[server]/RAV/Chant%20of%20Vitu-Ghazi.full.jpg -chaos_charm.jpg http://[server]/MI/Chaos%20Charm.full.jpg -chaos_confetti.jpg http://[server]/UG/Chaos%20Confetti.full.jpg -chaos_harlequin.jpg http://[server]/AL/Chaos%20Harlequin.full.jpg -chaos_lord.jpg http://[server]/IA/Chaos%20Lord.full.jpg -chaos_moon.jpg http://[server]/IA/Chaos%20Moon.full.jpg -chaos_orb.jpg http://[server]/OV/Chaos%20Orb.full.jpg -chaoslace.jpg http://[server]/4E/Chaoslace.full.jpg -chaosphere.jpg http://[server]/MI/Chaosphere.full.jpg -chaotic_backlash.jpg http://[server]/EVE/Chaotic%20Backlash.full.jpg -chaotic_goo.jpg http://[server]/TE/Chaotic%20Goo.full.jpg -chaotic_strike.jpg http://[server]/IN/Chaotic%20Strike.full.jpg -char.jpg http://[server]/RAV/Char.full.jpg -char_rumbler.jpg http://[server]/FUT/Char-Rumbler.full.jpg -charcoal_diamond.jpg http://[server]/7E/Charcoal%20Diamond.full.jpg -charge_across_the_araba.jpg http://[server]/SOK/Charge%20Across%20the%20Araba.full.jpg -charging_bandits.jpg http://[server]/PT/Charging%20Bandits.full.jpg -charging_paladin.jpg http://[server]/EX/Charging%20Paladin.full.jpg -charging_rhino.jpg http://[server]/TE/Charging%20Rhino.full.jpg -charging_slateback.jpg http://[server]/ON/Charging%20Slateback.full.jpg -charging_troll.jpg http://[server]/IN/Charging%20Troll.full.jpg -chariot_of_the_sun.jpg http://[server]/MI/Chariot%20of%20the%20Sun.full.jpg -charisma.jpg http://[server]/MM/Charisma.full.jpg -charm_peddler.jpg http://[server]/MM/Charm%20Peddler.full.jpg -charm_school.jpg http://[server]/UG/Charm%20School.full.jpg -charmed_griffin.jpg http://[server]/MM/Charmed%20Griffin.full.jpg -charmed_pendant.jpg http://[server]/OD/Charmed%20Pendant.full.jpg -charnelhoard_wurm.jpg http://[server]/CFX/Charnelhoard%20Wurm.full.jpg -chartooth_cougar.jpg http://[server]/SC/Chartooth%20Cougar.full.jpg -chastise.jpg http://[server]/9E/Chastise.full.jpg -chatter_of_the_squirrel.jpg http://[server]/OD/Chatter%20of%20the%20Squirrel.full.jpg -cheap_ass.jpg http://[server]/UNH/Cheap%20Ass.full.jpg -cheatyface.jpg http://[server]/UNH/Cheatyface.full.jpg -checks_and_balances.jpg http://[server]/UG/Checks%20and%20Balances.full.jpg -chicken_a_la_king.jpg http://[server]/UG/Chicken%20a%20la%20King.full.jpg -chicken_egg.jpg http://[server]/UG/Chicken%20Egg.full.jpg -chieftain_en_dal.jpg http://[server]/NE/Chieftain%20en-Dal.full.jpg -child_of_alara.jpg http://[server]/CFX/Child%20of%20Alara.full.jpg -child_of_gaea.jpg http://[server]/US/Child%20of%20Gaea.full.jpg -child_of_night.jpg http://[server]/M10/Child%20of%20Night.full.jpg -child_of_thorns.jpg http://[server]/BOK/Child%20of%20Thorns.full.jpg -childhood_horror.jpg http://[server]/OD/Childhood%20Horror.full.jpg -children_of_korlis.jpg http://[server]/TSP/Children%20of%20Korlis.full.jpg -chill.jpg http://[server]/TE/Chill.full.jpg -chill_haunting.jpg http://[server]/SC/Chill%20Haunting.full.jpg -chill_to_the_bone.jpg http://[server]/CS/Chill%20to%20the%20Bone.full.jpg -chilling_apparition.jpg http://[server]/PY/Chilling%20Apparition.full.jpg -chilling_shade.jpg http://[server]/CS/Chilling%20Shade.full.jpg -chime_of_night.jpg http://[server]/UD/Chime%20of%20Night.full.jpg -chimeric_coils.jpg http://[server]/FD/Chimeric%20Coils.full.jpg -chimeric_egg.jpg http://[server]/DS/Chimeric%20Egg.full.jpg -chimeric_idol.jpg http://[server]/PY/Chimeric%20Idol.full.jpg -chimeric_sphere.jpg http://[server]/WL/Chimeric%20Sphere.full.jpg -chimeric_staff.jpg http://[server]/10E/Chimeric%20Staff.full.jpg -chimney_imp.jpg http://[server]/MR/Chimney%20Imp.full.jpg -chisei_heart_of_oceans.jpg http://[server]/BOK/Chisei,%20Heart%20of%20Oceans.full.jpg -chittering_rats.jpg http://[server]/DS/Chittering%20Rats.full.jpg -chlorophant.jpg http://[server]/OD/Chlorophant.full.jpg -cho_arrim_alchemist.jpg http://[server]/MM/Cho-Arrim%20Alchemist.full.jpg -cho_arrim_bruiser.jpg http://[server]/MM/Cho-Arrim%20Bruiser.full.jpg -cho_arrim_legate.jpg http://[server]/MM/Cho-Arrim%20Legate.full.jpg -cho_manno_revolutionary.jpg http://[server]/10E/Cho-Manno,%20Revolutionary.full.jpg -cho_mannos_blessing.jpg http://[server]/MM/Cho-Manno's%20Blessing.full.jpg -choice_of_damnations.jpg http://[server]/SOK/Choice%20of%20Damnations.full.jpg -choke.jpg http://[server]/8E/Choke.full.jpg -choking_sands.jpg http://[server]/MI/Choking%20Sands.full.jpg -choking_tethers.jpg http://[server]/ON/Choking%20Tethers.full.jpg -choking_vines.jpg http://[server]/WL/Choking%20Vines.full.jpg -chord_of_calling.jpg http://[server]/RAV/Chord%20of%20Calling.full.jpg -chorus_of_the_conclave.jpg http://[server]/RAV/Chorus%20of%20the%20Conclave.full.jpg -chorus_of_woe.jpg http://[server]/ST/Chorus%20of%20Woe.full.jpg -chromatic_armor.jpg http://[server]/IA/Chromatic%20Armor.full.jpg -chromatic_sphere.jpg http://[server]/IN/Chromatic%20Sphere.full.jpg -chromatic_star.jpg http://[server]/10E/Chromatic%20Star.full.jpg -chrome_mox.jpg http://[server]/MR/Chrome%20Mox.full.jpg -chromescale_drake.jpg http://[server]/DS/Chromescale%20Drake.full.jpg -chromeshell_crab.jpg http://[server]/LE/Chromeshell%20Crab.full.jpg -chromium.jpg http://[server]/CH/Chromium.full.jpg -chronatog.jpg http://[server]/VI/Chronatog.full.jpg -chronatog_totem.jpg http://[server]/TSP/Chronatog%20Totem.full.jpg -chronomantic_escape.jpg http://[server]/FUT/Chronomantic%20Escape.full.jpg -chronosavant.jpg http://[server]/TSP/Chronosavant.full.jpg -chronozoa.jpg http://[server]/PLC/Chronozoa.full.jpg -chub_toad.jpg http://[server]/IA/Chub%20Toad.full.jpg -churning_eddy.jpg http://[server]/TO/Churning%20Eddy.full.jpg -cinder_cloud.jpg http://[server]/MI/Cinder%20Cloud.full.jpg -cinder_crawler.jpg http://[server]/EX/Cinder%20Crawler.full.jpg -cinder_elemental.jpg http://[server]/MM/Cinder%20Elemental.full.jpg -cinder_giant.jpg http://[server]/WL/Cinder%20Giant.full.jpg -cinder_marsh.jpg http://[server]/TE/Cinder%20Marsh.full.jpg -cinder_pyromancer.jpg http://[server]/EVE/Cinder%20Pyromancer.full.jpg -cinder_seer.jpg http://[server]/UD/Cinder%20Seer.full.jpg -cinder_shade.jpg http://[server]/IN/Cinder%20Shade.full.jpg -cinder_storm.jpg http://[server]/ST/Cinder%20Storm.full.jpg -cinder_wall.jpg http://[server]/8E/Cinder%20Wall.full.jpg -cinderbones.jpg http://[server]/SHM/Cinderbones.full.jpg -cinderhaze_wretch.jpg http://[server]/SHM/Cinderhaze%20Wretch.full.jpg -circle_of_affliction.jpg http://[server]/PLC/Circle%20of%20Affliction.full.jpg -circle_of_despair.jpg http://[server]/MI/Circle%20of%20Despair.full.jpg -circle_of_protection_art.jpg http://[server]/UNH/Circle%20of%20Protection%20Art.full.jpg -circle_of_protection_artifacts.jpg http://[server]/5E/Circle%20of%20Protection%20Artifacts.full.jpg -circle_of_protection_black.jpg http://[server]/9E/Circle%20of%20Protection%20Black.full.jpg -circle_of_protection_blue.jpg http://[server]/8E/Circle%20of%20Protection%20Blue.full.jpg -circle_of_protection_green.jpg http://[server]/8E/Circle%20of%20Protection%20Green.full.jpg -circle_of_protection_red.jpg http://[server]/9E/Circle%20of%20Protection%20Red.full.jpg -circle_of_protection_shadow.jpg http://[server]/TE/Circle%20of%20Protection%20Shadow.full.jpg -circle_of_protection_white.jpg http://[server]/8E/Circle%20of%20Protection%20White.full.jpg -circle_of_solace.jpg http://[server]/ON/Circle%20of%20Solace.full.jpg -circling_vultures.jpg http://[server]/WL/Circling%20Vultures.full.jpg -circu_dimir_lobotomist.jpg http://[server]/RAV/Circu,%20Dimir%20Lobotomist.full.jpg -circular_logic.jpg http://[server]/TO/Circular%20Logic.full.jpg -citadel_of_pain.jpg http://[server]/PY/Citadel%20of%20Pain.full.jpg -citanul_centaurs.jpg http://[server]/US/Citanul%20Centaurs.full.jpg -citanul_druid.jpg http://[server]/AQ/Citanul%20Druid.full.jpg -citanul_flute.jpg http://[server]/10E/Citanul%20Flute.full.jpg -citanul_hierophants.jpg http://[server]/US/Citanul%20Hierophants.full.jpg -citanul_woodreaders.jpg http://[server]/PLC/Citanul%20Woodreaders.full.jpg -city_in_a_bottle.jpg http://[server]/AN/City%20in%20a%20Bottle.full.jpg -city_of_ass.jpg http://[server]/UNH/City%20of%20Ass.full.jpg -city_of_brass.jpg http://[server]/8E/City%20of%20Brass.full.jpg -city_of_shadows.jpg http://[server]/DK/City%20of%20Shadows.full.jpg -city_of_solitude.jpg http://[server]/VI/City%20of%20Solitude.full.jpg -city_of_traitors.jpg http://[server]/EX/City%20of%20Traitors.full.jpg -civic_guildmage.jpg http://[server]/MI/Civic%20Guildmage.full.jpg -civic_wayfinder.jpg http://[server]/10E/Civic%20Wayfinder.full.jpg -clairvoyance.jpg http://[server]/IA/Clairvoyance.full.jpg -clam_i_am.jpg http://[server]/UG/Clam-I-Am.full.jpg -clam_session.jpg http://[server]/UG/Clam%20Session.full.jpg -clambassadors.jpg http://[server]/UG/Clambassadors.full.jpg -clarion_ultimatum.jpg http://[server]/ALA/Clarion%20Ultimatum.full.jpg -clash_of_realities.jpg http://[server]/BOK/Clash%20of%20Realities.full.jpg -claws_of_gix.jpg http://[server]/US/Claws%20of%20Gix.full.jpg -claws_of_wirewood.jpg http://[server]/SC/Claws%20of%20Wirewood.full.jpg -clay_pigeon.jpg http://[server]/UG/Clay%20Pigeon.full.jpg -clay_statue.jpg http://[server]/5E/Clay%20Statue.full.jpg -cleanfall.jpg http://[server]/CHK/Cleanfall.full.jpg -cleanse.jpg http://[server]/LG/Cleanse.full.jpg -cleansing.jpg http://[server]/DK/Cleansing.full.jpg -cleansing_beam.jpg http://[server]/RAV/Cleansing%20Beam.full.jpg -cleansing_meditation.jpg http://[server]/TO/Cleansing%20Meditation.full.jpg -clear.jpg http://[server]/US/Clear.full.jpg -clear_the_land.jpg http://[server]/MM/Clear%20the%20Land.full.jpg -clearwater_goblet.jpg http://[server]/FD/Clearwater%20Goblet.full.jpg -clergy_en_vec.jpg http://[server]/TE/Clergy%20en-Vec.full.jpg -clergy_of_the_holy_nimbus.jpg http://[server]/LG/Clergy%20of%20the%20Holy%20Nimbus.full.jpg -clickslither.jpg http://[server]/LE/Clickslither.full.jpg -cliff_threader.jpg http://[server]/ZEN/Cliff%20Threader.full.jpg -cliffrunner_behemoth.jpg http://[server]/CFX/Cliffrunner%20Behemoth.full.jpg -clinging_darkness.jpg http://[server]/RAV/Clinging%20Darkness.full.jpg -cloak_and_dagger.jpg http://[server]/MOR/Cloak%20and%20Dagger.full.jpg -cloak_of_confusion.jpg http://[server]/5E/Cloak%20of%20Confusion.full.jpg -cloak_of_feathers.jpg http://[server]/PT/Cloak%20of%20Feathers.full.jpg -cloak_of_invisibility.jpg http://[server]/MI/Cloak%20of%20Invisibility.full.jpg -cloak_of_mists.jpg http://[server]/US/Cloak%20of%20Mists.full.jpg -clock_of_omens.jpg http://[server]/FD/Clock%20of%20Omens.full.jpg -clockspinning.jpg http://[server]/TSP/Clockspinning.full.jpg -clockwork_avian.jpg http://[server]/BD/Clockwork%20Avian.full.jpg -clockwork_beast.jpg http://[server]/5E/Clockwork%20Beast.full.jpg -clockwork_beetle.jpg http://[server]/MR/Clockwork%20Beetle.full.jpg -clockwork_condor.jpg http://[server]/MR/Clockwork%20Condor.full.jpg -clockwork_dragon.jpg http://[server]/MR/Clockwork%20Dragon.full.jpg -clockwork_gnomes.jpg http://[server]/HL/Clockwork%20Gnomes.full.jpg -clockwork_hydra.jpg http://[server]/TSP/Clockwork%20Hydra.full.jpg -clockwork_steed.jpg http://[server]/5E/Clockwork%20Steed.full.jpg -clockwork_swarm.jpg http://[server]/HL/Clockwork%20Swarm.full.jpg -clockwork_vorrac.jpg http://[server]/MR/Clockwork%20Vorrac.full.jpg -clone.jpg http://[server]/M10/Clone.full.jpg -close_quarters.jpg http://[server]/MM/Close%20Quarters.full.jpg -clot_sliver.jpg http://[server]/TE/Clot%20Sliver.full.jpg -cloud_cover.jpg http://[server]/PS/Cloud%20Cover.full.jpg -cloud_djinn.jpg http://[server]/BD/Cloud%20Djinn.full.jpg -cloud_dragon.jpg http://[server]/PT/Cloud%20Dragon.full.jpg -cloud_elemental.jpg http://[server]/10E/Cloud%20Elemental.full.jpg -cloud_key.jpg http://[server]/FUT/Cloud%20Key.full.jpg -cloud_of_faeries.jpg http://[server]/UL/Cloud%20of%20Faeries.full.jpg -cloud_pirates.jpg http://[server]/PT/Cloud%20Pirates.full.jpg -cloud_spirit.jpg http://[server]/PT/Cloud%20Spirit.full.jpg -cloud_sprite.jpg http://[server]/10E/Cloud%20Sprite.full.jpg -cloudchaser_eagle.jpg http://[server]/7E/Cloudchaser%20Eagle.full.jpg -cloudchaser_kestrel.jpg http://[server]/TSP/Cloudchaser%20Kestrel.full.jpg -cloudcrest_lake.jpg http://[server]/CHK/Cloudcrest%20Lake.full.jpg -cloudcrown_oak.jpg http://[server]/LRW/Cloudcrown%20Oak.full.jpg -cloudgoat_ranger.jpg http://[server]/LRW/Cloudgoat%20Ranger.full.jpg -cloudheath_drake.jpg http://[server]/ALA/Cloudheath%20Drake.full.jpg -cloudhoof_kirin.jpg http://[server]/SOK/Cloudhoof%20Kirin.full.jpg -cloudpost.jpg http://[server]/MR/Cloudpost.full.jpg -cloudreach_cavalry.jpg http://[server]/LE/Cloudreach%20Cavalry.full.jpg -cloudseeder.jpg http://[server]/FUT/Cloudseeder.full.jpg -cloudskate.jpg http://[server]/NE/Cloudskate.full.jpg -cloudstone_curio.jpg http://[server]/RAV/Cloudstone%20Curio.full.jpg -cloudthresher.jpg http://[server]/LRW/Cloudthresher.full.jpg -clout_of_the_dominus.jpg http://[server]/EVE/Clout%20of%20the%20Dominus.full.jpg -cloven_casting.jpg http://[server]/ARB/Cloven%20Casting.full.jpg -clutch_of_the_undercity.jpg http://[server]/RAV/Clutch%20of%20the%20Undercity.full.jpg -clutch_of_undeath.jpg http://[server]/SC/Clutch%20of%20Undeath.full.jpg -coal_golem.jpg http://[server]/DK/Coal%20Golem.full.jpg -coal_stoker.jpg http://[server]/TSP/Coal%20Stoker.full.jpg -coalhauler_swine.jpg http://[server]/RAV/Coalhauler%20Swine.full.jpg -coalition_flag.jpg http://[server]/AP/Coalition%20Flag.full.jpg -coalition_honor_guard.jpg http://[server]/AP/Coalition%20Honor%20Guard.full.jpg -coalition_relic.jpg http://[server]/FUT/Coalition%20Relic.full.jpg -coalition_victory.jpg http://[server]/IN/Coalition%20Victory.full.jpg -coast_watcher.jpg http://[server]/SC/Coast%20Watcher.full.jpg -coastal_drake.jpg http://[server]/AP/Coastal%20Drake.full.jpg -coastal_hornclaw.jpg http://[server]/8E/Coastal%20Hornclaw.full.jpg -coastal_piracy.jpg http://[server]/8E/Coastal%20Piracy.full.jpg -coastal_tower.jpg http://[server]/8E/Coastal%20Tower.full.jpg -coastal_wizard.jpg http://[server]/P2/Coastal%20Wizard.full.jpg -coat_of_arms.jpg http://[server]/M10/Coat%20of%20Arms.full.jpg -cobalt_golem.jpg http://[server]/MR/Cobalt%20Golem.full.jpg -cobra_trap.jpg http://[server]/ZEN/Cobra%20Trap.full.jpg -cockatrice.jpg http://[server]/5E/Cockatrice.full.jpg -cocoon.jpg http://[server]/CH/Cocoon.full.jpg -coercion.jpg http://[server]/9E/Coercion.full.jpg -coffin_puppets.jpg http://[server]/PY/Coffin%20Puppets.full.jpg -coffin_purge.jpg http://[server]/OD/Coffin%20Purge.full.jpg -coffin_queen.jpg http://[server]/TE/Coffin%20Queen.full.jpg -cognivore.jpg http://[server]/OD/Cognivore.full.jpg -coiled_tinviper.jpg http://[server]/TE/Coiled%20Tinviper.full.jpg -coiling_oracle.jpg http://[server]/DIS/Coiling%20Oracle.full.jpg -coiling_woodworm.jpg http://[server]/NE/Coiling%20Woodworm.full.jpg -coils_of_the_medusa.jpg http://[server]/WL/Coils%20of%20the%20Medusa.full.jpg -cold_eyed_selkie.jpg http://[server]/EVE/Cold-Eyed%20Selkie.full.jpg -cold_snap.jpg http://[server]/IA/Cold%20Snap.full.jpg -cold_storage.jpg http://[server]/TE/Cold%20Storage.full.jpg -coldsteel_heart.jpg http://[server]/CS/Coldsteel%20Heart.full.jpg -colfenors_plans.jpg http://[server]/LRW/Colfenor's%20Plans.full.jpg -colfenors_urn.jpg http://[server]/LRW/Colfenor's%20Urn.full.jpg -collapsing_borders.jpg http://[server]/IN/Collapsing%20Borders.full.jpg -collective_restraint.jpg http://[server]/IN/Collective%20Restraint.full.jpg -collective_unconscious.jpg http://[server]/8E/Collective%20Unconscious.full.jpg -collector_protector.jpg http://[server]/UNH/Collector%20Protector.full.jpg -colos_yearling.jpg http://[server]/UD/Colos%20Yearling.full.jpg -colossal_might.jpg http://[server]/ARB/Colossal%20Might.full.jpg -colossus_of_sardia.jpg http://[server]/10E/Colossus%20of%20Sardia.full.jpg -coma_veil.jpg http://[server]/ALA/Coma%20Veil.full.jpg -combat_medic.jpg http://[server]/AT/Combat%20Medic.full.jpg -command_of_unsummoning.jpg http://[server]/PT/Command%20of%20Unsummoning.full.jpg -commandeer.jpg http://[server]/CS/Commandeer.full.jpg -commander_eesha.jpg http://[server]/JU/Commander%20Eesha.full.jpg -commander_greven_il_vec.jpg http://[server]/TE/Commander%20Greven%20il-Vec.full.jpg -commando_raid.jpg http://[server]/ON/Commando%20Raid.full.jpg -common_cause.jpg http://[server]/MM/Common%20Cause.full.jpg -common_courtesy.jpg http://[server]/UG/Common%20Courtesy.full.jpg -commune_with_nature.jpg http://[server]/10E/Commune%20with%20Nature.full.jpg -complex_automaton.jpg http://[server]/NE/Complex%20Automaton.full.jpg -complicate.jpg http://[server]/ON/Complicate.full.jpg -composite_golem.jpg http://[server]/10E/Composite%20Golem.full.jpg -compost.jpg http://[server]/7E/Compost.full.jpg -compulsion.jpg http://[server]/TO/Compulsion.full.jpg -compulsive_research.jpg http://[server]/RAV/Compulsive%20Research.full.jpg -concentrate.jpg http://[server]/8E/Concentrate.full.jpg -concerted_effort.jpg http://[server]/RAV/Concerted%20Effort.full.jpg -conch_horn.jpg http://[server]/FE/Conch%20Horn.full.jpg -conclave_equenaut.jpg http://[server]/RAV/Conclave%20Equenaut.full.jpg -conclave_phalanx.jpg http://[server]/RAV/Conclave%20Phalanx.full.jpg -conclaves_blessing.jpg http://[server]/RAV/Conclave's%20Blessing.full.jpg -concordant_crossroads.jpg http://[server]/CH/Concordant%20Crossroads.full.jpg -condemn.jpg http://[server]/10E/Condemn.full.jpg -condescend.jpg http://[server]/FD/Condescend.full.jpg -cone_of_flame.jpg http://[server]/10E/Cone%20of%20Flame.full.jpg -confessor.jpg http://[server]/OD/Confessor.full.jpg -confiscate.jpg http://[server]/9E/Confiscate.full.jpg -conflagrate.jpg http://[server]/TSP/Conflagrate.full.jpg -conflux.jpg http://[server]/CFX/Conflux.full.jpg -confound.jpg http://[server]/PS/Confound.full.jpg -confusion_in_the_ranks.jpg http://[server]/MR/Confusion%20in%20the%20Ranks.full.jpg -congregate.jpg http://[server]/US/Congregate.full.jpg -congregation_at_dawn.jpg http://[server]/RAV/Congregation%20At%20Dawn.full.jpg -conjurers_ban.jpg http://[server]/GP/Conjurer's%20Ban.full.jpg -conjurers_bauble.jpg http://[server]/FD/Conjurer's%20Bauble.full.jpg -conquer.jpg http://[server]/6E/Conquer.full.jpg -conquerors_pledge.jpg http://[server]/ZEN/Conqueror's%20Pledge.full.jpg -consecrate_land.jpg http://[server]/U/Consecrate%20Land.full.jpg -conservator.jpg http://[server]/4E/Conservator.full.jpg -consign_to_dream.jpg http://[server]/SHM/Consign%20to%20Dream.full.jpg -conspiracy.jpg http://[server]/MM/Conspiracy.full.jpg -constant_mists.jpg http://[server]/SH/Constant%20Mists.full.jpg -constricting_tendrils.jpg http://[server]/CFX/Constricting%20Tendrils.full.jpg -consult_the_necrosages.jpg http://[server]/RAV/Consult%20the%20Necrosages.full.jpg -consume_spirit.jpg http://[server]/10E/Consume%20Spirit.full.jpg -consume_strength.jpg http://[server]/AP/Consume%20Strength.full.jpg -consuming_bonfire.jpg http://[server]/LRW/Consuming%20Bonfire.full.jpg -consuming_ferocity.jpg http://[server]/MI/Consuming%20Ferocity.full.jpg -consuming_vortex.jpg http://[server]/CHK/Consuming%20Vortex.full.jpg -consumptive_goo.jpg http://[server]/SC/Consumptive%20Goo.full.jpg -contagion.jpg http://[server]/AL/Contagion.full.jpg -contaminated_bond.jpg http://[server]/10E/Contaminated%20Bond.full.jpg -contamination.jpg http://[server]/US/Contamination.full.jpg -contemplation.jpg http://[server]/SH/Contemplation.full.jpg -contempt.jpg http://[server]/SH/Contempt.full.jpg -contested_cliffs.jpg http://[server]/ON/Contested%20Cliffs.full.jpg -contract_from_below.jpg http://[server]/U/Contract%20from%20Below.full.jpg -control_magic.jpg http://[server]/4E/Control%20Magic.full.jpg -control_of_the_court.jpg http://[server]/P3/Control%20of%20the%20Court.full.jpg -controlled_instincts.jpg http://[server]/CFX/Controlled%20Instincts.full.jpg -controvert.jpg http://[server]/CS/Controvert.full.jpg -convalescence.jpg http://[server]/EX/Convalescence.full.jpg -convalescent_care.jpg http://[server]/ON/Convalescent%20Care.full.jpg -conversion.jpg http://[server]/4E/Conversion.full.jpg -conviction.jpg http://[server]/SH/Conviction.full.jpg -convincing_mirage.jpg http://[server]/M10/Convincing%20Mirage.full.jpg -convolute.jpg http://[server]/RAV/Convolute.full.jpg -convulsing_licid.jpg http://[server]/SH/Convulsing%20Licid.full.jpg -cooperation.jpg http://[server]/IA/Cooperation.full.jpg -coordinated_barrage.jpg http://[server]/MOR/Coordinated%20Barrage.full.jpg -copper_gnomes.jpg http://[server]/US/Copper%20Gnomes.full.jpg -copper_leaf_angel.jpg http://[server]/PY/Copper-Leaf%20Angel.full.jpg -copper_myr.jpg http://[server]/MR/Copper%20Myr.full.jpg -copper_tablet.jpg http://[server]/U/Copper%20Tablet.full.jpg -copperhoof_vorrac.jpg http://[server]/MR/Copperhoof%20Vorrac.full.jpg -copy_artifact.jpg http://[server]/U/Copy%20Artifact.full.jpg -copy_enchantment.jpg http://[server]/RAV/Copy%20Enchantment.full.jpg -coral_atoll.jpg http://[server]/VI/Coral%20Atoll.full.jpg -coral_eel.jpg http://[server]/9E/Coral%20Eel.full.jpg -coral_fighters.jpg http://[server]/MI/Coral%20Fighters.full.jpg -coral_helm.jpg http://[server]/5E/Coral%20Helm.full.jpg -coral_merfolk.jpg http://[server]/M10/Coral%20Merfolk.full.jpg -coral_net.jpg http://[server]/TO/Coral%20Net.full.jpg -coral_reef.jpg http://[server]/HL/Coral%20Reef.full.jpg -coral_trickster.jpg http://[server]/TSP/Coral%20Trickster.full.jpg -coretapper.jpg http://[server]/DS/Coretapper.full.jpg -cornered_market.jpg http://[server]/MM/Cornered%20Market.full.jpg -corpse_connoisseur.jpg http://[server]/ALA/Corpse%20Connoisseur.full.jpg -corpse_dance.jpg http://[server]/TE/Corpse%20Dance.full.jpg -corpse_harvester.jpg http://[server]/LE/Corpse%20Harvester.full.jpg -corpulent_corpse.jpg http://[server]/TSP/Corpulent%20Corpse.full.jpg -corrosion.jpg http://[server]/VI/Corrosion.full.jpg -corrosive_mentor.jpg http://[server]/SHM/Corrosive%20Mentor.full.jpg -corrupt.jpg http://[server]/7E/Corrupt.full.jpg -corrupt_court_official.jpg http://[server]/P3/Corrupt%20Court%20Official.full.jpg -corrupt_eunuchs.jpg http://[server]/P3/Corrupt%20Eunuchs.full.jpg -corrupt_official.jpg http://[server]/MM/Corrupt%20Official.full.jpg -corrupted_roots.jpg http://[server]/CFX/Corrupted%20Roots.full.jpg -corrupting_licid.jpg http://[server]/SH/Corrupting%20Licid.full.jpg -cosis_trickster.jpg http://[server]/ZEN/Cosi's%20Trickster.full.jpg -cosmic_horror.jpg http://[server]/LG/Cosmic%20Horror.full.jpg -cosmic_larva.jpg http://[server]/FD/Cosmic%20Larva.full.jpg -council_of_advisors.jpg http://[server]/P3/Council%20of%20Advisors.full.jpg -counsel_of_the_soratami.jpg http://[server]/10E/Counsel%20of%20the%20Soratami.full.jpg -counterbalance.jpg http://[server]/CS/Counterbalance.full.jpg -counterbore.jpg http://[server]/SHM/Counterbore.full.jpg -counterintelligence.jpg http://[server]/P3/Counterintelligence.full.jpg -counterspell.jpg http://[server]/7E/Counterspell.full.jpg -countersquall.jpg http://[server]/CFX/Countersquall.full.jpg -countryside_crusher.jpg http://[server]/MOR/Countryside%20Crusher.full.jpg -courier_hawk.jpg http://[server]/RAV/Courier%20Hawk.full.jpg -couriers_capsule.jpg http://[server]/ALA/Courier's%20Capsule.full.jpg -court_archers.jpg http://[server]/ALA/Court%20Archers.full.jpg -court_homunculus.jpg http://[server]/CFX/Court%20Homunculus.full.jpg -court_hussar.jpg http://[server]/DIS/Court%20Hussar.full.jpg -covenant_of_minds.jpg http://[server]/ALA/Covenant%20of%20Minds.full.jpg -cover_of_darkness.jpg http://[server]/ON/Cover%20of%20Darkness.full.jpg -cover_of_winter.jpg http://[server]/CS/Cover%20of%20Winter.full.jpg -covert_operative.jpg http://[server]/LE/Covert%20Operative.full.jpg -covetous_dragon.jpg http://[server]/UD/Covetous%20Dragon.full.jpg -cowardice.jpg http://[server]/9E/Cowardice.full.jpg -cowed_by_wisdom.jpg http://[server]/SOK/Cowed%20by%20Wisdom.full.jpg -crabapple_cohort.jpg http://[server]/SHM/Crabapple%20Cohort.full.jpg -crack_the_earth.jpg http://[server]/BOK/Crack%20the%20Earth.full.jpg -crackdown.jpg http://[server]/MM/Crackdown.full.jpg -crackleburr.jpg http://[server]/EVE/Crackleburr.full.jpg -crackling_club.jpg http://[server]/TO/Crackling%20Club.full.jpg -cradle_guard.jpg http://[server]/US/Cradle%20Guard.full.jpg -cradle_of_vitality.jpg http://[server]/ALA/Cradle%20of%20Vitality.full.jpg -cradle_to_grave.jpg http://[server]/PLC/Cradle%20to%20Grave.full.jpg -crafty_pathmage.jpg http://[server]/10E/Crafty%20Pathmage.full.jpg -crag_puca.jpg http://[server]/EVE/Crag%20Puca.full.jpg -crag_saurian.jpg http://[server]/MM/Crag%20Saurian.full.jpg -cragganwick_cremator.jpg http://[server]/SHM/Cragganwick%20Cremator.full.jpg -cranial_extraction.jpg http://[server]/CHK/Cranial%20Extraction.full.jpg -cranial_plating.jpg http://[server]/FD/Cranial%20Plating.full.jpg -crash.jpg http://[server]/MM/Crash.full.jpg -crash_landing.jpg http://[server]/GP/Crash%20Landing.full.jpg -crash_of_rhinos.jpg http://[server]/MI/Crash%20of%20Rhinos.full.jpg -crashing_boars.jpg http://[server]/BD/Crashing%20Boars.full.jpg -crashing_centaur.jpg http://[server]/OD/Crashing%20Centaur.full.jpg -crater_hellion.jpg http://[server]/US/Crater%20Hellion.full.jpg -craven_giant.jpg http://[server]/PT/Craven%20Giant.full.jpg -craven_knight.jpg http://[server]/PT/Craven%20Knight.full.jpg -craw_giant.jpg http://[server]/LG/Craw%20Giant.full.jpg -craw_wurm.jpg http://[server]/M10/Craw%20Wurm.full.jpg -crawling_filth.jpg http://[server]/BOK/Crawling%20Filth.full.jpg -crawlspace.jpg http://[server]/UL/Crawlspace.full.jpg -crazed_armodon.jpg http://[server]/TE/Crazed%20Armodon.full.jpg -crazed_firecat.jpg http://[server]/TO/Crazed%20Firecat.full.jpg -crazed_goblin.jpg http://[server]/DS/Crazed%20Goblin.full.jpg -crazed_skirge.jpg http://[server]/US/Crazed%20Skirge.full.jpg -creakwood_ghoul.jpg http://[server]/EVE/Creakwood%20Ghoul.full.jpg -creakwood_liege.jpg http://[server]/EVE/Creakwood%20Liege.full.jpg -cream_of_the_crop.jpg http://[server]/MOR/Cream%20of%20the%20Crop.full.jpg -creature_bond.jpg http://[server]/4E/Creature%20Bond.full.jpg -creature_guy.jpg http://[server]/UNH/Creature%20Guy.full.jpg -credit_voucher.jpg http://[server]/MM/Credit%20Voucher.full.jpg -creeping_mold.jpg http://[server]/10E/Creeping%20Mold.full.jpg -cremate.jpg http://[server]/IN/Cremate.full.jpg -crenellated_wall.jpg http://[server]/MM/Crenellated%20Wall.full.jpg -crested_craghorn.jpg http://[server]/LE/Crested%20Craghorn.full.jpg -crevasse.jpg http://[server]/LG/Crevasse.full.jpg -crib_swap.jpg http://[server]/LRW/Crib%20Swap.full.jpg -crimepunishment.jpg http://[server]/DIS/CrimePunishment.full.jpg -crimson_acolyte.jpg http://[server]/IN/Crimson%20Acolyte.full.jpg -crimson_hellkite.jpg http://[server]/7E/Crimson%20Hellkite.full.jpg -crimson_kobolds.jpg http://[server]/LG/Crimson%20Kobolds.full.jpg -crimson_manticore.jpg http://[server]/LG/Crimson%20Manticore.full.jpg -crimson_roc.jpg http://[server]/MI/Crimson%20Roc.full.jpg -crimson_wisps.jpg http://[server]/SHM/Crimson%20Wisps.full.jpg -crippling_fatigue.jpg http://[server]/TO/Crippling%20Fatigue.full.jpg -cromat.jpg http://[server]/AP/Cromat.full.jpg -crookclaw_elder.jpg http://[server]/LE/Crookclaw%20Elder.full.jpg -crookclaw_transmuter.jpg http://[server]/TSP/Crookclaw%20Transmuter.full.jpg -crooked_scales.jpg http://[server]/MM/Crooked%20Scales.full.jpg -crookshank_kobolds.jpg http://[server]/LG/Crookshank%20Kobolds.full.jpg -crop_rotation.jpg http://[server]/UL/Crop%20Rotation.full.jpg -crosis_the_purger.jpg http://[server]/IN/Crosis,%20the%20Purger.full.jpg -crosiss_attendant.jpg http://[server]/IN/Crosis's%20Attendant.full.jpg -crosiss_catacombs.jpg http://[server]/PS/Crosis's%20Catacombs.full.jpg -crosiss_charm.jpg http://[server]/PS/Crosis's%20Charm.full.jpg -crossbow_ambush.jpg http://[server]/SH/Crossbow%20Ambush.full.jpg -crossbow_infantry.jpg http://[server]/9E/Crossbow%20Infantry.full.jpg -crosswinds.jpg http://[server]/US/Crosswinds.full.jpg -crovax.jpg http://[server]/VG/Crovax.full.jpg -crovax_ascendant_hero.jpg http://[server]/PLC/Crovax,%20Ascendant%20Hero.full.jpg -crovax_the_cursed.jpg http://[server]/SH/Crovax%20the%20Cursed.full.jpg -crowd_favorites.jpg http://[server]/ON/Crowd%20Favorites.full.jpg -crowd_of_cinders.jpg http://[server]/SHM/Crowd%20of%20Cinders.full.jpg -crown_of_ascension.jpg http://[server]/ON/Crown%20of%20Ascension.full.jpg -crown_of_awe.jpg http://[server]/ON/Crown%20of%20Awe.full.jpg -crown_of_convergence.jpg http://[server]/RAV/Crown%20of%20Convergence.full.jpg -crown_of_flames.jpg http://[server]/IN/Crown%20of%20Flames.full.jpg -crown_of_fury.jpg http://[server]/ON/Crown%20of%20Fury.full.jpg -crown_of_suspicion.jpg http://[server]/ON/Crown%20of%20Suspicion.full.jpg -crown_of_the_ages.jpg http://[server]/IA/Crown%20of%20the%20Ages.full.jpg -crown_of_vigor.jpg http://[server]/ON/Crown%20of%20Vigor.full.jpg -crucible_of_fire.jpg http://[server]/ALA/Crucible%20of%20Fire.full.jpg -crucible_of_worlds.jpg http://[server]/10E/Crucible%20of%20Worlds.full.jpg -crude_rampart.jpg http://[server]/ON/Crude%20Rampart.full.jpg -cruel_bargain.jpg http://[server]/PT/Cruel%20Bargain.full.jpg -cruel_deceiver.jpg http://[server]/CHK/Cruel%20Deceiver.full.jpg -cruel_edict.jpg http://[server]/10E/Cruel%20Edict.full.jpg -cruel_fate.jpg http://[server]/PT/Cruel%20Fate.full.jpg -cruel_revival.jpg http://[server]/ON/Cruel%20Revival.full.jpg -cruel_tutor.jpg http://[server]/PT/Cruel%20Tutor.full.jpg -cruel_ultimatum.jpg http://[server]/ALA/Cruel%20Ultimatum.full.jpg -crumble.jpg http://[server]/5E/Crumble.full.jpg -crumbling_ashes.jpg http://[server]/EVE/Crumbling%20Ashes.full.jpg -crumbling_necropolis.jpg http://[server]/ALA/Crumbling%20Necropolis.full.jpg -crumbling_sanctuary.jpg http://[server]/MM/Crumbling%20Sanctuary.full.jpg -crusade.jpg http://[server]/6E/Crusade.full.jpg -crusading_knight.jpg http://[server]/IN/Crusading%20Knight.full.jpg -crush_of_wurms.jpg http://[server]/JU/Crush%20of%20Wurms.full.jpg -crush_underfoot.jpg http://[server]/LRW/Crush%20Underfoot.full.jpg -crushing_pain.jpg http://[server]/CHK/Crushing%20Pain.full.jpg -cry_of_contrition.jpg http://[server]/GP/Cry%20of%20Contrition.full.jpg -cryoclasm.jpg http://[server]/10E/Cryoclasm.full.jpg -crypt_angel.jpg http://[server]/IN/Crypt%20Angel.full.jpg -crypt_champion.jpg http://[server]/DIS/Crypt%20Champion.full.jpg -crypt_cobra.jpg http://[server]/MI/Crypt%20Cobra.full.jpg -crypt_creeper.jpg http://[server]/OD/Crypt%20Creeper.full.jpg -crypt_of_agadeem.jpg http://[server]/ZEN/Crypt%20of%20Agadeem.full.jpg -crypt_rats.jpg http://[server]/7E/Crypt%20Rats.full.jpg -crypt_ripper.jpg http://[server]/ZEN/Crypt%20Ripper.full.jpg -crypt_sliver.jpg http://[server]/LE/Crypt%20Sliver.full.jpg -cryptic_annelid.jpg http://[server]/FUT/Cryptic%20Annelid.full.jpg -cryptic_command.jpg http://[server]/LRW/Cryptic%20Command.full.jpg -cryptic_gateway.jpg http://[server]/ON/Cryptic%20Gateway.full.jpg -cryptwailing.jpg http://[server]/GP/Cryptwailing.full.jpg -crystal_chimes.jpg http://[server]/US/Crystal%20Chimes.full.jpg -crystal_golem.jpg http://[server]/MI/Crystal%20Golem.full.jpg -crystal_quarry.jpg http://[server]/OD/Crystal%20Quarry.full.jpg -crystal_rod.jpg http://[server]/8E/Crystal%20Rod.full.jpg -crystal_seer.jpg http://[server]/GP/Crystal%20Seer.full.jpg -crystal_shard.jpg http://[server]/MR/Crystal%20Shard.full.jpg -crystal_spray.jpg http://[server]/IN/Crystal%20Spray.full.jpg -crystal_vein.jpg http://[server]/MI/Crystal%20Vein.full.jpg -crystalline_sliver.jpg http://[server]/SH/Crystalline%20Sliver.full.jpg -crystallization.jpg http://[server]/ARB/Crystallization.full.jpg -cudgel_troll.jpg http://[server]/M10/Cudgel%20Troll.full.jpg -culling_scales.jpg http://[server]/MR/Culling%20Scales.full.jpg -culling_sun.jpg http://[server]/GP/Culling%20Sun.full.jpg -culling_the_weak.jpg http://[server]/EX/Culling%20the%20Weak.full.jpg -cultbrand_cinder.jpg http://[server]/SHM/Cultbrand%20Cinder.full.jpg -cultural_exchange.jpg http://[server]/OD/Cultural%20Exchange.full.jpg -cumber_stone.jpg http://[server]/CFX/Cumber%20Stone.full.jpg -cunning.jpg http://[server]/EX/Cunning.full.jpg -cunning_advisor.jpg http://[server]/P3/Cunning%20Advisor.full.jpg -cunning_bandit.jpg http://[server]/BOK/Cunning%20Bandit.full.jpg -cunning_giant.jpg http://[server]/P2/Cunning%20Giant.full.jpg -cunning_lethemancer.jpg http://[server]/ALA/Cunning%20Lethemancer.full.jpg -cunning_wish.jpg http://[server]/JGC/Cunning%20Wish.full.jpg -cuombajj_witches.jpg http://[server]/CH/Cuombajj%20Witches.full.jpg -curfew.jpg http://[server]/US/Curfew.full.jpg -curiosity.jpg http://[server]/8E/Curiosity.full.jpg -curse_artifact.jpg http://[server]/DK/Curse%20Artifact.full.jpg -curse_of_chains.jpg http://[server]/SHM/Curse%20of%20Chains.full.jpg -curse_of_marit_lage.jpg http://[server]/IA/Curse%20of%20Marit%20Lage.full.jpg -curse_of_the_cabal.jpg http://[server]/TSP/Curse%20of%20the%20Cabal.full.jpg -curse_of_the_fire_penguin.jpg http://[server]/UNH/Curse%20of%20the%20Fire%20Penguin.full.jpg -cursecatcher.jpg http://[server]/SHM/Cursecatcher.full.jpg -cursed_flesh.jpg http://[server]/IN/Cursed%20Flesh.full.jpg -cursed_land.jpg http://[server]/5E/Cursed%20Land.full.jpg -cursed_monstrosity.jpg http://[server]/OD/Cursed%20Monstrosity.full.jpg -cursed_rack.jpg http://[server]/AQ/Cursed%20Rack.full.jpg -cursed_ronin.jpg http://[server]/CHK/Cursed%20Ronin.full.jpg -cursed_scroll.jpg http://[server]/TE/Cursed%20Scroll.full.jpg -cursed_totem.jpg http://[server]/MI/Cursed%20Totem.full.jpg -curtain_of_light.jpg http://[server]/SOK/Curtain%20of%20Light.full.jpg -custody_battle.jpg http://[server]/ON/Custody%20Battle.full.jpg -customs_depot.jpg http://[server]/MM/Customs%20Depot.full.jpg -cut_the_earthly_bond.jpg http://[server]/SOK/Cut%20the%20Earthly%20Bond.full.jpg -cut_the_tethers.jpg http://[server]/CHK/Cut%20the%20Tethers.full.jpg -cutthroat_il_dal.jpg http://[server]/FUT/Cutthroat%20il-Dal.full.jpg -cycle_of_life.jpg http://[server]/MI/Cycle%20of%20Life.full.jpg -cyclical_evolution.jpg http://[server]/FUT/Cyclical%20Evolution.full.jpg -cyclone.jpg http://[server]/CH/Cyclone.full.jpg -cyclopean_giant.jpg http://[server]/TSP/Cyclopean%20Giant.full.jpg -cyclopean_mummy.jpg http://[server]/LG/Cyclopean%20Mummy.full.jpg -cyclopean_snare.jpg http://[server]/RAV/Cyclopean%20Snare.full.jpg -cyclopean_tomb.jpg http://[server]/U/Cyclopean%20Tomb.full.jpg -cylian_elf.jpg http://[server]/ALA/Cylian%20Elf.full.jpg -cylian_sunsinger.jpg http://[server]/CFX/Cylian%20Sunsinger.full.jpg -cytoplast_manipulator.jpg http://[server]/DIS/Cytoplast%20Manipulator.full.jpg -cytoplast_root_kin.jpg http://[server]/DIS/Cytoplast%20Root-Kin.full.jpg -cytoshape.jpg http://[server]/DIS/Cytoshape.full.jpg -cytospawn_shambler.jpg http://[server]/DIS/Cytospawn%20Shambler.full.jpg \ No newline at end of file diff --git a/res/pics_link/card-pictures_d.txt b/res/pics_link/card-pictures_d.txt deleted file mode 100644 index 5c2de64a6e7..00000000000 --- a/res/pics_link/card-pictures_d.txt +++ /dev/null @@ -1,623 +0,0 @@ -daggerclaw_imp.jpg http://[server]/GP/Daggerclaw%20Imp.full.jpg -daily_regimen.jpg http://[server]/MOR/Daily%20Regimen.full.jpg -dakkon_blackblade.jpg http://[server]/LG/Dakkon%20Blackblade.full.jpg -dakmor_bat.jpg http://[server]/P2/Dakmor%20Bat.full.jpg -dakmor_ghoul.jpg http://[server]/ST/Dakmor%20Ghoul.full.jpg -dakmor_lancer.jpg http://[server]/7E/Dakmor%20Lancer.full.jpg -dakmor_plague.jpg http://[server]/ST/Dakmor%20Plague.full.jpg -dakmor_salvage.jpg http://[server]/FUT/Dakmor%20Salvage.full.jpg -dakmor_scorpion.jpg http://[server]/ST/Dakmor%20Scorpion.full.jpg -dakmor_sorceress.jpg http://[server]/ST/Dakmor%20Sorceress.full.jpg -damnation.jpg http://[server]/PLC/Damnation.full.jpg -dampen_thought.jpg http://[server]/CHK/Dampen%20Thought.full.jpg -damping_engine.jpg http://[server]/UL/Damping%20Engine.full.jpg -damping_field.jpg http://[server]/AQ/Damping%20Field.full.jpg -damping_matrix.jpg http://[server]/MR/Damping%20Matrix.full.jpg -dance_of_many.jpg http://[server]/CH/Dance%20of%20Many.full.jpg -dance_of_shadows.jpg http://[server]/CHK/Dance%20of%20Shadows.full.jpg -dance_of_the_dead.jpg http://[server]/IA/Dance%20of%20the%20Dead.full.jpg -dancing_scimitar.jpg http://[server]/9E/Dancing%20Scimitar.full.jpg -dandan.jpg http://[server]/5E/Dandan.full.jpg -daraja_griffin.jpg http://[server]/6E/Daraja%20Griffin.full.jpg -darba.jpg http://[server]/PY/Darba.full.jpg -darien_king_of_kjeldor.jpg http://[server]/CS/Darien,%20King%20of%20Kjeldor.full.jpg -darigaaz_the_igniter.jpg http://[server]/IN/Darigaaz,%20the%20Igniter.full.jpg -darigaazs_attendant.jpg http://[server]/IN/Darigaaz's%20Attendant.full.jpg -darigaazs_caldera.jpg http://[server]/PS/Darigaaz's%20Caldera.full.jpg -darigaazs_charm.jpg http://[server]/PS/Darigaaz's%20Charm.full.jpg -daring_apprentice.jpg http://[server]/9E/Daring%20Apprentice.full.jpg -daring_leap.jpg http://[server]/PS/Daring%20Leap.full.jpg -dark_banishing.jpg http://[server]/9E/Dark%20Banishing.full.jpg -dark_confidant.jpg http://[server]/RAV/Dark%20Confidant.full.jpg -dark_depths.jpg http://[server]/CS/Dark%20Depths.full.jpg -dark_hatchling.jpg http://[server]/US/Dark%20Hatchling.full.jpg -dark_heart_of_the_wood.jpg http://[server]/DK/Dark%20Heart%20of%20the%20Wood.full.jpg -dark_maze.jpg http://[server]/5E/Dark%20Maze.full.jpg -dark_offering.jpg http://[server]/ST/Dark%20Offering.full.jpg -dark_privilege.jpg http://[server]/VI/Dark%20Privilege.full.jpg -dark_ritual.jpg http://[server]/5E/Dark%20Ritual.full.jpg -dark_sphere.jpg http://[server]/DK/Dark%20Sphere.full.jpg -dark_supplicant.jpg http://[server]/LE/Dark%20Supplicant.full.jpg -dark_suspicions.jpg http://[server]/PS/Dark%20Suspicions.full.jpg -dark_temper.jpg http://[server]/CFX/Dark%20Temper.full.jpg -dark_triumph.jpg http://[server]/NE/Dark%20Triumph.full.jpg -dark_withering.jpg http://[server]/TSP/Dark%20Withering.full.jpg -darkblast.jpg http://[server]/RAV/Darkblast.full.jpg -darkest_hour.jpg http://[server]/7E/Darkest%20Hour.full.jpg -darkheart_sliver.jpg http://[server]/PLC/Darkheart%20Sliver.full.jpg -darkling_stalker.jpg http://[server]/TE/Darkling%20Stalker.full.jpg -darklit_gargoyle.jpg http://[server]/CFX/Darklit%20Gargoyle.full.jpg -darkness.jpg http://[server]/LG/Darkness.full.jpg -darkpact.jpg http://[server]/U/Darkpact.full.jpg -darksteel_brute.jpg http://[server]/DS/Darksteel%20Brute.full.jpg -darksteel_citadel.jpg http://[server]/DS/Darksteel%20Citadel.full.jpg -darksteel_colossus.jpg http://[server]/M10/Darksteel%20Colossus.full.jpg -darksteel_forge.jpg http://[server]/DS/Darksteel%20Forge.full.jpg -darksteel_gargoyle.jpg http://[server]/DS/Darksteel%20Gargoyle.full.jpg -darksteel_garrison.jpg http://[server]/FUT/Darksteel%20Garrison.full.jpg -darksteel_ingot.jpg http://[server]/DS/Darksteel%20Ingot.full.jpg -darksteel_pendant.jpg http://[server]/DS/Darksteel%20Pendant.full.jpg -darksteel_reactor.jpg http://[server]/DS/Darksteel%20Reactor.full.jpg -darkwatch_elves.jpg http://[server]/UL/Darkwatch%20Elves.full.jpg -darkwater_catacombs.jpg http://[server]/OD/Darkwater%20Catacombs.full.jpg -darkwater_egg.jpg http://[server]/OD/Darkwater%20Egg.full.jpg -darting_merfolk.jpg http://[server]/MM/Darting%20Merfolk.full.jpg -daru_cavalier.jpg http://[server]/ON/Daru%20Cavalier.full.jpg -daru_encampment.jpg http://[server]/ON/Daru%20Encampment.full.jpg -daru_healer.jpg http://[server]/ON/Daru%20Healer.full.jpg -daru_lancer.jpg http://[server]/ON/Daru%20Lancer.full.jpg -daru_mender.jpg http://[server]/LE/Daru%20Mender.full.jpg -daru_sanctifier.jpg http://[server]/LE/Daru%20Sanctifier.full.jpg -daru_spiritualist.jpg http://[server]/SC/Daru%20Spiritualist.full.jpg -daru_stinger.jpg http://[server]/LE/Daru%20Stinger.full.jpg -daru_warchief.jpg http://[server]/SC/Daru%20Warchief.full.jpg -dash_hopes.jpg http://[server]/PLC/Dash%20Hopes.full.jpg -daughter_of_autumn.jpg http://[server]/HL/Daughter%20of%20Autumn.full.jpg -daunting_defender.jpg http://[server]/ON/Daunting%20Defender.full.jpg -dauntless_dourbark.jpg http://[server]/LRW/Dauntless%20Dourbark.full.jpg -dauntless_escort.jpg http://[server]/ARB/Dauntless%20Escort.full.jpg -dauthi_cutthroat.jpg http://[server]/EX/Dauthi%20Cutthroat.full.jpg -dauthi_embrace.jpg http://[server]/TE/Dauthi%20Embrace.full.jpg -dauthi_ghoul.jpg http://[server]/TE/Dauthi%20Ghoul.full.jpg -dauthi_horror.jpg http://[server]/TE/Dauthi%20Horror.full.jpg -dauthi_jackal.jpg http://[server]/EX/Dauthi%20Jackal.full.jpg -dauthi_marauder.jpg http://[server]/TE/Dauthi%20Marauder.full.jpg -dauthi_mercenary.jpg http://[server]/TE/Dauthi%20Mercenary.full.jpg -dauthi_mindripper.jpg http://[server]/TE/Dauthi%20Mindripper.full.jpg -dauthi_slayer.jpg http://[server]/TE/Dauthi%20Slayer.full.jpg -dauthi_trapper.jpg http://[server]/SH/Dauthi%20Trapper.full.jpg -dauthi_warlord.jpg http://[server]/EX/Dauthi%20Warlord.full.jpg -davenant_archer.jpg http://[server]/LG/D'Avenant%20Archer.full.jpg -davenant_healer.jpg http://[server]/TSP/D'Avenant%20Healer.full.jpg -dawn_charm.jpg http://[server]/PLC/Dawn%20Charm.full.jpg -dawn_elemental.jpg http://[server]/SC/Dawn%20Elemental.full.jpg -dawn_of_the_dead.jpg http://[server]/TO/Dawn%20of%20the%20Dead.full.jpg -dawnfluke.jpg http://[server]/LRW/Dawnfluke.full.jpg -dawnglow_infusion.jpg http://[server]/SHM/Dawnglow%20Infusion.full.jpg -dawning_purist.jpg http://[server]/ON/Dawning%20Purist.full.jpg -dawnray_archer.jpg http://[server]/ALA/Dawnray%20Archer.full.jpg -dawns_reflection.jpg http://[server]/FD/Dawn's%20Reflection.full.jpg -dawnstrider.jpg http://[server]/MM/Dawnstrider.full.jpg -day_of_destiny.jpg http://[server]/BOK/Day%20of%20Destiny.full.jpg -day_of_judgment.jpg http://[server]/ZEN/Day%20of%20Judgment.full.jpg -day_of_the_dragons.jpg http://[server]/SC/Day%20of%20the%20Dragons.full.jpg -daybreak_coronet.jpg http://[server]/FUT/Daybreak%20Coronet.full.jpg -daze.jpg http://[server]/NE/Daze.full.jpg -dazzling_beauty.jpg http://[server]/MI/Dazzling%20Beauty.full.jpg -dead_iron_sledge.jpg http://[server]/MR/Dead-Iron%20Sledge.full.jpg -dead_ringers.jpg http://[server]/AP/Dead%20Ringers.full.jpg -deadapult.jpg http://[server]/PS/Deadapult.full.jpg -deadfall.jpg http://[server]/LG/Deadfall.full.jpg -deadgone.jpg http://[server]/PLC/Deadgone.full.jpg -deadhead.jpg http://[server]/UG/Deadhead.full.jpg -deadly_grub.jpg http://[server]/PLC/Deadly%20Grub.full.jpg -deadly_insect.jpg http://[server]/MM/Deadly%20Insect.full.jpg -deadly_recluse.jpg http://[server]/M10/Deadly%20Recluse.full.jpg -deadshot.jpg http://[server]/TE/Deadshot.full.jpg -deadshot_minotaur.jpg http://[server]/ARB/Deadshot%20Minotaur.full.jpg -deadwood_treefolk.jpg http://[server]/PLC/Deadwood%20Treefolk.full.jpg -deal_damage.jpg http://[server]/UNH/Deal%20Damage.full.jpg -death_baron.jpg http://[server]/ALA/Death%20Baron.full.jpg -death_bomb.jpg http://[server]/PS/Death%20Bomb.full.jpg -death_charmer.jpg http://[server]/PY/Death%20Charmer.full.jpg -death_cloud.jpg http://[server]/DS/Death%20Cloud.full.jpg -death_denied.jpg http://[server]/SOK/Death%20Denied.full.jpg -death_grasp.jpg http://[server]/AP/Death%20Grasp.full.jpg -death_mask_duplicant.jpg http://[server]/DS/Death-Mask%20Duplicant.full.jpg -death_match.jpg http://[server]/ON/Death%20Match.full.jpg -death_mutation.jpg http://[server]/AP/Death%20Mutation.full.jpg -death_of_a_thousand_stings.jpg http://[server]/SOK/Death%20of%20a%20Thousand%20Stings.full.jpg -death_or_glory.jpg http://[server]/IN/Death%20or%20Glory.full.jpg -death_pit_offering.jpg http://[server]/8E/Death%20Pit%20Offering.full.jpg -death_pits_of_rath.jpg http://[server]/9E/Death%20Pits%20of%20Rath.full.jpg -death_pulse.jpg http://[server]/ON/Death%20Pulse.full.jpg -death_rattle.jpg http://[server]/FUT/Death%20Rattle.full.jpg -death_spark.jpg http://[server]/AL/Death%20Spark.full.jpg -death_speakers.jpg http://[server]/HL/Death%20Speakers.full.jpg -death_stroke.jpg http://[server]/SH/Death%20Stroke.full.jpg -death_ward.jpg http://[server]/5E/Death%20Ward.full.jpg -death_watch.jpg http://[server]/VI/Death%20Watch.full.jpg -death_wish.jpg http://[server]/JU/Death%20Wish.full.jpg -deathbringer_liege.jpg http://[server]/EVE/Deathbringer%20Liege.full.jpg -deathbringer_thoctar.jpg http://[server]/ARB/Deathbringer%20Thoctar.full.jpg -deathcoil_wurm.jpg http://[server]/P2/Deathcoil%20Wurm.full.jpg -deathcurse_ogre.jpg http://[server]/CHK/Deathcurse%20Ogre.full.jpg -deathgazer.jpg http://[server]/9E/Deathgazer.full.jpg -deathgreeter.jpg http://[server]/ALA/Deathgreeter.full.jpg -deathgrip.jpg http://[server]/5E/Deathgrip.full.jpg -deathknell_kami.jpg http://[server]/SOK/Deathknell%20Kami.full.jpg -deathlace.jpg http://[server]/4E/Deathlace.full.jpg -deathmark.jpg http://[server]/M10/Deathmark.full.jpg -deathmark_prelate.jpg http://[server]/LE/Deathmark%20Prelate.full.jpg -deathmask_nezumi.jpg http://[server]/SOK/Deathmask%20Nezumi.full.jpg -deathrender.jpg http://[server]/LRW/Deathrender.full.jpg -deaths_duet.jpg http://[server]/EX/Death's%20Duet.full.jpg -deaths_head_buzzard.jpg http://[server]/SC/Death's-Head%20Buzzard.full.jpg -deathspore_thallid.jpg http://[server]/TSP/Deathspore%20Thallid.full.jpg -debt_of_loyalty.jpg http://[server]/WL/Debt%20of%20Loyalty.full.jpg -debtors_knell.jpg http://[server]/GP/Debtors'%20Knell.full.jpg -decaying_soil.jpg http://[server]/OD/Decaying%20Soil.full.jpg -deception.jpg http://[server]/P3/Deception.full.jpg -decimate.jpg http://[server]/OD/Decimate.full.jpg -declaration_of_naught.jpg http://[server]/MOR/Declaration%20of%20Naught.full.jpg -decompose.jpg http://[server]/OD/Decompose.full.jpg -decomposition.jpg http://[server]/MI/Decomposition.full.jpg -deconstruct.jpg http://[server]/MR/Deconstruct.full.jpg -decree_of_annihilation.jpg http://[server]/SC/Decree%20of%20Annihilation.full.jpg -decree_of_justice.jpg http://[server]/SC/Decree%20of%20Justice.full.jpg -decree_of_pain.jpg http://[server]/SC/Decree%20of%20Pain.full.jpg -decree_of_savagery.jpg http://[server]/SC/Decree%20of%20Savagery.full.jpg -decree_of_silence.jpg http://[server]/SC/Decree%20of%20Silence.full.jpg -dedicated_martyr.jpg http://[server]/OD/Dedicated%20Martyr.full.jpg -deep_analysis.jpg http://[server]/TO/Deep%20Analysis.full.jpg -deep_reconnaissance.jpg http://[server]/OD/Deep%20Reconnaissance.full.jpg -deep_sea_kraken.jpg http://[server]/TSP/Deep-Sea%20Kraken.full.jpg -deep_sea_serpent.jpg http://[server]/PT/Deep-Sea%20Serpent.full.jpg -deep_slumber_titan.jpg http://[server]/SHM/Deep-Slumber%20Titan.full.jpg -deep_spawn.jpg http://[server]/FE/Deep%20Spawn.full.jpg -deep_water.jpg http://[server]/DK/Deep%20Water.full.jpg -deep_wood.jpg http://[server]/PT/Deep%20Wood.full.jpg -deepcavern_imp.jpg http://[server]/FUT/Deepcavern%20Imp.full.jpg -deepchannel_mentor.jpg http://[server]/SHM/Deepchannel%20Mentor.full.jpg -deepfire_elemental.jpg http://[server]/CS/Deepfire%20Elemental.full.jpg -deeptread_merrow.jpg http://[server]/LRW/Deeptread%20Merrow.full.jpg -deepwood_drummer.jpg http://[server]/MM/Deepwood%20Drummer.full.jpg -deepwood_elder.jpg http://[server]/MM/Deepwood%20Elder.full.jpg -deepwood_ghoul.jpg http://[server]/8E/Deepwood%20Ghoul.full.jpg -deepwood_legate.jpg http://[server]/MM/Deepwood%20Legate.full.jpg -deepwood_tantiv.jpg http://[server]/MM/Deepwood%20Tantiv.full.jpg -deepwood_wolverine.jpg http://[server]/MM/Deepwood%20Wolverine.full.jpg -defender_en_vec.jpg http://[server]/NE/Defender%20en-Vec.full.jpg -defender_of_chaos.jpg http://[server]/UL/Defender%20of%20Chaos.full.jpg -defender_of_law.jpg http://[server]/UL/Defender%20of%20Law.full.jpg -defender_of_the_order.jpg http://[server]/LE/Defender%20of%20the%20Order.full.jpg -defense_grid.jpg http://[server]/9E/Defense%20Grid.full.jpg -defense_of_the_heart.jpg http://[server]/UL/Defense%20of%20the%20Heart.full.jpg -defensive_formation.jpg http://[server]/US/Defensive%20Formation.full.jpg -defensive_maneuvers.jpg http://[server]/ON/Defensive%20Maneuvers.full.jpg -defiant_elf.jpg http://[server]/LE/Defiant%20Elf.full.jpg -defiant_falcon.jpg http://[server]/NE/Defiant%20Falcon.full.jpg -defiant_stand.jpg http://[server]/PT/Defiant%20Stand.full.jpg -defiant_vanguard.jpg http://[server]/NE/Defiant%20Vanguard.full.jpg -defiler_of_souls.jpg http://[server]/ARB/Defiler%20of%20Souls.full.jpg -defiling_tears.jpg http://[server]/IN/Defiling%20Tears.full.jpg -deflection.jpg http://[server]/8E/Deflection.full.jpg -deft_duelist.jpg http://[server]/ALA/Deft%20Duelist.full.jpg -deftblade_elite.jpg http://[server]/LE/Deftblade%20Elite.full.jpg -defy_gravity.jpg http://[server]/JU/Defy%20Gravity.full.jpg -dega_disciple.jpg http://[server]/AP/Dega%20Disciple.full.jpg -dega_sanctuary.jpg http://[server]/AP/Dega%20Sanctuary.full.jpg -degavolver.jpg http://[server]/AP/Degavolver.full.jpg -deglamer.jpg http://[server]/MOR/Deglamer.full.jpg -dehydration.jpg http://[server]/10E/Dehydration.full.jpg -deity_of_scars.jpg http://[server]/EVE/Deity%20of%20Scars.full.jpg -deja_vu.jpg http://[server]/PT/Deja%20Vu.full.jpg -delay.jpg http://[server]/FUT/Delay.full.jpg -delaying_shield.jpg http://[server]/OD/Delaying%20Shield.full.jpg -delifs_cone.jpg http://[server]/FE/Delif's%20Cone.full.jpg -delifs_cube.jpg http://[server]/FE/Delif's%20Cube.full.jpg -delirium.jpg http://[server]/MI/Delirium.full.jpg -delirium_skeins.jpg http://[server]/DIS/Delirium%20Skeins.full.jpg -delraich.jpg http://[server]/MM/Delraich.full.jpg -deluge.jpg http://[server]/10E/Deluge.full.jpg -delusions_of_mediocrity.jpg http://[server]/7E/Delusions%20of%20Mediocrity.full.jpg -dematerialize.jpg http://[server]/OD/Dematerialize.full.jpg -dementia_sliver.jpg http://[server]/TSP/Dementia%20Sliver.full.jpg -demigod_of_revenge.jpg http://[server]/SHM/Demigod%20of%20Revenge.full.jpg -demolish.jpg http://[server]/10E/Demolish.full.jpg -demonfire.jpg http://[server]/DIS/Demonfire.full.jpg -demonic_attorney.jpg http://[server]/U/Demonic%20Attorney.full.jpg -demonic_collusion.jpg http://[server]/TSP/Demonic%20Collusion.full.jpg -demonic_consultation.jpg http://[server]/IA/Demonic%20Consultation.full.jpg -demonic_dread.jpg http://[server]/ARB/Demonic%20Dread.full.jpg -demonic_hordes.jpg http://[server]/U/Demonic%20Hordes.full.jpg -demonic_torment.jpg http://[server]/LG/Demonic%20Torment.full.jpg -demonic_tutor.jpg http://[server]/U/Demonic%20Tutor.full.jpg -demons_herald.jpg http://[server]/ALA/Demon's%20Herald.full.jpg -demons_horn.jpg http://[server]/M10/Demon's%20Horn.full.jpg -demons_jester.jpg http://[server]/DIS/Demon's%20Jester.full.jpg -demonspine_whip.jpg http://[server]/ARB/Demonspine%20Whip.full.jpg -demoralize.jpg http://[server]/OD/Demoralize.full.jpg -demystify.jpg http://[server]/10E/Demystify.full.jpg -denied!.jpg http://[server]/UG/Denied!.full.jpg -denizen_of_the_deep.jpg http://[server]/10E/Denizen%20of%20the%20Deep.full.jpg -dense_canopy.jpg http://[server]/SOK/Dense%20Canopy.full.jpg -dense_foliage.jpg http://[server]/6E/Dense%20Foliage.full.jpg -deny_reality.jpg http://[server]/ARB/Deny%20Reality.full.jpg -denying_wind.jpg http://[server]/PY/Denying%20Wind.full.jpg -deranged_hermit.jpg http://[server]/UL/Deranged%20Hermit.full.jpg -derelor.jpg http://[server]/6E/Derelor.full.jpg -dermoplasm.jpg http://[server]/LE/Dermoplasm.full.jpg -descendant_of_kiyomaro.jpg http://[server]/SOK/Descendant%20of%20Kiyomaro.full.jpg -descendant_of_masumaro.jpg http://[server]/SOK/Descendant%20of%20Masumaro.full.jpg -descendant_of_soramaro.jpg http://[server]/SOK/Descendant%20of%20Soramaro.full.jpg -desecrated_earth.jpg http://[server]/ZEN/Desecrated%20Earth.full.jpg -desecration_elemental.jpg http://[server]/FD/Desecration%20Elemental.full.jpg -desecrator_hag.jpg http://[server]/EVE/Desecrator%20Hag.full.jpg -desert.jpg http://[server]/AN/Desert.full.jpg -desert_drake.jpg http://[server]/PT/Desert%20Drake.full.jpg -desert_nomads.jpg http://[server]/AN/Desert%20Nomads.full.jpg -desert_sandstorm.jpg http://[server]/P3/Desert%20Sandstorm.full.jpg -desert_twister.jpg http://[server]/5E/Desert%20Twister.full.jpg -deserted_temple.jpg http://[server]/OD/Deserted%20Temple.full.jpg -desertion.jpg http://[server]/6E/Desertion.full.jpg -desolation.jpg http://[server]/VI/Desolation.full.jpg -desolation_angel.jpg http://[server]/AP/Desolation%20Angel.full.jpg -desolation_giant.jpg http://[server]/AP/Desolation%20Giant.full.jpg -desperate_charge.jpg http://[server]/P3/Desperate%20Charge.full.jpg -desperate_gambit.jpg http://[server]/WL/Desperate%20Gambit.full.jpg -desperate_research.jpg http://[server]/IN/Desperate%20Research.full.jpg -desperate_ritual.jpg http://[server]/CHK/Desperate%20Ritual.full.jpg -despoil.jpg http://[server]/PY/Despoil.full.jpg -despondency.jpg http://[server]/US/Despondency.full.jpg -despotic_scepter.jpg http://[server]/IA/Despotic%20Scepter.full.jpg -destructive_flow.jpg http://[server]/PS/Destructive%20Flow.full.jpg -destructive_urge.jpg http://[server]/US/Destructive%20Urge.full.jpg -detainment_spell.jpg http://[server]/TSP/Detainment%20Spell.full.jpg -detonate.jpg http://[server]/5E/Detonate.full.jpg -detritivore.jpg http://[server]/PLC/Detritivore.full.jpg -deus_of_calamity.jpg http://[server]/SHM/Deus%20of%20Calamity.full.jpg -devastate.jpg http://[server]/PY/Devastate.full.jpg -devastating_dreams.jpg http://[server]/TO/Devastating%20Dreams.full.jpg -devastation.jpg http://[server]/ST/Devastation.full.jpg -devoted_caretaker.jpg http://[server]/OD/Devoted%20Caretaker.full.jpg -devoted_druid.jpg http://[server]/SHM/Devoted%20Druid.full.jpg -devoted_hero.jpg http://[server]/ST/Devoted%20Hero.full.jpg -devoted_retainer.jpg http://[server]/CHK/Devoted%20Retainer.full.jpg -devour_in_shadow.jpg http://[server]/FD/Devour%20in%20Shadow.full.jpg -devouring_deep.jpg http://[server]/LG/Devouring%20Deep.full.jpg -devouring_greed.jpg http://[server]/CHK/Devouring%20Greed.full.jpg -devouring_light.jpg http://[server]/RAV/Devouring%20Light.full.jpg -devouring_rage.jpg http://[server]/CHK/Devouring%20Rage.full.jpg -devouring_strossus.jpg http://[server]/IN/Devouring%20Strossus.full.jpg -devout_harpist.jpg http://[server]/UL/Devout%20Harpist.full.jpg -devout_lightcaster.jpg http://[server]/ZEN/Devout%20Lightcaster.full.jpg -devout_monk.jpg http://[server]/ST/Devout%20Monk.full.jpg -devout_witness.jpg http://[server]/MM/Devout%20Witness.full.jpg -dewdrop_spy.jpg http://[server]/MOR/Dewdrop%20Spy.full.jpg -diabolic_edict.jpg http://[server]/TE/Diabolic%20Edict.full.jpg -diabolic_intent.jpg http://[server]/PS/Diabolic%20Intent.full.jpg -diabolic_machine.jpg http://[server]/5E/Diabolic%20Machine.full.jpg -diabolic_servitude.jpg http://[server]/US/Diabolic%20Servitude.full.jpg -diabolic_tutor.jpg http://[server]/M10/Diabolic%20Tutor.full.jpg -diabolic_vision.jpg http://[server]/IA/Diabolic%20Vision.full.jpg -diamond_faerie.jpg http://[server]/CS/Diamond%20Faerie.full.jpg -diamond_kaleidoscope.jpg http://[server]/VI/Diamond%20Kaleidoscope.full.jpg -diamond_valley.jpg http://[server]/AN/Diamond%20Valley.full.jpg -diaochan_artful_beauty.jpg http://[server]/P3/Diaochan,%20Artful%20Beauty.full.jpg -dichotomancy.jpg http://[server]/PLC/Dichotomancy.full.jpg -didgeridoo.jpg http://[server]/HL/Didgeridoo.full.jpg -diligent_farmhand.jpg http://[server]/OD/Diligent%20Farmhand.full.jpg -dimensional_breach.jpg http://[server]/SC/Dimensional%20Breach.full.jpg -diminishing_returns.jpg http://[server]/6E/Diminishing%20Returns.full.jpg -dimir_aqueduct.jpg http://[server]/RAV/Dimir%20Aqueduct.full.jpg -dimir_cutpurse.jpg http://[server]/RAV/Dimir%20Cutpurse.full.jpg -dimir_doppelganger.jpg http://[server]/RAV/Dimir%20Doppelganger.full.jpg -dimir_guildmage.jpg http://[server]/RAV/Dimir%20Guildmage.full.jpg -dimir_house_guard.jpg http://[server]/RAV/Dimir%20House%20Guard.full.jpg -dimir_infiltrator.jpg http://[server]/RAV/Dimir%20Infiltrator.full.jpg -dimir_machinations.jpg http://[server]/RAV/Dimir%20Machinations.full.jpg -dimir_signet.jpg http://[server]/RAV/Dimir%20Signet.full.jpg -din_of_the_fireherd.jpg http://[server]/SHM/Din%20of%20the%20Fireherd.full.jpg -dingus_egg.jpg http://[server]/8E/Dingus%20Egg.full.jpg -dingus_staff.jpg http://[server]/WL/Dingus%20Staff.full.jpg -diplomatic_escort.jpg http://[server]/MM/Diplomatic%20Escort.full.jpg -diplomatic_immunity.jpg http://[server]/MM/Diplomatic%20Immunity.full.jpg -dire_undercurrents.jpg http://[server]/SHM/Dire%20Undercurrents.full.jpg -dire_wolves.jpg http://[server]/IA/Dire%20Wolves.full.jpg -dirge_of_dread.jpg http://[server]/ON/Dirge%20of%20Dread.full.jpg -dirtcowl_wurm.jpg http://[server]/TE/Dirtcowl%20Wurm.full.jpg -dirtwater_wraith.jpg http://[server]/MI/Dirtwater%20Wraith.full.jpg -dirty_wererat.jpg http://[server]/OD/Dirty%20Wererat.full.jpg -disappear.jpg http://[server]/UD/Disappear.full.jpg -disarm.jpg http://[server]/MR/Disarm.full.jpg -disciple_of_grace.jpg http://[server]/ON/Disciple%20of%20Grace.full.jpg -disciple_of_kangee.jpg http://[server]/PS/Disciple%20of%20Kangee.full.jpg -disciple_of_law.jpg http://[server]/US/Disciple%20of%20Law.full.jpg -disciple_of_malice.jpg http://[server]/ON/Disciple%20of%20Malice.full.jpg -disciple_of_tevesh_szat.jpg http://[server]/CS/Disciple%20of%20Tevesh%20Szat.full.jpg -disciple_of_the_vault.jpg http://[server]/MR/Disciple%20of%20the%20Vault.full.jpg -discombobulate.jpg http://[server]/10E/Discombobulate.full.jpg -discordant_dirge.jpg http://[server]/US/Discordant%20Dirge.full.jpg -discordant_spirit.jpg http://[server]/MI/Discordant%20Spirit.full.jpg -disease_carriers.jpg http://[server]/UD/Disease%20Carriers.full.jpg -diseased_vermin.jpg http://[server]/AL/Diseased%20Vermin.full.jpg -disembowel.jpg http://[server]/RAV/Disembowel.full.jpg -disempower.jpg http://[server]/MI/Disempower.full.jpg -disenchant.jpg http://[server]/7E/Disenchant.full.jpg -disentomb.jpg http://[server]/M10/Disentomb.full.jpg -disfigure.jpg http://[server]/ZEN/Disfigure.full.jpg -disharmony.jpg http://[server]/LG/Disharmony.full.jpg -disintegrate.jpg http://[server]/5E/Disintegrate.full.jpg -dismal_failure.jpg http://[server]/PLC/Dismal%20Failure.full.jpg -dismantle.jpg http://[server]/DS/Dismantle.full.jpg -dismantling_blow.jpg http://[server]/IN/Dismantling%20Blow.full.jpg -dismiss.jpg http://[server]/TE/Dismiss.full.jpg -disorder.jpg http://[server]/7E/Disorder.full.jpg -disorient.jpg http://[server]/M10/Disorient.full.jpg -dispellers_capsule.jpg http://[server]/ALA/Dispeller's%20Capsule.full.jpg -dispersal_shield.jpg http://[server]/SC/Dispersal%20Shield.full.jpg -disperse.jpg http://[server]/MOR/Disperse.full.jpg -dispersing_orb.jpg http://[server]/ON/Dispersing%20Orb.full.jpg -disrupt.jpg http://[server]/IN/Disrupt.full.jpg -disrupting_scepter.jpg http://[server]/9E/Disrupting%20Scepter.full.jpg -disrupting_shoal.jpg http://[server]/BOK/Disrupting%20Shoal.full.jpg -disruption_aura.jpg http://[server]/FD/Disruption%20Aura.full.jpg -disruptive_pitmage.jpg http://[server]/ON/Disruptive%20Pitmage.full.jpg -disruptive_student.jpg http://[server]/US/Disruptive%20Student.full.jpg -dissipate.jpg http://[server]/MI/Dissipate.full.jpg -distant_melody.jpg http://[server]/MOR/Distant%20Melody.full.jpg -distorting_lens.jpg http://[server]/8E/Distorting%20Lens.full.jpg -distorting_wake.jpg http://[server]/IN/Distorting%20Wake.full.jpg -distress.jpg http://[server]/10E/Distress.full.jpg -disturbed_burial.jpg http://[server]/TE/Disturbed%20Burial.full.jpg -disturbing_plot.jpg http://[server]/SHM/Disturbing%20Plot.full.jpg -dive_bomber.jpg http://[server]/ON/Dive%20Bomber.full.jpg -divebomber_griffin.jpg http://[server]/RAV/Divebomber%20Griffin.full.jpg -divergent_growth.jpg http://[server]/SC/Divergent%20Growth.full.jpg -diversionary_tactics.jpg http://[server]/AP/Diversionary%20Tactics.full.jpg -divert.jpg http://[server]/OD/Divert.full.jpg -divination.jpg http://[server]/M10/Divination.full.jpg -divine_congregation.jpg http://[server]/TSP/Divine%20Congregation.full.jpg -divine_intervention.jpg http://[server]/LG/Divine%20Intervention.full.jpg -divine_light.jpg http://[server]/AP/Divine%20Light.full.jpg -divine_offering.jpg http://[server]/MI/Divine%20Offering.full.jpg -divine_presence.jpg http://[server]/IN/Divine%20Presence.full.jpg -divine_retribution.jpg http://[server]/MI/Divine%20Retribution.full.jpg -divine_sacrament.jpg http://[server]/OD/Divine%20Sacrament.full.jpg -divine_transformation.jpg http://[server]/LG/Divine%20Transformation.full.jpg -divine_verdict.jpg http://[server]/M10/Divine%20Verdict.full.jpg -diviners_wand.jpg http://[server]/MOR/Diviner's%20Wand.full.jpg -diving_griffin.jpg http://[server]/8E/Diving%20Griffin.full.jpg -divining_witch.jpg http://[server]/NE/Divining%20Witch.full.jpg -divinity_of_pride.jpg http://[server]/EVE/Divinity%20of%20Pride.full.jpg -dizzy_spell.jpg http://[server]/RAV/Dizzy%20Spell.full.jpg -dizzying_gaze.jpg http://[server]/EX/Dizzying%20Gaze.full.jpg -djinn_illuminatus.jpg http://[server]/GP/Djinn%20Illuminatus.full.jpg -djinn_of_the_lamp.jpg http://[server]/PT/Djinn%20of%20the%20Lamp.full.jpg -djinn_of_wishes.jpg http://[server]/M10/Djinn%20of%20Wishes.full.jpg -do_or_die.jpg http://[server]/IN/Do%20or%20Die.full.jpg -dodecapod.jpg http://[server]/AP/Dodecapod.full.jpg -dogged_hunter.jpg http://[server]/OD/Dogged%20Hunter.full.jpg -dogpile.jpg http://[server]/RAV/Dogpile.full.jpg -dolmen_gate.jpg http://[server]/LRW/Dolmen%20Gate.full.jpg -dominarias_judgment.jpg http://[server]/PS/Dominaria's%20Judgment.full.jpg -dominate.jpg http://[server]/NE/Dominate.full.jpg -dominating_licid.jpg http://[server]/EX/Dominating%20Licid.full.jpg -domineer.jpg http://[server]/MR/Domineer.full.jpg -dominus_of_fealty.jpg http://[server]/EVE/Dominus%20of%20Fealty.full.jpg -donate.jpg http://[server]/UD/Donate.full.jpg -dong_zhou_the_tyrant.jpg http://[server]/P3/Dong%20Zhou,%20the%20Tyrant.full.jpg -doom_blade.jpg http://[server]/M10/Doom%20Blade.full.jpg -doom_cannon.jpg http://[server]/ON/Doom%20Cannon.full.jpg -doomed_necromancer.jpg http://[server]/10E/Doomed%20Necromancer.full.jpg -doomgape.jpg http://[server]/EVE/Doomgape.full.jpg -doomsday.jpg http://[server]/WL/Doomsday.full.jpg -doomsday_specter.jpg http://[server]/PS/Doomsday%20Specter.full.jpg -door_of_destinies.jpg http://[server]/MOR/Door%20of%20Destinies.full.jpg -door_to_nothingness.jpg http://[server]/FD/Door%20to%20Nothingness.full.jpg -doran_the_siege_tower.jpg http://[server]/LRW/Doran,%20the%20Siege%20Tower.full.jpg -dormant_sliver.jpg http://[server]/PLC/Dormant%20Sliver.full.jpg -dormant_volcano.jpg http://[server]/VI/Dormant%20Volcano.full.jpg -dosan_the_falling_leaf.jpg http://[server]/CHK/Dosan%20the%20Falling%20Leaf.full.jpg -dosans_oldest_chant.jpg http://[server]/SOK/Dosan's%20Oldest%20Chant.full.jpg -double_cleave.jpg http://[server]/EVE/Double%20Cleave.full.jpg -double_cross.jpg http://[server]/UG/Double%20Cross.full.jpg -double_deal.jpg http://[server]/UG/Double%20Deal.full.jpg -double_dip.jpg http://[server]/UG/Double%20Dip.full.jpg -double_header.jpg http://[server]/UNH/Double%20Header.full.jpg -double_negative.jpg http://[server]/ARB/Double%20Negative.full.jpg -double_play.jpg http://[server]/UG/Double%20Play.full.jpg -double_take.jpg http://[server]/UG/Double%20Take.full.jpg -doubling_cube.jpg http://[server]/10E/Doubling%20Cube.full.jpg -doubling_season.jpg http://[server]/RAV/Doubling%20Season.full.jpg -doubtless_one.jpg http://[server]/ON/Doubtless%20One.full.jpg -douse.jpg http://[server]/US/Douse.full.jpg -douse_in_gloom.jpg http://[server]/GP/Douse%20in%20Gloom.full.jpg -dovescape.jpg http://[server]/DIS/Dovescape.full.jpg -downdraft.jpg http://[server]/WL/Downdraft.full.jpg -downhill_charge.jpg http://[server]/NE/Downhill%20Charge.full.jpg -dowsing_shaman.jpg http://[server]/RAV/Dowsing%20Shaman.full.jpg -draco.jpg http://[server]/PS/Draco.full.jpg -draconian_cylix.jpg http://[server]/FE/Draconian%20Cylix.full.jpg -dracoplasm.jpg http://[server]/TE/Dracoplasm.full.jpg -drafnas_restoration.jpg http://[server]/AQ/Drafna's%20Restoration.full.jpg -drag_down.jpg http://[server]/CFX/Drag%20Down.full.jpg -dragon_appeasement.jpg http://[server]/ARB/Dragon%20Appeasement.full.jpg -dragon_arch.jpg http://[server]/AP/Dragon%20Arch.full.jpg -dragon_blood.jpg http://[server]/MR/Dragon%20Blood.full.jpg -dragon_breath.jpg http://[server]/SC/Dragon%20Breath.full.jpg -dragon_broodmother.jpg http://[server]/ARB/Dragon%20Broodmother.full.jpg -dragon_engine.jpg http://[server]/6E/Dragon%20Engine.full.jpg -dragon_fangs.jpg http://[server]/SC/Dragon%20Fangs.full.jpg -dragon_fodder.jpg http://[server]/ALA/Dragon%20Fodder.full.jpg -dragon_mage.jpg http://[server]/SC/Dragon%20Mage.full.jpg -dragon_mask.jpg http://[server]/6E/Dragon%20Mask.full.jpg -dragon_roost.jpg http://[server]/10E/Dragon%20Roost.full.jpg -dragon_scales.jpg http://[server]/SC/Dragon%20Scales.full.jpg -dragon_shadow.jpg http://[server]/SC/Dragon%20Shadow.full.jpg -dragon_tyrant.jpg http://[server]/SC/Dragon%20Tyrant.full.jpg -dragon_whelp.jpg http://[server]/M10/Dragon%20Whelp.full.jpg -dragon_wings.jpg http://[server]/SC/Dragon%20Wings.full.jpg -dragons_claw.jpg http://[server]/M10/Dragon's%20Claw.full.jpg -dragons_herald.jpg http://[server]/ALA/Dragon's%20Herald.full.jpg -dragonskull_summit.jpg http://[server]/M10/Dragonskull%20Summit.full.jpg -dragonsoul_knight.jpg http://[server]/CFX/Dragonsoul%20Knight.full.jpg -dragonspeaker_shaman.jpg http://[server]/SC/Dragonspeaker%20Shaman.full.jpg -dragonstalker.jpg http://[server]/SC/Dragonstalker.full.jpg -dragonstorm.jpg http://[server]/SC/Dragonstorm.full.jpg -drain_life.jpg http://[server]/5E/Drain%20Life.full.jpg -drain_power.jpg http://[server]/5E/Drain%20Power.full.jpg -drain_the_well.jpg http://[server]/EVE/Drain%20the%20Well.full.jpg -draining_whelk.jpg http://[server]/TSP/Draining%20Whelk.full.jpg -drake_familiar.jpg http://[server]/RAV/Drake%20Familiar.full.jpg -drake_hatchling.jpg http://[server]/MM/Drake%20Hatchling.full.jpg -drake_skull_cameo.jpg http://[server]/IN/Drake-Skull%20Cameo.full.jpg -dralnu_lich_lord.jpg http://[server]/TSP/Dralnu,%20Lich%20Lord.full.jpg -dralnus_crusade.jpg http://[server]/PS/Dralnu's%20Crusade.full.jpg -dralnus_pet.jpg http://[server]/PS/Dralnu's%20Pet.full.jpg -dramatic_entrance.jpg http://[server]/SHM/Dramatic%20Entrance.full.jpg -drastic_revelation.jpg http://[server]/ARB/Drastic%20Revelation.full.jpg -drawn_together.jpg http://[server]/UNH/Drawn%20Together.full.jpg -dread.jpg http://[server]/LRW/Dread.full.jpg -dread_charge.jpg http://[server]/PT/Dread%20Charge.full.jpg -dread_of_night.jpg http://[server]/TE/Dread%20of%20Night.full.jpg -dread_reaper.jpg http://[server]/PT/Dread%20Reaper.full.jpg -dread_return.jpg http://[server]/TSP/Dread%20Return.full.jpg -dread_slag.jpg http://[server]/DIS/Dread%20Slag.full.jpg -dread_specter.jpg http://[server]/MI/Dread%20Specter.full.jpg -dread_warlock.jpg http://[server]/M10/Dread%20Warlock.full.jpg -dread_wight.jpg http://[server]/IA/Dread%20Wight.full.jpg -dreadship_reef.jpg http://[server]/TSP/Dreadship%20Reef.full.jpg -dreadwing.jpg http://[server]/CFX/Dreadwing.full.jpg -dream_cache.jpg http://[server]/MI/Dream%20Cache.full.jpg -dream_chisel.jpg http://[server]/ON/Dream%20Chisel.full.jpg -dream_coat.jpg http://[server]/LG/Dream%20Coat.full.jpg -dream_fighter.jpg http://[server]/MI/Dream%20Fighter.full.jpg -dream_fracture.jpg http://[server]/EVE/Dream%20Fracture.full.jpg -dream_halls.jpg http://[server]/SH/Dream%20Halls.full.jpg -dream_leash.jpg http://[server]/RAV/Dream%20Leash.full.jpg -dream_prowler.jpg http://[server]/9E/Dream%20Prowler.full.jpg -dream_salvage.jpg http://[server]/SHM/Dream%20Salvage.full.jpg -dream_stalker.jpg http://[server]/TSP/Dream%20Stalker.full.jpg -dream_thief.jpg http://[server]/EVE/Dream%20Thief.full.jpg -dream_thrush.jpg http://[server]/IN/Dream%20Thrush.full.jpg -dream_tides.jpg http://[server]/VI/Dream%20Tides.full.jpg -dreamborn_muse.jpg http://[server]/10E/Dreamborn%20Muse.full.jpg -dreamcatcher.jpg http://[server]/SOK/Dreamcatcher.full.jpg -dreams_grip.jpg http://[server]/MR/Dream's%20Grip.full.jpg -dreams_of_the_dead.jpg http://[server]/IA/Dreams%20of%20the%20Dead.full.jpg -dreamscape_artist.jpg http://[server]/PLC/Dreamscape%20Artist.full.jpg -dreamspoiler_witches.jpg http://[server]/LRW/Dreamspoiler%20Witches.full.jpg -dreamwinder.jpg http://[server]/OD/Dreamwinder.full.jpg -dredge.jpg http://[server]/IN/Dredge.full.jpg -dreg_reaver.jpg http://[server]/ALA/Dreg%20Reaver.full.jpg -dregs_of_sorrow.jpg http://[server]/7E/Dregs%20of%20Sorrow.full.jpg -dregscape_zombie.jpg http://[server]/ALA/Dregscape%20Zombie.full.jpg -drekavac.jpg http://[server]/DIS/Drekavac.full.jpg -drelnoch.jpg http://[server]/CS/Drelnoch.full.jpg -drift_of_phantasms.jpg http://[server]/RAV/Drift%20of%20Phantasms.full.jpg -drift_of_the_dead.jpg http://[server]/IA/Drift%20of%20the%20Dead.full.jpg -drifter_il_dal.jpg http://[server]/TSP/Drifter%20il-Dal.full.jpg -drifting_djinn.jpg http://[server]/US/Drifting%20Djinn.full.jpg -drifting_meadow.jpg http://[server]/AT/Drifting%20Meadow.full.jpg -drill_skimmer.jpg http://[server]/DS/Drill-Skimmer.full.jpg -drinker_of_sorrow.jpg http://[server]/LE/Drinker%20of%20Sorrow.full.jpg -dripping_dead.jpg http://[server]/LE/Dripping%20Dead.full.jpg -dripping_tongue_zubera.jpg http://[server]/CHK/Dripping-Tongue%20Zubera.full.jpg -dromad_purebred.jpg http://[server]/RAV/Dromad%20Purebred.full.jpg -dromar_the_banisher.jpg http://[server]/IN/Dromar,%20the%20Banisher.full.jpg -dromars_attendant.jpg http://[server]/IN/Dromar's%20Attendant.full.jpg -dromars_cavern.jpg http://[server]/PS/Dromar's%20Cavern.full.jpg -dromars_charm.jpg http://[server]/PS/Dromar's%20Charm.full.jpg -dromosaur.jpg http://[server]/US/Dromosaur.full.jpg -droning_bureaucrats.jpg http://[server]/GP/Droning%20Bureaucrats.full.jpg -drooling_groodion.jpg http://[server]/RAV/Drooling%20Groodion.full.jpg -drooling_ogre.jpg http://[server]/DS/Drooling%20Ogre.full.jpg -drop_of_honey.jpg http://[server]/AN/Drop%20of%20Honey.full.jpg -dross_crocodile.jpg http://[server]/10E/Dross%20Crocodile.full.jpg -dross_golem.jpg http://[server]/DS/Dross%20Golem.full.jpg -dross_harvester.jpg http://[server]/MR/Dross%20Harvester.full.jpg -dross_prowler.jpg http://[server]/MR/Dross%20Prowler.full.jpg -dross_scorpion.jpg http://[server]/MR/Dross%20Scorpion.full.jpg -drought.jpg http://[server]/IA/Drought.full.jpg -drove_of_elves.jpg http://[server]/SHM/Drove%20of%20Elves.full.jpg -drowned.jpg http://[server]/DK/Drowned.full.jpg -drowned_catacomb.jpg http://[server]/M10/Drowned%20Catacomb.full.jpg -drowned_rusalka.jpg http://[server]/GP/Drowned%20Rusalka.full.jpg -drowner_initiate.jpg http://[server]/SHM/Drowner%20Initiate.full.jpg -drowner_of_secrets.jpg http://[server]/LRW/Drowner%20of%20Secrets.full.jpg -drudge_reavers.jpg http://[server]/TSP/Drudge%20Reavers.full.jpg -drudge_skeletons.jpg http://[server]/M10/Drudge%20Skeletons.full.jpg -drudge_spell.jpg http://[server]/HL/Drudge%20Spell.full.jpg -druid_lyrist.jpg http://[server]/OD/Druid%20Lyrist.full.jpg -druid_of_the_anima.jpg http://[server]/ALA/Druid%20of%20the%20Anima.full.jpg -druids_call.jpg http://[server]/OD/Druid's%20Call.full.jpg -drumhunter.jpg http://[server]/ALA/Drumhunter.full.jpg -dry_spell.jpg http://[server]/6E/Dry%20Spell.full.jpg -dryad_arbor.jpg http://[server]/FUT/Dryad%20Arbor.full.jpg -dryad_sophisticate.jpg http://[server]/GP/Dryad%20Sophisticate.full.jpg -dryads_caress.jpg http://[server]/RAV/Dryad's%20Caress.full.jpg -dual_nature.jpg http://[server]/PY/Dual%20Nature.full.jpg -duct_crawler.jpg http://[server]/10E/Duct%20Crawler.full.jpg -dueling_grounds.jpg http://[server]/IN/Dueling%20Grounds.full.jpg -duergar_assailant.jpg http://[server]/EVE/Duergar%20Assailant.full.jpg -duergar_cave_guard.jpg http://[server]/EVE/Duergar%20Cave-Guard.full.jpg -duergar_hedge_mage.jpg http://[server]/EVE/Duergar%20Hedge-Mage.full.jpg -duergar_mine_captain.jpg http://[server]/EVE/Duergar%20Mine-Captain.full.jpg -duh.jpg http://[server]/UNH/Duh.full.jpg -dumb_ass.jpg http://[server]/UNH/Dumb%20Ass.full.jpg -dune_brood_nephilim.jpg http://[server]/GP/Dune-Brood%20Nephilim.full.jpg -dunerider_outlaw.jpg http://[server]/PLC/Dunerider%20Outlaw.full.jpg -dungeon_shade.jpg http://[server]/SH/Dungeon%20Shade.full.jpg -duplicant.jpg http://[server]/MR/Duplicant.full.jpg -duplicity.jpg http://[server]/TE/Duplicity.full.jpg -duress.jpg http://[server]/M10/Duress.full.jpg -durkwood_baloth.jpg http://[server]/TSP/Durkwood%20Baloth.full.jpg -durkwood_boars.jpg http://[server]/LG/Durkwood%20Boars.full.jpg -durkwood_tracker.jpg http://[server]/TSP/Durkwood%20Tracker.full.jpg -dusk_imp.jpg http://[server]/10E/Dusk%20Imp.full.jpg -dusk_urchins.jpg http://[server]/SHM/Dusk%20Urchins.full.jpg -duskdale_wurm.jpg http://[server]/EVE/Duskdale%20Wurm.full.jpg -duskmantle_house_of_shadow.jpg http://[server]/RAV/Duskmantle,%20House%20of%20Shadow.full.jpg -duskrider_falcon.jpg http://[server]/WL/Duskrider%20Falcon.full.jpg -duskrider_peregrine.jpg http://[server]/TSP/Duskrider%20Peregrine.full.jpg -duskwalker.jpg http://[server]/IN/Duskwalker.full.jpg -duskworker.jpg http://[server]/MR/Duskworker.full.jpg -dust_bowl.jpg http://[server]/MM/Dust%20Bowl.full.jpg -dust_corona.jpg http://[server]/PLC/Dust%20Corona.full.jpg -dust_elemental.jpg http://[server]/PLC/Dust%20Elemental.full.jpg -dust_of_moments.jpg http://[server]/FUT/Dust%20of%20Moments.full.jpg -dust_to_dust.jpg http://[server]/5E/Dust%20to%20Dust.full.jpg -dwarven_armorer.jpg http://[server]/FE/Dwarven%20Armorer.full.jpg -dwarven_armory.jpg http://[server]/IA/Dwarven%20Armory.full.jpg -dwarven_berserker.jpg http://[server]/WL/Dwarven%20Berserker.full.jpg -dwarven_blastminer.jpg http://[server]/ON/Dwarven%20Blastminer.full.jpg -dwarven_bloodboiler.jpg http://[server]/JU/Dwarven%20Bloodboiler.full.jpg -dwarven_catapult.jpg http://[server]/FE/Dwarven%20Catapult.full.jpg -dwarven_demolition_team.jpg http://[server]/8E/Dwarven%20Demolition%20Team.full.jpg -dwarven_driller.jpg http://[server]/JU/Dwarven%20Driller.full.jpg -dwarven_grunt.jpg http://[server]/OD/Dwarven%20Grunt.full.jpg -dwarven_hold.jpg http://[server]/FE/Dwarven%20Hold.full.jpg -dwarven_landslide.jpg http://[server]/AP/Dwarven%20Landslide.full.jpg -dwarven_lieutenant.jpg http://[server]/FE/Dwarven%20Lieutenant.full.jpg -dwarven_miner.jpg http://[server]/MI/Dwarven%20Miner.full.jpg -dwarven_nomad.jpg http://[server]/MI/Dwarven%20Nomad.full.jpg -dwarven_patrol.jpg http://[server]/AP/Dwarven%20Patrol.full.jpg -dwarven_pony.jpg http://[server]/HL/Dwarven%20Pony.full.jpg -dwarven_recruiter.jpg http://[server]/OD/Dwarven%20Recruiter.full.jpg -dwarven_ruins.jpg http://[server]/6E/Dwarven%20Ruins.full.jpg -dwarven_scorcher.jpg http://[server]/JU/Dwarven%20Scorcher.full.jpg -dwarven_sea_clan.jpg http://[server]/HL/Dwarven%20Sea%20Clan.full.jpg -dwarven_shrine.jpg http://[server]/OD/Dwarven%20Shrine.full.jpg -dwarven_soldier.jpg http://[server]/5E/Dwarven%20Soldier.full.jpg -dwarven_song.jpg http://[server]/LG/Dwarven%20Song.full.jpg -dwarven_strike_force.jpg http://[server]/OD/Dwarven%20Strike%20Force.full.jpg -dwarven_thaumaturgist.jpg http://[server]/WL/Dwarven%20Thaumaturgist.full.jpg -dwarven_trader.jpg http://[server]/HL/Dwarven%20Trader1.full.jpg -dwarven_vigilantes.jpg http://[server]/VI/Dwarven%20Vigilantes.full.jpg -dwarven_warriors.jpg http://[server]/5E/Dwarven%20Warriors.full.jpg -dwarven_weaponsmith.jpg http://[server]/AQ/Dwarven%20Weaponsmith.full.jpg -dwell_on_the_past.jpg http://[server]/TO/Dwell%20on%20the%20Past.full.jpg -dying_wail.jpg http://[server]/UD/Dying%20Wail.full.jpg -dystopia.jpg http://[server]/AL/Dystopia.full.jpg \ No newline at end of file diff --git a/res/pics_link/card-pictures_e.txt b/res/pics_link/card-pictures_e.txt deleted file mode 100644 index fa49474ade9..00000000000 --- a/res/pics_link/card-pictures_e.txt +++ /dev/null @@ -1,369 +0,0 @@ -eager_cadet.jpg http://[server]/9E/Eager%20Cadet.full.jpg -early_frost.jpg http://[server]/FD/Early%20Frost.full.jpg -early_harvest.jpg http://[server]/9E/Early%20Harvest.full.jpg -earnest_fellowship.jpg http://[server]/OD/Earnest%20Fellowship.full.jpg -earsplitting_rats.jpg http://[server]/JU/Earsplitting%20Rats.full.jpg -earth_elemental.jpg http://[server]/10E/Earth%20Elemental.full.jpg -earth_rift.jpg http://[server]/OD/Earth%20Rift.full.jpg -earth_surge.jpg http://[server]/GP/Earth%20Surge.full.jpg -earthbind.jpg http://[server]/U/Earthbind.full.jpg -earthblighter.jpg http://[server]/LE/Earthblighter.full.jpg -earthbrawn.jpg http://[server]/MOR/Earthbrawn.full.jpg -earthcraft.jpg http://[server]/TE/Earthcraft.full.jpg -earthen_goo.jpg http://[server]/CS/Earthen%20Goo.full.jpg -earthlink.jpg http://[server]/IA/Earthlink.full.jpg -earthlore.jpg http://[server]/IA/Earthlore.full.jpg -earthquake.jpg http://[server]/M10/Earthquake.full.jpg -earthshaker.jpg http://[server]/CHK/Earthshaker.full.jpg -earwig_squad.jpg http://[server]/REL/Earwig%20Squad.full.jpg -eastern_paladin.jpg http://[server]/8E/Eastern%20Paladin.full.jpg -eater_of_days.jpg http://[server]/DS/Eater%20of%20Days.full.jpg -eater_of_the_dead.jpg http://[server]/DK/Eater%20of%20the%20Dead.full.jpg -ebon_dragon.jpg http://[server]/PT/Ebon%20Dragon.full.jpg -ebon_drake.jpg http://[server]/FD/Ebon%20Drake.full.jpg -ebon_praetor.jpg http://[server]/FE/Ebon%20Praetor.full.jpg -ebon_stronghold.jpg http://[server]/6E/Ebon%20Stronghold.full.jpg -ebonblade_reaper.jpg http://[server]/ON/Ebonblade%20Reaper.full.jpg -ebony_charm.jpg http://[server]/MI/Ebony%20Charm.full.jpg -ebony_horse.jpg http://[server]/AN/Ebony%20Horse.full.jpg -ebony_owl_netsuke.jpg http://[server]/SOK/Ebony%20Owl%20Netsuke.full.jpg -ebony_rhino.jpg http://[server]/HL/Ebony%20Rhino.full.jpg -ebony_treefolk.jpg http://[server]/AP/Ebony%20Treefolk.full.jpg -echo_chamber.jpg http://[server]/TE/Echo%20Chamber.full.jpg -echo_tracer.jpg http://[server]/LE/Echo%20Tracer.full.jpg -echoing_calm.jpg http://[server]/DS/Echoing%20Calm.full.jpg -echoing_courage.jpg http://[server]/DS/Echoing%20Courage.full.jpg -echoing_decay.jpg http://[server]/DS/Echoing%20Decay.full.jpg -echoing_ruin.jpg http://[server]/DS/Echoing%20Ruin.full.jpg -echoing_truth.jpg http://[server]/DS/Echoing%20Truth.full.jpg -edge_of_autumn.jpg http://[server]/FUT/Edge%20of%20Autumn.full.jpg -edge_of_the_divinity.jpg http://[server]/EVE/Edge%20of%20the%20Divinity.full.jpg -edgewalker.jpg http://[server]/SC/Edgewalker.full.jpg -eerie_procession.jpg http://[server]/CHK/Eerie%20Procession.full.jpg -ego_erasure.jpg http://[server]/LRW/Ego%20Erasure.full.jpg -eiganjo_castle.jpg http://[server]/CHK/Eiganjo%20Castle.full.jpg -eiganjo_free_riders.jpg http://[server]/SOK/Eiganjo%20Free-Riders.full.jpg -eight_and_a_half_tails.jpg http://[server]/CHK/Eight-and-a-Half-Tails.full.jpg -eightfold_maze.jpg http://[server]/P3/Eightfold%20Maze.full.jpg -ekundu_cyclops.jpg http://[server]/MI/Ekundu%20Cyclops.full.jpg -ekundu_griffin.jpg http://[server]/MI/Ekundu%20Griffin.full.jpg -el_hajjaj.jpg http://[server]/AN/El-Hajjaj.full.jpg -eladamri.jpg http://[server]/VG/Eladamri.full.jpg -eladamri_lord_of_leaves.jpg http://[server]/TE/Eladamri,%20Lord%20of%20Leaves.full.jpg -eladamris_call.jpg http://[server]/PS/Eladamri's%20Call.full.jpg -eladamris_vineyard.jpg http://[server]/TE/Eladamri's%20Vineyard.full.jpg -elder_druid.jpg http://[server]/7E/Elder%20Druid.full.jpg -elder_land_wurm.jpg http://[server]/LG/Elder%20Land%20Wurm.full.jpg -elder_mastery.jpg http://[server]/CFX/Elder%20Mastery.full.jpg -elder_pine_of_jukai.jpg http://[server]/SOK/Elder%20Pine%20of%20Jukai.full.jpg -elder_spawn.jpg http://[server]/LG/Elder%20Spawn.full.jpg -eldrazi_monument.jpg http://[server]/ZEN/Eldrazi%20Monument.full.jpg -electric_eel.jpg http://[server]/DK/Electric%20Eel.full.jpg -electrolyze.jpg http://[server]/GP/Electrolyze.full.jpg -electropotence.jpg http://[server]/ZEN/Electropotence.full.jpg -electrostatic_bolt.jpg http://[server]/MR/Electrostatic%20Bolt.full.jpg -electryte.jpg http://[server]/US/Electryte.full.jpg -elemental_appeal.jpg http://[server]/ZEN/Elemental%20Appeal.full.jpg -elemental_augury.jpg http://[server]/IA/Elemental%20Augury.full.jpg -elemental_mastery.jpg http://[server]/SHM/Elemental%20Mastery.full.jpg -elemental_resonance.jpg http://[server]/DIS/Elemental%20Resonance.full.jpg -elephant_ambush.jpg http://[server]/OD/Elephant%20Ambush.full.jpg -elephant_grass.jpg http://[server]/VI/Elephant%20Grass.full.jpg -elephant_graveyard.jpg http://[server]/AN/Elephant%20Graveyard.full.jpg -elephant_guide.jpg http://[server]/JU/Elephant%20Guide.full.jpg -elephant_resurgence.jpg http://[server]/PY/Elephant%20Resurgence.full.jpg -elf_replica.jpg http://[server]/MR/Elf%20Replica.full.jpg -elfhame_palace.jpg http://[server]/8E/Elfhame%20Palace.full.jpg -elfhame_sanctuary.jpg http://[server]/IN/Elfhame%20Sanctuary.full.jpg -elite_archers.jpg http://[server]/8E/Elite%20Archers.full.jpg -elite_cat_warrior.jpg http://[server]/PT/Elite%20Cat%20Warrior1.full.jpg -elite_javelineer.jpg http://[server]/8E/Elite%20Javelineer.full.jpg -elite_vanguard.jpg http://[server]/M10/Elite%20Vanguard.full.jpg -elixir_of_vitality.jpg http://[server]/MI/Elixir%20of%20Vitality.full.jpg -elkin_bottle.jpg http://[server]/5E/Elkin%20Bottle.full.jpg -elkin_lair.jpg http://[server]/VI/Elkin%20Lair.full.jpg -elsewhere_flask.jpg http://[server]/SHM/Elsewhere%20Flask.full.jpg -elspeth_knight_errant.jpg http://[server]/ALA/Elspeth,%20Knight-Errant.full.jpg -elven_cache.jpg http://[server]/6E/Elven%20Cache.full.jpg -elven_fortress.jpg http://[server]/FE/Elven%20Fortress1.full.jpg -elven_lyre.jpg http://[server]/FE/Elven%20Lyre.full.jpg -elven_palisade.jpg http://[server]/EX/Elven%20Palisade.full.jpg -elven_riders.jpg http://[server]/10E/Elven%20Riders.full.jpg -elven_rite.jpg http://[server]/SH/Elven%20Rite.full.jpg -elven_warhounds.jpg http://[server]/TE/Elven%20Warhounds.full.jpg -elves_of_deep_shadow.jpg http://[server]/DK/Elves%20of%20Deep%20Shadow.full.jpg -elvish_aberration.jpg http://[server]/SC/Elvish%20Aberration.full.jpg -elvish_archdruid.jpg http://[server]/M10/Elvish%20Archdruid.full.jpg -elvish_archers.jpg http://[server]/7E/Elvish%20Archers.full.jpg -elvish_bard.jpg http://[server]/9E/Elvish%20Bard.full.jpg -elvish_berserker.jpg http://[server]/10E/Elvish%20Berserker.full.jpg -elvish_branchbender.jpg http://[server]/LRW/Elvish%20Branchbender.full.jpg -elvish_champion.jpg http://[server]/10E/Elvish%20Champion.full.jpg -elvish_eulogist.jpg http://[server]/EVG/Elvish%20Eulogist.full.jpg -elvish_farmer.jpg http://[server]/FE/Elvish%20Farmer.full.jpg -elvish_fury.jpg http://[server]/TE/Elvish%20Fury.full.jpg -elvish_guidance.jpg http://[server]/ON/Elvish%20Guidance.full.jpg -elvish_handservant.jpg http://[server]/LRW/Elvish%20Handservant.full.jpg -elvish_harbinger.jpg http://[server]/EVG/Elvish%20Harbinger.full.jpg -elvish_healer.jpg http://[server]/IA/Elvish%20Healer.full.jpg -elvish_herder.jpg http://[server]/US/Elvish%20Herder.full.jpg -elvish_hexhunter.jpg http://[server]/SHM/Elvish%20Hexhunter.full.jpg -elvish_house_party.jpg http://[server]/UNH/Elvish%20House%20Party.full.jpg -elvish_hunter.jpg http://[server]/FE/Elvish%20Hunter1.full.jpg -elvish_impersonators.jpg http://[server]/UG/Elvish%20Impersonators.full.jpg -elvish_lookout.jpg http://[server]/UD/Elvish%20Lookout.full.jpg -elvish_lyrist.jpg http://[server]/8E/Elvish%20Lyrist.full.jpg -elvish_pathcutter.jpg http://[server]/ON/Elvish%20Pathcutter.full.jpg -elvish_pioneer.jpg http://[server]/8E/Elvish%20Pioneer.full.jpg -elvish_piper.jpg http://[server]/M10/Elvish%20Piper.full.jpg -elvish_promenade.jpg http://[server]/EVG/Elvish%20Promenade.full.jpg -elvish_ranger.jpg http://[server]/PT/Elvish%20Ranger.full.jpg -elvish_scout.jpg http://[server]/FE/Elvish%20Scout1.full.jpg -elvish_scrapper.jpg http://[server]/8E/Elvish%20Scrapper.full.jpg -elvish_skysweeper.jpg http://[server]/RAV/Elvish%20Skysweeper.full.jpg -elvish_soultiller.jpg http://[server]/LE/Elvish%20Soultiller.full.jpg -elvish_spirit_guide.jpg http://[server]/AL/Elvish%20Spirit%20Guide.full.jpg -elvish_vanguard.jpg http://[server]/ON/Elvish%20Vanguard.full.jpg -elvish_visionary.jpg http://[server]/M10/Elvish%20Visionary.full.jpg -elvish_warrior.jpg http://[server]/9E/Elvish%20Warrior.full.jpg -embalmed_brawler.jpg http://[server]/LE/Embalmed%20Brawler.full.jpg -embargo.jpg http://[server]/MM/Embargo.full.jpg -ember_beast.jpg http://[server]/OD/Ember%20Beast.full.jpg -ember_fist_zubera.jpg http://[server]/CHK/Ember-Fist%20Zubera.full.jpg -ember_gale.jpg http://[server]/SHM/Ember%20Gale.full.jpg -ember_shot.jpg http://[server]/JU/Ember%20Shot.full.jpg -ember_weaver.jpg http://[server]/CFX/Ember%20Weaver.full.jpg -embermage_goblin.jpg http://[server]/ON/Embermage%20Goblin.full.jpg -emberstrike_duo.jpg http://[server]/SHM/Emberstrike%20Duo.full.jpg -emberwilde_augur.jpg http://[server]/FUT/Emberwilde%20Augur.full.jpg -emberwilde_caliph.jpg http://[server]/MI/Emberwilde%20Caliph.full.jpg -emberwilde_djinn.jpg http://[server]/MI/Emberwilde%20Djinn.full.jpg -emblazoned_golem.jpg http://[server]/AP/Emblazoned%20Golem.full.jpg -emblem_of_the_warmind.jpg http://[server]/FUT/Emblem%20of%20the%20Warmind.full.jpg -embolden.jpg http://[server]/OD/Embolden.full.jpg -emcee.jpg http://[server]/UNH/Emcee.full.jpg -emerald_charm.jpg http://[server]/VI/Emerald%20Charm.full.jpg -emerald_dragonfly.jpg http://[server]/LG/Emerald%20Dragonfly.full.jpg -emerald_medallion.jpg http://[server]/TE/Emerald%20Medallion.full.jpg -emerald_oryx.jpg http://[server]/M10/Emerald%20Oryx.full.jpg -emeria_angel.jpg http://[server]/ZEN/Emeria%20Angel.full.jpg -emeria_the_sky_ruin.jpg http://[server]/ZEN/Emeria,%20the%20Sky%20Ruin.full.jpg -emissary_of_despair.jpg http://[server]/DS/Emissary%20of%20Despair.full.jpg -emissary_of_hope.jpg http://[server]/DS/Emissary%20of%20Hope.full.jpg -emmessi_tome.jpg http://[server]/TE/Emmessi%20Tome.full.jpg -emperor_crocodile.jpg http://[server]/9E/Emperor%20Crocodile.full.jpg -empress_galina.jpg http://[server]/IN/Empress%20Galina.full.jpg -empty_city_ruse.jpg http://[server]/P3/Empty%20City%20Ruse.full.jpg -empty_shrine_kannushi.jpg http://[server]/BOK/Empty-Shrine%20Kannushi.full.jpg -empty_the_catacombs.jpg http://[server]/RAV/Empty%20the%20Catacombs.full.jpg -empty_the_warrens.jpg http://[server]/TSP/Empty%20the%20Warrens.full.jpg -empyrial_archangel.jpg http://[server]/ALA/Empyrial%20Archangel.full.jpg -empyrial_armor.jpg http://[server]/WL/Empyrial%20Armor.full.jpg -empyrial_plate.jpg http://[server]/MR/Empyrial%20Plate.full.jpg -enchanted_being.jpg http://[server]/LG/Enchanted%20Being.full.jpg -enchanted_evening.jpg http://[server]/SHM/Enchanted%20Evening.full.jpg -enchantment_alteration.jpg http://[server]/LG/Enchantment%20Alteration.full.jpg -enchantresss_presence.jpg http://[server]/ON/Enchantress's%20Presence.full.jpg -encroach.jpg http://[server]/UD/Encroach.full.jpg -endangered_armodon.jpg http://[server]/SH/Endangered%20Armodon.full.jpg -endbringers_revel.jpg http://[server]/PY/Endbringer's%20Revel.full.jpg -endemic_plague.jpg http://[server]/ON/Endemic%20Plague.full.jpg -endless_cockroaches.jpg http://[server]/PT/Endless%20Cockroaches.full.jpg -endless_horizons.jpg http://[server]/EVE/Endless%20Horizons.full.jpg -endless_scream.jpg http://[server]/TE/Endless%20Scream.full.jpg -endless_swarm.jpg http://[server]/SOK/Endless%20Swarm.full.jpg -endless_whispers.jpg http://[server]/FD/Endless%20Whispers.full.jpg -endless_wurm.jpg http://[server]/US/Endless%20Wurm.full.jpg -endoskeleton.jpg http://[server]/US/Endoskeleton.full.jpg -endrek_sahr_master_breeder.jpg http://[server]/TSP/Endrek%20Sahr,%20Master%20Breeder.full.jpg -endure.jpg http://[server]/EVE/Endure.full.jpg -enduring_ideal.jpg http://[server]/SOK/Enduring%20Ideal.full.jpg -enduring_renewal.jpg http://[server]/IA/Enduring%20Renewal.full.jpg -enemy_of_the_guildpact.jpg http://[server]/DIS/Enemy%20of%20the%20Guildpact.full.jpg -energizer.jpg http://[server]/TE/Energizer.full.jpg -energy_arc.jpg http://[server]/AL/Energy%20Arc.full.jpg -energy_bolt.jpg http://[server]/MI/Energy%20Bolt.full.jpg -energy_chamber.jpg http://[server]/FD/Energy%20Chamber.full.jpg -energy_field.jpg http://[server]/US/Energy%20Field.full.jpg -energy_flux.jpg http://[server]/MM/Energy%20Flux.full.jpg -energy_storm.jpg http://[server]/IA/Energy%20Storm.full.jpg -energy_tap.jpg http://[server]/LG/Energy%20Tap.full.jpg -energy_vortex.jpg http://[server]/MI/Energy%20Vortex.full.jpg -enervate.jpg http://[server]/5E/Enervate.full.jpg -enfeeblement.jpg http://[server]/9E/Enfeeblement.full.jpg -engineered_explosives.jpg http://[server]/FD/Engineered%20Explosives.full.jpg -engineered_plague.jpg http://[server]/7E/Engineered%20Plague.full.jpg -engulfing_flames.jpg http://[server]/OD/Engulfing%20Flames.full.jpg -enigma_eidolon.jpg http://[server]/DIS/Enigma%20Eidolon.full.jpg -enigma_sphinx.jpg http://[server]/ARB/Enigma%20Sphinx.full.jpg -enlightened_tutor.jpg http://[server]/MI/Enlightened%20Tutor.full.jpg -enlisted_wurm.jpg http://[server]/ARB/Enlisted%20Wurm.full.jpg -enlistment_officer.jpg http://[server]/AP/Enlistment%20Officer.full.jpg -enormous_baloth.jpg http://[server]/M10/Enormous%20Baloth.full.jpg -enrage.jpg http://[server]/9E/Enrage.full.jpg -enraging_licid.jpg http://[server]/TE/Enraging%20Licid.full.jpg -enshrined_memories.jpg http://[server]/BOK/Enshrined%20Memories.full.jpg -enslave.jpg http://[server]/PLC/Enslave.full.jpg -enslaved_dwarf.jpg http://[server]/TO/Enslaved%20Dwarf.full.jpg -enslaved_horror.jpg http://[server]/MM/Enslaved%20Horror.full.jpg -enslaved_scout.jpg http://[server]/AL/Enslaved%20Scout1.full.jpg -ensnare.jpg http://[server]/NE/Ensnare.full.jpg -ensnaring_bridge.jpg http://[server]/8E/Ensnaring%20Bridge.full.jpg -ensouled_scimitar.jpg http://[server]/FD/Ensouled%20Scimitar.full.jpg -entangler.jpg http://[server]/PY/Entangler.full.jpg -entangling_trap.jpg http://[server]/LRW/Entangling%20Trap.full.jpg -entangling_vines.jpg http://[server]/M10/Entangling%20Vines.full.jpg -enter_the_dungeon.jpg http://[server]/UNH/Enter%20the%20Dungeon.full.jpg -entomb.jpg http://[server]/OD/Entomb.full.jpg -entrails_feaster.jpg http://[server]/ON/Entrails%20Feaster.full.jpg -entropic_eidolon.jpg http://[server]/DIS/Entropic%20Eidolon.full.jpg -entropic_specter.jpg http://[server]/EX/Entropic%20Specter.full.jpg -envelop.jpg http://[server]/JU/Envelop.full.jpg -eon_hub.jpg http://[server]/FD/Eon%20Hub.full.jpg -ephemeron.jpg http://[server]/EX/Ephemeron.full.jpg -epic_proportions.jpg http://[server]/LRW/Epic%20Proportions.full.jpg -epic_struggle.jpg http://[server]/JU/Epic%20Struggle.full.jpg -epicenter.jpg http://[server]/OD/Epicenter.full.jpg -epochrasite.jpg http://[server]/FUT/Epochrasite.full.jpg -equal_treatment.jpg http://[server]/TO/Equal%20Treatment.full.jpg -equilibrium.jpg http://[server]/7E/Equilibrium.full.jpg -equinox.jpg http://[server]/LG/Equinox.full.jpg -equipoise.jpg http://[server]/VI/Equipoise.full.jpg -eradicate.jpg http://[server]/UD/Eradicate.full.jpg -erase.jpg http://[server]/UL/Erase.full.jpg -erase_(not_the_urzas_legacy_one).jpg http://[server]/UNH/Erase%20(Not%20the%20Urza's%20Legacy%20One).full.jpg -erayo_soratami_ascendant.jpg http://[server]/SOK/Erayo,%20Soratami%20Ascendant.full.jpg -erg_raiders.jpg http://[server]/5E/Erg%20Raiders.full.jpg -erhnam_djinn.jpg http://[server]/OV/Erhnam%20Djinn.full.jpg -erithizon.jpg http://[server]/MM/Erithizon.full.jpg -eron_the_relentless.jpg http://[server]/HL/Eron%20the%20Relentless.full.jpg -erosion.jpg http://[server]/DK/Erosion.full.jpg -errand_of_duty.jpg http://[server]/AL/Errand%20of%20Duty1.full.jpg -errant_doomsayers.jpg http://[server]/TSP/Errant%20Doomsayers.full.jpg -errant_ephemeron.jpg http://[server]/TSP/Errant%20Ephemeron.full.jpg -errant_minion.jpg http://[server]/IA/Errant%20Minion.full.jpg -errantry.jpg http://[server]/IA/Errantry.full.jpg -erratic_explosion.jpg http://[server]/ON/Erratic%20Explosion.full.jpg -erratic_mutation.jpg http://[server]/PLC/Erratic%20Mutation.full.jpg -erratic_portal.jpg http://[server]/EX/Erratic%20Portal.full.jpg -ersatz_gnomes.jpg http://[server]/MI/Ersatz%20Gnomes.full.jpg -ertai.jpg http://[server]/VG/Ertai.full.jpg -ertai_the_corrupted.jpg http://[server]/PS/Ertai,%20the%20Corrupted.full.jpg -ertai_wizard_adept.jpg http://[server]/EX/Ertai,%20Wizard%20Adept.full.jpg -ertais_familiar.jpg http://[server]/WL/Ertai's%20Familiar.full.jpg -ertais_meddling.jpg http://[server]/TE/Ertai's%20Meddling.full.jpg -ertais_trickery.jpg http://[server]/PS/Ertai's%20Trickery.full.jpg -escape_artist.jpg http://[server]/OD/Escape%20Artist.full.jpg -escape_routes.jpg http://[server]/PS/Escape%20Routes.full.jpg -escaped_shapeshifter.jpg http://[server]/TE/Escaped%20Shapeshifter.full.jpg -esper_battlemage.jpg http://[server]/ALA/Esper%20Battlemage.full.jpg -esper_charm.jpg http://[server]/ALA/Esper%20Charm.full.jpg -esper_cormorants.jpg http://[server]/CFX/Esper%20Cormorants.full.jpg -esper_panorama.jpg http://[server]/ALA/Esper%20Panorama.full.jpg -esper_sojourners.jpg http://[server]/ARB/Esper%20Sojourners.full.jpg -esper_stormblade.jpg http://[server]/ARB/Esper%20Stormblade.full.jpg -esperzoa.jpg http://[server]/CFX/Esperzoa.full.jpg -essence_bottle.jpg http://[server]/TE/Essence%20Bottle.full.jpg -essence_drain.jpg http://[server]/10E/Essence%20Drain.full.jpg -essence_filter.jpg http://[server]/IA/Essence%20Filter.full.jpg -essence_flare.jpg http://[server]/IA/Essence%20Flare.full.jpg -essence_fracture.jpg http://[server]/ON/Essence%20Fracture.full.jpg -essence_leak.jpg http://[server]/IN/Essence%20Leak.full.jpg -essence_scatter.jpg http://[server]/M10/Essence%20Scatter.full.jpg -essence_sliver.jpg http://[server]/LE/Essence%20Sliver.full.jpg -essence_vortex.jpg http://[server]/IA/Essence%20Vortex.full.jpg -essence_warden.jpg http://[server]/PLC/Essence%20Warden.full.jpg -etched_oracle.jpg http://[server]/FD/Etched%20Oracle.full.jpg -eternal_dominion.jpg http://[server]/SOK/Eternal%20Dominion.full.jpg -eternal_dragon.jpg http://[server]/SC/Eternal%20Dragon.full.jpg -eternal_flame.jpg http://[server]/DK/Eternal%20Flame.full.jpg -eternal_warrior.jpg http://[server]/LG/Eternal%20Warrior.full.jpg -eternal_witness.jpg http://[server]/FD/Eternal%20Witness.full.jpg -eternity_snare.jpg http://[server]/TSP/Eternity%20Snare.full.jpg -eternity_vessel.jpg http://[server]/ZEN/Eternity%20Vessel.full.jpg -ether_well.jpg http://[server]/MI/Ether%20Well.full.jpg -ethercaste_knight.jpg http://[server]/ARB/Ethercaste%20Knight.full.jpg -ethereal_champion.jpg http://[server]/MI/Ethereal%20Champion.full.jpg -ethereal_haze.jpg http://[server]/CHK/Ethereal%20Haze.full.jpg -ethereal_usher.jpg http://[server]/RAV/Ethereal%20Usher.full.jpg -ethereal_whiskergill.jpg http://[server]/LRW/Ethereal%20Whiskergill.full.jpg -etherium_abomination.jpg http://[server]/ARB/Etherium%20Abomination.full.jpg -etherium_astrolabe.jpg http://[server]/ALA/Etherium%20Astrolabe.full.jpg -etherium_sculptor.jpg http://[server]/ALA/Etherium%20Sculptor.full.jpg -ethersworn_adjudicator.jpg http://[server]/CFX/Ethersworn%20Adjudicator.full.jpg -ethersworn_canonist.jpg http://[server]/ALA/Ethersworn%20Canonist.full.jpg -ethersworn_shieldmage.jpg http://[server]/ARB/Ethersworn%20Shieldmage.full.jpg -etherwrought_page.jpg http://[server]/ARB/Etherwrought%20Page.full.jpg -eunuchs_intrigues.jpg http://[server]/P3/Eunuchs'%20Intrigues.full.jpg -eureka.jpg http://[server]/LG/Eureka.full.jpg -evacuation.jpg http://[server]/10E/Evacuation.full.jpg -evangelize.jpg http://[server]/TSP/Evangelize.full.jpg -evaporate.jpg http://[server]/HL/Evaporate.full.jpg -evasive_action.jpg http://[server]/AP/Evasive%20Action.full.jpg -even_the_odds.jpg http://[server]/FUT/Even%20the%20Odds.full.jpg -everbark_shaman.jpg http://[server]/MOR/Everbark%20Shaman.full.jpg -everglades.jpg http://[server]/VI/Everglades.full.jpg -everglove_courier.jpg http://[server]/ON/Everglove%20Courier.full.jpg -everlasting_torment.jpg http://[server]/SHM/Everlasting%20Torment.full.jpg -evermind.jpg http://[server]/SOK/Evermind.full.jpg -evershrike.jpg http://[server]/EVE/Evershrike.full.jpg -evil_eye_of_orms_by_gore.jpg http://[server]/LG/Evil%20Eye%20of%20Orms-By-Gore.full.jpg -evil_eye_of_urborg.jpg http://[server]/TSP/Evil%20Eye%20of%20Urborg.full.jpg -evil_presence.jpg http://[server]/5E/Evil%20Presence.full.jpg -evincars_justice.jpg http://[server]/TE/Evincar's%20Justice.full.jpg -eviscerator.jpg http://[server]/UL/Eviscerator.full.jpg -evolution_charm.jpg http://[server]/PLC/Evolution%20Charm.full.jpg -evolution_vat.jpg http://[server]/DIS/Evolution%20Vat.full.jpg -exalted_angel.jpg http://[server]/ON/Exalted%20Angel.full.jpg -exalted_dragon.jpg http://[server]/EX/Exalted%20Dragon.full.jpg -excavation.jpg http://[server]/PY/Excavation.full.jpg -excavator.jpg http://[server]/TE/Excavator.full.jpg -excise.jpg http://[server]/PY/Excise.full.jpg -exclude.jpg http://[server]/IN/Exclude.full.jpg -excommunicate.jpg http://[server]/M10/Excommunicate.full.jpg -excruciator.jpg http://[server]/RAV/Excruciator.full.jpg -execute.jpg http://[server]/9E/Execute.full.jpg -executioners_capsule.jpg http://[server]/ALA/Executioner's%20Capsule.full.jpg -exhaustion.jpg http://[server]/9E/Exhaustion.full.jpg -exhume.jpg http://[server]/US/Exhume.full.jpg -exhumer_thrull.jpg http://[server]/GP/Exhumer%20Thrull.full.jpg -exile.jpg http://[server]/AL/Exile.full.jpg -exile_into_darkness.jpg http://[server]/SOK/Exile%20into%20Darkness.full.jpg -exiled_boggart.jpg http://[server]/LRW/Exiled%20Boggart.full.jpg -exiled_doomsayer.jpg http://[server]/SC/Exiled%20Doomsayer.full.jpg -exorcist.jpg http://[server]/DK/Exorcist.full.jpg -exoskeletal_armor.jpg http://[server]/JU/Exoskeletal%20Armor.full.jpg -exotic_curse.jpg http://[server]/IN/Exotic%20Curse.full.jpg -exotic_disease.jpg http://[server]/PS/Exotic%20Disease.full.jpg -exotic_orchard.jpg http://[server]/CFX/Exotic%20Orchard.full.jpg -expedition_map.jpg http://[server]/ZEN/Expedition%20Map.full.jpg -expendable_troops.jpg http://[server]/UL/Expendable%20Troops.full.jpg -experiment_kraj.jpg http://[server]/DIS/Experiment%20Kraj.full.jpg -exploding_borders.jpg http://[server]/CFX/Exploding%20Borders.full.jpg -exploration.jpg http://[server]/US/Exploration.full.jpg -explorers_scope.jpg http://[server]/ZEN/Explorer's%20Scope.full.jpg -explosive_growth.jpg http://[server]/IN/Explosive%20Growth.full.jpg -explosive_vegetation.jpg http://[server]/ON/Explosive%20Vegetation.full.jpg -expunge.jpg http://[server]/US/Expunge.full.jpg -extinction.jpg http://[server]/TE/Extinction.full.jpg -extinguish.jpg http://[server]/ST/Extinguish.full.jpg -extirpate.jpg http://[server]/PLC/Extirpate.full.jpg -extortion.jpg http://[server]/MM/Extortion.full.jpg -extra_arms.jpg http://[server]/SC/Extra%20Arms.full.jpg -extract.jpg http://[server]/OD/Extract.full.jpg -extractor_demon.jpg http://[server]/CFX/Extractor%20Demon.full.jpg -extraplanar_lens.jpg http://[server]/MR/Extraplanar%20Lens.full.jpg -extravagant_spirit.jpg http://[server]/MM/Extravagant%20Spirit.full.jpg -extruder.jpg http://[server]/UD/Extruder.full.jpg -exuberant_firestoker.jpg http://[server]/ALA/Exuberant%20Firestoker.full.jpg -eye_for_an_eye.jpg http://[server]/AN/Eye%20for%20an%20Eye.full.jpg -eye_of_nowhere.jpg http://[server]/CHK/Eye%20of%20Nowhere.full.jpg -eye_of_ramos.jpg http://[server]/MM/Eye%20of%20Ramos.full.jpg -eye_of_singularity.jpg http://[server]/VI/Eye%20of%20Singularity.full.jpg -eye_of_the_storm.jpg http://[server]/RAV/Eye%20of%20the%20Storm.full.jpg -eye_of_yawgmoth.jpg http://[server]/NE/Eye%20of%20Yawgmoth.full.jpg -eye_spy.jpg http://[server]/ST/Eye%20Spy.full.jpg -eye_to_eye.jpg http://[server]/UNH/Eye%20to%20Eye.full.jpg -eyeblights_ending.jpg http://[server]/LRW/Eyeblight's%20Ending.full.jpg -eyes_of_the_watcher.jpg http://[server]/FD/Eyes%20of%20the%20Watcher.full.jpg -eyes_of_the_wisent.jpg http://[server]/LRW/Eyes%20of%20the%20Wisent.full.jpg \ No newline at end of file diff --git a/res/pics_link/card-pictures_f.txt b/res/pics_link/card-pictures_f.txt deleted file mode 100644 index e57d6b134f6..00000000000 --- a/res/pics_link/card-pictures_f.txt +++ /dev/null @@ -1,502 +0,0 @@ -faadiyah_seer.jpg http://[server]/PLC/Fa'adiyah%20Seer.full.jpg -fable_of_wolf_and_owl.jpg http://[server]/EVE/Fable%20of%20Wolf%20and%20Owl.full.jpg -fabricate.jpg http://[server]/M10/Fabricate.full.jpg -face_of_fear.jpg http://[server]/OD/Face%20of%20Fear.full.jpg -face_to_face.jpg http://[server]/UNH/Face%20to%20Face.full.jpg -faceless_butcher.jpg http://[server]/TO/Faceless%20Butcher.full.jpg -faceless_devourer.jpg http://[server]/TSP/Faceless%20Devourer.full.jpg -faces_of_the_past.jpg http://[server]/SC/Faces%20of%20the%20Past.full.jpg -facevaulter.jpg http://[server]/LRW/Facevaulter.full.jpg -fact_or_fiction.jpg http://[server]/IN/Fact%20or%20Fiction.full.jpg -fade_away.jpg http://[server]/EX/Fade%20Away.full.jpg -fade_from_memory.jpg http://[server]/ON/Fade%20from%20Memory.full.jpg -faerie_conclave.jpg http://[server]/10E/Faerie%20Conclave.full.jpg -faerie_harbinger.jpg http://[server]/LRW/Faerie%20Harbinger.full.jpg -faerie_macabre.jpg http://[server]/SHM/Faerie%20Macabre.full.jpg -faerie_mechanist.jpg http://[server]/CFX/Faerie%20Mechanist.full.jpg -faerie_noble.jpg http://[server]/HL/Faerie%20Noble.full.jpg -faerie_squadron.jpg http://[server]/IN/Faerie%20Squadron.full.jpg -faerie_swarm.jpg http://[server]/SHM/Faerie%20Swarm.full.jpg -faerie_tauntings.jpg http://[server]/LRW/Faerie%20Tauntings.full.jpg -faerie_trickery.jpg http://[server]/LRW/Faerie%20Trickery.full.jpg -faith_healer.jpg http://[server]/US/Faith%20Healer.full.jpg -faithful_squire.jpg http://[server]/BOK/Faithful%20Squire.full.jpg -faiths_fetters.jpg http://[server]/RAV/Faith's%20Fetters.full.jpg -fallen_angel.jpg http://[server]/8E/Fallen%20Angel.full.jpg -fallen_askari.jpg http://[server]/VI/Fallen%20Askari.full.jpg -fallen_cleric.jpg http://[server]/ON/Fallen%20Cleric.full.jpg -fallen_ideal.jpg http://[server]/TSP/Fallen%20Ideal.full.jpg -falling_star.jpg http://[server]/LG/Falling%20Star.full.jpg -falling_timber.jpg http://[server]/PS/Falling%20Timber.full.jpg -fallow_earth.jpg http://[server]/MI/Fallow%20Earth.full.jpg -fallow_wurm.jpg http://[server]/WL/Fallow%20Wurm.full.jpg -fallowsage.jpg http://[server]/LRW/Fallowsage.full.jpg -false_cure.jpg http://[server]/ON/False%20Cure.full.jpg -false_dawn.jpg http://[server]/AP/False%20Dawn.full.jpg -false_defeat.jpg http://[server]/P3/False%20Defeat.full.jpg -false_demise.jpg http://[server]/MM/False%20Demise.full.jpg -false_memories.jpg http://[server]/TO/False%20Memories.full.jpg -false_mourning.jpg http://[server]/P3/False%20Mourning.full.jpg -false_orders.jpg http://[server]/U/False%20Orders.full.jpg -false_peace.jpg http://[server]/ST/False%20Peace.full.jpg -false_prophet.jpg http://[server]/UD/False%20Prophet.full.jpg -false_summoning.jpg http://[server]/P2/False%20Summoning.full.jpg -falter.jpg http://[server]/US/Falter.full.jpg -familiar_ground.jpg http://[server]/WL/Familiar%20Ground.full.jpg -familiars_ruse.jpg http://[server]/LRW/Familiar's%20Ruse.full.jpg -famine.jpg http://[server]/P3/Famine.full.jpg -famished_ghoul.jpg http://[server]/OD/Famished%20Ghoul.full.jpg -fanatical_devotion.jpg http://[server]/NE/Fanatical%20Devotion.full.jpg -fanatical_fever.jpg http://[server]/IA/Fanatical%20Fever.full.jpg -fang_skulkin.jpg http://[server]/EVE/Fang%20Skulkin.full.jpg -fangren_firstborn.jpg http://[server]/DS/Fangren%20Firstborn.full.jpg -fangren_hunter.jpg http://[server]/MR/Fangren%20Hunter.full.jpg -fangren_pathcutter.jpg http://[server]/FD/Fangren%20Pathcutter.full.jpg -fanning_the_flames.jpg http://[server]/SH/Fanning%20the%20Flames.full.jpg -far_wanderings.jpg http://[server]/TO/Far%20Wanderings.full.jpg -farewell_to_arms.jpg http://[server]/UNH/Farewell%20to%20Arms.full.jpg -farhaven_elf.jpg http://[server]/SHM/Farhaven%20Elf.full.jpg -farmstead.jpg http://[server]/U/Farmstead.full.jpg -farrelite_priest.jpg http://[server]/FE/Farrelite%20Priest.full.jpg -farrels_mantle.jpg http://[server]/FE/Farrel's%20Mantle.full.jpg -farrels_zealot.jpg http://[server]/FE/Farrel's%20Zealot1.full.jpg -farseek.jpg http://[server]/RAV/Farseek.full.jpg -farsight_mask.jpg http://[server]/MR/Farsight%20Mask.full.jpg -fascist_art_director.jpg http://[server]/UNH/Fascist%20Art%20Director.full.jpg -fastbond.jpg http://[server]/U/Fastbond.full.jpg -fasting.jpg http://[server]/DK/Fasting.full.jpg -fat_ass.jpg http://[server]/UNH/Fat%20Ass.full.jpg -fatal_attraction.jpg http://[server]/FUT/Fatal%20Attraction.full.jpg -fatal_blow.jpg http://[server]/6E/Fatal%20Blow.full.jpg -fatal_frenzy.jpg http://[server]/PLC/Fatal%20Frenzy.full.jpg -fatal_lore.jpg http://[server]/AL/Fatal%20Lore.full.jpg -fatal_mutation.jpg http://[server]/SC/Fatal%20Mutation.full.jpg -fate_transfer.jpg http://[server]/SHM/Fate%20Transfer.full.jpg -fatespinner.jpg http://[server]/MR/Fatespinner.full.jpg -fatestitcher.jpg http://[server]/ALA/Fatestitcher.full.jpg -fathom_seer.jpg http://[server]/TSP/Fathom%20Seer.full.jpg -fathom_trawl.jpg http://[server]/LRW/Fathom%20Trawl.full.jpg -fatigue.jpg http://[server]/UD/Fatigue.full.jpg -fault_line.jpg http://[server]/US/Fault%20Line.full.jpg -fault_riders.jpg http://[server]/PY/Fault%20Riders.full.jpg -faultgrinder.jpg http://[server]/LRW/Faultgrinder.full.jpg -favor_of_the_mighty.jpg http://[server]/LRW/Favor%20of%20the%20Mighty.full.jpg -favor_of_the_overbeing.jpg http://[server]/EVE/Favor%20of%20the%20Overbeing.full.jpg -favorable_destiny.jpg http://[server]/MI/Favorable%20Destiny.full.jpg -fear.jpg http://[server]/10E/Fear.full.jpg -feast_of_blood.jpg http://[server]/ZEN/Feast%20of%20Blood.full.jpg -feast_of_flesh.jpg http://[server]/CS/Feast%20of%20Flesh.full.jpg -feast_of_the_unicorn.jpg http://[server]/AT/Feast%20of%20the%20Unicorn.full.jpg -feast_of_worms.jpg http://[server]/CHK/Feast%20of%20Worms.full.jpg -feast_or_famine.jpg http://[server]/AL/Feast%20or%20Famine1.full.jpg -fecundity.jpg http://[server]/8E/Fecundity.full.jpg -feebleness.jpg http://[server]/TSP/Feebleness.full.jpg -feedback.jpg http://[server]/5E/Feedback.full.jpg -feedback_bolt.jpg http://[server]/FD/Feedback%20Bolt.full.jpg -feeding_frenzy.jpg http://[server]/ON/Feeding%20Frenzy.full.jpg -feint.jpg http://[server]/LG/Feint.full.jpg -feldons_cane.jpg http://[server]/AQ/Feldon's%20Cane.full.jpg -felidar_sovereign.jpg http://[server]/ZEN/Felidar%20Sovereign.full.jpg -fellwar_stone.jpg http://[server]/9E/Fellwar%20Stone.full.jpg -femeref_archers.jpg http://[server]/10E/Femeref%20Archers.full.jpg -femeref_enchantress.jpg http://[server]/VI/Femeref%20Enchantress.full.jpg -femeref_healer.jpg http://[server]/MI/Femeref%20Healer.full.jpg -femeref_knight.jpg http://[server]/MI/Femeref%20Knight.full.jpg -femeref_scouts.jpg http://[server]/MI/Femeref%20Scouts.full.jpg -fen_stalker.jpg http://[server]/PY/Fen%20Stalker.full.jpg -fencer_clique.jpg http://[server]/MOR/Fencer%20Clique.full.jpg -fencers_magemark.jpg http://[server]/GP/Fencer's%20Magemark.full.jpg -fend_off.jpg http://[server]/UD/Fend%20Off.full.jpg -fendeep_summoner.jpg http://[server]/MOR/Fendeep%20Summoner.full.jpg -feral_animist.jpg http://[server]/GP/Feral%20Animist.full.jpg -feral_deceiver.jpg http://[server]/CHK/Feral%20Deceiver.full.jpg -feral_hydra.jpg http://[server]/ALA/Feral%20Hydra.full.jpg -feral_instinct.jpg http://[server]/VI/Feral%20Instinct.full.jpg -feral_lightning.jpg http://[server]/SOK/Feral%20Lightning.full.jpg -feral_shadow.jpg http://[server]/6E/Feral%20Shadow.full.jpg -feral_thallid.jpg http://[server]/FE/Feral%20Thallid.full.jpg -feral_throwback.jpg http://[server]/LE/Feral%20Throwback.full.jpg -ferocious_charge.jpg http://[server]/FD/Ferocious%20Charge.full.jpg -ferocity.jpg http://[server]/MM/Ferocity.full.jpg -ferozs_ban.jpg http://[server]/7E/Feroz's%20Ban.full.jpg -ferropede.jpg http://[server]/FD/Ferropede.full.jpg -fertile_ground.jpg http://[server]/8E/Fertile%20Ground.full.jpg -fertile_imagination.jpg http://[server]/DIS/Fertile%20Imagination.full.jpg -fertilid.jpg http://[server]/HOP/Fertilid.full.jpg -fervent_charge.jpg http://[server]/AP/Fervent%20Charge.full.jpg -fervent_denial.jpg http://[server]/OD/Fervent%20Denial.full.jpg -fervor.jpg http://[server]/6E/Fervor.full.jpg -festercreep.jpg http://[server]/MOR/Festercreep.full.jpg -festering_evil.jpg http://[server]/WL/Festering%20Evil.full.jpg -festering_goblin.jpg http://[server]/10E/Festering%20Goblin.full.jpg -festering_march.jpg http://[server]/FUT/Festering%20March.full.jpg -festering_wound.jpg http://[server]/UD/Festering%20Wound.full.jpg -festival.jpg http://[server]/DK/Festival.full.jpg -festival_of_the_guildpact.jpg http://[server]/RAV/Festival%20of%20the%20Guildpact.full.jpg -festival_of_trokin.jpg http://[server]/P2/Festival%20of%20Trokin.full.jpg -fetid_heath.jpg http://[server]/EVE/Fetid%20Heath.full.jpg -fetid_horror.jpg http://[server]/MI/Fetid%20Horror.full.jpg -feudkillers_verdict.jpg http://[server]/MOR/Feudkiller's%20Verdict.full.jpg -fever_charm.jpg http://[server]/ON/Fever%20Charm.full.jpg -fevered_convulsions.jpg http://[server]/TE/Fevered%20Convulsions.full.jpg -fevered_strength.jpg http://[server]/AL/Fevered%20Strength1.full.jpg -fickle_efreet.jpg http://[server]/PY/Fickle%20Efreet.full.jpg -fiddlehead_kami.jpg http://[server]/SOK/Fiddlehead%20Kami.full.jpg -field_marshal.jpg http://[server]/10E/Field%20Marshal.full.jpg -field_of_dreams.jpg http://[server]/LG/Field%20of%20Dreams.full.jpg -field_of_reality.jpg http://[server]/CHK/Field%20of%20Reality.full.jpg -field_of_souls.jpg http://[server]/TE/Field%20of%20Souls.full.jpg -field_surgeon.jpg http://[server]/UD/Field%20Surgeon.full.jpg -fieldmist_borderpost.jpg http://[server]/ARB/Fieldmist%20Borderpost.full.jpg -fierce_empath.jpg http://[server]/SC/Fierce%20Empath.full.jpg -fiery_bombardment.jpg http://[server]/EVE/Fiery%20Bombardment.full.jpg -fiery_conclusion.jpg http://[server]/RAV/Fiery%20Conclusion.full.jpg -fiery_fall.jpg http://[server]/CFX/Fiery%20Fall.full.jpg -fiery_gambit.jpg http://[server]/MR/Fiery%20Gambit.full.jpg -fiery_hellhound.jpg http://[server]/M10/Fiery%20Hellhound.full.jpg -fiery_justice.jpg http://[server]/IA/Fiery%20Justice.full.jpg -fiery_mantle.jpg http://[server]/US/Fiery%20Mantle.full.jpg -fiery_temper.jpg http://[server]/TO/Fiery%20Temper.full.jpg -fight_or_flight.jpg http://[server]/IN/Fight%20or%20Flight.full.jpg -fight_to_the_death.jpg http://[server]/ARB/Fight%20to%20the%20Death.full.jpg -fighting_chance.jpg http://[server]/EX/Fighting%20Chance.full.jpg -fighting_drake.jpg http://[server]/8E/Fighting%20Drake.full.jpg -figure_of_destiny.jpg http://[server]/EVE/Figure%20of%20Destiny.full.jpg -filigree_angel.jpg http://[server]/ARB/Filigree%20Angel.full.jpg -filigree_fracture.jpg http://[server]/CFX/Filigree%20Fracture.full.jpg -filigree_sages.jpg http://[server]/ALA/Filigree%20Sages.full.jpg -fill_with_fright.jpg http://[server]/FD/Fill%20with%20Fright.full.jpg -filth.jpg http://[server]/JU/Filth.full.jpg -filthy_cur.jpg http://[server]/OD/Filthy%20Cur.full.jpg -final_fortune.jpg http://[server]/7E/Final%20Fortune.full.jpg -final_judgment.jpg http://[server]/BOK/Final%20Judgment.full.jpg -final_punishment.jpg http://[server]/9E/Final%20Punishment.full.jpg -final_revels.jpg http://[server]/LRW/Final%20Revels.full.jpg -final_sting_faerie.jpg http://[server]/MOR/Final-Sting%20Faerie.full.jpg -final_strike.jpg http://[server]/PT/Final%20Strike.full.jpg -finest_hour.jpg http://[server]/ARB/Finest%20Hour.full.jpg -fire_ambush.jpg http://[server]/P3/Fire%20Ambush.full.jpg -fire_and_brimstone.jpg http://[server]/DK/Fire%20and%20Brimstone.full.jpg -fire_ants.jpg http://[server]/US/Fire%20Ants.full.jpg -fire_at_will.jpg http://[server]/EVE/Fire%20at%20Will.full.jpg -fire_belly_changeling.jpg http://[server]/LRW/Fire-Belly%20Changeling.full.jpg -fire_bowman.jpg http://[server]/P3/Fire%20Bowman.full.jpg -fire_covenant.jpg http://[server]/IA/Fire%20Covenant.full.jpg -fire_diamond.jpg http://[server]/7E/Fire%20Diamond.full.jpg -fire_dragon.jpg http://[server]/PT/Fire%20Dragon.full.jpg -fire_drake.jpg http://[server]/5E/Fire%20Drake.full.jpg -fire_elemental.jpg http://[server]/7E/Fire%20Elemental.full.jpg -fire_field_ogre.jpg http://[server]/ALA/Fire-Field%20Ogre.full.jpg -fire_imp.jpg http://[server]/PT/Fire%20Imp.full.jpg -fire_juggler.jpg http://[server]/MOR/Fire%20Juggler.full.jpg -fire_lit_thicket.jpg http://[server]/SHM/Fire-Lit%20Thicket.full.jpg -fire_snake.jpg http://[server]/PT/Fire%20Snake.full.jpg -fire_sprites.jpg http://[server]/LG/Fire%20Sprites.full.jpg -fire_tempest.jpg http://[server]/PT/Fire%20Tempest.full.jpg -fire_whip.jpg http://[server]/WL/Fire%20Whip.full.jpg -fireball.jpg http://[server]/M10/Fireball.full.jpg -fireblast.jpg http://[server]/VI/Fireblast.full.jpg -firebolt.jpg http://[server]/OD/Firebolt.full.jpg -firebrand_ranger.jpg http://[server]/IN/Firebrand%20Ranger.full.jpg -firebreathing.jpg http://[server]/M10/Firebreathing.full.jpg -firecat_blitz.jpg http://[server]/JU/Firecat%20Blitz.full.jpg -firefly.jpg http://[server]/TE/Firefly.full.jpg -firefright_mage.jpg http://[server]/PLC/Firefright%20Mage.full.jpg -fireice.jpg http://[server]/AP/FireIce.full.jpg -firemane_angel.jpg http://[server]/RAV/Firemane%20Angel.full.jpg -firemaw_kavu.jpg http://[server]/TSP/Firemaw%20Kavu.full.jpg -fires_of_yavimaya.jpg http://[server]/IN/Fires%20of%20Yavimaya.full.jpg -firescreamer.jpg http://[server]/IN/Firescreamer.full.jpg -fireshrieker.jpg http://[server]/MR/Fireshrieker.full.jpg -fireslinger.jpg http://[server]/TE/Fireslinger.full.jpg -firespout.jpg http://[server]/SHM/Firespout.full.jpg -firestorm.jpg http://[server]/WL/Firestorm.full.jpg -firestorm_hellkite.jpg http://[server]/VI/Firestorm%20Hellkite.full.jpg -firestorm_phoenix.jpg http://[server]/LG/Firestorm%20Phoenix.full.jpg -firewake_sliver.jpg http://[server]/TSP/Firewake%20Sliver.full.jpg -firewild_borderpost.jpg http://[server]/ARB/Firewild%20Borderpost.full.jpg -first_come_first_served.jpg http://[server]/UNH/First%20Come,%20First%20Served.full.jpg -first_volley.jpg http://[server]/BOK/First%20Volley.full.jpg -fishliver_oil.jpg http://[server]/9E/Fishliver%20Oil.full.jpg -fissure.jpg http://[server]/DK/Fissure.full.jpg -fist_of_suns.jpg http://[server]/FD/Fist%20of%20Suns.full.jpg -fistful_of_force.jpg http://[server]/LRW/Fistful%20of%20Force.full.jpg -fists_of_ironwood.jpg http://[server]/RAV/Fists%20of%20Ironwood.full.jpg -fists_of_the_anvil.jpg http://[server]/10E/Fists%20of%20the%20Anvil.full.jpg -fists_of_the_demigod.jpg http://[server]/SHM/Fists%20of%20the%20Demigod.full.jpg -fit_of_rage.jpg http://[server]/WL/Fit%20of%20Rage.full.jpg -flaccify.jpg http://[server]/UNH/Flaccify.full.jpg -flagstones_of_trokair.jpg http://[server]/TSP/Flagstones%20of%20Trokair.full.jpg -flailing_drake.jpg http://[server]/TE/Flailing%20Drake.full.jpg -flailing_manticore.jpg http://[server]/MM/Flailing%20Manticore.full.jpg -flailing_ogre.jpg http://[server]/MM/Flailing%20Ogre.full.jpg -flailing_soldier.jpg http://[server]/MM/Flailing%20Soldier.full.jpg -flame_burst.jpg http://[server]/OD/Flame%20Burst.full.jpg -flame_elemental.jpg http://[server]/MI/Flame%20Elemental.full.jpg -flame_fusillade.jpg http://[server]/RAV/Flame%20Fusillade.full.jpg -flame_jab.jpg http://[server]/EVE/Flame%20Jab.full.jpg -flame_javelin.jpg http://[server]/SHM/Flame%20Javelin.full.jpg -flame_jet.jpg http://[server]/UD/Flame%20Jet.full.jpg -flame_kin_war_scout.jpg http://[server]/DIS/Flame-Kin%20War%20Scout.full.jpg -flame_kin_zealot.jpg http://[server]/RAV/Flame-Kin%20Zealot.full.jpg -flame_rift.jpg http://[server]/NE/Flame%20Rift.full.jpg -flame_spirit.jpg http://[server]/IA/Flame%20Spirit.full.jpg -flame_wave.jpg http://[server]/9E/Flame%20Wave.full.jpg -flameblast_dragon.jpg http://[server]/ALA/Flameblast%20Dragon.full.jpg -flamebreak.jpg http://[server]/DS/Flamebreak.full.jpg -flamecore_elemental.jpg http://[server]/TSP/Flamecore%20Elemental.full.jpg -flamekin_bladewhirl.jpg http://[server]/LRW/Flamekin%20Bladewhirl.full.jpg -flamekin_brawler.jpg http://[server]/LRW/Flamekin%20Brawler.full.jpg -flamekin_harbinger.jpg http://[server]/LRW/Flamekin%20Harbinger.full.jpg -flamekin_spitfire.jpg http://[server]/LRW/Flamekin%20Spitfire.full.jpg -flames_of_the_blood_hand.jpg http://[server]/BOK/Flames%20of%20the%20Blood%20Hand.full.jpg -flameshot.jpg http://[server]/PY/Flameshot.full.jpg -flamestick_courier.jpg http://[server]/ON/Flamestick%20Courier.full.jpg -flametongue_kavu.jpg http://[server]/PS/Flametongue%20Kavu.full.jpg -flamewave_invoker.jpg http://[server]/10E/Flamewave%20Invoker.full.jpg -flaming_gambit.jpg http://[server]/TO/Flaming%20Gambit.full.jpg -flaming_sword.jpg http://[server]/MM/Flaming%20Sword.full.jpg -flanking_troops.jpg http://[server]/P3/Flanking%20Troops.full.jpg -flare.jpg http://[server]/MI/Flare.full.jpg -flaring_flame_kin.jpg http://[server]/DIS/Flaring%20Flame-Kin.full.jpg -flaring_pain.jpg http://[server]/JU/Flaring%20Pain.full.jpg -flash.jpg http://[server]/MI/Flash.full.jpg -flash_conscription.jpg http://[server]/RAV/Flash%20Conscription.full.jpg -flash_counter.jpg http://[server]/8E/Flash%20Counter.full.jpg -flash_flood.jpg http://[server]/LG/Flash%20Flood.full.jpg -flash_foliage.jpg http://[server]/DIS/Flash%20Foliage.full.jpg -flash_of_defiance.jpg http://[server]/TO/Flash%20of%20Defiance.full.jpg -flash_of_insight.jpg http://[server]/JU/Flash%20of%20Insight.full.jpg -flashfires.jpg http://[server]/9E/Flashfires.full.jpg -flashfreeze.jpg http://[server]/M10/Flashfreeze.full.jpg -flay.jpg http://[server]/PY/Flay.full.jpg -flayed_nim.jpg http://[server]/MR/Flayed%20Nim.full.jpg -fledgling_djinn.jpg http://[server]/WL/Fledgling%20Djinn.full.jpg -fledgling_dragon.jpg http://[server]/JU/Fledgling%20Dragon.full.jpg -fledgling_imp.jpg http://[server]/OD/Fledgling%20Imp.full.jpg -fledgling_mawcor.jpg http://[server]/TSP/Fledgling%20Mawcor.full.jpg -fledgling_osprey.jpg http://[server]/UD/Fledgling%20Osprey.full.jpg -fleet_footed_monk.jpg http://[server]/PT/Fleet-Footed%20Monk.full.jpg -fleetfoot_panther.jpg http://[server]/PS/Fleetfoot%20Panther.full.jpg -fleeting_aven.jpg http://[server]/ON/Fleeting%20Aven.full.jpg -fleeting_image.jpg http://[server]/9E/Fleeting%20Image.full.jpg -flesh_reaver.jpg http://[server]/US/Flesh%20Reaver.full.jpg -fleshbag_marauder.jpg http://[server]/ALA/Fleshbag%20Marauder.full.jpg -fleshformer.jpg http://[server]/CFX/Fleshformer.full.jpg -fleshgrafter.jpg http://[server]/FD/Fleshgrafter.full.jpg -fleshwrither.jpg http://[server]/FUT/Fleshwrither.full.jpg -flicker.jpg http://[server]/UD/Flicker.full.jpg -flickerform.jpg http://[server]/RAV/Flickerform.full.jpg -flickering_spirit.jpg http://[server]/TSP/Flickering%20Spirit.full.jpg -flickering_ward.jpg http://[server]/TE/Flickering%20Ward.full.jpg -flickerwisp.jpg http://[server]/EVE/Flickerwisp.full.jpg -flight.jpg http://[server]/9E/Flight.full.jpg -flight_of_fancy.jpg http://[server]/RAV/Flight%20of%20Fancy.full.jpg -fling.jpg http://[server]/SH/Fling.full.jpg -flint_golem.jpg http://[server]/NE/Flint%20Golem.full.jpg -floating_dream_zubera.jpg http://[server]/CHK/Floating-Dream%20Zubera.full.jpg -floating_shield.jpg http://[server]/TO/Floating%20Shield.full.jpg -flock_of_rabid_sheep.jpg http://[server]/UG/Flock%20of%20Rabid%20Sheep.full.jpg -flood.jpg http://[server]/DK/Flood.full.jpg -flood_plain.jpg http://[server]/MI/Flood%20Plain.full.jpg -floodbringer.jpg http://[server]/BOK/Floodbringer.full.jpg -floodchaser.jpg http://[server]/MOR/Floodchaser.full.jpg -flooded_grove.jpg http://[server]/EVE/Flooded%20Grove.full.jpg -flooded_shoreline.jpg http://[server]/VI/Flooded%20Shoreline.full.jpg -flooded_strand.jpg http://[server]/ON/Flooded%20Strand.full.jpg -flooded_woodlands.jpg http://[server]/IA/Flooded%20Woodlands.full.jpg -floodgate.jpg http://[server]/MI/Floodgate.full.jpg -floodwater_dam.jpg http://[server]/AL/Floodwater%20Dam.full.jpg -floral_spuzzem.jpg http://[server]/LG/Floral%20Spuzzem.full.jpg -flourishing_defenses.jpg http://[server]/SHM/Flourishing%20Defenses.full.jpg -flow_of_ideas.jpg http://[server]/SHM/Flow%20of%20Ideas.full.jpg -flow_of_maggots.jpg http://[server]/IA/Flow%20of%20Maggots.full.jpg -flowering_field.jpg http://[server]/PY/Flowering%20Field.full.jpg -flowstone_armor.jpg http://[server]/NE/Flowstone%20Armor.full.jpg -flowstone_blade.jpg http://[server]/SH/Flowstone%20Blade.full.jpg -flowstone_channeler.jpg http://[server]/TSP/Flowstone%20Channeler.full.jpg -flowstone_charger.jpg http://[server]/AP/Flowstone%20Charger.full.jpg -flowstone_crusher.jpg http://[server]/9E/Flowstone%20Crusher.full.jpg -flowstone_embrace.jpg http://[server]/FUT/Flowstone%20Embrace.full.jpg -flowstone_flood.jpg http://[server]/EX/Flowstone%20Flood.full.jpg -flowstone_giant.jpg http://[server]/TE/Flowstone%20Giant.full.jpg -flowstone_hellion.jpg http://[server]/SH/Flowstone%20Hellion.full.jpg -flowstone_mauler.jpg http://[server]/SH/Flowstone%20Mauler.full.jpg -flowstone_overseer.jpg http://[server]/NE/Flowstone%20Overseer.full.jpg -flowstone_salamander.jpg http://[server]/TE/Flowstone%20Salamander.full.jpg -flowstone_sculpture.jpg http://[server]/TE/Flowstone%20Sculpture.full.jpg -flowstone_shambler.jpg http://[server]/9E/Flowstone%20Shambler.full.jpg -flowstone_slide.jpg http://[server]/10E/Flowstone%20Slide.full.jpg -flowstone_strike.jpg http://[server]/NE/Flowstone%20Strike.full.jpg -flowstone_surge.jpg http://[server]/NE/Flowstone%20Surge.full.jpg -flowstone_thopter.jpg http://[server]/NE/Flowstone%20Thopter.full.jpg -flowstone_wall.jpg http://[server]/NE/Flowstone%20Wall.full.jpg -flowstone_wyvern.jpg http://[server]/TE/Flowstone%20Wyvern.full.jpg -fluctuator.jpg http://[server]/US/Fluctuator.full.jpg -flurry_of_wings.jpg http://[server]/ARB/Flurry%20of%20Wings.full.jpg -flux.jpg http://[server]/PT/Flux.full.jpg -flying_carpet.jpg http://[server]/8E/Flying%20Carpet.full.jpg -flying_men.jpg http://[server]/AN/Flying%20Men.full.jpg -fodder_cannon.jpg http://[server]/8E/Fodder%20Cannon.full.jpg -fodder_launch.jpg http://[server]/LRW/Fodder%20Launch.full.jpg -fog.jpg http://[server]/M10/Fog.full.jpg -fog_bank.jpg http://[server]/US/Fog%20Bank.full.jpg -fog_elemental.jpg http://[server]/10E/Fog%20Elemental.full.jpg -fog_of_gnats.jpg http://[server]/UL/Fog%20of%20Gnats.full.jpg -fog_patch.jpg http://[server]/NE/Fog%20Patch.full.jpg -foil.jpg http://[server]/PY/Foil.full.jpg -fold_into_aether.jpg http://[server]/FD/Fold%20into%20AEther.full.jpg -folk_medicine.jpg http://[server]/JU/Folk%20Medicine.full.jpg -folk_of_an_havva.jpg http://[server]/HL/Folk%20of%20An-Havva1.full.jpg -folk_of_the_pines.jpg http://[server]/IA/Folk%20of%20the%20Pines.full.jpg -followed_footsteps.jpg http://[server]/RAV/Followed%20Footsteps.full.jpg -fomori_nomad.jpg http://[server]/FUT/Fomori%20Nomad.full.jpg -font_of_mythos.jpg http://[server]/CFX/Font%20of%20Mythos.full.jpg -food_chain.jpg http://[server]/MM/Food%20Chain.full.jpg -fools_demise.jpg http://[server]/TSP/Fool's%20Demise.full.jpg -fools_tome.jpg http://[server]/TE/Fool's%20Tome.full.jpg -foot_soldiers.jpg http://[server]/9E/Foot%20Soldiers.full.jpg -footbottom_feast.jpg http://[server]/LRW/Footbottom%20Feast.full.jpg -foothill_guide.jpg http://[server]/ON/Foothill%20Guide.full.jpg -footsteps_of_the_goryo.jpg http://[server]/SOK/Footsteps%20of%20the%20Goryo.full.jpg -foratog.jpg http://[server]/8E/Foratog.full.jpg -forbid.jpg http://[server]/EX/Forbid.full.jpg -forbidden_crypt.jpg http://[server]/MI/Forbidden%20Crypt.full.jpg -forbidden_lore.jpg http://[server]/IA/Forbidden%20Lore.full.jpg -forbidden_orchard.jpg http://[server]/CHK/Forbidden%20Orchard.full.jpg -forbidden_ritual.jpg http://[server]/VI/Forbidden%20Ritual.full.jpg -forbidding_watchtower.jpg http://[server]/10E/Forbidding%20Watchtower.full.jpg -force_bubble.jpg http://[server]/SC/Force%20Bubble.full.jpg -force_of_nature.jpg http://[server]/9E/Force%20of%20Nature.full.jpg -force_of_savagery.jpg http://[server]/FUT/Force%20of%20Savagery.full.jpg -force_of_will.jpg http://[server]/AL/Force%20of%20Will.full.jpg -force_spike.jpg http://[server]/7E/Force%20Spike.full.jpg -force_void.jpg http://[server]/IA/Force%20Void.full.jpg -forced_fruition.jpg http://[server]/LRW/Forced%20Fruition.full.jpg -forced_march.jpg http://[server]/MM/Forced%20March.full.jpg -forced_retreat.jpg http://[server]/P3/Forced%20Retreat.full.jpg -forcefield.jpg http://[server]/U/Forcefield.full.jpg -forcemage_advocate.jpg http://[server]/JU/Forcemage%20Advocate.full.jpg -foresee.jpg http://[server]/FUT/Foresee.full.jpg -foreshadow.jpg http://[server]/VI/Foreshadow.full.jpg -foresight.jpg http://[server]/AL/Foresight1.full.jpg -forest_bear.jpg http://[server]/P3/Forest%20Bear.full.jpg -forethought_amulet.jpg http://[server]/LG/Forethought%20Amulet.full.jpg -forfend.jpg http://[server]/MOR/Forfend.full.jpg -forge_armor.jpg http://[server]/MR/Forge%20Armor.full.jpg -forget.jpg http://[server]/6E/Forget.full.jpg -forgotten_ancient.jpg http://[server]/SC/Forgotten%20Ancient.full.jpg -forgotten_cave.jpg http://[server]/ON/Forgotten%20Cave.full.jpg -forgotten_harvest.jpg http://[server]/PY/Forgotten%20Harvest.full.jpg -forgotten_lore.jpg http://[server]/IA/Forgotten%20Lore.full.jpg -foriysian_brigade.jpg http://[server]/WL/Foriysian%20Brigade.full.jpg -foriysian_interceptor.jpg http://[server]/TSP/Foriysian%20Interceptor.full.jpg -foriysian_totem.jpg http://[server]/TSP/Foriysian%20Totem.full.jpg -fork.jpg http://[server]/U/Fork.full.jpg -forked_branch_garami.jpg http://[server]/BOK/Forked-Branch%20Garami.full.jpg -forked_lightning.jpg http://[server]/PT/Forked%20Lightning.full.jpg -form_of_the_dragon.jpg http://[server]/9E/Form%20of%20the%20Dragon.full.jpg -form_of_the_squirrel.jpg http://[server]/UNH/Form%20of%20the%20Squirrel.full.jpg -formation.jpg http://[server]/IA/Formation.full.jpg -forsaken_city.jpg http://[server]/PS/Forsaken%20City.full.jpg -forsaken_wastes.jpg http://[server]/MI/Forsaken%20Wastes.full.jpg -fortified_area.jpg http://[server]/LG/Fortified%20Area.full.jpg -fortify.jpg http://[server]/TSP/Fortify.full.jpg -fortitude.jpg http://[server]/US/Fortitude.full.jpg -fortune_thief.jpg http://[server]/TSP/Fortune%20Thief.full.jpg -fossil_find.jpg http://[server]/SHM/Fossil%20Find.full.jpg -foster.jpg http://[server]/MM/Foster.full.jpg -foul_familiar.jpg http://[server]/IA/Foul%20Familiar.full.jpg -foul_imp.jpg http://[server]/9E/Foul%20Imp.full.jpg -foul_presence.jpg http://[server]/AP/Foul%20Presence.full.jpg -foul_spirit.jpg http://[server]/P2/Foul%20Spirit.full.jpg -fountain_of_cho.jpg http://[server]/MM/Fountain%20of%20Cho.full.jpg -fountain_of_youth.jpg http://[server]/10E/Fountain%20of%20Youth.full.jpg -fountain_watch.jpg http://[server]/MM/Fountain%20Watch.full.jpg -fowl_play.jpg http://[server]/UG/Fowl%20Play.full.jpg -foxfire.jpg http://[server]/IA/Foxfire.full.jpg -foxfire_oak.jpg http://[server]/SHM/Foxfire%20Oak.full.jpg -fraction_jackson.jpg http://[server]/UNH/Fraction%20Jackson.full.jpg -fractured_loyalty.jpg http://[server]/MR/Fractured%20Loyalty.full.jpg -fracturing_gust.jpg http://[server]/SHM/Fracturing%20Gust.full.jpg -framed!.jpg http://[server]/UNH/Framed!.full.jpg -frankensteins_monster.jpg http://[server]/DK/Frankenstein's%20Monster.full.jpg -frankie_peanuts.jpg http://[server]/UNH/Frankie%20Peanuts.full.jpg -frantic_purification.jpg http://[server]/TO/Frantic%20Purification.full.jpg -frantic_search.jpg http://[server]/UL/Frantic%20Search.full.jpg -fraternal_exaltation.jpg http://[server]/PR/Fraternal%20Exaltation.full.jpg -frazzle.jpg http://[server]/GP/Frazzle.full.jpg -frazzled_editor.jpg http://[server]/UNH/Frazzled%20Editor.full.jpg -free_for_all.jpg http://[server]/UG/Free-for-All.full.jpg -free_range_chicken.jpg http://[server]/UG/Free-Range%20Chicken.full.jpg -freed_from_the_real.jpg http://[server]/SOK/Freed%20from%20the%20Real.full.jpg -freewind_equenaut.jpg http://[server]/DIS/Freewind%20Equenaut.full.jpg -freewind_falcon.jpg http://[server]/AT/Freewind%20Falcon.full.jpg -frenetic_efreet.jpg http://[server]/MI/Frenetic%20Efreet.full.jpg -frenetic_ogre.jpg http://[server]/OD/Frenetic%20Ogre.full.jpg -frenetic_raptor.jpg http://[server]/LE/Frenetic%20Raptor.full.jpg -frenetic_sliver.jpg http://[server]/PLC/Frenetic%20Sliver.full.jpg -frenzied_goblin.jpg http://[server]/RAV/Frenzied%20Goblin.full.jpg -frenzied_tilling.jpg http://[server]/IN/Frenzied%20Tilling.full.jpg -frenzy_sliver.jpg http://[server]/FUT/Frenzy%20Sliver.full.jpg -fresh_volunteers.jpg http://[server]/MM/Fresh%20Volunteers.full.jpg -freyalise_supplicant.jpg http://[server]/IA/Freyalise%20Supplicant.full.jpg -freyalises_charm.jpg http://[server]/IA/Freyalise's%20Charm.full.jpg -freyalises_radiance.jpg http://[server]/CS/Freyalise's%20Radiance.full.jpg -freyalises_winds.jpg http://[server]/IA/Freyalise's%20Winds.full.jpg -frightcrawler.jpg http://[server]/OD/Frightcrawler.full.jpg -frightshroud_courier.jpg http://[server]/ON/Frightshroud%20Courier.full.jpg -frog_tongue.jpg http://[server]/TE/Frog%20Tongue.full.jpg -frogmite.jpg http://[server]/MR/Frogmite.full.jpg -frogtosser_banneret.jpg http://[server]/MOR/Frogtosser%20Banneret.full.jpg -frontier_guide.jpg http://[server]/ZEN/Frontier%20Guide.full.jpg -frontline_sage.jpg http://[server]/CFX/Frontline%20Sage.full.jpg -frontline_strategist.jpg http://[server]/SC/Frontline%20Strategist.full.jpg -frost_giant.jpg http://[server]/LG/Frost%20Giant.full.jpg -frost_marsh.jpg http://[server]/CS/Frost%20Marsh.full.jpg -frost_ogre.jpg http://[server]/BOK/Frost%20Ogre.full.jpg -frost_raptor.jpg http://[server]/CS/Frost%20Raptor.full.jpg -frostling.jpg http://[server]/BOK/Frostling.full.jpg -frostweb_spider.jpg http://[server]/CS/Frostweb%20Spider.full.jpg -frostwielder.jpg http://[server]/CHK/Frostwielder.full.jpg -frozen_aether.jpg http://[server]/PLC/Frozen%20Aether.full.jpg -frozen_shade.jpg http://[server]/5E/Frozen%20Shade.full.jpg -frozen_solid.jpg http://[server]/SC/Frozen%20Solid.full.jpg -fruitcake_elemental.jpg http://[server]/HHL/Fruitcake%20Elemental.full.jpg -fruition.jpg http://[server]/PT/Fruition.full.jpg -fugitive_druid.jpg http://[server]/TE/Fugitive%20Druid.full.jpg -fugitive_wizard.jpg http://[server]/10E/Fugitive%20Wizard.full.jpg -fugue.jpg http://[server]/7E/Fugue.full.jpg -fulminator_mage.jpg http://[server]/SHM/Fulminator%20Mage.full.jpg -fumarole.jpg http://[server]/IA/Fumarole.full.jpg -fumiko_the_lowblood.jpg http://[server]/BOK/Fumiko%20the%20Lowblood.full.jpg -funeral_charm.jpg http://[server]/VI/Funeral%20Charm.full.jpg -funeral_march.jpg http://[server]/HL/Funeral%20March.full.jpg -funeral_pyre.jpg http://[server]/JU/Funeral%20Pyre.full.jpg -fungal_behemoth.jpg http://[server]/PLC/Fungal%20Behemoth.full.jpg -fungal_bloom.jpg http://[server]/FE/Fungal%20Bloom.full.jpg -fungal_reaches.jpg http://[server]/TSP/Fungal%20Reaches.full.jpg -fungal_shambler.jpg http://[server]/AP/Fungal%20Shambler.full.jpg -fungus_elemental.jpg http://[server]/WL/Fungus%20Elemental.full.jpg -fungus_sliver.jpg http://[server]/TSP/Fungus%20Sliver.full.jpg -fungusaur.jpg http://[server]/8E/Fungusaur.full.jpg -furious_assault.jpg http://[server]/MM/Furious%20Assault.full.jpg -furnace_brood.jpg http://[server]/EX/Furnace%20Brood.full.jpg -furnace_dragon.jpg http://[server]/DS/Furnace%20Dragon.full.jpg -furnace_of_rath.jpg http://[server]/10E/Furnace%20of%20Rath.full.jpg -furnace_spirit.jpg http://[server]/SH/Furnace%20Spirit.full.jpg -furnace_whelp.jpg http://[server]/10E/Furnace%20Whelp.full.jpg -fury_charm.jpg http://[server]/PLC/Fury%20Charm.full.jpg -fury_of_the_horde.jpg http://[server]/CS/Fury%20of%20the%20Horde.full.jpg -fury_sliver.jpg http://[server]/TSP/Fury%20Sliver.full.jpg -furystoke_giant.jpg http://[server]/SHM/Furystoke%20Giant.full.jpg -fusion_elemental.jpg http://[server]/CFX/Fusion%20Elemental.full.jpg -future_sight.jpg http://[server]/ON/Future%20Sight.full.jpg -fylamarid.jpg http://[server]/TE/Fylamarid.full.jpg -fylgja.jpg http://[server]/IA/Fylgja.full.jpg -fyndhorn_bow.jpg http://[server]/IA/Fyndhorn%20Bow.full.jpg -fyndhorn_brownie.jpg http://[server]/IA/Fyndhorn%20Brownie.full.jpg -fyndhorn_druid.jpg http://[server]/AL/Fyndhorn%20Druid1.full.jpg -fyndhorn_elder.jpg http://[server]/8E/Fyndhorn%20Elder.full.jpg -fyndhorn_elves.jpg http://[server]/IA/Fyndhorn%20Elves.full.jpg -fyndhorn_pollen.jpg http://[server]/IA/Fyndhorn%20Pollen.full.jpg \ No newline at end of file diff --git a/res/pics_link/card-pictures_g.txt b/res/pics_link/card-pictures_g.txt deleted file mode 100644 index c724309b4ab..00000000000 --- a/res/pics_link/card-pictures_g.txt +++ /dev/null @@ -1,568 +0,0 @@ -gabriel_angelfire.jpg http://[server]/LG/Gabriel%20Angelfire.full.jpg -gaddock_teeg.jpg http://[server]/LRW/Gaddock%20Teeg.full.jpg -gaeas_anthem.jpg http://[server]/PLC/Gaea's%20Anthem.full.jpg -gaeas_avenger.jpg http://[server]/AQ/Gaea's%20Avenger.full.jpg -gaeas_balance.jpg http://[server]/AP/Gaea's%20Balance.full.jpg -gaeas_blessing.jpg http://[server]/WL/Gaea's%20Blessing.full.jpg -gaeas_bounty.jpg http://[server]/US/Gaea's%20Bounty.full.jpg -gaeas_cradle.jpg http://[server]/US/Gaea's%20Cradle.full.jpg -gaeas_embrace.jpg http://[server]/US/Gaea's%20Embrace.full.jpg -gaeas_herald.jpg http://[server]/10E/Gaea's%20Herald.full.jpg -gaeas_liege.jpg http://[server]/4E/Gaea's%20Liege.full.jpg -gaeas_might.jpg http://[server]/PS/Gaea's%20Might.full.jpg -gaeas_skyfolk.jpg http://[server]/AP/Gaea's%20Skyfolk.full.jpg -gaeas_touch.jpg http://[server]/DK/Gaea's%20Touch.full.jpg -gainsay.jpg http://[server]/PS/Gainsay.full.jpg -gale_force.jpg http://[server]/CHK/Gale%20Force.full.jpg -galepowder_mage.jpg http://[server]/LRW/Galepowder%20Mage.full.jpg -galinas_knight.jpg http://[server]/IN/Galina's%20Knight.full.jpg -gallantry.jpg http://[server]/OD/Gallantry.full.jpg -gallowbraid.jpg http://[server]/WL/Gallowbraid.full.jpg -galvanic_arc.jpg http://[server]/RAV/Galvanic%20Arc.full.jpg -galvanic_key.jpg http://[server]/MR/Galvanic%20Key.full.jpg -gamble.jpg http://[server]/US/Gamble.full.jpg -game_of_chaos.jpg http://[server]/5E/Game%20of%20Chaos.full.jpg -game_preserve.jpg http://[server]/MM/Game%20Preserve.full.jpg -game_trail_changeling.jpg http://[server]/MOR/Game-Trail%20Changeling.full.jpg -gamekeeper.jpg http://[server]/UD/Gamekeeper.full.jpg -gang_of_elk.jpg http://[server]/7E/Gang%20of%20Elk.full.jpg -gangrenous_goliath.jpg http://[server]/ON/Gangrenous%20Goliath.full.jpg -gangrenous_zombies.jpg http://[server]/IA/Gangrenous%20Zombies.full.jpg -gargantuan_gorilla.jpg http://[server]/AL/Gargantuan%20Gorilla.full.jpg -gargoyle_castle.jpg http://[server]/M10/Gargoyle%20Castle.full.jpg -garruk_wildspeaker.jpg http://[server]/M10/Garruk%20Wildspeaker.full.jpg -garza_zol_plague_queen.jpg http://[server]/CS/Garza%20Zol,%20Plague%20Queen.full.jpg -garzas_assassin.jpg http://[server]/CS/Garza's%20Assassin.full.jpg -gaseous_form.jpg http://[server]/6E/Gaseous%20Form.full.jpg -gate_hound.jpg http://[server]/RAV/Gate%20Hound.full.jpg -gate_to_phyrexia.jpg http://[server]/AQ/Gate%20to%20Phyrexia.full.jpg -gate_to_the_aether.jpg http://[server]/MR/Gate%20to%20the%20AEther.full.jpg -gatekeeper_of_malakir.jpg http://[server]/ZEN/Gatekeeper%20of%20Malakir.full.jpg -gathan_raiders.jpg http://[server]/FUT/Gathan%20Raiders.full.jpg -gather_courage.jpg http://[server]/RAV/Gather%20Courage.full.jpg -gather_specimens.jpg http://[server]/ALA/Gather%20Specimens.full.jpg -gatherer_of_graces.jpg http://[server]/GP/Gatherer%20of%20Graces.full.jpg -gauntlet_of_might.jpg http://[server]/U/Gauntlet%20of%20Might.full.jpg -gauntlet_of_power.jpg http://[server]/TSP/Gauntlet%20of%20Power.full.jpg -gauntlets_of_chaos.jpg http://[server]/LG/Gauntlets%20of%20Chaos.full.jpg -gaze_of_adamaro.jpg http://[server]/SOK/Gaze%20of%20Adamaro.full.jpg -gaze_of_justice.jpg http://[server]/TSP/Gaze%20of%20Justice.full.jpg -gaze_of_pain.jpg http://[server]/IA/Gaze%20of%20Pain.full.jpg -gaze_of_the_gorgon.jpg http://[server]/RAV/Gaze%20of%20the%20Gorgon.full.jpg -gelectrode.jpg http://[server]/GP/Gelectrode.full.jpg -gelid_shackles.jpg http://[server]/CS/Gelid%20Shackles.full.jpg -gemhide_sliver.jpg http://[server]/TSP/Gemhide%20Sliver.full.jpg -gemini_engine.jpg http://[server]/DS/Gemini%20Engine.full.jpg -gempalm_avenger.jpg http://[server]/LE/Gempalm%20Avenger.full.jpg -gempalm_incinerator.jpg http://[server]/LE/Gempalm%20Incinerator.full.jpg -gempalm_polluter.jpg http://[server]/LE/Gempalm%20Polluter.full.jpg -gempalm_sorcerer.jpg http://[server]/LE/Gempalm%20Sorcerer.full.jpg -gempalm_strider.jpg http://[server]/LE/Gempalm%20Strider.full.jpg -gemstone_array.jpg http://[server]/FD/Gemstone%20Array.full.jpg -gemstone_caverns.jpg http://[server]/TSP/Gemstone%20Caverns.full.jpg -gemstone_mine.jpg http://[server]/WL/Gemstone%20Mine.full.jpg -general_jarkeld.jpg http://[server]/IA/General%20Jarkeld.full.jpg -generals_kabuto.jpg http://[server]/CHK/General's%20Kabuto.full.jpg -generals_regalia.jpg http://[server]/MM/General's%20Regalia.full.jpg -genesis.jpg http://[server]/JU/Genesis.full.jpg -genesis_chamber.jpg http://[server]/DS/Genesis%20Chamber.full.jpg -genju_of_the_cedars.jpg http://[server]/BOK/Genju%20of%20the%20Cedars.full.jpg -genju_of_the_falls.jpg http://[server]/BOK/Genju%20of%20the%20Falls.full.jpg -genju_of_the_fens.jpg http://[server]/BOK/Genju%20of%20the%20Fens.full.jpg -genju_of_the_fields.jpg http://[server]/BOK/Genju%20of%20the%20Fields.full.jpg -genju_of_the_realm.jpg http://[server]/BOK/Genju%20of%20the%20Realm.full.jpg -genju_of_the_spires.jpg http://[server]/BOK/Genju%20of%20the%20Spires.full.jpg -geothermal_crevice.jpg http://[server]/IN/Geothermal%20Crevice.full.jpg -gerrard.jpg http://[server]/VG/Gerrard.full.jpg -gerrard_capashen.jpg http://[server]/AP/Gerrard%20Capashen.full.jpg -gerrards_battle_cry.jpg http://[server]/TE/Gerrard's%20Battle%20Cry.full.jpg -gerrards_command.jpg http://[server]/PS/Gerrard's%20Command.full.jpg -gerrards_irregulars.jpg http://[server]/MM/Gerrard's%20Irregulars.full.jpg -gerrards_verdict.jpg http://[server]/AP/Gerrard's%20Verdict.full.jpg -gerrards_wisdom.jpg http://[server]/7E/Gerrard's%20Wisdom.full.jpg -gerrymandering.jpg http://[server]/UG/Gerrymandering.full.jpg -get_a_life.jpg http://[server]/UG/Get%20a%20Life.full.jpg -geths_grimoire.jpg http://[server]/DS/Geth's%20Grimoire.full.jpg -geyser_glider.jpg http://[server]/ZEN/Geyser%20Glider.full.jpg -ghastlord_of_fugue.jpg http://[server]/SHM/Ghastlord%20of%20Fugue.full.jpg -ghastly_demise.jpg http://[server]/OD/Ghastly%20Demise.full.jpg -ghastly_discovery.jpg http://[server]/SHM/Ghastly%20Discovery.full.jpg -ghastly_remains.jpg http://[server]/LE/Ghastly%20Remains.full.jpg -ghazban_ogre.jpg http://[server]/5E/Ghazban%20Ogre.full.jpg -ghazban_ogress.jpg http://[server]/UG/Ghazban%20Ogress.full.jpg -ghitu_encampment.jpg http://[server]/10E/Ghitu%20Encampment.full.jpg -ghitu_fire.jpg http://[server]/IN/Ghitu%20Fire.full.jpg -ghitu_fire_eater.jpg http://[server]/7E/Ghitu%20Fire-Eater.full.jpg -ghitu_firebreathing.jpg http://[server]/TSP/Ghitu%20Firebreathing.full.jpg -ghitu_slinger.jpg http://[server]/UL/Ghitu%20Slinger.full.jpg -ghitu_war_cry.jpg http://[server]/UL/Ghitu%20War%20Cry.full.jpg -ghor_clan_bloodscale.jpg http://[server]/GP/Ghor-Clan%20Bloodscale.full.jpg -ghor_clan_savage.jpg http://[server]/GP/Ghor-Clan%20Savage.full.jpg -ghost_council_of_orzhova.jpg http://[server]/GP/Ghost%20Council%20of%20Orzhova.full.jpg -ghost_hounds.jpg http://[server]/HL/Ghost%20Hounds.full.jpg -ghost_lit_nourisher.jpg http://[server]/SOK/Ghost-Lit%20Nourisher.full.jpg -ghost_lit_raider.jpg http://[server]/REL/Ghost-Lit%20Raider.full.jpg -ghost_lit_redeemer.jpg http://[server]/SOK/Ghost-Lit%20Redeemer.full.jpg -ghost_lit_stalker.jpg http://[server]/SOK/Ghost-Lit%20Stalker.full.jpg -ghost_lit_warder.jpg http://[server]/SOK/Ghost-Lit%20Warder.full.jpg -ghost_quarter.jpg http://[server]/DIS/Ghost%20Quarter.full.jpg -ghost_ship.jpg http://[server]/4E/Ghost%20Ship.full.jpg -ghost_tactician.jpg http://[server]/PLC/Ghost%20Tactician.full.jpg -ghost_town.jpg http://[server]/TE/Ghost%20Town.full.jpg -ghost_warden.jpg http://[server]/10E/Ghost%20Warden.full.jpg -ghostfire.jpg http://[server]/FUT/Ghostfire.full.jpg -ghostflame_sliver.jpg http://[server]/TSP/Ghostflame%20Sliver.full.jpg -ghosthelm_courier.jpg http://[server]/ON/Ghosthelm%20Courier.full.jpg -ghostly_changeling.jpg http://[server]/LRW/Ghostly%20Changeling.full.jpg -ghostly_flame.jpg http://[server]/IA/Ghostly%20Flame.full.jpg -ghostly_prison.jpg http://[server]/CHK/Ghostly%20Prison.full.jpg -ghostly_visit.jpg http://[server]/P3/Ghostly%20Visit.full.jpg -ghostly_wings.jpg http://[server]/TO/Ghostly%20Wings.full.jpg -ghosts_of_the_damned.jpg http://[server]/LG/Ghosts%20of%20the%20Damned.full.jpg -ghosts_of_the_innocent.jpg http://[server]/RAV/Ghosts%20of%20the%20Innocent.full.jpg -ghostway.jpg http://[server]/GP/Ghostway.full.jpg -ghouls_feast.jpg http://[server]/MM/Ghoul's%20Feast.full.jpg -giant_albatross.jpg http://[server]/HL/Giant%20Albatross1.full.jpg -giant_ambush_beetle.jpg http://[server]/ARB/Giant%20Ambush%20Beetle.full.jpg -giant_badger.jpg http://[server]/8E/Giant%20Badger.full.jpg -giant_caterpillar.jpg http://[server]/MM/Giant%20Caterpillar.full.jpg -giant_cockroach.jpg http://[server]/9E/Giant%20Cockroach.full.jpg -giant_crab.jpg http://[server]/TE/Giant%20Crab.full.jpg -giant_dustwasp.jpg http://[server]/PLC/Giant%20Dustwasp.full.jpg -giant_fan.jpg http://[server]/UG/Giant%20Fan.full.jpg -giant_growth.jpg http://[server]/M10/Giant%20Growth.full.jpg -giant_harbinger.jpg http://[server]/LRW/Giant%20Harbinger.full.jpg -giant_mantis.jpg http://[server]/MI/Giant%20Mantis.full.jpg -giant_octopus.jpg http://[server]/9E/Giant%20Octopus.full.jpg -giant_oyster.jpg http://[server]/HL/Giant%20Oyster.full.jpg -giant_scorpion.jpg http://[server]/ZEN/Giant%20Scorpion.full.jpg -giant_shark.jpg http://[server]/DK/Giant%20Shark.full.jpg -giant_slug.jpg http://[server]/LG/Giant%20Slug.full.jpg -giant_solifuge.jpg http://[server]/GP/Giant%20Solifuge.full.jpg -giant_spider.jpg http://[server]/M10/Giant%20Spider.full.jpg -giant_strength.jpg http://[server]/LG/Giant%20Strength.full.jpg -giant_tortoise.jpg http://[server]/4E/Giant%20Tortoise.full.jpg -giant_trap_door_spider.jpg http://[server]/IA/Giant%20Trap%20Door%20Spider.full.jpg -giant_turtle.jpg http://[server]/LG/Giant%20Turtle.full.jpg -giant_warthog.jpg http://[server]/JU/Giant%20Warthog.full.jpg -giantbaiting.jpg http://[server]/SHM/Giantbaiting.full.jpg -giants_ire.jpg http://[server]/LRW/Giant's%20Ire.full.jpg -gibbering_descent.jpg http://[server]/FUT/Gibbering%20Descent.full.jpg -gibbering_hyenas.jpg http://[server]/MI/Gibbering%20Hyenas.full.jpg -gibbering_kami.jpg http://[server]/CHK/Gibbering%20Kami.full.jpg -gift_of_estates.jpg http://[server]/PT/Gift%20of%20Estates.full.jpg -gift_of_granite.jpg http://[server]/FUT/Gift%20of%20Granite.full.jpg -gift_of_the_deity.jpg http://[server]/EVE/Gift%20of%20the%20Deity.full.jpg -gift_of_the_gargantuan.jpg http://[server]/ALA/Gift%20of%20the%20Gargantuan.full.jpg -gift_of_the_woods.jpg http://[server]/AL/Gift%20of%20the%20Woods1.full.jpg -gifts_ungiven.jpg http://[server]/CHK/Gifts%20Ungiven.full.jpg -gigadrowse.jpg http://[server]/GP/Gigadrowse.full.jpg -gigantiform.jpg http://[server]/ZEN/Gigantiform.full.jpg -gigapede.jpg http://[server]/ON/Gigapede.full.jpg -gilded_drake.jpg http://[server]/US/Gilded%20Drake.full.jpg -gilded_light.jpg http://[server]/SC/Gilded%20Light.full.jpg -gilded_lotus.jpg http://[server]/MR/Gilded%20Lotus.full.jpg -gilder_bairn.jpg http://[server]/EVE/Gilder%20Bairn.full.jpg -gilt_leaf_ambush.jpg http://[server]/LRW/Gilt-Leaf%20Ambush.full.jpg -gilt_leaf_archdruid.jpg http://[server]/MOR/Gilt-Leaf%20Archdruid.full.jpg -gilt_leaf_palace.jpg http://[server]/LRW/Gilt-Leaf%20Palace.full.jpg -gilt_leaf_seer.jpg http://[server]/LRW/Gilt-Leaf%20Seer.full.jpg -giltspire_avenger.jpg http://[server]/CFX/Giltspire%20Avenger.full.jpg -gix.jpg http://[server]/VG/Gix.full.jpg -glacial_chasm.jpg http://[server]/IA/Glacial%20Chasm.full.jpg -glacial_crevasses.jpg http://[server]/IA/Glacial%20Crevasses.full.jpg -glacial_fortress.jpg http://[server]/M10/Glacial%20Fortress.full.jpg -glacial_plating.jpg http://[server]/CS/Glacial%20Plating.full.jpg -glacial_ray.jpg http://[server]/CHK/Glacial%20Ray.full.jpg -glacial_wall.jpg http://[server]/7E/Glacial%20Wall.full.jpg -glaciers.jpg http://[server]/IA/Glaciers.full.jpg -glade_gnarr.jpg http://[server]/AP/Glade%20Gnarr.full.jpg -glamer_spinners.jpg http://[server]/SHM/Glamer%20Spinners.full.jpg -glamerdye.jpg http://[server]/EVE/Glamerdye.full.jpg -glare_of_subdual.jpg http://[server]/RAV/Glare%20of%20Subdual.full.jpg -glarecaster.jpg http://[server]/ON/Glarecaster.full.jpg -glarewielder.jpg http://[server]/LRW/Glarewielder.full.jpg -glass_asp.jpg http://[server]/TSP/Glass%20Asp.full.jpg -glass_golem.jpg http://[server]/RAV/Glass%20Golem.full.jpg -glassdust_hulk.jpg http://[server]/ARB/Glassdust%20Hulk.full.jpg -glasses_of_urza.jpg http://[server]/6E/Glasses%20of%20Urza.full.jpg -glaze_fiend.jpg http://[server]/ALA/Glaze%20Fiend.full.jpg -gleam_of_resistance.jpg http://[server]/CFX/Gleam%20of%20Resistance.full.jpg -gleancrawler.jpg http://[server]/RAV/Gleancrawler.full.jpg -gleeful_sabotage.jpg http://[server]/SHM/Gleeful%20Sabotage.full.jpg -gleemax.jpg http://[server]/UNH/Gleemax.full.jpg -glen_elendra_archmage.jpg http://[server]/EVE/Glen%20Elendra%20Archmage.full.jpg -glen_elendra_liege.jpg http://[server]/SHM/Glen%20Elendra%20Liege.full.jpg -glen_elendra_pranksters.jpg http://[server]/LRW/Glen%20Elendra%20Pranksters.full.jpg -gliding_licid.jpg http://[server]/SH/Gliding%20Licid.full.jpg -glimmerdust_nap.jpg http://[server]/LRW/Glimmerdust%20Nap.full.jpg -glimmering_angel.jpg http://[server]/IN/Glimmering%20Angel.full.jpg -glimmervoid.jpg http://[server]/MR/Glimmervoid.full.jpg -glimpse_of_nature.jpg http://[server]/CHK/Glimpse%20of%20Nature.full.jpg -glimpse_the_unthinkable.jpg http://[server]/RAV/Glimpse%20the%20Unthinkable.full.jpg -glint_eye_nephilim.jpg http://[server]/GP/Glint-Eye%20Nephilim.full.jpg -glintwing_invoker.jpg http://[server]/LE/Glintwing%20Invoker.full.jpg -glissa_sunseeker.jpg http://[server]/MR/Glissa%20Sunseeker.full.jpg -glitterfang.jpg http://[server]/SOK/Glitterfang.full.jpg -glittering_lion.jpg http://[server]/PY/Glittering%20Lion.full.jpg -glittering_lynx.jpg http://[server]/PY/Glittering%20Lynx.full.jpg -glittering_wish.jpg http://[server]/FUT/Glittering%20Wish.full.jpg -global_ruin.jpg http://[server]/IN/Global%20Ruin.full.jpg -gloom.jpg http://[server]/5E/Gloom.full.jpg -gloomdrifter.jpg http://[server]/TO/Gloomdrifter.full.jpg -gloomlance.jpg http://[server]/SHM/Gloomlance.full.jpg -gloomwidow.jpg http://[server]/SHM/Gloomwidow.full.jpg -gloomwidows_feast.jpg http://[server]/SHM/Gloomwidow's%20Feast.full.jpg -glorious_anthem.jpg http://[server]/10E/Glorious%20Anthem.full.jpg -glorious_charge.jpg http://[server]/M10/Glorious%20Charge.full.jpg -glory.jpg http://[server]/JU/Glory.full.jpg -glory_of_warfare.jpg http://[server]/HOP/Glory%20of%20Warfare.full.jpg -glory_seeker.jpg http://[server]/9E/Glory%20Seeker.full.jpg -gloryscale_viashino.jpg http://[server]/ARB/Gloryscale%20Viashino.full.jpg -glowering_rogon.jpg http://[server]/LE/Glowering%20Rogon.full.jpg -glowing_anemone.jpg http://[server]/MM/Glowing%20Anemone.full.jpg -glowrider.jpg http://[server]/LE/Glowrider.full.jpg -gluetius_maximus.jpg http://[server]/UNH/Gluetius%20Maximus.full.jpg -gluttonous_slime.jpg http://[server]/CFX/Gluttonous%20Slime.full.jpg -gluttonous_zombie.jpg http://[server]/9E/Gluttonous%20Zombie.full.jpg -glyph_of_delusion.jpg http://[server]/LG/Glyph%20of%20Delusion.full.jpg -glyph_of_destruction.jpg http://[server]/LG/Glyph%20of%20Destruction.full.jpg -glyph_of_doom.jpg http://[server]/LG/Glyph%20of%20Doom.full.jpg -glyph_of_life.jpg http://[server]/LG/Glyph%20of%20Life.full.jpg -glyph_of_reincarnation.jpg http://[server]/LG/Glyph%20of%20Reincarnation.full.jpg -gnarled_effigy.jpg http://[server]/SHM/Gnarled%20Effigy.full.jpg -gnarled_mass.jpg http://[server]/BOK/Gnarled%20Mass.full.jpg -gnat_alley_creeper.jpg http://[server]/DIS/Gnat%20Alley%20Creeper.full.jpg -gnat_miser.jpg http://[server]/SOK/Gnat%20Miser.full.jpg -goatnapper.jpg http://[server]/LRW/Goatnapper.full.jpg -gobhobbler_rats.jpg http://[server]/DIS/Gobhobbler%20Rats.full.jpg -goblin_archaeologist.jpg http://[server]/DS/Goblin%20Archaeologist.full.jpg -goblin_artillery.jpg http://[server]/M10/Goblin%20Artillery.full.jpg -goblin_artisans.jpg http://[server]/AQ/Goblin%20Artisans.full.jpg -goblin_assassin.jpg http://[server]/LE/Goblin%20Assassin.full.jpg -goblin_assault.jpg http://[server]/ALA/Goblin%20Assault.full.jpg -goblin_balloon_brigade.jpg http://[server]/9E/Goblin%20Balloon%20Brigade.full.jpg -goblin_berserker.jpg http://[server]/UD/Goblin%20Berserker.full.jpg -goblin_bomb.jpg http://[server]/WL/Goblin%20Bomb.full.jpg -goblin_bombardment.jpg http://[server]/TE/Goblin%20Bombardment.full.jpg -goblin_bookie.jpg http://[server]/UG/Goblin%20Bookie.full.jpg -goblin_bowling_team.jpg http://[server]/UG/Goblin%20Bowling%20Team.full.jpg -goblin_brawler.jpg http://[server]/FD/Goblin%20Brawler.full.jpg -goblin_brigand.jpg http://[server]/9E/Goblin%20Brigand.full.jpg -goblin_bully.jpg http://[server]/PT/Goblin%20Bully.full.jpg -goblin_burrows.jpg http://[server]/ON/Goblin%20Burrows.full.jpg -goblin_bushwhacker.jpg http://[server]/ZEN/Goblin%20Bushwhacker.full.jpg -goblin_cadets.jpg http://[server]/US/Goblin%20Cadets.full.jpg -goblin_cannon.jpg http://[server]/FD/Goblin%20Cannon.full.jpg -goblin_cavaliers.jpg http://[server]/ST/Goblin%20Cavaliers.full.jpg -goblin_caves.jpg http://[server]/DK/Goblin%20Caves.full.jpg -goblin_charbelcher.jpg http://[server]/MR/Goblin%20Charbelcher.full.jpg -goblin_chariot.jpg http://[server]/9E/Goblin%20Chariot.full.jpg -goblin_chieftain.jpg http://[server]/M10/Goblin%20Chieftain.full.jpg -goblin_chirurgeon.jpg http://[server]/FE/Goblin%20Chirurgeon1.full.jpg -goblin_clearcutter.jpg http://[server]/LE/Goblin%20Clearcutter.full.jpg -goblin_cohort.jpg http://[server]/BOK/Goblin%20Cohort.full.jpg -goblin_commando.jpg http://[server]/ST/Goblin%20Commando.full.jpg -goblin_deathraiders.jpg http://[server]/ALA/Goblin%20Deathraiders.full.jpg -goblin_digging_team.jpg http://[server]/7E/Goblin%20Digging%20Team.full.jpg -goblin_dirigible.jpg http://[server]/MR/Goblin%20Dirigible.full.jpg -goblin_dynamo.jpg http://[server]/LE/Goblin%20Dynamo.full.jpg -goblin_elite_infantry.jpg http://[server]/10E/Goblin%20Elite%20Infantry.full.jpg -goblin_festival.jpg http://[server]/UD/Goblin%20Festival.full.jpg -goblin_fire_fiend.jpg http://[server]/RAV/Goblin%20Fire%20Fiend.full.jpg -goblin_firebug.jpg http://[server]/LE/Goblin%20Firebug.full.jpg -goblin_firestarter.jpg http://[server]/P2/Goblin%20Firestarter.full.jpg -goblin_flectomancer.jpg http://[server]/GP/Goblin%20Flectomancer.full.jpg -goblin_flotilla.jpg http://[server]/FE/Goblin%20Flotilla.full.jpg -goblin_furrier.jpg http://[server]/CS/Goblin%20Furrier.full.jpg -goblin_game.jpg http://[server]/PS/Goblin%20Game.full.jpg -goblin_gardener.jpg http://[server]/7E/Goblin%20Gardener.full.jpg -goblin_general.jpg http://[server]/ST/Goblin%20General.full.jpg -goblin_glider.jpg http://[server]/8E/Goblin%20Glider.full.jpg -goblin_goon.jpg http://[server]/LE/Goblin%20Goon.full.jpg -goblin_grappler.jpg http://[server]/LE/Goblin%20Grappler.full.jpg -goblin_grenade.jpg http://[server]/AT/Goblin%20Grenade.full.jpg -goblin_grenadiers.jpg http://[server]/WL/Goblin%20Grenadiers.full.jpg -goblin_guide.jpg http://[server]/ZEN/Goblin%20Guide.full.jpg -goblin_hero.jpg http://[server]/6E/Goblin%20Hero.full.jpg -goblin_king.jpg http://[server]/10E/Goblin%20King.full.jpg -goblin_kites.jpg http://[server]/FE/Goblin%20Kites.full.jpg -goblin_lackey.jpg http://[server]/US/Goblin%20Lackey.full.jpg -goblin_legionnaire.jpg http://[server]/AP/Goblin%20Legionnaire.full.jpg -goblin_lookout.jpg http://[server]/LE/Goblin%20Lookout.full.jpg -goblin_lore.jpg http://[server]/10E/Goblin%20Lore.full.jpg -goblin_lyre.jpg http://[server]/IA/Goblin%20Lyre.full.jpg -goblin_machinist.jpg http://[server]/ON/Goblin%20Machinist.full.jpg -goblin_marshal.jpg http://[server]/UD/Goblin%20Marshal.full.jpg -goblin_masons.jpg http://[server]/UD/Goblin%20Masons.full.jpg -goblin_matron.jpg http://[server]/7E/Goblin%20Matron.full.jpg -goblin_medics.jpg http://[server]/UL/Goblin%20Medics.full.jpg -goblin_mime.jpg http://[server]/UNH/Goblin%20Mime.full.jpg -goblin_mountaineer.jpg http://[server]/9E/Goblin%20Mountaineer.full.jpg -goblin_mutant.jpg http://[server]/IA/Goblin%20Mutant.full.jpg -goblin_offensive.jpg http://[server]/US/Goblin%20Offensive.full.jpg -goblin_outlander.jpg http://[server]/CFX/Goblin%20Outlander.full.jpg -goblin_patrol.jpg http://[server]/US/Goblin%20Patrol.full.jpg -goblin_piker.jpg http://[server]/M10/Goblin%20Piker.full.jpg -goblin_piledriver.jpg http://[server]/ON/Goblin%20Piledriver.full.jpg -goblin_psychopath.jpg http://[server]/SC/Goblin%20Psychopath.full.jpg -goblin_pyromancer.jpg http://[server]/ON/Goblin%20Pyromancer.full.jpg -goblin_raider.jpg http://[server]/9E/Goblin%20Raider.full.jpg -goblin_razerunners.jpg http://[server]/CFX/Goblin%20Razerunners.full.jpg -goblin_recruiter.jpg http://[server]/6E/Goblin%20Recruiter.full.jpg -goblin_replica.jpg http://[server]/MR/Goblin%20Replica.full.jpg -goblin_rimerunner.jpg http://[server]/CS/Goblin%20Rimerunner.full.jpg -goblin_ringleader.jpg http://[server]/AP/Goblin%20Ringleader.full.jpg -goblin_rock_sled.jpg http://[server]/DK/Goblin%20Rock%20Sled.full.jpg -goblin_ruinblaster.jpg http://[server]/ZEN/Goblin%20Ruinblaster.full.jpg -goblin_s.w.a.t._team.jpg http://[server]/UNH/Goblin%20S.W.A.T.%20Team.full.jpg -goblin_sappers.jpg http://[server]/IA/Goblin%20Sappers.full.jpg -goblin_scouts.jpg http://[server]/MI/Goblin%20Scouts.full.jpg -goblin_secret_agent.jpg http://[server]/UNH/Goblin%20Secret%20Agent.full.jpg -goblin_settler.jpg http://[server]/ST/Goblin%20Settler.full.jpg -goblin_sharpshooter.jpg http://[server]/ON/Goblin%20Sharpshooter.full.jpg -goblin_shortcutter.jpg http://[server]/ZEN/Goblin%20Shortcutter.full.jpg -goblin_shrine.jpg http://[server]/CH/Goblin%20Shrine.full.jpg -goblin_ski_patrol.jpg http://[server]/IA/Goblin%20Ski%20Patrol.full.jpg -goblin_sky_raider.jpg http://[server]/10E/Goblin%20Sky%20Raider.full.jpg -goblin_skycutter.jpg http://[server]/TSP/Goblin%20Skycutter.full.jpg -goblin_sledder.jpg http://[server]/ON/Goblin%20Sledder.full.jpg -goblin_snowman.jpg http://[server]/IA/Goblin%20Snowman.full.jpg -goblin_soothsayer.jpg http://[server]/MI/Goblin%20Soothsayer.full.jpg -goblin_spelunkers.jpg http://[server]/7E/Goblin%20Spelunkers.full.jpg -goblin_spy.jpg http://[server]/IN/Goblin%20Spy.full.jpg -goblin_striker.jpg http://[server]/MR/Goblin%20Striker.full.jpg -goblin_swine_rider.jpg http://[server]/VI/Goblin%20Swine-Rider.full.jpg -goblin_taskmaster.jpg http://[server]/ON/Goblin%20Taskmaster.full.jpg -goblin_tinkerer.jpg http://[server]/MI/Goblin%20Tinkerer.full.jpg -goblin_trenches.jpg http://[server]/AP/Goblin%20Trenches.full.jpg -goblin_turncoat.jpg http://[server]/LE/Goblin%20Turncoat.full.jpg -goblin_tutor.jpg http://[server]/UG/Goblin%20Tutor.full.jpg -goblin_vandal.jpg http://[server]/AT/Goblin%20Vandal.full.jpg -goblin_war_buggy.jpg http://[server]/US/Goblin%20War%20Buggy.full.jpg -goblin_war_cry.jpg http://[server]/P2/Goblin%20War%20Cry.full.jpg -goblin_war_drums.jpg http://[server]/7E/Goblin%20War%20Drums.full.jpg -goblin_war_paint.jpg http://[server]/ZEN/Goblin%20War%20Paint.full.jpg -goblin_war_strike.jpg http://[server]/SC/Goblin%20War%20Strike.full.jpg -goblin_war_wagon.jpg http://[server]/MR/Goblin%20War%20Wagon.full.jpg -goblin_warchief.jpg http://[server]/SC/Goblin%20Warchief.full.jpg -goblin_warrens.jpg http://[server]/6E/Goblin%20Warrens.full.jpg -goblin_welder.jpg http://[server]/UL/Goblin%20Welder.full.jpg -goblin_wizard.jpg http://[server]/DK/Goblin%20Wizard.full.jpg -goblins_of_the_flarg.jpg http://[server]/DK/Goblins%20of%20the%20Flarg.full.jpg -godhead_of_awe.jpg http://[server]/SHM/Godhead%20of%20Awe.full.jpg -godless_shrine.jpg http://[server]/GP/Godless%20Shrine.full.jpg -godo_bandit_warlord.jpg http://[server]/CHK/Godo,%20Bandit%20Warlord.full.jpg -godos_irregulars.jpg http://[server]/SOK/Godo's%20Irregulars.full.jpg -gods_eye_gate_to_the_reikai.jpg http://[server]/BOK/Gods'%20Eye,%20Gate%20to%20the%20Reikai.full.jpg -godsire.jpg http://[server]/ALA/Godsire.full.jpg -godtoucher.jpg http://[server]/ALA/Godtoucher.full.jpg -godtracker_of_jund.jpg http://[server]/ARB/Godtracker%20of%20Jund.full.jpg -goham_djinn.jpg http://[server]/IN/Goham%20Djinn.full.jpg -gold_myr.jpg http://[server]/MR/Gold%20Myr.full.jpg -golden_bear.jpg http://[server]/P2/Golden%20Bear.full.jpg -golden_wish.jpg http://[server]/JU/Golden%20Wish.full.jpg -goldenglow_moth.jpg http://[server]/SHM/Goldenglow%20Moth.full.jpg -goldmeadow_dodger.jpg http://[server]/LRW/Goldmeadow%20Dodger.full.jpg -goldmeadow_harrier.jpg http://[server]/LRW/Goldmeadow%20Harrier.full.jpg -goldmeadow_lookout.jpg http://[server]/FUT/Goldmeadow%20Lookout.full.jpg -goldmeadow_stalwart.jpg http://[server]/LRW/Goldmeadow%20Stalwart.full.jpg -golem_skin_gauntlets.jpg http://[server]/MR/Golem-Skin%20Gauntlets.full.jpg -golgari_brownscale.jpg http://[server]/RAV/Golgari%20Brownscale.full.jpg -golgari_germination.jpg http://[server]/RAV/Golgari%20Germination.full.jpg -golgari_grave_troll.jpg http://[server]/RAV/Golgari%20Grave-Troll.full.jpg -golgari_guildmage.jpg http://[server]/RAV/Golgari%20Guildmage.full.jpg -golgari_rot_farm.jpg http://[server]/RAV/Golgari%20Rot%20Farm.full.jpg -golgari_rotwurm.jpg http://[server]/RAV/Golgari%20Rotwurm.full.jpg -golgari_signet.jpg http://[server]/RAV/Golgari%20Signet.full.jpg -golgari_thug.jpg http://[server]/RAV/Golgari%20Thug.full.jpg -golgothian_sylex.jpg http://[server]/AQ/Golgothian%20Sylex.full.jpg -goliath_beetle.jpg http://[server]/UD/Goliath%20Beetle.full.jpg -goliath_spider.jpg http://[server]/RAV/Goliath%20Spider.full.jpg -gomazoa.jpg http://[server]/ZEN/Gomazoa.full.jpg -goretusk_firebeast.jpg http://[server]/JU/Goretusk%20Firebeast.full.jpg -gorger_wurm.jpg http://[server]/ARB/Gorger%20Wurm.full.jpg -gorgon_flail.jpg http://[server]/M10/Gorgon%20Flail.full.jpg -gorgon_recluse.jpg http://[server]/TSP/Gorgon%20Recluse.full.jpg -gorilla_berserkers.jpg http://[server]/AL/Gorilla%20Berserkers1.full.jpg -gorilla_chieftain.jpg http://[server]/7E/Gorilla%20Chieftain.full.jpg -gorilla_pack.jpg http://[server]/IA/Gorilla%20Pack.full.jpg -gorilla_shaman.jpg http://[server]/CST/Gorilla%20Shaman.full.jpg -gorilla_titan.jpg http://[server]/OD/Gorilla%20Titan.full.jpg -gorilla_war_cry.jpg http://[server]/AL/Gorilla%20War%20Cry1.full.jpg -gorilla_warrior.jpg http://[server]/US/Gorilla%20Warrior.full.jpg -goryos_vengeance.jpg http://[server]/BOK/Goryo's%20Vengeance.full.jpg -gossamer_chains.jpg http://[server]/VI/Gossamer%20Chains.full.jpg -gossamer_phantasm.jpg http://[server]/PLC/Gossamer%20Phantasm.full.jpg -gosta_dirk.jpg http://[server]/LG/Gosta%20Dirk.full.jpg -govern_the_guildless.jpg http://[server]/DIS/Govern%20the%20Guildless.full.jpg -grab_the_reins.jpg http://[server]/MR/Grab%20the%20Reins.full.jpg -graceful_adept.jpg http://[server]/CHK/Graceful%20Adept.full.jpg -graceful_antelope.jpg http://[server]/OD/Graceful%20Antelope.full.jpg -graceful_reprieve.jpg http://[server]/MOR/Graceful%20Reprieve.full.jpg -grafted_skullcap.jpg http://[server]/7E/Grafted%20Skullcap.full.jpg -grafted_wargear.jpg http://[server]/FD/Grafted%20Wargear.full.jpg -grand_arbiter_augustin_iv.jpg http://[server]/DIS/Grand%20Arbiter%20Augustin%20IV.full.jpg -grand_coliseum.jpg http://[server]/ON/Grand%20Coliseum.full.jpg -grand_melee.jpg http://[server]/ON/Grand%20Melee.full.jpg -grandmother_sengir.jpg http://[server]/HL/Grandmother%20Sengir.full.jpg -granger_guildmage.jpg http://[server]/MI/Granger%20Guildmage.full.jpg -granite_gargoyle.jpg http://[server]/U/Granite%20Gargoyle.full.jpg -granite_grip.jpg http://[server]/7E/Granite%20Grip.full.jpg -granite_shard.jpg http://[server]/MR/Granite%20Shard.full.jpg -grannys_payback.jpg http://[server]/UNH/Granny's%20Payback.full.jpg -granulate.jpg http://[server]/FD/Granulate.full.jpg -grapeshot.jpg http://[server]/TSP/Grapeshot.full.jpg -grapeshot_catapult.jpg http://[server]/7E/Grapeshot%20Catapult.full.jpg -graphic_violence.jpg http://[server]/UNH/Graphic%20Violence.full.jpg -grappling_hook.jpg http://[server]/ZEN/Grappling%20Hook.full.jpg -grassland_crusader.jpg http://[server]/ON/Grassland%20Crusader.full.jpg -grasslands.jpg http://[server]/MI/Grasslands.full.jpg -gratuitous_violence.jpg http://[server]/ON/Gratuitous%20Violence.full.jpg -grave_consequences.jpg http://[server]/JU/Grave%20Consequences.full.jpg -grave_defiler.jpg http://[server]/AP/Grave%20Defiler.full.jpg -grave_pact.jpg http://[server]/10E/Grave%20Pact.full.jpg -grave_peril.jpg http://[server]/FUT/Grave%20Peril.full.jpg -grave_robbers.jpg http://[server]/DK/Grave%20Robbers.full.jpg -grave_scrabbler.jpg http://[server]/FUT/Grave%20Scrabbler.full.jpg -grave_servitude.jpg http://[server]/MI/Grave%20Servitude.full.jpg -grave_shell_scarab.jpg http://[server]/RAV/Grave-Shell%20Scarab.full.jpg -gravebane_zombie.jpg http://[server]/MI/Gravebane%20Zombie.full.jpg -gravebind.jpg http://[server]/IA/Gravebind.full.jpg -graveborn_muse.jpg http://[server]/10E/Graveborn%20Muse.full.jpg -gravedigger.jpg http://[server]/M10/Gravedigger.full.jpg -gravegouger.jpg http://[server]/TO/Gravegouger.full.jpg -gravel_slinger.jpg http://[server]/ON/Gravel%20Slinger.full.jpg -gravelgill_axeshark.jpg http://[server]/SHM/Gravelgill%20Axeshark.full.jpg -gravelgill_duo.jpg http://[server]/SHM/Gravelgill%20Duo.full.jpg -graven_cairns.jpg http://[server]/FUT/Graven%20Cairns.full.jpg -graven_dominator.jpg http://[server]/GP/Graven%20Dominator.full.jpg -gravespawn_sovereign.jpg http://[server]/ON/Gravespawn%20Sovereign.full.jpg -gravestorm.jpg http://[server]/OD/Gravestorm.full.jpg -gravity_sphere.jpg http://[server]/LG/Gravity%20Sphere.full.jpg -graxiplon.jpg http://[server]/ON/Graxiplon.full.jpg -gray_ogre.jpg http://[server]/4E/Gray%20Ogre.full.jpg -graypelt_refuge.jpg http://[server]/ZEN/Graypelt%20Refuge.full.jpg -grayscaled_gharial.jpg http://[server]/RAV/Grayscaled%20Gharial.full.jpg -grazing_gladehart.jpg http://[server]/ZEN/Grazing%20Gladehart.full.jpg -grazing_kelpie.jpg http://[server]/EVE/Grazing%20Kelpie.full.jpg -great_defender.jpg http://[server]/LG/Great%20Defender.full.jpg -great_furnace.jpg http://[server]/MR/Great%20Furnace.full.jpg -great_sable_stag.jpg http://[server]/M10/Great%20Sable%20Stag.full.jpg -great_wall.jpg http://[server]/LG/Great%20Wall.full.jpg -great_whale.jpg http://[server]/US/Great%20Whale.full.jpg -greatbow_doyen.jpg http://[server]/MOR/Greatbow%20Doyen.full.jpg -greater_auramancy.jpg http://[server]/SHM/Greater%20Auramancy.full.jpg -greater_forgeling.jpg http://[server]/RAV/Greater%20Forgeling.full.jpg -greater_gargadon.jpg http://[server]/TSP/Greater%20Gargadon.full.jpg -greater_good.jpg http://[server]/9E/Greater%20Good.full.jpg -greater_harvester.jpg http://[server]/DS/Greater%20Harvester.full.jpg -greater_morphling.jpg http://[server]/UNH/Greater%20Morphling.full.jpg -greater_mossdog.jpg http://[server]/RAV/Greater%20Mossdog.full.jpg -greater_realm_of_preservation.jpg http://[server]/LG/Greater%20Realm%20of%20Preservation.full.jpg -greater_stone_spirit.jpg http://[server]/CS/Greater%20Stone%20Spirit.full.jpg -greater_werewolf.jpg http://[server]/HL/Greater%20Werewolf.full.jpg -greed.jpg http://[server]/7E/Greed.full.jpg -greel_mind_raker.jpg http://[server]/PY/Greel,%20Mind%20Raker.full.jpg -greels_caress.jpg http://[server]/PY/Greel's%20Caress.full.jpg -green_mana_battery.jpg http://[server]/LG/Green%20Mana%20Battery.full.jpg -green_scarab.jpg http://[server]/IA/Green%20Scarab.full.jpg -green_ward.jpg http://[server]/4E/Green%20Ward.full.jpg -greener_pastures.jpg http://[server]/US/Greener%20Pastures.full.jpg -greenseeker.jpg http://[server]/TSP/Greenseeker.full.jpg -greenweaver_druid.jpg http://[server]/ZEN/Greenweaver%20Druid.full.jpg -greven_il_vec.jpg http://[server]/VG/Greven%20il-Vec.full.jpg -grid_monitor.jpg http://[server]/MR/Grid%20Monitor.full.jpg -grief_tyrant.jpg http://[server]/SHM/Grief%20Tyrant.full.jpg -griffin_canyon.jpg http://[server]/VI/Griffin%20Canyon.full.jpg -griffin_guide.jpg http://[server]/TSP/Griffin%20Guide.full.jpg -griffin_sentinel.jpg http://[server]/M10/Griffin%20Sentinel.full.jpg -grifters_blade.jpg http://[server]/RAV/Grifter's%20Blade.full.jpg -grim_discovery.jpg http://[server]/ZEN/Grim%20Discovery.full.jpg -grim_feast.jpg http://[server]/MI/Grim%20Feast.full.jpg -grim_harvest.jpg http://[server]/CS/Grim%20Harvest.full.jpg -grim_lavamancer.jpg http://[server]/TO/Grim%20Lavamancer.full.jpg -grim_monolith.jpg http://[server]/UL/Grim%20Monolith.full.jpg -grim_poppet.jpg http://[server]/SHM/Grim%20Poppet.full.jpg -grim_reminder.jpg http://[server]/MR/Grim%20Reminder.full.jpg -grim_tutor.jpg http://[server]/ST/Grim%20Tutor.full.jpg -grimclaw_bats.jpg http://[server]/DS/Grimclaw%20Bats.full.jpg -grimoire_thief.jpg http://[server]/MOR/Grimoire%20Thief.full.jpg -grinding_station.jpg http://[server]/FD/Grinding%20Station.full.jpg -grindstone.jpg http://[server]/TE/Grindstone.full.jpg -grinning_demon.jpg http://[server]/ON/Grinning%20Demon.full.jpg -grinning_ignus.jpg http://[server]/FUT/Grinning%20Ignus.full.jpg -grinning_totem.jpg http://[server]/6E/Grinning%20Totem.full.jpg -grip_of_amnesia.jpg http://[server]/JU/Grip%20of%20Amnesia.full.jpg -grip_of_chaos.jpg http://[server]/SC/Grip%20of%20Chaos.full.jpg -gristle_grinner.jpg http://[server]/CS/Gristle%20Grinner.full.jpg -gristleback.jpg http://[server]/GP/Gristleback.full.jpg -grixis_battlemage.jpg http://[server]/ALA/Grixis%20Battlemage.full.jpg -grixis_charm.jpg http://[server]/ALA/Grixis%20Charm.full.jpg -grixis_grimblade.jpg http://[server]/ARB/Grixis%20Grimblade.full.jpg -grixis_illusionist.jpg http://[server]/CFX/Grixis%20Illusionist.full.jpg -grixis_panorama.jpg http://[server]/ALA/Grixis%20Panorama.full.jpg -grixis_slavedriver.jpg http://[server]/CFX/Grixis%20Slavedriver.full.jpg -grixis_sojourners.jpg http://[server]/ARB/Grixis%20Sojourners.full.jpg -grizzled_leotau.jpg http://[server]/ARB/Grizzled%20Leotau.full.jpg -grizzled_wolverine.jpg http://[server]/IA/Grizzled%20Wolverine.full.jpg -grizzly_bears.jpg http://[server]/10E/Grizzly%20Bears.full.jpg -grizzly_fate.jpg http://[server]/JU/Grizzly%20Fate.full.jpg -groffskithur.jpg http://[server]/MR/Groffskithur.full.jpg -grollub.jpg http://[server]/EX/Grollub.full.jpg -grotesque_hybrid.jpg http://[server]/TO/Grotesque%20Hybrid.full.jpg -ground_rift.jpg http://[server]/TSP/Ground%20Rift.full.jpg -ground_seal.jpg http://[server]/OD/Ground%20Seal.full.jpg -groundbreaker.jpg http://[server]/PLC/Groundbreaker.full.jpg -groundling_pouncer.jpg http://[server]/EVE/Groundling%20Pouncer.full.jpg -groundskeeper.jpg http://[server]/9E/Groundskeeper.full.jpg -grove_of_the_burnwillows.jpg http://[server]/FUT/Grove%20of%20the%20Burnwillows.full.jpg -growth_spurt.jpg http://[server]/UG/Growth%20Spurt.full.jpg -grozoth.jpg http://[server]/RAV/Grozoth.full.jpg -gruul_guildmage.jpg http://[server]/GP/Gruul%20Guildmage.full.jpg -gruul_nodorog.jpg http://[server]/GP/Gruul%20Nodorog.full.jpg -gruul_scrapper.jpg http://[server]/GP/Gruul%20Scrapper.full.jpg -gruul_signet.jpg http://[server]/GP/Gruul%20Signet.full.jpg -gruul_turf.jpg http://[server]/GP/Gruul%20Turf.full.jpg -gruul_war_plow.jpg http://[server]/GP/Gruul%20War%20Plow.full.jpg -guan_yu_sainted_warrior.jpg http://[server]/P3/Guan%20Yu,%20Sainted%20Warrior.full.jpg -guan_yus_1000_li_march.jpg http://[server]/P3/Guan%20Yu's%201,000-Li%20March.full.jpg -guard_dogs.jpg http://[server]/PS/Guard%20Dogs.full.jpg -guardian_angel.jpg http://[server]/U/Guardian%20Angel.full.jpg -guardian_beast.jpg http://[server]/AN/Guardian%20Beast.full.jpg -guardian_idol.jpg http://[server]/FD/Guardian%20Idol.full.jpg -guardian_of_cloverdell.jpg http://[server]/LRW/Guardian%20of%20Cloverdell.full.jpg -guardian_of_solitude.jpg http://[server]/CHK/Guardian%20of%20Solitude.full.jpg -guardian_of_the_guildpact.jpg http://[server]/DIS/Guardian%20of%20the%20Guildpact.full.jpg -guardian_of_vitu_ghazi.jpg http://[server]/RAV/Guardian%20of%20Vitu-Ghazi.full.jpg -guardian_seraph.jpg http://[server]/M10/Guardian%20Seraph.full.jpg -guardians_magemark.jpg http://[server]/GP/Guardian's%20Magemark.full.jpg -guardians_of_akrasa.jpg http://[server]/ALA/Guardians%20of%20Akrasa.full.jpg -guerrilla_tactics.jpg http://[server]/10E/Guerrilla%20Tactics.full.jpg -guided_passage.jpg http://[server]/AP/Guided%20Passage.full.jpg -guided_strike.jpg http://[server]/JU/Guided%20Strike.full.jpg -guiding_spirit.jpg http://[server]/VI/Guiding%20Spirit.full.jpg -guile.jpg http://[server]/LRW/Guile.full.jpg -guiltfeeder.jpg http://[server]/JU/Guiltfeeder.full.jpg -guilty_conscience.jpg http://[server]/SC/Guilty%20Conscience.full.jpg -gulf_squid.jpg http://[server]/PY/Gulf%20Squid.full.jpg -guma.jpg http://[server]/US/Guma.full.jpg -gurzigost.jpg http://[server]/TO/Gurzigost.full.jpg -gus.jpg http://[server]/UG/Gus.full.jpg -gush.jpg http://[server]/MM/Gush.full.jpg -gustcloak_cavalier.jpg http://[server]/TSP/Gustcloak%20Cavalier.full.jpg -gustcloak_harrier.jpg http://[server]/ON/Gustcloak%20Harrier.full.jpg -gustcloak_runner.jpg http://[server]/ON/Gustcloak%20Runner.full.jpg -gustcloak_savior.jpg http://[server]/ON/Gustcloak%20Savior.full.jpg -gustcloak_sentinel.jpg http://[server]/ON/Gustcloak%20Sentinel.full.jpg -gustcloak_skirmisher.jpg http://[server]/ON/Gustcloak%20Skirmisher.full.jpg -gusthas_scepter.jpg http://[server]/AL/Gustha's%20Scepter.full.jpg -gustrider_exuberant.jpg http://[server]/ALA/Gustrider%20Exuberant.full.jpg -gutless_ghoul.jpg http://[server]/CS/Gutless%20Ghoul.full.jpg -guttural_response.jpg http://[server]/SHM/Guttural%20Response.full.jpg -gutwrencher_oni.jpg http://[server]/CHK/Gutwrencher%20Oni.full.jpg -guul_draz_specter.jpg http://[server]/ZEN/Guul%20Draz%20Specter.full.jpg -guul_draz_vampire.jpg http://[server]/ZEN/Guul%20Draz%20Vampire.full.jpg -gwafa_hazid_profiteer.jpg http://[server]/CFX/Gwafa%20Hazid,%20Profiteer.full.jpg -gwendlyn_di_corci.jpg http://[server]/LG/Gwendlyn%20Di%20Corci.full.jpg -gwyllion_hedge_mage.jpg http://[server]/EVE/Gwyllion%20Hedge-Mage.full.jpg \ No newline at end of file diff --git a/res/pics_link/card-pictures_h.txt b/res/pics_link/card-pictures_h.txt deleted file mode 100644 index 4e8ebda6d98..00000000000 --- a/res/pics_link/card-pictures_h.txt +++ /dev/null @@ -1,363 +0,0 @@ -haakon_stromgald_scourge.jpg http://[server]/CS/Haakon,%20Stromgald%20Scourge.full.jpg -haazda_exonerator.jpg http://[server]/DIS/Haazda%20Exonerator.full.jpg -haazda_shield_mate.jpg http://[server]/DIS/Haazda%20Shield%20Mate.full.jpg -hag_hedge_mage.jpg http://[server]/EVE/Hag%20Hedge-Mage.full.jpg -hagra_crocodile.jpg http://[server]/ZEN/Hagra%20Crocodile.full.jpg -hagra_diabolist.jpg http://[server]/ZEN/Hagra%20Diabolist.full.jpg -hail_of_arrows.jpg http://[server]/10E/Hail%20of%20Arrows.full.jpg -hail_storm.jpg http://[server]/AL/Hail%20Storm.full.jpg -hair_strung_koto.jpg http://[server]/CHK/Hair-Strung%20Koto.full.jpg -hakim_loreweaver.jpg http://[server]/MI/Hakim,%20Loreweaver.full.jpg -halam_djinn.jpg http://[server]/IN/Halam%20Djinn.full.jpg -halberdier.jpg http://[server]/OD/Halberdier.full.jpg -halcyon_glaze.jpg http://[server]/RAV/Halcyon%20Glaze.full.jpg -halfdane.jpg http://[server]/LG/Halfdane.full.jpg -hall_of_gemstone.jpg http://[server]/MI/Hall%20of%20Gemstone.full.jpg -hall_of_the_bandit_lord.jpg http://[server]/CHK/Hall%20of%20the%20Bandit%20Lord.full.jpg -hallow.jpg http://[server]/DS/Hallow.full.jpg -hallowed_burial.jpg http://[server]/EVE/Hallowed%20Burial.full.jpg -hallowed_fountain.jpg http://[server]/DIS/Hallowed%20Fountain.full.jpg -hallowed_ground.jpg http://[server]/IA/Hallowed%20Ground.full.jpg -hallowed_healer.jpg http://[server]/OD/Hallowed%20Healer.full.jpg -halls_of_mist.jpg http://[server]/IA/Halls%20of%20Mist.full.jpg -halo_hunter.jpg http://[server]/ZEN/Halo%20Hunter.full.jpg -hamletback_goliath.jpg http://[server]/LRW/Hamletback%20Goliath.full.jpg -hammer_mage.jpg http://[server]/MM/Hammer%20Mage.full.jpg -hammer_of_bogardan.jpg http://[server]/8E/Hammer%20of%20Bogardan.full.jpg -hammerfist_giant.jpg http://[server]/RAV/Hammerfist%20Giant.full.jpg -hammerhead_shark.jpg http://[server]/SH/Hammerhead%20Shark.full.jpg -hammerheim.jpg http://[server]/LG/Hammerheim.full.jpg -hammerheim_deadeye.jpg http://[server]/PLC/Hammerheim%20Deadeye.full.jpg -hana_kami.jpg http://[server]/CHK/Hana%20Kami.full.jpg -hanabi_blast.jpg http://[server]/CHK/Hanabi%20Blast.full.jpg -hand_of_cruelty.jpg http://[server]/SOK/Hand%20of%20Cruelty.full.jpg -hand_of_death.jpg http://[server]/ST/Hand%20of%20Death.full.jpg -hand_of_honor.jpg http://[server]/SOK/Hand%20of%20Honor.full.jpg -hand_of_justice.jpg http://[server]/FE/Hand%20of%20Justice.full.jpg -hand_to_hand.jpg http://[server]/TE/Hand%20to%20Hand.full.jpg -handcuffs.jpg http://[server]/UG/Handcuffs.full.jpg -hankyu.jpg http://[server]/CHK/Hankyu.full.jpg -hanna.jpg http://[server]/VG/Hanna.full.jpg -hanna_ships_navigator.jpg http://[server]/IN/Hanna,%20Ship's%20Navigator.full.jpg -hannas_custody.jpg http://[server]/TE/Hanna's%20Custody.full.jpg -hapless_researcher.jpg http://[server]/JU/Hapless%20Researcher.full.jpg -harbinger_of_night.jpg http://[server]/MI/Harbinger%20of%20Night.full.jpg -harbinger_of_spring.jpg http://[server]/BOK/Harbinger%20of%20Spring.full.jpg -harbor_guardian.jpg http://[server]/MI/Harbor%20Guardian.full.jpg -harmattan_efreet.jpg http://[server]/MI/Harmattan%20Efreet.full.jpg -harmonic_convergence.jpg http://[server]/UL/Harmonic%20Convergence.full.jpg -harmonic_sliver.jpg http://[server]/TSP/Harmonic%20Sliver.full.jpg -harmonize.jpg http://[server]/PLC/Harmonize.full.jpg -harmony_of_nature.jpg http://[server]/P2/Harmony%20of%20Nature.full.jpg -harms_way.jpg http://[server]/M10/Harm's%20Way.full.jpg -harpoon_sniper.jpg http://[server]/LRW/Harpoon%20Sniper.full.jpg -harrier_griffin.jpg http://[server]/GP/Harrier%20Griffin.full.jpg -harrow.jpg http://[server]/IN/Harrow.full.jpg -harsh_deceiver.jpg http://[server]/CHK/Harsh%20Deceiver.full.jpg -harsh_judgment.jpg http://[server]/IN/Harsh%20Judgment.full.jpg -harsh_justice.jpg http://[server]/PT/Harsh%20Justice.full.jpg -harsh_mercy.jpg http://[server]/ON/Harsh%20Mercy.full.jpg -haru_onna.jpg http://[server]/SOK/Haru-Onna.full.jpg -harvest_gwyllion.jpg http://[server]/EVE/Harvest%20Gwyllion.full.jpg -harvest_mage.jpg http://[server]/NE/Harvest%20Mage.full.jpg -harvest_wurm.jpg http://[server]/WL/Harvest%20Wurm.full.jpg -harvester_druid.jpg http://[server]/JU/Harvester%20Druid.full.jpg -hasran_ogress.jpg http://[server]/CH/Hasran%20Ogress.full.jpg -hatchet_bully.jpg http://[server]/EVE/Hatchet%20Bully.full.jpg -hatching_plans.jpg http://[server]/GP/Hatching%20Plans.full.jpg -hate_weaver.jpg http://[server]/10E/Hate%20Weaver.full.jpg -hateflayer.jpg http://[server]/EVE/Hateflayer.full.jpg -hatred.jpg http://[server]/EX/Hatred.full.jpg -haunted_angel.jpg http://[server]/AP/Haunted%20Angel.full.jpg -haunted_cadaver.jpg http://[server]/ON/Haunted%20Cadaver.full.jpg -haunted_crossroads.jpg http://[server]/MM/Haunted%20Crossroads.full.jpg -haunting_apparition.jpg http://[server]/MI/Haunting%20Apparition.full.jpg -haunting_echoes.jpg http://[server]/M10/Haunting%20Echoes.full.jpg -haunting_hymn.jpg http://[server]/TSP/Haunting%20Hymn.full.jpg -haunting_misery.jpg http://[server]/WL/Haunting%20Misery.full.jpg -haunting_wind.jpg http://[server]/AQ/Haunting%20Wind.full.jpg -havenwood_battleground.jpg http://[server]/6E/Havenwood%20Battleground.full.jpg -havenwood_wurm.jpg http://[server]/TSP/Havenwood%20Wurm.full.jpg -havoc.jpg http://[server]/TE/Havoc.full.jpg -havoc_demon.jpg http://[server]/LE/Havoc%20Demon.full.jpg -hawkeater_moth.jpg http://[server]/US/Hawkeater%20Moth.full.jpg -hazduhr_the_abbot.jpg http://[server]/HL/Hazduhr%20the%20Abbot.full.jpg -haze_of_rage.jpg http://[server]/FUT/Haze%20of%20Rage.full.jpg -hazerider_drake.jpg http://[server]/MI/Hazerider%20Drake.full.jpg -hazezon_tamar.jpg http://[server]/LG/Hazezon%20Tamar.full.jpg -hazy_homunculus.jpg http://[server]/PY/Hazy%20Homunculus.full.jpg -he_who_hungers.jpg http://[server]/CHK/He%20Who%20Hungers.full.jpg -head_games.jpg http://[server]/10E/Head%20Games.full.jpg -head_to_head.jpg http://[server]/UNH/Head%20to%20Head.full.jpg -headhunter.jpg http://[server]/ON/Headhunter.full.jpg -headless_horseman.jpg http://[server]/LG/Headless%20Horseman.full.jpg -headlong_rush.jpg http://[server]/US/Headlong%20Rush.full.jpg -headstone.jpg http://[server]/HL/Headstone.full.jpg -heal.jpg http://[server]/IA/Heal.full.jpg -heal_the_scars.jpg http://[server]/LRW/Heal%20the%20Scars.full.jpg -healers_headdress.jpg http://[server]/FD/Healer's%20Headdress.full.jpg -healing_leaves.jpg http://[server]/PLC/Healing%20Leaves.full.jpg -healing_salve.jpg http://[server]/8E/Healing%20Salve.full.jpg -heap_doll.jpg http://[server]/SHM/Heap%20Doll.full.jpg -heart_of_bogardan.jpg http://[server]/WL/Heart%20of%20Bogardan.full.jpg -heart_of_light.jpg http://[server]/10E/Heart%20of%20Light.full.jpg -heart_of_ramos.jpg http://[server]/MM/Heart%20of%20Ramos.full.jpg -heart_of_yavimaya.jpg http://[server]/AL/Heart%20of%20Yavimaya.full.jpg -heart_sliver.jpg http://[server]/TE/Heart%20Sliver.full.jpg -heart_warden.jpg http://[server]/UD/Heart%20Warden.full.jpg -heart_wolf.jpg http://[server]/HL/Heart%20Wolf.full.jpg -heartbeat_of_spring.jpg http://[server]/CHK/Heartbeat%20of%20Spring.full.jpg -hearth_charm.jpg http://[server]/VI/Hearth%20Charm.full.jpg -hearth_kami.jpg http://[server]/CHK/Hearth%20Kami.full.jpg -hearthcage_giant.jpg http://[server]/LRW/Hearthcage%20Giant.full.jpg -hearthfire_hobgoblin.jpg http://[server]/EVE/Hearthfire%20Hobgoblin.full.jpg -heartlash_cinder.jpg http://[server]/EVE/Heartlash%20Cinder.full.jpg -heartless_hidetsugu.jpg http://[server]/BOK/Heartless%20Hidetsugu.full.jpg -heartmender.jpg http://[server]/SHM/Heartmender.full.jpg -heartseeker.jpg http://[server]/DS/Heartseeker.full.jpg -heartstabber_mosquito.jpg http://[server]/ZEN/Heartstabber%20Mosquito.full.jpg -heartstone.jpg http://[server]/SH/Heartstone.full.jpg -heartwood_dryad.jpg http://[server]/TE/Heartwood%20Dryad.full.jpg -heartwood_giant.jpg http://[server]/TE/Heartwood%20Giant.full.jpg -heartwood_shard.jpg http://[server]/MR/Heartwood%20Shard.full.jpg -heartwood_storyteller.jpg http://[server]/FUT/Heartwood%20Storyteller.full.jpg -heartwood_treefolk.jpg http://[server]/TE/Heartwood%20Treefolk.full.jpg -heat_of_battle.jpg http://[server]/SH/Heat%20of%20Battle.full.jpg -heat_ray.jpg http://[server]/US/Heat%20Ray.full.jpg -heat_shimmer.jpg http://[server]/LRW/Heat%20Shimmer.full.jpg -heat_stroke.jpg http://[server]/WL/Heat%20Stroke.full.jpg -heat_wave.jpg http://[server]/VI/Heat%20Wave.full.jpg -heavens_gate.jpg http://[server]/LG/Heaven's%20Gate.full.jpg -heavy_ballista.jpg http://[server]/7E/Heavy%20Ballista.full.jpg -heavy_fog.jpg http://[server]/P3/Heavy%20Fog.full.jpg -hecatomb.jpg http://[server]/6E/Hecatomb.full.jpg -hedge_troll.jpg http://[server]/REL/Hedge%20Troll.full.jpg -hedron_crab.jpg http://[server]/ZEN/Hedron%20Crab.full.jpg -hedron_scrabbler.jpg http://[server]/ZEN/Hedron%20Scrabbler.full.jpg -heed_the_mists.jpg http://[server]/BOK/Heed%20the%20Mists.full.jpg -heedless_one.jpg http://[server]/ON/Heedless%20One.full.jpg -heidar_rimewind_master.jpg http://[server]/CS/Heidar,%20Rimewind%20Master.full.jpg -heightened_awareness.jpg http://[server]/PY/Heightened%20Awareness.full.jpg -helionaut.jpg http://[server]/AP/Helionaut.full.jpg -heliophial.jpg http://[server]/FD/Heliophial.full.jpg -helium_squirter.jpg http://[server]/DIS/Helium%20Squirter.full.jpg -helix_pinnacle.jpg http://[server]/EVE/Helix%20Pinnacle.full.jpg -hell_bent_raider.jpg http://[server]/TO/Hell-Bent%20Raider.full.jpg -hell_swarm.jpg http://[server]/LG/Hell%20Swarm.full.jpg -helldozer.jpg http://[server]/RAV/Helldozer.full.jpg -hellfire.jpg http://[server]/LG/Hellfire.full.jpg -hellfire_mongrel.jpg http://[server]/ZEN/Hellfire%20Mongrel.full.jpg -hellhole_rats.jpg http://[server]/DIS/Hellhole%20Rats.full.jpg -hellkite_charger.jpg http://[server]/ZEN/Hellkite%20Charger.full.jpg -hellkite_hatchling.jpg http://[server]/CFX/Hellkite%20Hatchling.full.jpg -hellkite_overlord.jpg http://[server]/ALA/Hellkite%20Overlord.full.jpg -hells_caretaker.jpg http://[server]/9E/Hell's%20Caretaker.full.jpg -hells_thunder.jpg http://[server]/ALA/Hell's%20Thunder.full.jpg -hellspark_elemental.jpg http://[server]/CFX/Hellspark%20Elemental.full.jpg -helm_of_awakening.jpg http://[server]/VI/Helm%20of%20Awakening.full.jpg -helm_of_chatzuk.jpg http://[server]/5E/Helm%20of%20Chatzuk.full.jpg -helm_of_kaldra.jpg http://[server]/FD/Helm%20of%20Kaldra.full.jpg -helm_of_obedience.jpg http://[server]/AL/Helm%20of%20Obedience.full.jpg -helm_of_possession.jpg http://[server]/TE/Helm%20of%20Possession.full.jpg -helm_of_the_ghastlord.jpg http://[server]/SHM/Helm%20of%20the%20Ghastlord.full.jpg -hematite_golem.jpg http://[server]/MR/Hematite%20Golem.full.jpg -hematite_talisman.jpg http://[server]/IA/Hematite%20Talisman.full.jpg -henchfiend_of_ukor.jpg http://[server]/FUT/Henchfiend%20of%20Ukor.full.jpg -henge_guardian.jpg http://[server]/MM/Henge%20Guardian.full.jpg -henge_of_ramos.jpg http://[server]/MM/Henge%20of%20Ramos.full.jpg -herald_of_leshrac.jpg http://[server]/CS/Herald%20of%20Leshrac.full.jpg -herald_of_serra.jpg http://[server]/US/Herald%20of%20Serra.full.jpg -herbal_poultice.jpg http://[server]/LRW/Herbal%20Poultice.full.jpg -herd_gnarr.jpg http://[server]/TSP/Herd%20Gnarr.full.jpg -heritage_druid.jpg http://[server]/MOR/Heritage%20Druid.full.jpg -hermetic_study.jpg http://[server]/US/Hermetic%20Study.full.jpg -hermit_druid.jpg http://[server]/SH/Hermit%20Druid.full.jpg -heroes_remembered.jpg http://[server]/PLC/Heroes%20Remembered.full.jpg -heroes_reunion.jpg http://[server]/IN/Heroes'%20Reunion.full.jpg -heroic_defiance.jpg http://[server]/PS/Heroic%20Defiance.full.jpg -heroism.jpg http://[server]/FE/Heroism.full.jpg -heros_demise.jpg http://[server]/BOK/Hero's%20Demise.full.jpg -heros_resolve.jpg http://[server]/6E/Hero's%20Resolve.full.jpg -hesitation.jpg http://[server]/SH/Hesitation.full.jpg -hex.jpg http://[server]/RAV/Hex.full.jpg -hibernation.jpg http://[server]/8E/Hibernation.full.jpg -hibernation_sliver.jpg http://[server]/SH/Hibernation%20Sliver.full.jpg -hibernations_end.jpg http://[server]/CS/Hibernation's%20End.full.jpg -hickory_woodlot.jpg http://[server]/MM/Hickory%20Woodlot.full.jpg -hidden_ancients.jpg http://[server]/US/Hidden%20Ancients.full.jpg -hidden_gibbons.jpg http://[server]/UL/Hidden%20Gibbons.full.jpg -hidden_guerrillas.jpg http://[server]/US/Hidden%20Guerrillas.full.jpg -hidden_herd.jpg http://[server]/US/Hidden%20Herd.full.jpg -hidden_horror.jpg http://[server]/10E/Hidden%20Horror.full.jpg -hidden_path.jpg http://[server]/DK/Hidden%20Path.full.jpg -hidden_predators.jpg http://[server]/US/Hidden%20Predators.full.jpg -hidden_retreat.jpg http://[server]/SH/Hidden%20Retreat.full.jpg -hidden_spider.jpg http://[server]/US/Hidden%20Spider.full.jpg -hidden_stag.jpg http://[server]/US/Hidden%20Stag.full.jpg -hideous_end.jpg http://[server]/HOP/Hideous%20End.full.jpg -hideous_laughter.jpg http://[server]/CHK/Hideous%20Laughter.full.jpg -hideseek.jpg http://[server]/DIS/HideSeek.full.jpg -hidetsugus_second_rite.jpg http://[server]/SOK/Hidetsugu's%20Second%20Rite.full.jpg -high_ground.jpg http://[server]/10E/High%20Ground.full.jpg -high_market.jpg http://[server]/MM/High%20Market.full.jpg -high_seas.jpg http://[server]/MM/High%20Seas.full.jpg -high_tide.jpg http://[server]/FE/High%20Tide1.full.jpg -highland_berserker.jpg http://[server]/ZEN/Highland%20Berserker.full.jpg -highland_giant.jpg http://[server]/PT/Highland%20Giant.full.jpg -highland_weald.jpg http://[server]/CS/Highland%20Weald.full.jpg -highway_robber.jpg http://[server]/10E/Highway%20Robber.full.jpg -higure_the_still_wind.jpg http://[server]/BOK/Higure,%20the%20Still%20Wind.full.jpg -hikari_twilight_guardian.jpg http://[server]/CHK/Hikari,%20Twilight%20Guardian.full.jpg -hill_giant.jpg http://[server]/10E/Hill%20Giant.full.jpg -hillcomber_giant.jpg http://[server]/LRW/Hillcomber%20Giant.full.jpg -hinder.jpg http://[server]/CHK/Hinder.full.jpg -hindering_light.jpg http://[server]/ALA/Hindering%20Light.full.jpg -hindering_touch.jpg http://[server]/SC/Hindering%20Touch.full.jpg -hint_of_insanity.jpg http://[server]/OD/Hint%20of%20Insanity.full.jpg -hipparion.jpg http://[server]/IA/Hipparion.full.jpg -hired_giant.jpg http://[server]/MM/Hired%20Giant.full.jpg -hired_muscle.jpg http://[server]/BOK/Hired%20Muscle.full.jpg -hisoka_minamo_sensei.jpg http://[server]/CHK/Hisoka,%20Minamo%20Sensei.full.jpg -hisokas_defiance.jpg http://[server]/CHK/Hisoka's%20Defiance.full.jpg -hisokas_guard.jpg http://[server]/CHK/Hisoka's%20Guard.full.jpg -hissing_iguanar.jpg http://[server]/ALA/Hissing%20Iguanar.full.jpg -hissing_miasma.jpg http://[server]/GP/Hissing%20Miasma.full.jpg -hitrun.jpg http://[server]/DIS/HitRun.full.jpg -hive_mind.jpg http://[server]/M10/Hive%20Mind.full.jpg -hivestone.jpg http://[server]/TSP/Hivestone.full.jpg -hivis_of_the_scale.jpg http://[server]/MI/Hivis%20of%20the%20Scale.full.jpg -hoar_shade.jpg http://[server]/IA/Hoar%20Shade.full.jpg -hoarders_greed.jpg http://[server]/LRW/Hoarder's%20Greed.full.jpg -hobble.jpg http://[server]/PS/Hobble.full.jpg -hobgoblin_dragoon.jpg http://[server]/EVE/Hobgoblin%20Dragoon.full.jpg -hokori_dust_drinker.jpg http://[server]/BOK/Hokori,%20Dust%20Drinker.full.jpg -hold_the_line.jpg http://[server]/CHK/Hold%20the%20Line.full.jpg -holistic_wisdom.jpg http://[server]/OD/Holistic%20Wisdom.full.jpg -hollow_dogs.jpg http://[server]/9E/Hollow%20Dogs.full.jpg -hollow_specter.jpg http://[server]/LE/Hollow%20Specter.full.jpg -hollow_trees.jpg http://[server]/5E/Hollow%20Trees.full.jpg -hollow_warrior.jpg http://[server]/PY/Hollow%20Warrior.full.jpg -hollowborn_barghest.jpg http://[server]/SHM/Hollowborn%20Barghest.full.jpg -hollowsage.jpg http://[server]/SHM/Hollowsage.full.jpg -holy_armor.jpg http://[server]/4E/Holy%20Armor.full.jpg -holy_day.jpg http://[server]/10E/Holy%20Day.full.jpg -holy_light.jpg http://[server]/DK/Holy%20Light.full.jpg -holy_strength.jpg http://[server]/M10/Holy%20Strength.full.jpg -homarid_shaman.jpg http://[server]/FE/Homarid%20Shaman.full.jpg -homarid_spawning_bed.jpg http://[server]/FE/Homarid%20Spawning%20Bed.full.jpg -homarid_warrior.jpg http://[server]/5E/Homarid%20Warrior.full.jpg -homarid.jpg http://[server]/FE/Homarid1.full.jpg -homing_sliver.jpg http://[server]/FUT/Homing%20Sliver.full.jpg -homura_human_ascendant.jpg http://[server]/SOK/Homura,%20Human%20Ascendant.full.jpg -honden_of_cleansing_fire.jpg http://[server]/CHK/Honden%20of%20Cleansing%20Fire.full.jpg -honden_of_infinite_rage.jpg http://[server]/CHK/Honden%20of%20Infinite%20Rage.full.jpg -honden_of_lifes_web.jpg http://[server]/CHK/Honden%20of%20Life's%20Web.full.jpg -honden_of_nights_reach.jpg http://[server]/CHK/Honden%20of%20Night's%20Reach.full.jpg -honden_of_seeing_winds.jpg http://[server]/CHK/Honden%20of%20Seeing%20Winds.full.jpg -honor_guard.jpg http://[server]/10E/Honor%20Guard.full.jpg -honor_of_the_pure.jpg http://[server]/M10/Honor%20of%20the%20Pure.full.jpg -honor_the_fallen.jpg http://[server]/MM/Honor%20the%20Fallen.full.jpg -honor_worn_shaku.jpg http://[server]/CHK/Honor-Worn%20Shaku.full.jpg -honorable_passage.jpg http://[server]/VI/Honorable%20Passage.full.jpg -honorable_scout.jpg http://[server]/PS/Honorable%20Scout.full.jpg -hooded_kavu.jpg http://[server]/IN/Hooded%20Kavu.full.jpg -hoodwink.jpg http://[server]/MM/Hoodwink.full.jpg -hoof_skulkin.jpg http://[server]/EVE/Hoof%20Skulkin.full.jpg -hoofprints_of_the_stag.jpg http://[server]/LRW/Hoofprints%20of%20the%20Stag.full.jpg -hope_and_glory.jpg http://[server]/UL/Hope%20and%20Glory.full.jpg -hope_charm.jpg http://[server]/VI/Hope%20Charm.full.jpg -hopping_automaton.jpg http://[server]/US/Hopping%20Automaton.full.jpg -horde_of_boggarts.jpg http://[server]/SHM/Horde%20of%20Boggarts.full.jpg -horde_of_notions.jpg http://[server]/LRW/Horde%20of%20Notions.full.jpg -horizon_canopy.jpg http://[server]/FUT/Horizon%20Canopy.full.jpg -horizon_seed.jpg http://[server]/CHK/Horizon%20Seed.full.jpg -horn_of_deafening.jpg http://[server]/LG/Horn%20of%20Deafening.full.jpg -horn_of_greed.jpg http://[server]/SH/Horn%20of%20Greed.full.jpg -horn_of_plenty.jpg http://[server]/MM/Horn%20of%20Plenty.full.jpg -horn_of_ramos.jpg http://[server]/MM/Horn%20of%20Ramos.full.jpg -horned_cheetah.jpg http://[server]/IN/Horned%20Cheetah.full.jpg -horned_helm.jpg http://[server]/FD/Horned%20Helm.full.jpg -horned_kavu.jpg http://[server]/PS/Horned%20Kavu.full.jpg -horned_sliver.jpg http://[server]/TE/Horned%20Sliver.full.jpg -horned_troll.jpg http://[server]/MM/Horned%20Troll.full.jpg -horned_turtle.jpg http://[server]/M10/Horned%20Turtle.full.jpg -hornet_cannon.jpg http://[server]/SH/Hornet%20Cannon.full.jpg -hornet_cobra.jpg http://[server]/LG/Hornet%20Cobra.full.jpg -hornet_harasser.jpg http://[server]/LRW/Hornet%20Harasser.full.jpg -horobi_deaths_wail.jpg http://[server]/CHK/Horobi,%20Death's%20Wail.full.jpg -horobis_whisper.jpg http://[server]/BOK/Horobi's%20Whisper.full.jpg -horrible_hordes.jpg http://[server]/MI/Horrible%20Hordes.full.jpg -horror_of_horrors.jpg http://[server]/LG/Horror%20of%20Horrors.full.jpg -horseshoe_crab.jpg http://[server]/10E/Horseshoe%20Crab.full.jpg -hostile_realm.jpg http://[server]/MOR/Hostile%20Realm.full.jpg -hostility.jpg http://[server]/LRW/Hostility.full.jpg -hot_springs.jpg http://[server]/IA/Hot%20Springs.full.jpg -hotheaded_giant.jpg http://[server]/EVE/Hotheaded%20Giant.full.jpg -hour_of_reckoning.jpg http://[server]/RAV/Hour%20of%20Reckoning.full.jpg -hoverguard_observer.jpg http://[server]/DS/Hoverguard%20Observer.full.jpg -hoverguard_sweepers.jpg http://[server]/FD/Hoverguard%20Sweepers.full.jpg -howl_from_beyond.jpg http://[server]/7E/Howl%20from%20Beyond.full.jpg -howl_of_the_night_pack.jpg http://[server]/M10/Howl%20of%20the%20Night%20Pack.full.jpg -howling_banshee.jpg http://[server]/M10/Howling%20Banshee.full.jpg -howling_fury.jpg http://[server]/ST/Howling%20Fury.full.jpg -howling_gale.jpg http://[server]/OD/Howling%20Gale.full.jpg -howling_mine.jpg http://[server]/M10/Howling%20Mine.full.jpg -howling_wolf.jpg http://[server]/MM/Howling%20Wolf.full.jpg -howltooth_hollow.jpg http://[server]/LRW/Howltooth%20Hollow.full.jpg -hua_tuo_honored_physician.jpg http://[server]/P3/Hua%20Tuo,%20Honored%20Physician.full.jpg -huang_zhong_shu_general.jpg http://[server]/P3/Huang%20Zhong,%20Shu%20General.full.jpg -hulking_cyclops.jpg http://[server]/8E/Hulking%20Cyclops.full.jpg -hulking_goblin.jpg http://[server]/ST/Hulking%20Goblin.full.jpg -hulking_ogre.jpg http://[server]/ST/Hulking%20Ogre.full.jpg -hull_breach.jpg http://[server]/PS/Hull%20Breach.full.jpg -hum_of_the_radix.jpg http://[server]/MR/Hum%20of%20the%20Radix.full.jpg -humble.jpg http://[server]/US/Humble.full.jpg -humble_budoka.jpg http://[server]/CHK/Humble%20Budoka.full.jpg -humility.jpg http://[server]/TE/Humility.full.jpg -hunding_gjornersen.jpg http://[server]/LG/Hunding%20Gjornersen.full.jpg -hundred_talon_kami.jpg http://[server]/CHK/Hundred-Talon%20Kami.full.jpg -hundred_talon_strike.jpg http://[server]/BOK/Hundred-Talon%20Strike.full.jpg -hundroog.jpg http://[server]/LE/Hundroog.full.jpg -hunger_of_the_nim.jpg http://[server]/DS/Hunger%20of%20the%20Nim.full.jpg -hungry_hungry_heifer.jpg http://[server]/UG/Hungry%20Hungry%20Heifer.full.jpg -hungry_mist.jpg http://[server]/5E/Hungry%20Mist.full.jpg -hungry_spriggan.jpg http://[server]/SHM/Hungry%20Spriggan.full.jpg -hunt_down.jpg http://[server]/LRW/Hunt%20Down.full.jpg -hunted_dragon.jpg http://[server]/RAV/Hunted%20Dragon.full.jpg -hunted_horror.jpg http://[server]/RAV/Hunted%20Horror.full.jpg -hunted_lammasu.jpg http://[server]/RAV/Hunted%20Lammasu.full.jpg -hunted_phantasm.jpg http://[server]/RAV/Hunted%20Phantasm.full.jpg -hunted_troll.jpg http://[server]/RAV/Hunted%20Troll.full.jpg -hunted_wumpus.jpg http://[server]/10E/Hunted%20Wumpus.full.jpg -hunter_of_eyeblights.jpg http://[server]/LRW/Hunter%20of%20Eyeblights.full.jpg -hunter_sliver.jpg http://[server]/LE/Hunter%20Sliver.full.jpg -hunting_cheetah.jpg http://[server]/P3/Hunting%20Cheetah.full.jpg -hunting_drake.jpg http://[server]/PS/Hunting%20Drake.full.jpg -hunting_grounds.jpg http://[server]/JU/Hunting%20Grounds.full.jpg -hunting_kavu.jpg http://[server]/IN/Hunting%20Kavu.full.jpg -hunting_moa.jpg http://[server]/UD/Hunting%20Moa.full.jpg -hunting_pack.jpg http://[server]/SC/Hunting%20Pack.full.jpg -hunting_triad.jpg http://[server]/MOR/Hunting%20Triad.full.jpg -hunting_wilds.jpg http://[server]/PLC/Hunting%20Wilds.full.jpg -hurkyls_recall.jpg http://[server]/10E/Hurkyl's%20Recall.full.jpg -hurloon_minotaur.jpg http://[server]/5E/Hurloon%20Minotaur.full.jpg -hurloon_shaman.jpg http://[server]/WL/Hurloon%20Shaman.full.jpg -hurloon_wrangler.jpg http://[server]/UG/Hurloon%20Wrangler.full.jpg -hurly_burly.jpg http://[server]/LRW/Hurly-Burly.full.jpg -hurr_jackal.jpg http://[server]/4E/Hurr%20Jackal.full.jpg -hurricane.jpg http://[server]/10E/Hurricane.full.jpg -hush.jpg http://[server]/US/Hush.full.jpg -hyalopterous_lemure.jpg http://[server]/IA/Hyalopterous%20Lemure.full.jpg -hydroblast.jpg http://[server]/5E/Hydroblast.full.jpg -hydromorph_guardian.jpg http://[server]/TO/Hydromorph%20Guardian.full.jpg -hydromorph_gull.jpg http://[server]/TO/Hydromorph%20Gull.full.jpg -hymn_of_rebirth.jpg http://[server]/IA/Hymn%20of%20Rebirth.full.jpg -hymn_to_tourach.jpg http://[server]/AT/Hymn%20to%20Tourach.full.jpg -hypergenesis.jpg http://[server]/TSP/Hypergenesis.full.jpg -hyperion_blacksmith.jpg http://[server]/LG/Hyperion%20Blacksmith.full.jpg -hypervolt_grasp.jpg http://[server]/GP/Hypervolt%20Grasp.full.jpg -hypnotic_cloud.jpg http://[server]/IN/Hypnotic%20Cloud.full.jpg -hypnotic_specter.jpg http://[server]/M10/Hypnotic%20Specter.full.jpg -hypnox.jpg http://[server]/TO/Hypnox.full.jpg -hypochondria.jpg http://[server]/TO/Hypochondria.full.jpg -hystrodon.jpg http://[server]/ON/Hystrodon.full.jpg \ No newline at end of file diff --git a/res/pics_link/card-pictures_i.txt b/res/pics_link/card-pictures_i.txt deleted file mode 100644 index ac7ec72fc40..00000000000 --- a/res/pics_link/card-pictures_i.txt +++ /dev/null @@ -1,256 +0,0 @@ -ib_halfheart_goblin_tactician.jpg http://[server]/TSP/Ib%20Halfheart,%20Goblin%20Tactician.full.jpg -icatian_crier.jpg http://[server]/TSP/Icatian%20Crier.full.jpg -icatian_infantry.jpg http://[server]/FE/Icatian%20Infantry1.full.jpg -icatian_javelineers.jpg http://[server]/AT/Icatian%20Javelineers.full.jpg -icatian_lieutenant.jpg http://[server]/FE/Icatian%20Lieutenant.full.jpg -icatian_moneychanger.jpg http://[server]/FE/Icatian%20Moneychanger1.full.jpg -icatian_phalanx.jpg http://[server]/FE/Icatian%20Phalanx.full.jpg -icatian_priest.jpg http://[server]/10E/Icatian%20Priest.full.jpg -icatian_scout.jpg http://[server]/5E/Icatian%20Scout.full.jpg -icatian_skirmishers.jpg http://[server]/FE/Icatian%20Skirmishers.full.jpg -icatian_store.jpg http://[server]/FE/Icatian%20Store.full.jpg -icatian_town.jpg http://[server]/6E/Icatian%20Town.full.jpg -ice_cage.jpg http://[server]/M10/Ice%20Cage.full.jpg -ice_cauldron.jpg http://[server]/IA/Ice%20Cauldron.full.jpg -ice_cave.jpg http://[server]/AP/Ice%20Cave.full.jpg -ice_floe.jpg http://[server]/IA/Ice%20Floe.full.jpg -ice_storm.jpg http://[server]/U/Ice%20Storm.full.jpg -iceberg.jpg http://[server]/IA/Iceberg.full.jpg -icefall.jpg http://[server]/CS/Icefall.full.jpg -icequake.jpg http://[server]/IA/Icequake.full.jpg -ichneumon_druid.jpg http://[server]/LG/Ichneumon%20Druid.full.jpg -ichor_slick.jpg http://[server]/FUT/Ichor%20Slick.full.jpg -ichorid.jpg http://[server]/TO/Ichorid.full.jpg -icy_manipulator.jpg http://[server]/10E/Icy%20Manipulator.full.jpg -icy_prison.jpg http://[server]/IA/Icy%20Prison.full.jpg -ideas_unbound.jpg http://[server]/SOK/Ideas%20Unbound.full.jpg -identity_crisis.jpg http://[server]/ARB/Identity%20Crisis.full.jpg -idle_thoughts.jpg http://[server]/EVE/Idle%20Thoughts.full.jpg -idyllic_tutor.jpg http://[server]/MOR/Idyllic%20Tutor.full.jpg -ifh_biff_efreet.jpg http://[server]/AN/Ifh-Biff%20Efreet.full.jpg -igneous_golem.jpg http://[server]/MI/Igneous%20Golem.full.jpg -igneous_pouncer.jpg http://[server]/ARB/Igneous%20Pouncer.full.jpg -ignite_disorder.jpg http://[server]/M10/Ignite%20Disorder.full.jpg -ignite_memories.jpg http://[server]/TSP/Ignite%20Memories.full.jpg -ignoble_soldier.jpg http://[server]/MM/Ignoble%20Soldier.full.jpg -ignorant_bliss.jpg http://[server]/DIS/Ignorant%20Bliss.full.jpg -ihsans_shade.jpg http://[server]/HL/Ihsan's%20Shade.full.jpg -iizuka_the_ruthless.jpg http://[server]/SOK/Iizuka%20the%20Ruthless.full.jpg -ill_gotten_gains.jpg http://[server]/US/Ill-Gotten%20Gains.full.jpg -illicit_auction.jpg http://[server]/MI/Illicit%20Auction.full.jpg -illuminate.jpg http://[server]/AP/Illuminate.full.jpg -illuminated_folio.jpg http://[server]/SHM/Illuminated%20Folio.full.jpg -illuminated_wings.jpg http://[server]/UD/Illuminated%20Wings.full.jpg -illumination.jpg http://[server]/MI/Illumination.full.jpg -illusionary_forces.jpg http://[server]/IA/Illusionary%20Forces.full.jpg -illusionary_mask.jpg http://[server]/U/Illusionary%20Mask.full.jpg -illusionary_presence.jpg http://[server]/IA/Illusionary%20Presence.full.jpg -illusionary_servant.jpg http://[server]/M10/Illusionary%20Servant.full.jpg -illusionary_terrain.jpg http://[server]/IA/Illusionary%20Terrain.full.jpg -illusionary_wall.jpg http://[server]/IA/Illusionary%20Wall.full.jpg -illusionreality.jpg http://[server]/AP/IllusionReality.full.jpg -illusions_of_grandeur.jpg http://[server]/IA/Illusions%20of%20Grandeur.full.jpg -illusory_demon.jpg http://[server]/ARB/Illusory%20Demon.full.jpg -im_rubber_youre_glue.jpg http://[server]/UG/I'm%20Rubber,%20You're%20Glue.full.jpg -imagecrafter.jpg http://[server]/ON/Imagecrafter.full.jpg -imaginary_pet.jpg http://[server]/9E/Imaginary%20Pet.full.jpg -imi_statue.jpg http://[server]/CHK/Imi%20Statue.full.jpg -immaculate_magistrate.jpg http://[server]/LRW/Immaculate%20Magistrate.full.jpg -immobilizing_ink.jpg http://[server]/OD/Immobilizing%20Ink.full.jpg -immolation.jpg http://[server]/LG/Immolation.full.jpg -immortal_coil.jpg http://[server]/ALA/Immortal%20Coil.full.jpg -impatience.jpg http://[server]/7E/Impatience.full.jpg -impelled_giant.jpg http://[server]/EVE/Impelled%20Giant.full.jpg -impending_disaster.jpg http://[server]/UL/Impending%20Disaster.full.jpg -imperial_edict.jpg http://[server]/P3/Imperial%20Edict.full.jpg -imperial_hellkite.jpg http://[server]/LE/Imperial%20Hellkite.full.jpg -imperial_mask.jpg http://[server]/FUT/Imperial%20Mask.full.jpg -imperial_recruiter.jpg http://[server]/P3/Imperial%20Recruiter.full.jpg -imperial_seal.jpg http://[server]/P3/Imperial%20Seal.full.jpg -imperiosaur.jpg http://[server]/FUT/Imperiosaur.full.jpg -imperious_perfect.jpg http://[server]/LRW/Imperious%20Perfect.full.jpg -implements_of_sacrifice.jpg http://[server]/FE/Implements%20of%20Sacrifice.full.jpg -implode.jpg http://[server]/PS/Implode.full.jpg -imposing_visage.jpg http://[server]/IA/Imposing%20Visage.full.jpg -imprison.jpg http://[server]/LG/Imprison.full.jpg -impromptu_raid.jpg http://[server]/SHM/Impromptu%20Raid.full.jpg -improvised_armor.jpg http://[server]/ON/Improvised%20Armor.full.jpg -imps_mischief.jpg http://[server]/PLC/Imp's%20Mischief.full.jpg -imps_taunt.jpg http://[server]/TE/Imps'%20Taunt.full.jpg -impulse.jpg http://[server]/VI/Impulse.full.jpg -impulsive_maneuvers.jpg http://[server]/OD/Impulsive%20Maneuvers.full.jpg -in_the_eye_of_chaos.jpg http://[server]/LG/In%20the%20Eye%20of%20Chaos.full.jpg -in_the_web_of_war.jpg http://[server]/BOK/In%20the%20Web%20of%20War.full.jpg -iname_as_one.jpg http://[server]/SOK/Iname%20as%20One.full.jpg -iname_death_aspect.jpg http://[server]/CHK/Iname,%20Death%20Aspect.full.jpg -iname_life_aspect.jpg http://[server]/CHK/Iname,%20Life%20Aspect.full.jpg -incandescent_soulstoke.jpg http://[server]/LRW/Incandescent%20Soulstoke.full.jpg -incendiary.jpg http://[server]/UD/Incendiary.full.jpg -incendiary_command.jpg http://[server]/LRW/Incendiary%20Command.full.jpg -incinerate.jpg http://[server]/10E/Incinerate.full.jpg -incite_hysteria.jpg http://[server]/RAV/Incite%20Hysteria.full.jpg -incite_war.jpg http://[server]/MR/Incite%20War.full.jpg -incoming!.jpg http://[server]/OV/Incoming!.full.jpg -incremental_blight.jpg http://[server]/HOP/Incremental%20Blight.full.jpg -incremental_growth.jpg http://[server]/LRW/Incremental%20Growth.full.jpg -incurable_ogre.jpg http://[server]/ALA/Incurable%20Ogre.full.jpg -indebted_samurai.jpg http://[server]/BOK/Indebted%20Samurai.full.jpg -indentured_djinn.jpg http://[server]/MM/Indentured%20Djinn.full.jpg -indentured_oaf.jpg http://[server]/RAV/Indentured%20Oaf.full.jpg -independent_troops.jpg http://[server]/P3/Independent%20Troops.full.jpg -indestructibility.jpg http://[server]/M10/Indestructibility.full.jpg -indestructible_aura.jpg http://[server]/LG/Indestructible%20Aura.full.jpg -index.jpg http://[server]/AP/Index.full.jpg -indigo_faerie.jpg http://[server]/EVE/Indigo%20Faerie.full.jpg -indomitable_ancients.jpg http://[server]/MOR/Indomitable%20Ancients.full.jpg -indomitable_will.jpg http://[server]/CHK/Indomitable%20Will.full.jpg -indrik_stomphowler.jpg http://[server]/DIS/Indrik%20Stomphowler.full.jpg -induce_paranoia.jpg http://[server]/RAV/Induce%20Paranoia.full.jpg -inertia_bubble.jpg http://[server]/MR/Inertia%20Bubble.full.jpg -inescapable_brute.jpg http://[server]/SHM/Inescapable%20Brute.full.jpg -infantry_veteran.jpg http://[server]/9E/Infantry%20Veteran.full.jpg -infected_vermin.jpg http://[server]/OD/Infected%20Vermin.full.jpg -infectious_horror.jpg http://[server]/CFX/Infectious%20Horror.full.jpg -infectious_host.jpg http://[server]/RAV/Infectious%20Host.full.jpg -infectious_rage.jpg http://[server]/JU/Infectious%20Rage.full.jpg -infernal_caretaker.jpg http://[server]/LE/Infernal%20Caretaker.full.jpg -infernal_contract.jpg http://[server]/7E/Infernal%20Contract.full.jpg -infernal_darkness.jpg http://[server]/IA/Infernal%20Darkness.full.jpg -infernal_denizen.jpg http://[server]/IA/Infernal%20Denizen.full.jpg -infernal_genesis.jpg http://[server]/PY/Infernal%20Genesis.full.jpg -infernal_harvest.jpg http://[server]/VI/Infernal%20Harvest.full.jpg -infernal_kirin.jpg http://[server]/SOK/Infernal%20Kirin.full.jpg -infernal_medusa.jpg http://[server]/LG/Infernal%20Medusa.full.jpg -infernal_spawn_of_evil.jpg http://[server]/UG/Infernal%20Spawn%20of%20Evil.full.jpg -infernal_spawn_of_infernal_spawn_of_evil.jpg http://[server]/UNH/Infernal%20Spawn%20of%20Infernal%20Spawn%20of%20Evil.full.jpg -infernal_tribute.jpg http://[server]/WL/Infernal%20Tribute.full.jpg -infernal_tutor.jpg http://[server]/DIS/Infernal%20Tutor.full.jpg -inferno.jpg http://[server]/8E/Inferno.full.jpg -inferno_elemental.jpg http://[server]/M10/Inferno%20Elemental.full.jpg -inferno_trap.jpg http://[server]/ZEN/Inferno%20Trap.full.jpg -infest.jpg http://[server]/ON/Infest.full.jpg -infested_roothold.jpg http://[server]/DS/Infested%20Roothold.full.jpg -infiltrate.jpg http://[server]/NE/Infiltrate.full.jpg -infiltrator_il_kor.jpg http://[server]/FUT/Infiltrator%20il-Kor.full.jpg -infiltrators_magemark.jpg http://[server]/GP/Infiltrator's%20Magemark.full.jpg -infinite_authority.jpg http://[server]/LG/Infinite%20Authority.full.jpg -infinite_hourglass.jpg http://[server]/5E/Infinite%20Hourglass.full.jpg -inflame.jpg http://[server]/PY/Inflame.full.jpg -information_dealer.jpg http://[server]/ON/Information%20Dealer.full.jpg -infuse.jpg http://[server]/IA/Infuse.full.jpg -infused_arrows.jpg http://[server]/FD/Infused%20Arrows.full.jpg -ingenious_thief.jpg http://[server]/ST/Ingenious%20Thief.full.jpg -ingot_chewer.jpg http://[server]/LRW/Ingot%20Chewer.full.jpg -inheritance.jpg http://[server]/AL/Inheritance.full.jpg -initiate_of_blood.jpg http://[server]/CHK/Initiate%20of%20Blood.full.jpg -initiates_of_the_ebon_hand.jpg http://[server]/5E/Initiates%20of%20the%20Ebon%20Hand.full.jpg -ink_dissolver.jpg http://[server]/MOR/Ink%20Dissolver.full.jpg -ink_eyes_servant_of_oni.jpg http://[server]/BOK/Ink-Eyes,%20Servant%20of%20Oni.full.jpg -ink_treader_nephilim.jpg http://[server]/GP/Ink-Treader%20Nephilim.full.jpg -inkfathom_divers.jpg http://[server]/LRW/Inkfathom%20Divers.full.jpg -inkfathom_infiltrator.jpg http://[server]/SHM/Inkfathom%20Infiltrator.full.jpg -inkfathom_witch.jpg http://[server]/SHM/Inkfathom%20Witch.full.jpg -inkwell_leviathan.jpg http://[server]/CFX/Inkwell%20Leviathan.full.jpg -inner_calm_outer_strength.jpg http://[server]/SOK/Inner%20Calm,%20Outer%20Strength.full.jpg -inner_chamber_guard.jpg http://[server]/SOK/Inner-Chamber%20Guard.full.jpg -inner_fire.jpg http://[server]/SOK/Inner%20Fire.full.jpg -inner_flame_acolyte.jpg http://[server]/LRW/Inner-Flame%20Acolyte.full.jpg -inner_flame_igniter.jpg http://[server]/LRW/Inner-Flame%20Igniter.full.jpg -inner_sanctum.jpg http://[server]/WL/Inner%20Sanctum.full.jpg -innocence_kami.jpg http://[server]/CHK/Innocence%20Kami.full.jpg -innocent_blood.jpg http://[server]/OD/Innocent%20Blood.full.jpg -inquisition.jpg http://[server]/DK/Inquisition.full.jpg -inquisitors_snare.jpg http://[server]/SHM/Inquisitor's%20Snare.full.jpg -inside_out.jpg http://[server]/EVE/Inside%20Out.full.jpg -insidious_bookworms.jpg http://[server]/CST/Insidious%20Bookworms.full.jpg -insidious_dreams.jpg http://[server]/TO/Insidious%20Dreams.full.jpg -insight.jpg http://[server]/6E/Insight.full.jpg -insist.jpg http://[server]/TO/Insist.full.jpg -insolence.jpg http://[server]/PS/Insolence.full.jpg -inspiration.jpg http://[server]/8E/Inspiration.full.jpg -inspired_sprite.jpg http://[server]/MOR/Inspired%20Sprite.full.jpg -inspirit.jpg http://[server]/9E/Inspirit.full.jpg -instigator.jpg http://[server]/MM/Instigator.full.jpg -instill_energy.jpg http://[server]/5E/Instill%20Energy.full.jpg -instill_furor.jpg http://[server]/RAV/Instill%20Furor.full.jpg -insubordination.jpg http://[server]/MM/Insubordination.full.jpg -insurrection.jpg http://[server]/ON/Insurrection.full.jpg -interdict.jpg http://[server]/TE/Interdict.full.jpg -intervene.jpg http://[server]/UL/Intervene.full.jpg -intervention_pact.jpg http://[server]/FUT/Intervention%20Pact.full.jpg -intet_the_dreamer.jpg http://[server]/PLC/Intet,%20the%20Dreamer.full.jpg -intimidation.jpg http://[server]/MM/Intimidation.full.jpg -intimidation_bolt.jpg http://[server]/ARB/Intimidation%20Bolt.full.jpg -intimidator_initiate.jpg http://[server]/SHM/Intimidator%20Initiate.full.jpg -into_the_fray.jpg http://[server]/SOK/Into%20the%20Fray.full.jpg -into_the_north.jpg http://[server]/CS/Into%20the%20North.full.jpg -into_the_roil.jpg http://[server]/ZEN/Into%20the%20Roil.full.jpg -into_thin_air.jpg http://[server]/FD/Into%20Thin%20Air.full.jpg -intrepid_hero.jpg http://[server]/8E/Intrepid%20Hero.full.jpg -intruder_alarm.jpg http://[server]/8E/Intruder%20Alarm.full.jpg -intuition.jpg http://[server]/TE/Intuition.full.jpg -inundate.jpg http://[server]/EVE/Inundate.full.jpg -invasion_plans.jpg http://[server]/SH/Invasion%20Plans.full.jpg -invert_the_skies.jpg http://[server]/EVE/Invert%20the%20Skies.full.jpg -invigorate.jpg http://[server]/MM/Invigorate.full.jpg -invigorating_boon.jpg http://[server]/ON/Invigorating%20Boon.full.jpg -invigorating_falls.jpg http://[server]/TO/Invigorating%20Falls.full.jpg -invincible_hymn.jpg http://[server]/ALA/Invincible%20Hymn.full.jpg -inviolability.jpg http://[server]/MM/Inviolability.full.jpg -invisibility.jpg http://[server]/8E/Invisibility.full.jpg -invoke_prejudice.jpg http://[server]/LG/Invoke%20Prejudice.full.jpg -invoke_the_firemind.jpg http://[server]/GP/Invoke%20the%20Firemind.full.jpg -invulnerability.jpg http://[server]/TE/Invulnerability.full.jpg -ion_storm.jpg http://[server]/FD/Ion%20Storm.full.jpg -iona_shield_of_emeria.jpg http://[server]/ZEN/Iona,%20Shield%20of%20Emeria.full.jpg -ior_ruin_expedition.jpg http://[server]/ZEN/Ior%20Ruin%20Expedition.full.jpg -ire_of_kaminari.jpg http://[server]/BOK/Ire%20of%20Kaminari.full.jpg -iridescent_angel.jpg http://[server]/OD/Iridescent%20Angel.full.jpg -iridescent_drake.jpg http://[server]/UD/Iridescent%20Drake.full.jpg -irini_sengir.jpg http://[server]/HL/Irini%20Sengir.full.jpg -iron_barb_hellion.jpg http://[server]/FD/Iron-Barb%20Hellion.full.jpg -iron_heart_chimera.jpg http://[server]/VI/Iron-Heart%20Chimera.full.jpg -iron_lance.jpg http://[server]/MM/Iron%20Lance.full.jpg -iron_maiden.jpg http://[server]/UL/Iron%20Maiden.full.jpg -iron_myr.jpg http://[server]/MR/Iron%20Myr.full.jpg -iron_star.jpg http://[server]/8E/Iron%20Star.full.jpg -iron_tusk_elephant.jpg http://[server]/MI/Iron%20Tusk%20Elephant.full.jpg -iron_will.jpg http://[server]/UL/Iron%20Will.full.jpg -ironclaw_buzzardiers.jpg http://[server]/TSP/Ironclaw%20Buzzardiers.full.jpg -ironclaw_curse.jpg http://[server]/HL/Ironclaw%20Curse.full.jpg -ironclaw_orcs.jpg http://[server]/5E/Ironclaw%20Orcs.full.jpg -ironfist_crusher.jpg http://[server]/ON/Ironfist%20Crusher.full.jpg -ironhoof_ox.jpg http://[server]/P2/Ironhoof%20Ox.full.jpg -ironroot_treefolk.jpg http://[server]/5E/Ironroot%20Treefolk.full.jpg -ironshell_beetle.jpg http://[server]/JU/Ironshell%20Beetle.full.jpg -irradiate.jpg http://[server]/MR/Irradiate.full.jpg -irrigation_ditch.jpg http://[server]/IN/Irrigation%20Ditch.full.jpg -isamaru_hound_of_konda.jpg http://[server]/CHK/Isamaru,%20Hound%20of%20Konda.full.jpg -isao_enlightened_bushi.jpg http://[server]/BOK/Isao,%20Enlightened%20Bushi.full.jpg -ishi_ishi_akki_crackshot.jpg http://[server]/BOK/Ishi-Ishi,%20Akki%20Crackshot.full.jpg -island_fish_jasconius.jpg http://[server]/4E/Island%20Fish%20Jasconius.full.jpg -island_of_wak_wak.jpg http://[server]/AN/Island%20of%20Wak-Wak.full.jpg -island_sanctuary.jpg http://[server]/5E/Island%20Sanctuary.full.jpg -isleback_spawn.jpg http://[server]/SHM/Isleback%20Spawn.full.jpg -isochron_scepter.jpg http://[server]/MR/Isochron%20Scepter.full.jpg -isperia_the_inscrutable.jpg http://[server]/DIS/Isperia%20the%20Inscrutable.full.jpg -ith_high_arcanist.jpg http://[server]/TSP/Ith,%20High%20Arcanist.full.jpg -ivory_charm.jpg http://[server]/MI/Ivory%20Charm.full.jpg -ivory_crane_netsuke.jpg http://[server]/SOK/Ivory%20Crane%20Netsuke.full.jpg -ivory_cup.jpg http://[server]/8E/Ivory%20Cup.full.jpg -ivory_gargoyle.jpg http://[server]/AL/Ivory%20Gargoyle.full.jpg -ivory_giant.jpg http://[server]/TSP/Ivory%20Giant.full.jpg -ivory_guardians.jpg http://[server]/LG/Ivory%20Guardians.full.jpg -ivory_mask.jpg http://[server]/9E/Ivory%20Mask.full.jpg -ivory_tower.jpg http://[server]/4E/Ivory%20Tower.full.jpg -ivy_dancer.jpg http://[server]/RAV/Ivy%20Dancer.full.jpg -ivy_elemental.jpg http://[server]/OD/Ivy%20Elemental.full.jpg -ivy_seer.jpg http://[server]/UD/Ivy%20Seer.full.jpg -iwamori_of_the_open_fist.jpg http://[server]/BOK/Iwamori%20of%20the%20Open%20Fist.full.jpg -ixidor_reality_sculptor.jpg http://[server]/ON/Ixidor,%20Reality%20Sculptor.full.jpg -ixidors_will.jpg http://[server]/ON/Ixidor's%20Will.full.jpg -ixidron.jpg http://[server]/TSP/Ixidron.full.jpg -izzet_boilerworks.jpg http://[server]/GP/Izzet%20Boilerworks.full.jpg -izzet_chronarch.jpg http://[server]/GP/Izzet%20Chronarch.full.jpg -izzet_guildmage.jpg http://[server]/GP/Izzet%20Guildmage.full.jpg -izzet_signet.jpg http://[server]/GP/Izzet%20Signet.full.jpg \ No newline at end of file diff --git a/res/pics_link/card-pictures_j.txt b/res/pics_link/card-pictures_j.txt deleted file mode 100644 index 1ff5d7c50eb..00000000000 --- a/res/pics_link/card-pictures_j.txt +++ /dev/null @@ -1,121 +0,0 @@ -jabaris_banner.jpg http://[server]/WL/Jabari's%20Banner.full.jpg -jabaris_influence.jpg http://[server]/MI/Jabari's%20Influence.full.jpg -jace_beleren.jpg http://[server]/M10/Jace%20Beleren.full.jpg -jack_in_the_mox.jpg http://[server]/UG/Jack-in-the-Mox.full.jpg -jackal_familiar.jpg http://[server]/M10/Jackal%20Familiar.full.jpg -jackal_pup.jpg http://[server]/TE/Jackal%20Pup.full.jpg -jackalope_herd.jpg http://[server]/EX/Jackalope%20Herd.full.jpg -jacques_le_vert.jpg http://[server]/LG/Jacques%20le%20Vert.full.jpg -jade_idol.jpg http://[server]/CHK/Jade%20Idol.full.jpg -jade_leech.jpg http://[server]/IN/Jade%20Leech.full.jpg -jade_monolith.jpg http://[server]/6E/Jade%20Monolith.full.jpg -jade_statue.jpg http://[server]/9E/Jade%20Statue.full.jpg -jaded_response.jpg http://[server]/AP/Jaded%20Response.full.jpg -jagged_lightning.jpg http://[server]/US/Jagged%20Lightning.full.jpg -jagged_poppet.jpg http://[server]/DIS/Jagged%20Poppet.full.jpg -jagged_scar_archers.jpg http://[server]/LRW/Jagged-Scar%20Archers.full.jpg -jalum_grifter.jpg http://[server]/UG/Jalum%20Grifter.full.jpg -jalum_tome.jpg http://[server]/7E/Jalum%20Tome.full.jpg -jamuraan_lion.jpg http://[server]/VI/Jamuraan%20Lion.full.jpg -jandors_ring.jpg http://[server]/AN/Jandor's%20Ring.full.jpg -jandors_saddlebags.jpg http://[server]/7E/Jandor's%20Saddlebags.full.jpg -jangling_automaton.jpg http://[server]/WL/Jangling%20Automaton.full.jpg -jareth_leonine_titan.jpg http://[server]/ON/Jareth,%20Leonine%20Titan.full.jpg -jasmine_boreal.jpg http://[server]/LG/Jasmine%20Boreal.full.jpg -jasmine_seer.jpg http://[server]/UD/Jasmine%20Seer.full.jpg -jawbone_skulkin.jpg http://[server]/EVE/Jawbone%20Skulkin.full.jpg -jaws_of_stone.jpg http://[server]/SHM/Jaws%20of%20Stone.full.jpg -jaya_ballard_task_mage.jpg http://[server]/TSP/Jaya%20Ballard,%20Task%20Mage.full.jpg -jayemdae_tome.jpg http://[server]/10E/Jayemdae%20Tome.full.jpg -jedit_ojanen.jpg http://[server]/LG/Jedit%20Ojanen.full.jpg -jedit_ojanen_of_efrava.jpg http://[server]/PLC/Jedit%20Ojanen%20of%20Efrava.full.jpg -jedits_dragoons.jpg http://[server]/TSP/Jedit's%20Dragoons.full.jpg -jenara_asura_of_war.jpg http://[server]/ARB/Jenara,%20Asura%20of%20War.full.jpg -jerrard_of_the_closed_fist.jpg http://[server]/LG/Jerrard%20of%20the%20Closed%20Fist.full.jpg -jeska_warrior_adept.jpg http://[server]/JU/Jeska,%20Warrior%20Adept.full.jpg -jesters_cap.jpg http://[server]/9E/Jester's%20Cap.full.jpg -jesters_mask.jpg http://[server]/IA/Jester's%20Mask.full.jpg -jesters_scepter.jpg http://[server]/CS/Jester's%20Scepter.full.jpg -jesters_sombrero.jpg http://[server]/UG/Jester's%20Sombrero.full.jpg -jet_medallion.jpg http://[server]/TE/Jet%20Medallion.full.jpg -jetting_glasskite.jpg http://[server]/BOK/Jetting%20Glasskite.full.jpg -jeweled_amulet.jpg http://[server]/IA/Jeweled%20Amulet.full.jpg -jeweled_bird.jpg http://[server]/CH/Jeweled%20Bird.full.jpg -jeweled_spirit.jpg http://[server]/PY/Jeweled%20Spirit.full.jpg -jeweled_torque.jpg http://[server]/MM/Jeweled%20Torque.full.jpg -jhessian_balmgiver.jpg http://[server]/CFX/Jhessian%20Balmgiver.full.jpg -jhessian_infiltrator.jpg http://[server]/ALA/Jhessian%20Infiltrator.full.jpg -jhessian_lookout.jpg http://[server]/ALA/Jhessian%20Lookout.full.jpg -jhessian_zombies.jpg http://[server]/ARB/Jhessian%20Zombies.full.jpg -jhoira_of_the_ghitu.jpg http://[server]/FUT/Jhoira%20of%20the%20Ghitu.full.jpg -jhoiras_timebug.jpg http://[server]/TSP/Jhoira's%20Timebug.full.jpg -jhoiras_toolbox.jpg http://[server]/UL/Jhoira's%20Toolbox.full.jpg -jhovall_queen.jpg http://[server]/MM/Jhovall%20Queen.full.jpg -jhovall_rider.jpg http://[server]/MM/Jhovall%20Rider.full.jpg -jihad.jpg http://[server]/AN/Jihad.full.jpg -jilt.jpg http://[server]/AP/Jilt.full.jpg -jinx.jpg http://[server]/HL/Jinx.full.jpg -jinxed_choker.jpg http://[server]/MR/Jinxed%20Choker.full.jpg -jinxed_idol.jpg http://[server]/TE/Jinxed%20Idol.full.jpg -jinxed_ring.jpg http://[server]/SH/Jinxed%20Ring.full.jpg -jiwari_the_earth_aflame.jpg http://[server]/SOK/Jiwari,%20the%20Earth%20Aflame.full.jpg -jodahs_avenger.jpg http://[server]/PLC/Jodah's%20Avenger.full.jpg -johan.jpg http://[server]/LG/Johan.full.jpg -johnny_combo_player.jpg http://[server]/UNH/Johnny,%20Combo%20Player.full.jpg -johtull_wurm.jpg http://[server]/5E/Johtull%20Wurm.full.jpg -joiner_adept.jpg http://[server]/10E/Joiner%20Adept.full.jpg -jokulhaups.jpg http://[server]/6E/Jokulhaups.full.jpg -jokulmorder.jpg http://[server]/CS/Jokulmorder.full.jpg -jolrael_empress_of_beasts.jpg http://[server]/PY/Jolrael,%20Empress%20of%20Beasts.full.jpg -jolraels_centaur.jpg http://[server]/MI/Jolrael's%20Centaur.full.jpg -jolraels_favor.jpg http://[server]/PY/Jolrael's%20Favor.full.jpg -jolt.jpg http://[server]/MI/Jolt.full.jpg -jolting_merfolk.jpg http://[server]/NE/Jolting%20Merfolk.full.jpg -joraga_bard.jpg http://[server]/ZEN/Joraga%20Bard.full.jpg -jotun_grunt.jpg http://[server]/CS/Jotun%20Grunt.full.jpg -jotun_owl_keeper.jpg http://[server]/CS/Jotun%20Owl%20Keeper.full.jpg -journey_of_discovery.jpg http://[server]/MR/Journey%20of%20Discovery.full.jpg -journey_to_nowhere.jpg http://[server]/ZEN/Journey%20to%20Nowhere.full.jpg -journeyers_kite.jpg http://[server]/CHK/Journeyer's%20Kite.full.jpg -joven.jpg http://[server]/HL/Joven.full.jpg -jovens_ferrets.jpg http://[server]/HL/Joven's%20Ferrets.full.jpg -jovens_tools.jpg http://[server]/HL/Joven's%20Tools.full.jpg -jovial_evil.jpg http://[server]/LG/Jovial%20Evil.full.jpg -joyous_respite.jpg http://[server]/CHK/Joyous%20Respite.full.jpg -judge_of_currents.jpg http://[server]/LRW/Judge%20of%20Currents.full.jpg -judge_unworthy.jpg http://[server]/FUT/Judge%20Unworthy.full.jpg -jugan_the_rising_star.jpg http://[server]/CHK/Jugan,%20the%20Rising%20Star.full.jpg -juggernaut.jpg http://[server]/10E/Juggernaut.full.jpg -juju_bubble.jpg http://[server]/VI/Juju%20Bubble.full.jpg -jukai_messenger.jpg http://[server]/CHK/Jukai%20Messenger.full.jpg -jumbo_imp.jpg http://[server]/UG/Jumbo%20Imp.full.jpg -jump.jpg http://[server]/M10/Jump.full.jpg -jund_battlemage.jpg http://[server]/ALA/Jund%20Battlemage.full.jpg -jund_charm.jpg http://[server]/ALA/Jund%20Charm.full.jpg -jund_hackblade.jpg http://[server]/ARB/Jund%20Hackblade.full.jpg -jund_panorama.jpg http://[server]/ALA/Jund%20Panorama.full.jpg -jund_sojourners.jpg http://[server]/ARB/Jund%20Sojourners.full.jpg -jungle_barrier.jpg http://[server]/AP/Jungle%20Barrier.full.jpg -jungle_basin.jpg http://[server]/VI/Jungle%20Basin.full.jpg -jungle_lion.jpg http://[server]/PT/Jungle%20Lion.full.jpg -jungle_patrol.jpg http://[server]/MI/Jungle%20Patrol.full.jpg -jungle_shrine.jpg http://[server]/ALA/Jungle%20Shrine.full.jpg -jungle_troll.jpg http://[server]/MI/Jungle%20Troll.full.jpg -jungle_weaver.jpg http://[server]/ALA/Jungle%20Weaver.full.jpg -jungle_wurm.jpg http://[server]/MI/Jungle%20Wurm.full.jpg -juniper_order_advocate.jpg http://[server]/AL/Juniper%20Order%20Advocate.full.jpg -juniper_order_druid.jpg http://[server]/IA/Juniper%20Order%20Druid.full.jpg -juniper_order_ranger.jpg http://[server]/CS/Juniper%20Order%20Ranger.full.jpg -junk_diver.jpg http://[server]/UD/Junk%20Diver.full.jpg -junk_golem.jpg http://[server]/OD/Junk%20Golem.full.jpg -junktroller.jpg http://[server]/RAV/Junktroller.full.jpg -junkyo_bell.jpg http://[server]/CHK/Junkyo%20Bell.full.jpg -juntu_stakes.jpg http://[server]/IN/Juntu%20Stakes.full.jpg -junun_efreet.jpg http://[server]/AN/Junun%20Efreet.full.jpg -jushi_apprentice.jpg http://[server]/CHK/Jushi%20Apprentice.full.jpg -just_fate.jpg http://[server]/P2/Just%20Fate.full.jpg -justice.jpg http://[server]/5E/Justice.full.jpg -juvenile_gloomwidow.jpg http://[server]/SHM/Juvenile%20Gloomwidow.full.jpg -juxtapose.jpg http://[server]/LG/Juxtapose.full.jpg -juzam_djinn.jpg http://[server]/AN/Juzam%20Djinn.full.jpg -jwar_isle_refuge.jpg http://[server]/ZEN/Jwar%20Isle%20Refuge.full.jpg \ No newline at end of file diff --git a/res/pics_link/card-pictures_k.txt b/res/pics_link/card-pictures_k.txt deleted file mode 100644 index 5dc9a93bc8d..00000000000 --- a/res/pics_link/card-pictures_k.txt +++ /dev/null @@ -1,313 +0,0 @@ -kabira_crossroads.jpg http://[server]/ZEN/Kabira%20Crossroads.full.jpg -kabira_evangel.jpg http://[server]/ZEN/Kabira%20Evangel.full.jpg -kaboom!.jpg http://[server]/ON/Kaboom!.full.jpg -kabuto_moth.jpg http://[server]/CHK/Kabuto%20Moth.full.jpg -kaervek_the_merciless.jpg http://[server]/TSP/Kaervek%20the%20Merciless.full.jpg -kaerveks_hex.jpg http://[server]/MI/Kaervek's%20Hex.full.jpg -kaerveks_purge.jpg http://[server]/MI/Kaervek's%20Purge.full.jpg -kaerveks_spite.jpg http://[server]/VI/Kaervek's%20Spite.full.jpg -kaerveks_torch.jpg http://[server]/MI/Kaervek's%20Torch.full.jpg -kagemaro_first_to_suffer.jpg http://[server]/SOK/Kagemaro,%20First%20to%20Suffer.full.jpg -kagemaros_clutch.jpg http://[server]/SOK/Kagemaro's%20Clutch.full.jpg -kaho_minamo_historian.jpg http://[server]/SOK/Kaho,%20Minamo%20Historian.full.jpg -kaijin_of_the_vanishing_touch.jpg http://[server]/BOK/Kaijin%20of%20the%20Vanishing%20Touch.full.jpg -kaleidostone.jpg http://[server]/CFX/Kaleidostone.full.jpg -kalitas_bloodchief_of_ghet.jpg http://[server]/ZEN/Kalitas,%20Bloodchief%20of%20Ghet.full.jpg -kalonian_behemoth.jpg http://[server]/M10/Kalonian%20Behemoth.full.jpg -kamahl_fist_of_krosa.jpg http://[server]/ON/Kamahl,%20Fist%20of%20Krosa.full.jpg -kamahl_pit_fighter.jpg http://[server]/10E/Kamahl,%20Pit%20Fighter.full.jpg -kamahls_desire.jpg http://[server]/OD/Kamahl's%20Desire.full.jpg -kamahls_sledge.jpg http://[server]/TO/Kamahl's%20Sledge.full.jpg -kamahls_summons.jpg http://[server]/ON/Kamahl's%20Summons.full.jpg -kami_of_ancient_law.jpg http://[server]/CHK/Kami%20of%20Ancient%20Law.full.jpg -kami_of_empty_graves.jpg http://[server]/SOK/Kami%20of%20Empty%20Graves.full.jpg -kami_of_false_hope.jpg http://[server]/BOK/Kami%20of%20False%20Hope.full.jpg -kami_of_fires_roar.jpg http://[server]/CHK/Kami%20of%20Fire's%20Roar.full.jpg -kami_of_lunacy.jpg http://[server]/CHK/Kami%20of%20Lunacy.full.jpg -kami_of_old_stone.jpg http://[server]/9E/Kami%20of%20Old%20Stone.full.jpg -kami_of_tattered_shoji.jpg http://[server]/BOK/Kami%20of%20Tattered%20Shoji.full.jpg -kami_of_the_crescent_moon.jpg http://[server]/SOK/Kami%20of%20the%20Crescent%20Moon.full.jpg -kami_of_the_honored_dead.jpg http://[server]/BOK/Kami%20of%20the%20Honored%20Dead.full.jpg -kami_of_the_hunt.jpg http://[server]/CHK/Kami%20of%20the%20Hunt.full.jpg -kami_of_the_painted_road.jpg http://[server]/CHK/Kami%20of%20the%20Painted%20Road.full.jpg -kami_of_the_palace_fields.jpg http://[server]/CHK/Kami%20of%20the%20Palace%20Fields.full.jpg -kami_of_the_tended_garden.jpg http://[server]/SOK/Kami%20of%20the%20Tended%20Garden.full.jpg -kami_of_the_waning_moon.jpg http://[server]/CHK/Kami%20of%20the%20Waning%20Moon.full.jpg -kami_of_twisted_reflection.jpg http://[server]/CHK/Kami%20of%20Twisted%20Reflection.full.jpg -kangee_aerie_keeper.jpg http://[server]/IN/Kangee,%20Aerie%20Keeper.full.jpg -karakas.jpg http://[server]/LG/Karakas.full.jpg -karma.jpg http://[server]/8E/Karma.full.jpg -karmic_guide.jpg http://[server]/UL/Karmic%20Guide.full.jpg -karmic_justice.jpg http://[server]/OD/Karmic%20Justice.full.jpg -karn.jpg http://[server]/VG/Karn.full.jpg -karn_silver_golem.jpg http://[server]/US/Karn,%20Silver%20Golem.full.jpg -karns_touch.jpg http://[server]/MM/Karn's%20Touch.full.jpg -karona_false_god.jpg http://[server]/SC/Karona,%20False%20God.full.jpg -karonas_zealot.jpg http://[server]/SC/Karona's%20Zealot.full.jpg -karoo.jpg http://[server]/VI/Karoo.full.jpg -karoo_meerkat.jpg http://[server]/MI/Karoo%20Meerkat.full.jpg -karplusan_forest.jpg http://[server]/10E/Karplusan%20Forest.full.jpg -karplusan_giant.jpg http://[server]/IA/Karplusan%20Giant.full.jpg -karplusan_minotaur.jpg http://[server]/CS/Karplusan%20Minotaur.full.jpg -karplusan_strider.jpg http://[server]/10E/Karplusan%20Strider.full.jpg -karplusan_wolverine.jpg http://[server]/CS/Karplusan%20Wolverine.full.jpg -karplusan_yeti.jpg http://[server]/9E/Karplusan%20Yeti.full.jpg -karrthus_tyrant_of_jund.jpg http://[server]/ARB/Karrthus,%20Tyrant%20of%20Jund.full.jpg -karstoderm.jpg http://[server]/DS/Karstoderm.full.jpg -kashi_tribe_elite.jpg http://[server]/SOK/Kashi-Tribe%20Elite.full.jpg -kashi_tribe_reaver.jpg http://[server]/CHK/Kashi-Tribe%20Reaver.full.jpg -kashi_tribe_warriors.jpg http://[server]/CHK/Kashi-Tribe%20Warriors.full.jpg -kasimir_the_lone_wolf.jpg http://[server]/LG/Kasimir%20the%20Lone%20Wolf.full.jpg -katabatic_winds.jpg http://[server]/VI/Katabatic%20Winds.full.jpg -kataki_wars_wage.jpg http://[server]/SOK/Kataki,%20War's%20Wage.full.jpg -kathari_bomber.jpg http://[server]/ARB/Kathari%20Bomber.full.jpg -kathari_remnant.jpg http://[server]/ARB/Kathari%20Remnant.full.jpg -kathari_screecher.jpg http://[server]/ALA/Kathari%20Screecher.full.jpg -kavu_aggressor.jpg http://[server]/IN/Kavu%20Aggressor.full.jpg -kavu_chameleon.jpg http://[server]/IN/Kavu%20Chameleon.full.jpg -kavu_climber.jpg http://[server]/10E/Kavu%20Climber.full.jpg -kavu_glider.jpg http://[server]/AP/Kavu%20Glider.full.jpg -kavu_howler.jpg http://[server]/AP/Kavu%20Howler.full.jpg -kavu_lair.jpg http://[server]/IN/Kavu%20Lair.full.jpg -kavu_mauler.jpg http://[server]/AP/Kavu%20Mauler.full.jpg -kavu_monarch.jpg http://[server]/IN/Kavu%20Monarch.full.jpg -kavu_predator.jpg http://[server]/PLC/Kavu%20Predator.full.jpg -kavu_primarch.jpg http://[server]/FUT/Kavu%20Primarch.full.jpg -kavu_recluse.jpg http://[server]/PS/Kavu%20Recluse.full.jpg -kavu_runner.jpg http://[server]/IN/Kavu%20Runner.full.jpg -kavu_scout.jpg http://[server]/IN/Kavu%20Scout.full.jpg -kavu_titan.jpg http://[server]/IN/Kavu%20Titan.full.jpg -kaysa.jpg http://[server]/AL/Kaysa.full.jpg -kazandu_blademaster.jpg http://[server]/ZEN/Kazandu%20Blademaster.full.jpg -kazandu_refuge.jpg http://[server]/ZEN/Kazandu%20Refuge.full.jpg -kazuul_warlord.jpg http://[server]/ZEN/Kazuul%20Warlord.full.jpg -kederekt_creeper.jpg http://[server]/ALA/Kederekt%20Creeper.full.jpg -kederekt_leviathan.jpg http://[server]/ALA/Kederekt%20Leviathan.full.jpg -kederekt_parasite.jpg http://[server]/CFX/Kederekt%20Parasite.full.jpg -keen_eyed_archers.jpg http://[server]/PT/Keen-Eyed%20Archers.full.jpg -keen_sense.jpg http://[server]/PLC/Keen%20Sense.full.jpg -keeneye_aven.jpg http://[server]/LE/Keeneye%20Aven.full.jpg -keening_banshee.jpg http://[server]/RAV/Keening%20Banshee.full.jpg -keep_watch.jpg http://[server]/JU/Keep%20Watch.full.jpg -keeper_of_kookus.jpg http://[server]/VI/Keeper%20of%20Kookus.full.jpg -keeper_of_progenitus.jpg http://[server]/ALA/Keeper%20of%20Progenitus.full.jpg -keeper_of_the_beasts.jpg http://[server]/EX/Keeper%20of%20the%20Beasts.full.jpg -keeper_of_the_dead.jpg http://[server]/EX/Keeper%20of%20the%20Dead.full.jpg -keeper_of_the_flame.jpg http://[server]/EX/Keeper%20of%20the%20Flame.full.jpg -keeper_of_the_light.jpg http://[server]/EX/Keeper%20of%20the%20Light.full.jpg -keeper_of_the_mind.jpg http://[server]/EX/Keeper%20of%20the%20Mind.full.jpg -keeper_of_the_nine_gales.jpg http://[server]/LE/Keeper%20of%20the%20Nine%20Gales.full.jpg -keeper_of_the_sacred_word.jpg http://[server]/UNH/Keeper%20of%20the%20Sacred%20Word.full.jpg -keeper_of_tresserhorn.jpg http://[server]/AL/Keeper%20of%20Tresserhorn.full.jpg -keepers_of_the_faith.jpg http://[server]/LG/Keepers%20of%20the%20Faith.full.jpg -kei_takahashi.jpg http://[server]/LG/Kei%20Takahashi.full.jpg -keiga_the_tide_star.jpg http://[server]/CHK/Keiga,%20the%20Tide%20Star.full.jpg -keldon_arsonist.jpg http://[server]/PY/Keldon%20Arsonist.full.jpg -keldon_battlewagon.jpg http://[server]/PY/Keldon%20Battlewagon.full.jpg -keldon_berserker.jpg http://[server]/PY/Keldon%20Berserker.full.jpg -keldon_champion.jpg http://[server]/UD/Keldon%20Champion.full.jpg -keldon_firebombers.jpg http://[server]/PY/Keldon%20Firebombers.full.jpg -keldon_halberdier.jpg http://[server]/TSP/Keldon%20Halberdier.full.jpg -keldon_mantle.jpg http://[server]/PS/Keldon%20Mantle.full.jpg -keldon_marauders.jpg http://[server]/PLC/Keldon%20Marauders.full.jpg -keldon_megaliths.jpg http://[server]/FUT/Keldon%20Megaliths.full.jpg -keldon_necropolis.jpg http://[server]/IN/Keldon%20Necropolis.full.jpg -keldon_twilight.jpg http://[server]/PS/Keldon%20Twilight.full.jpg -keldon_vandals.jpg http://[server]/UD/Keldon%20Vandals.full.jpg -keldon_warlord.jpg http://[server]/5E/Keldon%20Warlord.full.jpg -kelinore_bat.jpg http://[server]/M10/Kelinore%20Bat.full.jpg -kelsinko_ranger.jpg http://[server]/IA/Kelsinko%20Ranger.full.jpg -kemuri_onna.jpg http://[server]/SOK/Kemuri-Onna.full.jpg -kentaro_the_smiling_cat.jpg http://[server]/BOK/Kentaro,%20the%20Smiling%20Cat.full.jpg -kezzerdrix.jpg http://[server]/TE/Kezzerdrix.full.jpg -khabal_ghoul.jpg http://[server]/AN/Khabal%20Ghoul.full.jpg -khalni_gem.jpg http://[server]/ZEN/Khalni%20Gem.full.jpg -khalni_heart_expedition.jpg http://[server]/ZEN/Khalni%20Heart%20Expedition.full.jpg -kher_keep.jpg http://[server]/TSP/Kher%20Keep.full.jpg -kiki_jiki_mirror_breaker.jpg http://[server]/CHK/Kiki-Jiki,%20Mirror%20Breaker.full.jpg -kiku_nights_flower.jpg http://[server]/CHK/Kiku,%20Night's%20Flower.full.jpg -kikus_shadow.jpg http://[server]/SOK/Kiku's%20Shadow.full.jpg -kill!_destroy!.jpg http://[server]/UNH/Kill!%20Destroy!.full.jpg -kill_suit_cultist.jpg http://[server]/DIS/Kill-Suit%20Cultist.full.jpg -kill_switch.jpg http://[server]/NE/Kill%20Switch.full.jpg -killer_bees.jpg http://[server]/LG/Killer%20Bees.full.jpg -killer_instinct.jpg http://[server]/GP/Killer%20Instinct.full.jpg -killer_whale.jpg http://[server]/EX/Killer%20Whale.full.jpg -kilnmouth_dragon.jpg http://[server]/LE/Kilnmouth%20Dragon.full.jpg -kindle.jpg http://[server]/TE/Kindle.full.jpg -kindle_the_carnage.jpg http://[server]/DIS/Kindle%20the%20Carnage.full.jpg -kindled_fury.jpg http://[server]/M10/Kindled%20Fury.full.jpg -king_cheetah.jpg http://[server]/9E/King%20Cheetah.full.jpg -king_crab.jpg http://[server]/UL/King%20Crab.full.jpg -king_suleiman.jpg http://[server]/AN/King%20Suleiman.full.jpg -kingfisher.jpg http://[server]/UD/Kingfisher.full.jpg -kings_assassin.jpg http://[server]/PT/King's%20Assassin.full.jpg -kinsbaile_balloonist.jpg http://[server]/LRW/Kinsbaile%20Balloonist.full.jpg -kinsbaile_borderguard.jpg http://[server]/MOR/Kinsbaile%20Borderguard.full.jpg -kinsbaile_cavalier.jpg http://[server]/MOR/Kinsbaile%20Cavalier.full.jpg -kinsbaile_skirmisher.jpg http://[server]/LRW/Kinsbaile%20Skirmisher.full.jpg -kinscaer_harpoonist.jpg http://[server]/SHM/Kinscaer%20Harpoonist.full.jpg -kira_great_glass_spinner.jpg http://[server]/BOK/Kira,%20Great%20Glass-Spinner.full.jpg -kird_ape.jpg http://[server]/9E/Kird%20Ape.full.jpg -kiri_onna.jpg http://[server]/SOK/Kiri-Onna.full.jpg -kirtars_desire.jpg http://[server]/OD/Kirtar's%20Desire.full.jpg -kirtars_wrath.jpg http://[server]/OD/Kirtar's%20Wrath.full.jpg -kismet.jpg http://[server]/LG/Kismet.full.jpg -kiss_of_death.jpg http://[server]/P2/Kiss%20of%20Death.full.jpg -kiss_of_the_amesha.jpg http://[server]/ALA/Kiss%20of%20the%20Amesha.full.jpg -kitchen_finks.jpg http://[server]/SHM/Kitchen%20Finks.full.jpg -kithkin_armor.jpg http://[server]/WL/Kithkin%20Armor.full.jpg -kithkin_daggerdare.jpg http://[server]/LRW/Kithkin%20Daggerdare.full.jpg -kithkin_greatheart.jpg http://[server]/LRW/Kithkin%20Greatheart.full.jpg -kithkin_harbinger.jpg http://[server]/LRW/Kithkin%20Harbinger.full.jpg -kithkin_healer.jpg http://[server]/LRW/Kithkin%20Healer.full.jpg -kithkin_mourncaller.jpg http://[server]/LRW/Kithkin%20Mourncaller.full.jpg -kithkin_rabble.jpg http://[server]/SHM/Kithkin%20Rabble.full.jpg -kithkin_shielddare.jpg http://[server]/SHM/Kithkin%20Shielddare.full.jpg -kithkin_spellduster.jpg http://[server]/EVE/Kithkin%20Spellduster.full.jpg -kithkin_zealot.jpg http://[server]/EVE/Kithkin%20Zealot.full.jpg -kithkin_zephyrnaut.jpg http://[server]/MOR/Kithkin%20Zephyrnaut.full.jpg -kitsune_blademaster.jpg http://[server]/CHK/Kitsune%20Blademaster.full.jpg -kitsune_bonesetter.jpg http://[server]/SOK/Kitsune%20Bonesetter.full.jpg -kitsune_dawnblade.jpg http://[server]/SOK/Kitsune%20Dawnblade.full.jpg -kitsune_diviner.jpg http://[server]/CHK/Kitsune%20Diviner.full.jpg -kitsune_healer.jpg http://[server]/CHK/Kitsune%20Healer.full.jpg -kitsune_loreweaver.jpg http://[server]/SOK/Kitsune%20Loreweaver.full.jpg -kitsune_mystic.jpg http://[server]/CHK/Kitsune%20Mystic.full.jpg -kitsune_palliator.jpg http://[server]/BOK/Kitsune%20Palliator.full.jpg -kitsune_riftwalker.jpg http://[server]/CHK/Kitsune%20Riftwalker.full.jpg -kiyomaro_first_to_stand.jpg http://[server]/SOK/Kiyomaro,%20First%20to%20Stand.full.jpg -kjeldoran_dead.jpg http://[server]/6E/Kjeldoran%20Dead.full.jpg -kjeldoran_elite_guard.jpg http://[server]/IA/Kjeldoran%20Elite%20Guard.full.jpg -kjeldoran_escort.jpg http://[server]/AL/Kjeldoran%20Escort1.full.jpg -kjeldoran_frostbeast.jpg http://[server]/IA/Kjeldoran%20Frostbeast.full.jpg -kjeldoran_gargoyle.jpg http://[server]/CS/Kjeldoran%20Gargoyle.full.jpg -kjeldoran_guard.jpg http://[server]/IA/Kjeldoran%20Guard.full.jpg -kjeldoran_home_guard.jpg http://[server]/AL/Kjeldoran%20Home%20Guard.full.jpg -kjeldoran_javelineer.jpg http://[server]/CS/Kjeldoran%20Javelineer.full.jpg -kjeldoran_knight.jpg http://[server]/IA/Kjeldoran%20Knight.full.jpg -kjeldoran_outpost.jpg http://[server]/AL/Kjeldoran%20Outpost.full.jpg -kjeldoran_outrider.jpg http://[server]/CS/Kjeldoran%20Outrider.full.jpg -kjeldoran_phalanx.jpg http://[server]/IA/Kjeldoran%20Phalanx.full.jpg -kjeldoran_pride.jpg http://[server]/CST/Kjeldoran%20Pride.full.jpg -kjeldoran_royal_guard.jpg http://[server]/10E/Kjeldoran%20Royal%20Guard.full.jpg -kjeldoran_skycaptain.jpg http://[server]/IA/Kjeldoran%20Skycaptain.full.jpg -kjeldoran_skyknight.jpg http://[server]/IA/Kjeldoran%20Skyknight.full.jpg -kjeldoran_war_cry.jpg http://[server]/CS/Kjeldoran%20War%20Cry.full.jpg -kjeldoran_warrior.jpg http://[server]/IA/Kjeldoran%20Warrior.full.jpg -knacksaw_clique.jpg http://[server]/SHM/Knacksaw%20Clique.full.jpg -knight_captain_of_eos.jpg http://[server]/ALA/Knight-Captain%20of%20Eos.full.jpg -knight_errant.jpg http://[server]/7E/Knight%20Errant.full.jpg -knight_of_dawn.jpg http://[server]/TE/Knight%20of%20Dawn.full.jpg -knight_of_dusk.jpg http://[server]/10E/Knight%20of%20Dusk.full.jpg -knight_of_meadowgrain.jpg http://[server]/LRW/Knight%20of%20Meadowgrain.full.jpg -knight_of_new_alara.jpg http://[server]/ARB/Knight%20of%20New%20Alara.full.jpg -knight_of_stromgald.jpg http://[server]/IA/Knight%20of%20Stromgald.full.jpg -knight_of_sursi.jpg http://[server]/FUT/Knight%20of%20Sursi.full.jpg -knight_of_the_hokey_pokey.jpg http://[server]/UG/Knight%20of%20the%20Hokey%20Pokey.full.jpg -knight_of_the_holy_nimbus.jpg http://[server]/TSP/Knight%20of%20the%20Holy%20Nimbus.full.jpg -knight_of_the_mists.jpg http://[server]/VI/Knight%20of%20the%20Mists.full.jpg -knight_of_the_reliquary.jpg http://[server]/CFX/Knight%20of%20the%20Reliquary.full.jpg -knight_of_the_skyward_eye.jpg http://[server]/ALA/Knight%20of%20the%20Skyward%20Eye.full.jpg -knight_of_the_white_orchid.jpg http://[server]/ALA/Knight%20of%20the%20White%20Orchid.full.jpg -knight_of_valor.jpg http://[server]/VI/Knight%20of%20Valor.full.jpg -knighthood.jpg http://[server]/7E/Knighthood.full.jpg -knights_of_thorn.jpg http://[server]/DK/Knights%20of%20Thorn.full.jpg -knollspine_dragon.jpg http://[server]/SHM/Knollspine%20Dragon.full.jpg -knollspine_invocation.jpg http://[server]/SHM/Knollspine%20Invocation.full.jpg -knotvine_mystic.jpg http://[server]/CFX/Knotvine%20Mystic.full.jpg -knotvine_paladin.jpg http://[server]/ARB/Knotvine%20Paladin.full.jpg -knowledge_exploitation.jpg http://[server]/MOR/Knowledge%20Exploitation.full.jpg -knowledge_vault.jpg http://[server]/LG/Knowledge%20Vault.full.jpg -knucklebone_witch.jpg http://[server]/LRW/Knucklebone%20Witch.full.jpg -kobold_drill_sergeant.jpg http://[server]/LG/Kobold%20Drill%20Sergeant.full.jpg -kobold_overlord.jpg http://[server]/LG/Kobold%20Overlord.full.jpg -kobold_taskmaster.jpg http://[server]/LG/Kobold%20Taskmaster.full.jpg -kobolds_of_kher_keep.jpg http://[server]/LG/Kobolds%20of%20Kher%20Keep.full.jpg -kodama_of_the_center_tree.jpg http://[server]/BOK/Kodama%20of%20the%20Center%20Tree.full.jpg -kodama_of_the_north_tree.jpg http://[server]/CHK/Kodama%20of%20the%20North%20Tree.full.jpg -kodama_of_the_south_tree.jpg http://[server]/CHK/Kodama%20of%20the%20South%20Tree.full.jpg -kodamas_might.jpg http://[server]/CHK/Kodama's%20Might.full.jpg -kodamas_reach.jpg http://[server]/CHK/Kodama's%20Reach.full.jpg -kokusho_the_evening_star.jpg http://[server]/DRB/Kokusho,%20the%20Evening%20Star.full.jpg -konda_lord_of_eiganjo.jpg http://[server]/CHK/Konda,%20Lord%20of%20Eiganjo.full.jpg -kondas_banner.jpg http://[server]/CHK/Konda's%20Banner.full.jpg -kondas_hatamoto.jpg http://[server]/CHK/Konda's%20Hatamoto.full.jpg -kongming_sleeping_dragon.jpg http://[server]/P3/Kongming,%20Sleeping%20Dragon.full.jpg -kongmings_contraptions.jpg http://[server]/P3/Kongming's%20Contraptions.full.jpg -kookus.jpg http://[server]/VI/Kookus.full.jpg -kor_aeronaut.jpg http://[server]/ZEN/Kor%20Aeronaut.full.jpg -kor_cartographer.jpg http://[server]/ZEN/Kor%20Cartographer.full.jpg -kor_chant.jpg http://[server]/EX/Kor%20Chant.full.jpg -kor_dirge.jpg http://[server]/PLC/Kor%20Dirge.full.jpg -kor_duelist.jpg http://[server]/ZEN/Kor%20Duelist.full.jpg -kor_haven.jpg http://[server]/NE/Kor%20Haven.full.jpg -kor_hookmaster.jpg http://[server]/ZEN/Kor%20Hookmaster.full.jpg -kor_outfitter.jpg http://[server]/ZEN/Kor%20Outfitter.full.jpg -kor_sanctifiers.jpg http://[server]/HOP/Kor%20Sanctifiers.full.jpg -kor_skyfisher.jpg http://[server]/ZEN/Kor%20Skyfisher.full.jpg -korlash_heir_to_blackblade.jpg http://[server]/FUT/Korlash,%20Heir%20to%20Blackblade.full.jpg -kormus_bell.jpg http://[server]/4E/Kormus%20Bell.full.jpg -koskun_falls.jpg http://[server]/HL/Koskun%20Falls.full.jpg -koskun_keep.jpg http://[server]/HL/Koskun%20Keep.full.jpg -kraken_hatchling.jpg http://[server]/ZEN/Kraken%20Hatchling.full.jpg -krakens_eye.jpg http://[server]/M10/Kraken's%20Eye.full.jpg -krakilin.jpg http://[server]/TE/Krakilin.full.jpg -kranioceros.jpg http://[server]/CFX/Kranioceros.full.jpg -krark_clan_engineers.jpg http://[server]/FD/Krark-Clan%20Engineers.full.jpg -krark_clan_grunt.jpg http://[server]/MR/Krark-Clan%20Grunt.full.jpg -krark_clan_ironworks.jpg http://[server]/FD/Krark-Clan%20Ironworks.full.jpg -krark_clan_ogre.jpg http://[server]/FD/Krark-Clan%20Ogre.full.jpg -krark_clan_shaman.jpg http://[server]/MR/Krark-Clan%20Shaman.full.jpg -krark_clan_stoker.jpg http://[server]/DS/Krark-Clan%20Stoker.full.jpg -krarks_thumb.jpg http://[server]/MR/Krark's%20Thumb.full.jpg -krazy_kow.jpg http://[server]/UG/Krazy%20Kow.full.jpg -kresh_the_bloodbraided.jpg http://[server]/ALA/Kresh%20the%20Bloodbraided.full.jpg -kris_mage.jpg http://[server]/MM/Kris%20Mage.full.jpg -krosan_archer.jpg http://[server]/OD/Krosan%20Archer.full.jpg -krosan_avenger.jpg http://[server]/OD/Krosan%20Avenger.full.jpg -krosan_beast.jpg http://[server]/OD/Krosan%20Beast.full.jpg -krosan_cloudscraper.jpg http://[server]/LE/Krosan%20Cloudscraper.full.jpg -krosan_colossus.jpg http://[server]/ON/Krosan%20Colossus.full.jpg -krosan_constrictor.jpg http://[server]/TO/Krosan%20Constrictor.full.jpg -krosan_drover.jpg http://[server]/SC/Krosan%20Drover.full.jpg -krosan_grip.jpg http://[server]/TSP/Krosan%20Grip.full.jpg -krosan_groundshaker.jpg http://[server]/ON/Krosan%20Groundshaker.full.jpg -krosan_reclamation.jpg http://[server]/JU/Krosan%20Reclamation.full.jpg -krosan_restorer.jpg http://[server]/TO/Krosan%20Restorer.full.jpg -krosan_tusker.jpg http://[server]/ON/Krosan%20Tusker.full.jpg -krosan_verge.jpg http://[server]/JU/Krosan%20Verge.full.jpg -krosan_vorine.jpg http://[server]/LE/Krosan%20Vorine.full.jpg -krosan_warchief.jpg http://[server]/SC/Krosan%20Warchief.full.jpg -krosan_wayfarer.jpg http://[server]/JU/Krosan%20Wayfarer.full.jpg -krovikan_elementalist.jpg http://[server]/IA/Krovikan%20Elementalist.full.jpg -krovikan_fetish.jpg http://[server]/5E/Krovikan%20Fetish.full.jpg -krovikan_horror.jpg http://[server]/AL/Krovikan%20Horror.full.jpg -krovikan_mist.jpg http://[server]/CS/Krovikan%20Mist.full.jpg -krovikan_plague.jpg http://[server]/AL/Krovikan%20Plague.full.jpg -krovikan_rot.jpg http://[server]/CS/Krovikan%20Rot.full.jpg -krovikan_scoundrel.jpg http://[server]/CS/Krovikan%20Scoundrel.full.jpg -krovikan_sorcerer.jpg http://[server]/5E/Krovikan%20Sorcerer.full.jpg -krovikan_vampire.jpg http://[server]/IA/Krovikan%20Vampire.full.jpg -krovikan_whispers.jpg http://[server]/CS/Krovikan%20Whispers.full.jpg -kry_shield.jpg http://[server]/LG/Kry%20Shield.full.jpg -kudzu.jpg http://[server]/U/Kudzu.full.jpg -kukemssa_pirates.jpg http://[server]/MI/Kukemssa%20Pirates.full.jpg -kukemssa_serpent.jpg http://[server]/MI/Kukemssa%20Serpent.full.jpg -kulrath_knight.jpg http://[server]/SHM/Kulrath%20Knight.full.jpg -kumano_master_yamabushi.jpg http://[server]/CHK/Kumano,%20Master%20Yamabushi.full.jpg -kumanos_blessing.jpg http://[server]/BOK/Kumano's%20Blessing.full.jpg -kumanos_pupils.jpg http://[server]/CHK/Kumano's%20Pupils.full.jpg -kuon_ogre_ascendant.jpg http://[server]/SOK/Kuon,%20Ogre%20Ascendant.full.jpg -kurgadon.jpg http://[server]/SC/Kurgadon.full.jpg -kuro_pitlord.jpg http://[server]/CHK/Kuro,%20Pitlord.full.jpg -kuros_taken.jpg http://[server]/SOK/Kuro's%20Taken.full.jpg -kusari_gama.jpg http://[server]/CHK/Kusari-Gama.full.jpg -kyoki_sanitys_eclipse.jpg http://[server]/BOK/Kyoki,%20Sanity's%20Eclipse.full.jpg -kyren_archive.jpg http://[server]/MM/Kyren%20Archive.full.jpg -kyren_glider.jpg http://[server]/MM/Kyren%20Glider.full.jpg -kyren_legate.jpg http://[server]/MM/Kyren%20Legate.full.jpg -kyren_negotiations.jpg http://[server]/MM/Kyren%20Negotiations.full.jpg -kyren_sniper.jpg http://[server]/MM/Kyren%20Sniper.full.jpg -kyren_toy.jpg http://[server]/MM/Kyren%20Toy.full.jpg -kyscu_drake.jpg http://[server]/VI/Kyscu%20Drake.full.jpg \ No newline at end of file diff --git a/res/pics_link/card-pictures_l.txt b/res/pics_link/card-pictures_l.txt deleted file mode 100644 index b0295e861db..00000000000 --- a/res/pics_link/card-pictures_l.txt +++ /dev/null @@ -1,344 +0,0 @@ -lab_rats.jpg http://[server]/SH/Lab%20Rats.full.jpg -labyrinth_minotaur.jpg http://[server]/5E/Labyrinth%20Minotaur.full.jpg -laccolith_grunt.jpg http://[server]/NE/Laccolith%20Grunt.full.jpg -laccolith_rig.jpg http://[server]/NE/Laccolith%20Rig.full.jpg -laccolith_titan.jpg http://[server]/NE/Laccolith%20Titan.full.jpg -laccolith_warrior.jpg http://[server]/NE/Laccolith%20Warrior.full.jpg -laccolith_whelp.jpg http://[server]/NE/Laccolith%20Whelp.full.jpg -lace_with_moonglove.jpg http://[server]/LRW/Lace%20with%20Moonglove.full.jpg -ladies_knight.jpg http://[server]/UNH/Ladies'%20Knight.full.jpg -lady_caleria.jpg http://[server]/LG/Lady%20Caleria.full.jpg -lady_evangela.jpg http://[server]/LG/Lady%20Evangela.full.jpg -lady_orca.jpg http://[server]/LG/Lady%20Orca.full.jpg -lady_sun.jpg http://[server]/P3/Lady%20Sun.full.jpg -lady_zhurong_warrior_queen.jpg http://[server]/P3/Lady%20Zhurong,%20Warrior%20Queen.full.jpg -lairwatch_giant.jpg http://[server]/LRW/Lairwatch%20Giant.full.jpg -lake_of_the_dead.jpg http://[server]/AL/Lake%20of%20the%20Dead.full.jpg -lammastide_weave.jpg http://[server]/LRW/Lammastide%20Weave.full.jpg -lance.jpg http://[server]/U/Lance.full.jpg -lancers_en_kor.jpg http://[server]/SH/Lancers%20en-Kor.full.jpg -land_aid_04.jpg http://[server]/UNH/Land%20Aid%20'04.full.jpg -land_cap.jpg http://[server]/IA/Land%20Cap.full.jpg -land_equilibrium.jpg http://[server]/LG/Land%20Equilibrium.full.jpg -land_grant.jpg http://[server]/MM/Land%20Grant.full.jpg -land_leeches.jpg http://[server]/DK/Land%20Leeches.full.jpg -land_tax.jpg http://[server]/LG/Land%20Tax.full.jpg -landbind_ritual.jpg http://[server]/ZEN/Landbind%20Ritual.full.jpg -landfill.jpg http://[server]/UG/Landfill.full.jpg -lands_edge.jpg http://[server]/LG/Land's%20Edge.full.jpg -landslide.jpg http://[server]/UD/Landslide.full.jpg -lantern_kami.jpg http://[server]/CHK/Lantern%20Kami.full.jpg -lantern_lit_graveyard.jpg http://[server]/CHK/Lantern-Lit%20Graveyard.full.jpg -lantern_of_insight.jpg http://[server]/FD/Lantern%20of%20Insight.full.jpg -lapis_lazuli_talisman.jpg http://[server]/IA/Lapis%20Lazuli%20Talisman.full.jpg -lapse_of_certainty.jpg http://[server]/CFX/Lapse%20of%20Certainty.full.jpg -laquatuss_champion.jpg http://[server]/TO/Laquatus's%20Champion.full.jpg -laquatuss_creativity.jpg http://[server]/OD/Laquatus's%20Creativity.full.jpg -laquatuss_disdain.jpg http://[server]/JU/Laquatus's%20Disdain.full.jpg -larceny.jpg http://[server]/8E/Larceny.full.jpg -lash_out.jpg http://[server]/LRW/Lash%20Out.full.jpg -lashknife.jpg http://[server]/NE/Lashknife.full.jpg -lashknife_barrier.jpg http://[server]/PS/Lashknife%20Barrier.full.jpg -last_breath.jpg http://[server]/MM/Last%20Breath.full.jpg -last_caress.jpg http://[server]/AP/Last%20Caress.full.jpg -last_chance.jpg http://[server]/PT/Last%20Chance.full.jpg -last_ditch_effort.jpg http://[server]/UL/Last-Ditch%20Effort.full.jpg -last_gasp.jpg http://[server]/RAV/Last%20Gasp.full.jpg -last_laugh.jpg http://[server]/TO/Last%20Laugh.full.jpg -last_rites.jpg http://[server]/OD/Last%20Rites.full.jpg -last_stand.jpg http://[server]/AP/Last%20Stand.full.jpg -last_word.jpg http://[server]/DS/Last%20Word.full.jpg -lat_nams_legacy.jpg http://[server]/CST/Lat-Nam's%20Legacy.full.jpg -latchkey_faerie.jpg http://[server]/MOR/Latchkey%20Faerie.full.jpg -latulla_keldon_overseer.jpg http://[server]/PY/Latulla,%20Keldon%20Overseer.full.jpg -latullas_orders.jpg http://[server]/PY/Latulla's%20Orders.full.jpg -laughing_hyena.jpg http://[server]/UNH/Laughing%20Hyena.full.jpg -launch.jpg http://[server]/US/Launch.full.jpg -lava_axe.jpg http://[server]/M10/Lava%20Axe.full.jpg -lava_blister.jpg http://[server]/OD/Lava%20Blister.full.jpg -lava_burst.jpg http://[server]/IA/Lava%20Burst.full.jpg -lava_dart.jpg http://[server]/JU/Lava%20Dart.full.jpg -lava_flow.jpg http://[server]/PT/Lava%20Flow.full.jpg -lava_hounds.jpg http://[server]/8E/Lava%20Hounds.full.jpg -lava_runner.jpg http://[server]/MM/Lava%20Runner.full.jpg -lava_spike.jpg http://[server]/CHK/Lava%20Spike.full.jpg -lava_storm.jpg http://[server]/WL/Lava%20Storm.full.jpg -lava_tubes.jpg http://[server]/IA/Lava%20Tubes.full.jpg -lava_zombie.jpg http://[server]/PS/Lava%20Zombie.full.jpg -lavaball_trap.jpg http://[server]/ZEN/Lavaball%20Trap.full.jpg -lavaborn_muse.jpg http://[server]/10E/Lavaborn%20Muse.full.jpg -lavacore_elemental.jpg http://[server]/PLC/Lavacore%20Elemental.full.jpg -lavalanche.jpg http://[server]/ARB/Lavalanche.full.jpg -lavamancers_skill.jpg http://[server]/ON/Lavamancer's%20Skill.full.jpg -lawbringer.jpg http://[server]/NE/Lawbringer.full.jpg -lay_of_the_land.jpg http://[server]/AP/Lay%20of%20the%20Land.full.jpg -lay_waste.jpg http://[server]/ON/Lay%20Waste.full.jpg -lead_astray.jpg http://[server]/JU/Lead%20Astray.full.jpg -lead_belly_chimera.jpg http://[server]/VI/Lead-Belly%20Chimera.full.jpg -lead_golem.jpg http://[server]/MI/Lead%20Golem.full.jpg -leaden_fists.jpg http://[server]/FUT/Leaden%20Fists.full.jpg -leaden_myr.jpg http://[server]/MR/Leaden%20Myr.full.jpg -leaf_crowned_elder.jpg http://[server]/MOR/Leaf-Crowned%20Elder.full.jpg -leaf_dancer.jpg http://[server]/OD/Leaf%20Dancer.full.jpg -leaf_gilder.jpg http://[server]/LRW/Leaf%20Gilder.full.jpg -leafdrake_roost.jpg http://[server]/DIS/Leafdrake%20Roost.full.jpg -leap.jpg http://[server]/SH/Leap.full.jpg -leap_of_flame.jpg http://[server]/GP/Leap%20of%20Flame.full.jpg -leaping_lizard.jpg http://[server]/HL/Leaping%20Lizard.full.jpg -leashling.jpg http://[server]/RAV/Leashling.full.jpg -leave_no_trace.jpg http://[server]/RAV/Leave%20No%20Trace.full.jpg -leech_bonder.jpg http://[server]/SHM/Leech%20Bonder.full.jpg -leeches.jpg http://[server]/HL/Leeches.full.jpg -leeching_licid.jpg http://[server]/TE/Leeching%20Licid.full.jpg -leechridden_swamp.jpg http://[server]/HOP/Leechridden%20Swamp.full.jpg -leering_emblem.jpg http://[server]/EVE/Leering%20Emblem.full.jpg -leering_gargoyle.jpg http://[server]/MI/Leering%20Gargoyle.full.jpg -leery_fogbeast.jpg http://[server]/ON/Leery%20Fogbeast.full.jpg -legacy_weapon.jpg http://[server]/10E/Legacy%20Weapon.full.jpg -legacys_allure.jpg http://[server]/TE/Legacy's%20Allure.full.jpg -legerdemain.jpg http://[server]/TE/Legerdemain.full.jpg -legions_of_lim_dul.jpg http://[server]/IA/Legions%20of%20Lim-Dul.full.jpg -leonin_abunas.jpg http://[server]/MR/Leonin%20Abunas.full.jpg -leonin_armorguard.jpg http://[server]/ARB/Leonin%20Armorguard.full.jpg -leonin_battlemage.jpg http://[server]/DS/Leonin%20Battlemage.full.jpg -leonin_bladetrap.jpg http://[server]/MR/Leonin%20Bladetrap.full.jpg -leonin_bola.jpg http://[server]/DS/Leonin%20Bola.full.jpg -leonin_den_guard.jpg http://[server]/MR/Leonin%20Den-Guard.full.jpg -leonin_elder.jpg http://[server]/MR/Leonin%20Elder.full.jpg -leonin_scimitar.jpg http://[server]/10E/Leonin%20Scimitar.full.jpg -leonin_shikari.jpg http://[server]/DS/Leonin%20Shikari.full.jpg -leonin_skyhunter.jpg http://[server]/9E/Leonin%20Skyhunter.full.jpg -leonin_squire.jpg http://[server]/FD/Leonin%20Squire.full.jpg -leonin_sun_standard.jpg http://[server]/MR/Leonin%20Sun%20Standard.full.jpg -leshracs_rite.jpg http://[server]/7E/Leshrac's%20Rite.full.jpg -leshracs_sigil.jpg http://[server]/IA/Leshrac's%20Sigil.full.jpg -lesser_gargadon.jpg http://[server]/8E/Lesser%20Gargadon.full.jpg -lesser_werewolf.jpg http://[server]/LG/Lesser%20Werewolf.full.jpg -lethal_vapors.jpg http://[server]/SC/Lethal%20Vapors.full.jpg -lethargy_trap.jpg http://[server]/ZEN/Lethargy%20Trap.full.jpg -letter_bomb.jpg http://[server]/UNH/Letter%20Bomb.full.jpg -leveler.jpg http://[server]/MR/Leveler.full.jpg -leviathan.jpg http://[server]/5E/Leviathan.full.jpg -levitation.jpg http://[server]/M10/Levitation.full.jpg -lexivore.jpg http://[server]/UG/Lexivore.full.jpg -ley_druid.jpg http://[server]/9E/Ley%20Druid.full.jpg -ley_line.jpg http://[server]/MM/Ley%20Line.full.jpg -leyline_of_lifeforce.jpg http://[server]/GP/Leyline%20of%20Lifeforce.full.jpg -leyline_of_lightning.jpg http://[server]/GP/Leyline%20of%20Lightning.full.jpg -leyline_of_singularity.jpg http://[server]/GP/Leyline%20of%20Singularity.full.jpg -leyline_of_the_meek.jpg http://[server]/GP/Leyline%20of%20the%20Meek.full.jpg -leyline_of_the_void.jpg http://[server]/GP/Leyline%20of%20the%20Void.full.jpg -lhurgoyf.jpg http://[server]/8E/Lhurgoyf.full.jpg -liability.jpg http://[server]/MM/Liability.full.jpg -liars_pendulum.jpg http://[server]/MR/Liar's%20Pendulum.full.jpg -liberate.jpg http://[server]/IN/Liberate.full.jpg -liberated_dwarf.jpg http://[server]/JU/Liberated%20Dwarf.full.jpg -library_of_alexandria.jpg http://[server]/AN/Library%20of%20Alexandria.full.jpg -library_of_lat_nam.jpg http://[server]/6E/Library%20of%20Lat-Nam.full.jpg -library_of_leng.jpg http://[server]/5E/Library%20of%20Leng.full.jpg -lich.jpg http://[server]/U/Lich.full.jpg -lich_lord_of_unx.jpg http://[server]/ARB/Lich%20Lord%20of%20Unx.full.jpg -lichenthrope.jpg http://[server]/VI/Lichenthrope.full.jpg -lichs_mirror.jpg http://[server]/ALA/Lich's%20Mirror.full.jpg -lichs_tomb.jpg http://[server]/DS/Lich's%20Tomb.full.jpg -liege_of_the_axe.jpg http://[server]/LE/Liege%20of%20the%20Axe.full.jpg -liege_of_the_hollows.jpg http://[server]/WL/Liege%20of%20the%20Hollows.full.jpg -liege_of_the_pit.jpg http://[server]/TSP/Liege%20of%20the%20Pit.full.jpg -lieutenant_kirtar.jpg http://[server]/OD/Lieutenant%20Kirtar.full.jpg -life_and_limb.jpg http://[server]/PLC/Life%20and%20Limb.full.jpg -life_burst.jpg http://[server]/OD/Life%20Burst.full.jpg -life_chisel.jpg http://[server]/LG/Life%20Chisel.full.jpg -life_from_the_loam.jpg http://[server]/RAV/Life%20From%20the%20Loam.full.jpg -life_matrix.jpg http://[server]/LG/Life%20Matrix.full.jpg -lifeblood.jpg http://[server]/LG/Lifeblood.full.jpg -lifedeath.jpg http://[server]/AP/LifeDeath.full.jpg -lifeforce.jpg http://[server]/5E/Lifeforce.full.jpg -lifegift.jpg http://[server]/BOK/Lifegift.full.jpg -lifelace.jpg http://[server]/4E/Lifelace.full.jpg -lifeline.jpg http://[server]/US/Lifeline.full.jpg -lifelink.jpg http://[server]/M10/Lifelink.full.jpg -lifespark_spellbomb.jpg http://[server]/MR/Lifespark%20Spellbomb.full.jpg -lifespinner.jpg http://[server]/BOK/Lifespinner.full.jpg -lifetap.jpg http://[server]/5E/Lifetap.full.jpg -lifted_by_clouds.jpg http://[server]/CHK/Lifted%20by%20Clouds.full.jpg -light_from_within.jpg http://[server]/EVE/Light%20from%20Within.full.jpg -light_of_day.jpg http://[server]/6E/Light%20of%20Day.full.jpg -light_of_sanction.jpg http://[server]/RAV/Light%20of%20Sanction.full.jpg -lightbringer.jpg http://[server]/NE/Lightbringer.full.jpg -lightning_angel.jpg http://[server]/AP/Lightning%20Angel.full.jpg -lightning_axe.jpg http://[server]/TSP/Lightning%20Axe.full.jpg -lightning_blast.jpg http://[server]/8E/Lightning%20Blast.full.jpg -lightning_blow.jpg http://[server]/IA/Lightning%20Blow.full.jpg -lightning_bolt.jpg http://[server]/M10/Lightning%20Bolt.full.jpg -lightning_cloud.jpg http://[server]/VI/Lightning%20Cloud.full.jpg -lightning_coils.jpg http://[server]/MR/Lightning%20Coils.full.jpg -lightning_crafter.jpg http://[server]/MOR/Lightning%20Crafter.full.jpg -lightning_dart.jpg http://[server]/IN/Lightning%20Dart.full.jpg -lightning_dragon.jpg http://[server]/US/Lightning%20Dragon.full.jpg -lightning_elemental.jpg http://[server]/M10/Lightning%20Elemental.full.jpg -lightning_greaves.jpg http://[server]/MR/Lightning%20Greaves.full.jpg -lightning_helix.jpg http://[server]/HOP/Lightning%20Helix.full.jpg -lightning_hounds.jpg http://[server]/MM/Lightning%20Hounds.full.jpg -lightning_reaver.jpg http://[server]/ARB/Lightning%20Reaver.full.jpg -lightning_reflexes.jpg http://[server]/MI/Lightning%20Reflexes.full.jpg -lightning_rift.jpg http://[server]/ON/Lightning%20Rift.full.jpg -lightning_serpent.jpg http://[server]/CS/Lightning%20Serpent.full.jpg -lightning_storm.jpg http://[server]/CS/Lightning%20Storm.full.jpg -lightning_surge.jpg http://[server]/JU/Lightning%20Surge.full.jpg -lightning_talons.jpg http://[server]/ALA/Lightning%20Talons.full.jpg -lightwielder_paladin.jpg http://[server]/M10/Lightwielder%20Paladin.full.jpg -lignify.jpg http://[server]/LRW/Lignify.full.jpg -liliana_vess.jpg http://[server]/M10/Liliana%20Vess.full.jpg -lilting_refrain.jpg http://[server]/US/Lilting%20Refrain.full.jpg -lim_dul_the_necromancer.jpg http://[server]/TSP/Lim-Dul%20the%20Necromancer.full.jpg -lim_duls_cohort.jpg http://[server]/IA/Lim-Dul's%20Cohort.full.jpg -lim_duls_hex.jpg http://[server]/IA/Lim-Dul's%20Hex.full.jpg -lim_duls_high_guard.jpg http://[server]/AL/Lim-Dul's%20High%20Guard1.full.jpg -lim_duls_paladin.jpg http://[server]/AL/Lim-Dul's%20Paladin.full.jpg -lim_duls_vault.jpg http://[server]/AL/Lim-Dul's%20Vault.full.jpg -limestone_golem.jpg http://[server]/OD/Limestone%20Golem.full.jpg -limited_resources.jpg http://[server]/EX/Limited%20Resources.full.jpg -lin_sivvi_defiant_hero.jpg http://[server]/NE/Lin%20Sivvi,%20Defiant%20Hero.full.jpg -linessa_zephyr_mage.jpg http://[server]/FUT/Linessa,%20Zephyr%20Mage.full.jpg -lingering_death.jpg http://[server]/SC/Lingering%20Death.full.jpg -lingering_mirage.jpg http://[server]/US/Lingering%20Mirage.full.jpg -lingering_tormentor.jpg http://[server]/EVE/Lingering%20Tormentor.full.jpg -lionheart_maverick.jpg http://[server]/GP/Lionheart%20Maverick.full.jpg -lions_eye_diamond.jpg http://[server]/MI/Lion's%20Eye%20Diamond.full.jpg -liquid_fire.jpg http://[server]/OD/Liquid%20Fire.full.jpg -liquify.jpg http://[server]/TO/Liquify.full.jpg -lithatog.jpg http://[server]/OD/Lithatog.full.jpg -lithophage.jpg http://[server]/MM/Lithophage.full.jpg -little_girl.jpg http://[server]/UNH/Little%20Girl.full.jpg -liu_bei_lord_of_shu.jpg http://[server]/P3/Liu%20Bei,%20Lord%20of%20Shu.full.jpg -living_airship.jpg http://[server]/AP/Living%20Airship.full.jpg -living_armor.jpg http://[server]/CH/Living%20Armor.full.jpg -living_artifact.jpg http://[server]/5E/Living%20Artifact.full.jpg -living_death.jpg http://[server]/TE/Living%20Death.full.jpg -living_end.jpg http://[server]/TSP/Living%20End.full.jpg -living_hive.jpg http://[server]/MR/Living%20Hive.full.jpg -living_inferno.jpg http://[server]/GP/Living%20Inferno.full.jpg -living_lands.jpg http://[server]/6E/Living%20Lands.full.jpg -living_plane.jpg http://[server]/LG/Living%20Plane.full.jpg -living_terrain.jpg http://[server]/8E/Living%20Terrain.full.jpg -living_tsunami.jpg http://[server]/ZEN/Living%20Tsunami.full.jpg -living_wall.jpg http://[server]/U/Living%20Wall.full.jpg -living_wish.jpg http://[server]/JU/Living%20Wish.full.jpg -livonya_silone.jpg http://[server]/LG/Livonya%20Silone.full.jpg -lizard_warrior.jpg http://[server]/PT/Lizard%20Warrior.full.jpg -llanowar_augur.jpg http://[server]/FUT/Llanowar%20Augur.full.jpg -llanowar_behemoth.jpg http://[server]/9E/Llanowar%20Behemoth.full.jpg -llanowar_cavalry.jpg http://[server]/IN/Llanowar%20Cavalry.full.jpg -llanowar_dead.jpg http://[server]/AP/Llanowar%20Dead.full.jpg -llanowar_druid.jpg http://[server]/WL/Llanowar%20Druid.full.jpg -llanowar_elite.jpg http://[server]/IN/Llanowar%20Elite.full.jpg -llanowar_elves.jpg http://[server]/M10/Llanowar%20Elves.full.jpg -llanowar_empath.jpg http://[server]/FUT/Llanowar%20Empath.full.jpg -llanowar_knight.jpg http://[server]/IN/Llanowar%20Knight.full.jpg -llanowar_mentor.jpg http://[server]/FUT/Llanowar%20Mentor.full.jpg -llanowar_reborn.jpg http://[server]/FUT/Llanowar%20Reborn.full.jpg -llanowar_sentinel.jpg http://[server]/10E/Llanowar%20Sentinel.full.jpg -llanowar_vanguard.jpg http://[server]/IN/Llanowar%20Vanguard.full.jpg -llanowar_wastes.jpg http://[server]/10E/Llanowar%20Wastes.full.jpg -llawan_cephalid_empress.jpg http://[server]/TO/Llawan,%20Cephalid%20Empress.full.jpg -loafing_giant.jpg http://[server]/IN/Loafing%20Giant.full.jpg -loam_dweller.jpg http://[server]/BOK/Loam%20Dweller.full.jpg -loamdragger_giant.jpg http://[server]/SHM/Loamdragger%20Giant.full.jpg -loaming_shaman.jpg http://[server]/DIS/Loaming%20Shaman.full.jpg -lobotomy.jpg http://[server]/IN/Lobotomy.full.jpg -loch_korrigan.jpg http://[server]/SHM/Loch%20Korrigan.full.jpg -locket_of_yesterdays.jpg http://[server]/TSP/Locket%20of%20Yesterdays.full.jpg -lockjaw_snapper.jpg http://[server]/SHM/Lockjaw%20Snapper.full.jpg -locust_miser.jpg http://[server]/SOK/Locust%20Miser.full.jpg -locust_swarm.jpg http://[server]/MI/Locust%20Swarm.full.jpg -lodestone_bauble.jpg http://[server]/AL/Lodestone%20Bauble.full.jpg -lodestone_myr.jpg http://[server]/MR/Lodestone%20Myr.full.jpg -logic_knot.jpg http://[server]/FUT/Logic%20Knot.full.jpg -lone_wolf.jpg http://[server]/8E/Lone%20Wolf.full.jpg -lonely_sandbar.jpg http://[server]/ON/Lonely%20Sandbar.full.jpg -long_forgotten_gohei.jpg http://[server]/CHK/Long-Forgotten%20Gohei.full.jpg -long_term_plans.jpg http://[server]/SC/Long-Term%20Plans.full.jpg -longbow_archer.jpg http://[server]/7E/Longbow%20Archer.full.jpg -longhorn_firebeast.jpg http://[server]/TO/Longhorn%20Firebeast.full.jpg -look_at_me_im_r&d.jpg http://[server]/UNH/Look%20at%20Me,%20I'm%20R&D.full.jpg -look_at_me_im_the_dci.jpg http://[server]/UG/Look%20at%20Me,%20I'm%20the%20DCI.full.jpg -looming_hoverguard.jpg http://[server]/MR/Looming%20Hoverguard.full.jpg -looming_shade.jpg http://[server]/M10/Looming%20Shade.full.jpg -loose_lips.jpg http://[server]/UNH/Loose%20Lips.full.jpg -looter_il_kor.jpg http://[server]/TSP/Looter%20il-Kor.full.jpg -lord_magnus.jpg http://[server]/LG/Lord%20Magnus.full.jpg -lord_of_atlantis.jpg http://[server]/7E/Lord%20of%20Atlantis.full.jpg -lord_of_extinction.jpg http://[server]/ARB/Lord%20of%20Extinction.full.jpg -lord_of_the_pit.jpg http://[server]/10E/Lord%20of%20the%20Pit.full.jpg -lord_of_the_undead.jpg http://[server]/10E/Lord%20of%20the%20Undead.full.jpg -lord_of_tresserhorn.jpg http://[server]/AL/Lord%20of%20Tresserhorn.full.jpg -lore_broker.jpg http://[server]/RAV/Lore%20Broker.full.jpg -lorescale_coatl.jpg http://[server]/ARB/Lorescale%20Coatl.full.jpg -lorthos_the_tidemaker.jpg http://[server]/ZEN/Lorthos,%20the%20Tidemaker.full.jpg -lose_hope.jpg http://[server]/FD/Lose%20Hope.full.jpg -lost_auramancers.jpg http://[server]/FUT/Lost%20Auramancers.full.jpg -lost_hours.jpg http://[server]/FUT/Lost%20Hours.full.jpg -lost_in_thought.jpg http://[server]/JU/Lost%20in%20Thought.full.jpg -lost_order_of_jarkeld.jpg http://[server]/IA/Lost%20Order%20of%20Jarkeld.full.jpg -lost_soul.jpg http://[server]/6E/Lost%20Soul.full.jpg -lotus_bloom.jpg http://[server]/TSP/Lotus%20Bloom.full.jpg -lotus_blossom.jpg http://[server]/US/Lotus%20Blossom.full.jpg -lotus_cobra.jpg http://[server]/ZEN/Lotus%20Cobra.full.jpg -lotus_guardian.jpg http://[server]/IN/Lotus%20Guardian.full.jpg -lotus_petal.jpg http://[server]/TE/Lotus%20Petal.full.jpg -lotus_vale.jpg http://[server]/WL/Lotus%20Vale.full.jpg -lovisa_coldeyes.jpg http://[server]/CS/Lovisa%20Coldeyes.full.jpg -lowland_basilisk.jpg http://[server]/SH/Lowland%20Basilisk.full.jpg -lowland_giant.jpg http://[server]/TE/Lowland%20Giant.full.jpg -lowland_oaf.jpg http://[server]/LRW/Lowland%20Oaf.full.jpg -lowland_tracker.jpg http://[server]/LE/Lowland%20Tracker.full.jpg -loxodon_anchorite.jpg http://[server]/FD/Loxodon%20Anchorite.full.jpg -loxodon_gatekeeper.jpg http://[server]/RAV/Loxodon%20Gatekeeper.full.jpg -loxodon_hierarch.jpg http://[server]/RAV/Loxodon%20Hierarch.full.jpg -loxodon_mender.jpg http://[server]/MR/Loxodon%20Mender.full.jpg -loxodon_mystic.jpg http://[server]/10E/Loxodon%20Mystic.full.jpg -loxodon_peacekeeper.jpg http://[server]/MR/Loxodon%20Peacekeeper.full.jpg -loxodon_punisher.jpg http://[server]/MR/Loxodon%20Punisher.full.jpg -loxodon_stalwart.jpg http://[server]/FD/Loxodon%20Stalwart.full.jpg -loxodon_warhammer.jpg http://[server]/10E/Loxodon%20Warhammer.full.jpg -loyal_gyrfalcon.jpg http://[server]/EVE/Loyal%20Gyrfalcon.full.jpg -loyal_retainers.jpg http://[server]/P3/Loyal%20Retainers.full.jpg -loyal_sentry.jpg http://[server]/10E/Loyal%20Sentry.full.jpg -lu_bu_master_at_arms.jpg http://[server]/P3/Lu%20Bu,%20Master-at-Arms.full.jpg -lu_meng_wu_general.jpg http://[server]/P3/Lu%20Meng,%20Wu%20General.full.jpg -lu_su_wu_advisor.jpg http://[server]/P3/Lu%20Su,%20Wu%20Advisor.full.jpg -lu_xun_scholar_general.jpg http://[server]/P3/Lu%20Xun,%20Scholar%20General.full.jpg -lucent_liminid.jpg http://[server]/FUT/Lucent%20Liminid.full.jpg -lull.jpg http://[server]/US/Lull.full.jpg -lullmage_mentor.jpg http://[server]/ZEN/Lullmage%20Mentor.full.jpg -lumbering_satyr.jpg http://[server]/MM/Lumbering%20Satyr.full.jpg -lumengrid_augur.jpg http://[server]/MR/Lumengrid%20Augur.full.jpg -lumengrid_sentinel.jpg http://[server]/MR/Lumengrid%20Sentinel.full.jpg -lumengrid_warden.jpg http://[server]/10E/Lumengrid%20Warden.full.jpg -luminarch_ascension.jpg http://[server]/ZEN/Luminarch%20Ascension.full.jpg -luminesce.jpg http://[server]/10E/Luminesce.full.jpg -luminescent_rain.jpg http://[server]/MOR/Luminescent%20Rain.full.jpg -luminous_angel.jpg http://[server]/MR/Luminous%20Angel.full.jpg -luminous_guardian.jpg http://[server]/OD/Luminous%20Guardian.full.jpg -lumithread_field.jpg http://[server]/FUT/Lumithread%20Field.full.jpg -lunar_avenger.jpg http://[server]/FD/Lunar%20Avenger.full.jpg -lunge.jpg http://[server]/MM/Lunge.full.jpg -lunk_errant.jpg http://[server]/MOR/Lunk%20Errant.full.jpg -lure.jpg http://[server]/10E/Lure.full.jpg -lure_of_prey.jpg http://[server]/MI/Lure%20of%20Prey.full.jpg -lurebound_scarecrow.jpg http://[server]/SHM/Lurebound%20Scarecrow.full.jpg -lurker.jpg http://[server]/DK/Lurker.full.jpg -lurking_evil.jpg http://[server]/US/Lurking%20Evil.full.jpg -lurking_informant.jpg http://[server]/RAV/Lurking%20Informant.full.jpg -lurking_jackals.jpg http://[server]/UD/Lurking%20Jackals.full.jpg -lurking_nightstalker.jpg http://[server]/P2/Lurking%20Nightstalker.full.jpg -lurking_predators.jpg http://[server]/M10/Lurking%20Predators.full.jpg -lurking_skirge.jpg http://[server]/UL/Lurking%20Skirge.full.jpg -lush_growth.jpg http://[server]/ALA/Lush%20Growth.full.jpg -lymph_sliver.jpg http://[server]/FUT/Lymph%20Sliver.full.jpg -lyna.jpg http://[server]/VG/Lyna.full.jpg -lynx.jpg http://[server]/ST/Lynx.full.jpg -lys_alana_bowmaster.jpg http://[server]/MOR/Lys%20Alana%20Bowmaster.full.jpg -lys_alana_huntmaster.jpg http://[server]/EVG/Lys%20Alana%20Huntmaster.full.jpg -lys_alana_scarblade.jpg http://[server]/LRW/Lys%20Alana%20Scarblade.full.jpg -lyzolda_the_blood_witch.jpg http://[server]/DIS/Lyzolda,%20the%20Blood%20Witch.full.jpg \ No newline at end of file diff --git a/res/pics_link/card-pictures_m.txt b/res/pics_link/card-pictures_m.txt deleted file mode 100644 index e6b412d00f2..00000000000 --- a/res/pics_link/card-pictures_m.txt +++ /dev/null @@ -1,679 +0,0 @@ -ma_chao_western_warrior.jpg http://[server]/P3/Ma%20Chao,%20Western%20Warrior.full.jpg -macabre_waltz.jpg http://[server]/DIS/Macabre%20Waltz.full.jpg -macetail_hystrodon.jpg http://[server]/LE/Macetail%20Hystrodon.full.jpg -machinate.jpg http://[server]/DS/Machinate.full.jpg -mad_auntie.jpg http://[server]/LRW/Mad%20Auntie.full.jpg -mad_dog.jpg http://[server]/OD/Mad%20Dog.full.jpg -madblind_mountain.jpg http://[server]/SHM/Madblind%20Mountain.full.jpg -maddening_imp.jpg http://[server]/TE/Maddening%20Imp.full.jpg -maddening_wind.jpg http://[server]/IA/Maddening%20Wind.full.jpg -madrush_cyclops.jpg http://[server]/ARB/Madrush%20Cyclops.full.jpg -maelstrom_archangel.jpg http://[server]/CFX/Maelstrom%20Archangel.full.jpg -maelstrom_djinn.jpg http://[server]/FUT/Maelstrom%20Djinn.full.jpg -maelstrom_nexus.jpg http://[server]/ARB/Maelstrom%20Nexus.full.jpg -maelstrom_pulse.jpg http://[server]/ARB/Maelstrom%20Pulse.full.jpg -maga_traitor_to_mortals.jpg http://[server]/SOK/Maga,%20Traitor%20to%20Mortals.full.jpg -mage_il_vec.jpg http://[server]/EX/Mage%20il-Vec.full.jpg -mage_slayer.jpg http://[server]/ARB/Mage%20Slayer.full.jpg -magebane_armor.jpg http://[server]/M10/Magebane%20Armor.full.jpg -magefire_wings.jpg http://[server]/ARB/Magefire%20Wings.full.jpg -mages_contest.jpg http://[server]/IN/Mages'%20Contest.full.jpg -mages_guile.jpg http://[server]/ON/Mage's%20Guile.full.jpg -mageta_the_lion.jpg http://[server]/PY/Mageta%20the%20Lion.full.jpg -magetas_boon.jpg http://[server]/PY/Mageta's%20Boon.full.jpg -magewrights_stone.jpg http://[server]/DIS/Magewright's%20Stone.full.jpg -maggot_carrier.jpg http://[server]/8E/Maggot%20Carrier.full.jpg -maggot_therapy.jpg http://[server]/MM/Maggot%20Therapy.full.jpg -magical_hack.jpg http://[server]/5E/Magical%20Hack.full.jpg -magical_hacker.jpg http://[server]/UNH/Magical%20Hacker.full.jpg -magister_sphinx.jpg http://[server]/CFX/Magister%20Sphinx.full.jpg -magistrates_scepter.jpg http://[server]/MM/Magistrate's%20Scepter.full.jpg -magistrates_veto.jpg http://[server]/MM/Magistrate's%20Veto.full.jpg -magma_burst.jpg http://[server]/PS/Magma%20Burst.full.jpg -magma_giant.jpg http://[server]/FD/Magma%20Giant.full.jpg -magma_jet.jpg http://[server]/FD/Magma%20Jet.full.jpg -magma_mine.jpg http://[server]/VI/Magma%20Mine.full.jpg -magma_phoenix.jpg http://[server]/M10/Magma%20Phoenix.full.jpg -magma_rift.jpg http://[server]/ZEN/Magma%20Rift.full.jpg -magma_sliver.jpg http://[server]/LE/Magma%20Sliver.full.jpg -magma_spray.jpg http://[server]/ALA/Magma%20Spray.full.jpg -magma_vein.jpg http://[server]/OD/Magma%20Vein.full.jpg -magmasaur.jpg http://[server]/TE/Magmasaur.full.jpg -magmatic_core.jpg http://[server]/CS/Magmatic%20Core.full.jpg -magnetic_flux.jpg http://[server]/DS/Magnetic%20Flux.full.jpg -magnetic_mountain.jpg http://[server]/4E/Magnetic%20Mountain.full.jpg -magnetic_theft.jpg http://[server]/FD/Magnetic%20Theft.full.jpg -magnetic_web.jpg http://[server]/TE/Magnetic%20Web.full.jpg -magnify.jpg http://[server]/UD/Magnify.full.jpg -magnigoth_treefolk.jpg http://[server]/PS/Magnigoth%20Treefolk.full.jpg -magnivore.jpg http://[server]/9E/Magnivore.full.jpg -magosi_the_waterveil.jpg http://[server]/ZEN/Magosi,%20the%20Waterveil.full.jpg -magus_of_the_abyss.jpg http://[server]/FUT/Magus%20of%20the%20Abyss.full.jpg -magus_of_the_arena.jpg http://[server]/PLC/Magus%20of%20the%20Arena.full.jpg -magus_of_the_bazaar.jpg http://[server]/PLC/Magus%20of%20the%20Bazaar.full.jpg -magus_of_the_candelabra.jpg http://[server]/TSP/Magus%20of%20the%20Candelabra.full.jpg -magus_of_the_coffers.jpg http://[server]/PLC/Magus%20of%20the%20Coffers.full.jpg -magus_of_the_disk.jpg http://[server]/TSP/Magus%20of%20the%20Disk.full.jpg -magus_of_the_future.jpg http://[server]/FUT/Magus%20of%20the%20Future.full.jpg -magus_of_the_jar.jpg http://[server]/TSP/Magus%20of%20the%20Jar.full.jpg -magus_of_the_library.jpg http://[server]/PLC/Magus%20of%20the%20Library.full.jpg -magus_of_the_mirror.jpg http://[server]/TSP/Magus%20of%20the%20Mirror.full.jpg -magus_of_the_moat.jpg http://[server]/FUT/Magus%20of%20the%20Moat.full.jpg -magus_of_the_moon.jpg http://[server]/FUT/Magus%20of%20the%20Moon.full.jpg -magus_of_the_scroll.jpg http://[server]/TSP/Magus%20of%20the%20Scroll.full.jpg -magus_of_the_tabernacle.jpg http://[server]/PLC/Magus%20of%20the%20Tabernacle.full.jpg -magus_of_the_unseen.jpg http://[server]/5E/Magus%20of%20the%20Unseen.full.jpg -magus_of_the_vineyard.jpg http://[server]/FUT/Magus%20of%20the%20Vineyard.full.jpg -mahamoti_djinn.jpg http://[server]/10E/Mahamoti%20Djinn.full.jpg -major_teroh.jpg http://[server]/TO/Major%20Teroh.full.jpg -makeshift_mannequin.jpg http://[server]/LRW/Makeshift%20Mannequin.full.jpg -makindi_shieldmate.jpg http://[server]/ZEN/Makindi%20Shieldmate.full.jpg -malach_of_the_dawn.jpg http://[server]/PLC/Malach%20of%20the%20Dawn.full.jpg -malachite_golem.jpg http://[server]/MR/Malachite%20Golem.full.jpg -malachite_talisman.jpg http://[server]/IA/Malachite%20Talisman.full.jpg -malakir_bloodwitch.jpg http://[server]/ZEN/Malakir%20Bloodwitch.full.jpg -malevolent_awakening.jpg http://[server]/OD/Malevolent%20Awakening.full.jpg -malfegor.jpg http://[server]/CFX/Malfegor.full.jpg -malicious_advice.jpg http://[server]/PS/Malicious%20Advice.full.jpg -malignant_growth.jpg http://[server]/MI/Malignant%20Growth.full.jpg -mammoth_harness.jpg http://[server]/HL/Mammoth%20Harness.full.jpg -man_o_war.jpg http://[server]/PT/Man-o'-War.full.jpg -man_of_measure.jpg http://[server]/UNH/Man%20of%20Measure.full.jpg -mana_breach.jpg http://[server]/7E/Mana%20Breach.full.jpg -mana_cache.jpg http://[server]/NE/Mana%20Cache.full.jpg -mana_chains.jpg http://[server]/WL/Mana%20Chains.full.jpg -mana_clash.jpg http://[server]/9E/Mana%20Clash.full.jpg -mana_crypt.jpg http://[server]/HPB/Mana%20Crypt.full.jpg -mana_cylix.jpg http://[server]/PS/Mana%20Cylix.full.jpg -mana_drain.jpg http://[server]/LG/Mana%20Drain.full.jpg -mana_echoes.jpg http://[server]/ON/Mana%20Echoes.full.jpg -mana_flair.jpg http://[server]/UNH/Mana%20Flair.full.jpg -mana_flare.jpg http://[server]/5E/Mana%20Flare.full.jpg -mana_geyser.jpg http://[server]/FD/Mana%20Geyser.full.jpg -mana_leak.jpg http://[server]/9E/Mana%20Leak.full.jpg -mana_leech.jpg http://[server]/US/Mana%20Leech.full.jpg -mana_matrix.jpg http://[server]/LG/Mana%20Matrix.full.jpg -mana_maze.jpg http://[server]/IN/Mana%20Maze.full.jpg -mana_prism.jpg http://[server]/MI/Mana%20Prism.full.jpg -mana_reflection.jpg http://[server]/SHM/Mana%20Reflection.full.jpg -mana_screw.jpg http://[server]/UNH/Mana%20Screw.full.jpg -mana_seism.jpg http://[server]/CHK/Mana%20Seism.full.jpg -mana_severance.jpg http://[server]/TE/Mana%20Severance.full.jpg -mana_short.jpg http://[server]/7E/Mana%20Short.full.jpg -mana_skimmer.jpg http://[server]/TSP/Mana%20Skimmer.full.jpg -mana_tithe.jpg http://[server]/PLC/Mana%20Tithe.full.jpg -mana_vapors.jpg http://[server]/PY/Mana%20Vapors.full.jpg -mana_vault.jpg http://[server]/5E/Mana%20Vault.full.jpg -mana_vortex.jpg http://[server]/DK/Mana%20Vortex.full.jpg -mana_web.jpg http://[server]/WL/Mana%20Web.full.jpg -manabarbs.jpg http://[server]/M10/Manabarbs.full.jpg -manabond.jpg http://[server]/EX/Manabond.full.jpg -manacles_of_decay.jpg http://[server]/AP/Manacles%20of%20Decay.full.jpg -manaforce_mace.jpg http://[server]/CFX/Manaforce%20Mace.full.jpg -manaforge_cinder.jpg http://[server]/SHM/Manaforge%20Cinder.full.jpg -manakin.jpg http://[server]/TE/Manakin.full.jpg -manamorphose.jpg http://[server]/SHM/Manamorphose.full.jpg -manaplasm.jpg http://[server]/ALA/Manaplasm.full.jpg -mangara_of_corondor.jpg http://[server]/TSP/Mangara%20of%20Corondor.full.jpg -mangaras_blessing.jpg http://[server]/MI/Mangara's%20Blessing.full.jpg -mangaras_equity.jpg http://[server]/MI/Mangara's%20Equity.full.jpg -mangaras_tome.jpg http://[server]/MI/Mangara's%20Tome.full.jpg -maniacal_rage.jpg http://[server]/IN/Maniacal%20Rage.full.jpg -manipulate_fate.jpg http://[server]/IN/Manipulate%20Fate.full.jpg -mannichi_the_fevered_dream.jpg http://[server]/BOK/Mannichi,%20the%20Fevered%20Dream.full.jpg -manriki_gusari.jpg http://[server]/SOK/Manriki-Gusari.full.jpg -manta_ray.jpg http://[server]/WL/Manta%20Ray.full.jpg -manta_riders.jpg http://[server]/TE/Manta%20Riders.full.jpg -mantis_engine.jpg http://[server]/10E/Mantis%20Engine.full.jpg -mantle_of_leadership.jpg http://[server]/PLC/Mantle%20of%20Leadership.full.jpg -maralen_of_the_mornsong.jpg http://[server]/MOR/Maralen%20of%20the%20Mornsong.full.jpg -marauding_knight.jpg http://[server]/IN/Marauding%20Knight.full.jpg -maraxus.jpg http://[server]/VG/Maraxus.full.jpg -maraxus_of_keld.jpg http://[server]/WL/Maraxus%20of%20Keld.full.jpg -marble_chalice.jpg http://[server]/ALA/Marble%20Chalice.full.jpg -marble_diamond.jpg http://[server]/7E/Marble%20Diamond.full.jpg -marble_priest.jpg http://[server]/LG/Marble%20Priest.full.jpg -marble_titan.jpg http://[server]/9E/Marble%20Titan.full.jpg -march_of_souls.jpg http://[server]/PS/March%20of%20Souls.full.jpg -march_of_the_machines.jpg http://[server]/10E/March%20of%20the%20Machines.full.jpg -marhault_elsdragon.jpg http://[server]/LG/Marhault%20Elsdragon.full.jpg -marisis_twinclaws.jpg http://[server]/ARB/Marisi's%20Twinclaws.full.jpg -marit_lage.jpg http://[server]/REL/Marit%20Lage.full.jpg -marjhan.jpg http://[server]/HL/Marjhan.full.jpg -mark_of_asylum.jpg http://[server]/CFX/Mark%20of%20Asylum.full.jpg -mark_of_eviction.jpg http://[server]/RAV/Mark%20of%20Eviction.full.jpg -mark_of_fury.jpg http://[server]/UD/Mark%20of%20Fury.full.jpg -mark_of_mutiny.jpg http://[server]/ZEN/Mark%20of%20Mutiny.full.jpg -mark_of_sakiko.jpg http://[server]/BOK/Mark%20of%20Sakiko.full.jpg -mark_of_the_oni.jpg http://[server]/BOK/Mark%20of%20the%20Oni.full.jpg -marker_beetles.jpg http://[server]/UD/Marker%20Beetles.full.jpg -maro.jpg http://[server]/9E/Maro.full.jpg -marrow_chomper.jpg http://[server]/ARB/Marrow%20Chomper.full.jpg -marrow_gnawer.jpg http://[server]/CHK/Marrow-Gnawer.full.jpg -marsh_boa.jpg http://[server]/PY/Marsh%20Boa.full.jpg -marsh_casualties.jpg http://[server]/ZEN/Marsh%20Casualties.full.jpg -marsh_crocodile.jpg http://[server]/PS/Marsh%20Crocodile.full.jpg -marsh_flats.jpg http://[server]/ZEN/Marsh%20Flats.full.jpg -marsh_flitter.jpg http://[server]/LRW/Marsh%20Flitter.full.jpg -marsh_gas.jpg http://[server]/DK/Marsh%20Gas.full.jpg -marsh_goblins.jpg http://[server]/DK/Marsh%20Goblins.full.jpg -marsh_lurker.jpg http://[server]/TE/Marsh%20Lurker.full.jpg -marsh_viper.jpg http://[server]/5E/Marsh%20Viper.full.jpg -marshaling_cry.jpg http://[server]/FUT/Marshaling%20Cry.full.jpg -marshaling_the_troops.jpg http://[server]/P3/Marshaling%20the%20Troops.full.jpg -marshdrinker_giant.jpg http://[server]/EVE/Marshdrinker%20Giant.full.jpg -martial_coup.jpg http://[server]/CFX/Martial%20Coup.full.jpg -marton_stromgald.jpg http://[server]/IA/Marton%20Stromgald.full.jpg -martyr_of_ashes.jpg http://[server]/CS/Martyr%20of%20Ashes.full.jpg -martyr_of_bones.jpg http://[server]/CS/Martyr%20of%20Bones.full.jpg -martyr_of_frost.jpg http://[server]/CS/Martyr%20of%20Frost.full.jpg -martyr_of_sands.jpg http://[server]/CS/Martyr%20of%20Sands.full.jpg -martyr_of_spores.jpg http://[server]/CS/Martyr%20of%20Spores.full.jpg -martyrdom.jpg http://[server]/AL/Martyrdom1.full.jpg -martyred_rusalka.jpg http://[server]/GP/Martyred%20Rusalka.full.jpg -martyrs_cause.jpg http://[server]/UL/Martyr's%20Cause.full.jpg -martyrs_cry.jpg http://[server]/DK/Martyr's%20Cry.full.jpg -martyrs_of_korlis.jpg http://[server]/AQ/Martyrs%20of%20Korlis.full.jpg -martyrs_tomb.jpg http://[server]/AP/Martyrs'%20Tomb.full.jpg -masako_the_humorless.jpg http://[server]/CHK/Masako%20the%20Humorless.full.jpg -mask_of_intolerance.jpg http://[server]/AP/Mask%20of%20Intolerance.full.jpg -mask_of_law_and_grace.jpg http://[server]/UD/Mask%20of%20Law%20and%20Grace.full.jpg -mask_of_memory.jpg http://[server]/MR/Mask%20of%20Memory.full.jpg -mask_of_riddles.jpg http://[server]/ARB/Mask%20of%20Riddles.full.jpg -mask_of_the_mimic.jpg http://[server]/SH/Mask%20of%20the%20Mimic.full.jpg -masked_admirers.jpg http://[server]/LRW/Masked%20Admirers.full.jpg -masked_gorgon.jpg http://[server]/JU/Masked%20Gorgon.full.jpg -mass_calcify.jpg http://[server]/SHM/Mass%20Calcify.full.jpg -mass_hysteria.jpg http://[server]/MR/Mass%20Hysteria.full.jpg -mass_of_ghouls.jpg http://[server]/10E/Mass%20of%20Ghouls.full.jpg -massacre.jpg http://[server]/NE/Massacre.full.jpg -master_apothecary.jpg http://[server]/OD/Master%20Apothecary.full.jpg -master_decoy.jpg http://[server]/9E/Master%20Decoy.full.jpg -master_healer.jpg http://[server]/9E/Master%20Healer.full.jpg -master_of_arms.jpg http://[server]/WL/Master%20of%20Arms.full.jpg -master_of_etherium.jpg http://[server]/HOP/Master%20of%20Etherium.full.jpg -master_of_the_hunt.jpg http://[server]/LG/Master%20of%20the%20Hunt.full.jpg -master_of_the_veil.jpg http://[server]/LE/Master%20of%20the%20Veil.full.jpg -master_of_the_wild_hunt.jpg http://[server]/M10/Master%20of%20the%20Wild%20Hunt.full.jpg -master_transmuter.jpg http://[server]/CFX/Master%20Transmuter.full.jpg -master_warcraft.jpg http://[server]/RAV/Master%20Warcraft.full.jpg -masticore.jpg http://[server]/UD/Masticore.full.jpg -masumaro_first_to_live.jpg http://[server]/SOK/Masumaro,%20First%20to%20Live.full.jpg -matca_rioters.jpg http://[server]/CFX/Matca%20Rioters.full.jpg -matopi_golem.jpg http://[server]/VI/Matopi%20Golem.full.jpg -matsu_tribe_birdstalker.jpg http://[server]/SOK/Matsu-Tribe%20Birdstalker.full.jpg -matsu_tribe_decoy.jpg http://[server]/CHK/Matsu-Tribe%20Decoy.full.jpg -matsu_tribe_sniper.jpg http://[server]/BOK/Matsu-Tribe%20Sniper.full.jpg -mausoleum_turnkey.jpg http://[server]/RAV/Mausoleum%20Turnkey.full.jpg -mawcor.jpg http://[server]/7E/Mawcor.full.jpg -mayael_the_anima.jpg http://[server]/ALA/Mayael%20the%20Anima.full.jpg -mayaels_aria.jpg http://[server]/ARB/Mayael's%20Aria.full.jpg -maze_of_ith.jpg http://[server]/DK/Maze%20of%20Ith.full.jpg -maze_of_shadows.jpg http://[server]/TE/Maze%20of%20Shadows.full.jpg -meadowboon.jpg http://[server]/MOR/Meadowboon.full.jpg -measure_of_wickedness.jpg http://[server]/SOK/Measure%20of%20Wickedness.full.jpg -meddle.jpg http://[server]/MI/Meddle.full.jpg -meddling_kids.jpg http://[server]/UNH/Meddling%20Kids.full.jpg -meddling_mage.jpg http://[server]/PS/Meddling%20Mage.full.jpg -medicine_bag.jpg http://[server]/EX/Medicine%20Bag.full.jpg -medicine_runner.jpg http://[server]/SHM/Medicine%20Runner.full.jpg -meditate.jpg http://[server]/TE/Meditate.full.jpg -meekstone.jpg http://[server]/7E/Meekstone.full.jpg -megatherium.jpg http://[server]/MM/Megatherium.full.jpg -megatog.jpg http://[server]/MR/Megatog.full.jpg -meglonoth.jpg http://[server]/CFX/Meglonoth.full.jpg -megrim.jpg http://[server]/M10/Megrim.full.jpg -meishin_the_mind_cage.jpg http://[server]/SOK/Meishin,%20the%20Mind%20Cage.full.jpg -melancholy.jpg http://[server]/PLC/Melancholy.full.jpg -melee.jpg http://[server]/IA/Melee.full.jpg -melesse_spirit.jpg http://[server]/MI/Melesse%20Spirit.full.jpg -meloku_the_clouded_mirror.jpg http://[server]/CHK/Meloku%20the%20Clouded%20Mirror.full.jpg -meltdown.jpg http://[server]/US/Meltdown.full.jpg -melting.jpg http://[server]/IA/Melting.full.jpg -memnarch.jpg http://[server]/DS/Memnarch.full.jpg -memory_crystal.jpg http://[server]/EX/Memory%20Crystal.full.jpg -memory_erosion.jpg http://[server]/ALA/Memory%20Erosion.full.jpg -memory_jar.jpg http://[server]/UL/Memory%20Jar.full.jpg -memory_lapse.jpg http://[server]/7E/Memory%20Lapse.full.jpg -memory_plunder.jpg http://[server]/SHM/Memory%20Plunder.full.jpg -memory_sluice.jpg http://[server]/SHM/Memory%20Sluice.full.jpg -menacing_ogre.jpg http://[server]/ON/Menacing%20Ogre.full.jpg -mending_hands.jpg http://[server]/9E/Mending%20Hands.full.jpg -meng_huo_barbarian_king.jpg http://[server]/P3/Meng%20Huo,%20Barbarian%20King.full.jpg -meng_huos_horde.jpg http://[server]/P3/Meng%20Huo's%20Horde.full.jpg -mental_discipline.jpg http://[server]/UD/Mental%20Discipline.full.jpg -mental_note.jpg http://[server]/JU/Mental%20Note.full.jpg -mephidross_vampire.jpg http://[server]/FD/Mephidross%20Vampire.full.jpg -mephitic_ooze.jpg http://[server]/DS/Mephitic%20Ooze.full.jpg -mercadian_atlas.jpg http://[server]/MM/Mercadian%20Atlas.full.jpg -mercadian_bazaar.jpg http://[server]/MM/Mercadian%20Bazaar.full.jpg -mercadian_lift.jpg http://[server]/MM/Mercadian%20Lift.full.jpg -mercadias_downfall.jpg http://[server]/MM/Mercadia's%20Downfall.full.jpg -mercenaries.jpg http://[server]/IA/Mercenaries.full.jpg -mercenary_informer.jpg http://[server]/PY/Mercenary%20Informer.full.jpg -mercenary_knight.jpg http://[server]/PT/Mercenary%20Knight.full.jpg -merchant_of_secrets.jpg http://[server]/8E/Merchant%20of%20Secrets.full.jpg -merchant_scroll.jpg http://[server]/8E/Merchant%20Scroll.full.jpg -merchant_ship.jpg http://[server]/AN/Merchant%20Ship.full.jpg -mercurial_kite.jpg http://[server]/SC/Mercurial%20Kite.full.jpg -mercy_killing.jpg http://[server]/SHM/Mercy%20Killing.full.jpg -merfolk_assassin.jpg http://[server]/DK/Merfolk%20Assassin.full.jpg -merfolk_looter.jpg http://[server]/M10/Merfolk%20Looter.full.jpg -merfolk_of_the_pearl_trident.jpg http://[server]/7E/Merfolk%20of%20the%20Pearl%20Trident.full.jpg -merfolk_raiders.jpg http://[server]/MI/Merfolk%20Raiders.full.jpg -merfolk_seastalkers.jpg http://[server]/ZEN/Merfolk%20Seastalkers.full.jpg -merfolk_seer.jpg http://[server]/MI/Merfolk%20Seer.full.jpg -merfolk_sovereign.jpg http://[server]/M10/Merfolk%20Sovereign.full.jpg -merfolk_thaumaturgist.jpg http://[server]/PLC/Merfolk%20Thaumaturgist.full.jpg -merfolk_traders.jpg http://[server]/WL/Merfolk%20Traders.full.jpg -merfolk_wayfinder.jpg http://[server]/ZEN/Merfolk%20Wayfinder.full.jpg -merieke_ri_berit.jpg http://[server]/IA/Merieke%20Ri%20Berit.full.jpg -merrow_bonegnawer.jpg http://[server]/EVE/Merrow%20Bonegnawer.full.jpg -merrow_commerce.jpg http://[server]/LRW/Merrow%20Commerce.full.jpg -merrow_grimeblotter.jpg http://[server]/SHM/Merrow%20Grimeblotter.full.jpg -merrow_harbinger.jpg http://[server]/LRW/Merrow%20Harbinger.full.jpg -merrow_levitator.jpg http://[server]/EVE/Merrow%20Levitator.full.jpg -merrow_reejerey.jpg http://[server]/FNM/Merrow%20Reejerey.full.jpg -merrow_wavebreakers.jpg http://[server]/SHM/Merrow%20Wavebreakers.full.jpg -merrow_witsniper.jpg http://[server]/MOR/Merrow%20Witsniper.full.jpg -merseine.jpg http://[server]/FE/Merseine1.full.jpg -mesa_chicken.jpg http://[server]/UG/Mesa%20Chicken.full.jpg -mesa_enchantress.jpg http://[server]/M10/Mesa%20Enchantress.full.jpg -mesa_falcon.jpg http://[server]/6E/Mesa%20Falcon.full.jpg -mesa_pegasus.jpg http://[server]/5E/Mesa%20Pegasus.full.jpg -mesmeric_fiend.jpg http://[server]/TO/Mesmeric%20Fiend.full.jpg -mesmeric_orb.jpg http://[server]/MR/Mesmeric%20Orb.full.jpg -mesmeric_sliver.jpg http://[server]/FUT/Mesmeric%20Sliver.full.jpg -mesmeric_trance.jpg http://[server]/IA/Mesmeric%20Trance.full.jpg -messenger_falcons.jpg http://[server]/ARB/Messenger%20Falcons.full.jpg -metal_fatigue.jpg http://[server]/DS/Metal%20Fatigue.full.jpg -metallic_sliver.jpg http://[server]/TE/Metallic%20Sliver.full.jpg -metallurgeon.jpg http://[server]/ALA/Metallurgeon.full.jpg -metalworker.jpg http://[server]/UD/Metalworker.full.jpg -metamorphic_wurm.jpg http://[server]/OD/Metamorphic%20Wurm.full.jpg -metamorphose.jpg http://[server]/SC/Metamorphose.full.jpg -metamorphosis.jpg http://[server]/CH/Metamorphosis.full.jpg -metathran_aerostat.jpg http://[server]/IN/Metathran%20Aerostat.full.jpg -metathran_elite.jpg http://[server]/UD/Metathran%20Elite.full.jpg -metathran_soldier.jpg http://[server]/UD/Metathran%20Soldier.full.jpg -metathran_transport.jpg http://[server]/IN/Metathran%20Transport.full.jpg -metathran_zombie.jpg http://[server]/IN/Metathran%20Zombie.full.jpg -meteor_crater.jpg http://[server]/PS/Meteor%20Crater.full.jpg -meteor_shower.jpg http://[server]/IA/Meteor%20Shower.full.jpg -meteor_storm.jpg http://[server]/IN/Meteor%20Storm.full.jpg -metrognome.jpg http://[server]/US/Metrognome.full.jpg -michiko_konda_truth_seeker.jpg http://[server]/SOK/Michiko%20Konda,%20Truth%20Seeker.full.jpg -midnight_banshee.jpg http://[server]/SHM/Midnight%20Banshee.full.jpg -midnight_charm.jpg http://[server]/PLC/Midnight%20Charm.full.jpg -midnight_covenant.jpg http://[server]/CHK/Midnight%20Covenant.full.jpg -midnight_ritual.jpg http://[server]/10E/Midnight%20Ritual.full.jpg -midsummer_revel.jpg http://[server]/US/Midsummer%20Revel.full.jpg -might_of_alara.jpg http://[server]/CFX/Might%20of%20Alara.full.jpg -might_of_oaks.jpg http://[server]/M10/Might%20of%20Oaks.full.jpg -might_of_old_krosa.jpg http://[server]/TSP/Might%20of%20Old%20Krosa.full.jpg -might_of_the_nephilim.jpg http://[server]/DIS/Might%20of%20the%20Nephilim.full.jpg -might_sliver.jpg http://[server]/TSP/Might%20Sliver.full.jpg -might_weaver.jpg http://[server]/10E/Might%20Weaver.full.jpg -mightstone.jpg http://[server]/AQ/Mightstone.full.jpg -mighty_emergence.jpg http://[server]/ALA/Mighty%20Emergence.full.jpg -mijae_djinn.jpg http://[server]/AN/Mijae%20Djinn.full.jpg -mikokoro_center_of_the_sea.jpg http://[server]/SOK/Mikokoro,%20Center%20of%20the%20Sea.full.jpg -militant_monk.jpg http://[server]/TO/Militant%20Monk.full.jpg -militias_pride.jpg http://[server]/LRW/Militia's%20Pride.full.jpg -millikin.jpg http://[server]/OD/Millikin.full.jpg -millstone.jpg http://[server]/10E/Millstone.full.jpg -mimeofacture.jpg http://[server]/GP/Mimeofacture.full.jpg -minamo_school_at_waters_edge.jpg http://[server]/CHK/Minamo,%20School%20at%20Water's%20Edge.full.jpg -minamo_scrollkeeper.jpg http://[server]/SOK/Minamo%20Scrollkeeper.full.jpg -minamo_sightbender.jpg http://[server]/BOK/Minamo%20Sightbender.full.jpg -minamos_meddling.jpg http://[server]/BOK/Minamo's%20Meddling.full.jpg -mind_bend.jpg http://[server]/10E/Mind%20Bend.full.jpg -mind_bomb.jpg http://[server]/5E/Mind%20Bomb.full.jpg -mind_burst.jpg http://[server]/OD/Mind%20Burst.full.jpg -mind_control.jpg http://[server]/M10/Mind%20Control.full.jpg -mind_extraction.jpg http://[server]/AP/Mind%20Extraction.full.jpg -mind_funeral.jpg http://[server]/ARB/Mind%20Funeral.full.jpg -mind_games.jpg http://[server]/SH/Mind%20Games.full.jpg -mind_harness.jpg http://[server]/MI/Mind%20Harness.full.jpg -mind_knives.jpg http://[server]/PT/Mind%20Knives.full.jpg -mind_maggots.jpg http://[server]/EX/Mind%20Maggots.full.jpg -mind_over_matter.jpg http://[server]/EX/Mind%20Over%20Matter.full.jpg -mind_peel.jpg http://[server]/SH/Mind%20Peel.full.jpg -mind_ravel.jpg http://[server]/5E/Mind%20Ravel.full.jpg -mind_rot.jpg http://[server]/M10/Mind%20Rot.full.jpg -mind_shatter.jpg http://[server]/M10/Mind%20Shatter.full.jpg -mind_slash.jpg http://[server]/8E/Mind%20Slash.full.jpg -mind_sludge.jpg http://[server]/8E/Mind%20Sludge.full.jpg -mind_spring.jpg http://[server]/M10/Mind%20Spring.full.jpg -mind_stone.jpg http://[server]/10E/Mind%20Stone.full.jpg -mind_swords.jpg http://[server]/NE/Mind%20Swords.full.jpg -mind_twist.jpg http://[server]/4E/Mind%20Twist.full.jpg -mind_warp.jpg http://[server]/6E/Mind%20Warp.full.jpg -mind_whip.jpg http://[server]/IA/Mind%20Whip.full.jpg -mindbender_spores.jpg http://[server]/MI/Mindbender%20Spores.full.jpg -mindblaze.jpg http://[server]/CHK/Mindblaze.full.jpg -mindbreak_trap.jpg http://[server]/ZEN/Mindbreak%20Trap.full.jpg -mindlash_sliver.jpg http://[server]/TSP/Mindlash%20Sliver.full.jpg -mindleech_mass.jpg http://[server]/RAV/Mindleech%20Mass.full.jpg -mindless_automaton.jpg http://[server]/EX/Mindless%20Automaton.full.jpg -mindless_null.jpg http://[server]/ZEN/Mindless%20Null.full.jpg -mindlock_orb.jpg http://[server]/ALA/Mindlock%20Orb.full.jpg -mindmoil.jpg http://[server]/RAV/Mindmoil.full.jpg -minds_desire.jpg http://[server]/SC/Mind's%20Desire.full.jpg -minds_eye.jpg http://[server]/MR/Mind's%20Eye.full.jpg -mindslaver.jpg http://[server]/MR/Mindslaver.full.jpg -mindslicer.jpg http://[server]/9E/Mindslicer.full.jpg -mindstab.jpg http://[server]/TSP/Mindstab.full.jpg -mindstab_thrull.jpg http://[server]/5E/Mindstab%20Thrull.full.jpg -mindstorm_crown.jpg http://[server]/MR/Mindstorm%20Crown.full.jpg -mindwarper.jpg http://[server]/SH/Mindwarper.full.jpg -mindwhip_sliver.jpg http://[server]/TE/Mindwhip%20Sliver.full.jpg -mindwrack_liege.jpg http://[server]/EVE/Mindwrack%20Liege.full.jpg -mine_bearer.jpg http://[server]/PY/Mine%20Bearer.full.jpg -mine_excavation.jpg http://[server]/SHM/Mine%20Excavation.full.jpg -mine_layer.jpg http://[server]/OD/Mine%20Layer.full.jpg -mine_mine_mine!.jpg http://[server]/UG/Mine,%20Mine,%20Mine!.full.jpg -minion_of_leshrac.jpg http://[server]/IA/Minion%20of%20Leshrac.full.jpg -minion_of_tevesh_szat.jpg http://[server]/IA/Minion%20of%20Tevesh%20Szat.full.jpg -minion_of_the_wastes.jpg http://[server]/TE/Minion%20of%20the%20Wastes.full.jpg -minion_reflector.jpg http://[server]/ALA/Minion%20Reflector.full.jpg -minions_murmurs.jpg http://[server]/FUT/Minions'%20Murmurs.full.jpg -minister_of_impediments.jpg http://[server]/DIS/Minister%20of%20Impediments.full.jpg -minotaur_explorer.jpg http://[server]/OD/Minotaur%20Explorer.full.jpg -minotaur_illusionist.jpg http://[server]/AP/Minotaur%20Illusionist.full.jpg -minotaur_tactician.jpg http://[server]/AP/Minotaur%20Tactician.full.jpg -minotaur_warrior.jpg http://[server]/PT/Minotaur%20Warrior.full.jpg -miracle_worker.jpg http://[server]/DK/Miracle%20Worker.full.jpg -miraculous_recovery.jpg http://[server]/VI/Miraculous%20Recovery.full.jpg -mirari.jpg http://[server]/OD/Mirari.full.jpg -miraris_wake.jpg http://[server]/JU/Mirari's%20Wake.full.jpg -mire_blight.jpg http://[server]/ZEN/Mire%20Blight.full.jpg -mire_boa.jpg http://[server]/PLC/Mire%20Boa.full.jpg -mire_kavu.jpg http://[server]/PS/Mire%20Kavu.full.jpg -mire_shade.jpg http://[server]/MI/Mire%20Shade.full.jpg -miren_the_moaning_well.jpg http://[server]/SOK/Miren,%20the%20Moaning%20Well.full.jpg -mirozel.jpg http://[server]/EX/Mirozel.full.jpg -mirri.jpg http://[server]/VG/Mirri.full.jpg -mirri_cat_warrior.jpg http://[server]/10E/Mirri,%20Cat%20Warrior.full.jpg -mirri_the_cursed.jpg http://[server]/PLC/Mirri%20the%20Cursed.full.jpg -mirris_guile.jpg http://[server]/TE/Mirri's%20Guile.full.jpg -mirrodins_core.jpg http://[server]/DS/Mirrodin's%20Core.full.jpg -mirror_entity.jpg http://[server]/LRW/Mirror%20Entity.full.jpg -mirror_gallery.jpg http://[server]/BOK/Mirror%20Gallery.full.jpg -mirror_golem.jpg http://[server]/MR/Mirror%20Golem.full.jpg -mirror_mirror.jpg http://[server]/UG/Mirror%20Mirror.full.jpg -mirror_of_fate.jpg http://[server]/M10/Mirror%20of%20Fate.full.jpg -mirror_sheen.jpg http://[server]/EVE/Mirror%20Sheen.full.jpg -mirror_sigil_sergeant.jpg http://[server]/CFX/Mirror-Sigil%20Sergeant.full.jpg -mirror_strike.jpg http://[server]/PY/Mirror%20Strike.full.jpg -mirror_universe.jpg http://[server]/LG/Mirror%20Universe.full.jpg -mirror_wall.jpg http://[server]/JU/Mirror%20Wall.full.jpg -mirrorweave.jpg http://[server]/SHM/Mirrorweave.full.jpg -mirrorwood_treefolk.jpg http://[server]/PS/Mirrorwood%20Treefolk.full.jpg -miscalculation.jpg http://[server]/UL/Miscalculation.full.jpg -mischievous_poltergeist.jpg http://[server]/6E/Mischievous%20Poltergeist.full.jpg -mischievous_quanar.jpg http://[server]/SC/Mischievous%20Quanar.full.jpg -misdirection.jpg http://[server]/MM/Misdirection.full.jpg -mise.jpg http://[server]/UNH/Mise.full.jpg -misers_cage.jpg http://[server]/MI/Misers'%20Cage.full.jpg -misery_charm.jpg http://[server]/ON/Misery%20Charm.full.jpg -misfortune.jpg http://[server]/AL/Misfortune.full.jpg -misfortunes_gain.jpg http://[server]/P3/Misfortune's%20Gain.full.jpg -misguided_rage.jpg http://[server]/SC/Misguided%20Rage.full.jpg -mishra.jpg http://[server]/VG/Mishra.full.jpg -mishra_artificer_prodigy.jpg http://[server]/TSP/Mishra,%20Artificer%20Prodigy.full.jpg -mishras_bauble.jpg http://[server]/CS/Mishra's%20Bauble.full.jpg -mishras_factory.jpg http://[server]/4E/Mishra's%20Factory.full.jpg -mishras_groundbreaker.jpg http://[server]/AL/Mishra's%20Groundbreaker.full.jpg -mishras_helix.jpg http://[server]/US/Mishra's%20Helix.full.jpg -mishras_war_machine.jpg http://[server]/4E/Mishra's%20War%20Machine.full.jpg -mishras_workshop.jpg http://[server]/AQ/Mishra's%20Workshop.full.jpg -misinformation.jpg http://[server]/AL/Misinformation.full.jpg -miss_demeanor.jpg http://[server]/UG/Miss%20Demeanor.full.jpg -misshapen_fiend.jpg http://[server]/MM/Misshapen%20Fiend.full.jpg -misstep.jpg http://[server]/MM/Misstep.full.jpg -mist_dragon.jpg http://[server]/MI/Mist%20Dragon.full.jpg -mist_leopard.jpg http://[server]/M10/Mist%20Leopard.full.jpg -mist_of_stagnation.jpg http://[server]/JU/Mist%20of%20Stagnation.full.jpg -mistbind_clique.jpg http://[server]/LRW/Mistbind%20Clique.full.jpg -mistblade_shinobi.jpg http://[server]/BOK/Mistblade%20Shinobi.full.jpg -mistfolk.jpg http://[server]/IA/Mistfolk.full.jpg -mistform_dreamer.jpg http://[server]/ON/Mistform%20Dreamer.full.jpg -mistform_mask.jpg http://[server]/ON/Mistform%20Mask.full.jpg -mistform_mutant.jpg http://[server]/ON/Mistform%20Mutant.full.jpg -mistform_seaswift.jpg http://[server]/LE/Mistform%20Seaswift.full.jpg -mistform_shrieker.jpg http://[server]/ON/Mistform%20Shrieker.full.jpg -mistform_skyreaver.jpg http://[server]/ON/Mistform%20Skyreaver.full.jpg -mistform_sliver.jpg http://[server]/LE/Mistform%20Sliver.full.jpg -mistform_stalker.jpg http://[server]/ON/Mistform%20Stalker.full.jpg -mistform_ultimus.jpg http://[server]/LE/Mistform%20Ultimus.full.jpg -mistform_wakecaster.jpg http://[server]/LE/Mistform%20Wakecaster.full.jpg -mistform_wall.jpg http://[server]/ON/Mistform%20Wall.full.jpg -mistform_warchief.jpg http://[server]/SC/Mistform%20Warchief.full.jpg -mistmeadow_skulk.jpg http://[server]/FUT/Mistmeadow%20Skulk.full.jpg -mistmeadow_witch.jpg http://[server]/SHM/Mistmeadow%20Witch.full.jpg -mistmoon_griffin.jpg http://[server]/WL/Mistmoon%20Griffin.full.jpg -mistral_charger.jpg http://[server]/DIS/Mistral%20Charger.full.jpg -mistveil_plains.jpg http://[server]/SHM/Mistveil%20Plains.full.jpg -mistvein_borderpost.jpg http://[server]/ARB/Mistvein%20Borderpost.full.jpg -misty_rainforest.jpg http://[server]/ZEN/Misty%20Rainforest.full.jpg -mizzium_transreliquat.jpg http://[server]/GP/Mizzium%20Transreliquat.full.jpg -mnemonic_nexus.jpg http://[server]/RAV/Mnemonic%20Nexus.full.jpg -mnemonic_sliver.jpg http://[server]/TE/Mnemonic%20Sliver.full.jpg -moaning_spirit.jpg http://[server]/P2/Moaning%20Spirit.full.jpg -moat.jpg http://[server]/LG/Moat.full.jpg -mob_justice.jpg http://[server]/SH/Mob%20Justice.full.jpg -mob_mentality.jpg http://[server]/VI/Mob%20Mentality.full.jpg -mobile_fort.jpg http://[server]/US/Mobile%20Fort.full.jpg -mobilization.jpg http://[server]/10E/Mobilization.full.jpg -mobilize.jpg http://[server]/PT/Mobilize.full.jpg -mogg_alarm.jpg http://[server]/NE/Mogg%20Alarm.full.jpg -mogg_assassin.jpg http://[server]/EX/Mogg%20Assassin.full.jpg -mogg_bombers.jpg http://[server]/SH/Mogg%20Bombers.full.jpg -mogg_cannon.jpg http://[server]/TE/Mogg%20Cannon.full.jpg -mogg_conscripts.jpg http://[server]/TE/Mogg%20Conscripts.full.jpg -mogg_fanatic.jpg http://[server]/10E/Mogg%20Fanatic.full.jpg -mogg_flunkies.jpg http://[server]/AT/Mogg%20Flunkies.full.jpg -mogg_hollows.jpg http://[server]/TE/Mogg%20Hollows.full.jpg -mogg_infestation.jpg http://[server]/SH/Mogg%20Infestation.full.jpg -mogg_jailer.jpg http://[server]/PS/Mogg%20Jailer.full.jpg -mogg_maniac.jpg http://[server]/SH/Mogg%20Maniac.full.jpg -mogg_raider.jpg http://[server]/AT/Mogg%20Raider.full.jpg -mogg_salvage.jpg http://[server]/NE/Mogg%20Salvage.full.jpg -mogg_sentry.jpg http://[server]/9E/Mogg%20Sentry.full.jpg -mogg_squad.jpg http://[server]/TE/Mogg%20Squad.full.jpg -mogg_toady.jpg http://[server]/NE/Mogg%20Toady.full.jpg -mogg_war_marshal.jpg http://[server]/EVG/Mogg%20War%20Marshal.full.jpg -moggcatcher.jpg http://[server]/NE/Moggcatcher.full.jpg -mold_adder.jpg http://[server]/M10/Mold%20Adder.full.jpg -mold_demon.jpg http://[server]/LG/Mold%20Demon.full.jpg -mold_shambler.jpg http://[server]/ZEN/Mold%20Shambler.full.jpg -molder.jpg http://[server]/TSP/Molder.full.jpg -molder_slug.jpg http://[server]/MR/Molder%20Slug.full.jpg -moldervine_cloak.jpg http://[server]/RAV/Moldervine%20Cloak.full.jpg -mole_worms.jpg http://[server]/5E/Mole%20Worms.full.jpg -molimo_maro_sorcerer.jpg http://[server]/10E/Molimo,%20Maro-Sorcerer.full.jpg -molten_disaster.jpg http://[server]/FUT/Molten%20Disaster.full.jpg -molten_firebird.jpg http://[server]/PLC/Molten%20Firebird.full.jpg -molten_frame.jpg http://[server]/CFX/Molten%20Frame.full.jpg -molten_hydra.jpg http://[server]/UL/Molten%20Hydra.full.jpg -molten_influence.jpg http://[server]/OD/Molten%20Influence.full.jpg -molten_rain.jpg http://[server]/MR/Molten%20Rain.full.jpg -molten_ravager.jpg http://[server]/ZEN/Molten%20Ravager.full.jpg -molten_sentry.jpg http://[server]/RAV/Molten%20Sentry.full.jpg -molten_slagheap.jpg http://[server]/TSP/Molten%20Slagheap.full.jpg -molting_harpy.jpg http://[server]/MM/Molting%20Harpy.full.jpg -molting_skin.jpg http://[server]/SOK/Molting%20Skin.full.jpg -moment_of_silence.jpg http://[server]/MM/Moment%20of%20Silence.full.jpg -momentary_blink.jpg http://[server]/TSP/Momentary%20Blink.full.jpg -moments_peace.jpg http://[server]/OD/Moment's%20Peace.full.jpg -momentum.jpg http://[server]/UD/Momentum.full.jpg -momir_vig_simic_visionary.jpg http://[server]/DIS/Momir%20Vig,%20Simic%20Visionary.full.jpg -mongrel_pack.jpg http://[server]/TE/Mongrel%20Pack.full.jpg -moniker_mage.jpg http://[server]/UNH/Moniker%20Mage.full.jpg -monk_idealist.jpg http://[server]/US/Monk%20Idealist.full.jpg -monk_realist.jpg http://[server]/US/Monk%20Realist.full.jpg -monkey_cage.jpg http://[server]/MM/Monkey%20Cage.full.jpg -monkey_monkey_monkey.jpg http://[server]/UNH/Monkey%20Monkey%20Monkey.full.jpg -monsoon.jpg http://[server]/IA/Monsoon.full.jpg -monss_goblin_raiders.jpg http://[server]/5E/Mons's%20Goblin%20Raiders.full.jpg -monss_goblin_waiters.jpg http://[server]/UNH/Mons's%20Goblin%20Waiters.full.jpg -monstrify.jpg http://[server]/EVE/Monstrify.full.jpg -monstrous_carabid.jpg http://[server]/ARB/Monstrous%20Carabid.full.jpg -monstrous_growth.jpg http://[server]/8E/Monstrous%20Growth.full.jpg -monstrous_hound.jpg http://[server]/EX/Monstrous%20Hound.full.jpg -moon_sprite.jpg http://[server]/PT/Moon%20Sprite.full.jpg -moonbow_illusionist.jpg http://[server]/SOK/Moonbow%20Illusionist.full.jpg -moonglove_changeling.jpg http://[server]/MOR/Moonglove%20Changeling.full.jpg -moonglove_extract.jpg http://[server]/EVG/Moonglove%20Extract.full.jpg -moonglove_winnower.jpg http://[server]/LRW/Moonglove%20Winnower.full.jpg -moonhold.jpg http://[server]/EVE/Moonhold.full.jpg -moonlace.jpg http://[server]/TSP/Moonlace.full.jpg -moonlight_bargain.jpg http://[server]/RAV/Moonlight%20Bargain.full.jpg -moonlit_strider.jpg http://[server]/BOK/Moonlit%20Strider.full.jpg -moonlit_wake.jpg http://[server]/MM/Moonlit%20Wake.full.jpg -moonring_island.jpg http://[server]/SHM/Moonring%20Island.full.jpg -moonring_mirror.jpg http://[server]/CHK/Moonring%20Mirror.full.jpg -moonwing_moth.jpg http://[server]/SOK/Moonwing%20Moth.full.jpg -moor_fiend.jpg http://[server]/IA/Moor%20Fiend.full.jpg -moorish_cavalry.jpg http://[server]/TSB/Moorish%20Cavalry.full.jpg -morale.jpg http://[server]/4E/Morale.full.jpg -morality_shift.jpg http://[server]/JU/Morality%20Shift.full.jpg -moratorium_stone.jpg http://[server]/GP/Moratorium%20Stone.full.jpg -morbid_bloom.jpg http://[server]/ARB/Morbid%20Bloom.full.jpg -morbid_hunger.jpg http://[server]/OD/Morbid%20Hunger.full.jpg -morgue_theft.jpg http://[server]/OD/Morgue%20Theft.full.jpg -morgue_thrull.jpg http://[server]/SH/Morgue%20Thrull.full.jpg -morgue_toad.jpg http://[server]/PS/Morgue%20Toad.full.jpg -morinfen.jpg http://[server]/WL/Morinfen.full.jpg -moriok_rigger.jpg http://[server]/FD/Moriok%20Rigger.full.jpg -moriok_scavenger.jpg http://[server]/MR/Moriok%20Scavenger.full.jpg -morningtide.jpg http://[server]/TO/Morningtide.full.jpg -moroii.jpg http://[server]/RAV/Moroii.full.jpg -morphling.jpg http://[server]/US/Morphling.full.jpg -morsel_theft.jpg http://[server]/MOR/Morsel%20Theft.full.jpg -morselhoarder.jpg http://[server]/SHM/Morselhoarder.full.jpg -mortal_combat.jpg http://[server]/10E/Mortal%20Combat.full.jpg -mortal_wound.jpg http://[server]/VI/Mortal%20Wound.full.jpg -mortify.jpg http://[server]/GP/Mortify.full.jpg -mortipede.jpg http://[server]/RAV/Mortipede.full.jpg -mortiphobia.jpg http://[server]/TO/Mortiphobia.full.jpg -mortivore.jpg http://[server]/10E/Mortivore.full.jpg -mortuary.jpg http://[server]/SH/Mortuary.full.jpg -mosquito_guard.jpg http://[server]/MOR/Mosquito%20Guard.full.jpg -moss_diamond.jpg http://[server]/7E/Moss%20Diamond.full.jpg -moss_kami.jpg http://[server]/CHK/Moss%20Kami.full.jpg -moss_monster.jpg http://[server]/8E/Moss%20Monster.full.jpg -mossbridge_troll.jpg http://[server]/SHM/Mossbridge%20Troll.full.jpg -mossdog.jpg http://[server]/NE/Mossdog.full.jpg -mossfire_egg.jpg http://[server]/OD/Mossfire%20Egg.full.jpg -mossfire_valley.jpg http://[server]/OD/Mossfire%20Valley.full.jpg -mosstodon.jpg http://[server]/ALA/Mosstodon.full.jpg -mosswort_bridge.jpg http://[server]/LRW/Mosswort%20Bridge.full.jpg -mothdust_changeling.jpg http://[server]/MOR/Mothdust%20Changeling.full.jpg -mother_of_goons.jpg http://[server]/UNH/Mother%20of%20Goons.full.jpg -mother_of_runes.jpg http://[server]/UL/Mother%20of%20Runes.full.jpg -mothrider_samurai.jpg http://[server]/CHK/Mothrider%20Samurai.full.jpg -mountain_bandit.jpg http://[server]/P3/Mountain%20Bandit.full.jpg -mountain_goat.jpg http://[server]/6E/Mountain%20Goat.full.jpg -mountain_stronghold.jpg http://[server]/LG/Mountain%20Stronghold.full.jpg -mountain_titan.jpg http://[server]/IA/Mountain%20Titan.full.jpg -mountain_valley.jpg http://[server]/MI/Mountain%20Valley.full.jpg -mountain_yeti.jpg http://[server]/LG/Mountain%20Yeti.full.jpg -mounted_archers.jpg http://[server]/TE/Mounted%20Archers.full.jpg -mourners_shield.jpg http://[server]/MR/Mourner's%20Shield.full.jpg -mournful_zombie.jpg http://[server]/AP/Mournful%20Zombie.full.jpg -mourning.jpg http://[server]/IN/Mourning.full.jpg -mourning_thrull.jpg http://[server]/GP/Mourning%20Thrull.full.jpg -mournwhelk.jpg http://[server]/LRW/Mournwhelk.full.jpg -mouth_of_ronom.jpg http://[server]/CS/Mouth%20of%20Ronom.full.jpg -mouth_to_mouth.jpg http://[server]/UNH/Mouth%20to%20Mouth.full.jpg -mox_diamond.jpg http://[server]/SH/Mox%20Diamond.full.jpg -mox_emerald.jpg http://[server]/U/Mox%20Emerald.full.jpg -mox_jet.jpg http://[server]/U/Mox%20Jet.full.jpg -mox_lotus.jpg http://[server]/UNH/Mox%20Lotus.full.jpg -mox_pearl.jpg http://[server]/U/Mox%20Pearl.full.jpg -mox_ruby.jpg http://[server]/U/Mox%20Ruby.full.jpg -mox_sapphire.jpg http://[server]/U/Mox%20Sapphire.full.jpg -mtenda_griffin.jpg http://[server]/MI/Mtenda%20Griffin.full.jpg -mtenda_herder.jpg http://[server]/MI/Mtenda%20Herder.full.jpg -mtenda_lion.jpg http://[server]/MI/Mtenda%20Lion.full.jpg -muck_drubb.jpg http://[server]/PLC/Muck%20Drubb.full.jpg -muck_rats.jpg http://[server]/ST/Muck%20Rats.full.jpg -mudbrawler_cohort.jpg http://[server]/SHM/Mudbrawler%20Cohort.full.jpg -mudbrawler_raiders.jpg http://[server]/SHM/Mudbrawler%20Raiders.full.jpg -mudbutton_clanger.jpg http://[server]/MOR/Mudbutton%20Clanger.full.jpg -mudbutton_torchrunner.jpg http://[server]/LRW/Mudbutton%20Torchrunner.full.jpg -muddle_the_mixture.jpg http://[server]/RAV/Muddle%20the%20Mixture.full.jpg -mudhole.jpg http://[server]/OD/Mudhole.full.jpg -mudslide.jpg http://[server]/IA/Mudslide.full.jpg -mulch.jpg http://[server]/SH/Mulch.full.jpg -mulldrifter.jpg http://[server]/LRW/Mulldrifter.full.jpg -multani.jpg http://[server]/VG/Multani.full.jpg -multani_maro_sorcerer.jpg http://[server]/UL/Multani,%20Maro-Sorcerer.full.jpg -multanis_acolyte.jpg http://[server]/UL/Multani's%20Acolyte.full.jpg -multanis_decree.jpg http://[server]/UD/Multani's%20Decree.full.jpg -multanis_harmony.jpg http://[server]/PS/Multani's%20Harmony.full.jpg -multanis_presence.jpg http://[server]/UL/Multani's%20Presence.full.jpg -mundungu.jpg http://[server]/VI/Mundungu.full.jpg -mungha_wurm.jpg http://[server]/PY/Mungha%20Wurm.full.jpg -muraganda_petroglyphs.jpg http://[server]/FUT/Muraganda%20Petroglyphs.full.jpg -murasa_pyromancer.jpg http://[server]/ZEN/Murasa%20Pyromancer.full.jpg -murderous_betrayal.jpg http://[server]/8E/Murderous%20Betrayal.full.jpg -murderous_redcap.jpg http://[server]/SHM/Murderous%20Redcap.full.jpg -murderous_spoils.jpg http://[server]/DS/Murderous%20Spoils.full.jpg -murk_dwellers.jpg http://[server]/5E/Murk%20Dwellers.full.jpg -murkfiend_liege.jpg http://[server]/EVE/Murkfiend%20Liege.full.jpg -murmuring_bosk.jpg http://[server]/MOR/Murmuring%20Bosk.full.jpg -murmurs_from_beyond.jpg http://[server]/SOK/Murmurs%20from%20Beyond.full.jpg -muscle_burst.jpg http://[server]/OD/Muscle%20Burst.full.jpg -muscle_sliver.jpg http://[server]/TE/Muscle%20Sliver.full.jpg -muse_vessel.jpg http://[server]/DIS/Muse%20Vessel.full.jpg -musician.jpg http://[server]/IA/Musician.full.jpg -mutavault.jpg http://[server]/MOR/Mutavault.full.jpg -mutilate.jpg http://[server]/TO/Mutilate.full.jpg -muzzle.jpg http://[server]/MM/Muzzle.full.jpg -mwonvuli_acid_moss.jpg http://[server]/TSP/Mwonvuli%20Acid-Moss.full.jpg -mwonvuli_ooze.jpg http://[server]/WL/Mwonvuli%20Ooze.full.jpg -my_first_tome.jpg http://[server]/UNH/My%20First%20Tome.full.jpg -mycoid_shepherd.jpg http://[server]/ARB/Mycoid%20Shepherd.full.jpg -mycologist.jpg http://[server]/PLC/Mycologist.full.jpg -mycoloth.jpg http://[server]/ALA/Mycoloth.full.jpg -mycosynth_golem.jpg http://[server]/FD/Mycosynth%20Golem.full.jpg -mycosynth_lattice.jpg http://[server]/DS/Mycosynth%20Lattice.full.jpg -myojin_of_cleansing_fire.jpg http://[server]/CHK/Myojin%20of%20Cleansing%20Fire.full.jpg -myojin_of_infinite_rage.jpg http://[server]/CHK/Myojin%20of%20Infinite%20Rage.full.jpg -myojin_of_lifes_web.jpg http://[server]/CHK/Myojin%20of%20Life's%20Web.full.jpg -myojin_of_nights_reach.jpg http://[server]/CHK/Myojin%20of%20Night's%20Reach.full.jpg -myojin_of_seeing_winds.jpg http://[server]/CHK/Myojin%20of%20Seeing%20Winds.full.jpg -myr_adapter.jpg http://[server]/MR/Myr%20Adapter.full.jpg -myr_enforcer.jpg http://[server]/MR/Myr%20Enforcer.full.jpg -myr_incubator.jpg http://[server]/MR/Myr%20Incubator.full.jpg -myr_landshaper.jpg http://[server]/DS/Myr%20Landshaper.full.jpg -myr_matrix.jpg http://[server]/DS/Myr%20Matrix.full.jpg -myr_mindservant.jpg http://[server]/MR/Myr%20Mindservant.full.jpg -myr_moonvessel.jpg http://[server]/DS/Myr%20Moonvessel.full.jpg -myr_prototype.jpg http://[server]/MR/Myr%20Prototype.full.jpg -myr_quadropod.jpg http://[server]/FD/Myr%20Quadropod.full.jpg -myr_retriever.jpg http://[server]/MR/Myr%20Retriever.full.jpg -myr_servitor.jpg http://[server]/FD/Myr%20Servitor.full.jpg -mystic_compass.jpg http://[server]/6E/Mystic%20Compass.full.jpg -mystic_crusader.jpg http://[server]/OD/Mystic%20Crusader.full.jpg -mystic_decree.jpg http://[server]/HL/Mystic%20Decree.full.jpg -mystic_denial.jpg http://[server]/PT/Mystic%20Denial.full.jpg -mystic_enforcer.jpg http://[server]/OD/Mystic%20Enforcer.full.jpg -mystic_familiar.jpg http://[server]/TO/Mystic%20Familiar.full.jpg -mystic_gate.jpg http://[server]/SHM/Mystic%20Gate.full.jpg -mystic_melting.jpg http://[server]/CS/Mystic%20Melting.full.jpg -mystic_might.jpg http://[server]/IA/Mystic%20Might.full.jpg -mystic_penitent.jpg http://[server]/OD/Mystic%20Penitent.full.jpg -mystic_remora.jpg http://[server]/IA/Mystic%20Remora.full.jpg -mystic_restraints.jpg http://[server]/CHK/Mystic%20Restraints.full.jpg -mystic_snake.jpg http://[server]/AP/Mystic%20Snake.full.jpg -mystic_speculation.jpg http://[server]/FUT/Mystic%20Speculation.full.jpg -mystic_veil.jpg http://[server]/VI/Mystic%20Veil.full.jpg -mystic_visionary.jpg http://[server]/OD/Mystic%20Visionary.full.jpg -mystic_zealot.jpg http://[server]/OD/Mystic%20Zealot.full.jpg -mystical_teachings.jpg http://[server]/TSP/Mystical%20Teachings.full.jpg -mystical_tutor.jpg http://[server]/6E/Mystical%20Tutor.full.jpg -mythic_proportions.jpg http://[server]/ON/Mythic%20Proportions.full.jpg \ No newline at end of file diff --git a/res/pics_link/card-pictures_n.txt b/res/pics_link/card-pictures_n.txt deleted file mode 100644 index 0ca305cd4e1..00000000000 --- a/res/pics_link/card-pictures_n.txt +++ /dev/null @@ -1,245 +0,0 @@ -nacatl_hunt_pride.jpg http://[server]/CFX/Nacatl%20Hunt-Pride.full.jpg -nacatl_outlander.jpg http://[server]/CFX/Nacatl%20Outlander.full.jpg -nacatl_savage.jpg http://[server]/CFX/Nacatl%20Savage.full.jpg -nacatl_war_pride.jpg http://[server]/FUT/Nacatl%20War-Pride.full.jpg -nacre_talisman.jpg http://[server]/IA/Nacre%20Talisman.full.jpg -nafs_asp.jpg http://[server]/4E/Nafs%20Asp.full.jpg -nagao_bound_by_honor.jpg http://[server]/CHK/Nagao,%20Bound%20by%20Honor.full.jpg -nakaya_shade.jpg http://[server]/PY/Nakaya%20Shade.full.jpg -naked_singularity.jpg http://[server]/IA/Naked%20Singularity.full.jpg -nalathni_dragon.jpg http://[server]/PR/Nalathni%20Dragon.full.jpg -name_dropping.jpg http://[server]/UNH/Name%20Dropping.full.jpg -nameless_inversion.jpg http://[server]/LRW/Nameless%20Inversion.full.jpg -nameless_one.jpg http://[server]/ON/Nameless%20One.full.jpg -nameless_race.jpg http://[server]/DK/Nameless%20Race.full.jpg -nantuko_blightcutter.jpg http://[server]/TO/Nantuko%20Blightcutter.full.jpg -nantuko_calmer.jpg http://[server]/TO/Nantuko%20Calmer.full.jpg -nantuko_cultivator.jpg http://[server]/TO/Nantuko%20Cultivator.full.jpg -nantuko_disciple.jpg http://[server]/8E/Nantuko%20Disciple.full.jpg -nantuko_elder.jpg http://[server]/OD/Nantuko%20Elder.full.jpg -nantuko_husk.jpg http://[server]/10E/Nantuko%20Husk.full.jpg -nantuko_mentor.jpg http://[server]/OD/Nantuko%20Mentor.full.jpg -nantuko_monastery.jpg http://[server]/JU/Nantuko%20Monastery.full.jpg -nantuko_shade.jpg http://[server]/TO/Nantuko%20Shade.full.jpg -nantuko_shaman.jpg http://[server]/TSP/Nantuko%20Shaman.full.jpg -nantuko_shrine.jpg http://[server]/OD/Nantuko%20Shrine.full.jpg -nantuko_tracer.jpg http://[server]/JU/Nantuko%20Tracer.full.jpg -nantuko_vigilante.jpg http://[server]/LE/Nantuko%20Vigilante.full.jpg -narcissism.jpg http://[server]/TO/Narcissism.full.jpg -narcomoeba.jpg http://[server]/FUT/Narcomoeba.full.jpg -narrow_escape.jpg http://[server]/ZEN/Narrow%20Escape.full.jpg -narwhal.jpg http://[server]/HL/Narwhal.full.jpg -nath_of_the_gilt_leaf.jpg http://[server]/LRW/Nath%20of%20the%20Gilt-Leaf.full.jpg -naths_buffoon.jpg http://[server]/LRW/Nath's%20Buffoon.full.jpg -naths_elite.jpg http://[server]/LRW/Nath's%20Elite.full.jpg -natural_affinity.jpg http://[server]/9E/Natural%20Affinity.full.jpg -natural_balance.jpg http://[server]/MI/Natural%20Balance.full.jpg -natural_emergence.jpg http://[server]/PS/Natural%20Emergence.full.jpg -natural_order.jpg http://[server]/VI/Natural%20Order.full.jpg -natural_selection.jpg http://[server]/B/Natural%20Selection.full.jpg -natural_spring.jpg http://[server]/10E/Natural%20Spring.full.jpg -naturalize.jpg http://[server]/M10/Naturalize.full.jpg -natures_blessing.jpg http://[server]/AL/Nature's%20Blessing.full.jpg -natures_chosen.jpg http://[server]/AL/Nature's%20Chosen.full.jpg -natures_cloak.jpg http://[server]/ST/Nature's%20Cloak.full.jpg -natures_kiss.jpg http://[server]/WL/Nature's%20Kiss.full.jpg -natures_lore.jpg http://[server]/5E/Nature's%20Lore.full.jpg -natures_resurgence.jpg http://[server]/7E/Nature's%20Resurgence.full.jpg -natures_revolt.jpg http://[server]/7E/Nature's%20Revolt.full.jpg -natures_ruin.jpg http://[server]/PT/Nature's%20Ruin.full.jpg -natures_spiral.jpg http://[server]/M10/Nature's%20Spiral.full.jpg -natures_will.jpg http://[server]/CHK/Nature's%20Will.full.jpg -natures_wrath.jpg http://[server]/AL/Nature's%20Wrath.full.jpg -nausea.jpg http://[server]/8E/Nausea.full.jpg -naya_battlemage.jpg http://[server]/ALA/Naya%20Battlemage.full.jpg -naya_charm.jpg http://[server]/ALA/Naya%20Charm.full.jpg -naya_hushblade.jpg http://[server]/ARB/Naya%20Hushblade.full.jpg -naya_panorama.jpg http://[server]/ALA/Naya%20Panorama.full.jpg -naya_sojourners.jpg http://[server]/ARB/Naya%20Sojourners.full.jpg -nebuchadnezzar.jpg http://[server]/LG/Nebuchadnezzar.full.jpg -neck_snap.jpg http://[server]/LRW/Neck%20Snap.full.jpg -necra_disciple.jpg http://[server]/AP/Necra%20Disciple.full.jpg -necra_sanctuary.jpg http://[server]/AP/Necra%20Sanctuary.full.jpg -necratog.jpg http://[server]/WL/Necratog.full.jpg -necravolver.jpg http://[server]/AP/Necravolver.full.jpg -necrite.jpg http://[server]/5E/Necrite.full.jpg -necro_impotence.jpg http://[server]/UNH/Necro-Impotence.full.jpg -necrogen_mists.jpg http://[server]/MR/Necrogen%20Mists.full.jpg -necrogen_spellbomb.jpg http://[server]/MR/Necrogen%20Spellbomb.full.jpg -necrogenesis.jpg http://[server]/ALA/Necrogenesis.full.jpg -necrologia.jpg http://[server]/7E/Necrologia.full.jpg -necromancers_covenant.jpg http://[server]/ARB/Necromancer's%20Covenant.full.jpg -necromancers_magemark.jpg http://[server]/GP/Necromancer's%20Magemark.full.jpg -necromancy.jpg http://[server]/VI/Necromancy.full.jpg -necromantic_thirst.jpg http://[server]/RAV/Necromantic%20Thirst.full.jpg -necroplasm.jpg http://[server]/RAV/Necroplasm.full.jpg -necropolis.jpg http://[server]/DK/Necropolis.full.jpg -necropotence.jpg http://[server]/5E/Necropotence.full.jpg -necrosavant.jpg http://[server]/6E/Necrosavant.full.jpg -necroskitter.jpg http://[server]/EVE/Necroskitter.full.jpg -necrotic_sliver.jpg http://[server]/PLC/Necrotic%20Sliver.full.jpg -nectar_faerie.jpg http://[server]/LRW/Nectar%20Faerie.full.jpg -need_for_speed.jpg http://[server]/OD/Need%20for%20Speed.full.jpg -needle_drop.jpg http://[server]/LRW/Needle%20Drop.full.jpg -needle_specter.jpg http://[server]/EVE/Needle%20Specter.full.jpg -needle_storm.jpg http://[server]/9E/Needle%20Storm.full.jpg -needlebite_trap.jpg http://[server]/ZEN/Needlebite%20Trap.full.jpg -needlebug.jpg http://[server]/MR/Needlebug.full.jpg -needlepeak_spider.jpg http://[server]/PLC/Needlepeak%20Spider.full.jpg -needleshot_gourna.jpg http://[server]/LE/Needleshot%20Gourna.full.jpg -nefarious_lich.jpg http://[server]/OD/Nefarious%20Lich.full.jpg -nefashu.jpg http://[server]/SC/Nefashu.full.jpg -negate.jpg http://[server]/M10/Negate.full.jpg -neko_te.jpg http://[server]/BOK/Neko-Te.full.jpg -nekrataal.jpg http://[server]/10E/Nekrataal.full.jpg -nemata_grove_guardian.jpg http://[server]/PS/Nemata,%20Grove%20Guardian.full.jpg -nemesis_mask.jpg http://[server]/DS/Nemesis%20Mask.full.jpg -nemesis_of_reason.jpg http://[server]/ARB/Nemesis%20of%20Reason.full.jpg -nessian_courser.jpg http://[server]/FUT/Nessian%20Courser.full.jpg -nesting_wurm.jpg http://[server]/NE/Nesting%20Wurm.full.jpg -nether_shadow.jpg http://[server]/5E/Nether%20Shadow.full.jpg -nether_spirit.jpg http://[server]/MM/Nether%20Spirit.full.jpg -nether_traitor.jpg http://[server]/TSP/Nether%20Traitor.full.jpg -nether_void.jpg http://[server]/LG/Nether%20Void.full.jpg -netherborn_phalanx.jpg http://[server]/RAV/Netherborn%20Phalanx.full.jpg -netter_en_dal.jpg http://[server]/NE/Netter%20en-Dal.full.jpg -nettle_sentinel.jpg http://[server]/EVE/Nettle%20Sentinel.full.jpg -nettletooth_djinn.jpg http://[server]/MI/Nettletooth%20Djinn.full.jpg -nettlevine_blight.jpg http://[server]/LRW/Nettlevine%20Blight.full.jpg -nettling_curse.jpg http://[server]/DIS/Nettling%20Curse.full.jpg -nettling_imp.jpg http://[server]/U/Nettling%20Imp.full.jpg -neurok_familiar.jpg http://[server]/MR/Neurok%20Familiar.full.jpg -neurok_hoversail.jpg http://[server]/MR/Neurok%20Hoversail.full.jpg -neurok_prodigy.jpg http://[server]/DS/Neurok%20Prodigy.full.jpg -neurok_spy.jpg http://[server]/MR/Neurok%20Spy.full.jpg -neurok_stealthsuit.jpg http://[server]/FD/Neurok%20Stealthsuit.full.jpg -neurok_transmuter.jpg http://[server]/DS/Neurok%20Transmuter.full.jpg -neverending_torment.jpg http://[server]/SOK/Neverending%20Torment.full.jpg -nevermaker.jpg http://[server]/MOR/Nevermaker.full.jpg -nevinyrrals_disk.jpg http://[server]/5E/Nevinyrral's%20Disk.full.jpg -new_benalia.jpg http://[server]/FUT/New%20Benalia.full.jpg -new_frontiers.jpg http://[server]/OD/New%20Frontiers.full.jpg -nezumi_bone_reader.jpg http://[server]/CHK/Nezumi%20Bone-Reader.full.jpg -nezumi_cutthroat.jpg http://[server]/CHK/Nezumi%20Cutthroat.full.jpg -nezumi_graverobber.jpg http://[server]/CHK/Nezumi%20Graverobber.full.jpg -nezumi_ronin.jpg http://[server]/CHK/Nezumi%20Ronin.full.jpg -nezumi_shadow_watcher.jpg http://[server]/BOK/Nezumi%20Shadow-Watcher.full.jpg -nezumi_shortfang.jpg http://[server]/CHK/Nezumi%20Shortfang.full.jpg -niall_silvain.jpg http://[server]/DK/Niall%20Silvain.full.jpg -nicol_bolas.jpg http://[server]/LG/Nicol%20Bolas.full.jpg -nicol_bolas_planeswalker.jpg http://[server]/CFX/Nicol%20Bolas,%20Planeswalker.full.jpg -night_dealings.jpg http://[server]/CHK/Night%20Dealings.full.jpg -night_of_souls_betrayal.jpg http://[server]/CHK/Night%20of%20Souls'%20Betrayal.full.jpg -night_soil.jpg http://[server]/FE/Night%20Soil1.full.jpg -nightcreep.jpg http://[server]/DIS/Nightcreep.full.jpg -nightday.jpg http://[server]/AP/NightDay.full.jpg -nightguard_patrol.jpg http://[server]/RAV/Nightguard%20Patrol.full.jpg -nightmare.jpg http://[server]/M10/Nightmare.full.jpg -nightmare_incursion.jpg http://[server]/EVE/Nightmare%20Incursion.full.jpg -nightmare_lash.jpg http://[server]/MR/Nightmare%20Lash.full.jpg -nightmare_void.jpg http://[server]/RAV/Nightmare%20Void.full.jpg -nights_whisper.jpg http://[server]/FD/Night's%20Whisper.full.jpg -nightscape_apprentice.jpg http://[server]/IN/Nightscape%20Apprentice.full.jpg -nightscape_battlemage.jpg http://[server]/PS/Nightscape%20Battlemage.full.jpg -nightscape_familiar.jpg http://[server]/PS/Nightscape%20Familiar.full.jpg -nightscape_master.jpg http://[server]/IN/Nightscape%20Master.full.jpg -nightshade_assassin.jpg http://[server]/TSP/Nightshade%20Assassin.full.jpg -nightshade_schemers.jpg http://[server]/MOR/Nightshade%20Schemers.full.jpg -nightshade_seer.jpg http://[server]/UD/Nightshade%20Seer.full.jpg -nightshade_stinger.jpg http://[server]/LRW/Nightshade%20Stinger.full.jpg -nightsky_mimic.jpg http://[server]/EVE/Nightsky%20Mimic.full.jpg -nightsoil_kami.jpg http://[server]/SOK/Nightsoil%20Kami.full.jpg -nightstalker_engine.jpg http://[server]/P2/Nightstalker%20Engine.full.jpg -nightwind_glider.jpg http://[server]/MM/Nightwind%20Glider.full.jpg -nihilistic_glee.jpg http://[server]/DIS/Nihilistic%20Glee.full.jpg -nihilith.jpg http://[server]/FUT/Nihilith.full.jpg -nikko_onna.jpg http://[server]/SOK/Nikko-Onna.full.jpg -nim_abomination.jpg http://[server]/DS/Nim%20Abomination.full.jpg -nim_devourer.jpg http://[server]/MR/Nim%20Devourer.full.jpg -nim_grotesque.jpg http://[server]/FD/Nim%20Grotesque.full.jpg -nim_lasher.jpg http://[server]/MR/Nim%20Lasher.full.jpg -nim_replica.jpg http://[server]/MR/Nim%20Replica.full.jpg -nim_shambler.jpg http://[server]/MR/Nim%20Shambler.full.jpg -nim_shrieker.jpg http://[server]/MR/Nim%20Shrieker.full.jpg -nimana_sell_sword.jpg http://[server]/ZEN/Nimana%20Sell-Sword.full.jpg -nimble_mongoose.jpg http://[server]/OD/Nimble%20Mongoose.full.jpg -nimbus_maze.jpg http://[server]/FUT/Nimbus%20Maze.full.jpg -nimbus_wings.jpg http://[server]/ZEN/Nimbus%20Wings.full.jpg -nine_ringed_bo.jpg http://[server]/CHK/Nine-Ringed%20Bo.full.jpg -ninja_of_the_deep_hours.jpg http://[server]/BOK/Ninja%20of%20the%20Deep%20Hours.full.jpg -nip_gwyllion.jpg http://[server]/EVE/Nip%20Gwyllion.full.jpg -nissa_revane.jpg http://[server]/ZEN/Nissa%20Revane.full.jpg -nissas_chosen.jpg http://[server]/ZEN/Nissa's%20Chosen.full.jpg -niv_mizzet_the_firemind.jpg http://[server]/GP/Niv-Mizzet,%20the%20Firemind.full.jpg -niveous_wisps.jpg http://[server]/SHM/Niveous%20Wisps.full.jpg -nivix_aerie_of_the_firemind.jpg http://[server]/GP/Nivix,%20Aerie%20of%20the%20Firemind.full.jpg -nix.jpg http://[server]/FUT/Nix.full.jpg -no_dachi.jpg http://[server]/CHK/No-Dachi.full.jpg -no_mercy.jpg http://[server]/UL/No%20Mercy.full.jpg -no_quarter.jpg http://[server]/TE/No%20Quarter.full.jpg -no_rest_for_the_wicked.jpg http://[server]/10E/No%20Rest%20for%20the%20Wicked.full.jpg -nobilis_of_war.jpg http://[server]/EVE/Nobilis%20of%20War.full.jpg -noble_benefactor.jpg http://[server]/WL/Noble%20Benefactor.full.jpg -noble_elephant.jpg http://[server]/MI/Noble%20Elephant.full.jpg -noble_hierarch.jpg http://[server]/CFX/Noble%20Hierarch.full.jpg -noble_panther.jpg http://[server]/IN/Noble%20Panther.full.jpg -noble_purpose.jpg http://[server]/8E/Noble%20Purpose.full.jpg -noble_stand.jpg http://[server]/NE/Noble%20Stand.full.jpg -noble_steeds.jpg http://[server]/AL/Noble%20Steeds1.full.jpg -noble_templar.jpg http://[server]/SC/Noble%20Templar.full.jpg -noble_vestige.jpg http://[server]/ZEN/Noble%20Vestige.full.jpg -nocturnal_raid.jpg http://[server]/7E/Nocturnal%20Raid.full.jpg -noetic_scales.jpg http://[server]/US/Noetic%20Scales.full.jpg -noggin_whack.jpg http://[server]/MOR/Noggin%20Whack.full.jpg -noggle_bandit.jpg http://[server]/EVE/Noggle%20Bandit.full.jpg -noggle_bridgebreaker.jpg http://[server]/EVE/Noggle%20Bridgebreaker.full.jpg -noggle_hedge_mage.jpg http://[server]/EVE/Noggle%20Hedge-Mage.full.jpg -noggle_ransacker.jpg http://[server]/EVE/Noggle%20Ransacker.full.jpg -nomad_decoy.jpg http://[server]/OD/Nomad%20Decoy.full.jpg -nomad_mythmaker.jpg http://[server]/10E/Nomad%20Mythmaker.full.jpg -nomad_stadium.jpg http://[server]/OD/Nomad%20Stadium.full.jpg -nomadic_elf.jpg http://[server]/IN/Nomadic%20Elf.full.jpg -nomads_en_kor.jpg http://[server]/SH/Nomads%20en-Kor.full.jpg -norin_the_wary.jpg http://[server]/TSP/Norin%20the%20Wary.full.jpg -norritt.jpg http://[server]/IA/Norritt.full.jpg -north_star.jpg http://[server]/LG/North%20Star.full.jpg -northern_paladin.jpg http://[server]/7E/Northern%20Paladin.full.jpg -norwood_archers.jpg http://[server]/ST/Norwood%20Archers.full.jpg -norwood_priestess.jpg http://[server]/P2/Norwood%20Priestess.full.jpg -norwood_ranger.jpg http://[server]/9E/Norwood%20Ranger.full.jpg -norwood_riders.jpg http://[server]/P2/Norwood%20Riders.full.jpg -norwood_warrior.jpg http://[server]/P2/Norwood%20Warrior.full.jpg -nostalgic_dreams.jpg http://[server]/TO/Nostalgic%20Dreams.full.jpg -nosy_goblin.jpg http://[server]/ON/Nosy%20Goblin.full.jpg -notorious_assassin.jpg http://[server]/MM/Notorious%20Assassin.full.jpg -notorious_throng.jpg http://[server]/MOR/Notorious%20Throng.full.jpg -nourish.jpg http://[server]/DS/Nourish.full.jpg -nourishing_shoal.jpg http://[server]/BOK/Nourishing%20Shoal.full.jpg -nova_chaser.jpg http://[server]/LRW/Nova%20Chaser.full.jpg -nova_cleric.jpg http://[server]/ON/Nova%20Cleric.full.jpg -nova_pentacle.jpg http://[server]/LG/Nova%20Pentacle.full.jpg -novijen_heart_of_progress.jpg http://[server]/DIS/Novijen,%20Heart%20of%20Progress.full.jpg -novijen_sages.jpg http://[server]/DIS/Novijen%20Sages.full.jpg -now_i_know_my_abcs.jpg http://[server]/UNH/Now%20I%20Know%20My%20ABC's.full.jpg -noxious_field.jpg http://[server]/PY/Noxious%20Field.full.jpg -noxious_ghoul.jpg http://[server]/LE/Noxious%20Ghoul.full.jpg -noxious_hatchling.jpg http://[server]/EVE/Noxious%20Hatchling.full.jpg -noxious_toad.jpg http://[server]/PT/Noxious%20Toad.full.jpg -noxious_vapors.jpg http://[server]/PS/Noxious%20Vapors.full.jpg -nucklavee.jpg http://[server]/EVE/Nucklavee.full.jpg -nuisance_engine.jpg http://[server]/MR/Nuisance%20Engine.full.jpg -null_brooch.jpg http://[server]/EX/Null%20Brooch.full.jpg -null_chamber.jpg http://[server]/MI/Null%20Chamber.full.jpg -null_profusion.jpg http://[server]/PLC/Null%20Profusion.full.jpg -null_rod.jpg http://[server]/WL/Null%20Rod.full.jpg -nullmage_advocate.jpg http://[server]/JU/Nullmage%20Advocate.full.jpg -nullmage_shepherd.jpg http://[server]/RAV/Nullmage%20Shepherd.full.jpg -nullstone_gargoyle.jpg http://[server]/RAV/Nullstone%20Gargoyle.full.jpg -nulltread_gargantuan.jpg http://[server]/ARB/Nulltread%20Gargantuan.full.jpg -numai_outcast.jpg http://[server]/CHK/Numai%20Outcast.full.jpg -number_crunch.jpg http://[server]/UNH/Number%20Crunch.full.jpg -numot_the_devastator.jpg http://[server]/PLC/Numot,%20the%20Devastator.full.jpg -nurturer_initiate.jpg http://[server]/SHM/Nurturer%20Initiate.full.jpg -nurturing_licid.jpg http://[server]/TE/Nurturing%20Licid.full.jpg -nut_collector.jpg http://[server]/OD/Nut%20Collector.full.jpg -nyxathid.jpg http://[server]/CFX/Nyxathid.full.jpg \ No newline at end of file diff --git a/res/pics_link/card-pictures_o.txt b/res/pics_link/card-pictures_o.txt deleted file mode 100644 index 4a61286ad73..00000000000 --- a/res/pics_link/card-pictures_o.txt +++ /dev/null @@ -1,216 +0,0 @@ -o_naginata.jpg http://[server]/SOK/O-Naginata.full.jpg -oaken_brawler.jpg http://[server]/LRW/Oaken%20Brawler.full.jpg -oakenform.jpg http://[server]/M10/Oakenform.full.jpg -oakgnarl_warrior.jpg http://[server]/LRW/Oakgnarl%20Warrior.full.jpg -oasis.jpg http://[server]/AN/Oasis.full.jpg -oath_of_druids.jpg http://[server]/EX/Oath%20of%20Druids.full.jpg -oath_of_ghouls.jpg http://[server]/EX/Oath%20of%20Ghouls.full.jpg -oath_of_lieges.jpg http://[server]/EX/Oath%20of%20Lieges.full.jpg -oath_of_lim_dul.jpg http://[server]/IA/Oath%20of%20Lim-Dul.full.jpg -oath_of_mages.jpg http://[server]/EX/Oath%20of%20Mages.full.jpg -oath_of_scholars.jpg http://[server]/EX/Oath%20of%20Scholars.full.jpg -oathkeeper_takenos_daisho.jpg http://[server]/CHK/Oathkeeper,%20Takeno's%20Daisho.full.jpg -oathsworn_giant.jpg http://[server]/RAV/Oathsworn%20Giant.full.jpg -ob_nixilis_the_fallen.jpg http://[server]/ZEN/Ob%20Nixilis,%20the%20Fallen.full.jpg -obelisk_of_alara.jpg http://[server]/CFX/Obelisk%20of%20Alara.full.jpg -obelisk_of_bant.jpg http://[server]/ALA/Obelisk%20of%20Bant.full.jpg -obelisk_of_esper.jpg http://[server]/ALA/Obelisk%20of%20Esper.full.jpg -obelisk_of_grixis.jpg http://[server]/ALA/Obelisk%20of%20Grixis.full.jpg -obelisk_of_jund.jpg http://[server]/ALA/Obelisk%20of%20Jund.full.jpg -obelisk_of_naya.jpg http://[server]/ALA/Obelisk%20of%20Naya.full.jpg -obelisk_of_undoing.jpg http://[server]/5E/Obelisk%20of%20Undoing.full.jpg -oblation.jpg http://[server]/ON/Oblation.full.jpg -obliterate.jpg http://[server]/8E/Obliterate.full.jpg -oblivion_crown.jpg http://[server]/FUT/Oblivion%20Crown.full.jpg -oblivion_ring.jpg http://[server]/ALA/Oblivion%20Ring.full.jpg -oblivion_stone.jpg http://[server]/MR/Oblivion%20Stone.full.jpg -oboro_breezecaller.jpg http://[server]/SOK/Oboro%20Breezecaller.full.jpg -oboro_envoy.jpg http://[server]/SOK/Oboro%20Envoy.full.jpg -oboro_palace_in_the_clouds.jpg http://[server]/SOK/Oboro,%20Palace%20in%20the%20Clouds.full.jpg -obsessive_search.jpg http://[server]/TO/Obsessive%20Search.full.jpg -obsianus_golem.jpg http://[server]/6E/Obsianus%20Golem.full.jpg -obsidian_acolyte.jpg http://[server]/IN/Obsidian%20Acolyte.full.jpg -obsidian_battle_axe.jpg http://[server]/MOR/Obsidian%20Battle-Axe.full.jpg -obsidian_fireheart.jpg http://[server]/ZEN/Obsidian%20Fireheart.full.jpg -obsidian_giant.jpg http://[server]/P2/Obsidian%20Giant.full.jpg -obstinate_familiar.jpg http://[server]/OD/Obstinate%20Familiar.full.jpg -ocular_halo.jpg http://[server]/DIS/Ocular%20Halo.full.jpg -oddsends.jpg http://[server]/DIS/OddsEnds.full.jpg -odious_trow.jpg http://[server]/EVE/Odious%20Trow.full.jpg -odylic_wraith.jpg http://[server]/WL/Odylic%20Wraith.full.jpg -off_balance.jpg http://[server]/NE/Off%20Balance.full.jpg -offalsnout.jpg http://[server]/MOR/Offalsnout.full.jpg -offering_to_asha.jpg http://[server]/ARB/Offering%20to%20Asha.full.jpg -ogre_arsonist.jpg http://[server]/P2/Ogre%20Arsonist.full.jpg -ogre_berserker.jpg http://[server]/P2/Ogre%20Berserker.full.jpg -ogre_enforcer.jpg http://[server]/VI/Ogre%20Enforcer.full.jpg -ogre_gatecrasher.jpg http://[server]/DIS/Ogre%20Gatecrasher.full.jpg -ogre_leadfoot.jpg http://[server]/MR/Ogre%20Leadfoot.full.jpg -ogre_marauder.jpg http://[server]/BOK/Ogre%20Marauder.full.jpg -ogre_recluse.jpg http://[server]/BOK/Ogre%20Recluse.full.jpg -ogre_savant.jpg http://[server]/GP/Ogre%20Savant.full.jpg -ogre_shaman.jpg http://[server]/EX/Ogre%20Shaman.full.jpg -ogre_taskmaster.jpg http://[server]/9E/Ogre%20Taskmaster.full.jpg -ogre_warrior.jpg http://[server]/ST/Ogre%20Warrior.full.jpg -ohran_viper.jpg http://[server]/CS/Ohran%20Viper.full.jpg -ohran_yeti.jpg http://[server]/CS/Ohran%20Yeti.full.jpg -okiba_gang_shinobi.jpg http://[server]/BOK/Okiba-Gang%20Shinobi.full.jpg -okina_nightwatch.jpg http://[server]/SOK/Okina%20Nightwatch.full.jpg -okina_temple_to_the_grandfathers.jpg http://[server]/CHK/Okina,%20Temple%20to%20the%20Grandfathers.full.jpg -okk.jpg http://[server]/8E/Okk.full.jpg -old_fogey.jpg http://[server]/UNH/Old%20Fogey.full.jpg -old_ghastbark.jpg http://[server]/SHM/Old%20Ghastbark.full.jpg -old_man_of_the_sea.jpg http://[server]/AN/Old%20Man%20of%20the%20Sea.full.jpg -omega_myr.jpg http://[server]/MR/Omega%20Myr.full.jpg -omen.jpg http://[server]/PT/Omen.full.jpg -omen_of_fire.jpg http://[server]/AL/Omen%20of%20Fire.full.jpg -omnibian.jpg http://[server]/DIS/Omnibian.full.jpg -once_more_with_feeling.jpg http://[server]/UG/Once%20More%20with%20Feeling.full.jpg -ondu_cleric.jpg http://[server]/ZEN/Ondu%20Cleric.full.jpg -one_dozen_eyes.jpg http://[server]/MR/One%20Dozen%20Eyes.full.jpg -one_with_nature.jpg http://[server]/SC/One%20with%20Nature.full.jpg -one_with_nothing.jpg http://[server]/SOK/One%20with%20Nothing.full.jpg -oni_of_wild_places.jpg http://[server]/SOK/Oni%20of%20Wild%20Places.full.jpg -oni_possession.jpg http://[server]/CHK/Oni%20Possession.full.jpg -onslaught.jpg http://[server]/EX/Onslaught.full.jpg -onulet.jpg http://[server]/4E/Onulet.full.jpg -onyx_goblet.jpg http://[server]/ALA/Onyx%20Goblet.full.jpg -onyx_talisman.jpg http://[server]/IA/Onyx%20Talisman.full.jpg -oona_queen_of_the_fae.jpg http://[server]/SHM/Oona,%20Queen%20of%20the%20Fae.full.jpg -oonas_blackguard.jpg http://[server]/MOR/Oona's%20Blackguard.full.jpg -oonas_gatewarden.jpg http://[server]/SHM/Oona's%20Gatewarden.full.jpg -oonas_grace.jpg http://[server]/EVE/Oona's%20Grace.full.jpg -oonas_prowler.jpg http://[server]/LRW/Oona's%20Prowler.full.jpg -ooze_garden.jpg http://[server]/ALA/Ooze%20Garden.full.jpg -opal_acrolith.jpg http://[server]/US/Opal%20Acrolith.full.jpg -opal_archangel.jpg http://[server]/US/Opal%20Archangel.full.jpg -opal_avenger.jpg http://[server]/UL/Opal%20Avenger.full.jpg -opal_caryatid.jpg http://[server]/US/Opal%20Caryatid.full.jpg -opal_champion.jpg http://[server]/UL/Opal%20Champion.full.jpg -opal_eye_kondas_yojimbo.jpg http://[server]/BOK/Opal-Eye,%20Konda's%20Yojimbo.full.jpg -opal_gargoyle.jpg http://[server]/US/Opal%20Gargoyle.full.jpg -opal_guardian.jpg http://[server]/TSP/Opal%20Guardian.full.jpg -opal_titan.jpg http://[server]/US/Opal%20Titan.full.jpg -opalescence.jpg http://[server]/UD/Opalescence.full.jpg -opaline_bracers.jpg http://[server]/FD/Opaline%20Bracers.full.jpg -opaline_sliver.jpg http://[server]/TSP/Opaline%20Sliver.full.jpg -open_the_vaults.jpg http://[server]/M10/Open%20the%20Vaults.full.jpg -ophidian.jpg http://[server]/WL/Ophidian.full.jpg -ophidian_eye.jpg http://[server]/TSP/Ophidian%20Eye.full.jpg -opportunist.jpg http://[server]/TE/Opportunist.full.jpg -opportunity.jpg http://[server]/7E/Opportunity.full.jpg -opposition.jpg http://[server]/7E/Opposition.full.jpg -oppression.jpg http://[server]/7E/Oppression.full.jpg -oppressive_will.jpg http://[server]/SOK/Oppressive%20Will.full.jpg -opt.jpg http://[server]/IN/Opt.full.jpg -oracle.jpg http://[server]/VG/Oracle.full.jpg -oracle_en_vec.jpg http://[server]/TE/Oracle%20en-Vec.full.jpg -oracle_of_mul_daya.jpg http://[server]/ZEN/Oracle%20of%20Mul%20Daya.full.jpg -oracle_of_nectars.jpg http://[server]/SHM/Oracle%20of%20Nectars.full.jpg -oracles_attendants.jpg http://[server]/9E/Oracle's%20Attendants.full.jpg -oran_rief_recluse.jpg http://[server]/ZEN/Oran-Rief%20Recluse.full.jpg -oran_rief_survivalist.jpg http://[server]/ZEN/Oran-Rief%20Survivalist.full.jpg -oran_rief_the_vastwood.jpg http://[server]/ZEN/Oran-Rief,%20the%20Vastwood.full.jpg -oraxid.jpg http://[server]/NE/Oraxid.full.jpg -orb_of_dreams.jpg http://[server]/BOK/Orb%20of%20Dreams.full.jpg -orbweaver_kumo.jpg http://[server]/CHK/Orbweaver%20Kumo.full.jpg -orc_general.jpg http://[server]/DK/Orc%20General.full.jpg -orchard_warden.jpg http://[server]/MOR/Orchard%20Warden.full.jpg -orcish_artillery.jpg http://[server]/10E/Orcish%20Artillery.full.jpg -orcish_bloodpainter.jpg http://[server]/CS/Orcish%20Bloodpainter.full.jpg -orcish_cannonade.jpg http://[server]/TSP/Orcish%20Cannonade.full.jpg -orcish_cannoneers.jpg http://[server]/DM/Orcish%20Cannoneers.full.jpg -orcish_captain.jpg http://[server]/5E/Orcish%20Captain.full.jpg -orcish_conscripts.jpg http://[server]/5E/Orcish%20Conscripts.full.jpg -orcish_farmer.jpg http://[server]/5E/Orcish%20Farmer.full.jpg -orcish_healer.jpg http://[server]/CST/Orcish%20Healer.full.jpg -orcish_librarian.jpg http://[server]/IA/Orcish%20Librarian.full.jpg -orcish_lumberjack.jpg http://[server]/CST/Orcish%20Lumberjack.full.jpg -orcish_mechanics.jpg http://[server]/AQ/Orcish%20Mechanics.full.jpg -orcish_mine.jpg http://[server]/HL/Orcish%20Mine.full.jpg -orcish_oriflamme.jpg http://[server]/7E/Orcish%20Oriflamme.full.jpg -orcish_paratroopers.jpg http://[server]/UNH/Orcish%20Paratroopers.full.jpg -orcish_settlers.jpg http://[server]/WL/Orcish%20Settlers.full.jpg -orcish_spy.jpg http://[server]/8E/Orcish%20Spy.full.jpg -orcish_squatters.jpg http://[server]/5E/Orcish%20Squatters.full.jpg -orcish_veteran.jpg http://[server]/FE/Orcish%20Veteran1.full.jpg -order_chaos.jpg http://[server]/HOP/Order%20Chaos.full.jpg -order_of_leitbur.jpg http://[server]/FE/Order%20of%20Leitbur1.full.jpg -order_of_the_ebon_hand.jpg http://[server]/FE/Order%20of%20the%20Ebon%20Hand1.full.jpg -order_of_the_golden_cricket.jpg http://[server]/MOR/Order%20of%20the%20Golden%20Cricket.full.jpg -order_of_the_sacred_bell.jpg http://[server]/CHK/Order%20of%20the%20Sacred%20Bell.full.jpg -order_of_the_sacred_torch.jpg http://[server]/6E/Order%20of%20the%20Sacred%20Torch.full.jpg -order_of_the_stars.jpg http://[server]/GP/Order%20of%20the%20Stars.full.jpg -order_of_the_white_shield.jpg http://[server]/5E/Order%20of%20the%20White%20Shield.full.jpg -order_of_whiteclay.jpg http://[server]/SHM/Order%20of%20Whiteclay.full.jpg -order_of_yawgmoth.jpg http://[server]/US/Order%20of%20Yawgmoth.full.jpg -orderchaos.jpg http://[server]/AP/OrderChaos.full.jpg -ordered_migration.jpg http://[server]/IN/Ordered%20Migration.full.jpg -ordruun_commando.jpg http://[server]/RAV/Ordruun%20Commando.full.jpg -ore_gorger.jpg http://[server]/CHK/Ore%20Gorger.full.jpg -organ_grinder.jpg http://[server]/TO/Organ%20Grinder.full.jpg -organ_harvest.jpg http://[server]/UG/Organ%20Harvest.full.jpg -orgg.jpg http://[server]/5E/Orgg.full.jpg -orim.jpg http://[server]/VG/Orim.full.jpg -orim_samite_healer.jpg http://[server]/TE/Orim,%20Samite%20Healer.full.jpg -orims_chant.jpg http://[server]/PS/Orim's%20Chant.full.jpg -orims_cure.jpg http://[server]/MM/Orim's%20Cure.full.jpg -orims_prayer.jpg http://[server]/TE/Orim's%20Prayer.full.jpg -orims_thunder.jpg http://[server]/AP/Orim's%20Thunder.full.jpg -orims_touch.jpg http://[server]/IN/Orim's%20Touch.full.jpg -oriss_samite_guardian.jpg http://[server]/FUT/Oriss,%20Samite%20Guardian.full.jpg -ornate_kanzashi.jpg http://[server]/BOK/Ornate%20Kanzashi.full.jpg -ornithopter.jpg http://[server]/M10/Ornithopter.full.jpg -orochi_eggwatcher.jpg http://[server]/CHK/Orochi%20Eggwatcher.full.jpg -orochi_hatchery.jpg http://[server]/CHK/Orochi%20Hatchery.full.jpg -orochi_leafcaller.jpg http://[server]/CHK/Orochi%20Leafcaller.full.jpg -orochi_ranger.jpg http://[server]/CHK/Orochi%20Ranger.full.jpg -orochi_sustainer.jpg http://[server]/CHK/Orochi%20Sustainer.full.jpg -oros_the_avenger.jpg http://[server]/PLC/Oros,%20the%20Avenger.full.jpg -orzhov_basilica.jpg http://[server]/GP/Orzhov%20Basilica.full.jpg -orzhov_euthanist.jpg http://[server]/GP/Orzhov%20Euthanist.full.jpg -orzhov_guildmage.jpg http://[server]/GP/Orzhov%20Guildmage.full.jpg -orzhov_pontiff.jpg http://[server]/GP/Orzhov%20Pontiff.full.jpg -orzhov_signet.jpg http://[server]/GP/Orzhov%20Signet.full.jpg -orzhova_the_church_of_deals.jpg http://[server]/GP/Orzhova,%20the%20Church%20of%20Deals.full.jpg -osai_vultures.jpg http://[server]/LG/Osai%20Vultures.full.jpg -ostiary_thrull.jpg http://[server]/GP/Ostiary%20Thrull.full.jpg -ostracize.jpg http://[server]/7E/Ostracize.full.jpg -otarian_juggernaut.jpg http://[server]/OD/Otarian%20Juggernaut.full.jpg -otherworldly_journey.jpg http://[server]/CHK/Otherworldly%20Journey.full.jpg -oubliette.jpg http://[server]/AN/Oubliette1.full.jpg -ouphe_vandals.jpg http://[server]/FD/Ouphe%20Vandals.full.jpg -our_market_research.jpg http://[server]/UNH/Our%20Market%20Research.full.jpg -outbreak.jpg http://[server]/PY/Outbreak.full.jpg -outmaneuver.jpg http://[server]/US/Outmaneuver.full.jpg -outrage_shaman.jpg http://[server]/EVE/Outrage%20Shaman.full.jpg -outrider_en_kor.jpg http://[server]/TSP/Outrider%20en-Kor.full.jpg -outrider_of_jhess.jpg http://[server]/ALA/Outrider%20of%20Jhess.full.jpg -overabundance.jpg http://[server]/IN/Overabundance.full.jpg -overbeing_of_myth.jpg http://[server]/EVE/Overbeing%20of%20Myth.full.jpg -overblaze.jpg http://[server]/BOK/Overblaze.full.jpg -overburden.jpg http://[server]/PY/Overburden.full.jpg -overeager_apprentice.jpg http://[server]/OD/Overeager%20Apprentice.full.jpg -overgrown_estate.jpg http://[server]/AP/Overgrown%20Estate.full.jpg -overgrown_tomb.jpg http://[server]/RAV/Overgrown%20Tomb.full.jpg -overgrowth.jpg http://[server]/10E/Overgrowth.full.jpg -overlaid_terrain.jpg http://[server]/NE/Overlaid%20Terrain.full.jpg -overload.jpg http://[server]/IN/Overload.full.jpg -overmaster.jpg http://[server]/TO/Overmaster.full.jpg -override.jpg http://[server]/MR/Override.full.jpg -overrule.jpg http://[server]/DIS/Overrule.full.jpg -overrun.jpg http://[server]/M10/Overrun.full.jpg -oversold_cemetery.jpg http://[server]/ON/Oversold%20Cemetery.full.jpg -oversoul_of_dusk.jpg http://[server]/SHM/Oversoul%20of%20Dusk.full.jpg -overtaker.jpg http://[server]/MM/Overtaker.full.jpg -overwhelm.jpg http://[server]/RAV/Overwhelm.full.jpg -overwhelming_forces.jpg http://[server]/P3/Overwhelming%20Forces.full.jpg -overwhelming_instinct.jpg http://[server]/ON/Overwhelming%20Instinct.full.jpg -overwhelming_intellect.jpg http://[server]/SOK/Overwhelming%20Intellect.full.jpg -ovinize.jpg http://[server]/PLC/Ovinize.full.jpg -ovinomancer.jpg http://[server]/VI/Ovinomancer.full.jpg -ow.jpg http://[server]/UG/Ow.full.jpg -owl_familiar.jpg http://[server]/PT/Owl%20Familiar.full.jpg -oxidda_golem.jpg http://[server]/DS/Oxidda%20Golem.full.jpg -oxidize.jpg http://[server]/DS/Oxidize.full.jpg -oyobi_who_split_the_heavens.jpg http://[server]/BOK/Oyobi,%20Who%20Split%20the%20Heavens.full.jpg \ No newline at end of file diff --git a/res/pics_link/card-pictures_other.txt b/res/pics_link/card-pictures_other.txt deleted file mode 100644 index 64dbaed7cfe..00000000000 --- a/res/pics_link/card-pictures_other.txt +++ /dev/null @@ -1,43 +0,0 @@ -forest.jpg http://[server]/UG/Forest.full.jpg -forest1.jpg http://[server]/9E/Forest1.full.jpg -forest2.jpg http://[server]/10E/Forest2.full.jpg -forest3.jpg http://[server]/10E/Forest3.full.jpg -island.jpg http://[server]/UG/Island.full.jpg -island1.jpg http://[server]/10E/Island1.full.jpg -island2.jpg http://[server]/10E/Island2.full.jpg -island3.jpg http://[server]/10E/Island3.full.jpg -mountain.jpg http://[server]/UG/Mountain.full.jpg -mountain1.jpg http://[server]/10E/Mountain1.full.jpg -mountain2.jpg http://[server]/10E/Mountain2.full.jpg -mountain3.jpg http://[server]/10E/Mountain3.full.jpg -plains.jpg http://[server]/UG/Plains.full.jpg -plains1.jpg http://[server]/10E/Plains1.full.jpg -plains2.jpg http://[server]/10E/Plains2.full.jpg -plains3.jpg http://[server]/10E/Plains3.full.jpg -swamp.jpg http://[server]/UG/Swamp.full.jpg -swamp1.jpg http://[server]/10E/Swamp1.full.jpg -swamp2.jpg http://[server]/10E/Swamp2.full.jpg -swamp3.jpg http://[server]/10E/Swamp3.full.jpg -snow_covered_forest.jpg http://[server]/CS/Snow-Covered%20Forest.full.jpg -snow_covered_forest1.jpg http://[server]/CS/Snow-Covered%20Forest.full.jpg -snow_covered_forest2.jpg http://[server]/IA/Snow-Covered%20Forest.full.jpg -snow_covered_forest3.jpg http://[server]/IA/Snow-Covered%20Forest.full.jpg -snow_covered_island.jpg http://[server]/CS/Snow-Covered%20Island.full.jpg -snow_covered_island1.jpg http://[server]/CS/Snow-Covered%20Island.full.jpg -snow_covered_island2.jpg http://[server]/IA/Snow-Covered%20Island.full.jpg -snow_covered_island3.jpg http://[server]/IA/Snow-Covered%20Island.full.jpg -snow_covered_mountain.jpg http://[server]/CS/Snow-Covered%20Mountain.full.jpg -snow_covered_mountain1.jpg http://[server]/CS/Snow-Covered%20Mountain.full.jpg -snow_covered_mountain2.jpg http://[server]/IA/Snow-Covered%20Mountain.full.jpg -snow_covered_mountain3.jpg http://[server]/IA/Snow-Covered%20Mountain.full.jpg -snow_covered_plains.jpg http://[server]/CS/Snow-Covered%20Plains.full.jpg -snow_covered_plains1.jpg http://[server]/CS/Snow-Covered%20Plains.full.jpg -snow_covered_plains2.jpg http://[server]/IA/Snow-Covered%20Plains.full.jpg -snow_covered_plains3.jpg http://[server]/IA/Snow-Covered%20Plains.full.jpg -snow_covered_swamp.jpg http://[server]/CS/Snow-Covered%20Swamp.full.jpg -snow_covered_swamp1.jpg http://[server]/CS/Snow-Covered%20Swamp.full.jpg -snow_covered_swamp2.jpg http://[server]/IA/Snow-Covered%20Swamp.full.jpg -snow_covered_swamp3.jpg http://[server]/IA/Snow-Covered%20Swamp.full.jpg -_____.jpg http://[server]/UNH/_____.full.jpg -snow_devil.jpg http://[server]/IA/Snow%20Devil.full.jpg -1996_world_champion.jpg http://[server]/PR/1996%20World%20Champion.full.jpg diff --git a/res/pics_link/card-pictures_p.txt b/res/pics_link/card-pictures_p.txt deleted file mode 100644 index c150584f398..00000000000 --- a/res/pics_link/card-pictures_p.txt +++ /dev/null @@ -1,550 +0,0 @@ -pacifism.jpg http://[server]/M10/Pacifism.full.jpg -pack_hunt.jpg http://[server]/NE/Pack%20Hunt.full.jpg -packs_disdain.jpg http://[server]/MOR/Pack's%20Disdain.full.jpg -pact_of_negation.jpg http://[server]/FUT/Pact%20of%20Negation.full.jpg -pact_of_the_titan.jpg http://[server]/FUT/Pact%20of%20the%20Titan.full.jpg -pain_kami.jpg http://[server]/CHK/Pain%20Kami.full.jpg -pain_magnification.jpg http://[server]/DIS/Pain%20Magnification.full.jpg -painbringer.jpg http://[server]/OD/Painbringer.full.jpg -painful_memories.jpg http://[server]/MI/Painful%20Memories.full.jpg -pains_reward.jpg http://[server]/SOK/Pain's%20Reward.full.jpg -painsuffering.jpg http://[server]/IN/PainSuffering.full.jpg -painters_servant.jpg http://[server]/SHM/Painter's%20Servant.full.jpg -painwracker_oni.jpg http://[server]/CHK/Painwracker%20Oni.full.jpg -palace_guard.jpg http://[server]/M10/Palace%20Guard.full.jpg -paladin_en_vec.jpg http://[server]/10E/Paladin%20en-Vec.full.jpg -paladin_of_prahv.jpg http://[server]/DIS/Paladin%20of%20Prahv.full.jpg -pale_bears.jpg http://[server]/IA/Pale%20Bears.full.jpg -pale_moon.jpg http://[server]/NE/Pale%20Moon.full.jpg -pale_recluse.jpg http://[server]/ARB/Pale%20Recluse.full.jpg -pale_wayfarer.jpg http://[server]/SHM/Pale%20Wayfarer.full.jpg -paleoloth.jpg http://[server]/CFX/Paleoloth.full.jpg -palinchron.jpg http://[server]/UL/Palinchron.full.jpg -palladia_mors.jpg http://[server]/LG/Palladia-Mors.full.jpg -palliation_accord.jpg http://[server]/DIS/Palliation%20Accord.full.jpg -pallid_mycoderm.jpg http://[server]/PLC/Pallid%20Mycoderm.full.jpg -pallimud.jpg http://[server]/TE/Pallimud.full.jpg -panacea.jpg http://[server]/MM/Panacea.full.jpg -pandemonium.jpg http://[server]/EX/Pandemonium.full.jpg -pang_tong_young_phoenix.jpg http://[server]/P3/Pang%20Tong,%20Young%20Phoenix.full.jpg -panglacial_wurm.jpg http://[server]/CS/Panglacial%20Wurm.full.jpg -pangosaur.jpg http://[server]/MM/Pangosaur.full.jpg -panic.jpg http://[server]/5E/Panic.full.jpg -panic_attack.jpg http://[server]/M10/Panic%20Attack.full.jpg -panoptic_mirror.jpg http://[server]/DS/Panoptic%20Mirror.full.jpg -panther_warriors.jpg http://[server]/6E/Panther%20Warriors.full.jpg -paper_tiger.jpg http://[server]/UG/Paper%20Tiger.full.jpg -paperfin_rascal.jpg http://[server]/LRW/Paperfin%20Rascal.full.jpg -paradigm_shift.jpg http://[server]/WL/Paradigm%20Shift.full.jpg -paradise_mantle.jpg http://[server]/FD/Paradise%20Mantle.full.jpg -paradise_plume.jpg http://[server]/TSP/Paradise%20Plume.full.jpg -paradox_haze.jpg http://[server]/TSP/Paradox%20Haze.full.jpg -paragon_of_the_amesha.jpg http://[server]/CFX/Paragon%20of%20the%20Amesha.full.jpg -parallax_dementia.jpg http://[server]/NE/Parallax%20Dementia.full.jpg -parallax_inhibitor.jpg http://[server]/NE/Parallax%20Inhibitor.full.jpg -parallax_nexus.jpg http://[server]/NE/Parallax%20Nexus.full.jpg -parallax_tide.jpg http://[server]/NE/Parallax%20Tide.full.jpg -parallax_wave.jpg http://[server]/NE/Parallax%20Wave.full.jpg -parallectric_feedback.jpg http://[server]/GP/Parallectric%20Feedback.full.jpg -parallel_evolution.jpg http://[server]/TO/Parallel%20Evolution.full.jpg -parallel_thoughts.jpg http://[server]/SC/Parallel%20Thoughts.full.jpg -paralyze.jpg http://[server]/5E/Paralyze.full.jpg -paralyzing_grasp.jpg http://[server]/ZEN/Paralyzing%20Grasp.full.jpg -parapet.jpg http://[server]/VI/Parapet.full.jpg -parapet_watchers.jpg http://[server]/SHM/Parapet%20Watchers.full.jpg -parasitic_bond.jpg http://[server]/US/Parasitic%20Bond.full.jpg -parasitic_strix.jpg http://[server]/CFX/Parasitic%20Strix.full.jpg -parch.jpg http://[server]/UL/Parch.full.jpg -pardic_arsonist.jpg http://[server]/TO/Pardic%20Arsonist.full.jpg -pardic_collaborator.jpg http://[server]/TO/Pardic%20Collaborator.full.jpg -pardic_dragon.jpg http://[server]/TSP/Pardic%20Dragon.full.jpg -pardic_firecat.jpg http://[server]/OD/Pardic%20Firecat.full.jpg -pardic_lancer.jpg http://[server]/TO/Pardic%20Lancer.full.jpg -pardic_miner.jpg http://[server]/OD/Pardic%20Miner.full.jpg -pardic_swordsmith.jpg http://[server]/OD/Pardic%20Swordsmith.full.jpg -pariah.jpg http://[server]/10E/Pariah.full.jpg -pariahs_shield.jpg http://[server]/RAV/Pariah's%20Shield.full.jpg -paroxysm.jpg http://[server]/EX/Paroxysm.full.jpg -part_the_veil.jpg http://[server]/CHK/Part%20the%20Veil.full.jpg -part_water.jpg http://[server]/LG/Part%20Water.full.jpg -patagia_golem.jpg http://[server]/8E/Patagia%20Golem.full.jpg -patagia_viper.jpg http://[server]/DIS/Patagia%20Viper.full.jpg -patchwork_gnomes.jpg http://[server]/OD/Patchwork%20Gnomes.full.jpg -path_of_angers_flame.jpg http://[server]/SOK/Path%20of%20Anger's%20Flame.full.jpg -path_of_peace.jpg http://[server]/US/Path%20of%20Peace.full.jpg -path_to_exile.jpg http://[server]/CFX/Path%20to%20Exile.full.jpg -patriarchs_bidding.jpg http://[server]/ON/Patriarch's%20Bidding.full.jpg -patriarchs_desire.jpg http://[server]/OD/Patriarch's%20Desire.full.jpg -patricians_scorn.jpg http://[server]/FUT/Patrician's%20Scorn.full.jpg -patrol_hound.jpg http://[server]/OD/Patrol%20Hound.full.jpg -patrol_signaler.jpg http://[server]/EVE/Patrol%20Signaler.full.jpg -patron_of_the_akki.jpg http://[server]/BOK/Patron%20of%20the%20Akki.full.jpg -patron_of_the_kitsune.jpg http://[server]/BOK/Patron%20of%20the%20Kitsune.full.jpg -patron_of_the_moon.jpg http://[server]/BOK/Patron%20of%20the%20Moon.full.jpg -patron_of_the_nezumi.jpg http://[server]/BOK/Patron%20of%20the%20Nezumi.full.jpg -patron_of_the_orochi.jpg http://[server]/BOK/Patron%20of%20the%20Orochi.full.jpg -patron_of_the_wild.jpg http://[server]/LE/Patron%20of%20the%20Wild.full.jpg -patron_wizard.jpg http://[server]/OD/Patron%20Wizard.full.jpg -pattern_of_rebirth.jpg http://[server]/UD/Pattern%20of%20Rebirth.full.jpg -paupers_cage.jpg http://[server]/MI/Paupers'%20Cage.full.jpg -pavel_maliki.jpg http://[server]/LG/Pavel%20Maliki.full.jpg -pay_no_heed.jpg http://[server]/TO/Pay%20No%20Heed.full.jpg -peace_and_quiet.jpg http://[server]/UL/Peace%20and%20Quiet.full.jpg -peace_of_mind.jpg http://[server]/9E/Peace%20of%20Mind.full.jpg -peace_talks.jpg http://[server]/VI/Peace%20Talks.full.jpg -peacekeeper.jpg http://[server]/WL/Peacekeeper.full.jpg -peach_garden_oath.jpg http://[server]/8E/Peach%20Garden%20Oath.full.jpg -pearl_dragon.jpg http://[server]/6E/Pearl%20Dragon.full.jpg -pearl_medallion.jpg http://[server]/TE/Pearl%20Medallion.full.jpg -pearl_shard.jpg http://[server]/MR/Pearl%20Shard.full.jpg -pearled_unicorn.jpg http://[server]/5E/Pearled%20Unicorn.full.jpg -pearlspear_courier.jpg http://[server]/ON/Pearlspear%20Courier.full.jpg -peat_bog.jpg http://[server]/MM/Peat%20Bog.full.jpg -pedantic_learning.jpg http://[server]/OD/Pedantic%20Learning.full.jpg -peek.jpg http://[server]/10E/Peek.full.jpg -peel_from_reality.jpg http://[server]/RAV/Peel%20From%20Reality.full.jpg -peer_pressure.jpg http://[server]/ON/Peer%20Pressure.full.jpg -peer_through_depths.jpg http://[server]/CHK/Peer%20Through%20Depths.full.jpg -pegasus.jpg http://[server]/AT/Pegasus.full.jpg -pegasus_charger.jpg http://[server]/9E/Pegasus%20Charger.full.jpg -pegasus_refuge.jpg http://[server]/TE/Pegasus%20Refuge.full.jpg -pegasus_stampede.jpg http://[server]/AT/Pegasus%20Stampede.full.jpg -pemmins_aura.jpg http://[server]/SC/Pemmin's%20Aura.full.jpg -penance.jpg http://[server]/EX/Penance.full.jpg -pendelhaven.jpg http://[server]/LG/Pendelhaven.full.jpg -pendelhaven_elder.jpg http://[server]/TSP/Pendelhaven%20Elder.full.jpg -pendrell_drake.jpg http://[server]/US/Pendrell%20Drake.full.jpg -pendrell_flux.jpg http://[server]/US/Pendrell%20Flux.full.jpg -pendrell_mists.jpg http://[server]/WL/Pendrell%20Mists.full.jpg -pentad_prism.jpg http://[server]/FD/Pentad%20Prism.full.jpg -pentagram_of_the_ages.jpg http://[server]/6E/Pentagram%20of%20the%20Ages.full.jpg -pentarch_paladin.jpg http://[server]/TSP/Pentarch%20Paladin.full.jpg -pentarch_ward.jpg http://[server]/TSP/Pentarch%20Ward.full.jpg -pentavus.jpg http://[server]/MR/Pentavus.full.jpg -penumbra_bobcat.jpg http://[server]/AP/Penumbra%20Bobcat.full.jpg -penumbra_kavu.jpg http://[server]/AP/Penumbra%20Kavu.full.jpg -penumbra_spider.jpg http://[server]/TSP/Penumbra%20Spider.full.jpg -penumbra_wurm.jpg http://[server]/AP/Penumbra%20Wurm.full.jpg -people_of_the_woods.jpg http://[server]/DK/People%20of%20the%20Woods.full.jpg -peppersmoke.jpg http://[server]/LRW/Peppersmoke.full.jpg -peregrine_drake.jpg http://[server]/US/Peregrine%20Drake.full.jpg -peregrine_mask.jpg http://[server]/RAV/Peregrine%20Mask.full.jpg -perilous_forays.jpg http://[server]/RAV/Perilous%20Forays.full.jpg -perilous_research.jpg http://[server]/CS/Perilous%20Research.full.jpg -perish.jpg http://[server]/6E/Perish.full.jpg -pernicious_deed.jpg http://[server]/AP/Pernicious%20Deed.full.jpg -perplex.jpg http://[server]/RAV/Perplex.full.jpg -persecute.jpg http://[server]/9E/Persecute.full.jpg -persecute_artist.jpg http://[server]/UNH/Persecute%20Artist.full.jpg -personal_incarnation.jpg http://[server]/5E/Personal%20Incarnation.full.jpg -personal_tutor.jpg http://[server]/PT/Personal%20Tutor.full.jpg -persuasion.jpg http://[server]/10E/Persuasion.full.jpg -pestermite.jpg http://[server]/LRW/Pestermite.full.jpg -pestilence.jpg http://[server]/6E/Pestilence.full.jpg -pestilence_rats.jpg http://[server]/IA/Pestilence%20Rats.full.jpg -pestilent_kathari.jpg http://[server]/CFX/Pestilent%20Kathari.full.jpg -petalmane_baku.jpg http://[server]/BOK/Petalmane%20Baku.full.jpg -petals_of_insight.jpg http://[server]/CHK/Petals%20of%20Insight.full.jpg -petra_sphinx.jpg http://[server]/LG/Petra%20Sphinx.full.jpg -petradon.jpg http://[server]/TO/Petradon.full.jpg -petrahydrox.jpg http://[server]/GP/Petrahydrox.full.jpg -petravark.jpg http://[server]/TO/Petravark.full.jpg -petrified_field.jpg http://[server]/OD/Petrified%20Field.full.jpg -petrified_plating.jpg http://[server]/FUT/Petrified%20Plating.full.jpg -petrified_wood_kin.jpg http://[server]/GP/Petrified%20Wood-Kin.full.jpg -pewter_golem.jpg http://[server]/MR/Pewter%20Golem.full.jpg -phage_the_untouchable.jpg http://[server]/10E/Phage%20the%20Untouchable.full.jpg -phantasmagorian.jpg http://[server]/PLC/Phantasmagorian.full.jpg -phantasmal_fiend.jpg http://[server]/AL/Phantasmal%20Fiend1.full.jpg -phantasmal_forces.jpg http://[server]/5E/Phantasmal%20Forces.full.jpg -phantasmal_mount.jpg http://[server]/IA/Phantasmal%20Mount.full.jpg -phantasmal_sphere.jpg http://[server]/AL/Phantasmal%20Sphere.full.jpg -phantasmal_terrain.jpg http://[server]/6E/Phantasmal%20Terrain.full.jpg -phantatog.jpg http://[server]/OD/Phantatog.full.jpg -phantom_centaur.jpg http://[server]/JU/Phantom%20Centaur.full.jpg -phantom_flock.jpg http://[server]/JU/Phantom%20Flock.full.jpg -phantom_monster.jpg http://[server]/5E/Phantom%20Monster.full.jpg -phantom_nantuko.jpg http://[server]/JU/Phantom%20Nantuko.full.jpg -phantom_nishoba.jpg http://[server]/JU/Phantom%20Nishoba.full.jpg -phantom_nomad.jpg http://[server]/JU/Phantom%20Nomad.full.jpg -phantom_tiger.jpg http://[server]/JU/Phantom%20Tiger.full.jpg -phantom_warrior.jpg http://[server]/M10/Phantom%20Warrior.full.jpg -phantom_whelp.jpg http://[server]/OD/Phantom%20Whelp.full.jpg -phantom_wings.jpg http://[server]/WL/Phantom%20Wings.full.jpg -phantom_wurm.jpg http://[server]/TSP/Phantom%20Wurm.full.jpg -phelddagrif.jpg http://[server]/AL/Phelddagrif.full.jpg -phobian_phantasm.jpg http://[server]/CS/Phobian%20Phantasm.full.jpg -phosphorescent_feast.jpg http://[server]/FUT/Phosphorescent%20Feast.full.jpg -phthisis.jpg http://[server]/TSP/Phthisis.full.jpg -phyrexian_altar.jpg http://[server]/IN/Phyrexian%20Altar.full.jpg -phyrexian_arena.jpg http://[server]/9E/Phyrexian%20Arena.full.jpg -phyrexian_battleflies.jpg http://[server]/IN/Phyrexian%20Battleflies.full.jpg -phyrexian_bloodstock.jpg http://[server]/PS/Phyrexian%20Bloodstock.full.jpg -phyrexian_boon.jpg http://[server]/AL/Phyrexian%20Boon1.full.jpg -phyrexian_broodlings.jpg http://[server]/UL/Phyrexian%20Broodlings.full.jpg -phyrexian_colossus.jpg http://[server]/8E/Phyrexian%20Colossus.full.jpg -phyrexian_debaser.jpg http://[server]/UL/Phyrexian%20Debaser.full.jpg -phyrexian_defiler.jpg http://[server]/UL/Phyrexian%20Defiler.full.jpg -phyrexian_delver.jpg http://[server]/IN/Phyrexian%20Delver.full.jpg -phyrexian_denouncer.jpg http://[server]/UL/Phyrexian%20Denouncer.full.jpg -phyrexian_devourer.jpg http://[server]/AL/Phyrexian%20Devourer.full.jpg -phyrexian_dreadnought.jpg http://[server]/MI/Phyrexian%20Dreadnought.full.jpg -phyrexian_driver.jpg http://[server]/NE/Phyrexian%20Driver.full.jpg -phyrexian_etchings.jpg http://[server]/CS/Phyrexian%20Etchings.full.jpg -phyrexian_furnace.jpg http://[server]/WL/Phyrexian%20Furnace.full.jpg -phyrexian_gargantua.jpg http://[server]/9E/Phyrexian%20Gargantua.full.jpg -phyrexian_ghoul.jpg http://[server]/US/Phyrexian%20Ghoul.full.jpg -phyrexian_gremlins.jpg http://[server]/AQ/Phyrexian%20Gremlins.full.jpg -phyrexian_grimoire.jpg http://[server]/TE/Phyrexian%20Grimoire.full.jpg -phyrexian_hulk.jpg http://[server]/9E/Phyrexian%20Hulk.full.jpg -phyrexian_infiltrator.jpg http://[server]/IN/Phyrexian%20Infiltrator.full.jpg -phyrexian_ironfoot.jpg http://[server]/CS/Phyrexian%20Ironfoot.full.jpg -phyrexian_lens.jpg http://[server]/IN/Phyrexian%20Lens.full.jpg -phyrexian_librarian.jpg http://[server]/UNH/Phyrexian%20Librarian.full.jpg -phyrexian_marauder.jpg http://[server]/VI/Phyrexian%20Marauder.full.jpg -phyrexian_monitor.jpg http://[server]/UD/Phyrexian%20Monitor.full.jpg -phyrexian_negator.jpg http://[server]/UD/Phyrexian%20Negator.full.jpg -phyrexian_plaguelord.jpg http://[server]/8E/Phyrexian%20Plaguelord.full.jpg -phyrexian_portal.jpg http://[server]/AL/Phyrexian%20Portal.full.jpg -phyrexian_processor.jpg http://[server]/US/Phyrexian%20Processor.full.jpg -phyrexian_prowler.jpg http://[server]/NE/Phyrexian%20Prowler.full.jpg -phyrexian_purge.jpg http://[server]/MI/Phyrexian%20Purge.full.jpg -phyrexian_rager.jpg http://[server]/10E/Phyrexian%20Rager.full.jpg -phyrexian_reaper.jpg http://[server]/IN/Phyrexian%20Reaper.full.jpg -phyrexian_reclamation.jpg http://[server]/UL/Phyrexian%20Reclamation.full.jpg -phyrexian_scuta.jpg http://[server]/PS/Phyrexian%20Scuta.full.jpg -phyrexian_slayer.jpg http://[server]/IN/Phyrexian%20Slayer.full.jpg -phyrexian_snowcrusher.jpg http://[server]/CS/Phyrexian%20Snowcrusher.full.jpg -phyrexian_soulgorger.jpg http://[server]/CS/Phyrexian%20Soulgorger.full.jpg -phyrexian_splicer.jpg http://[server]/TE/Phyrexian%20Splicer.full.jpg -phyrexian_totem.jpg http://[server]/TSP/Phyrexian%20Totem.full.jpg -phyrexian_tower.jpg http://[server]/US/Phyrexian%20Tower.full.jpg -phyrexian_tribute.jpg http://[server]/MI/Phyrexian%20Tribute.full.jpg -phyrexian_tyranny.jpg http://[server]/PS/Phyrexian%20Tyranny.full.jpg -phyrexian_vault.jpg http://[server]/10E/Phyrexian%20Vault.full.jpg -phyrexian_walker.jpg http://[server]/VI/Phyrexian%20Walker.full.jpg -phyrexian_war_beast.jpg http://[server]/AL/Phyrexian%20War%20Beast.full.jpg -phytohydra.jpg http://[server]/RAV/Phytohydra.full.jpg -pianna_nomad_captain.jpg http://[server]/OD/Pianna,%20Nomad%20Captain.full.jpg -piety.jpg http://[server]/4E/Piety.full.jpg -piety_charm.jpg http://[server]/ON/Piety%20Charm.full.jpg -pikemen.jpg http://[server]/5E/Pikemen.full.jpg -pilgrim_of_justice.jpg http://[server]/OD/Pilgrim%20of%20Justice.full.jpg -pilgrim_of_virtue.jpg http://[server]/OD/Pilgrim%20of%20Virtue.full.jpg -pili_pala.jpg http://[server]/SHM/Pili-Pala.full.jpg -pillage.jpg http://[server]/7E/Pillage.full.jpg -pillaging_horde.jpg http://[server]/PT/Pillaging%20Horde.full.jpg -pillar_of_the_paruns.jpg http://[server]/DIS/Pillar%20of%20the%20Paruns.full.jpg -pillar_tombs_of_aku.jpg http://[server]/VI/Pillar%20Tombs%20of%20Aku.full.jpg -pillarfield_ox.jpg http://[server]/ZEN/Pillarfield%20Ox.full.jpg -pillory_of_the_sleepless.jpg http://[server]/GP/Pillory%20of%20the%20Sleepless.full.jpg -pincer_spider.jpg http://[server]/IN/Pincer%20Spider.full.jpg -pincher_beetles.jpg http://[server]/10E/Pincher%20Beetles.full.jpg -pine_barrens.jpg http://[server]/TE/Pine%20Barrens.full.jpg -pinecrest_ridge.jpg http://[server]/CHK/Pinecrest%20Ridge.full.jpg -pinpoint_avalanche.jpg http://[server]/ON/Pinpoint%20Avalanche.full.jpg -pious_kitsune.jpg http://[server]/CHK/Pious%20Kitsune.full.jpg -pious_warrior.jpg http://[server]/MM/Pious%20Warrior.full.jpg -pipers_melody.jpg http://[server]/OD/Piper's%20Melody.full.jpg -piracy.jpg http://[server]/ST/Piracy.full.jpg -piracy_charm.jpg http://[server]/PLC/Piracy%20Charm.full.jpg -piranha_marsh.jpg http://[server]/ZEN/Piranha%20Marsh.full.jpg -pirate_ship.jpg http://[server]/5E/Pirate%20Ship.full.jpg -pit_imp.jpg http://[server]/TE/Pit%20Imp.full.jpg -pit_keeper.jpg http://[server]/TSP/Pit%20Keeper.full.jpg -pit_raptor.jpg http://[server]/PY/Pit%20Raptor.full.jpg -pit_scorpion.jpg http://[server]/5E/Pit%20Scorpion.full.jpg -pit_spawn.jpg http://[server]/EX/Pit%20Spawn.full.jpg -pit_trap.jpg http://[server]/7E/Pit%20Trap.full.jpg -pitchstone_wall.jpg http://[server]/TO/Pitchstone%20Wall.full.jpg -pitfall_trap.jpg http://[server]/ZEN/Pitfall%20Trap.full.jpg -pithing_needle.jpg http://[server]/M10/Pithing%20Needle.full.jpg -pixie_queen.jpg http://[server]/LG/Pixie%20Queen.full.jpg -plagiarize.jpg http://[server]/10E/Plagiarize.full.jpg -plague_beetle.jpg http://[server]/10E/Plague%20Beetle.full.jpg -plague_boiler.jpg http://[server]/RAV/Plague%20Boiler.full.jpg -plague_dogs.jpg http://[server]/UD/Plague%20Dogs.full.jpg -plague_fiend.jpg http://[server]/PY/Plague%20Fiend.full.jpg -plague_of_vermin.jpg http://[server]/SHM/Plague%20of%20Vermin.full.jpg -plague_rats.jpg http://[server]/5E/Plague%20Rats.full.jpg -plague_sliver.jpg http://[server]/TSP/Plague%20Sliver.full.jpg -plague_spitter.jpg http://[server]/IN/Plague%20Spitter.full.jpg -plague_spores.jpg http://[server]/IN/Plague%20Spores.full.jpg -plague_wind.jpg http://[server]/10E/Plague%20Wind.full.jpg -plague_witch.jpg http://[server]/NE/Plague%20Witch.full.jpg -plaguebearer.jpg http://[server]/EX/Plaguebearer.full.jpg -plagued_rusalka.jpg http://[server]/GP/Plagued%20Rusalka.full.jpg -planar_birth.jpg http://[server]/US/Planar%20Birth.full.jpg -planar_chaos.jpg http://[server]/JU/Planar%20Chaos.full.jpg -planar_cleansing.jpg http://[server]/M10/Planar%20Cleansing.full.jpg -planar_collapse.jpg http://[server]/UL/Planar%20Collapse.full.jpg -planar_despair.jpg http://[server]/AP/Planar%20Despair.full.jpg -planar_gate.jpg http://[server]/LG/Planar%20Gate.full.jpg -planar_guide.jpg http://[server]/LE/Planar%20Guide.full.jpg -planar_overlay.jpg http://[server]/PS/Planar%20Overlay.full.jpg -planar_portal.jpg http://[server]/8E/Planar%20Portal.full.jpg -planar_void.jpg http://[server]/US/Planar%20Void.full.jpg -planeswalkers_favor.jpg http://[server]/PS/Planeswalker's%20Favor.full.jpg -planeswalkers_fury.jpg http://[server]/PS/Planeswalker's%20Fury.full.jpg -planeswalkers_mirth.jpg http://[server]/PS/Planeswalker's%20Mirth.full.jpg -planeswalkers_mischief.jpg http://[server]/PS/Planeswalker's%20Mischief.full.jpg -planeswalkers_scorn.jpg http://[server]/PS/Planeswalker's%20Scorn.full.jpg -plant_elemental.jpg http://[server]/PT/Plant%20Elemental.full.jpg -plasma_elemental.jpg http://[server]/FD/Plasma%20Elemental.full.jpg -plateau.jpg http://[server]/U/Plateau.full.jpg -plated_geopede.jpg http://[server]/ZEN/Plated%20Geopede.full.jpg -plated_pegasus.jpg http://[server]/TSP/Plated%20Pegasus.full.jpg -plated_rootwalla.jpg http://[server]/EX/Plated%20Rootwalla.full.jpg -plated_slagwurm.jpg http://[server]/MR/Plated%20Slagwurm.full.jpg -plated_sliver.jpg http://[server]/LE/Plated%20Sliver.full.jpg -plated_spider.jpg http://[server]/BD/Plated%20Spider.full.jpg -plated_wurm.jpg http://[server]/P2/Plated%20Wurm.full.jpg -platinum_angel.jpg http://[server]/M10/Platinum%20Angel.full.jpg -plaxcaster_frogling.jpg http://[server]/DIS/Plaxcaster%20Frogling.full.jpg -plaxmanta.jpg http://[server]/DIS/Plaxmanta.full.jpg -pledge_of_loyalty.jpg http://[server]/IN/Pledge%20of%20Loyalty.full.jpg -plover_knights.jpg http://[server]/LRW/Plover%20Knights.full.jpg -plow_through_reito.jpg http://[server]/SOK/Plow%20Through%20Reito.full.jpg -plow_under.jpg http://[server]/8E/Plow%20Under.full.jpg -plumes_of_peace.jpg http://[server]/DIS/Plumes%20of%20Peace.full.jpg -plumeveil.jpg http://[server]/SHM/Plumeveil.full.jpg -plunder.jpg http://[server]/TSP/Plunder.full.jpg -plunge_into_darkness.jpg http://[server]/FD/Plunge%20into%20Darkness.full.jpg -pointy_finger_of_doom.jpg http://[server]/UNH/Pointy%20Finger%20of%20Doom.full.jpg -poison_arrow.jpg http://[server]/P3/Poison%20Arrow.full.jpg -poison_the_well.jpg http://[server]/SHM/Poison%20the%20Well.full.jpg -poisonbelly_ogre.jpg http://[server]/GP/Poisonbelly%20Ogre.full.jpg -polar_kraken.jpg http://[server]/IA/Polar%20Kraken.full.jpg -political_trickery.jpg http://[server]/MI/Political%20Trickery.full.jpg -pollen_lullaby.jpg http://[server]/LRW/Pollen%20Lullaby.full.jpg -pollen_remedy.jpg http://[server]/PS/Pollen%20Remedy.full.jpg -pollenbright_wings.jpg http://[server]/RAV/Pollenbright%20Wings.full.jpg -polluted_bonds.jpg http://[server]/SHM/Polluted%20Bonds.full.jpg -polluted_delta.jpg http://[server]/ON/Polluted%20Delta.full.jpg -polluted_mire.jpg http://[server]/BD/Polluted%20Mire.full.jpg -polymorph.jpg http://[server]/M10/Polymorph.full.jpg -ponder.jpg http://[server]/M10/Ponder.full.jpg -pongify.jpg http://[server]/PLC/Pongify.full.jpg -pooling_venom.jpg http://[server]/FUT/Pooling%20Venom.full.jpg -porphyry_nodes.jpg http://[server]/PLC/Porphyry%20Nodes.full.jpg -port_inspector.jpg http://[server]/MM/Port%20Inspector.full.jpg -portcullis.jpg http://[server]/SH/Portcullis.full.jpg -portent.jpg http://[server]/5E/Portent.full.jpg -possessed_aven.jpg http://[server]/TO/Possessed%20Aven.full.jpg -possessed_barbarian.jpg http://[server]/TO/Possessed%20Barbarian.full.jpg -possessed_centaur.jpg http://[server]/TO/Possessed%20Centaur.full.jpg -possessed_nomad.jpg http://[server]/TO/Possessed%20Nomad.full.jpg -possessed_portal.jpg http://[server]/FD/Possessed%20Portal.full.jpg -poultice_sliver.jpg http://[server]/PLC/Poultice%20Sliver.full.jpg -poultrygeist.jpg http://[server]/UG/Poultrygeist.full.jpg -pouncing_jaguar.jpg http://[server]/US/Pouncing%20Jaguar.full.jpg -pouncing_kavu.jpg http://[server]/IN/Pouncing%20Kavu.full.jpg -pouncing_wurm.jpg http://[server]/PLC/Pouncing%20Wurm.full.jpg -powder_keg.jpg http://[server]/UD/Powder%20Keg.full.jpg -power_armor.jpg http://[server]/IN/Power%20Armor.full.jpg -power_artifact.jpg http://[server]/AQ/Power%20Artifact.full.jpg -power_conduit.jpg http://[server]/MR/Power%20Conduit.full.jpg -power_leak.jpg http://[server]/4E/Power%20Leak.full.jpg -power_matrix.jpg http://[server]/MM/Power%20Matrix.full.jpg -power_of_fire.jpg http://[server]/SHM/Power%20of%20Fire.full.jpg -power_sink.jpg http://[server]/6E/Power%20Sink.full.jpg -power_surge.jpg http://[server]/4E/Power%20Surge.full.jpg -power_taint.jpg http://[server]/US/Power%20Taint.full.jpg -powerleech.jpg http://[server]/AQ/Powerleech.full.jpg -powerstone_minefield.jpg http://[server]/AP/Powerstone%20Minefield.full.jpg -pox.jpg http://[server]/5E/Pox.full.jpg -pradesh_gypsies.jpg http://[server]/6E/Pradesh%20Gypsies.full.jpg -prahv_spires_of_order.jpg http://[server]/DIS/Prahv,%20Spires%20of%20Order.full.jpg -preacher.jpg http://[server]/DK/Preacher.full.jpg -precognition.jpg http://[server]/TE/Precognition.full.jpg -predator_dragon.jpg http://[server]/ALA/Predator%20Dragon.full.jpg -predator_flagship.jpg http://[server]/NE/Predator,%20Flagship.full.jpg -predators_strike.jpg http://[server]/MR/Predator's%20Strike.full.jpg -predatory_advantage.jpg http://[server]/ARB/Predatory%20Advantage.full.jpg -predatory_focus.jpg http://[server]/GP/Predatory%20Focus.full.jpg -predatory_hunger.jpg http://[server]/EX/Predatory%20Hunger.full.jpg -predatory_nightstalker.jpg http://[server]/P2/Predatory%20Nightstalker.full.jpg -predatory_urge.jpg http://[server]/ZEN/Predatory%20Urge.full.jpg -predict.jpg http://[server]/OD/Predict.full.jpg -preeminent_captain.jpg http://[server]/MOR/Preeminent%20Captain.full.jpg -preemptive_strike.jpg http://[server]/P3/Preemptive%20Strike.full.jpg -preferred_selection.jpg http://[server]/MI/Preferred%20Selection.full.jpg -premature_burial.jpg http://[server]/TSP/Premature%20Burial.full.jpg -presence_of_gond.jpg http://[server]/SHM/Presence%20of%20Gond.full.jpg -presence_of_the_master.jpg http://[server]/LG/Presence%20of%20the%20Master.full.jpg -presence_of_the_wise.jpg http://[server]/SOK/Presence%20of%20the%20Wise.full.jpg -pretenders_claim.jpg http://[server]/MM/Pretender's%20Claim.full.jpg -price_of_glory.jpg http://[server]/OD/Price%20of%20Glory.full.jpg -price_of_progress.jpg http://[server]/EX/Price%20of%20Progress.full.jpg -prickly_boggart.jpg http://[server]/MOR/Prickly%20Boggart.full.jpg -pride_of_lions.jpg http://[server]/7E/Pride%20of%20Lions.full.jpg -pride_of_the_clouds.jpg http://[server]/DIS/Pride%20of%20the%20Clouds.full.jpg -priest_of_gix.jpg http://[server]/US/Priest%20of%20Gix.full.jpg -priest_of_titania.jpg http://[server]/US/Priest%20of%20Titania.full.jpg -priest_of_yawgmoth.jpg http://[server]/AQ/Priest%20of%20Yawgmoth.full.jpg -primal_bellow.jpg http://[server]/ZEN/Primal%20Bellow.full.jpg -primal_beyond.jpg http://[server]/MOR/Primal%20Beyond.full.jpg -primal_boost.jpg http://[server]/ON/Primal%20Boost.full.jpg -primal_clay.jpg http://[server]/6E/Primal%20Clay.full.jpg -primal_command.jpg http://[server]/LRW/Primal%20Command.full.jpg -primal_forcemage.jpg http://[server]/TSP/Primal%20Forcemage.full.jpg -primal_frenzy.jpg http://[server]/OD/Primal%20Frenzy.full.jpg -primal_growth.jpg http://[server]/PS/Primal%20Growth.full.jpg -primal_order.jpg http://[server]/5E/Primal%20Order.full.jpg -primal_plasma.jpg http://[server]/PLC/Primal%20Plasma.full.jpg -primal_rage.jpg http://[server]/10E/Primal%20Rage.full.jpg -primal_whisperer.jpg http://[server]/LE/Primal%20Whisperer.full.jpg -primalcrux.jpg http://[server]/EVE/Primalcrux.full.jpg -primeval_force.jpg http://[server]/8E/Primeval%20Force.full.jpg -primeval_light.jpg http://[server]/GP/Primeval%20Light.full.jpg -primeval_shambler.jpg http://[server]/8E/Primeval%20Shambler.full.jpg -primitive_etchings.jpg http://[server]/SC/Primitive%20Etchings.full.jpg -primitive_justice.jpg http://[server]/AL/Primitive%20Justice.full.jpg -primoc_escapee.jpg http://[server]/LE/Primoc%20Escapee.full.jpg -primordial_ooze.jpg http://[server]/LG/Primordial%20Ooze.full.jpg -primordial_sage.jpg http://[server]/RAV/Primordial%20Sage.full.jpg -prince_of_thralls.jpg http://[server]/ALA/Prince%20of%20Thralls.full.jpg -princess_lucrezia.jpg http://[server]/LG/Princess%20Lucrezia.full.jpg -prismatic_boon.jpg http://[server]/MI/Prismatic%20Boon.full.jpg -prismatic_circle.jpg http://[server]/MI/Prismatic%20Circle.full.jpg -prismatic_lace.jpg http://[server]/MI/Prismatic%20Lace.full.jpg -prismatic_lens.jpg http://[server]/TSP/Prismatic%20Lens.full.jpg -prismatic_omen.jpg http://[server]/SHM/Prismatic%20Omen.full.jpg -prismatic_strands.jpg http://[server]/JU/Prismatic%20Strands.full.jpg -prismatic_ward.jpg http://[server]/5E/Prismatic%20Ward.full.jpg -prismatic_wardrobe.jpg http://[server]/UG/Prismatic%20Wardrobe.full.jpg -prismwake_merrow.jpg http://[server]/SHM/Prismwake%20Merrow.full.jpg -prison_barricade.jpg http://[server]/IN/Prison%20Barricade.full.jpg -prison_term.jpg http://[server]/HOP/Prison%20Term.full.jpg -pristine_angel.jpg http://[server]/DS/Pristine%20Angel.full.jpg -private_research.jpg http://[server]/UD/Private%20Research.full.jpg -privileged_position.jpg http://[server]/RAV/Privileged%20Position.full.jpg -prized_unicorn.jpg http://[server]/M10/Prized%20Unicorn.full.jpg -probe.jpg http://[server]/IN/Probe.full.jpg -proclamation_of_rebirth.jpg http://[server]/DIS/Proclamation%20of%20Rebirth.full.jpg -prodigal_pyromancer.jpg http://[server]/M10/Prodigal%20Pyromancer.full.jpg -prodigal_sorcerer.jpg http://[server]/7E/Prodigal%20Sorcerer.full.jpg -profane_command.jpg http://[server]/HOP/Profane%20Command.full.jpg -profane_prayers.jpg http://[server]/ON/Profane%20Prayers.full.jpg -progenitus.jpg http://[server]/CFX/Progenitus.full.jpg -prohibit.jpg http://[server]/IN/Prohibit.full.jpg -promise_of_bunrei.jpg http://[server]/SOK/Promise%20of%20Bunrei.full.jpg -promise_of_power.jpg http://[server]/MR/Promise%20of%20Power.full.jpg -promised_kannushi.jpg http://[server]/SOK/Promised%20Kannushi.full.jpg -propaganda.jpg http://[server]/TE/Propaganda.full.jpg -proper_burial.jpg http://[server]/DIS/Proper%20Burial.full.jpg -prophecy.jpg http://[server]/HL/Prophecy.full.jpg -prophetic_bolt.jpg http://[server]/AP/Prophetic%20Bolt.full.jpg -proposal.jpg http://[server]/PR/Proposal.full.jpg -prosperity.jpg http://[server]/6E/Prosperity.full.jpg -protean_hulk.jpg http://[server]/DIS/Protean%20Hulk.full.jpg -protean_hydra.jpg http://[server]/M10/Protean%20Hydra.full.jpg -protective_bubble.jpg http://[server]/LRW/Protective%20Bubble.full.jpg -protective_sphere.jpg http://[server]/IN/Protective%20Sphere.full.jpg -proteus_machine.jpg http://[server]/SC/Proteus%20Machine.full.jpg -proteus_staff.jpg http://[server]/MR/Proteus%20Staff.full.jpg -protomatter_powder.jpg http://[server]/ALA/Protomatter%20Powder.full.jpg -provoke.jpg http://[server]/SH/Provoke.full.jpg -prowess_of_the_fair.jpg http://[server]/LRW/Prowess%20of%20the%20Fair.full.jpg -prowling_nightstalker.jpg http://[server]/P2/Prowling%20Nightstalker.full.jpg -prowling_pangolin.jpg http://[server]/ON/Prowling%20Pangolin.full.jpg -psionic_blast.jpg http://[server]/TSB/Psionic%20Blast.full.jpg -psionic_entity.jpg http://[server]/LG/Psionic%20Entity.full.jpg -psionic_gift.jpg http://[server]/OD/Psionic%20Gift.full.jpg -psionic_sliver.jpg http://[server]/TSP/Psionic%20Sliver.full.jpg -psychatog.jpg http://[server]/OD/Psychatog.full.jpg -psychic_allergy.jpg http://[server]/DK/Psychic%20Allergy.full.jpg -psychic_battle.jpg http://[server]/IN/Psychic%20Battle.full.jpg -psychic_drain.jpg http://[server]/RAV/Psychic%20Drain.full.jpg -psychic_membrane.jpg http://[server]/MR/Psychic%20Membrane.full.jpg -psychic_network.jpg http://[server]/UG/Psychic%20Network.full.jpg -psychic_overload.jpg http://[server]/DS/Psychic%20Overload.full.jpg -psychic_possession.jpg http://[server]/DIS/Psychic%20Possession.full.jpg -psychic_puppetry.jpg http://[server]/CHK/Psychic%20Puppetry.full.jpg -psychic_purge.jpg http://[server]/LG/Psychic%20Purge.full.jpg -psychic_spear.jpg http://[server]/BOK/Psychic%20Spear.full.jpg -psychic_theft.jpg http://[server]/PY/Psychic%20Theft.full.jpg -psychic_trance.jpg http://[server]/ON/Psychic%20Trance.full.jpg -psychic_transfer.jpg http://[server]/MI/Psychic%20Transfer.full.jpg -psychic_venom.jpg http://[server]/6E/Psychic%20Venom.full.jpg -psychic_vortex.jpg http://[server]/WL/Psychic%20Vortex.full.jpg -psychogenic_probe.jpg http://[server]/MR/Psychogenic%20Probe.full.jpg -psychotic_episode.jpg http://[server]/TSP/Psychotic%20Episode.full.jpg -psychotic_fury.jpg http://[server]/DIS/Psychotic%20Fury.full.jpg -psychotic_haze.jpg http://[server]/TO/Psychotic%20Haze.full.jpg -psychotrope_thallid.jpg http://[server]/PLC/Psychotrope%20Thallid.full.jpg -pteron_ghost.jpg http://[server]/DS/Pteron%20Ghost.full.jpg -pucas_mischief.jpg http://[server]/SHM/Puca's%20Mischief.full.jpg -puffer_extract.jpg http://[server]/MM/Puffer%20Extract.full.jpg -pull_from_eternity.jpg http://[server]/TSP/Pull%20from%20Eternity.full.jpg -pull_under.jpg http://[server]/CHK/Pull%20Under.full.jpg -pulling_teeth.jpg http://[server]/MOR/Pulling%20Teeth.full.jpg -pulmonic_sliver.jpg http://[server]/TSP/Pulmonic%20Sliver.full.jpg -pulsating_illusion.jpg http://[server]/OD/Pulsating%20Illusion.full.jpg -pulse_of_llanowar.jpg http://[server]/IN/Pulse%20of%20Llanowar.full.jpg -pulse_of_the_dross.jpg http://[server]/DS/Pulse%20of%20the%20Dross.full.jpg -pulse_of_the_fields.jpg http://[server]/DS/Pulse%20of%20the%20Fields.full.jpg -pulse_of_the_forge.jpg http://[server]/DS/Pulse%20of%20the%20Forge.full.jpg -pulse_of_the_grid.jpg http://[server]/DS/Pulse%20of%20the%20Grid.full.jpg -pulse_of_the_tangle.jpg http://[server]/DS/Pulse%20of%20the%20Tangle.full.jpg -pulsemage_advocate.jpg http://[server]/JU/Pulsemage%20Advocate.full.jpg -pulverize.jpg http://[server]/MM/Pulverize.full.jpg -punctuate.jpg http://[server]/UNH/Punctuate.full.jpg -puncture_blast.jpg http://[server]/EVE/Puncture%20Blast.full.jpg -puncture_bolt.jpg http://[server]/SHM/Puncture%20Bolt.full.jpg -punish_ignorance.jpg http://[server]/ALA/Punish%20Ignorance.full.jpg -punishing_fire.jpg http://[server]/ZEN/Punishing%20Fire.full.jpg -puppet_conjurer.jpg http://[server]/ALA/Puppet%20Conjurer.full.jpg -puppet_master.jpg http://[server]/LG/Puppet%20Master.full.jpg -puppet_strings.jpg http://[server]/TE/Puppet%20Strings.full.jpg -puppeteer.jpg http://[server]/10E/Puppeteer.full.jpg -puppeteer_clique.jpg http://[server]/SHM/Puppeteer%20Clique.full.jpg -puppets_verdict.jpg http://[server]/MM/Puppet's%20Verdict.full.jpg -pure_intentions.jpg http://[server]/SOK/Pure%20Intentions.full.jpg -pure_reflection.jpg http://[server]/IN/Pure%20Reflection.full.jpg -purelace.jpg http://[server]/4E/Purelace.full.jpg -puresight_merrow.jpg http://[server]/SHM/Puresight%20Merrow.full.jpg -puresimple.jpg http://[server]/DIS/PureSimple.full.jpg -purgatory.jpg http://[server]/MI/Purgatory.full.jpg -purge.jpg http://[server]/DS/Purge.full.jpg -purging_scythe.jpg http://[server]/US/Purging%20Scythe.full.jpg -purify.jpg http://[server]/7E/Purify.full.jpg -purity.jpg http://[server]/LRW/Purity.full.jpg -purraj_of_urborg.jpg http://[server]/MI/Purraj%20of%20Urborg.full.jpg -pursuit_of_knowledge.jpg http://[server]/SH/Pursuit%20of%20Knowledge.full.jpg -pus_kami.jpg http://[server]/BOK/Pus%20Kami.full.jpg -put_away.jpg http://[server]/SHM/Put%20Away.full.jpg -putrefaction.jpg http://[server]/MM/Putrefaction.full.jpg -putrefy.jpg http://[server]/RAV/Putrefy.full.jpg -putrid_cyclops.jpg http://[server]/FUT/Putrid%20Cyclops.full.jpg -putrid_imp.jpg http://[server]/TO/Putrid%20Imp.full.jpg -putrid_leech.jpg http://[server]/ARB/Putrid%20Leech.full.jpg -putrid_raptor.jpg http://[server]/SC/Putrid%20Raptor.full.jpg -putrid_warrior.jpg http://[server]/AP/Putrid%20Warrior.full.jpg -pygmy_allosaurus.jpg http://[server]/IA/Pygmy%20Allosaurus.full.jpg -pygmy_giant.jpg http://[server]/UNH/Pygmy%20Giant.full.jpg -pygmy_hippo.jpg http://[server]/VI/Pygmy%20Hippo.full.jpg -pygmy_kavu.jpg http://[server]/PS/Pygmy%20Kavu.full.jpg -pygmy_pyrosaur.jpg http://[server]/7E/Pygmy%20Pyrosaur.full.jpg -pygmy_razorback.jpg http://[server]/PY/Pygmy%20Razorback.full.jpg -pygmy_troll.jpg http://[server]/EX/Pygmy%20Troll.full.jpg -pyknite.jpg http://[server]/IA/Pyknite.full.jpg -pyramids.jpg http://[server]/AN/Pyramids.full.jpg -pyre_charger.jpg http://[server]/SHM/Pyre%20Charger.full.jpg -pyre_zombie.jpg http://[server]/IN/Pyre%20Zombie.full.jpg -pyric_salamander.jpg http://[server]/MI/Pyric%20Salamander.full.jpg -pyrite_spellbomb.jpg http://[server]/MR/Pyrite%20Spellbomb.full.jpg -pyroblast.jpg http://[server]/5E/Pyroblast.full.jpg -pyroclasm.jpg http://[server]/M10/Pyroclasm.full.jpg -pyroclast_consul.jpg http://[server]/MOR/Pyroclast%20Consul.full.jpg -pyrohemia.jpg http://[server]/PLC/Pyrohemia.full.jpg -pyrokinesis.jpg http://[server]/AL/Pyrokinesis.full.jpg -pyromancer_ascension.jpg http://[server]/ZEN/Pyromancer%20Ascension.full.jpg -pyromancers_swath.jpg http://[server]/FUT/Pyromancer's%20Swath.full.jpg -pyromancy.jpg http://[server]/UL/Pyromancy.full.jpg -pyromania.jpg http://[server]/TO/Pyromania.full.jpg -pyromatics.jpg http://[server]/GP/Pyromatics.full.jpg -pyrostatic_pillar.jpg http://[server]/SC/Pyrostatic%20Pillar.full.jpg -pyrotechnics.jpg http://[server]/8E/Pyrotechnics.full.jpg -pyrrhic_revival.jpg http://[server]/EVE/Pyrrhic%20Revival.full.jpg -python.jpg http://[server]/6E/Python.full.jpg \ No newline at end of file diff --git a/res/pics_link/card-pictures_q.txt b/res/pics_link/card-pictures_q.txt deleted file mode 100644 index 8b870d3f10a..00000000000 --- a/res/pics_link/card-pictures_q.txt +++ /dev/null @@ -1,44 +0,0 @@ -qasali_ambusher.jpg http://[server]/ALA/Qasali%20Ambusher.full.jpg -qasali_pridemage.jpg http://[server]/ARB/Qasali%20Pridemage.full.jpg -quagmire.jpg http://[server]/LG/Quagmire.full.jpg -quagmire_druid.jpg http://[server]/AP/Quagmire%20Druid.full.jpg -quagmire_lamprey.jpg http://[server]/MM/Quagmire%20Lamprey.full.jpg -quagnoth.jpg http://[server]/FUT/Quagnoth.full.jpg -quarum_trench_gnomes.jpg http://[server]/LG/Quarum%20Trench%20Gnomes.full.jpg -quash.jpg http://[server]/UD/Quash.full.jpg -quenchable_fire.jpg http://[server]/CFX/Quenchable%20Fire.full.jpg -quest_for_ancient_secrets.jpg http://[server]/ZEN/Quest%20for%20Ancient%20Secrets.full.jpg -quest_for_pure_flame.jpg http://[server]/ZEN/Quest%20for%20Pure%20Flame.full.jpg -quest_for_the_gemblades.jpg http://[server]/ZEN/Quest%20for%20the%20Gemblades.full.jpg -quest_for_the_gravelord.jpg http://[server]/ZEN/Quest%20for%20the%20Gravelord.full.jpg -quest_for_the_holy_relic.jpg http://[server]/ZEN/Quest%20for%20the%20Holy%20Relic.full.jpg -questing_phelddagrif.jpg http://[server]/PS/Questing%20Phelddagrif.full.jpg -question_elemental.jpg http://[server]/UNH/Question%20Elemental.full.jpg -quick_sliver.jpg http://[server]/LE/Quick%20Sliver.full.jpg -quickchange.jpg http://[server]/RAV/Quickchange.full.jpg -quicken.jpg http://[server]/GP/Quicken.full.jpg -quickening_licid.jpg http://[server]/TE/Quickening%20Licid.full.jpg -quicksand.jpg http://[server]/10E/Quicksand.full.jpg -quicksilver_amulet.jpg http://[server]/UL/Quicksilver%20Amulet.full.jpg -quicksilver_behemoth.jpg http://[server]/DS/Quicksilver%20Behemoth.full.jpg -quicksilver_dagger.jpg http://[server]/AP/Quicksilver%20Dagger.full.jpg -quicksilver_dragon.jpg http://[server]/ON/Quicksilver%20Dragon.full.jpg -quicksilver_elemental.jpg http://[server]/MR/Quicksilver%20Elemental.full.jpg -quicksilver_fountain.jpg http://[server]/MR/Quicksilver%20Fountain.full.jpg -quicksilver_wall.jpg http://[server]/PY/Quicksilver%20Wall.full.jpg -quiet_disrepair.jpg http://[server]/FUT/Quiet%20Disrepair.full.jpg -quiet_purity.jpg http://[server]/CHK/Quiet%20Purity.full.jpg -quiet_speculation.jpg http://[server]/JU/Quiet%20Speculation.full.jpg -quietus_spike.jpg http://[server]/ALA/Quietus%20Spike.full.jpg -quill_slinger_boggart.jpg http://[server]/LRW/Quill-Slinger%20Boggart.full.jpg -quilled_sliver.jpg http://[server]/TSP/Quilled%20Sliver.full.jpg -quillmane_baku.jpg http://[server]/BOK/Quillmane%20Baku.full.jpg -quillspike.jpg http://[server]/EVE/Quillspike.full.jpg -quirion_druid.jpg http://[server]/VI/Quirion%20Druid.full.jpg -quirion_dryad.jpg http://[server]/10E/Quirion%20Dryad.full.jpg -quirion_elves.jpg http://[server]/IN/Quirion%20Elves.full.jpg -quirion_explorer.jpg http://[server]/PS/Quirion%20Explorer.full.jpg -quirion_ranger.jpg http://[server]/VI/Quirion%20Ranger.full.jpg -quirion_sentinel.jpg http://[server]/IN/Quirion%20Sentinel.full.jpg -quirion_trailblazer.jpg http://[server]/IN/Quirion%20Trailblazer.full.jpg -qumulox.jpg http://[server]/FD/Qumulox.full.jpg \ No newline at end of file diff --git a/res/pics_link/card-pictures_r.txt b/res/pics_link/card-pictures_r.txt deleted file mode 100644 index 6652bc65138..00000000000 --- a/res/pics_link/card-pictures_r.txt +++ /dev/null @@ -1,593 +0,0 @@ -r&ds_secret_lair.jpg http://[server]/UNH/R&D's%20Secret%20Lair.full.jpg -rabble_rouser.jpg http://[server]/GP/Rabble-Rouser.full.jpg -rabid_elephant.jpg http://[server]/OD/Rabid%20Elephant.full.jpg -rabid_rats.jpg http://[server]/SH/Rabid%20Rats.full.jpg -rabid_wolverines.jpg http://[server]/EX/Rabid%20Wolverines.full.jpg -rabid_wombat.jpg http://[server]/5E/Rabid%20Wombat.full.jpg -rack_and_ruin.jpg http://[server]/UL/Rack%20and%20Ruin.full.jpg -rackling.jpg http://[server]/NE/Rackling.full.jpg -radha_heir_to_keld.jpg http://[server]/PLC/Radha,%20Heir%20to%20Keld.full.jpg -radiant_archangel.jpg http://[server]/UL/Radiant,%20Archangel.full.jpg -radiant_essence.jpg http://[server]/MI/Radiant%20Essence.full.jpg -radiant_kavu.jpg http://[server]/PS/Radiant%20Kavu.full.jpg -radiants_dragoons.jpg http://[server]/UL/Radiant's%20Dragoons.full.jpg -radiants_judgment.jpg http://[server]/UL/Radiant's%20Judgment.full.jpg -radiate.jpg http://[server]/TO/Radiate.full.jpg -radjan_spirit.jpg http://[server]/6E/Radjan%20Spirit.full.jpg -rafiq_of_the_many.jpg http://[server]/ALA/Rafiq%20of%20the%20Many.full.jpg -rag_dealer.jpg http://[server]/CHK/Rag%20Dealer.full.jpg -rag_man.jpg http://[server]/7E/Rag%20Man.full.jpg -ragamuffyn.jpg http://[server]/DIS/Ragamuffyn.full.jpg -rage_forger.jpg http://[server]/MOR/Rage%20Forger.full.jpg -rage_reflection.jpg http://[server]/SHM/Rage%20Reflection.full.jpg -rage_weaver.jpg http://[server]/10E/Rage%20Weaver.full.jpg -ragged_veins.jpg http://[server]/CHK/Ragged%20Veins.full.jpg -raging_bull.jpg http://[server]/LG/Raging%20Bull.full.jpg -raging_cougar.jpg http://[server]/PT/Raging%20Cougar.full.jpg -raging_goblin.jpg http://[server]/M10/Raging%20Goblin.full.jpg -raging_gorilla.jpg http://[server]/VI/Raging%20Gorilla.full.jpg -raging_kavu.jpg http://[server]/IN/Raging%20Kavu.full.jpg -raging_minotaur.jpg http://[server]/PT/Raging%20Minotaur.full.jpg -raging_river.jpg http://[server]/U/Raging%20River.full.jpg -raging_spirit.jpg http://[server]/MI/Raging%20Spirit.full.jpg -ragnar.jpg http://[server]/LG/Ragnar.full.jpg -raiding_nightstalker.jpg http://[server]/P2/Raiding%20Nightstalker.full.jpg -raiding_party.jpg http://[server]/FE/Raiding%20Party.full.jpg -rain_of_blades.jpg http://[server]/8E/Rain%20of%20Blades.full.jpg -rain_of_daggers.jpg http://[server]/P2/Rain%20of%20Daggers.full.jpg -rain_of_embers.jpg http://[server]/RAV/Rain%20of%20Embers.full.jpg -rain_of_filth.jpg http://[server]/US/Rain%20of%20Filth.full.jpg -rain_of_gore.jpg http://[server]/DIS/Rain%20of%20Gore.full.jpg -rain_of_rust.jpg http://[server]/FD/Rain%20of%20Rust.full.jpg -rain_of_salt.jpg http://[server]/PT/Rain%20of%20Salt.full.jpg -rain_of_tears.jpg http://[server]/10E/Rain%20of%20Tears.full.jpg -rainbow_crow.jpg http://[server]/IN/Rainbow%20Crow.full.jpg -rainbow_efreet.jpg http://[server]/VI/Rainbow%20Efreet.full.jpg -rainbow_vale.jpg http://[server]/FE/Rainbow%20Vale.full.jpg -raise_dead.jpg http://[server]/9E/Raise%20Dead.full.jpg -raise_the_alarm.jpg http://[server]/MR/Raise%20the%20Alarm.full.jpg -raka_disciple.jpg http://[server]/AP/Raka%20Disciple.full.jpg -raka_sanctuary.jpg http://[server]/AP/Raka%20Sanctuary.full.jpg -rakalite.jpg http://[server]/CH/Rakalite.full.jpg -rakavolver.jpg http://[server]/AP/Rakavolver.full.jpg -rakdos_augermage.jpg http://[server]/DIS/Rakdos%20Augermage.full.jpg -rakdos_carnarium.jpg http://[server]/DIS/Rakdos%20Carnarium.full.jpg -rakdos_guildmage.jpg http://[server]/DIS/Rakdos%20Guildmage.full.jpg -rakdos_ickspitter.jpg http://[server]/DIS/Rakdos%20Ickspitter.full.jpg -rakdos_pit_dragon.jpg http://[server]/DIS/Rakdos%20Pit%20Dragon.full.jpg -rakdos_riteknife.jpg http://[server]/DIS/Rakdos%20Riteknife.full.jpg -rakdos_signet.jpg http://[server]/DIS/Rakdos%20Signet.full.jpg -rakdos_the_defiler.jpg http://[server]/DIS/Rakdos%20the%20Defiler.full.jpg -rakeclaw_gargantuan.jpg http://[server]/ALA/Rakeclaw%20Gargantuan.full.jpg -raking_canopy.jpg http://[server]/SHM/Raking%20Canopy.full.jpg -rakka_mar.jpg http://[server]/CFX/Rakka%20Mar.full.jpg -raksha_golden_cub.jpg http://[server]/FD/Raksha%20Golden%20Cub.full.jpg -rally.jpg http://[server]/IA/Rally.full.jpg -rally_the_horde.jpg http://[server]/SOK/Rally%20The%20Horde.full.jpg -rally_the_righteous.jpg http://[server]/RAV/Rally%20the%20Righteous.full.jpg -rally_the_troops.jpg http://[server]/P3/Rally%20the%20Troops.full.jpg -ramirez_depietro.jpg http://[server]/LG/Ramirez%20DePietro.full.jpg -ramosian_captain.jpg http://[server]/MM/Ramosian%20Captain.full.jpg -ramosian_commander.jpg http://[server]/MM/Ramosian%20Commander.full.jpg -ramosian_lieutenant.jpg http://[server]/MM/Ramosian%20Lieutenant.full.jpg -ramosian_rally.jpg http://[server]/MM/Ramosian%20Rally.full.jpg -ramosian_revivalist.jpg http://[server]/FUT/Ramosian%20Revivalist.full.jpg -ramosian_sergeant.jpg http://[server]/MM/Ramosian%20Sergeant.full.jpg -ramosian_sky_marshal.jpg http://[server]/MM/Ramosian%20Sky%20Marshal.full.jpg -rampaging_baloths.jpg http://[server]/ZEN/Rampaging%20Baloths.full.jpg -rampant_elephant.jpg http://[server]/IN/Rampant%20Elephant.full.jpg -rampant_growth.jpg http://[server]/M10/Rampant%20Growth.full.jpg -rampart_crawler.jpg http://[server]/MM/Rampart%20Crawler.full.jpg -ramses_overdark.jpg http://[server]/LG/Ramses%20Overdark.full.jpg -rancid_earth.jpg http://[server]/TO/Rancid%20Earth.full.jpg -rancor.jpg http://[server]/UL/Rancor.full.jpg -ranger_en_vec.jpg http://[server]/TE/Ranger%20en-Vec.full.jpg -ranger_of_eos.jpg http://[server]/ALA/Ranger%20of%20Eos.full.jpg -rank_and_file.jpg http://[server]/UL/Rank%20and%20File.full.jpg -ransack.jpg http://[server]/SH/Ransack.full.jpg -rapid_decay.jpg http://[server]/UD/Rapid%20Decay.full.jpg -rapid_fire.jpg http://[server]/LG/Rapid%20Fire.full.jpg -rappelling_scouts.jpg http://[server]/MM/Rappelling%20Scouts.full.jpg -rare_b_gone.jpg http://[server]/UNH/Rare-B-Gone.full.jpg -rashida_scalebane.jpg http://[server]/MI/Rashida%20Scalebane.full.jpg -rashka_the_slayer.jpg http://[server]/HL/Rashka%20the%20Slayer.full.jpg -rasputin_dreamweaver.jpg http://[server]/LG/Rasputin%20Dreamweaver.full.jpg -ratcatcher.jpg http://[server]/DIS/Ratcatcher.full.jpg -rathi_assassin.jpg http://[server]/NE/Rathi%20Assassin.full.jpg -rathi_dragon.jpg http://[server]/9E/Rathi%20Dragon.full.jpg -rathi_fiend.jpg http://[server]/NE/Rathi%20Fiend.full.jpg -rathi_intimidator.jpg http://[server]/NE/Rathi%20Intimidator.full.jpg -rathi_trapper.jpg http://[server]/PLC/Rathi%20Trapper.full.jpg -raths_edge.jpg http://[server]/NE/Rath's%20Edge.full.jpg -rats_feast.jpg http://[server]/JU/Rats'%20Feast.full.jpg -rats_of_rath.jpg http://[server]/TE/Rats%20of%20Rath.full.jpg -rattleblaze_scarecrow.jpg http://[server]/SHM/Rattleblaze%20Scarecrow.full.jpg -ravaged_highlands.jpg http://[server]/OD/Ravaged%20Highlands.full.jpg -ravages_of_war.jpg http://[server]/P3/Ravages%20of%20War.full.jpg -ravaging_horde.jpg http://[server]/P3/Ravaging%20Horde.full.jpg -ravaging_riftwurm.jpg http://[server]/FUT/Ravaging%20Riftwurm.full.jpg -raven_familiar.jpg http://[server]/UL/Raven%20Familiar.full.jpg -raven_guild_initiate.jpg http://[server]/SC/Raven%20Guild%20Initiate.full.jpg -raven_guild_master.jpg http://[server]/SC/Raven%20Guild%20Master.full.jpg -ravenous_baboons.jpg http://[server]/EX/Ravenous%20Baboons.full.jpg -ravenous_baloth.jpg http://[server]/ON/Ravenous%20Baloth.full.jpg -ravenous_rats.jpg http://[server]/10E/Ravenous%20Rats.full.jpg -ravenous_skirge.jpg http://[server]/US/Ravenous%20Skirge.full.jpg -ravenous_trap.jpg http://[server]/ZEN/Ravenous%20Trap.full.jpg -ravenous_vampire.jpg http://[server]/MI/Ravenous%20Vampire.full.jpg -ravens_crime.jpg http://[server]/EVE/Raven's%20Crime.full.jpg -ravens_run_dragoon.jpg http://[server]/SHM/Raven's%20Run%20Dragoon.full.jpg -raving_oni_slave.jpg http://[server]/SOK/Raving%20Oni-Slave.full.jpg -ray_of_command.jpg http://[server]/5E/Ray%20of%20Command.full.jpg -ray_of_distortion.jpg http://[server]/OD/Ray%20of%20Distortion.full.jpg -ray_of_erasure.jpg http://[server]/IA/Ray%20of%20Erasure.full.jpg -ray_of_revelation.jpg http://[server]/JU/Ray%20of%20Revelation.full.jpg -rayne_academy_chancellor.jpg http://[server]/UD/Rayne,%20Academy%20Chancellor.full.jpg -raze.jpg http://[server]/US/Raze.full.jpg -razia_boros_archangel.jpg http://[server]/HOP/Razia,%20Boros%20Archangel.full.jpg -razias_purification.jpg http://[server]/RAV/Razia's%20Purification.full.jpg -razing_snidd.jpg http://[server]/PS/Razing%20Snidd.full.jpg -razor_barrier.jpg http://[server]/MR/Razor%20Barrier.full.jpg -razor_golem.jpg http://[server]/DS/Razor%20Golem.full.jpg -razor_pendulum.jpg http://[server]/MI/Razor%20Pendulum.full.jpg -razorclaw_bear.jpg http://[server]/P2/Razorclaw%20Bear.full.jpg -razorfin_abolisher.jpg http://[server]/EVE/Razorfin%20Abolisher.full.jpg -razorfin_hunter.jpg http://[server]/AP/Razorfin%20Hunter.full.jpg -razorfoot_griffin.jpg http://[server]/M10/Razorfoot%20Griffin.full.jpg -razorgrass_screen.jpg http://[server]/FD/Razorgrass%20Screen.full.jpg -razorjaw_oni.jpg http://[server]/SOK/Razorjaw%20Oni.full.jpg -razormane_masticore.jpg http://[server]/10E/Razormane%20Masticore.full.jpg -razortooth_rats.jpg http://[server]/9E/Razortooth%20Rats.full.jpg -reach_of_branches.jpg http://[server]/MOR/Reach%20of%20Branches.full.jpg -reach_through_mists.jpg http://[server]/CHK/Reach%20Through%20Mists.full.jpg -read_the_runes.jpg http://[server]/ON/Read%20the%20Runes.full.jpg -reality_acid.jpg http://[server]/PLC/Reality%20Acid.full.jpg -reality_anchor.jpg http://[server]/TE/Reality%20Anchor.full.jpg -reality_ripple.jpg http://[server]/MI/Reality%20Ripple.full.jpg -reality_strobe.jpg http://[server]/FUT/Reality%20Strobe.full.jpg -reality_twist.jpg http://[server]/IA/Reality%20Twist.full.jpg -realm_razer.jpg http://[server]/ALA/Realm%20Razer.full.jpg -reanimate.jpg http://[server]/TE/Reanimate.full.jpg -reap.jpg http://[server]/TE/Reap.full.jpg -reap_and_sow.jpg http://[server]/DS/Reap%20and%20Sow.full.jpg -reaper_king.jpg http://[server]/SHM/Reaper%20King.full.jpg -reaping_the_graves.jpg http://[server]/SC/Reaping%20the%20Graves.full.jpg -reaping_the_rewards.jpg http://[server]/EX/Reaping%20the%20Rewards.full.jpg -rebel_informer.jpg http://[server]/PY/Rebel%20Informer.full.jpg -rebellion_of_the_flamekin.jpg http://[server]/LRW/Rebellion%20of%20the%20Flamekin.full.jpg -rebirth.jpg http://[server]/4E/Rebirth.full.jpg -reborn_hero.jpg http://[server]/TO/Reborn%20Hero.full.jpg -reborn_hope.jpg http://[server]/ARB/Reborn%20Hope.full.jpg -rebound.jpg http://[server]/SH/Rebound.full.jpg -rebuff_the_wicked.jpg http://[server]/PLC/Rebuff%20the%20Wicked.full.jpg -rebuild.jpg http://[server]/UL/Rebuild.full.jpg -rebuking_ceremony.jpg http://[server]/DS/Rebuking%20Ceremony.full.jpg -recall.jpg http://[server]/6E/Recall.full.jpg -recantation.jpg http://[server]/US/Recantation.full.jpg -reciprocate.jpg http://[server]/CHK/Reciprocate.full.jpg -reckless_abandon.jpg http://[server]/UD/Reckless%20Abandon.full.jpg -reckless_assault.jpg http://[server]/IN/Reckless%20Assault.full.jpg -reckless_charge.jpg http://[server]/OD/Reckless%20Charge.full.jpg -reckless_embermage.jpg http://[server]/7E/Reckless%20Embermage.full.jpg -reckless_ogre.jpg http://[server]/EX/Reckless%20Ogre.full.jpg -reckless_one.jpg http://[server]/ON/Reckless%20One.full.jpg -reckless_scholar.jpg http://[server]/ZEN/Reckless%20Scholar.full.jpg -reckless_spite.jpg http://[server]/IN/Reckless%20Spite.full.jpg -reckless_wurm.jpg http://[server]/PLC/Reckless%20Wurm.full.jpg -reclaim.jpg http://[server]/9E/Reclaim.full.jpg -reclamation.jpg http://[server]/IA/Reclamation.full.jpg -reclusive_wight.jpg http://[server]/US/Reclusive%20Wight.full.jpg -recoil.jpg http://[server]/IN/Recoil.full.jpg -recollect.jpg http://[server]/10E/Recollect.full.jpg -reconnaissance.jpg http://[server]/EX/Reconnaissance.full.jpg -reconstruction.jpg http://[server]/AQ/Reconstruction.full.jpg -recoup.jpg http://[server]/OD/Recoup.full.jpg -recover.jpg http://[server]/10E/Recover.full.jpg -recross_the_paths.jpg http://[server]/MOR/Recross%20the%20Paths.full.jpg -recumbent_bliss.jpg http://[server]/EVE/Recumbent%20Bliss.full.jpg -recuperate.jpg http://[server]/SC/Recuperate.full.jpg -recurring_nightmare.jpg http://[server]/EX/Recurring%20Nightmare.full.jpg -recycle.jpg http://[server]/TE/Recycle.full.jpg -red_cliffs_armada.jpg http://[server]/P3/Red%20Cliffs%20Armada.full.jpg -red_elemental_blast.jpg http://[server]/4E/Red%20Elemental%20Blast.full.jpg -red_hot_hottie.jpg http://[server]/UNH/Red-Hot%20Hottie.full.jpg -red_mana_battery.jpg http://[server]/4E/Red%20Mana%20Battery.full.jpg -red_scarab.jpg http://[server]/IA/Red%20Scarab.full.jpg -red_ward.jpg http://[server]/4E/Red%20Ward.full.jpg -redeem.jpg http://[server]/8E/Redeem.full.jpg -redeem_the_lost.jpg http://[server]/MOR/Redeem%20the%20Lost.full.jpg -reduce_to_dreams.jpg http://[server]/BOK/Reduce%20to%20Dreams.full.jpg -redwood_treefolk.jpg http://[server]/7E/Redwood%20Treefolk.full.jpg -reef_pirates.jpg http://[server]/5E/Reef%20Pirates.full.jpg -reef_shaman.jpg http://[server]/AP/Reef%20Shaman.full.jpg -reflect_damage.jpg http://[server]/MI/Reflect%20Damage.full.jpg -reflecting_mirror.jpg http://[server]/DK/Reflecting%20Mirror.full.jpg -reflecting_pool.jpg http://[server]/TE/Reflecting%20Pool.full.jpg -reflex_sliver.jpg http://[server]/PLC/Reflex%20Sliver.full.jpg -reflexes.jpg http://[server]/9E/Reflexes.full.jpg -refresh.jpg http://[server]/OD/Refresh.full.jpg -refreshing_rain.jpg http://[server]/NE/Refreshing%20Rain.full.jpg -regal_force.jpg http://[server]/EVE/Regal%20Force.full.jpg -regal_unicorn.jpg http://[server]/6E/Regal%20Unicorn.full.jpg -regenerate.jpg http://[server]/M10/Regenerate.full.jpg -regeneration.jpg http://[server]/10E/Regeneration.full.jpg -regress.jpg http://[server]/MR/Regress.full.jpg -regrowth.jpg http://[server]/U/Regrowth.full.jpg -reign_of_chaos.jpg http://[server]/MI/Reign%20of%20Chaos.full.jpg -reign_of_terror.jpg http://[server]/MI/Reign%20of%20Terror.full.jpg -reincarnation.jpg http://[server]/LG/Reincarnation.full.jpg -reinforcements.jpg http://[server]/CST/Reinforcements.full.jpg -reins_of_power.jpg http://[server]/SH/Reins%20of%20Power.full.jpg -reins_of_the_vinesteed.jpg http://[server]/MOR/Reins%20of%20the%20Vinesteed.full.jpg -reiterate.jpg http://[server]/TSP/Reiterate.full.jpg -reito_lantern.jpg http://[server]/CHK/Reito%20Lantern.full.jpg -reiver_demon.jpg http://[server]/MR/Reiver%20Demon.full.jpg -rejuvenate.jpg http://[server]/US/Rejuvenate.full.jpg -rejuvenation_chamber.jpg http://[server]/NE/Rejuvenation%20Chamber.full.jpg -reki_the_history_of_kamigawa.jpg http://[server]/SOK/Reki,%20the%20History%20of%20Kamigawa.full.jpg -rekindled_flame.jpg http://[server]/EVE/Rekindled%20Flame.full.jpg -reknit.jpg http://[server]/SHM/Reknit.full.jpg -relearn.jpg http://[server]/6E/Relearn.full.jpg -release_the_ants.jpg http://[server]/MOR/Release%20the%20Ants.full.jpg -relentless_assault.jpg http://[server]/10E/Relentless%20Assault.full.jpg -relentless_rats.jpg http://[server]/M10/Relentless%20Rats.full.jpg -relic_bane.jpg http://[server]/MR/Relic%20Bane.full.jpg -relic_barrier.jpg http://[server]/LG/Relic%20Barrier.full.jpg -relic_bind.jpg http://[server]/LG/Relic%20Bind.full.jpg -relic_crush.jpg http://[server]/ZEN/Relic%20Crush.full.jpg -relic_of_progenitus.jpg http://[server]/ALA/Relic%20of%20Progenitus.full.jpg -relic_ward.jpg http://[server]/VI/Relic%20Ward.full.jpg -reliquary_monk.jpg http://[server]/UD/Reliquary%20Monk.full.jpg -reliquary_tower.jpg http://[server]/CFX/Reliquary%20Tower.full.jpg -remand.jpg http://[server]/RAV/Remand.full.jpg -remedy.jpg http://[server]/6E/Remedy.full.jpg -remembrance.jpg http://[server]/US/Remembrance.full.jpg -reminisce.jpg http://[server]/10E/Reminisce.full.jpg -remodel.jpg http://[server]/UNH/Remodel.full.jpg -remote_farm.jpg http://[server]/MM/Remote%20Farm.full.jpg -remote_isle.jpg http://[server]/BD/Remote%20Isle.full.jpg -remove.jpg http://[server]/P2/Remove.full.jpg -remove_enchantments.jpg http://[server]/LG/Remove%20Enchantments.full.jpg -remove_soul.jpg http://[server]/10E/Remove%20Soul.full.jpg -rend_flesh.jpg http://[server]/CHK/Rend%20Flesh.full.jpg -rend_spirit.jpg http://[server]/CHK/Rend%20Spirit.full.jpg -rendclaw_trow.jpg http://[server]/EVE/Rendclaw%20Trow.full.jpg -rending_vines.jpg http://[server]/SOK/Rending%20Vines.full.jpg -renegade_troops.jpg http://[server]/P3/Renegade%20Troops.full.jpg -renegade_warlord.jpg http://[server]/TE/Renegade%20Warlord.full.jpg -renewal.jpg http://[server]/HL/Renewal.full.jpg -renewed_faith.jpg http://[server]/ON/Renewed%20Faith.full.jpg -renewing_dawn.jpg http://[server]/PT/Renewing%20Dawn.full.jpg -renewing_touch.jpg http://[server]/ST/Renewing%20Touch.full.jpg -renounce.jpg http://[server]/MM/Renounce.full.jpg -reparations.jpg http://[server]/MI/Reparations.full.jpg -repeal.jpg http://[server]/GP/Repeal.full.jpg -repel.jpg http://[server]/OD/Repel.full.jpg -repel_intruders.jpg http://[server]/SHM/Repel%20Intruders.full.jpg -repentance.jpg http://[server]/TE/Repentance.full.jpg -repentant_blacksmith.jpg http://[server]/5E/Repentant%20Blacksmith.full.jpg -repentant_vampire.jpg http://[server]/OD/Repentant%20Vampire.full.jpg -repercussion.jpg http://[server]/UD/Repercussion.full.jpg -replenish.jpg http://[server]/UD/Replenish.full.jpg -repopulate.jpg http://[server]/UL/Repopulate.full.jpg -reprisal.jpg http://[server]/7E/Reprisal.full.jpg -reprocess.jpg http://[server]/7E/Reprocess.full.jpg -repulse.jpg http://[server]/IN/Repulse.full.jpg -reroute.jpg http://[server]/RAV/Reroute.full.jpg -rescind.jpg http://[server]/US/Rescind.full.jpg -rescue.jpg http://[server]/UD/Rescue.full.jpg -research_the_deep.jpg http://[server]/MOR/Research%20the%20Deep.full.jpg -researchdevelopment.jpg http://[server]/DIS/ResearchDevelopment.full.jpg -reset.jpg http://[server]/LG/Reset.full.jpg -reshape.jpg http://[server]/DS/Reshape.full.jpg -resilient_wanderer.jpg http://[server]/OD/Resilient%20Wanderer.full.jpg -resistance_fighter.jpg http://[server]/6E/Resistance%20Fighter.full.jpg -resize.jpg http://[server]/CS/Resize.full.jpg -resounding_roar.jpg http://[server]/ALA/Resounding%20Roar.full.jpg -resounding_scream.jpg http://[server]/ALA/Resounding%20Scream.full.jpg -resounding_silence.jpg http://[server]/ALA/Resounding%20Silence.full.jpg -resounding_thunder.jpg http://[server]/ALA/Resounding%20Thunder.full.jpg -resounding_wave.jpg http://[server]/ALA/Resounding%20Wave.full.jpg -respite.jpg http://[server]/TE/Respite.full.jpg -resplendent_mentor.jpg http://[server]/SHM/Resplendent%20Mentor.full.jpg -restless_apparition.jpg http://[server]/EVE/Restless%20Apparition.full.jpg -restless_bones.jpg http://[server]/GP/Restless%20Bones.full.jpg -restless_dead.jpg http://[server]/MI/Restless%20Dead.full.jpg -restless_dreams.jpg http://[server]/TO/Restless%20Dreams.full.jpg -restock.jpg http://[server]/IN/Restock.full.jpg -restore_balance.jpg http://[server]/TSP/Restore%20Balance.full.jpg -restrain.jpg http://[server]/IN/Restrain.full.jpg -resurrection.jpg http://[server]/U/Resurrection.full.jpg -resuscitate.jpg http://[server]/EX/Resuscitate.full.jpg -retaliate.jpg http://[server]/FD/Retaliate.full.jpg -retaliation.jpg http://[server]/US/Retaliation.full.jpg -retaliator_griffin.jpg http://[server]/ARB/Retaliator%20Griffin.full.jpg -retether.jpg http://[server]/PLC/Retether.full.jpg -rethink.jpg http://[server]/PY/Rethink.full.jpg -retraced_image.jpg http://[server]/TO/Retraced%20Image.full.jpg -retract.jpg http://[server]/DS/Retract.full.jpg -retribution.jpg http://[server]/HL/Retribution.full.jpg -retribution_of_the_meek.jpg http://[server]/VI/Retribution%20of%20the%20Meek.full.jpg -retromancer.jpg http://[server]/US/Retromancer.full.jpg -return_of_the_nightstalkers.jpg http://[server]/P2/Return%20of%20the%20Nightstalkers.full.jpg -return_to_battle.jpg http://[server]/P3/Return%20to%20Battle.full.jpg -return_to_dust.jpg http://[server]/TSP/Return%20to%20Dust.full.jpg -reveillark.jpg http://[server]/MOR/Reveillark.full.jpg -reveille_squad.jpg http://[server]/PY/Reveille%20Squad.full.jpg -reveka_wizard_savant.jpg http://[server]/HL/Reveka,%20Wizard%20Savant.full.jpg -revelation.jpg http://[server]/LG/Revelation.full.jpg -revelsong_horn.jpg http://[server]/SHM/Revelsong%20Horn.full.jpg -revenant.jpg http://[server]/7E/Revenant.full.jpg -revenant_patriarch.jpg http://[server]/GP/Revenant%20Patriarch.full.jpg -reverberation.jpg http://[server]/LG/Reverberation.full.jpg -revered_dead.jpg http://[server]/PLC/Revered%20Dead.full.jpg -revered_elder.jpg http://[server]/MM/Revered%20Elder.full.jpg -revered_unicorn.jpg http://[server]/WL/Revered%20Unicorn.full.jpg -reverence.jpg http://[server]/SOK/Reverence.full.jpg -reverent_mantra.jpg http://[server]/MM/Reverent%20Mantra.full.jpg -reverent_silence.jpg http://[server]/NE/Reverent%20Silence.full.jpg -reversal_of_fortune.jpg http://[server]/FD/Reversal%20of%20Fortune.full.jpg -reverse_damage.jpg http://[server]/9E/Reverse%20Damage.full.jpg -reverse_polarity.jpg http://[server]/AQ/Reverse%20Polarity.full.jpg -reverse_the_sands.jpg http://[server]/CHK/Reverse%20the%20Sands.full.jpg -revive.jpg http://[server]/8E/Revive.full.jpg -revive_the_fallen.jpg http://[server]/MOR/Revive%20the%20Fallen.full.jpg -reviving_dose.jpg http://[server]/10E/Reviving%20Dose.full.jpg -reviving_vapors.jpg http://[server]/IN/Reviving%20Vapors.full.jpg -reward_the_faithful.jpg http://[server]/SC/Reward%20the%20Faithful.full.jpg -rewards_of_diversity.jpg http://[server]/IN/Rewards%20of%20Diversity.full.jpg -reweave.jpg http://[server]/CHK/Reweave.full.jpg -rewind.jpg http://[server]/9E/Rewind.full.jpg -reya_dawnbringer.jpg http://[server]/10E/Reya%20Dawnbringer.full.jpg -rhox.jpg http://[server]/10E/Rhox.full.jpg -rhox_bodyguard.jpg http://[server]/CFX/Rhox%20Bodyguard.full.jpg -rhox_brute.jpg http://[server]/ARB/Rhox%20Brute.full.jpg -rhox_charger.jpg http://[server]/ALA/Rhox%20Charger.full.jpg -rhox_meditant.jpg http://[server]/CFX/Rhox%20Meditant.full.jpg -rhox_pikemaster.jpg http://[server]/M10/Rhox%20Pikemaster.full.jpg -rhox_war_monk.jpg http://[server]/ALA/Rhox%20War%20Monk.full.jpg -rhys_the_exiled.jpg http://[server]/MOR/Rhys%20the%20Exiled.full.jpg -rhys_the_redeemed.jpg http://[server]/SHM/Rhys%20the%20Redeemed.full.jpg -rhystic_cave.jpg http://[server]/PY/Rhystic%20Cave.full.jpg -rhystic_circle.jpg http://[server]/PY/Rhystic%20Circle.full.jpg -rhystic_deluge.jpg http://[server]/PY/Rhystic%20Deluge.full.jpg -rhystic_lightning.jpg http://[server]/PY/Rhystic%20Lightning.full.jpg -rhystic_scrying.jpg http://[server]/PY/Rhystic%20Scrying.full.jpg -rhystic_shield.jpg http://[server]/PY/Rhystic%20Shield.full.jpg -rhystic_study.jpg http://[server]/PY/Rhystic%20Study.full.jpg -rhystic_syphon.jpg http://[server]/PY/Rhystic%20Syphon.full.jpg -rhystic_tutor.jpg http://[server]/PY/Rhystic%20Tutor.full.jpg -rib_cage_spider.jpg http://[server]/PY/Rib%20Cage%20Spider.full.jpg -ribbon_snake.jpg http://[server]/PY/Ribbon%20Snake.full.jpg -ribbons_of_night.jpg http://[server]/RAV/Ribbons%20of%20Night.full.jpg -ribbons_of_the_reikai.jpg http://[server]/BOK/Ribbons%20of%20the%20Reikai.full.jpg -richard_garfield_ph.d..jpg http://[server]/UNH/Richard%20Garfield,%20Ph.D..full.jpg -ricochet.jpg http://[server]/UG/Ricochet.full.jpg -riddle_of_lightning.jpg http://[server]/FUT/Riddle%20of%20Lightning.full.jpg -ridge_rannet.jpg http://[server]/ALA/Ridge%20Rannet.full.jpg -ridged_kusite.jpg http://[server]/PLC/Ridged%20Kusite.full.jpg -ridgeline_rager.jpg http://[server]/8E/Ridgeline%20Rager.full.jpg -ridgetop_raptor.jpg http://[server]/LE/Ridgetop%20Raptor.full.jpg -riding_red_hare.jpg http://[server]/P3/Riding%20Red%20Hare.full.jpg -riding_the_dilu_horse.jpg http://[server]/P3/Riding%20the%20Dilu%20Horse.full.jpg -rift_bolt.jpg http://[server]/TSP/Rift%20Bolt.full.jpg -rift_elemental.jpg http://[server]/FUT/Rift%20Elemental.full.jpg -riftmarked_knight.jpg http://[server]/PLC/Riftmarked%20Knight.full.jpg -riftstone_portal.jpg http://[server]/JU/Riftstone%20Portal.full.jpg -riftsweeper.jpg http://[server]/FUT/Riftsweeper.full.jpg -riftwing_cloudskate.jpg http://[server]/TSP/Riftwing%20Cloudskate.full.jpg -righteous_aura.jpg http://[server]/MM/Righteous%20Aura.full.jpg -righteous_avengers.jpg http://[server]/LG/Righteous%20Avengers.full.jpg -righteous_cause.jpg http://[server]/ON/Righteous%20Cause.full.jpg -righteous_charge.jpg http://[server]/ST/Righteous%20Charge.full.jpg -righteous_fury.jpg http://[server]/ST/Righteous%20Fury.full.jpg -righteous_indignation.jpg http://[server]/MM/Righteous%20Indignation.full.jpg -righteous_war.jpg http://[server]/VI/Righteous%20War.full.jpg -righteousness.jpg http://[server]/M10/Righteousness.full.jpg -rime_dryad.jpg http://[server]/IA/Rime%20Dryad.full.jpg -rime_transfusion.jpg http://[server]/CS/Rime%20Transfusion.full.jpg -rimebound_dead.jpg http://[server]/CS/Rimebound%20Dead.full.jpg -rimefeather_owl.jpg http://[server]/CS/Rimefeather%20Owl.full.jpg -rimehorn_aurochs.jpg http://[server]/CS/Rimehorn%20Aurochs.full.jpg -rimescale_dragon.jpg http://[server]/CS/Rimescale%20Dragon.full.jpg -rimewind_cryomancer.jpg http://[server]/CS/Rimewind%20Cryomancer.full.jpg -rimewind_taskmage.jpg http://[server]/CS/Rimewind%20Taskmage.full.jpg -ring_of_gix.jpg http://[server]/UL/Ring%20of%20Gix.full.jpg -ring_of_immortals.jpg http://[server]/LG/Ring%20of%20Immortals.full.jpg -ring_of_maruf.jpg http://[server]/AN/Ring%20of%20Ma'ruf.full.jpg -ring_of_renewal.jpg http://[server]/FE/Ring%20of%20Renewal.full.jpg -rings_of_brighthearth.jpg http://[server]/LRW/Rings%20of%20Brighthearth.full.jpg -ringskipper.jpg http://[server]/LRW/Ringskipper.full.jpg -riot_spikes.jpg http://[server]/DIS/Riot%20Spikes.full.jpg -rip_clan_crasher.jpg http://[server]/ALA/Rip-Clan%20Crasher.full.jpg -riptide.jpg http://[server]/DK/Riptide.full.jpg -riptide_biologist.jpg http://[server]/ON/Riptide%20Biologist.full.jpg -riptide_chronologist.jpg http://[server]/ON/Riptide%20Chronologist.full.jpg -riptide_crab.jpg http://[server]/IN/Riptide%20Crab.full.jpg -riptide_director.jpg http://[server]/LE/Riptide%20Director.full.jpg -riptide_entrancer.jpg http://[server]/ON/Riptide%20Entrancer.full.jpg -riptide_laboratory.jpg http://[server]/ON/Riptide%20Laboratory.full.jpg -riptide_mangler.jpg http://[server]/LE/Riptide%20Mangler.full.jpg -riptide_pilferer.jpg http://[server]/PLC/Riptide%20Pilferer.full.jpg -riptide_replicator.jpg http://[server]/ON/Riptide%20Replicator.full.jpg -riptide_shapeshifter.jpg http://[server]/ON/Riptide%20Shapeshifter.full.jpg -riptide_survivor.jpg http://[server]/SC/Riptide%20Survivor.full.jpg -rise_from_the_grave.jpg http://[server]/M10/Rise%20from%20the%20Grave.full.jpg -rise_of_the_hobgoblins.jpg http://[server]/EVE/Rise%20of%20the%20Hobgoblins.full.jpg -risefall.jpg http://[server]/DIS/RiseFall.full.jpg -rishadan_airship.jpg http://[server]/MM/Rishadan%20Airship.full.jpg -rishadan_brigand.jpg http://[server]/MM/Rishadan%20Brigand.full.jpg -rishadan_cutpurse.jpg http://[server]/MM/Rishadan%20Cutpurse.full.jpg -rishadan_footpad.jpg http://[server]/MM/Rishadan%20Footpad.full.jpg -rishadan_pawnshop.jpg http://[server]/MM/Rishadan%20Pawnshop.full.jpg -rishadan_port.jpg http://[server]/MM/Rishadan%20Port.full.jpg -rising_waters.jpg http://[server]/NE/Rising%20Waters.full.jpg -risky_move.jpg http://[server]/ON/Risky%20Move.full.jpg -rite_of_consumption.jpg http://[server]/SHM/Rite%20of%20Consumption.full.jpg -rite_of_flame.jpg http://[server]/CS/Rite%20of%20Flame.full.jpg -rite_of_passage.jpg http://[server]/FD/Rite%20of%20Passage.full.jpg -rite_of_replication.jpg http://[server]/ZEN/Rite%20of%20Replication.full.jpg -rites_of_flourishing.jpg http://[server]/FUT/Rites%20of%20Flourishing.full.jpg -rites_of_initiation.jpg http://[server]/OD/Rites%20of%20Initiation.full.jpg -rites_of_refusal.jpg http://[server]/OD/Rites%20of%20Refusal.full.jpg -rites_of_spring.jpg http://[server]/OD/Rites%20of%20Spring.full.jpg -rith_the_awakener.jpg http://[server]/IN/Rith,%20the%20Awakener.full.jpg -riths_attendant.jpg http://[server]/IN/Rith's%20Attendant.full.jpg -riths_charm.jpg http://[server]/PS/Rith's%20Charm.full.jpg -riths_grove.jpg http://[server]/PS/Rith's%20Grove.full.jpg -ritual_of_restoration.jpg http://[server]/DS/Ritual%20of%20Restoration.full.jpg -ritual_of_steel.jpg http://[server]/MI/Ritual%20of%20Steel.full.jpg -ritual_of_subdual.jpg http://[server]/IA/Ritual%20of%20Subdual.full.jpg -ritual_of_the_machine.jpg http://[server]/AL/Ritual%20of%20the%20Machine.full.jpg -rivalry.jpg http://[server]/UL/Rivalry.full.jpg -rivals_duel.jpg http://[server]/MOR/Rivals'%20Duel.full.jpg -riven_turnbull.jpg http://[server]/LG/Riven%20Turnbull.full.jpg -river_bear.jpg http://[server]/9E/River%20Bear.full.jpg -river_boa.jpg http://[server]/6E/River%20Boa.full.jpg -river_delta.jpg http://[server]/IA/River%20Delta.full.jpg -river_kaijin.jpg http://[server]/CHK/River%20Kaijin.full.jpg -river_kelpie.jpg http://[server]/SHM/River%20Kelpie.full.jpg -river_merfolk.jpg http://[server]/FE/River%20Merfolk.full.jpg -river_of_tears.jpg http://[server]/FUT/River%20of%20Tears.full.jpg -riverfall_mimic.jpg http://[server]/EVE/Riverfall%20Mimic.full.jpg -rivers_grasp.jpg http://[server]/SHM/River's%20Grasp.full.jpg -rix_maadi_dungeon_palace.jpg http://[server]/DIS/Rix%20Maadi,%20Dungeon%20Palace.full.jpg -roar_of_jukai.jpg http://[server]/BOK/Roar%20of%20Jukai.full.jpg -roar_of_reclamation.jpg http://[server]/FD/Roar%20of%20Reclamation.full.jpg -roar_of_the_crowd.jpg http://[server]/MOR/Roar%20of%20the%20Crowd.full.jpg -roar_of_the_kha.jpg http://[server]/MR/Roar%20of%20the%20Kha.full.jpg -roar_of_the_wurm.jpg http://[server]/OD/Roar%20of%20the%20Wurm.full.jpg -roaring_slagwurm.jpg http://[server]/DS/Roaring%20Slagwurm.full.jpg -robber_fly.jpg http://[server]/MM/Robber%20Fly.full.jpg -robe_of_mirrors.jpg http://[server]/10E/Robe%20of%20Mirrors.full.jpg -roc_hatchling.jpg http://[server]/WL/Roc%20Hatchling.full.jpg -roc_of_kher_ridges.jpg http://[server]/U/Roc%20of%20Kher%20Ridges.full.jpg -rock_badger.jpg http://[server]/10E/Rock%20Badger.full.jpg -rock_basilisk.jpg http://[server]/MI/Rock%20Basilisk.full.jpg -rock_hydra.jpg http://[server]/U/Rock%20Hydra.full.jpg -rock_jockey.jpg http://[server]/SC/Rock%20Jockey.full.jpg -rock_lobster.jpg http://[server]/UG/Rock%20Lobster.full.jpg -rock_slide.jpg http://[server]/VI/Rock%20Slide.full.jpg -rockcaster_platoon.jpg http://[server]/ALA/Rockcaster%20Platoon.full.jpg -rocket_launcher.jpg http://[server]/AQ/Rocket%20Launcher.full.jpg -rocket_powered_turbo_slug.jpg http://[server]/UNH/Rocket-Powered%20Turbo%20Slug.full.jpg -rockshard_elemental.jpg http://[server]/LE/Rockshard%20Elemental.full.jpg -rockslide_ambush.jpg http://[server]/P3/Rockslide%20Ambush.full.jpg -rockslide_elemental.jpg http://[server]/ALA/Rockslide%20Elemental.full.jpg -rocky_tar_pit.jpg http://[server]/MI/Rocky%20Tar%20Pit.full.jpg -rod_of_ruin.jpg http://[server]/M10/Rod%20of%20Ruin.full.jpg -rod_of_spanking.jpg http://[server]/UNH/Rod%20of%20Spanking.full.jpg -rofellos.jpg http://[server]/VG/Rofellos.full.jpg -rofellos_llanowar_emissary.jpg http://[server]/UD/Rofellos,%20Llanowar%20Emissary.full.jpg -rofelloss_gift.jpg http://[server]/UD/Rofellos's%20Gift.full.jpg -rogue_elephant.jpg http://[server]/WL/Rogue%20Elephant.full.jpg -rogue_kavu.jpg http://[server]/IN/Rogue%20Kavu.full.jpg -rogue_skycaptain.jpg http://[server]/AL/Rogue%20Skycaptain.full.jpg -rohgahh_of_kher_keep.jpg http://[server]/LG/Rohgahh%20of%20Kher%20Keep.full.jpg -roil_elemental.jpg http://[server]/ZEN/Roil%20Elemental.full.jpg -roiling_horror.jpg http://[server]/PLC/Roiling%20Horror.full.jpg -rolling_earthquake.jpg http://[server]/P3/Rolling%20Earthquake.full.jpg -rolling_spoil.jpg http://[server]/RAV/Rolling%20Spoil.full.jpg -rolling_stones.jpg http://[server]/8E/Rolling%20Stones.full.jpg -rolling_thunder.jpg http://[server]/TE/Rolling%20Thunder.full.jpg -ronin_cavekeeper.jpg http://[server]/SOK/Ronin%20Cavekeeper.full.jpg -ronin_cliffrider.jpg http://[server]/BOK/Ronin%20Cliffrider.full.jpg -ronin_houndmaster.jpg http://[server]/CHK/Ronin%20Houndmaster.full.jpg -ronin_warclub.jpg http://[server]/BOK/Ronin%20Warclub.full.jpg -ronom_hulk.jpg http://[server]/CS/Ronom%20Hulk.full.jpg -ronom_serpent.jpg http://[server]/CS/Ronom%20Serpent.full.jpg -ronom_unicorn.jpg http://[server]/CS/Ronom%20Unicorn.full.jpg -roofstalker_wight.jpg http://[server]/RAV/Roofstalker%20Wight.full.jpg -root_cage.jpg http://[server]/PY/Root%20Cage.full.jpg -root_elemental.jpg http://[server]/SC/Root%20Elemental.full.jpg -root_greevil.jpg http://[server]/PS/Root%20Greevil.full.jpg -root_kin_ally.jpg http://[server]/RAV/Root-Kin%20Ally.full.jpg -root_maze.jpg http://[server]/10E/Root%20Maze.full.jpg -root_sliver.jpg http://[server]/LE/Root%20Sliver.full.jpg -root_spider.jpg http://[server]/HL/Root%20Spider.full.jpg -rootbound_crag.jpg http://[server]/M10/Rootbound%20Crag.full.jpg -rootbreaker_wurm.jpg http://[server]/9E/Rootbreaker%20Wurm.full.jpg -rootgrapple.jpg http://[server]/LRW/Rootgrapple.full.jpg -rooting_kavu.jpg http://[server]/IN/Rooting%20Kavu.full.jpg -rootrunner.jpg http://[server]/CHK/Rootrunner.full.jpg -roots.jpg http://[server]/HL/Roots.full.jpg -roots_of_life.jpg http://[server]/MI/Roots%20of%20Life.full.jpg -rootwalla.jpg http://[server]/10E/Rootwalla.full.jpg -rootwater_alligator.jpg http://[server]/EX/Rootwater%20Alligator.full.jpg -rootwater_commando.jpg http://[server]/10E/Rootwater%20Commando.full.jpg -rootwater_depths.jpg http://[server]/TE/Rootwater%20Depths.full.jpg -rootwater_diver.jpg http://[server]/TE/Rootwater%20Diver.full.jpg -rootwater_hunter.jpg http://[server]/TE/Rootwater%20Hunter.full.jpg -rootwater_matriarch.jpg http://[server]/10E/Rootwater%20Matriarch.full.jpg -rootwater_mystic.jpg http://[server]/EX/Rootwater%20Mystic.full.jpg -rootwater_shaman.jpg http://[server]/TE/Rootwater%20Shaman.full.jpg -rootwater_thief.jpg http://[server]/NE/Rootwater%20Thief.full.jpg -rorix_bladewing.jpg http://[server]/HOP/Rorix%20Bladewing.full.jpg -rosheen_meanderer.jpg http://[server]/SHM/Rosheen%20Meanderer.full.jpg -roterothopter.jpg http://[server]/HL/Roterothopter.full.jpg -rotlung_reanimator.jpg http://[server]/ON/Rotlung%20Reanimator.full.jpg -rotting_giant.jpg http://[server]/OD/Rotting%20Giant.full.jpg -rotting_rats.jpg http://[server]/CFX/Rotting%20Rats.full.jpg -roughshod_mentor.jpg http://[server]/SHM/Roughshod%20Mentor.full.jpg -roughtumble.jpg http://[server]/PLC/RoughTumble.full.jpg -rouse.jpg http://[server]/MM/Rouse.full.jpg -rout.jpg http://[server]/IN/Rout.full.jpg -rowan_treefolk.jpg http://[server]/PT/Rowan%20Treefolk.full.jpg -rowen.jpg http://[server]/7E/Rowen.full.jpg -royal_assassin.jpg http://[server]/M10/Royal%20Assassin.full.jpg -royal_decree.jpg http://[server]/AL/Royal%20Decree.full.jpg -royal_falcon.jpg http://[server]/ST/Royal%20Falcon.full.jpg -royal_herbalist.jpg http://[server]/AL/Royal%20Herbalist1.full.jpg -royal_trooper.jpg http://[server]/ST/Royal%20Trooper.full.jpg -rubinia_soulsinger.jpg http://[server]/LG/Rubinia%20Soulsinger.full.jpg -ruby_leech.jpg http://[server]/IN/Ruby%20Leech.full.jpg -ruby_medallion.jpg http://[server]/TE/Ruby%20Medallion.full.jpg -rude_awakening.jpg http://[server]/FD/Rude%20Awakening.full.jpg -rugged_prairie.jpg http://[server]/EVE/Rugged%20Prairie.full.jpg -ruham_djinn.jpg http://[server]/IN/Ruham%20Djinn.full.jpg -ruination.jpg http://[server]/SH/Ruination.full.jpg -ruinous_minotaur.jpg http://[server]/ZEN/Ruinous%20Minotaur.full.jpg -ruins_of_trokair.jpg http://[server]/6E/Ruins%20of%20Trokair.full.jpg -rukh_egg.jpg http://[server]/9E/Rukh%20Egg.full.jpg -rule_of_law.jpg http://[server]/10E/Rule%20of%20Law.full.jpg -rumbling_crescendo.jpg http://[server]/US/Rumbling%20Crescendo.full.jpg -rumbling_slum.jpg http://[server]/GP/Rumbling%20Slum.full.jpg -rummaging_wizard.jpg http://[server]/ON/Rummaging%20Wizard.full.jpg -run_wild.jpg http://[server]/ON/Run%20Wild.full.jpg -rune_cervin_rider.jpg http://[server]/SHM/Rune-Cervin%20Rider.full.jpg -rune_of_protection_artifacts.jpg http://[server]/US/Rune%20of%20Protection%20Artifacts.full.jpg -rune_of_protection_black.jpg http://[server]/US/Rune%20of%20Protection%20Black.full.jpg -rune_of_protection_blue.jpg http://[server]/US/Rune%20of%20Protection%20Blue.full.jpg -rune_of_protection_green.jpg http://[server]/US/Rune%20of%20Protection%20Green.full.jpg -rune_of_protection_lands.jpg http://[server]/US/Rune%20of%20Protection%20Lands.full.jpg -rune_of_protection_red.jpg http://[server]/US/Rune%20of%20Protection%20Red.full.jpg -rune_of_protection_white.jpg http://[server]/US/Rune%20of%20Protection%20White.full.jpg -rune_snag.jpg http://[server]/CS/Rune%20Snag.full.jpg -rune_tail_kitsune_ascendant.jpg http://[server]/SOK/Rune-Tail,%20Kitsune%20Ascendant.full.jpg -runeboggle.jpg http://[server]/GP/Runeboggle.full.jpg -runeclaw_bear.jpg http://[server]/M10/Runeclaw%20Bear.full.jpg -runed_arch.jpg http://[server]/IA/Runed%20Arch.full.jpg -runed_halo.jpg http://[server]/SHM/Runed%20Halo.full.jpg -runed_stalactite.jpg http://[server]/LRW/Runed%20Stalactite.full.jpg -runeflare_trap.jpg http://[server]/ZEN/Runeflare%20Trap.full.jpg -runes_of_the_deus.jpg http://[server]/SHM/Runes%20of%20the%20Deus.full.jpg -runesword.jpg http://[server]/CH/Runesword.full.jpg -rupture.jpg http://[server]/NE/Rupture.full.jpg -rupture_spire.jpg http://[server]/CFX/Rupture%20Spire.full.jpg -rush_of_knowledge.jpg http://[server]/SC/Rush%20of%20Knowledge.full.jpg -rushing_river.jpg http://[server]/PS/Rushing%20River.full.jpg -rushing_tide_zubera.jpg http://[server]/SOK/Rushing-Tide%20Zubera.full.jpg -rushwood_dryad.jpg http://[server]/10E/Rushwood%20Dryad.full.jpg -rushwood_elemental.jpg http://[server]/MM/Rushwood%20Elemental.full.jpg -rushwood_grove.jpg http://[server]/MM/Rushwood%20Grove.full.jpg -rushwood_herbalist.jpg http://[server]/MM/Rushwood%20Herbalist.full.jpg -rushwood_legate.jpg http://[server]/MM/Rushwood%20Legate.full.jpg -rust.jpg http://[server]/LG/Rust.full.jpg -rust_elemental.jpg http://[server]/MR/Rust%20Elemental.full.jpg -rustic_clachan.jpg http://[server]/MOR/Rustic%20Clachan.full.jpg -rusting_golem.jpg http://[server]/NE/Rusting%20Golem.full.jpg -rustmouth_ogre.jpg http://[server]/MR/Rustmouth%20Ogre.full.jpg -rustrazor_butcher.jpg http://[server]/SHM/Rustrazor%20Butcher.full.jpg -rustspore_ram.jpg http://[server]/MR/Rustspore%20Ram.full.jpg -rysorian_badger.jpg http://[server]/HL/Rysorian%20Badger.full.jpg -ryusei_the_falling_star.jpg http://[server]/CHK/Ryusei,%20the%20Falling%20Star.full.jpg \ No newline at end of file diff --git a/res/pics_link/card-pictures_s.txt b/res/pics_link/card-pictures_s.txt deleted file mode 100644 index 9fffc28a0d5..00000000000 --- a/res/pics_link/card-pictures_s.txt +++ /dev/null @@ -1,1512 +0,0 @@ -s.n.o.t..jpg http://[server]/UNH/S.N.O.T..full.jpg -saber_ants.jpg http://[server]/MM/Saber%20Ants.full.jpg -sabertooth_alley_cat.jpg http://[server]/RAV/Sabertooth%20Alley%20Cat.full.jpg -sabertooth_cobra.jpg http://[server]/MI/Sabertooth%20Cobra.full.jpg -sabertooth_nishoba.jpg http://[server]/IN/Sabertooth%20Nishoba.full.jpg -sabertooth_wyvern.jpg http://[server]/EX/Sabertooth%20Wyvern.full.jpg -sabretooth_tiger.jpg http://[server]/8E/Sabretooth%20Tiger.full.jpg -sacellum_archers.jpg http://[server]/CFX/Sacellum%20Archers.full.jpg -sacellum_godspeaker.jpg http://[server]/ALA/Sacellum%20Godspeaker.full.jpg -sachi_daughter_of_seshiro.jpg http://[server]/CHK/Sachi,%20Daughter%20of%20Seshiro.full.jpg -sacred_boon.jpg http://[server]/5E/Sacred%20Boon.full.jpg -sacred_foundry.jpg http://[server]/RAV/Sacred%20Foundry.full.jpg -sacred_ground.jpg http://[server]/9E/Sacred%20Ground.full.jpg -sacred_guide.jpg http://[server]/TE/Sacred%20Guide.full.jpg -sacred_knight.jpg http://[server]/PT/Sacred%20Knight.full.jpg -sacred_mesa.jpg http://[server]/MI/Sacred%20Mesa.full.jpg -sacred_nectar.jpg http://[server]/9E/Sacred%20Nectar.full.jpg -sacred_prey.jpg http://[server]/MM/Sacred%20Prey.full.jpg -sacred_rites.jpg http://[server]/OD/Sacred%20Rites.full.jpg -sacrifice.jpg http://[server]/U/Sacrifice.full.jpg -sadistic_augermage.jpg http://[server]/RAV/Sadistic%20Augermage.full.jpg -sadistic_glee.jpg http://[server]/TE/Sadistic%20Glee.full.jpg -sadistic_hypnotist.jpg http://[server]/OD/Sadistic%20Hypnotist.full.jpg -sadistic_sacrament.jpg http://[server]/ZEN/Sadistic%20Sacrament.full.jpg -safe_haven.jpg http://[server]/DK/Safe%20Haven.full.jpg -safe_passage.jpg http://[server]/M10/Safe%20Passage.full.jpg -safeguard.jpg http://[server]/TE/Safeguard.full.jpg -safehold_duo.jpg http://[server]/SHM/Safehold%20Duo.full.jpg -safehold_elite.jpg http://[server]/SHM/Safehold%20Elite.full.jpg -safehold_sentry.jpg http://[server]/SHM/Safehold%20Sentry.full.jpg -safewright_quest.jpg http://[server]/SHM/Safewright%20Quest.full.jpg -saffi_eriksdotter.jpg http://[server]/TSP/Saffi%20Eriksdotter.full.jpg -sage_aven.jpg http://[server]/ON/Sage%20Aven.full.jpg -sage_of_epityr.jpg http://[server]/TSP/Sage%20of%20Epityr.full.jpg -sage_of_fables.jpg http://[server]/MOR/Sage%20of%20Fables.full.jpg -sage_of_lat_nam.jpg http://[server]/8E/Sage%20of%20Lat-Nam.full.jpg -sage_owl.jpg http://[server]/M10/Sage%20Owl.full.jpg -sages_dousing.jpg http://[server]/MOR/Sage's%20Dousing.full.jpg -sages_knowledge.jpg http://[server]/P3/Sage's%20Knowledge.full.jpg -sages_of_the_anima.jpg http://[server]/ARB/Sages%20of%20the%20Anima.full.jpg -sailmonger.jpg http://[server]/MM/Sailmonger.full.jpg -sakashima_the_impostor.jpg http://[server]/SOK/Sakashima%20the%20Impostor.full.jpg -sakiko_mother_of_summer.jpg http://[server]/BOK/Sakiko,%20Mother%20of%20Summer.full.jpg -sakura_tribe_elder.jpg http://[server]/CHK/Sakura-Tribe%20Elder.full.jpg -sakura_tribe_scout.jpg http://[server]/SOK/Sakura-Tribe%20Scout.full.jpg -sakura_tribe_springcaller.jpg http://[server]/BOK/Sakura-Tribe%20Springcaller.full.jpg -salt_flats.jpg http://[server]/TE/Salt%20Flats.full.jpg -salt_marsh.jpg http://[server]/8E/Salt%20Marsh.full.jpg -saltblast.jpg http://[server]/PLC/Saltblast.full.jpg -saltcrusted_steppe.jpg http://[server]/TSP/Saltcrusted%20Steppe.full.jpg -saltfield_recluse.jpg http://[server]/PLC/Saltfield%20Recluse.full.jpg -saltskitter.jpg http://[server]/FUT/Saltskitter.full.jpg -salvage.jpg http://[server]/P2/Salvage.full.jpg -salvage_slasher.jpg http://[server]/CFX/Salvage%20Slasher.full.jpg -salvage_titan.jpg http://[server]/ALA/Salvage%20Titan.full.jpg -salvaging_station.jpg http://[server]/FD/Salvaging%20Station.full.jpg -samite_alchemist.jpg http://[server]/HL/Samite%20Alchemist1.full.jpg -samite_archer.jpg http://[server]/IN/Samite%20Archer.full.jpg -samite_blessing.jpg http://[server]/SH/Samite%20Blessing.full.jpg -samite_censer_bearer.jpg http://[server]/FUT/Samite%20Censer-Bearer.full.jpg -samite_elder.jpg http://[server]/PS/Samite%20Elder.full.jpg -samite_healer.jpg http://[server]/10E/Samite%20Healer.full.jpg -samite_ministration.jpg http://[server]/IN/Samite%20Ministration.full.jpg -samite_pilgrim.jpg http://[server]/PS/Samite%20Pilgrim.full.jpg -samite_sanctuary.jpg http://[server]/PY/Samite%20Sanctuary.full.jpg -samurai_enforcers.jpg http://[server]/CHK/Samurai%20Enforcers.full.jpg -samurai_of_the_pale_curtain.jpg http://[server]/CHK/Samurai%20of%20the%20Pale%20Curtain.full.jpg -sanctimony.jpg http://[server]/8E/Sanctimony.full.jpg -sanctum_custodian.jpg http://[server]/US/Sanctum%20Custodian.full.jpg -sanctum_gargoyle.jpg http://[server]/ALA/Sanctum%20Gargoyle.full.jpg -sanctum_guardian.jpg http://[server]/9E/Sanctum%20Guardian.full.jpg -sanctum_plowbeast.jpg http://[server]/ARB/Sanctum%20Plowbeast.full.jpg -sand_golem.jpg http://[server]/MI/Sand%20Golem.full.jpg -sand_silos.jpg http://[server]/5E/Sand%20Silos.full.jpg -sand_squid.jpg http://[server]/MM/Sand%20Squid.full.jpg -sandals_of_abdallah.jpg http://[server]/AN/Sandals%20of%20Abdallah.full.jpg -sandbar_crocodile.jpg http://[server]/MI/Sandbar%20Crocodile.full.jpg -sandbar_merfolk.jpg http://[server]/US/Sandbar%20Merfolk.full.jpg -sandbar_serpent.jpg http://[server]/US/Sandbar%20Serpent.full.jpg -sands_of_time.jpg http://[server]/VI/Sands%20of%20Time.full.jpg -sandskin.jpg http://[server]/ON/Sandskin.full.jpg -sandsower.jpg http://[server]/RAV/Sandsower.full.jpg -sandstone_deadfall.jpg http://[server]/OD/Sandstone%20Deadfall.full.jpg -sandstone_needle.jpg http://[server]/MM/Sandstone%20Needle.full.jpg -sandstone_warrior.jpg http://[server]/9E/Sandstone%20Warrior.full.jpg -sandstorm.jpg http://[server]/MI/Sandstorm.full.jpg -sandstorm_eidolon.jpg http://[server]/DIS/Sandstorm%20Eidolon.full.jpg -sangrite_backlash.jpg http://[server]/ARB/Sangrite%20Backlash.full.jpg -sangrite_surge.jpg http://[server]/ALA/Sangrite%20Surge.full.jpg -sangrophage.jpg http://[server]/TSP/Sangrophage.full.jpg -sanguine_bond.jpg http://[server]/M10/Sanguine%20Bond.full.jpg -sanguine_guard.jpg http://[server]/US/Sanguine%20Guard.full.jpg -sanguine_praetor.jpg http://[server]/GP/Sanguine%20Praetor.full.jpg -sanity_gnawers.jpg http://[server]/ARB/Sanity%20Gnawers.full.jpg -sanity_grinding.jpg http://[server]/EVE/Sanity%20Grinding.full.jpg -sapling_of_colfenor.jpg http://[server]/EVE/Sapling%20of%20Colfenor.full.jpg -sapphire_charm.jpg http://[server]/MI/Sapphire%20Charm.full.jpg -sapphire_leech.jpg http://[server]/IN/Sapphire%20Leech.full.jpg -sapphire_medallion.jpg http://[server]/TE/Sapphire%20Medallion.full.jpg -saprazzan_bailiff.jpg http://[server]/MM/Saprazzan%20Bailiff.full.jpg -saprazzan_breaker.jpg http://[server]/MM/Saprazzan%20Breaker.full.jpg -saprazzan_cove.jpg http://[server]/MM/Saprazzan%20Cove.full.jpg -saprazzan_heir.jpg http://[server]/MM/Saprazzan%20Heir.full.jpg -saprazzan_legate.jpg http://[server]/MM/Saprazzan%20Legate.full.jpg -saprazzan_outrigger.jpg http://[server]/MM/Saprazzan%20Outrigger.full.jpg -saprazzan_raider.jpg http://[server]/MM/Saprazzan%20Raider.full.jpg -saprazzan_skerry.jpg http://[server]/MM/Saprazzan%20Skerry.full.jpg -saproling_burst.jpg http://[server]/NE/Saproling%20Burst.full.jpg -saproling_cluster.jpg http://[server]/NE/Saproling%20Cluster.full.jpg -saproling_infestation.jpg http://[server]/IN/Saproling%20Infestation.full.jpg -saproling_symbiosis.jpg http://[server]/IN/Saproling%20Symbiosis.full.jpg -sapseep_forest.jpg http://[server]/SHM/Sapseep%20Forest.full.jpg -sarcatog.jpg http://[server]/OD/Sarcatog.full.jpg -sarcomancy.jpg http://[server]/TE/Sarcomancy.full.jpg -sarcomite_myr.jpg http://[server]/FUT/Sarcomite%20Myr.full.jpg -sarkhan_vol.jpg http://[server]/ALA/Sarkhan%20Vol.full.jpg -sarpadian_empires_vol_vii.jpg http://[server]/TSP/Sarpadian%20Empires,%20Vol.%20VII.full.jpg -sasaya_orochi_ascendant.jpg http://[server]/SOK/Sasaya,%20Orochi%20Ascendant.full.jpg -saute.jpg http://[server]/UNH/Saute.full.jpg -savaen_elves.jpg http://[server]/DK/Savaen%20Elves.full.jpg -savage_beating.jpg http://[server]/DS/Savage%20Beating.full.jpg -savage_conception.jpg http://[server]/EVE/Savage%20Conception.full.jpg -savage_firecat.jpg http://[server]/OD/Savage%20Firecat.full.jpg -savage_gorilla.jpg http://[server]/AP/Savage%20Gorilla.full.jpg -savage_hunger.jpg http://[server]/ALA/Savage%20Hunger.full.jpg -savage_lands.jpg http://[server]/ALA/Savage%20Lands.full.jpg -savage_offensive.jpg http://[server]/IN/Savage%20Offensive.full.jpg -savage_silhouette.jpg http://[server]/ZEN/Savage%20Silhouette.full.jpg -savage_thallid.jpg http://[server]/TSP/Savage%20Thallid.full.jpg -savage_twister.jpg http://[server]/MI/Savage%20Twister.full.jpg -savannah.jpg http://[server]/U/Savannah.full.jpg -savannah_lions.jpg http://[server]/9E/Savannah%20Lions.full.jpg -save_life.jpg http://[server]/UNH/Save%20Life.full.jpg -savor_the_moment.jpg http://[server]/SHM/Savor%20the%20Moment.full.jpg -savra_queen_of_the_golgari.jpg http://[server]/RAV/Savra,%20Queen%20of%20the%20Golgari.full.jpg -sawback_manticore.jpg http://[server]/MI/Sawback%20Manticore.full.jpg -sawtooth_loon.jpg http://[server]/PS/Sawtooth%20Loon.full.jpg -sawtooth_ogre.jpg http://[server]/WL/Sawtooth%20Ogre.full.jpg -sawtooth_thresher.jpg http://[server]/FD/Sawtooth%20Thresher.full.jpg -scab_clan_mauler.jpg http://[server]/GP/Scab-Clan%20Mauler.full.jpg -scabland.jpg http://[server]/TE/Scabland.full.jpg -scald.jpg http://[server]/US/Scald.full.jpg -scalding_salamander.jpg http://[server]/EX/Scalding%20Salamander.full.jpg -scalding_tarn.jpg http://[server]/ZEN/Scalding%20Tarn.full.jpg -scalding_tongs.jpg http://[server]/TE/Scalding%20Tongs.full.jpg -scale_of_chiss_goria.jpg http://[server]/MR/Scale%20of%20Chiss-Goria.full.jpg -scalebanes_elite.jpg http://[server]/VI/Scalebane's%20Elite.full.jpg -scaled_hulk.jpg http://[server]/BOK/Scaled%20Hulk.full.jpg -scaled_wurm.jpg http://[server]/9E/Scaled%20Wurm.full.jpg -scalpelexis.jpg http://[server]/10E/Scalpelexis.full.jpg -scandalmonger.jpg http://[server]/MM/Scandalmonger.full.jpg -scapegoat.jpg http://[server]/SH/Scapegoat.full.jpg -scapeshift.jpg http://[server]/MOR/Scapeshift.full.jpg -scar.jpg http://[server]/SHM/Scar.full.jpg -scarab_of_the_unseen.jpg http://[server]/AL/Scarab%20of%20the%20Unseen.full.jpg -scarblade_elite.jpg http://[server]/MOR/Scarblade%20Elite.full.jpg -scare_tactics.jpg http://[server]/EX/Scare%20Tactics.full.jpg -scarecrone.jpg http://[server]/EVE/Scarecrone.full.jpg -scarecrow.jpg http://[server]/DK/Scarecrow.full.jpg -scarland_thrinax.jpg http://[server]/CFX/Scarland%20Thrinax.full.jpg -scarred_puma.jpg http://[server]/IN/Scarred%20Puma.full.jpg -scarred_vinebreeder.jpg http://[server]/LRW/Scarred%20Vinebreeder.full.jpg -scars_of_the_veteran.jpg http://[server]/AL/Scars%20of%20the%20Veteran.full.jpg -scarscale_ritual.jpg http://[server]/SHM/Scarscale%20Ritual.full.jpg -scarwood_bandits.jpg http://[server]/DK/Scarwood%20Bandits.full.jpg -scarwood_goblins.jpg http://[server]/DK/Scarwood%20Goblins.full.jpg -scarwood_hag.jpg http://[server]/DK/Scarwood%20Hag.full.jpg -scarwood_treefolk.jpg http://[server]/TSP/Scarwood%20Treefolk.full.jpg -scathe_zombies.jpg http://[server]/10E/Scathe%20Zombies.full.jpg -scatter_the_seeds.jpg http://[server]/RAV/Scatter%20the%20Seeds.full.jpg -scattering_stroke.jpg http://[server]/LRW/Scattering%20Stroke.full.jpg -scattershot.jpg http://[server]/SC/Scattershot.full.jpg -scattershot_archer.jpg http://[server]/CFX/Scattershot%20Archer.full.jpg -scavenged_weaponry.jpg http://[server]/IN/Scavenged%20Weaponry.full.jpg -scavenger_drake.jpg http://[server]/ALA/Scavenger%20Drake.full.jpg -scavenger_folk.jpg http://[server]/7E/Scavenger%20Folk.full.jpg -scavenging_ghoul.jpg http://[server]/4E/Scavenging%20Ghoul.full.jpg -scavenging_scarab.jpg http://[server]/DS/Scavenging%20Scarab.full.jpg -scent_of_brine.jpg http://[server]/UD/Scent%20of%20Brine.full.jpg -scent_of_cinder.jpg http://[server]/UD/Scent%20of%20Cinder.full.jpg -scent_of_ivy.jpg http://[server]/UD/Scent%20of%20Ivy.full.jpg -scent_of_jasmine.jpg http://[server]/UD/Scent%20of%20Jasmine.full.jpg -scent_of_nightshade.jpg http://[server]/UD/Scent%20of%20Nightshade.full.jpg -scepter_of_dominance.jpg http://[server]/CFX/Scepter%20of%20Dominance.full.jpg -scepter_of_fugue.jpg http://[server]/CFX/Scepter%20of%20Fugue.full.jpg -scepter_of_insight.jpg http://[server]/CFX/Scepter%20of%20Insight.full.jpg -schismotivate.jpg http://[server]/GP/Schismotivate.full.jpg -school_of_piranha.jpg http://[server]/EX/School%20of%20Piranha.full.jpg -school_of_the_unseen.jpg http://[server]/AL/School%20of%20the%20Unseen.full.jpg -scion_of_darkness.jpg http://[server]/LE/Scion%20of%20Darkness.full.jpg -scion_of_oona.jpg http://[server]/LRW/Scion%20of%20Oona.full.jpg -scion_of_the_ur_dragon.jpg http://[server]/TSP/Scion%20of%20the%20Ur-Dragon.full.jpg -scion_of_the_wild.jpg http://[server]/10E/Scion%20of%20the%20Wild.full.jpg -scissors_lizard.jpg http://[server]/UG/Scissors%20Lizard.full.jpg -scorched_earth.jpg http://[server]/TE/Scorched%20Earth.full.jpg -scorched_ruins.jpg http://[server]/WL/Scorched%20Ruins.full.jpg -scorched_rusalka.jpg http://[server]/GP/Scorched%20Rusalka.full.jpg -scorching_lava.jpg http://[server]/IN/Scorching%20Lava.full.jpg -scorching_missile.jpg http://[server]/OD/Scorching%20Missile.full.jpg -scorching_spear.jpg http://[server]/PT/Scorching%20Spear.full.jpg -scorching_winds.jpg http://[server]/PT/Scorching%20Winds.full.jpg -scoria_cat.jpg http://[server]/PY/Scoria%20Cat.full.jpg -scoria_wurm.jpg http://[server]/10E/Scoria%20Wurm.full.jpg -scornful_aether_lich.jpg http://[server]/CFX/Scornful%20AEther-Lich.full.jpg -scornful_egotist.jpg http://[server]/SC/Scornful%20Egotist.full.jpg -scour.jpg http://[server]/UD/Scour.full.jpg -scourge_devil.jpg http://[server]/ALA/Scourge%20Devil.full.jpg -scourge_of_kher_ridges.jpg http://[server]/FUT/Scourge%20of%20Kher%20Ridges.full.jpg -scourge_of_numai.jpg http://[server]/BOK/Scourge%20of%20Numai.full.jpg -scourge_of_the_nobilis.jpg http://[server]/EVE/Scourge%20of%20the%20Nobilis.full.jpg -scourglass.jpg http://[server]/ALA/Scourglass.full.jpg -scouting_trek.jpg http://[server]/IN/Scouting%20Trek.full.jpg -scouts_warning.jpg http://[server]/FUT/Scout's%20Warning.full.jpg -scrabbling_claws.jpg http://[server]/MR/Scrabbling%20Claws.full.jpg -scragnoth.jpg http://[server]/TE/Scragnoth.full.jpg -scrap.jpg http://[server]/US/Scrap.full.jpg -scrapbasket.jpg http://[server]/SHM/Scrapbasket.full.jpg -scrapheap.jpg http://[server]/UL/Scrapheap.full.jpg -screaming_fury.jpg http://[server]/FD/Screaming%20Fury.full.jpg -screaming_seahawk.jpg http://[server]/ON/Screaming%20Seahawk.full.jpg -screams_from_within.jpg http://[server]/DS/Screams%20from%20Within.full.jpg -screams_of_the_damned.jpg http://[server]/OD/Screams%20of%20the%20Damned.full.jpg -screeching_buzzard.jpg http://[server]/ON/Screeching%20Buzzard.full.jpg -screeching_drake.jpg http://[server]/P2/Screeching%20Drake.full.jpg -screeching_griffin.jpg http://[server]/RAV/Screeching%20Griffin.full.jpg -screeching_harpy.jpg http://[server]/TE/Screeching%20Harpy.full.jpg -screeching_sliver.jpg http://[server]/TSP/Screeching%20Sliver.full.jpg -scrivener.jpg http://[server]/OD/Scrivener.full.jpg -scroll_of_origins.jpg http://[server]/SOK/Scroll%20of%20Origins.full.jpg -scroll_rack.jpg http://[server]/TE/Scroll%20Rack.full.jpg -scrounge.jpg http://[server]/DS/Scrounge.full.jpg -scrubland.jpg http://[server]/U/Scrubland.full.jpg -scryb_ranger.jpg http://[server]/TSP/Scryb%20Ranger.full.jpg -scryb_sprites.jpg http://[server]/5E/Scryb%20Sprites.full.jpg -scrying_glass.jpg http://[server]/UD/Scrying%20Glass.full.jpg -scrying_sheets.jpg http://[server]/CS/Scrying%20Sheets.full.jpg -sculpting_steel.jpg http://[server]/10E/Sculpting%20Steel.full.jpg -scute_mob.jpg http://[server]/ZEN/Scute%20Mob.full.jpg -scuttlemutt.jpg http://[server]/SHM/Scuttlemutt.full.jpg -scuttling_death.jpg http://[server]/CHK/Scuttling%20Death.full.jpg -scuzzback_marauders.jpg http://[server]/SHM/Scuzzback%20Marauders.full.jpg -scuzzback_scrapper.jpg http://[server]/SHM/Scuzzback%20Scrapper.full.jpg -scythe_of_the_wretched.jpg http://[server]/MR/Scythe%20of%20the%20Wretched.full.jpg -scythe_tiger.jpg http://[server]/ZEN/Scythe%20Tiger.full.jpg -sea_drake.jpg http://[server]/P2/Sea%20Drake.full.jpg -sea_eagle.jpg http://[server]/8E/Sea%20Eagle.full.jpg -sea_gate_loremaster.jpg http://[server]/ZEN/Sea%20Gate%20Loremaster.full.jpg -sea_kings_blessing.jpg http://[server]/LG/Sea%20Kings'%20Blessing.full.jpg -sea_monster.jpg http://[server]/10E/Sea%20Monster.full.jpg -sea_scryer.jpg http://[server]/MI/Sea%20Scryer.full.jpg -sea_serpent.jpg http://[server]/5E/Sea%20Serpent.full.jpg -sea_snidd.jpg http://[server]/PS/Sea%20Snidd.full.jpg -sea_spirit.jpg http://[server]/5E/Sea%20Spirit.full.jpg -sea_sprite.jpg http://[server]/5E/Sea%20Sprite.full.jpg -sea_troll.jpg http://[server]/HL/Sea%20Troll.full.jpg -seafarers_quay.jpg http://[server]/LG/Seafarer's%20Quay.full.jpg -seafloor_debris.jpg http://[server]/OD/Seafloor%20Debris.full.jpg -seahunter.jpg http://[server]/NE/Seahunter.full.jpg -seal_of_cleansing.jpg http://[server]/NE/Seal%20of%20Cleansing.full.jpg -seal_of_doom.jpg http://[server]/NE/Seal%20of%20Doom.full.jpg -seal_of_fire.jpg http://[server]/NE/Seal%20of%20Fire.full.jpg -seal_of_primordium.jpg http://[server]/PLC/Seal%20of%20Primordium.full.jpg -seal_of_removal.jpg http://[server]/NE/Seal%20of%20Removal.full.jpg -seal_of_strength.jpg http://[server]/NE/Seal%20of%20Strength.full.jpg -sealed_fate.jpg http://[server]/MI/Sealed%20Fate.full.jpg -search_for_survivors.jpg http://[server]/PY/Search%20for%20Survivors.full.jpg -search_for_tomorrow.jpg http://[server]/TSP/Search%20for%20Tomorrow.full.jpg -searing_flesh.jpg http://[server]/ON/Searing%20Flesh.full.jpg -searing_meditation.jpg http://[server]/RAV/Searing%20Meditation.full.jpg -searing_rays.jpg http://[server]/IN/Searing%20Rays.full.jpg -searing_spear_askari.jpg http://[server]/MI/Searing%20Spear%20Askari.full.jpg -searing_touch.jpg http://[server]/TE/Searing%20Touch.full.jpg -searing_wind.jpg http://[server]/8E/Searing%20Wind.full.jpg -seas_claim.jpg http://[server]/9E/Sea's%20Claim.full.jpg -seascape_aerialist.jpg http://[server]/ZEN/Seascape%20Aerialist.full.jpg -seashell_cameo.jpg http://[server]/IN/Seashell%20Cameo.full.jpg -seaside_citadel.jpg http://[server]/ALA/Seaside%20Citadel.full.jpg -seaside_haven.jpg http://[server]/ON/Seaside%20Haven.full.jpg -seasinger.jpg http://[server]/5E/Seasinger.full.jpg -season_of_the_witch.jpg http://[server]/DK/Season%20of%20the%20Witch.full.jpg -seasoned_marshal.jpg http://[server]/9E/Seasoned%20Marshal.full.jpg -seasoned_tactician.jpg http://[server]/AL/Seasoned%20Tactician.full.jpg -seat_of_the_synod.jpg http://[server]/MR/Seat%20of%20the%20Synod.full.jpg -secluded_glen.jpg http://[server]/LRW/Secluded%20Glen.full.jpg -secluded_steppe.jpg http://[server]/ON/Secluded%20Steppe.full.jpg -second_chance.jpg http://[server]/UL/Second%20Chance.full.jpg -second_sight.jpg http://[server]/DS/Second%20Sight.full.jpg -second_sunrise.jpg http://[server]/MR/Second%20Sunrise.full.jpg -second_thoughts.jpg http://[server]/OD/Second%20Thoughts.full.jpg -second_wind.jpg http://[server]/FUT/Second%20Wind.full.jpg -secretkeeper.jpg http://[server]/SOK/Secretkeeper.full.jpg -security_detail.jpg http://[server]/MM/Security%20Detail.full.jpg -sedge_sliver.jpg http://[server]/TSP/Sedge%20Sliver.full.jpg -sedge_troll.jpg http://[server]/U/Sedge%20Troll.full.jpg -sedraxis_alchemist.jpg http://[server]/CFX/Sedraxis%20Alchemist.full.jpg -sedraxis_specter.jpg http://[server]/ALA/Sedraxis%20Specter.full.jpg -sedris_the_traitor_king.jpg http://[server]/ALA/Sedris,%20the%20Traitor%20King.full.jpg -seed_spark.jpg http://[server]/RAV/Seed%20Spark.full.jpg -seed_the_land.jpg http://[server]/SOK/Seed%20the%20Land.full.jpg -seedborn_muse.jpg http://[server]/10E/Seedborn%20Muse.full.jpg -seedcradle_witch.jpg http://[server]/SHM/Seedcradle%20Witch.full.jpg -seedguide_ash.jpg http://[server]/LRW/Seedguide%20Ash.full.jpg -seedling_charm.jpg http://[server]/MI/Seedling%20Charm.full.jpg -seeds_of_innocence.jpg http://[server]/MI/Seeds%20of%20Innocence.full.jpg -seeds_of_strength.jpg http://[server]/RAV/Seeds%20of%20Strength.full.jpg -seedtime.jpg http://[server]/JU/Seedtime.full.jpg -seek_the_horizon.jpg http://[server]/SOK/Seek%20the%20Horizon.full.jpg -seeker.jpg http://[server]/4E/Seeker.full.jpg -seeker_of_skybreak.jpg http://[server]/7E/Seeker%20of%20Skybreak.full.jpg -seers_vision.jpg http://[server]/IN/Seer's%20Vision.full.jpg -seething_anger.jpg http://[server]/SH/Seething%20Anger.full.jpg -seething_pathblazer.jpg http://[server]/MOR/Seething%20Pathblazer.full.jpg -seething_song.jpg http://[server]/9E/Seething%20Song.full.jpg -segmented_wurm.jpg http://[server]/BD/Segmented%20Wurm.full.jpg -segovian_leviathan.jpg http://[server]/6E/Segovian%20Leviathan.full.jpg -sehts_tiger.jpg http://[server]/FUT/Seht's%20Tiger.full.jpg -seismic_assault.jpg http://[server]/10E/Seismic%20Assault.full.jpg -seismic_mage.jpg http://[server]/MM/Seismic%20Mage.full.jpg -seismic_shudder.jpg http://[server]/ZEN/Seismic%20Shudder.full.jpg -seismic_spike.jpg http://[server]/RAV/Seismic%20Spike.full.jpg -seismic_strike.jpg http://[server]/M10/Seismic%20Strike.full.jpg -seizan_perverter_of_truth.jpg http://[server]/CHK/Seizan,%20Perverter%20of%20Truth.full.jpg -seize_the_day.jpg http://[server]/OD/Seize%20the%20Day.full.jpg -seize_the_soul.jpg http://[server]/GP/Seize%20the%20Soul.full.jpg -seizures.jpg http://[server]/IA/Seizures.full.jpg -sejiri_refuge.jpg http://[server]/ZEN/Sejiri%20Refuge.full.jpg -sekki_seasons_guide.jpg http://[server]/SOK/Sekki,%20Seasons'%20Guide.full.jpg -sekkuar_deathkeeper.jpg http://[server]/CS/Sek'Kuar,%20Deathkeeper.full.jpg -selenia.jpg http://[server]/VG/Selenia.full.jpg -selenia_dark_angel.jpg http://[server]/TE/Selenia,%20Dark%20Angel.full.jpg -selesnya_evangel.jpg http://[server]/RAV/Selesnya%20Evangel.full.jpg -selesnya_guildmage.jpg http://[server]/RAV/Selesnya%20Guildmage.full.jpg -selesnya_sagittars.jpg http://[server]/RAV/Selesnya%20Sagittars.full.jpg -selesnya_sanctuary.jpg http://[server]/RAV/Selesnya%20Sanctuary.full.jpg -selesnya_signet.jpg http://[server]/RAV/Selesnya%20Signet.full.jpg -selfless_exorcist.jpg http://[server]/JU/Selfless%20Exorcist.full.jpg -selkie_hedge_mage.jpg http://[server]/EVE/Selkie%20Hedge-Mage.full.jpg -sell_sword_brute.jpg http://[server]/RAV/Sell-Sword%20Brute.full.jpg -sen_triplets.jpg http://[server]/ARB/Sen%20Triplets.full.jpg -sengir_autocrat.jpg http://[server]/6E/Sengir%20Autocrat.full.jpg -sengir_bats.jpg http://[server]/HL/Sengir%20Bats1.full.jpg -sengir_nosferatu.jpg http://[server]/TSP/Sengir%20Nosferatu.full.jpg -sengir_vampire.jpg http://[server]/10E/Sengir%20Vampire.full.jpg -sensation_gorger.jpg http://[server]/MOR/Sensation%20Gorger.full.jpg -sensei_golden_tail.jpg http://[server]/CHK/Sensei%20Golden-Tail.full.jpg -senseis_divining_top.jpg http://[server]/CHK/Sensei's%20Divining%20Top.full.jpg -sentinel.jpg http://[server]/LG/Sentinel.full.jpg -sentinels_of_glen_elendra.jpg http://[server]/LRW/Sentinels%20of%20Glen%20Elendra.full.jpg -sentry_oak.jpg http://[server]/LRW/Sentry%20Oak.full.jpg -seraph.jpg http://[server]/IA/Seraph.full.jpg -serendib_djinn.jpg http://[server]/AN/Serendib%20Djinn.full.jpg -serendib_efreet.jpg http://[server]/AN/Serendib%20Efreet.full.jpg -serendib_sorcerer.jpg http://[server]/PLC/Serendib%20Sorcerer.full.jpg -serene_heart.jpg http://[server]/MI/Serene%20Heart.full.jpg -serene_offering.jpg http://[server]/TE/Serene%20Offering.full.jpg -serene_sunset.jpg http://[server]/JU/Serene%20Sunset.full.jpg -serenity.jpg http://[server]/6E/Serenity.full.jpg -serpent_assassin.jpg http://[server]/PT/Serpent%20Assassin.full.jpg -serpent_generator.jpg http://[server]/5E/Serpent%20Generator.full.jpg -serpent_of_the_endless_sea.jpg http://[server]/M10/Serpent%20of%20the%20Endless%20Sea.full.jpg -serpent_skin.jpg http://[server]/CHK/Serpent%20Skin.full.jpg -serpent_warrior.jpg http://[server]/9E/Serpent%20Warrior.full.jpg -serpentine_basilisk.jpg http://[server]/ON/Serpentine%20Basilisk.full.jpg -serpentine_kavu.jpg http://[server]/IN/Serpentine%20Kavu.full.jpg -serra.jpg http://[server]/VG/Serra.full.jpg -serra_advocate.jpg http://[server]/7E/Serra%20Advocate.full.jpg -serra_angel.jpg http://[server]/M10/Serra%20Angel.full.jpg -serra_avatar.jpg http://[server]/US/Serra%20Avatar.full.jpg -serra_avenger.jpg http://[server]/TSP/Serra%20Avenger.full.jpg -serra_aviary.jpg http://[server]/HL/Serra%20Aviary.full.jpg -serra_bestiary.jpg http://[server]/5E/Serra%20Bestiary.full.jpg -serra_inquisitors.jpg http://[server]/HL/Serra%20Inquisitors.full.jpg -serra_paladin.jpg http://[server]/5E/Serra%20Paladin.full.jpg -serra_sphinx.jpg http://[server]/PLC/Serra%20Sphinx.full.jpg -serra_zealot.jpg http://[server]/US/Serra%20Zealot.full.jpg -serras_blessing.jpg http://[server]/9E/Serra's%20Blessing.full.jpg -serras_boon.jpg http://[server]/PLC/Serra's%20Boon.full.jpg -serras_embrace.jpg http://[server]/10E/Serra's%20Embrace.full.jpg -serras_hymn.jpg http://[server]/US/Serra's%20Hymn.full.jpg -serras_liturgy.jpg http://[server]/US/Serra's%20Liturgy.full.jpg -serras_sanctum.jpg http://[server]/US/Serra's%20Sanctum.full.jpg -serrated_arrows.jpg http://[server]/AT/Serrated%20Arrows.full.jpg -serrated_biskelion.jpg http://[server]/WL/Serrated%20Biskelion.full.jpg -serum_powder.jpg http://[server]/DS/Serum%20Powder.full.jpg -serum_tank.jpg http://[server]/HOP/Serum%20Tank.full.jpg -serum_visions.jpg http://[server]/FD/Serum%20Visions.full.jpg -servant_of_volrath.jpg http://[server]/TE/Servant%20of%20Volrath.full.jpg -seshiro_the_anointed.jpg http://[server]/CHK/Seshiro%20the%20Anointed.full.jpg -seton_krosan_protector.jpg http://[server]/OD/Seton,%20Krosan%20Protector.full.jpg -setons_desire.jpg http://[server]/OD/Seton's%20Desire.full.jpg -setons_scout.jpg http://[server]/TO/Seton's%20Scout.full.jpg -sever_soul.jpg http://[server]/8E/Sever%20Soul.full.jpg -severed_legion.jpg http://[server]/10E/Severed%20Legion.full.jpg -sewer_rats.jpg http://[server]/MI/Sewer%20Rats.full.jpg -sewerdreg.jpg http://[server]/RAV/Sewerdreg.full.jpg -sewers_of_estark.jpg http://[server]/HPB/Sewers%20of%20Estark.full.jpg -sewn_eye_drake.jpg http://[server]/ARB/Sewn-Eye%20Drake.full.jpg -sex_appeal.jpg http://[server]/UG/Sex%20Appeal.full.jpg -shackles.jpg http://[server]/IN/Shackles.full.jpg -shade_of_trokair.jpg http://[server]/PLC/Shade%20of%20Trokair.full.jpg -shades_breath.jpg http://[server]/ON/Shade's%20Breath.full.jpg -shades_form.jpg http://[server]/TO/Shade's%20Form.full.jpg -shadow_guildmage.jpg http://[server]/MI/Shadow%20Guildmage.full.jpg -shadow_lance.jpg http://[server]/GP/Shadow%20Lance.full.jpg -shadow_of_doubt.jpg http://[server]/RAV/Shadow%20of%20Doubt.full.jpg -shadow_rider.jpg http://[server]/WL/Shadow%20Rider.full.jpg -shadow_rift.jpg http://[server]/TE/Shadow%20Rift.full.jpg -shadow_sliver.jpg http://[server]/TSP/Shadow%20Sliver.full.jpg -shadowbane.jpg http://[server]/MI/Shadowbane.full.jpg -shadowblood_egg.jpg http://[server]/OD/Shadowblood%20Egg.full.jpg -shadowblood_ridge.jpg http://[server]/OD/Shadowblood%20Ridge.full.jpg -shadowfeed.jpg http://[server]/ALA/Shadowfeed.full.jpg -shadowmage_infiltrator.jpg http://[server]/OD/Shadowmage%20Infiltrator.full.jpg -shadowstorm.jpg http://[server]/TE/Shadowstorm.full.jpg -shah_of_naar_isle.jpg http://[server]/FUT/Shah%20of%20Naar%20Isle.full.jpg -shahrazad.jpg http://[server]/AN/Shahrazad.full.jpg -shaleskin_bruiser.jpg http://[server]/ON/Shaleskin%20Bruiser.full.jpg -shaleskin_plower.jpg http://[server]/LE/Shaleskin%20Plower.full.jpg -shallow_grave.jpg http://[server]/MI/Shallow%20Grave.full.jpg -shaman_en_kor.jpg http://[server]/SH/Shaman%20en-Kor.full.jpg -shamans_trance.jpg http://[server]/JU/Shaman's%20Trance.full.jpg -shambling_remains.jpg http://[server]/CFX/Shambling%20Remains.full.jpg -shambling_shell.jpg http://[server]/RAV/Shambling%20Shell.full.jpg -shambling_strider.jpg http://[server]/BD/Shambling%20Strider.full.jpg -shambling_swarm.jpg http://[server]/TO/Shambling%20Swarm.full.jpg -shanodin_dryads.jpg http://[server]/7E/Shanodin%20Dryads.full.jpg -shape_of_the_wiitigo.jpg http://[server]/CS/Shape%20of%20the%20Wiitigo.full.jpg -shape_stealer.jpg http://[server]/SOK/Shape%20Stealer.full.jpg -shaper_guildmage.jpg http://[server]/MI/Shaper%20Guildmage.full.jpg -shaper_parasite.jpg http://[server]/PLC/Shaper%20Parasite.full.jpg -shapesharer.jpg http://[server]/LRW/Shapesharer.full.jpg -shapeshifter.jpg http://[server]/5E/Shapeshifter.full.jpg -shapeshifters_marrow.jpg http://[server]/FUT/Shapeshifter's%20Marrow.full.jpg -shard_convergence.jpg http://[server]/CFX/Shard%20Convergence.full.jpg -shard_phoenix.jpg http://[server]/9E/Shard%20Phoenix.full.jpg -shard_volley.jpg http://[server]/MOR/Shard%20Volley.full.jpg -sharding_sphinx.jpg http://[server]/ALA/Sharding%20Sphinx.full.jpg -shared_animosity.jpg http://[server]/MOR/Shared%20Animosity.full.jpg -shared_fate.jpg http://[server]/MR/Shared%20Fate.full.jpg -shared_triumph.jpg http://[server]/ON/Shared%20Triumph.full.jpg -sharuum_the_hegemon.jpg http://[server]/ALA/Sharuum%20the%20Hegemon.full.jpg -shatter.jpg http://[server]/M10/Shatter.full.jpg -shattered_crypt.jpg http://[server]/WL/Shattered%20Crypt.full.jpg -shattered_dreams.jpg http://[server]/FD/Shattered%20Dreams.full.jpg -shattering_pulse.jpg http://[server]/EX/Shattering%20Pulse.full.jpg -shattering_spree.jpg http://[server]/GP/Shattering%20Spree.full.jpg -shatterskull_giant.jpg http://[server]/ZEN/Shatterskull%20Giant.full.jpg -shatterstorm.jpg http://[server]/10E/Shatterstorm.full.jpg -shauku_endbringer.jpg http://[server]/MI/Shauku,%20Endbringer.full.jpg -shaukus_minion.jpg http://[server]/MI/Shauku's%20Minion.full.jpg -sheep.jpg http://[server]/UG/Sheep.full.jpg -shelkin_brownie.jpg http://[server]/LG/Shelkin%20Brownie.full.jpg -shell_of_the_last_kappa.jpg http://[server]/CHK/Shell%20of%20the%20Last%20Kappa.full.jpg -shell_skulkin.jpg http://[server]/EVE/Shell%20Skulkin.full.jpg -shelldock_isle.jpg http://[server]/LRW/Shelldock%20Isle.full.jpg -shelter.jpg http://[server]/OD/Shelter.full.jpg -sheltered_valley.jpg http://[server]/AL/Sheltered%20Valley.full.jpg -sheltering_ancient.jpg http://[server]/CS/Sheltering%20Ancient.full.jpg -sheltering_prayers.jpg http://[server]/PY/Sheltering%20Prayers.full.jpg -shepherd_of_rot.jpg http://[server]/ON/Shepherd%20of%20Rot.full.jpg -shepherd_of_the_lost.jpg http://[server]/ZEN/Shepherd%20of%20the%20Lost.full.jpg -shichifukujin_dragon.jpg http://[server]/PR/Shichifukujin%20Dragon.full.jpg -shield_bearer.jpg http://[server]/5E/Shield%20Bearer.full.jpg -shield_dancer.jpg http://[server]/PY/Shield%20Dancer.full.jpg -shield_mate.jpg http://[server]/EX/Shield%20Mate.full.jpg -shield_of_duty_and_reason.jpg http://[server]/AP/Shield%20of%20Duty%20and%20Reason.full.jpg -shield_of_kaldra.jpg http://[server]/DS/Shield%20of%20Kaldra.full.jpg -shield_of_the_ages.jpg http://[server]/IA/Shield%20of%20the%20Ages.full.jpg -shield_of_the_oversoul.jpg http://[server]/SHM/Shield%20of%20the%20Oversoul.full.jpg -shield_of_the_righteous.jpg http://[server]/ARB/Shield%20of%20the%20Righteous.full.jpg -shield_sphere.jpg http://[server]/AL/Shield%20Sphere.full.jpg -shield_wall.jpg http://[server]/7E/Shield%20Wall.full.jpg -shielding_plax.jpg http://[server]/DIS/Shielding%20Plax.full.jpg -shieldmage_advocate.jpg http://[server]/JU/Shieldmage%20Advocate.full.jpg -shieldmage_elder.jpg http://[server]/ON/Shieldmage%20Elder.full.jpg -shieldmates_blessing.jpg http://[server]/ZEN/Shieldmate's%20Blessing.full.jpg -shields_of_velis_vel.jpg http://[server]/LRW/Shields%20of%20Velis%20Vel.full.jpg -shifting_borders.jpg http://[server]/SOK/Shifting%20Borders.full.jpg -shifting_sky.jpg http://[server]/8E/Shifting%20Sky.full.jpg -shifting_sliver.jpg http://[server]/LE/Shifting%20Sliver.full.jpg -shifting_wall.jpg http://[server]/SH/Shifting%20Wall.full.jpg -shifty_doppelganger.jpg http://[server]/OD/Shifty%20Doppelganger.full.jpg -shimatsu_the_bloodcloaked.jpg http://[server]/CHK/Shimatsu%20the%20Bloodcloaked.full.jpg -shimian_night_stalker.jpg http://[server]/LG/Shimian%20Night%20Stalker.full.jpg -shimian_specter.jpg http://[server]/FUT/Shimian%20Specter.full.jpg -shimmer.jpg http://[server]/MI/Shimmer.full.jpg -shimmering_barrier.jpg http://[server]/US/Shimmering%20Barrier.full.jpg -shimmering_efreet.jpg http://[server]/VI/Shimmering%20Efreet.full.jpg -shimmering_glasskite.jpg http://[server]/BOK/Shimmering%20Glasskite.full.jpg -shimmering_grotto.jpg http://[server]/LRW/Shimmering%20Grotto.full.jpg -shimmering_mirage.jpg http://[server]/AP/Shimmering%20Mirage.full.jpg -shimmering_wings.jpg http://[server]/10E/Shimmering%20Wings.full.jpg -shinen_of_fears_chill.jpg http://[server]/SOK/Shinen%20of%20Fear's%20Chill.full.jpg -shinen_of_flights_wings.jpg http://[server]/SOK/Shinen%20of%20Flight's%20Wings.full.jpg -shinen_of_furys_fire.jpg http://[server]/SOK/Shinen%20of%20Fury's%20Fire.full.jpg -shinen_of_lifes_roar.jpg http://[server]/SOK/Shinen%20of%20Life's%20Roar.full.jpg -shinen_of_stars_light.jpg http://[server]/SOK/Shinen%20of%20Stars'%20Light.full.jpg -shinewend.jpg http://[server]/MOR/Shinewend.full.jpg -shining_shoal.jpg http://[server]/BOK/Shining%20Shoal.full.jpg -shinka_gatekeeper.jpg http://[server]/BOK/Shinka%20Gatekeeper.full.jpg -shinka_the_bloodsoaked_keep.jpg http://[server]/CHK/Shinka,%20the%20Bloodsoaked%20Keep.full.jpg -shirei_shizos_caretaker.jpg http://[server]/BOK/Shirei,%20Shizo's%20Caretaker.full.jpg -shisato_whispering_hunter.jpg http://[server]/CHK/Shisato,%20Whispering%20Hunter.full.jpg -shivan_dragon.jpg http://[server]/M10/Shivan%20Dragon.full.jpg -shivan_emissary.jpg http://[server]/IN/Shivan%20Emissary.full.jpg -shivan_gorge.jpg http://[server]/US/Shivan%20Gorge.full.jpg -shivan_harvest.jpg http://[server]/IN/Shivan%20Harvest.full.jpg -shivan_hellkite.jpg http://[server]/10E/Shivan%20Hellkite.full.jpg -shivan_meteor.jpg http://[server]/PLC/Shivan%20Meteor.full.jpg -shivan_oasis.jpg http://[server]/8E/Shivan%20Oasis.full.jpg -shivan_phoenix.jpg http://[server]/UL/Shivan%20Phoenix.full.jpg -shivan_raptor.jpg http://[server]/US/Shivan%20Raptor.full.jpg -shivan_reef.jpg http://[server]/10E/Shivan%20Reef.full.jpg -shivan_sand_mage.jpg http://[server]/FUT/Shivan%20Sand-Mage.full.jpg -shivan_wumpus.jpg http://[server]/PLC/Shivan%20Wumpus.full.jpg -shivan_wurm.jpg http://[server]/PS/Shivan%20Wurm.full.jpg -shivan_zombie.jpg http://[server]/IN/Shivan%20Zombie.full.jpg -shivs_embrace.jpg http://[server]/US/Shiv's%20Embrace.full.jpg -shizo_deaths_storehouse.jpg http://[server]/CHK/Shizo,%20Death's%20Storehouse.full.jpg -shizuko_caller_of_autumn.jpg http://[server]/BOK/Shizuko,%20Caller%20of%20Autumn.full.jpg -shoal_serpent.jpg http://[server]/ZEN/Shoal%20Serpent.full.jpg -shock.jpg http://[server]/10E/Shock.full.jpg -shock_troops.jpg http://[server]/8E/Shock%20Troops.full.jpg -shocker.jpg http://[server]/TE/Shocker.full.jpg -shoe_tree.jpg http://[server]/UNH/Shoe%20Tree.full.jpg -shore_snapper.jpg http://[server]/ALA/Shore%20Snapper.full.jpg -shorecrasher_mimic.jpg http://[server]/EVE/Shorecrasher%20Mimic.full.jpg -shoreline_raider.jpg http://[server]/IN/Shoreline%20Raider.full.jpg -shoreline_ranger.jpg http://[server]/SC/Shoreline%20Ranger.full.jpg -shoving_match.jpg http://[server]/MM/Shoving%20Match.full.jpg -show_and_tell.jpg http://[server]/US/Show%20and%20Tell.full.jpg -shower_of_coals.jpg http://[server]/OD/Shower%20of%20Coals.full.jpg -shower_of_sparks.jpg http://[server]/US/Shower%20of%20Sparks.full.jpg -shrapnel_blast.jpg http://[server]/MR/Shrapnel%20Blast.full.jpg -shred_memory.jpg http://[server]/RAV/Shred%20Memory.full.jpg -shrewd_hatchling.jpg http://[server]/EVE/Shrewd%20Hatchling.full.jpg -shriek_of_dread.jpg http://[server]/PS/Shriek%20of%20Dread.full.jpg -shrieking_drake.jpg http://[server]/VI/Shrieking%20Drake.full.jpg -shrieking_grotesque.jpg http://[server]/GP/Shrieking%20Grotesque.full.jpg -shrieking_mogg.jpg http://[server]/NE/Shrieking%20Mogg.full.jpg -shrieking_specter.jpg http://[server]/ST/Shrieking%20Specter.full.jpg -shriekmaw.jpg http://[server]/LRW/Shriekmaw.full.jpg -shrink.jpg http://[server]/5E/Shrink.full.jpg -shriveling_rot.jpg http://[server]/DS/Shriveling%20Rot.full.jpg -shrouded_lore.jpg http://[server]/PLC/Shrouded%20Lore.full.jpg -shrouded_serpent.jpg http://[server]/PY/Shrouded%20Serpent.full.jpg -shu_cavalry.jpg http://[server]/P3/Shu%20Cavalry.full.jpg -shu_defender.jpg http://[server]/P3/Shu%20Defender.full.jpg -shu_elite_companions.jpg http://[server]/P3/Shu%20Elite%20Companions.full.jpg -shu_elite_infantry.jpg http://[server]/P3/Shu%20Elite%20Infantry.full.jpg -shu_farmer.jpg http://[server]/P3/Shu%20Farmer.full.jpg -shu_foot_soldiers.jpg http://[server]/P3/Shu%20Foot%20Soldiers.full.jpg -shu_general.jpg http://[server]/P3/Shu%20General.full.jpg -shu_grain_caravan.jpg http://[server]/P3/Shu%20Grain%20Caravan.full.jpg -shu_soldier_farmers.jpg http://[server]/P3/Shu%20Soldier-Farmers.full.jpg -shuko.jpg http://[server]/BOK/Shuko.full.jpg -shunt.jpg http://[server]/10E/Shunt.full.jpg -shuriken.jpg http://[server]/BOK/Shuriken.full.jpg -shyft.jpg http://[server]/IA/Shyft.full.jpg -sibilant_spirit.jpg http://[server]/6E/Sibilant%20Spirit.full.jpg -sick_and_tired.jpg http://[server]/UL/Sick%20and%20Tired.full.jpg -sicken.jpg http://[server]/US/Sicken.full.jpg -sickening_dreams.jpg http://[server]/TO/Sickening%20Dreams.full.jpg -sickening_shoal.jpg http://[server]/BOK/Sickening%20Shoal.full.jpg -sickle_ripper.jpg http://[server]/SHM/Sickle%20Ripper.full.jpg -sidar_jabari.jpg http://[server]/MI/Sidar%20Jabari.full.jpg -sidar_kondo.jpg http://[server]/VG/Sidar%20Kondo.full.jpg -side_to_side.jpg http://[server]/UNH/Side%20to%20Side.full.jpg -sideswipe.jpg http://[server]/CHK/Sideswipe.full.jpg -sidewinder_sliver.jpg http://[server]/TSP/Sidewinder%20Sliver.full.jpg -siege_gang_commander.jpg http://[server]/M10/Siege-Gang%20Commander.full.jpg -siege_mastodon.jpg http://[server]/M10/Siege%20Mastodon.full.jpg -siege_of_towers.jpg http://[server]/GP/Siege%20of%20Towers.full.jpg -siege_wurm.jpg http://[server]/RAV/Siege%20Wurm.full.jpg -sift.jpg http://[server]/10E/Sift.full.jpg -sift_through_sands.jpg http://[server]/CHK/Sift%20Through%20Sands.full.jpg -sighted_caste_sorcerer.jpg http://[server]/ALA/Sighted-Caste%20Sorcerer.full.jpg -sigil_blessing.jpg http://[server]/ALA/Sigil%20Blessing.full.jpg -sigil_captain.jpg http://[server]/ARB/Sigil%20Captain.full.jpg -sigil_of_distinction.jpg http://[server]/ALA/Sigil%20of%20Distinction.full.jpg -sigil_of_sleep.jpg http://[server]/UD/Sigil%20of%20Sleep.full.jpg -sigil_of_the_empty_throne.jpg http://[server]/CFX/Sigil%20of%20the%20Empty%20Throne.full.jpg -sigil_of_the_nayan_gods.jpg http://[server]/ARB/Sigil%20of%20the%20Nayan%20Gods.full.jpg -sigil_of_the_new_dawn.jpg http://[server]/ON/Sigil%20of%20the%20New%20Dawn.full.jpg -sigil_tracer.jpg http://[server]/MOR/Sigil%20Tracer.full.jpg -sigiled_behemoth.jpg http://[server]/ARB/Sigiled%20Behemoth.full.jpg -sigiled_paladin.jpg http://[server]/ALA/Sigiled%20Paladin.full.jpg -sign_in_blood.jpg http://[server]/M10/Sign%20in%20Blood.full.jpg -silence.jpg http://[server]/M10/Silence.full.jpg -silent_arbiter.jpg http://[server]/FD/Silent%20Arbiter.full.jpg -silent_assassin.jpg http://[server]/MM/Silent%20Assassin.full.jpg -silent_attendant.jpg http://[server]/US/Silent%20Attendant.full.jpg -silent_chant_zubera.jpg http://[server]/CHK/Silent-Chant%20Zubera.full.jpg -silent_specter.jpg http://[server]/ON/Silent%20Specter.full.jpg -silhana_ledgewalker.jpg http://[server]/GP/Silhana%20Ledgewalker.full.jpg -silhana_starfletcher.jpg http://[server]/GP/Silhana%20Starfletcher.full.jpg -silhouette.jpg http://[server]/LG/Silhouette.full.jpg -silk_net.jpg http://[server]/UL/Silk%20Net.full.jpg -silkbind_faerie.jpg http://[server]/SHM/Silkbind%20Faerie.full.jpg -silkenfist_fighter.jpg http://[server]/NE/Silkenfist%20Fighter.full.jpg -silkenfist_order.jpg http://[server]/NE/Silkenfist%20Order.full.jpg -silklash_spider.jpg http://[server]/9E/Silklash%20Spider.full.jpg -silkwing_scout.jpg http://[server]/DIS/Silkwing%20Scout.full.jpg -silt_crawler.jpg http://[server]/PY/Silt%20Crawler.full.jpg -silver_drake.jpg http://[server]/PS/Silver%20Drake.full.jpg -silver_erne.jpg http://[server]/IA/Silver%20Erne.full.jpg -silver_knight.jpg http://[server]/SC/Silver%20Knight.full.jpg -silver_myr.jpg http://[server]/MR/Silver%20Myr.full.jpg -silver_seraph.jpg http://[server]/JU/Silver%20Seraph.full.jpg -silver_wyvern.jpg http://[server]/SH/Silver%20Wyvern.full.jpg -silverback_ape.jpg http://[server]/8E/Silverback%20Ape.full.jpg -silvercoat_lion.jpg http://[server]/M10/Silvercoat%20Lion.full.jpg -silvergill_adept.jpg http://[server]/LRW/Silvergill%20Adept.full.jpg -silvergill_douser.jpg http://[server]/LRW/Silvergill%20Douser.full.jpg -silverglade_elemental.jpg http://[server]/MM/Silverglade%20Elemental.full.jpg -silverglade_pathfinder.jpg http://[server]/MM/Silverglade%20Pathfinder.full.jpg -silverstorm_samurai.jpg http://[server]/BOK/Silverstorm%20Samurai.full.jpg -silvos_rogue_elemental.jpg http://[server]/ON/Silvos,%20Rogue%20Elemental.full.jpg -sima_yi_wei_field_marshal.jpg http://[server]/P3/Sima%20Yi,%20Wei%20Field%20Marshal.full.jpg -simian_brawler.jpg http://[server]/CS/Simian%20Brawler.full.jpg -simian_grunts.jpg http://[server]/UL/Simian%20Grunts.full.jpg -simian_spirit_guide.jpg http://[server]/PLC/Simian%20Spirit%20Guide.full.jpg -simic_basilisk.jpg http://[server]/DIS/Simic%20Basilisk.full.jpg -simic_growth_chamber.jpg http://[server]/DIS/Simic%20Growth%20Chamber.full.jpg -simic_guildmage.jpg http://[server]/DIS/Simic%20Guildmage.full.jpg -simic_initiate.jpg http://[server]/DIS/Simic%20Initiate.full.jpg -simic_ragworm.jpg http://[server]/DIS/Simic%20Ragworm.full.jpg -simic_signet.jpg http://[server]/DIS/Simic%20Signet.full.jpg -simic_sky_swallower.jpg http://[server]/DIS/Simic%20Sky%20Swallower.full.jpg -simoon.jpg http://[server]/IN/Simoon.full.jpg -simplify.jpg http://[server]/OD/Simplify.full.jpg -simulacrum.jpg http://[server]/4E/Simulacrum.full.jpg -sindbad.jpg http://[server]/4E/Sindbad.full.jpg -sinew_sliver.jpg http://[server]/PLC/Sinew%20Sliver.full.jpg -singe.jpg http://[server]/PS/Singe.full.jpg -singe_mind_ogre.jpg http://[server]/ARB/Singe-Mind%20Ogre.full.jpg -singing_tree.jpg http://[server]/AN/Singing%20Tree.full.jpg -sinister_strength.jpg http://[server]/PS/Sinister%20Strength.full.jpg -sink_into_takenuma.jpg http://[server]/SOK/Sink%20into%20Takenuma.full.jpg -sinkhole.jpg http://[server]/U/Sinkhole.full.jpg -sinking_feeling.jpg http://[server]/SHM/Sinking%20Feeling.full.jpg -sins_of_the_past.jpg http://[server]/RAV/Sins%20of%20the%20Past.full.jpg -sinstrikers_will.jpg http://[server]/GP/Sinstriker's%20Will.full.jpg -sir_shandlar_of_eberyn.jpg http://[server]/LG/Sir%20Shandlar%20of%20Eberyn.full.jpg -sire_of_the_storm.jpg http://[server]/CHK/Sire%20of%20the%20Storm.full.jpg -sirens_call.jpg http://[server]/4E/Siren's%20Call.full.jpg -sirocco.jpg http://[server]/MI/Sirocco.full.jpg -sisay.jpg http://[server]/VG/Sisay.full.jpg -sisays_ingenuity.jpg http://[server]/PS/Sisay's%20Ingenuity.full.jpg -sisays_ring.jpg http://[server]/7E/Sisay's%20Ring.full.jpg -sisters_of_stone_death.jpg http://[server]/RAV/Sisters%20of%20Stone%20Death.full.jpg -sisters_of_the_flame.jpg http://[server]/4E/Sisters%20of%20the%20Flame.full.jpg -sivitri_scarzam.jpg http://[server]/LG/Sivitri%20Scarzam.full.jpg -sivvis_ruse.jpg http://[server]/NE/Sivvi's%20Ruse.full.jpg -sivvis_valor.jpg http://[server]/NE/Sivvi's%20Valor.full.jpg -six_y_beast.jpg http://[server]/UNH/Six-y%20Beast.full.jpg -sizzle.jpg http://[server]/8E/Sizzle.full.jpg -skarrg_the_rage_pits.jpg http://[server]/GP/Skarrg,%20the%20Rage%20Pits.full.jpg -skarrgan_firebird.jpg http://[server]/GP/Skarrgan%20Firebird.full.jpg -skarrgan_pit_skulk.jpg http://[server]/GP/Skarrgan%20Pit-Skulk.full.jpg -skarrgan_skybreaker.jpg http://[server]/GP/Skarrgan%20Skybreaker.full.jpg -skeletal_changeling.jpg http://[server]/LRW/Skeletal%20Changeling.full.jpg -skeletal_crocodile.jpg http://[server]/PT/Skeletal%20Crocodile.full.jpg -skeletal_kathari.jpg http://[server]/ALA/Skeletal%20Kathari.full.jpg -skeletal_scrying.jpg http://[server]/OD/Skeletal%20Scrying.full.jpg -skeletal_snake.jpg http://[server]/PT/Skeletal%20Snake.full.jpg -skeletal_vampire.jpg http://[server]/GP/Skeletal%20Vampire.full.jpg -skeleton_scavengers.jpg http://[server]/SH/Skeleton%20Scavengers.full.jpg -skeleton_shard.jpg http://[server]/MR/Skeleton%20Shard.full.jpg -skeleton_ship.jpg http://[server]/IA/Skeleton%20Ship.full.jpg -skeletonize.jpg http://[server]/ALA/Skeletonize.full.jpg -skill_borrower.jpg http://[server]/ALA/Skill%20Borrower.full.jpg -skinthinner.jpg http://[server]/LE/Skinthinner.full.jpg -skirge_familiar.jpg http://[server]/US/Skirge%20Familiar.full.jpg -skirk_alarmist.jpg http://[server]/LE/Skirk%20Alarmist.full.jpg -skirk_commando.jpg http://[server]/ON/Skirk%20Commando.full.jpg -skirk_drill_sergeant.jpg http://[server]/LE/Skirk%20Drill%20Sergeant.full.jpg -skirk_fire_marshal.jpg http://[server]/ON/Skirk%20Fire%20Marshal.full.jpg -skirk_marauder.jpg http://[server]/LE/Skirk%20Marauder.full.jpg -skirk_outrider.jpg http://[server]/LE/Skirk%20Outrider.full.jpg -skirk_prospector.jpg http://[server]/ON/Skirk%20Prospector.full.jpg -skirk_ridge_exhumer.jpg http://[server]/FUT/Skirk%20Ridge%20Exhumer.full.jpg -skirk_shaman.jpg http://[server]/PLC/Skirk%20Shaman.full.jpg -skirk_volcanist.jpg http://[server]/SC/Skirk%20Volcanist.full.jpg -skittering_horror.jpg http://[server]/UD/Skittering%20Horror.full.jpg -skittering_monstrosity.jpg http://[server]/TSP/Skittering%20Monstrosity.full.jpg -skittering_skirge.jpg http://[server]/BD/Skittering%20Skirge.full.jpg -skittish_kavu.jpg http://[server]/IN/Skittish%20Kavu.full.jpg -skittish_valesk.jpg http://[server]/ON/Skittish%20Valesk.full.jpg -skizzik.jpg http://[server]/IN/Skizzik.full.jpg -skizzik_surger.jpg http://[server]/FUT/Skizzik%20Surger.full.jpg -skred.jpg http://[server]/CS/Skred.full.jpg -skulking_fugitive.jpg http://[server]/MM/Skulking%20Fugitive.full.jpg -skulking_ghost.jpg http://[server]/MI/Skulking%20Ghost.full.jpg -skulking_knight.jpg http://[server]/TSP/Skulking%20Knight.full.jpg -skull_catapult.jpg http://[server]/6E/Skull%20Catapult.full.jpg -skull_collector.jpg http://[server]/SOK/Skull%20Collector.full.jpg -skull_fracture.jpg http://[server]/OD/Skull%20Fracture.full.jpg -skull_of_orm.jpg http://[server]/8E/Skull%20of%20Orm.full.jpg -skull_of_ramos.jpg http://[server]/MM/Skull%20of%20Ramos.full.jpg -skullcage.jpg http://[server]/FD/Skullcage.full.jpg -skullclamp.jpg http://[server]/DS/Skullclamp.full.jpg -skullmane_baku.jpg http://[server]/BOK/Skullmane%20Baku.full.jpg -skullmead_cauldron.jpg http://[server]/DIS/Skullmead%20Cauldron.full.jpg -skullmulcher.jpg http://[server]/ALA/Skullmulcher.full.jpg -skullscorch.jpg http://[server]/TO/Skullscorch.full.jpg -skullsnatcher.jpg http://[server]/BOK/Skullsnatcher.full.jpg -skulltap.jpg http://[server]/SC/Skulltap.full.jpg -sky_diamond.jpg http://[server]/7E/Sky%20Diamond.full.jpg -sky_hussar.jpg http://[server]/DIS/Sky%20Hussar.full.jpg -sky_ruin_drake.jpg http://[server]/ZEN/Sky%20Ruin%20Drake.full.jpg -sky_spirit.jpg http://[server]/TE/Sky%20Spirit.full.jpg -sky_swallower.jpg http://[server]/GP/Sky%20Swallower.full.jpg -sky_weaver.jpg http://[server]/10E/Sky%20Weaver.full.jpg -skyclaw_thrash.jpg http://[server]/ARB/Skyclaw%20Thrash.full.jpg -skycloud_egg.jpg http://[server]/OD/Skycloud%20Egg.full.jpg -skycloud_expanse.jpg http://[server]/OD/Skycloud%20Expanse.full.jpg -skyfire_kirin.jpg http://[server]/SOK/Skyfire%20Kirin.full.jpg -skyhunter_cub.jpg http://[server]/MR/Skyhunter%20Cub.full.jpg -skyhunter_patrol.jpg http://[server]/10E/Skyhunter%20Patrol.full.jpg -skyhunter_prowler.jpg http://[server]/10E/Skyhunter%20Prowler.full.jpg -skyhunter_skirmisher.jpg http://[server]/10E/Skyhunter%20Skirmisher.full.jpg -skyknight_legionnaire.jpg http://[server]/RAV/Skyknight%20Legionnaire.full.jpg -skyreach_manta.jpg http://[server]/FD/Skyreach%20Manta.full.jpg -skyrider_trainee.jpg http://[server]/GP/Skyrider%20Trainee.full.jpg -skyscribing.jpg http://[server]/DIS/Skyscribing.full.jpg -skyshaper.jpg http://[server]/EX/Skyshaper.full.jpg -skyship_weatherlight.jpg http://[server]/PS/Skyship%20Weatherlight.full.jpg -skyshooter.jpg http://[server]/OD/Skyshooter.full.jpg -skyshroud_archer.jpg http://[server]/SH/Skyshroud%20Archer.full.jpg -skyshroud_behemoth.jpg http://[server]/NE/Skyshroud%20Behemoth.full.jpg -skyshroud_blessing.jpg http://[server]/PS/Skyshroud%20Blessing.full.jpg -skyshroud_claim.jpg http://[server]/NE/Skyshroud%20Claim.full.jpg -skyshroud_condor.jpg http://[server]/TE/Skyshroud%20Condor.full.jpg -skyshroud_cutter.jpg http://[server]/NE/Skyshroud%20Cutter.full.jpg -skyshroud_elf.jpg http://[server]/TE/Skyshroud%20Elf.full.jpg -skyshroud_elite.jpg http://[server]/EX/Skyshroud%20Elite.full.jpg -skyshroud_falcon.jpg http://[server]/7E/Skyshroud%20Falcon.full.jpg -skyshroud_forest.jpg http://[server]/TE/Skyshroud%20Forest.full.jpg -skyshroud_poacher.jpg http://[server]/NE/Skyshroud%20Poacher.full.jpg -skyshroud_ranger.jpg http://[server]/10E/Skyshroud%20Ranger.full.jpg -skyshroud_ridgeback.jpg http://[server]/NE/Skyshroud%20Ridgeback.full.jpg -skyshroud_sentinel.jpg http://[server]/NE/Skyshroud%20Sentinel.full.jpg -skyshroud_troll.jpg http://[server]/TE/Skyshroud%20Troll.full.jpg -skyshroud_troopers.jpg http://[server]/SH/Skyshroud%20Troopers.full.jpg -skyshroud_vampire.jpg http://[server]/TE/Skyshroud%20Vampire.full.jpg -skyshroud_war_beast.jpg http://[server]/EX/Skyshroud%20War%20Beast.full.jpg -skyward_eye_prophets.jpg http://[server]/CFX/Skyward%20Eye%20Prophets.full.jpg -skywing_aven.jpg http://[server]/TO/Skywing%20Aven.full.jpg -slagwurm_armor.jpg http://[server]/MR/Slagwurm%20Armor.full.jpg -slashing_tiger.jpg http://[server]/P3/Slashing%20Tiger.full.jpg -slate_of_ancestry.jpg http://[server]/ON/Slate%20of%20Ancestry.full.jpg -slaughter.jpg http://[server]/EX/Slaughter.full.jpg -slaughter_cry.jpg http://[server]/ZEN/Slaughter%20Cry.full.jpg -slaughter_pact.jpg http://[server]/FUT/Slaughter%20Pact.full.jpg -slaughterhouse_bouncer.jpg http://[server]/DIS/Slaughterhouse%20Bouncer.full.jpg -slave_of_bolas.jpg http://[server]/ARB/Slave%20of%20Bolas.full.jpg -slay.jpg http://[server]/9E/Slay.full.jpg -sleep.jpg http://[server]/M10/Sleep.full.jpg -sleeper_agent.jpg http://[server]/10E/Sleeper%20Agent.full.jpg -sleepers_guile.jpg http://[server]/UL/Sleeper's%20Guile.full.jpg -sleepers_robe.jpg http://[server]/IN/Sleeper's%20Robe.full.jpg -sleeping_potion.jpg http://[server]/PS/Sleeping%20Potion.full.jpg -sleight_of_hand.jpg http://[server]/7E/Sleight%20of%20Hand.full.jpg -sleight_of_mind.jpg http://[server]/5E/Sleight%20of%20Mind.full.jpg -slice_and_dice.jpg http://[server]/ON/Slice%20and%20Dice.full.jpg -slimy_kavu.jpg http://[server]/IN/Slimy%20Kavu.full.jpg -slingshot_goblin.jpg http://[server]/PS/Slingshot%20Goblin.full.jpg -slinking_giant.jpg http://[server]/SHM/Slinking%20Giant.full.jpg -slinking_serpent.jpg http://[server]/IN/Slinking%20Serpent.full.jpg -slinking_skirge.jpg http://[server]/UD/Slinking%20Skirge.full.jpg -slippery_bogle.jpg http://[server]/EVE/Slippery%20Bogle.full.jpg -slippery_karst.jpg http://[server]/AT/Slippery%20Karst.full.jpg -slipstream_eel.jpg http://[server]/ON/Slipstream%20Eel.full.jpg -slipstream_serpent.jpg http://[server]/TSP/Slipstream%20Serpent.full.jpg -sliptide_serpent.jpg http://[server]/NE/Sliptide%20Serpent.full.jpg -slith_ascendant.jpg http://[server]/MR/Slith%20Ascendant.full.jpg -slith_bloodletter.jpg http://[server]/MR/Slith%20Bloodletter.full.jpg -slith_firewalker.jpg http://[server]/MR/Slith%20Firewalker.full.jpg -slith_predator.jpg http://[server]/MR/Slith%20Predator.full.jpg -slith_strider.jpg http://[server]/MR/Slith%20Strider.full.jpg -slithering_shade.jpg http://[server]/DIS/Slithering%20Shade.full.jpg -slithermuse.jpg http://[server]/MOR/Slithermuse.full.jpg -slithery_stalker.jpg http://[server]/TO/Slithery%20Stalker.full.jpg -sliver_legion.jpg http://[server]/FUT/Sliver%20Legion.full.jpg -sliver_overlord.jpg http://[server]/SC/Sliver%20Overlord.full.jpg -sliver_queen.jpg http://[server]/SH/Sliver%20Queen.full.jpg -sliver_queen_brood_mother.jpg http://[server]/VG/Sliver%20Queen,%20Brood%20Mother.full.jpg -sliversmith.jpg http://[server]/FUT/Sliversmith.full.jpg -slobad_goblin_tinkerer.jpg http://[server]/DS/Slobad,%20Goblin%20Tinkerer.full.jpg -slow_motion.jpg http://[server]/UL/Slow%20Motion.full.jpg -sludge_strider.jpg http://[server]/HOP/Sludge%20Strider.full.jpg -sluggishness.jpg http://[server]/UL/Sluggishness.full.jpg -slumbering_tora.jpg http://[server]/BOK/Slumbering%20Tora.full.jpg -smallpox.jpg http://[server]/TSP/Smallpox.full.jpg -smart_ass.jpg http://[server]/UNH/Smart%20Ass.full.jpg -smash.jpg http://[server]/10E/Smash.full.jpg -smash_to_smithereens.jpg http://[server]/SHM/Smash%20to%20Smithereens.full.jpg -smite.jpg http://[server]/SH/Smite.full.jpg -smogsteed_rider.jpg http://[server]/GP/Smogsteed%20Rider.full.jpg -smoke.jpg http://[server]/5E/Smoke.full.jpg -smokebraider.jpg http://[server]/HOP/Smokebraider.full.jpg -smokespew_invoker.jpg http://[server]/LE/Smokespew%20Invoker.full.jpg -smokestack.jpg http://[server]/US/Smokestack.full.jpg -smolder_initiate.jpg http://[server]/SHM/Smolder%20Initiate.full.jpg -smoldering_butcher.jpg http://[server]/EVE/Smoldering%20Butcher.full.jpg -smoldering_crater.jpg http://[server]/AT/Smoldering%20Crater.full.jpg -smoldering_tar.jpg http://[server]/IN/Smoldering%20Tar.full.jpg -smother.jpg http://[server]/ON/Smother.full.jpg -snag.jpg http://[server]/PY/Snag.full.jpg -snake_basket.jpg http://[server]/6E/Snake%20Basket.full.jpg -snake_cult_initiation.jpg http://[server]/FUT/Snake%20Cult%20Initiation.full.jpg -snake_pit.jpg http://[server]/MM/Snake%20Pit.full.jpg -snakeform.jpg http://[server]/EVE/Snakeform.full.jpg -snap.jpg http://[server]/UL/Snap.full.jpg -snapback.jpg http://[server]/TSP/Snapback.full.jpg -snapping_drake.jpg http://[server]/M10/Snapping%20Drake.full.jpg -snapping_thragg.jpg http://[server]/ON/Snapping%20Thragg.full.jpg -snarling_undorak.jpg http://[server]/ON/Snarling%20Undorak.full.jpg -sneak_attack.jpg http://[server]/US/Sneak%20Attack.full.jpg -sneaky_homunculus.jpg http://[server]/8E/Sneaky%20Homunculus.full.jpg -snorting_gahr.jpg http://[server]/MM/Snorting%20Gahr.full.jpg -snow_devil.jpg http://[server]/IA/Snow%20Devil.full.jpg -snow_fortress.jpg http://[server]/IA/Snow%20Fortress.full.jpg -snow_hound.jpg http://[server]/IA/Snow%20Hound.full.jpg -snowblind.jpg http://[server]/IA/Snowblind.full.jpg -snowfall.jpg http://[server]/IA/Snowfall.full.jpg -snuff_out.jpg http://[server]/MM/Snuff%20Out.full.jpg -soar.jpg http://[server]/MI/Soar.full.jpg -soaring_hope.jpg http://[server]/LRW/Soaring%20Hope.full.jpg -soaring_seacliff.jpg http://[server]/ZEN/Soaring%20Seacliff.full.jpg -soilshaper.jpg http://[server]/CHK/Soilshaper.full.jpg -sokenzan_bruiser.jpg http://[server]/CHK/Sokenzan%20Bruiser.full.jpg -sokenzan_renegade.jpg http://[server]/SOK/Sokenzan%20Renegade.full.jpg -sokenzan_spellblade.jpg http://[server]/SOK/Sokenzan%20Spellblade.full.jpg -sol_grail.jpg http://[server]/AL/Sol%20Grail.full.jpg -sol_ring.jpg http://[server]/U/Sol%20Ring.full.jpg -solar_blast.jpg http://[server]/ON/Solar%20Blast.full.jpg -solar_tide.jpg http://[server]/MR/Solar%20Tide.full.jpg -solarion.jpg http://[server]/FD/Solarion.full.jpg -soldevi_adnate.jpg http://[server]/AL/Soldevi%20Adnate1.full.jpg -soldevi_digger.jpg http://[server]/AL/Soldevi%20Digger.full.jpg -soldevi_excavations.jpg http://[server]/AL/Soldevi%20Excavations.full.jpg -soldevi_golem.jpg http://[server]/IA/Soldevi%20Golem.full.jpg -soldevi_heretic.jpg http://[server]/AL/Soldevi%20Heretic1.full.jpg -soldevi_machinist.jpg http://[server]/IA/Soldevi%20Machinist.full.jpg -soldevi_sage.jpg http://[server]/6E/Soldevi%20Sage.full.jpg -soldevi_sentry.jpg http://[server]/AL/Soldevi%20Sentry1.full.jpg -soldevi_simulacrum.jpg http://[server]/IA/Soldevi%20Simulacrum.full.jpg -soldevi_steam_beast.jpg http://[server]/AL/Soldevi%20Steam%20Beast1.full.jpg -soldier.jpg http://[server]/UG/Soldier.full.jpg -soldier_of_fortune.jpg http://[server]/AL/Soldier%20of%20Fortune.full.jpg -soldier_replica.jpg http://[server]/MR/Soldier%20Replica.full.jpg -solemn_offering.jpg http://[server]/M10/Solemn%20Offering.full.jpg -solemn_simulacrum.jpg http://[server]/MR/Solemn%20Simulacrum.full.jpg -solfatara.jpg http://[server]/VI/Solfatara.full.jpg -solidarity.jpg http://[server]/8E/Solidarity.full.jpg -solitary_confinement.jpg http://[server]/JU/Solitary%20Confinement.full.jpg -solkanar_the_swamp_king.jpg http://[server]/CH/Sol'kanar%20the%20Swamp%20King.full.jpg -soltari_champion.jpg http://[server]/SH/Soltari%20Champion.full.jpg -soltari_crusader.jpg http://[server]/TE/Soltari%20Crusader.full.jpg -soltari_emissary.jpg http://[server]/TE/Soltari%20Emissary.full.jpg -soltari_foot_soldier.jpg http://[server]/TE/Soltari%20Foot%20Soldier.full.jpg -soltari_guerrillas.jpg http://[server]/TE/Soltari%20Guerrillas.full.jpg -soltari_lancer.jpg http://[server]/TE/Soltari%20Lancer.full.jpg -soltari_monk.jpg http://[server]/TE/Soltari%20Monk.full.jpg -soltari_priest.jpg http://[server]/TE/Soltari%20Priest.full.jpg -soltari_trooper.jpg http://[server]/TE/Soltari%20Trooper.full.jpg -soltari_visionary.jpg http://[server]/EX/Soltari%20Visionary.full.jpg -somber_hoverguard.jpg http://[server]/MR/Somber%20Hoverguard.full.jpg -somnomancer.jpg http://[server]/SHM/Somnomancer.full.jpg -somnophore.jpg http://[server]/US/Somnophore.full.jpg -song_of_blood.jpg http://[server]/VI/Song%20of%20Blood.full.jpg -song_of_serenity.jpg http://[server]/EX/Song%20of%20Serenity.full.jpg -songs_of_the_damned.jpg http://[server]/IA/Songs%20of%20the%20Damned.full.jpg -songstitcher.jpg http://[server]/US/Songstitcher.full.jpg -sonic_burst.jpg http://[server]/BD/Sonic%20Burst.full.jpg -sonic_seizure.jpg http://[server]/TO/Sonic%20Seizure.full.jpg -soot_imp.jpg http://[server]/EVE/Soot%20Imp.full.jpg -sootfeather_flock.jpg http://[server]/LE/Sootfeather%20Flock.full.jpg -soothing_balm.jpg http://[server]/MM/Soothing%20Balm.full.jpg -soothsaying.jpg http://[server]/MM/Soothsaying.full.jpg -sootstoke_kindler.jpg http://[server]/SHM/Sootstoke%20Kindler.full.jpg -sootwalkers.jpg http://[server]/SHM/Sootwalkers.full.jpg -sophic_centaur.jpg http://[server]/PLC/Sophic%20Centaur.full.jpg -soramaro_first_to_dream.jpg http://[server]/SOK/Soramaro,%20First%20to%20Dream.full.jpg -soratami_cloud_chariot.jpg http://[server]/SOK/Soratami%20Cloud%20Chariot.full.jpg -soratami_cloudskater.jpg http://[server]/CHK/Soratami%20Cloudskater.full.jpg -soratami_mindsweeper.jpg http://[server]/BOK/Soratami%20Mindsweeper.full.jpg -soratami_mirror_guard.jpg http://[server]/CHK/Soratami%20Mirror-Guard.full.jpg -soratami_mirror_mage.jpg http://[server]/CHK/Soratami%20Mirror-Mage.full.jpg -soratami_rainshaper.jpg http://[server]/CHK/Soratami%20Rainshaper.full.jpg -soratami_savant.jpg http://[server]/CHK/Soratami%20Savant.full.jpg -soratami_seer.jpg http://[server]/CHK/Soratami%20Seer.full.jpg -soraya_the_falconer.jpg http://[server]/HL/Soraya%20the%20Falconer.full.jpg -sorceress_queen.jpg http://[server]/5E/Sorceress%20Queen.full.jpg -sorcerous_sight.jpg http://[server]/PT/Sorcerous%20Sight.full.jpg -sorin_markov.jpg http://[server]/ZEN/Sorin%20Markov.full.jpg -sorrows_path.jpg http://[server]/DK/Sorrow's%20Path.full.jpg -sorry.jpg http://[server]/UG/Sorry.full.jpg -sosuke_son_of_seshiro.jpg http://[server]/CHK/Sosuke,%20Son%20of%20Seshiro.full.jpg -sosukes_summons.jpg http://[server]/BOK/Sosuke's%20Summons.full.jpg -soul_barrier.jpg http://[server]/5E/Soul%20Barrier.full.jpg -soul_bleed.jpg http://[server]/M10/Soul%20Bleed.full.jpg -soul_burn.jpg http://[server]/IN/Soul%20Burn.full.jpg -soul_channeling.jpg http://[server]/MM/Soul%20Channeling.full.jpg -soul_charmer.jpg http://[server]/PY/Soul%20Charmer.full.jpg -soul_collector.jpg http://[server]/SC/Soul%20Collector.full.jpg -soul_echo.jpg http://[server]/MI/Soul%20Echo.full.jpg -soul_exchange.jpg http://[server]/FE/Soul%20Exchange.full.jpg -soul_feast.jpg http://[server]/10E/Soul%20Feast.full.jpg -soul_foundry.jpg http://[server]/MR/Soul%20Foundry.full.jpg -soul_kiss.jpg http://[server]/IA/Soul%20Kiss.full.jpg -soul_link.jpg http://[server]/AP/Soul%20Link.full.jpg -soul_manipulation.jpg http://[server]/ARB/Soul%20Manipulation.full.jpg -soul_net.jpg http://[server]/7E/Soul%20Net.full.jpg -soul_nova.jpg http://[server]/MR/Soul%20Nova.full.jpg -soul_of_magma.jpg http://[server]/CHK/Soul%20of%20Magma.full.jpg -soul_reap.jpg http://[server]/EVE/Soul%20Reap.full.jpg -soul_rend.jpg http://[server]/MI/Soul%20Rend.full.jpg -soul_scourge.jpg http://[server]/TO/Soul%20Scourge.full.jpg -soul_sculptor.jpg http://[server]/US/Soul%20Sculptor.full.jpg -soul_shepherd.jpg http://[server]/WL/Soul%20Shepherd.full.jpg -soul_shred.jpg http://[server]/PT/Soul%20Shred.full.jpg -soul_snuffers.jpg http://[server]/EVE/Soul%20Snuffers.full.jpg -soul_spike.jpg http://[server]/CS/Soul%20Spike.full.jpg -soul_stair_expedition.jpg http://[server]/ZEN/Soul%20Stair%20Expedition.full.jpg -soul_strings.jpg http://[server]/PY/Soul%20Strings.full.jpg -soul_warden.jpg http://[server]/M10/Soul%20Warden.full.jpg -soulblast.jpg http://[server]/10E/Soulblast.full.jpg -soulbright_flamekin.jpg http://[server]/LRW/Soulbright%20Flamekin.full.jpg -soulcatcher.jpg http://[server]/OD/Soulcatcher.full.jpg -soulcatchers_aerie.jpg http://[server]/JU/Soulcatchers'%20Aerie.full.jpg -souldrinker.jpg http://[server]/TE/Souldrinker.full.jpg -soulgorger_orgg.jpg http://[server]/JU/Soulgorger%20Orgg.full.jpg -soulless_one.jpg http://[server]/HOP/Soulless%20One.full.jpg -soulless_revival.jpg http://[server]/CHK/Soulless%20Revival.full.jpg -soulquake.jpg http://[server]/ARB/Soulquake.full.jpg -souls_fire.jpg http://[server]/ALA/Soul's%20Fire.full.jpg -souls_grace.jpg http://[server]/ALA/Soul's%20Grace.full.jpg -souls_majesty.jpg http://[server]/CFX/Soul's%20Majesty.full.jpg -souls_might.jpg http://[server]/ALA/Soul's%20Might.full.jpg -souls_of_the_faultless.jpg http://[server]/GP/Souls%20of%20the%20Faultless.full.jpg -soulscour.jpg http://[server]/DS/Soulscour.full.jpg -soulshriek.jpg http://[server]/MI/Soulshriek.full.jpg -soulsworn_jury.jpg http://[server]/DIS/Soulsworn%20Jury.full.jpg -soultether_golem.jpg http://[server]/FUT/Soultether%20Golem.full.jpg -sound_the_call.jpg http://[server]/CS/Sound%20the%20Call.full.jpg -southern_elephant.jpg http://[server]/ST/Southern%20Elephant.full.jpg -southern_paladin.jpg http://[server]/7E/Southern%20Paladin.full.jpg -sovereigns_of_lost_alara.jpg http://[server]/ARB/Sovereigns%20of%20Lost%20Alara.full.jpg -sower_of_temptation.jpg http://[server]/LRW/Sower%20of%20Temptation.full.jpg -sowing_salt.jpg http://[server]/UD/Sowing%20Salt.full.jpg -spark_elemental.jpg http://[server]/10E/Spark%20Elemental.full.jpg -spark_fiend.jpg http://[server]/UG/Spark%20Fiend.full.jpg -spark_mage.jpg http://[server]/OD/Spark%20Mage.full.jpg -spark_spray.jpg http://[server]/SC/Spark%20Spray.full.jpg -sparkcaster.jpg http://[server]/PS/Sparkcaster.full.jpg -sparkmage_apprentice.jpg http://[server]/M10/Sparkmage%20Apprentice.full.jpg -sparksmith.jpg http://[server]/ON/Sparksmith.full.jpg -sparkspitter.jpg http://[server]/FUT/Sparkspitter.full.jpg -sparring_collar.jpg http://[server]/FD/Sparring%20Collar.full.jpg -sparring_golem.jpg http://[server]/IN/Sparring%20Golem.full.jpg -spatial_binding.jpg http://[server]/MI/Spatial%20Binding.full.jpg -spatula_of_the_ages.jpg http://[server]/UG/Spatula%20of%20the%20Ages.full.jpg -spawnbroker.jpg http://[server]/RAV/Spawnbroker.full.jpg -spawning_pit.jpg http://[server]/DS/Spawning%20Pit.full.jpg -spawning_pool.jpg http://[server]/10E/Spawning%20Pool.full.jpg -spawnwrithe.jpg http://[server]/SHM/Spawnwrithe.full.jpg -spearbreaker_behemoth.jpg http://[server]/ALA/Spearbreaker%20Behemoth.full.jpg -specters_shroud.jpg http://[server]/DS/Specter's%20Shroud.full.jpg -specters_wail.jpg http://[server]/MM/Specter's%20Wail.full.jpg -spectral_bears.jpg http://[server]/AT/Spectral%20Bears.full.jpg -spectral_cloak.jpg http://[server]/LG/Spectral%20Cloak.full.jpg -spectral_force.jpg http://[server]/TSP/Spectral%20Force.full.jpg -spectral_guardian.jpg http://[server]/MI/Spectral%20Guardian.full.jpg -spectral_lynx.jpg http://[server]/AP/Spectral%20Lynx.full.jpg -spectral_procession.jpg http://[server]/SHM/Spectral%20Procession.full.jpg -spectral_searchlight.jpg http://[server]/RAV/Spectral%20Searchlight.full.jpg -spectral_shield.jpg http://[server]/IA/Spectral%20Shield.full.jpg -spectral_shift.jpg http://[server]/FD/Spectral%20Shift.full.jpg -spectral_sliver.jpg http://[server]/LE/Spectral%20Sliver.full.jpg -spell_blast.jpg http://[server]/6E/Spell%20Blast.full.jpg -spell_burst.jpg http://[server]/TSP/Spell%20Burst.full.jpg -spell_counter.jpg http://[server]/UNH/Spell%20Counter.full.jpg -spell_pierce.jpg http://[server]/ZEN/Spell%20Pierce.full.jpg -spell_snare.jpg http://[server]/DIS/Spell%20Snare.full.jpg -spell_snip.jpg http://[server]/ALA/Spell%20Snip.full.jpg -spell_syphon.jpg http://[server]/SHM/Spell%20Syphon.full.jpg -spellbane_centaur.jpg http://[server]/OD/Spellbane%20Centaur.full.jpg -spellbinder.jpg http://[server]/DS/Spellbinder.full.jpg -spellbook.jpg http://[server]/M10/Spellbook.full.jpg -spellbound_dragon.jpg http://[server]/ARB/Spellbound%20Dragon.full.jpg -spellbreaker_behemoth.jpg http://[server]/ARB/Spellbreaker%20Behemoth.full.jpg -spellgorger_barbarian.jpg http://[server]/JU/Spellgorger%20Barbarian.full.jpg -spelljack.jpg http://[server]/JU/Spelljack.full.jpg -spellshift.jpg http://[server]/PLC/Spellshift.full.jpg -spellshock.jpg http://[server]/EX/Spellshock.full.jpg -spellstutter_sprite.jpg http://[server]/LRW/Spellstutter%20Sprite.full.jpg -spelltithe_enforcer.jpg http://[server]/GP/Spelltithe%20Enforcer.full.jpg -spellweaver_helix.jpg http://[server]/MR/Spellweaver%20Helix.full.jpg -spellweaver_volute.jpg http://[server]/FUT/Spellweaver%20Volute.full.jpg -spellwild_ouphe.jpg http://[server]/FUT/Spellwild%20Ouphe.full.jpg -sphere_of_duty.jpg http://[server]/OD/Sphere%20of%20Duty.full.jpg -sphere_of_grace.jpg http://[server]/OD/Sphere%20of%20Grace.full.jpg -sphere_of_law.jpg http://[server]/OD/Sphere%20of%20Law.full.jpg -sphere_of_purity.jpg http://[server]/MR/Sphere%20of%20Purity.full.jpg -sphere_of_reason.jpg http://[server]/OD/Sphere%20of%20Reason.full.jpg -sphere_of_resistance.jpg http://[server]/EX/Sphere%20of%20Resistance.full.jpg -sphere_of_truth.jpg http://[server]/OD/Sphere%20of%20Truth.full.jpg -sphinx_ambassador.jpg http://[server]/M10/Sphinx%20Ambassador.full.jpg -sphinx_of_jwar_isle.jpg http://[server]/ZEN/Sphinx%20of%20Jwar%20Isle.full.jpg -sphinx_of_lost_truths.jpg http://[server]/ZEN/Sphinx%20of%20Lost%20Truths.full.jpg -sphinx_of_the_steel_wind.jpg http://[server]/ARB/Sphinx%20of%20the%20Steel%20Wind.full.jpg -sphinx_sovereign.jpg http://[server]/ALA/Sphinx%20Sovereign.full.jpg -sphinx_summoner.jpg http://[server]/CFX/Sphinx%20Summoner.full.jpg -sphinxs_herald.jpg http://[server]/ALA/Sphinx's%20Herald.full.jpg -spider_climb.jpg http://[server]/VI/Spider%20Climb.full.jpg -spidersilk_armor.jpg http://[server]/MM/Spidersilk%20Armor.full.jpg -spidersilk_net.jpg http://[server]/ZEN/Spidersilk%20Net.full.jpg -spiderwig_boggart.jpg http://[server]/LRW/Spiderwig%20Boggart.full.jpg -spike_breeder.jpg http://[server]/SH/Spike%20Breeder.full.jpg -spike_cannibal.jpg http://[server]/EX/Spike%20Cannibal.full.jpg -spike_colony.jpg http://[server]/SH/Spike%20Colony.full.jpg -spike_drone.jpg http://[server]/TE/Spike%20Drone.full.jpg -spike_feeder.jpg http://[server]/SH/Spike%20Feeder.full.jpg -spike_hatcher.jpg http://[server]/EX/Spike%20Hatcher.full.jpg -spike_rogue.jpg http://[server]/EX/Spike%20Rogue.full.jpg -spike_soldier.jpg http://[server]/SH/Spike%20Soldier.full.jpg -spike_tiller.jpg http://[server]/TSP/Spike%20Tiller.full.jpg -spike_weaver.jpg http://[server]/EX/Spike%20Weaver.full.jpg -spike_worker.jpg http://[server]/SH/Spike%20Worker.full.jpg -spikeshot_goblin.jpg http://[server]/MR/Spikeshot%20Goblin.full.jpg -spiketail_drake.jpg http://[server]/PY/Spiketail%20Drake.full.jpg -spiketail_drakeling.jpg http://[server]/TSP/Spiketail%20Drakeling.full.jpg -spiketail_hatchling.jpg http://[server]/10E/Spiketail%20Hatchling.full.jpg -spin_into_myth.jpg http://[server]/FUT/Spin%20into%20Myth.full.jpg -spinal_embrace.jpg http://[server]/IN/Spinal%20Embrace.full.jpg -spinal_graft.jpg http://[server]/TE/Spinal%20Graft.full.jpg -spinal_parasite.jpg http://[server]/FD/Spinal%20Parasite.full.jpg -spinal_villain.jpg http://[server]/LG/Spinal%20Villain.full.jpg -spincrusher.jpg http://[server]/DS/Spincrusher.full.jpg -spindrift_drake.jpg http://[server]/SH/Spindrift%20Drake.full.jpg -spined_basher.jpg http://[server]/ON/Spined%20Basher.full.jpg -spined_fluke.jpg http://[server]/US/Spined%20Fluke.full.jpg -spined_sliver.jpg http://[server]/SH/Spined%20Sliver.full.jpg -spined_wurm.jpg http://[server]/10E/Spined%20Wurm.full.jpg -spineless_thug.jpg http://[server]/10E/Spineless%20Thug.full.jpg -spinerock_knoll.jpg http://[server]/LRW/Spinerock%20Knoll.full.jpg -spinneret_sliver.jpg http://[server]/TSP/Spinneret%20Sliver.full.jpg -spinning_darkness.jpg http://[server]/WL/Spinning%20Darkness.full.jpg -spiny_starfish.jpg http://[server]/AL/Spiny%20Starfish.full.jpg -spiraling_embers.jpg http://[server]/SOK/Spiraling%20Embers.full.jpg -spire_barrage.jpg http://[server]/ZEN/Spire%20Barrage.full.jpg -spire_golem.jpg http://[server]/DS/Spire%20Golem.full.jpg -spire_owl.jpg http://[server]/US/Spire%20Owl.full.jpg -spirit_cairn.jpg http://[server]/JU/Spirit%20Cairn.full.jpg -spirit_en_dal.jpg http://[server]/FUT/Spirit%20en-Dal.full.jpg -spirit_en_kor.jpg http://[server]/SH/Spirit%20en-Kor.full.jpg -spirit_flare.jpg http://[server]/TO/Spirit%20Flare.full.jpg -spirit_link.jpg http://[server]/10E/Spirit%20Link.full.jpg -spirit_loop.jpg http://[server]/TSP/Spirit%20Loop.full.jpg -spirit_mirror.jpg http://[server]/TE/Spirit%20Mirror.full.jpg -spirit_of_resistance.jpg http://[server]/IN/Spirit%20of%20Resistance.full.jpg -spirit_of_the_hearth.jpg http://[server]/EVE/Spirit%20of%20the%20Hearth.full.jpg -spirit_of_the_night.jpg http://[server]/MI/Spirit%20of%20the%20Night.full.jpg -spirit_shackle.jpg http://[server]/4E/Spirit%20Shackle.full.jpg -spirit_shield.jpg http://[server]/FE/Spirit%20Shield.full.jpg -spirit_weaver.jpg http://[server]/10E/Spirit%20Weaver.full.jpg -spiritmonger.jpg http://[server]/AP/Spiritmonger.full.jpg -spiritual_asylum.jpg http://[server]/NE/Spiritual%20Asylum.full.jpg -spiritual_focus.jpg http://[server]/MM/Spiritual%20Focus.full.jpg -spiritual_guardian.jpg http://[server]/PT/Spiritual%20Guardian.full.jpg -spiritual_sanctuary.jpg http://[server]/LG/Spiritual%20Sanctuary.full.jpg -spiritual_visit.jpg http://[server]/SOK/Spiritual%20Visit.full.jpg -spiritualize.jpg http://[server]/OD/Spiritualize.full.jpg -spitebellows.jpg http://[server]/MOR/Spitebellows.full.jpg -spiteflame_witch.jpg http://[server]/SHM/Spiteflame%20Witch.full.jpg -spiteful_bully.jpg http://[server]/NE/Spiteful%20Bully.full.jpg -spiteful_visions.jpg http://[server]/SHM/Spiteful%20Visions.full.jpg -spitemalice.jpg http://[server]/IN/SpiteMalice.full.jpg -spitemare.jpg http://[server]/EVE/Spitemare.full.jpg -spitfire_handler.jpg http://[server]/ON/Spitfire%20Handler.full.jpg -spitting_drake.jpg http://[server]/6E/Spitting%20Drake.full.jpg -spitting_earth.jpg http://[server]/10E/Spitting%20Earth.full.jpg -spitting_gourna.jpg http://[server]/ON/Spitting%20Gourna.full.jpg -spitting_hydra.jpg http://[server]/SH/Spitting%20Hydra.full.jpg -spitting_image.jpg http://[server]/EVE/Spitting%20Image.full.jpg -spitting_sliver.jpg http://[server]/PLC/Spitting%20Sliver.full.jpg -spitting_slug.jpg http://[server]/DK/Spitting%20Slug.full.jpg -spitting_spider.jpg http://[server]/8E/Spitting%20Spider.full.jpg -splendid_genesis.jpg http://[server]/PR/Splendid%20Genesis.full.jpg -splinter.jpg http://[server]/UD/Splinter.full.jpg -splintering_wind.jpg http://[server]/AL/Splintering%20Wind.full.jpg -split_tail_miko.jpg http://[server]/BOK/Split-Tail%20Miko.full.jpg -splitting_headache.jpg http://[server]/SHM/Splitting%20Headache.full.jpg -spoils_of_evil.jpg http://[server]/IA/Spoils%20of%20Evil.full.jpg -spoils_of_the_vault.jpg http://[server]/MR/Spoils%20of%20the%20Vault.full.jpg -spoils_of_victory.jpg http://[server]/P3/Spoils%20of%20Victory.full.jpg -spoils_of_war.jpg http://[server]/IA/Spoils%20of%20War.full.jpg -spontaneous_combustion.jpg http://[server]/TE/Spontaneous%20Combustion.full.jpg -spontaneous_generation.jpg http://[server]/MM/Spontaneous%20Generation.full.jpg -spore_burst.jpg http://[server]/CFX/Spore%20Burst.full.jpg -spore_cloud.jpg http://[server]/FE/Spore%20Cloud1.full.jpg -spore_flower.jpg http://[server]/FE/Spore%20Flower.full.jpg -spore_frog.jpg http://[server]/PY/Spore%20Frog.full.jpg -sporeback_troll.jpg http://[server]/DIS/Sporeback%20Troll.full.jpg -sporesower_thallid.jpg http://[server]/TSP/Sporesower%20Thallid.full.jpg -sporogenesis.jpg http://[server]/US/Sporogenesis.full.jpg -sporoloth_ancient.jpg http://[server]/FUT/Sporoloth%20Ancient.full.jpg -spotted_griffin.jpg http://[server]/PT/Spotted%20Griffin.full.jpg -spreading_algae.jpg http://[server]/8E/Spreading%20Algae.full.jpg -spreading_plague.jpg http://[server]/IN/Spreading%20Plague.full.jpg -spreading_seas.jpg http://[server]/ZEN/Spreading%20Seas.full.jpg -spring_cleaning.jpg http://[server]/LRW/Spring%20Cleaning.full.jpg -spring_of_eternal_peace.jpg http://[server]/P3/Spring%20of%20Eternal%20Peace.full.jpg -springing_tiger.jpg http://[server]/OD/Springing%20Tiger.full.jpg -springjack_knight.jpg http://[server]/LRW/Springjack%20Knight.full.jpg -springjack_pasture.jpg http://[server]/EVE/Springjack%20Pasture.full.jpg -springjack_shepherd.jpg http://[server]/EVE/Springjack%20Shepherd.full.jpg -springleaf_drum.jpg http://[server]/LRW/Springleaf%20Drum.full.jpg -sprite_noble.jpg http://[server]/TSP/Sprite%20Noble.full.jpg -sprout.jpg http://[server]/TSP/Sprout.full.jpg -sprout_swarm.jpg http://[server]/FUT/Sprout%20Swarm.full.jpg -sprouting_phytohydra.jpg http://[server]/DIS/Sprouting%20Phytohydra.full.jpg -sprouting_thrinax.jpg http://[server]/ALA/Sprouting%20Thrinax.full.jpg -sprouting_vines.jpg http://[server]/SC/Sprouting%20Vines.full.jpg -spur_grappler.jpg http://[server]/PY/Spur%20Grappler.full.jpg -spurnmage_advocate.jpg http://[server]/JU/Spurnmage%20Advocate.full.jpg -spurred_wolverine.jpg http://[server]/ON/Spurred%20Wolverine.full.jpg -spy_network.jpg http://[server]/ON/Spy%20Network.full.jpg -squall.jpg http://[server]/7E/Squall.full.jpg -squall_drifter.jpg http://[server]/CS/Squall%20Drifter.full.jpg -squall_line.jpg http://[server]/TSP/Squall%20Line.full.jpg -squallmonger.jpg http://[server]/MM/Squallmonger.full.jpg -squandered_resources.jpg http://[server]/VI/Squandered%20Resources.full.jpg -squeaking_pie_grubfellows.jpg http://[server]/MOR/Squeaking%20Pie%20Grubfellows.full.jpg -squeaking_pie_sneak.jpg http://[server]/LRW/Squeaking%20Pie%20Sneak.full.jpg -squealing_devil.jpg http://[server]/DIS/Squealing%20Devil.full.jpg -squee.jpg http://[server]/VG/Squee.full.jpg -squee_goblin_nabob.jpg http://[server]/10E/Squee,%20Goblin%20Nabob.full.jpg -squees_embrace.jpg http://[server]/AP/Squee's%20Embrace.full.jpg -squees_revenge.jpg http://[server]/AP/Squee's%20Revenge.full.jpg -squees_toy.jpg http://[server]/TE/Squee's%20Toy.full.jpg -squeeze.jpg http://[server]/MM/Squeeze.full.jpg -squelch.jpg http://[server]/CHK/Squelch.full.jpg -squire.jpg http://[server]/DK/Squire.full.jpg -squirming_mass.jpg http://[server]/UD/Squirming%20Mass.full.jpg -squirrel.jpg http://[server]/UG/Squirrel.full.jpg -squirrel_farm.jpg http://[server]/UG/Squirrel%20Farm.full.jpg -squirrel_mob.jpg http://[server]/OD/Squirrel%20Mob.full.jpg -squirrel_nest.jpg http://[server]/OD/Squirrel%20Nest.full.jpg -squirrel_wrangler.jpg http://[server]/PY/Squirrel%20Wrangler.full.jpg -stabilizer.jpg http://[server]/SC/Stabilizer.full.jpg -staff_of_domination.jpg http://[server]/FD/Staff%20of%20Domination.full.jpg -staff_of_the_ages.jpg http://[server]/IA/Staff%20of%20the%20Ages.full.jpg -staff_of_zegon.jpg http://[server]/AQ/Staff%20of%20Zegon.full.jpg -stag_beetle.jpg http://[server]/ON/Stag%20Beetle.full.jpg -stalker_hag.jpg http://[server]/EVE/Stalker%20Hag.full.jpg -stalking_assassin.jpg http://[server]/IN/Stalking%20Assassin.full.jpg -stalking_bloodsucker.jpg http://[server]/OD/Stalking%20Bloodsucker.full.jpg -stalking_stones.jpg http://[server]/TE/Stalking%20Stones.full.jpg -stalking_tiger.jpg http://[server]/10E/Stalking%20Tiger.full.jpg -stalking_vengeance.jpg http://[server]/DIS/Stalking%20Vengeance.full.jpg -stalking_yeti.jpg http://[server]/CS/Stalking%20Yeti.full.jpg -stamina.jpg http://[server]/MM/Stamina.full.jpg -stampede.jpg http://[server]/5E/Stampede.full.jpg -stampede_driver.jpg http://[server]/NE/Stampede%20Driver.full.jpg -stampeding_rhino.jpg http://[server]/M10/Stampeding%20Rhino.full.jpg -stampeding_serow.jpg http://[server]/SOK/Stampeding%20Serow.full.jpg -stampeding_wildebeests.jpg http://[server]/10E/Stampeding%20Wildebeests.full.jpg -stand_firm.jpg http://[server]/FD/Stand%20Firm.full.jpg -stand_or_fall.jpg http://[server]/IN/Stand%20or%20Fall.full.jpg -stand_together.jpg http://[server]/DS/Stand%20Together.full.jpg -standard_bearer.jpg http://[server]/AP/Standard%20Bearer.full.jpg -standardize.jpg http://[server]/ON/Standardize.full.jpg -standdeliver.jpg http://[server]/IN/StandDeliver.full.jpg -standing_army.jpg http://[server]/UNH/Standing%20Army.full.jpg -standing_stones.jpg http://[server]/DK/Standing%20Stones.full.jpg -standing_troops.jpg http://[server]/8E/Standing%20Troops.full.jpg -standstill.jpg http://[server]/OD/Standstill.full.jpg -stangg.jpg http://[server]/LG/Stangg.full.jpg -star_compass.jpg http://[server]/8E/Star%20Compass.full.jpg -starke.jpg http://[server]/VG/Starke.full.jpg -starke_of_rath.jpg http://[server]/TE/Starke%20of%20Rath.full.jpg -starlight.jpg http://[server]/7E/Starlight.full.jpg -starlight_invoker.jpg http://[server]/10E/Starlight%20Invoker.full.jpg -starlit_angel.jpg http://[server]/PT/Starlit%20Angel.full.jpg -starlit_sanctum.jpg http://[server]/ON/Starlit%20Sanctum.full.jpg -starstorm.jpg http://[server]/ON/Starstorm.full.jpg -starved_rusalka.jpg http://[server]/GP/Starved%20Rusalka.full.jpg -stasis.jpg http://[server]/5E/Stasis.full.jpg -stasis_cell.jpg http://[server]/RAV/Stasis%20Cell.full.jpg -stasis_cocoon.jpg http://[server]/FD/Stasis%20Cocoon.full.jpg -statecraft.jpg http://[server]/MM/Statecraft.full.jpg -static_orb.jpg http://[server]/7E/Static%20Orb.full.jpg -staunch_defenders.jpg http://[server]/8E/Staunch%20Defenders.full.jpg -staying_power.jpg http://[server]/UNH/Staying%20Power.full.jpg -steadfast_guard.jpg http://[server]/10E/Steadfast%20Guard.full.jpg -steadfastness.jpg http://[server]/PT/Steadfastness.full.jpg -steal_artifact.jpg http://[server]/8E/Steal%20Artifact.full.jpg -steal_enchantment.jpg http://[server]/TE/Steal%20Enchantment.full.jpg -steal_strength.jpg http://[server]/PY/Steal%20Strength.full.jpg -steam_blast.jpg http://[server]/US/Steam%20Blast.full.jpg -steam_catapult.jpg http://[server]/P2/Steam%20Catapult.full.jpg -steam_frigate.jpg http://[server]/P2/Steam%20Frigate.full.jpg -steam_spitter.jpg http://[server]/CS/Steam%20Spitter.full.jpg -steam_vents.jpg http://[server]/GP/Steam%20Vents.full.jpg -steam_vines.jpg http://[server]/OD/Steam%20Vines.full.jpg -steamclaw.jpg http://[server]/OD/Steamclaw.full.jpg -steamcore_weird.jpg http://[server]/GP/Steamcore%20Weird.full.jpg -steamflogger_boss.jpg http://[server]/FUT/Steamflogger%20Boss.full.jpg -steel_golem.jpg http://[server]/10E/Steel%20Golem.full.jpg -steel_leaf_paladin.jpg http://[server]/PS/Steel%20Leaf%20Paladin.full.jpg -steel_of_the_godhead.jpg http://[server]/SHM/Steel%20of%20the%20Godhead.full.jpg -steel_wall.jpg http://[server]/MR/Steel%20Wall.full.jpg -steelclad_serpent.jpg http://[server]/ALA/Steelclad%20Serpent.full.jpg -steeling_stance.jpg http://[server]/DIS/Steeling%20Stance.full.jpg -steelshaper_apprentice.jpg http://[server]/DS/Steelshaper%20Apprentice.full.jpg -steelshapers_gift.jpg http://[server]/FD/Steelshaper's%20Gift.full.jpg -steely_resolve.jpg http://[server]/ON/Steely%20Resolve.full.jpg -stench_of_decay.jpg http://[server]/AL/Stench%20of%20Decay1.full.jpg -stench_of_evil.jpg http://[server]/IA/Stench%20of%20Evil.full.jpg -stenchskipper.jpg http://[server]/MOR/Stenchskipper.full.jpg -steppe_lynx.jpg http://[server]/ZEN/Steppe%20Lynx.full.jpg -sterling_grove.jpg http://[server]/IN/Sterling%20Grove.full.jpg -stern_judge.jpg http://[server]/TO/Stern%20Judge.full.jpg -stern_marshal.jpg http://[server]/PT/Stern%20Marshal.full.jpg -stern_proctor.jpg http://[server]/US/Stern%20Proctor.full.jpg -steward_of_valeron.jpg http://[server]/ALA/Steward%20of%20Valeron.full.jpg -stifle.jpg http://[server]/SC/Stifle.full.jpg -stigma_lasher.jpg http://[server]/EVE/Stigma%20Lasher.full.jpg -still_life.jpg http://[server]/OD/Still%20Life.full.jpg -stillmoon_cavalier.jpg http://[server]/EVE/Stillmoon%20Cavalier.full.jpg -stinging_barrier.jpg http://[server]/MM/Stinging%20Barrier.full.jpg -stinging_licid.jpg http://[server]/TE/Stinging%20Licid.full.jpg -stingmoggie.jpg http://[server]/MOR/Stingmoggie.full.jpg -stingscourger.jpg http://[server]/PLC/Stingscourger.full.jpg -stinkdrinker_bandit.jpg http://[server]/MOR/Stinkdrinker%20Bandit.full.jpg -stinkdrinker_daredevil.jpg http://[server]/LRW/Stinkdrinker%20Daredevil.full.jpg -stinkweed_imp.jpg http://[server]/RAV/Stinkweed%20Imp.full.jpg -stir_the_grave.jpg http://[server]/BOK/Stir%20the%20Grave.full.jpg -stir_the_pride.jpg http://[server]/DS/Stir%20the%20Pride.full.jpg -stitch_in_time.jpg http://[server]/GP/Stitch%20in%20Time.full.jpg -stitch_together.jpg http://[server]/JU/Stitch%20Together.full.jpg -stoic_angel.jpg http://[server]/ALA/Stoic%20Angel.full.jpg -stoic_champion.jpg http://[server]/LE/Stoic%20Champion.full.jpg -stoic_ephemera.jpg http://[server]/DIS/Stoic%20Ephemera.full.jpg -stolen_grain.jpg http://[server]/P3/Stolen%20Grain.full.jpg -stomp_and_howl.jpg http://[server]/DIS/Stomp%20and%20Howl.full.jpg -stomping_ground.jpg http://[server]/GP/Stomping%20Ground.full.jpg -stomping_slabs.jpg http://[server]/MOR/Stomping%20Slabs.full.jpg -stone_calendar.jpg http://[server]/DK/Stone%20Calendar.full.jpg -stone_catapult.jpg http://[server]/P3/Stone%20Catapult.full.jpg -stone_cold_basilisk.jpg http://[server]/UNH/Stone-Cold%20Basilisk.full.jpg -stone_giant.jpg http://[server]/M10/Stone%20Giant.full.jpg -stone_kavu.jpg http://[server]/PS/Stone%20Kavu.full.jpg -stone_rain.jpg http://[server]/9E/Stone%20Rain.full.jpg -stone_seeder_hierophant.jpg http://[server]/RAV/Stone-Seeder%20Hierophant.full.jpg -stone_spirit.jpg http://[server]/5E/Stone%20Spirit.full.jpg -stone_throwing_devils.jpg http://[server]/AN/Stone-Throwing%20Devils1.full.jpg -stone_tongue_basilisk.jpg http://[server]/OD/Stone-Tongue%20Basilisk.full.jpg -stonebrow_krosan_hero.jpg http://[server]/TSP/Stonebrow,%20Krosan%20Hero.full.jpg -stonecloaker.jpg http://[server]/PLC/Stonecloaker.full.jpg -stonehands.jpg http://[server]/IA/Stonehands.full.jpg -stonehewer_giant.jpg http://[server]/MOR/Stonehewer%20Giant.full.jpg -stoneshaker_shaman.jpg http://[server]/RAV/Stoneshaker%20Shaman.full.jpg -stonewood_invocation.jpg http://[server]/TSP/Stonewood%20Invocation.full.jpg -stonewood_invoker.jpg http://[server]/LE/Stonewood%20Invoker.full.jpg -stonework_puma.jpg http://[server]/ZEN/Stonework%20Puma.full.jpg -stonybrook_angler.jpg http://[server]/LRW/Stonybrook%20Angler.full.jpg -stonybrook_banneret.jpg http://[server]/MOR/Stonybrook%20Banneret.full.jpg -stonybrook_schoolmaster.jpg http://[server]/MOR/Stonybrook%20Schoolmaster.full.jpg -stop_that.jpg http://[server]/UNH/Stop%20That.full.jpg -storage_matrix.jpg http://[server]/9E/Storage%20Matrix.full.jpg -storm_cauldron.jpg http://[server]/7E/Storm%20Cauldron.full.jpg -storm_crow.jpg http://[server]/9E/Storm%20Crow.full.jpg -storm_elemental.jpg http://[server]/AL/Storm%20Elemental.full.jpg -storm_entity.jpg http://[server]/FUT/Storm%20Entity.full.jpg -storm_front.jpg http://[server]/TE/Storm%20Front.full.jpg -storm_herd.jpg http://[server]/GP/Storm%20Herd.full.jpg -storm_seeker.jpg http://[server]/LG/Storm%20Seeker.full.jpg -storm_shaman.jpg http://[server]/7E/Storm%20Shaman.full.jpg -storm_spirit.jpg http://[server]/IA/Storm%20Spirit.full.jpg -storm_world.jpg http://[server]/LG/Storm%20World.full.jpg -stormbind.jpg http://[server]/IA/Stormbind.full.jpg -stormcallers_boon.jpg http://[server]/ARB/Stormcaller's%20Boon.full.jpg -stormcloud_djinn.jpg http://[server]/TSP/Stormcloud%20Djinn.full.jpg -stormfront_pegasus.jpg http://[server]/M10/Stormfront%20Pegasus.full.jpg -stormfront_riders.jpg http://[server]/PLC/Stormfront%20Riders.full.jpg -stormscale_anarch.jpg http://[server]/DIS/Stormscale%20Anarch.full.jpg -stormscape_apprentice.jpg http://[server]/IN/Stormscape%20Apprentice.full.jpg -stormscape_battlemage.jpg http://[server]/PS/Stormscape%20Battlemage.full.jpg -stormscape_familiar.jpg http://[server]/PS/Stormscape%20Familiar.full.jpg -stormscape_master.jpg http://[server]/IN/Stormscape%20Master.full.jpg -stormwatch_eagle.jpg http://[server]/PY/Stormwatch%20Eagle.full.jpg -story_circle.jpg http://[server]/10E/Story%20Circle.full.jpg -strafe.jpg http://[server]/PS/Strafe.full.jpg -strands_of_night.jpg http://[server]/7E/Strands%20of%20Night.full.jpg -strands_of_undeath.jpg http://[server]/RAV/Strands%20of%20Undeath.full.jpg -strange_inversion.jpg http://[server]/CHK/Strange%20Inversion.full.jpg -strangling_soot.jpg http://[server]/TSP/Strangling%20Soot.full.jpg -stratadon.jpg http://[server]/PS/Stratadon.full.jpg -strategic_planning.jpg http://[server]/P3/Strategic%20Planning.full.jpg -strategy_schmategy.jpg http://[server]/UG/Strategy,%20Schmategy.full.jpg -stratozeppelid.jpg http://[server]/GP/Stratozeppelid.full.jpg -straw_golem.jpg http://[server]/WL/Straw%20Golem.full.jpg -straw_soldiers.jpg http://[server]/P3/Straw%20Soldiers.full.jpg -stream_hopper.jpg http://[server]/EVE/Stream%20Hopper.full.jpg -stream_of_acid.jpg http://[server]/ST/Stream%20of%20Acid.full.jpg -stream_of_consciousness.jpg http://[server]/BOK/Stream%20of%20Consciousness.full.jpg -stream_of_life.jpg http://[server]/9E/Stream%20of%20Life.full.jpg -stream_of_unconsciousness.jpg http://[server]/MOR/Stream%20of%20Unconsciousness.full.jpg -streambed_aquitects.jpg http://[server]/LRW/Streambed%20Aquitects.full.jpg -street_savvy.jpg http://[server]/DIS/Street%20Savvy.full.jpg -street_wraith.jpg http://[server]/FUT/Street%20Wraith.full.jpg -streetbreaker_wurm.jpg http://[server]/GP/Streetbreaker%20Wurm.full.jpg -strength_in_numbers.jpg http://[server]/TSP/Strength%20in%20Numbers.full.jpg -strength_of_cedars.jpg http://[server]/CHK/Strength%20of%20Cedars.full.jpg -strength_of_isolation.jpg http://[server]/TO/Strength%20of%20Isolation.full.jpg -strength_of_lunacy.jpg http://[server]/TO/Strength%20of%20Lunacy.full.jpg -strength_of_night.jpg http://[server]/AP/Strength%20of%20Night.full.jpg -strength_of_unity.jpg http://[server]/IN/Strength%20of%20Unity.full.jpg -strip_bare.jpg http://[server]/SHM/Strip%20Bare.full.jpg -strip_mine.jpg http://[server]/4E/Strip%20Mine.full.jpg -striped_bears.jpg http://[server]/WL/Striped%20Bears.full.jpg -stroke_of_genius.jpg http://[server]/US/Stroke%20of%20Genius.full.jpg -stromgald_cabal.jpg http://[server]/6E/Stromgald%20Cabal.full.jpg -stromgald_crusader.jpg http://[server]/CS/Stromgald%20Crusader.full.jpg -stromgald_spy.jpg http://[server]/AL/Stromgald%20Spy.full.jpg -strongarm_tactics.jpg http://[server]/ON/Strongarm%20Tactics.full.jpg -strongarm_thug.jpg http://[server]/MM/Strongarm%20Thug.full.jpg -stronghold_assassin.jpg http://[server]/7E/Stronghold%20Assassin.full.jpg -stronghold_biologist.jpg http://[server]/NE/Stronghold%20Biologist.full.jpg -stronghold_discipline.jpg http://[server]/10E/Stronghold%20Discipline.full.jpg -stronghold_gambit.jpg http://[server]/NE/Stronghold%20Gambit.full.jpg -stronghold_machinist.jpg http://[server]/NE/Stronghold%20Machinist.full.jpg -stronghold_overseer.jpg http://[server]/TSP/Stronghold%20Overseer.full.jpg -stronghold_rats.jpg http://[server]/FUT/Stronghold%20Rats.full.jpg -stronghold_taskmaster.jpg http://[server]/SH/Stronghold%20Taskmaster.full.jpg -stronghold_zeppelin.jpg http://[server]/NE/Stronghold%20Zeppelin.full.jpg -struggle_for_sanity.jpg http://[server]/CHK/Struggle%20for%20Sanity.full.jpg -student_of_elements.jpg http://[server]/CHK/Student%20of%20Elements.full.jpg -stuffy_doll.jpg http://[server]/TSP/Stuffy%20Doll.full.jpg -stun.jpg http://[server]/10E/Stun.full.jpg -stun_sniper.jpg http://[server]/ARB/Stun%20Sniper.full.jpg -stunted_growth.jpg http://[server]/IA/Stunted%20Growth.full.jpg -stupefying_touch.jpg http://[server]/TO/Stupefying%20Touch.full.jpg -stupor.jpg http://[server]/6E/Stupor.full.jpg -sturdy_hatchling.jpg http://[server]/EVE/Sturdy%20Hatchling.full.jpg -su_chi.jpg http://[server]/AQ/Su-Chi.full.jpg -subdue.jpg http://[server]/LG/Subdue.full.jpg -submerge.jpg http://[server]/NE/Submerge.full.jpg -subterranean_hangar.jpg http://[server]/MM/Subterranean%20Hangar.full.jpg -subterranean_shambler.jpg http://[server]/TSP/Subterranean%20Shambler.full.jpg -subterranean_spirit.jpg http://[server]/MI/Subterranean%20Spirit.full.jpg -subversion.jpg http://[server]/UL/Subversion.full.jpg -sudden_death.jpg http://[server]/TSP/Sudden%20Death.full.jpg -sudden_impact.jpg http://[server]/10E/Sudden%20Impact.full.jpg -sudden_shock.jpg http://[server]/REL/Sudden%20Shock.full.jpg -sudden_spoiling.jpg http://[server]/TSP/Sudden%20Spoiling.full.jpg -sudden_strength.jpg http://[server]/JU/Sudden%20Strength.full.jpg -suffocating_blast.jpg http://[server]/AP/Suffocating%20Blast.full.jpg -suffocation.jpg http://[server]/AL/Suffocation.full.jpg -suicidal_charge.jpg http://[server]/CFX/Suicidal%20Charge.full.jpg -sulam_djinn.jpg http://[server]/IN/Sulam%20Djinn.full.jpg -suleimans_legacy.jpg http://[server]/VI/Suleiman's%20Legacy.full.jpg -sulfur_elemental.jpg http://[server]/PLC/Sulfur%20Elemental.full.jpg -sulfur_vent.jpg http://[server]/IN/Sulfur%20Vent.full.jpg -sulfuric_vapors.jpg http://[server]/US/Sulfuric%20Vapors.full.jpg -sulfuric_vortex.jpg http://[server]/SC/Sulfuric%20Vortex.full.jpg -sulfurous_blast.jpg http://[server]/TSP/Sulfurous%20Blast.full.jpg -sulfurous_springs.jpg http://[server]/10E/Sulfurous%20Springs.full.jpg -summer_bloom.jpg http://[server]/9E/Summer%20Bloom.full.jpg -summon_the_school.jpg http://[server]/LRW/Summon%20the%20School.full.jpg -summoners_bane.jpg http://[server]/ZEN/Summoner's%20Bane.full.jpg -summoners_egg.jpg http://[server]/FD/Summoner's%20Egg.full.jpg -summoners_pact.jpg http://[server]/FUT/Summoner's%20Pact.full.jpg -summoning_station.jpg http://[server]/FD/Summoning%20Station.full.jpg -summoning_trap.jpg http://[server]/ZEN/Summoning%20Trap.full.jpg -sun_ce_young_conquerer.jpg http://[server]/P3/Sun%20Ce,%20Young%20Conquerer.full.jpg -sun_clasp.jpg http://[server]/VI/Sun%20Clasp.full.jpg -sun_droplet.jpg http://[server]/MR/Sun%20Droplet.full.jpg -sun_quan_lord_of_wu.jpg http://[server]/P3/Sun%20Quan,%20Lord%20of%20Wu.full.jpg -sunastian_falconer.jpg http://[server]/LG/Sunastian%20Falconer.full.jpg -sunbeam_spellbomb.jpg http://[server]/MR/Sunbeam%20Spellbomb.full.jpg -suncrusher.jpg http://[server]/FD/Suncrusher.full.jpg -sunder.jpg http://[server]/US/Sunder.full.jpg -sunder_from_within.jpg http://[server]/SOK/Sunder%20from%20Within.full.jpg -sundering_titan.jpg http://[server]/DS/Sundering%20Titan.full.jpg -sundering_vitae.jpg http://[server]/RAV/Sundering%20Vitae.full.jpg -sunfire_balm.jpg http://[server]/ON/Sunfire%20Balm.full.jpg -sunflare_shaman.jpg http://[server]/MOR/Sunflare%20Shaman.full.jpg -sunforger.jpg http://[server]/RAV/Sunforger.full.jpg -sunglasses_of_urza.jpg http://[server]/4E/Sunglasses%20of%20Urza.full.jpg -sungrass_egg.jpg http://[server]/OD/Sungrass%20Egg.full.jpg -sungrass_prairie.jpg http://[server]/OD/Sungrass%20Prairie.full.jpg -sunhome_enforcer.jpg http://[server]/RAV/Sunhome%20Enforcer.full.jpg -sunhome_fortress_of_the_legion.jpg http://[server]/HOP/Sunhome,%20Fortress%20of%20the%20Legion.full.jpg -sunken_city.jpg http://[server]/4E/Sunken%20City.full.jpg -sunken_field.jpg http://[server]/PY/Sunken%20Field.full.jpg -sunken_hope.jpg http://[server]/10E/Sunken%20Hope.full.jpg -sunken_ruins.jpg http://[server]/SHM/Sunken%20Ruins.full.jpg -sunlance.jpg http://[server]/PLC/Sunlance.full.jpg -sunpetal_grove.jpg http://[server]/M10/Sunpetal%20Grove.full.jpg -sunrise_sovereign.jpg http://[server]/LRW/Sunrise%20Sovereign.full.jpg -suns_bounty.jpg http://[server]/CS/Sun's%20Bounty.full.jpg -sunscape_apprentice.jpg http://[server]/IN/Sunscape%20Apprentice.full.jpg -sunscape_battlemage.jpg http://[server]/PS/Sunscape%20Battlemage.full.jpg -sunscape_familiar.jpg http://[server]/PS/Sunscape%20Familiar.full.jpg -sunscape_master.jpg http://[server]/IN/Sunscape%20Master.full.jpg -sunscour.jpg http://[server]/CS/Sunscour.full.jpg -sunseed_nurturer.jpg http://[server]/ALA/Sunseed%20Nurturer.full.jpg -sunspring_expedition.jpg http://[server]/ZEN/Sunspring%20Expedition.full.jpg -sunstone.jpg http://[server]/IA/Sunstone.full.jpg -sunstrike_legionnaire.jpg http://[server]/LE/Sunstrike%20Legionnaire.full.jpg -suntail_hawk.jpg http://[server]/10E/Suntail%20Hawk.full.jpg -suntouched_myr.jpg http://[server]/FD/Suntouched%20Myr.full.jpg -sunweb.jpg http://[server]/8E/Sunweb.full.jpg -super_secret_tech.jpg http://[server]/UNH/Super%20Secret%20Tech.full.jpg -superior_numbers.jpg http://[server]/MI/Superior%20Numbers.full.jpg -supersize.jpg http://[server]/UNH/Supersize.full.jpg -supplydemand.jpg http://[server]/DIS/SupplyDemand.full.jpg -suppress.jpg http://[server]/AP/Suppress.full.jpg -suppression_field.jpg http://[server]/RAV/Suppression%20Field.full.jpg -supreme_exemplar.jpg http://[server]/MOR/Supreme%20Exemplar.full.jpg -supreme_inquisitor.jpg http://[server]/ON/Supreme%20Inquisitor.full.jpg -suqata_assassin.jpg http://[server]/VI/Suq'Ata%20Assassin.full.jpg -suqata_firewalker.jpg http://[server]/MI/Suq'Ata%20Firewalker.full.jpg -suqata_lancer.jpg http://[server]/VI/Suq'Ata%20Lancer.full.jpg -surestrike_trident.jpg http://[server]/DS/Surestrike%20Trident.full.jpg -surge_of_strength.jpg http://[server]/AL/Surge%20of%20Strength.full.jpg -surge_of_thoughtweft.jpg http://[server]/LRW/Surge%20of%20Thoughtweft.full.jpg -surge_of_zeal.jpg http://[server]/RAV/Surge%20of%20Zeal.full.jpg -surgespanner.jpg http://[server]/LRW/Surgespanner.full.jpg -surging_aether.jpg http://[server]/CS/Surging%20Aether.full.jpg -surging_dementia.jpg http://[server]/CS/Surging%20Dementia.full.jpg -surging_flame.jpg http://[server]/CS/Surging%20Flame.full.jpg -surging_might.jpg http://[server]/CS/Surging%20Might.full.jpg -surging_sentinels.jpg http://[server]/CS/Surging%20Sentinels.full.jpg -surprise_deployment.jpg http://[server]/PS/Surprise%20Deployment.full.jpg -surrakar_marauder.jpg http://[server]/ZEN/Surrakar%20Marauder.full.jpg -surveilling_sprite.jpg http://[server]/RAV/Surveilling%20Sprite.full.jpg -survival_of_the_fittest.jpg http://[server]/EX/Survival%20of%20the%20Fittest.full.jpg -survivor_of_the_unseen.jpg http://[server]/CS/Survivor%20of%20the%20Unseen.full.jpg -sustainer_of_the_realm.jpg http://[server]/7E/Sustainer%20of%20the%20Realm.full.jpg -sustaining_spirit.jpg http://[server]/AL/Sustaining%20Spirit.full.jpg -sustenance.jpg http://[server]/MM/Sustenance.full.jpg -suture_spirit.jpg http://[server]/EVE/Suture%20Spirit.full.jpg -sutured_ghoul.jpg http://[server]/JU/Sutured%20Ghoul.full.jpg -svogthos_the_restless_tomb.jpg http://[server]/RAV/Svogthos,%20the%20Restless%20Tomb.full.jpg -svyelunite_priest.jpg http://[server]/FE/Svyelunite%20Priest.full.jpg -svyelunite_temple.jpg http://[server]/6E/Svyelunite%20Temple.full.jpg -swallowing_plague.jpg http://[server]/CHK/Swallowing%20Plague.full.jpg -swamp_mosquito.jpg http://[server]/TSB/Swamp%20Mosquito.full.jpg -swans_of_bryn_argoll.jpg http://[server]/SHM/Swans%20of%20Bryn%20Argoll.full.jpg -swarm_of_rats.jpg http://[server]/9E/Swarm%20of%20Rats.full.jpg -swarmyard.jpg http://[server]/TSP/Swarmyard.full.jpg -swat.jpg http://[server]/UL/Swat.full.jpg -sway_of_illusion.jpg http://[server]/IN/Sway%20of%20Illusion.full.jpg -sway_of_the_stars.jpg http://[server]/BOK/Sway%20of%20the%20Stars.full.jpg -swell_of_courage.jpg http://[server]/MOR/Swell%20of%20Courage.full.jpg -swelter.jpg http://[server]/JU/Swelter.full.jpg -swerve.jpg http://[server]/ALA/Swerve.full.jpg -swift_maneuver.jpg http://[server]/CS/Swift%20Maneuver.full.jpg -swift_silence.jpg http://[server]/DIS/Swift%20Silence.full.jpg -swirl_the_mists.jpg http://[server]/CHK/Swirl%20the%20Mists.full.jpg -swirling_sandstorm.jpg http://[server]/JU/Swirling%20Sandstorm.full.jpg -swirling_spriggan.jpg http://[server]/EVE/Swirling%20Spriggan.full.jpg -swooping_talon.jpg http://[server]/LE/Swooping%20Talon.full.jpg -sword_dancer.jpg http://[server]/8E/Sword%20Dancer.full.jpg -sword_of_fire_and_ice.jpg http://[server]/DS/Sword%20of%20Fire%20and%20Ice.full.jpg -sword_of_kaldra.jpg http://[server]/MR/Sword%20of%20Kaldra.full.jpg -sword_of_light_and_shadow.jpg http://[server]/DS/Sword%20of%20Light%20and%20Shadow.full.jpg -sword_of_the_ages.jpg http://[server]/LG/Sword%20of%20the%20Ages.full.jpg -sword_of_the_chosen.jpg http://[server]/SH/Sword%20of%20the%20Chosen.full.jpg -sword_of_the_meek.jpg http://[server]/FUT/Sword%20of%20the%20Meek.full.jpg -sword_of_the_paruns.jpg http://[server]/GP/Sword%20of%20the%20Paruns.full.jpg -swords_to_plowshares.jpg http://[server]/4E/Swords%20to%20Plowshares.full.jpg -sworn_defender.jpg http://[server]/AL/Sworn%20Defender.full.jpg -sygg_river_cutthroat.jpg http://[server]/SHM/Sygg,%20River%20Cutthroat.full.jpg -sygg_river_guide.jpg http://[server]/LRW/Sygg,%20River%20Guide.full.jpg -sylvan_basilisk.jpg http://[server]/10E/Sylvan%20Basilisk.full.jpg -sylvan_bounty.jpg http://[server]/CFX/Sylvan%20Bounty.full.jpg -sylvan_echoes.jpg http://[server]/LRW/Sylvan%20Echoes.full.jpg -sylvan_hierophant.jpg http://[server]/WL/Sylvan%20Hierophant.full.jpg -sylvan_library.jpg http://[server]/5E/Sylvan%20Library.full.jpg -sylvan_messenger.jpg http://[server]/AP/Sylvan%20Messenger.full.jpg -sylvan_might.jpg http://[server]/OD/Sylvan%20Might.full.jpg -sylvan_paradise.jpg http://[server]/LG/Sylvan%20Paradise.full.jpg -sylvan_safekeeper.jpg http://[server]/JU/Sylvan%20Safekeeper.full.jpg -sylvan_scrying.jpg http://[server]/10E/Sylvan%20Scrying.full.jpg -sylvan_tutor.jpg http://[server]/PT/Sylvan%20Tutor.full.jpg -sylvan_yeti.jpg http://[server]/ST/Sylvan%20Yeti.full.jpg -sylvok_explorer.jpg http://[server]/FD/Sylvok%20Explorer.full.jpg -symbiosis.jpg http://[server]/US/Symbiosis.full.jpg -symbiotic_beast.jpg http://[server]/ON/Symbiotic%20Beast.full.jpg -symbiotic_deployment.jpg http://[server]/AP/Symbiotic%20Deployment.full.jpg -symbiotic_elf.jpg http://[server]/ON/Symbiotic%20Elf.full.jpg -symbiotic_wurm.jpg http://[server]/ON/Symbiotic%20Wurm.full.jpg -symbol_of_unsummoning.jpg http://[server]/PT/Symbol%20of%20Unsummoning.full.jpg -symbol_status.jpg http://[server]/UNH/Symbol%20Status.full.jpg -synapse_sliver.jpg http://[server]/LE/Synapse%20Sliver.full.jpg -synchronous_sliver.jpg http://[server]/PLC/Synchronous%20Sliver.full.jpg -syncopate.jpg http://[server]/OD/Syncopate.full.jpg -synod_artificer.jpg http://[server]/DS/Synod%20Artificer.full.jpg -synod_centurion.jpg http://[server]/FD/Synod%20Centurion.full.jpg -synod_sanctum.jpg http://[server]/MR/Synod%20Sanctum.full.jpg -syphon_life.jpg http://[server]/EVE/Syphon%20Life.full.jpg -syphon_mind.jpg http://[server]/ON/Syphon%20Mind.full.jpg -syphon_soul.jpg http://[server]/LG/Syphon%20Soul.full.jpg -szadek_lord_of_secrets.jpg http://[server]/RAV/Szadek,%20Lord%20of%20Secrets.full.jpg \ No newline at end of file diff --git a/res/pics_link/card-pictures_t.txt b/res/pics_link/card-pictures_t.txt deleted file mode 100644 index a779b5ec8b3..00000000000 --- a/res/pics_link/card-pictures_t.txt +++ /dev/null @@ -1,632 +0,0 @@ -tablet_of_epityr.jpg http://[server]/AQ/Tablet%20of%20Epityr.full.jpg -tahngarth.jpg http://[server]/VG/Tahngarth.full.jpg -tahngarth_talruum_hero.jpg http://[server]/PS/Tahngarth,%20Talruum%20Hero.full.jpg -tahngarths_glare.jpg http://[server]/AP/Tahngarth's%20Glare.full.jpg -tahngarths_rage.jpg http://[server]/TE/Tahngarth's%20Rage.full.jpg -taiga.jpg http://[server]/U/Taiga.full.jpg -tainted_aether.jpg http://[server]/7E/Tainted%20Aether.full.jpg -tainted_field.jpg http://[server]/TO/Tainted%20Field.full.jpg -tainted_isle.jpg http://[server]/TO/Tainted%20Isle.full.jpg -tainted_monkey.jpg http://[server]/UNH/Tainted%20Monkey.full.jpg -tainted_pact.jpg http://[server]/OD/Tainted%20Pact.full.jpg -tainted_peak.jpg http://[server]/TO/Tainted%20Peak.full.jpg -tainted_sigil.jpg http://[server]/ARB/Tainted%20Sigil.full.jpg -tainted_specter.jpg http://[server]/MI/Tainted%20Specter.full.jpg -tainted_well.jpg http://[server]/IN/Tainted%20Well.full.jpg -tainted_wood.jpg http://[server]/TO/Tainted%20Wood.full.jpg -taj_nar_swordsmith.jpg http://[server]/MR/Taj-Nar%20Swordsmith.full.jpg -tajuru_archer.jpg http://[server]/ZEN/Tajuru%20Archer.full.jpg -takara.jpg http://[server]/VG/Takara.full.jpg -take_possession.jpg http://[server]/FUT/Take%20Possession.full.jpg -takeno_samurai_general.jpg http://[server]/CHK/Takeno,%20Samurai%20General.full.jpg -takenos_cavalry.jpg http://[server]/BOK/Takeno's%20Cavalry.full.jpg -takenuma_bleeder.jpg http://[server]/BOK/Takenuma%20Bleeder.full.jpg -takklemaggot.jpg http://[server]/LG/Takklemaggot.full.jpg -talaras_bane.jpg http://[server]/EVE/Talara's%20Bane.full.jpg -talaras_battalion.jpg http://[server]/EVE/Talara's%20Battalion.full.jpg -talas_air_ship.jpg http://[server]/P2/Talas%20Air%20Ship.full.jpg -talas_explorer.jpg http://[server]/P2/Talas%20Explorer.full.jpg -talas_merchant.jpg http://[server]/P2/Talas%20Merchant.full.jpg -talas_researcher.jpg http://[server]/P2/Talas%20Researcher.full.jpg -talas_scout.jpg http://[server]/P2/Talas%20Scout.full.jpg -talas_warrior.jpg http://[server]/P2/Talas%20Warrior.full.jpg -talisman_of_dominance.jpg http://[server]/MR/Talisman%20of%20Dominance.full.jpg -talisman_of_impulse.jpg http://[server]/MR/Talisman%20of%20Impulse.full.jpg -talisman_of_indulgence.jpg http://[server]/MR/Talisman%20of%20Indulgence.full.jpg -talisman_of_progress.jpg http://[server]/MR/Talisman%20of%20Progress.full.jpg -talisman_of_unity.jpg http://[server]/MR/Talisman%20of%20Unity.full.jpg -tallowisp.jpg http://[server]/BOK/Tallowisp.full.jpg -talon_of_pain.jpg http://[server]/DS/Talon%20of%20Pain.full.jpg -talon_sliver.jpg http://[server]/TE/Talon%20Sliver.full.jpg -talon_trooper.jpg http://[server]/ARB/Talon%20Trooper.full.jpg -talonrend.jpg http://[server]/EVE/Talonrend.full.jpg -talruum_champion.jpg http://[server]/VI/Talruum%20Champion.full.jpg -talruum_minotaur.jpg http://[server]/6E/Talruum%20Minotaur.full.jpg -talruum_piper.jpg http://[server]/VI/Talruum%20Piper.full.jpg -tamanoa.jpg http://[server]/CS/Tamanoa.full.jpg -tangle.jpg http://[server]/IN/Tangle.full.jpg -tangle_asp.jpg http://[server]/FD/Tangle%20Asp.full.jpg -tangle_golem.jpg http://[server]/DS/Tangle%20Golem.full.jpg -tangle_kelp.jpg http://[server]/DK/Tangle%20Kelp.full.jpg -tangle_spider.jpg http://[server]/10E/Tangle%20Spider.full.jpg -tangle_wire.jpg http://[server]/NE/Tangle%20Wire.full.jpg -tanglebloom.jpg http://[server]/9E/Tanglebloom.full.jpg -tangleroot.jpg http://[server]/MR/Tangleroot.full.jpg -tanglesap.jpg http://[server]/ZEN/Tanglesap.full.jpg -tanglewalker.jpg http://[server]/DS/Tanglewalker.full.jpg -taniwha.jpg http://[server]/MI/Taniwha.full.jpg -taoist_hermit.jpg http://[server]/P3/Taoist%20Hermit.full.jpg -taoist_mystic.jpg http://[server]/P3/Taoist%20Mystic.full.jpg -tar_fiend.jpg http://[server]/ALA/Tar%20Fiend.full.jpg -tar_pit_warrior.jpg http://[server]/VI/Tar%20Pit%20Warrior.full.jpg -tar_pitcher.jpg http://[server]/EVG/Tar%20Pitcher.full.jpg -tarfire.jpg http://[server]/EVG/Tarfire.full.jpg -tariff.jpg http://[server]/6E/Tariff.full.jpg -tarmogoyf.jpg http://[server]/FUT/Tarmogoyf.full.jpg -tarnished_citadel.jpg http://[server]/OD/Tarnished%20Citadel.full.jpg -tarox_bladewing.jpg http://[server]/FUT/Tarox%20Bladewing.full.jpg -tarpan.jpg http://[server]/5E/Tarpan.full.jpg -task_force.jpg http://[server]/MM/Task%20Force.full.jpg -task_mage_assembly.jpg http://[server]/PY/Task%20Mage%20Assembly.full.jpg -taste_for_mayhem.jpg http://[server]/DIS/Taste%20for%20Mayhem.full.jpg -taste_of_paradise.jpg http://[server]/AL/Taste%20of%20Paradise1.full.jpg -tatsumasa_the_dragons_fang.jpg http://[server]/CHK/Tatsumasa,%20the%20Dragon's%20Fang.full.jpg -tattered_drake.jpg http://[server]/RAV/Tattered%20Drake.full.jpg -tatterkite.jpg http://[server]/SHM/Tatterkite.full.jpg -tattermunge_duo.jpg http://[server]/SHM/Tattermunge%20Duo.full.jpg -tattermunge_maniac.jpg http://[server]/SHM/Tattermunge%20Maniac.full.jpg -tattermunge_witch.jpg http://[server]/SHM/Tattermunge%20Witch.full.jpg -tattoo_ward.jpg http://[server]/OD/Tattoo%20Ward.full.jpg -taunt.jpg http://[server]/PT/Taunt.full.jpg -taunting_challenge.jpg http://[server]/P3/Taunting%20Challenge.full.jpg -taunting_elf.jpg http://[server]/ON/Taunting%20Elf.full.jpg -taurean_mauler.jpg http://[server]/HOP/Taurean%20Mauler.full.jpg -tawnos.jpg http://[server]/VG/Tawnos.full.jpg -tawnoss_coffin.jpg http://[server]/AQ/Tawnos's%20Coffin.full.jpg -tawnoss_wand.jpg http://[server]/4E/Tawnos's%20Wand.full.jpg -tawnoss_weaponry.jpg http://[server]/5E/Tawnos's%20Weaponry.full.jpg -team_spirit.jpg http://[server]/UG/Team%20Spirit.full.jpg -teardrop_kami.jpg http://[server]/BOK/Teardrop%20Kami.full.jpg -tears_of_rage.jpg http://[server]/DS/Tears%20of%20Rage.full.jpg -tectonic_break.jpg http://[server]/MM/Tectonic%20Break.full.jpg -tectonic_fiend.jpg http://[server]/TSP/Tectonic%20Fiend.full.jpg -tectonic_instability.jpg http://[server]/IN/Tectonic%20Instability.full.jpg -teekas_dragon.jpg http://[server]/MI/Teeka's%20Dragon.full.jpg -teetering_peaks.jpg http://[server]/ZEN/Teetering%20Peaks.full.jpg -teferi_mage_of_zhalfir.jpg http://[server]/TSP/Teferi,%20Mage%20of%20Zhalfir.full.jpg -teferis_care.jpg http://[server]/IN/Teferi's%20Care.full.jpg -teferis_curse.jpg http://[server]/MI/Teferi's%20Curse.full.jpg -teferis_drake.jpg http://[server]/MI/Teferi's%20Drake.full.jpg -teferis_honor_guard.jpg http://[server]/VI/Teferi's%20Honor%20Guard.full.jpg -teferis_imp.jpg http://[server]/MI/Teferi's%20Imp.full.jpg -teferis_isle.jpg http://[server]/MI/Teferi's%20Isle.full.jpg -teferis_moat.jpg http://[server]/IN/Teferi's%20Moat.full.jpg -teferis_puzzle_box.jpg http://[server]/9E/Teferi's%20Puzzle%20Box.full.jpg -teferis_realm.jpg http://[server]/VI/Teferi's%20Realm.full.jpg -teferis_response.jpg http://[server]/IN/Teferi's%20Response.full.jpg -teferis_veil.jpg http://[server]/WL/Teferi's%20Veil.full.jpg -tek.jpg http://[server]/IN/Tek.full.jpg -tel_jilad_archers.jpg http://[server]/MR/Tel-Jilad%20Archers.full.jpg -tel_jilad_chosen.jpg http://[server]/MR/Tel-Jilad%20Chosen.full.jpg -tel_jilad_exile.jpg http://[server]/MR/Tel-Jilad%20Exile.full.jpg -tel_jilad_justice.jpg http://[server]/FD/Tel-Jilad%20Justice.full.jpg -tel_jilad_lifebreather.jpg http://[server]/FD/Tel-Jilad%20Lifebreather.full.jpg -tel_jilad_outrider.jpg http://[server]/DS/Tel-Jilad%20Outrider.full.jpg -tel_jilad_stylus.jpg http://[server]/MR/Tel-Jilad%20Stylus.full.jpg -tel_jilad_wolf.jpg http://[server]/DS/Tel-Jilad%20Wolf.full.jpg -telekinesis.jpg http://[server]/LG/Telekinesis.full.jpg -telekinetic_bonds.jpg http://[server]/JU/Telekinetic%20Bonds.full.jpg -telekinetic_sliver.jpg http://[server]/TSP/Telekinetic%20Sliver.full.jpg -telemin_performance.jpg http://[server]/CFX/Telemin%20Performance.full.jpg -telepathic_spies.jpg http://[server]/7E/Telepathic%20Spies.full.jpg -telepathy.jpg http://[server]/M10/Telepathy.full.jpg -teleport.jpg http://[server]/LG/Teleport.full.jpg -telethopter.jpg http://[server]/TE/Telethopter.full.jpg -telimtor.jpg http://[server]/MI/Telim'Tor.full.jpg -telimtors_darts.jpg http://[server]/MI/Telim'Tor's%20Darts.full.jpg -telimtors_edict.jpg http://[server]/MI/Telim'Tor's%20Edict.full.jpg -teller_of_tales.jpg http://[server]/CHK/Teller%20of%20Tales.full.jpg -telling_time.jpg http://[server]/10E/Telling%20Time.full.jpg -temp_of_the_damned.jpg http://[server]/UG/Temp%20of%20the%20Damned.full.jpg -temper.jpg http://[server]/SH/Temper.full.jpg -tempest_drake.jpg http://[server]/VI/Tempest%20Drake.full.jpg -tempest_efreet.jpg http://[server]/4E/Tempest%20Efreet.full.jpg -tempest_of_light.jpg http://[server]/M10/Tempest%20of%20Light.full.jpg -tempest_owl.jpg http://[server]/ZEN/Tempest%20Owl.full.jpg -temple_acolyte.jpg http://[server]/P2/Temple%20Acolyte.full.jpg -temple_elder.jpg http://[server]/P2/Temple%20Elder.full.jpg -temple_garden.jpg http://[server]/RAV/Temple%20Garden.full.jpg -temple_of_the_false_god.jpg http://[server]/SC/Temple%20of%20the%20False%20God.full.jpg -temporal_adept.jpg http://[server]/9E/Temporal%20Adept.full.jpg -temporal_aperture.jpg http://[server]/US/Temporal%20Aperture.full.jpg -temporal_cascade.jpg http://[server]/MR/Temporal%20Cascade.full.jpg -temporal_distortion.jpg http://[server]/IN/Temporal%20Distortion.full.jpg -temporal_eddy.jpg http://[server]/TSP/Temporal%20Eddy.full.jpg -temporal_extortion.jpg http://[server]/PLC/Temporal%20Extortion.full.jpg -temporal_fissure.jpg http://[server]/SC/Temporal%20Fissure.full.jpg -temporal_isolation.jpg http://[server]/TSP/Temporal%20Isolation.full.jpg -temporal_manipulation.jpg http://[server]/P2/Temporal%20Manipulation.full.jpg -temporal_spring.jpg http://[server]/AP/Temporal%20Spring.full.jpg -temporary_insanity.jpg http://[server]/TO/Temporary%20Insanity.full.jpg -temporary_truce.jpg http://[server]/PT/Temporary%20Truce.full.jpg -tempting_licid.jpg http://[server]/SH/Tempting%20Licid.full.jpg -tempting_wurm.jpg http://[server]/ON/Tempting%20Wurm.full.jpg -tendo_ice_bridge.jpg http://[server]/BOK/Tendo%20Ice%20Bridge.full.jpg -tendrils_of_agony.jpg http://[server]/SC/Tendrils%20of%20Agony.full.jpg -tendrils_of_corruption.jpg http://[server]/M10/Tendrils%20of%20Corruption.full.jpg -tendrils_of_despair.jpg http://[server]/WL/Tendrils%20of%20Despair.full.jpg -teneb_the_harvester.jpg http://[server]/PLC/Teneb,%20the%20Harvester.full.jpg -tenza_godos_maul.jpg http://[server]/CHK/Tenza,%20Godo's%20Maul.full.jpg -tephraderm.jpg http://[server]/ON/Tephraderm.full.jpg -terashis_cry.jpg http://[server]/CHK/Terashi's%20Cry.full.jpg -terashis_grasp.jpg http://[server]/BOK/Terashi's%20Grasp.full.jpg -terashis_verdict.jpg http://[server]/BOK/Terashi's%20Verdict.full.jpg -teremko_griffin.jpg http://[server]/MI/Teremko%20Griffin.full.jpg -terminal_moraine.jpg http://[server]/PS/Terminal%20Moraine.full.jpg -terminate.jpg http://[server]/PS/Terminate.full.jpg -terohs_faithful.jpg http://[server]/TO/Teroh's%20Faithful.full.jpg -terohs_vanguard.jpg http://[server]/TO/Teroh's%20Vanguard.full.jpg -terra_stomper.jpg http://[server]/ZEN/Terra%20Stomper.full.jpg -terraformer.jpg http://[server]/RAV/Terraformer.full.jpg -terrain_generator.jpg http://[server]/NE/Terrain%20Generator.full.jpg -terramorphic_expanse.jpg http://[server]/M10/Terramorphic%20Expanse.full.jpg -terrarion.jpg http://[server]/RAV/Terrarion.full.jpg -terravore.jpg http://[server]/OD/Terravore.full.jpg -territorial_baloth.jpg http://[server]/ZEN/Territorial%20Baloth.full.jpg -territorial_dispute.jpg http://[server]/MM/Territorial%20Dispute.full.jpg -terror.jpg http://[server]/10E/Terror.full.jpg -test_of_endurance.jpg http://[server]/JU/Test%20of%20Endurance.full.jpg -test_of_faith.jpg http://[server]/DS/Test%20of%20Faith.full.jpg -testament_of_faith.jpg http://[server]/OD/Testament%20of%20Faith.full.jpg -tethered_griffin.jpg http://[server]/UD/Tethered%20Griffin.full.jpg -tethered_skirge.jpg http://[server]/UL/Tethered%20Skirge.full.jpg -tetravus.jpg http://[server]/4E/Tetravus.full.jpg -tetsuo_umezawa.jpg http://[server]/LG/Tetsuo%20Umezawa.full.jpg -teysa_orzhov_scion.jpg http://[server]/GP/Teysa,%20Orzhov%20Scion.full.jpg -tezzeret_the_seeker.jpg http://[server]/ALA/Tezzeret%20the%20Seeker.full.jpg -thalakos_deceiver.jpg http://[server]/SH/Thalakos%20Deceiver.full.jpg -thalakos_dreamsower.jpg http://[server]/TE/Thalakos%20Dreamsower.full.jpg -thalakos_drifters.jpg http://[server]/EX/Thalakos%20Drifters.full.jpg -thalakos_lowlands.jpg http://[server]/TE/Thalakos%20Lowlands.full.jpg -thalakos_mistfolk.jpg http://[server]/TE/Thalakos%20Mistfolk.full.jpg -thalakos_scout.jpg http://[server]/EX/Thalakos%20Scout.full.jpg -thalakos_seer.jpg http://[server]/TE/Thalakos%20Seer.full.jpg -thalakos_sentry.jpg http://[server]/TE/Thalakos%20Sentry.full.jpg -thallid.jpg http://[server]/TSB/Thallid.full.jpg -thallid_devourer.jpg http://[server]/FE/Thallid%20Devourer.full.jpg -thallid_germinator.jpg http://[server]/TSP/Thallid%20Germinator.full.jpg -thallid_shell_dweller.jpg http://[server]/TSP/Thallid%20Shell-Dweller.full.jpg -that_which_was_taken.jpg http://[server]/BOK/That%20Which%20Was%20Taken.full.jpg -thaumatog.jpg http://[server]/OD/Thaumatog.full.jpg -thawing_glaciers.jpg http://[server]/AL/Thawing%20Glaciers.full.jpg -the_abyss.jpg http://[server]/LG/The%20Abyss.full.jpg -the_brute.jpg http://[server]/5E/The%20Brute.full.jpg -the_cheese_stands_alone.jpg http://[server]/UG/The%20Cheese%20Stands%20Alone.full.jpg -the_fallen.jpg http://[server]/CH/The%20Fallen.full.jpg -the_fallen_apart.jpg http://[server]/UNH/The%20Fallen%20Apart.full.jpg -the_hive.jpg http://[server]/10E/The%20Hive.full.jpg -the_lady_of_the_mountain.jpg http://[server]/LG/The%20Lady%20of%20the%20Mountain.full.jpg -the_rack.jpg http://[server]/4E/The%20Rack.full.jpg -the_tabernacle_at_pendrell_vale.jpg http://[server]/LG/The%20Tabernacle%20at%20Pendrell%20Vale.full.jpg -the_ultimate_nightmare_of_wizards_of_the_coast®_customer_service.jpg http://[server]/UG/The%20Ultimate%20Nightmare%20of%20Wizards%20of%20the%20Coast®%20Customer%20Service.full.jpg -the_unspeakable.jpg http://[server]/CHK/The%20Unspeakable.full.jpg -the_wretched.jpg http://[server]/5E/The%20Wretched.full.jpg -theft_of_dreams.jpg http://[server]/PT/Theft%20of%20Dreams.full.jpg -thelon_of_havenwood.jpg http://[server]/TSP/Thelon%20of%20Havenwood.full.jpg -thelonite_druid.jpg http://[server]/FE/Thelonite%20Druid.full.jpg -thelonite_hermit.jpg http://[server]/TSP/Thelonite%20Hermit.full.jpg -thelonite_monk.jpg http://[server]/FE/Thelonite%20Monk.full.jpg -thelons_chant.jpg http://[server]/FE/Thelon's%20Chant.full.jpg -thelons_curse.jpg http://[server]/FE/Thelon's%20Curse.full.jpg -thermal_blast.jpg http://[server]/OD/Thermal%20Blast.full.jpg -thermal_flux.jpg http://[server]/CS/Thermal%20Flux.full.jpg -thermal_glider.jpg http://[server]/MM/Thermal%20Glider.full.jpg -thermal_navigator.jpg http://[server]/FD/Thermal%20Navigator.full.jpg -thermokarst.jpg http://[server]/IA/Thermokarst.full.jpg -thermopod.jpg http://[server]/CS/Thermopod.full.jpg -thick_skinned_goblin.jpg http://[server]/TSP/Thick-Skinned%20Goblin.full.jpg -thicket_basilisk.jpg http://[server]/6E/Thicket%20Basilisk.full.jpg -thicket_elemental.jpg http://[server]/IN/Thicket%20Elemental.full.jpg -thief_of_hope.jpg http://[server]/CHK/Thief%20of%20Hope.full.jpg -thieves_auction.jpg http://[server]/8E/Thieves'%20Auction.full.jpg -thieves_fortune.jpg http://[server]/MOR/Thieves'%20Fortune.full.jpg -thieving_magpie.jpg http://[server]/10E/Thieving%20Magpie.full.jpg -thieving_sprite.jpg http://[server]/LRW/Thieving%20Sprite.full.jpg -thing_from_the_deep.jpg http://[server]/PT/Thing%20from%20the%20Deep.full.jpg -think_tank.jpg http://[server]/OD/Think%20Tank.full.jpg -think_twice.jpg http://[server]/TSP/Think%20Twice.full.jpg -thirst.jpg http://[server]/MI/Thirst.full.jpg -thirst_for_knowledge.jpg http://[server]/MR/Thirst%20for%20Knowledge.full.jpg -thistledown_duo.jpg http://[server]/SHM/Thistledown%20Duo.full.jpg -thistledown_liege.jpg http://[server]/SHM/Thistledown%20Liege.full.jpg -thopter_foundry.jpg http://[server]/ARB/Thopter%20Foundry.full.jpg -thopter_squadron.jpg http://[server]/EX/Thopter%20Squadron.full.jpg -thorn_elemental.jpg http://[server]/8E/Thorn%20Elemental.full.jpg -thorn_of_amethyst.jpg http://[server]/LRW/Thorn%20of%20Amethyst.full.jpg -thorn_thallid.jpg http://[server]/FE/Thorn%20Thallid1.full.jpg -thorn_thrash_viashino.jpg http://[server]/ALA/Thorn-Thrash%20Viashino.full.jpg -thornbite_staff.jpg http://[server]/MOR/Thornbite%20Staff.full.jpg -thornling.jpg http://[server]/CFX/Thornling.full.jpg -thornscape_apprentice.jpg http://[server]/IN/Thornscape%20Apprentice.full.jpg -thornscape_battlemage.jpg http://[server]/PS/Thornscape%20Battlemage.full.jpg -thornscape_familiar.jpg http://[server]/PS/Thornscape%20Familiar.full.jpg -thornscape_master.jpg http://[server]/IN/Thornscape%20Master.full.jpg -thorntooth_witch.jpg http://[server]/LRW/Thorntooth%20Witch.full.jpg -thornwatch_scarecrow.jpg http://[server]/SHM/Thornwatch%20Scarecrow.full.jpg -thornweald_archer.jpg http://[server]/FUT/Thornweald%20Archer.full.jpg -thornwind_faeries.jpg http://[server]/UL/Thornwind%20Faeries.full.jpg -thought_courier.jpg http://[server]/9E/Thought%20Courier.full.jpg -thought_devourer.jpg http://[server]/OD/Thought%20Devourer.full.jpg -thought_dissector.jpg http://[server]/DS/Thought%20Dissector.full.jpg -thought_eater.jpg http://[server]/OD/Thought%20Eater.full.jpg -thought_hemorrhage.jpg http://[server]/ARB/Thought%20Hemorrhage.full.jpg -thought_lash.jpg http://[server]/AL/Thought%20Lash.full.jpg -thought_nibbler.jpg http://[server]/OD/Thought%20Nibbler.full.jpg -thought_prison.jpg http://[server]/MR/Thought%20Prison.full.jpg -thought_reflection.jpg http://[server]/SHM/Thought%20Reflection.full.jpg -thoughtbind.jpg http://[server]/CHK/Thoughtbind.full.jpg -thoughtbound_primoc.jpg http://[server]/ON/Thoughtbound%20Primoc.full.jpg -thoughtcast.jpg http://[server]/MR/Thoughtcast.full.jpg -thoughtcutter_agent.jpg http://[server]/ALA/Thoughtcutter%20Agent.full.jpg -thoughtlace.jpg http://[server]/4E/Thoughtlace.full.jpg -thoughtleech.jpg http://[server]/7E/Thoughtleech.full.jpg -thoughtpicker_witch.jpg http://[server]/RAV/Thoughtpicker%20Witch.full.jpg -thoughts_of_ruin.jpg http://[server]/SOK/Thoughts%20of%20Ruin.full.jpg -thoughtseize.jpg http://[server]/LRW/Thoughtseize.full.jpg -thoughtweft_gambit.jpg http://[server]/SHM/Thoughtweft%20Gambit.full.jpg -thoughtweft_trio.jpg http://[server]/LRW/Thoughtweft%20Trio.full.jpg -thousand_legged_kami.jpg http://[server]/CHK/Thousand-legged%20Kami.full.jpg -thousand_year_elixir.jpg http://[server]/LRW/Thousand-Year%20Elixir.full.jpg -thran_dynamo.jpg http://[server]/UD/Thran%20Dynamo.full.jpg -thran_forge.jpg http://[server]/WL/Thran%20Forge.full.jpg -thran_foundry.jpg http://[server]/UD/Thran%20Foundry.full.jpg -thran_golem.jpg http://[server]/9E/Thran%20Golem.full.jpg -thran_lens.jpg http://[server]/UL/Thran%20Lens.full.jpg -thran_quarry.jpg http://[server]/US/Thran%20Quarry.full.jpg -thran_tome.jpg http://[server]/WL/Thran%20Tome.full.jpg -thran_turbine.jpg http://[server]/US/Thran%20Turbine.full.jpg -thran_war_machine.jpg http://[server]/UL/Thran%20War%20Machine.full.jpg -thran_weaponry.jpg http://[server]/UL/Thran%20Weaponry.full.jpg -thrashing_mudspawn.jpg http://[server]/ON/Thrashing%20Mudspawn.full.jpg -thrashing_wumpus.jpg http://[server]/MM/Thrashing%20Wumpus.full.jpg -thraximundar.jpg http://[server]/ARB/Thraximundar.full.jpg -threads_of_disloyalty.jpg http://[server]/BOK/Threads%20of%20Disloyalty.full.jpg -threaten.jpg http://[server]/10E/Threaten.full.jpg -three_dreams.jpg http://[server]/RAV/Three%20Dreams.full.jpg -three_tragedies.jpg http://[server]/BOK/Three%20Tragedies.full.jpg -three_visits.jpg http://[server]/P3/Three%20Visits.full.jpg -three_wishes.jpg http://[server]/VI/Three%20Wishes.full.jpg -thresher_beast.jpg http://[server]/PY/Thresher%20Beast.full.jpg -thrill_of_the_hunt.jpg http://[server]/TSP/Thrill%20of%20the%20Hunt.full.jpg -thriss_nantuko_primus.jpg http://[server]/JU/Thriss,%20Nantuko%20Primus.full.jpg -thrive.jpg http://[server]/PY/Thrive.full.jpg -throat_slitter.jpg http://[server]/BOK/Throat%20Slitter.full.jpg -throne_of_bone.jpg http://[server]/8E/Throne%20of%20Bone.full.jpg -through_the_breach.jpg http://[server]/CHK/Through%20the%20Breach.full.jpg -thrull_champion.jpg http://[server]/FE/Thrull%20Champion.full.jpg -thrull_retainer.jpg http://[server]/5E/Thrull%20Retainer.full.jpg -thrull_surgeon.jpg http://[server]/10E/Thrull%20Surgeon.full.jpg -thrull_wizard.jpg http://[server]/FE/Thrull%20Wizard.full.jpg -thrumming_stone.jpg http://[server]/CS/Thrumming%20Stone.full.jpg -thumbscrews.jpg http://[server]/TE/Thumbscrews.full.jpg -thunder_dragon.jpg http://[server]/ST/Thunder%20Dragon.full.jpg -thunder_of_hooves.jpg http://[server]/ON/Thunder%20of%20Hooves.full.jpg -thunder_spirit.jpg http://[server]/LG/Thunder%20Spirit.full.jpg -thunder_thrash_elder.jpg http://[server]/ALA/Thunder-Thrash%20Elder.full.jpg -thunder_totem.jpg http://[server]/TSP/Thunder%20Totem.full.jpg -thunder_wall.jpg http://[server]/IA/Thunder%20Wall.full.jpg -thunderblade_charge.jpg http://[server]/FUT/Thunderblade%20Charge.full.jpg -thunderblust.jpg http://[server]/EVE/Thunderblust.full.jpg -thunderbolt.jpg http://[server]/BD/Thunderbolt.full.jpg -thunderclap.jpg http://[server]/MM/Thunderclap.full.jpg -thundercloud_elemental.jpg http://[server]/SC/Thundercloud%20Elemental.full.jpg -thundercloud_shaman.jpg http://[server]/LRW/Thundercloud%20Shaman.full.jpg -thunderheads.jpg http://[server]/GP/Thunderheads.full.jpg -thundering_giant.jpg http://[server]/10E/Thundering%20Giant.full.jpg -thundering_wurm.jpg http://[server]/PT/Thundering%20Wurm.full.jpg -thundermare.jpg http://[server]/9E/Thundermare.full.jpg -thunderscape_apprentice.jpg http://[server]/IN/Thunderscape%20Apprentice.full.jpg -thunderscape_battlemage.jpg http://[server]/PS/Thunderscape%20Battlemage.full.jpg -thunderscape_familiar.jpg http://[server]/PS/Thunderscape%20Familiar.full.jpg -thunderscape_master.jpg http://[server]/IN/Thunderscape%20Master.full.jpg -thundersong_trumpeter.jpg http://[server]/RAV/Thundersong%20Trumpeter.full.jpg -thunderstaff.jpg http://[server]/DS/Thunderstaff.full.jpg -thwart.jpg http://[server]/MM/Thwart.full.jpg -tibor_and_lumia.jpg http://[server]/GP/Tibor%20and%20Lumia.full.jpg -ticking_gnomes.jpg http://[server]/UL/Ticking%20Gnomes.full.jpg -tidal_bore.jpg http://[server]/MM/Tidal%20Bore.full.jpg -tidal_control.jpg http://[server]/AL/Tidal%20Control.full.jpg -tidal_courier.jpg http://[server]/AP/Tidal%20Courier.full.jpg -tidal_flats.jpg http://[server]/FE/Tidal%20Flats1.full.jpg -tidal_influence.jpg http://[server]/FE/Tidal%20Influence.full.jpg -tidal_kraken.jpg http://[server]/9E/Tidal%20Kraken.full.jpg -tidal_surge.jpg http://[server]/6E/Tidal%20Surge.full.jpg -tidal_visionary.jpg http://[server]/IN/Tidal%20Visionary.full.jpg -tidal_warrior.jpg http://[server]/SH/Tidal%20Warrior.full.jpg -tidal_wave.jpg http://[server]/MI/Tidal%20Wave.full.jpg -tide_of_war.jpg http://[server]/CHK/Tide%20of%20War.full.jpg -tidehollow_sculler.jpg http://[server]/ALA/Tidehollow%20Sculler.full.jpg -tidehollow_strix.jpg http://[server]/ALA/Tidehollow%20Strix.full.jpg -tideshaper_mystic.jpg http://[server]/LRW/Tideshaper%20Mystic.full.jpg -tidespout_tyrant.jpg http://[server]/DIS/Tidespout%20Tyrant.full.jpg -tidewalker.jpg http://[server]/PLC/Tidewalker.full.jpg -tidewater_minion.jpg http://[server]/RAV/Tidewater%20Minion.full.jpg -tidings.jpg http://[server]/10E/Tidings.full.jpg -tiger_claws.jpg http://[server]/MM/Tiger%20Claws.full.jpg -tigereye_cameo.jpg http://[server]/IN/Tigereye%20Cameo.full.jpg -tilling_treefolk.jpg http://[server]/EVE/Tilling%20Treefolk.full.jpg -timber_protector.jpg http://[server]/LRW/Timber%20Protector.full.jpg -timber_wolves.jpg http://[server]/4E/Timber%20Wolves.full.jpg -timberland_ruins.jpg http://[server]/OD/Timberland%20Ruins.full.jpg -timberline_ridge.jpg http://[server]/IA/Timberline%20Ridge.full.jpg -timbermare.jpg http://[server]/PLC/Timbermare.full.jpg -timbermaw_larva.jpg http://[server]/ZEN/Timbermaw%20Larva.full.jpg -timberwatch_elf.jpg http://[server]/LE/Timberwatch%20Elf.full.jpg -time_and_tide.jpg http://[server]/VI/Time%20and%20Tide.full.jpg -time_bomb.jpg http://[server]/5E/Time%20Bomb.full.jpg -time_ebb.jpg http://[server]/9E/Time%20Ebb.full.jpg -time_elemental.jpg http://[server]/5E/Time%20Elemental.full.jpg -time_machine.jpg http://[server]/UNH/Time%20Machine.full.jpg -time_of_need.jpg http://[server]/CHK/Time%20of%20Need.full.jpg -time_sieve.jpg http://[server]/ARB/Time%20Sieve.full.jpg -time_spiral.jpg http://[server]/US/Time%20Spiral.full.jpg -time_stop.jpg http://[server]/10E/Time%20Stop.full.jpg -time_stretch.jpg http://[server]/10E/Time%20Stretch.full.jpg -time_vault.jpg http://[server]/U/Time%20Vault.full.jpg -time_walk.jpg http://[server]/U/Time%20Walk.full.jpg -time_warp.jpg http://[server]/M10/Time%20Warp.full.jpg -timebender.jpg http://[server]/PLC/Timebender.full.jpg -timecrafting.jpg http://[server]/PLC/Timecrafting.full.jpg -timesifter.jpg http://[server]/MR/Timesifter.full.jpg -timetwister.jpg http://[server]/U/Timetwister.full.jpg -timid_drake.jpg http://[server]/WL/Timid%20Drake.full.jpg -timmerian_fiends.jpg http://[server]/HL/Timmerian%20Fiends.full.jpg -timmy_power_gamer.jpg http://[server]/UG/Timmy,%20Power%20Gamer.full.jpg -tin_street_hooligan.jpg http://[server]/GP/Tin%20Street%20Hooligan.full.jpg -tin_wing_chimera.jpg http://[server]/VI/Tin-Wing%20Chimera.full.jpg -tinder_farm.jpg http://[server]/IN/Tinder%20Farm.full.jpg -tinder_wall.jpg http://[server]/IA/Tinder%20Wall.full.jpg -tinker.jpg http://[server]/UL/Tinker.full.jpg -tireless_tribe.jpg http://[server]/OD/Tireless%20Tribe.full.jpg -titania.jpg http://[server]/VG/Titania.full.jpg -titanias_boon.jpg http://[server]/US/Titania's%20Boon.full.jpg -titanias_chosen.jpg http://[server]/US/Titania's%20Chosen.full.jpg -titanias_song.jpg http://[server]/5E/Titania's%20Song.full.jpg -titanic_bulvox.jpg http://[server]/SC/Titanic%20Bulvox.full.jpg -titanic_ultimatum.jpg http://[server]/ALA/Titanic%20Ultimatum.full.jpg -titanium_golem.jpg http://[server]/MR/Titanium%20Golem.full.jpg -titans_revenge.jpg http://[server]/MOR/Titan's%20Revenge.full.jpg -tithe.jpg http://[server]/VI/Tithe.full.jpg -tivadar_of_thorn.jpg http://[server]/TSP/Tivadar%20of%20Thorn.full.jpg -tivadars_crusade.jpg http://[server]/DK/Tivadar's%20Crusade.full.jpg -to_arms.jpg http://[server]/GP/To%20Arms!.full.jpg -tobias_andrion.jpg http://[server]/LG/Tobias%20Andrion.full.jpg -togglodyte.jpg http://[server]/UNH/Togglodyte.full.jpg -toil_to_renown.jpg http://[server]/SHM/Toil%20to%20Renown.full.jpg -toils_of_night_and_day.jpg http://[server]/BOK/Toils%20of%20Night%20and%20Day.full.jpg -tolaria.jpg http://[server]/LG/Tolaria.full.jpg -tolaria_west.jpg http://[server]/FUT/Tolaria%20West.full.jpg -tolarian_academy.jpg http://[server]/US/Tolarian%20Academy.full.jpg -tolarian_drake.jpg http://[server]/WL/Tolarian%20Drake.full.jpg -tolarian_emissary.jpg http://[server]/IN/Tolarian%20Emissary.full.jpg -tolarian_entrancer.jpg http://[server]/WL/Tolarian%20Entrancer.full.jpg -tolarian_sentinel.jpg http://[server]/TSP/Tolarian%20Sentinel.full.jpg -tolarian_serpent.jpg http://[server]/WL/Tolarian%20Serpent.full.jpg -tolarian_winds.jpg http://[server]/7E/Tolarian%20Winds.full.jpg -tolsimir_wolfblood.jpg http://[server]/RAV/Tolsimir%20Wolfblood.full.jpg -tomb_of_urami.jpg http://[server]/SOK/Tomb%20of%20Urami.full.jpg -tombfire.jpg http://[server]/OD/Tombfire.full.jpg -tombstalker.jpg http://[server]/FUT/Tombstalker.full.jpg -tombstone_stairwell.jpg http://[server]/MI/Tombstone%20Stairwell.full.jpg -tome_scour.jpg http://[server]/M10/Tome%20Scour.full.jpg -tomorrow_azamis_familiar.jpg http://[server]/BOK/Tomorrow,%20Azami's%20Familiar.full.jpg -tonic_peddler.jpg http://[server]/MM/Tonic%20Peddler.full.jpg -tooth_and_claw.jpg http://[server]/TE/Tooth%20and%20Claw.full.jpg -tooth_and_nail.jpg http://[server]/MR/Tooth%20and%20Nail.full.jpg -tooth_of_chiss_goria.jpg http://[server]/MR/Tooth%20of%20Chiss-Goria.full.jpg -tooth_of_ramos.jpg http://[server]/MM/Tooth%20of%20Ramos.full.jpg -topan_ascetic.jpg http://[server]/ALA/Topan%20Ascetic.full.jpg -topple.jpg http://[server]/NE/Topple.full.jpg -topsy_turvy.jpg http://[server]/UNH/Topsy%20Turvy.full.jpg -tor_giant.jpg http://[server]/IA/Tor%20Giant.full.jpg -tor_wauki.jpg http://[server]/LG/Tor%20Wauki.full.jpg -torch_drake.jpg http://[server]/GP/Torch%20Drake.full.jpg -torch_slinger.jpg http://[server]/ZEN/Torch%20Slinger.full.jpg -torch_song.jpg http://[server]/US/Torch%20Song.full.jpg -torchling.jpg http://[server]/PLC/Torchling.full.jpg -torii_watchward.jpg http://[server]/SOK/Torii%20Watchward.full.jpg -torment.jpg http://[server]/SH/Torment.full.jpg -tormented_angel.jpg http://[server]/UD/Tormented%20Angel.full.jpg -tormods_crypt.jpg http://[server]/CH/Tormod's%20Crypt.full.jpg -tornado.jpg http://[server]/AL/Tornado.full.jpg -tornado_elemental.jpg http://[server]/FD/Tornado%20Elemental.full.jpg -torpid_moloch.jpg http://[server]/RAV/Torpid%20Moloch.full.jpg -torpor_dust.jpg http://[server]/SHM/Torpor%20Dust.full.jpg -torrent_of_fire.jpg http://[server]/SC/Torrent%20of%20Fire.full.jpg -torrent_of_lava.jpg http://[server]/MI/Torrent%20of%20Lava.full.jpg -torrent_of_souls.jpg http://[server]/SHM/Torrent%20of%20Souls.full.jpg -torrent_of_stone.jpg http://[server]/BOK/Torrent%20of%20Stone.full.jpg -torsten_von_ursus.jpg http://[server]/LG/Torsten%20von%20Ursus.full.jpg -tortoise_formation.jpg http://[server]/ALA/Tortoise%20Formation.full.jpg -torture.jpg http://[server]/5E/Torture.full.jpg -torture_chamber.jpg http://[server]/TE/Torture%20Chamber.full.jpg -tortured_existence.jpg http://[server]/SH/Tortured%20Existence.full.jpg -toshiro_umezawa.jpg http://[server]/BOK/Toshiro%20Umezawa.full.jpg -total_war.jpg http://[server]/IA/Total%20War.full.jpg -totem_speaker.jpg http://[server]/LE/Totem%20Speaker.full.jpg -touch_and_go.jpg http://[server]/UNH/Touch%20and%20Go.full.jpg -touch_of_brilliance.jpg http://[server]/PT/Touch%20of%20Brilliance.full.jpg -touch_of_darkness.jpg http://[server]/LG/Touch%20of%20Darkness.full.jpg -touch_of_death.jpg http://[server]/5E/Touch%20of%20Death.full.jpg -touch_of_invisibility.jpg http://[server]/OD/Touch%20of%20Invisibility.full.jpg -touch_of_vitae.jpg http://[server]/IA/Touch%20of%20Vitae.full.jpg -touchstone.jpg http://[server]/WL/Touchstone.full.jpg -tourachs_chant.jpg http://[server]/FE/Tourach's%20Chant.full.jpg -tourachs_gate.jpg http://[server]/FE/Tourach's%20Gate.full.jpg -tower_above.jpg http://[server]/SHM/Tower%20Above.full.jpg -tower_drake.jpg http://[server]/IN/Tower%20Drake.full.jpg -tower_gargoyle.jpg http://[server]/ALA/Tower%20Gargoyle.full.jpg -tower_of_champions.jpg http://[server]/MR/Tower%20of%20Champions.full.jpg -tower_of_coireall.jpg http://[server]/DK/Tower%20of%20Coireall.full.jpg -tower_of_eons.jpg http://[server]/MR/Tower%20of%20Eons.full.jpg -tower_of_fortunes.jpg http://[server]/MR/Tower%20of%20Fortunes.full.jpg -tower_of_murmurs.jpg http://[server]/MR/Tower%20of%20Murmurs.full.jpg -tower_of_the_magistrate.jpg http://[server]/MM/Tower%20of%20the%20Magistrate.full.jpg -towering_baloth.jpg http://[server]/ON/Towering%20Baloth.full.jpg -town_sentry.jpg http://[server]/P2/Town%20Sentry.full.jpg -toxic_iguanar.jpg http://[server]/CFX/Toxic%20Iguanar.full.jpg -toxic_stench.jpg http://[server]/JU/Toxic%20Stench.full.jpg -toxin_sliver.jpg http://[server]/LE/Toxin%20Sliver.full.jpg -toy_boat.jpg http://[server]/UNH/Toy%20Boat.full.jpg -toymaker.jpg http://[server]/MM/Toymaker.full.jpg -trace_of_abundance.jpg http://[server]/ARB/Trace%20of%20Abundance.full.jpg -tracker.jpg http://[server]/DK/Tracker.full.jpg -trade_caravan.jpg http://[server]/HL/Trade%20Caravan1.full.jpg -trade_routes.jpg http://[server]/9E/Trade%20Routes.full.jpg -trade_secrets.jpg http://[server]/ON/Trade%20Secrets.full.jpg -tradewind_rider.jpg http://[server]/TE/Tradewind%20Rider.full.jpg -tragic_poet.jpg http://[server]/UL/Tragic%20Poet.full.jpg -trailblazer.jpg http://[server]/IA/Trailblazer.full.jpg -trailblazers_boots.jpg http://[server]/ZEN/Trailblazer's%20Boots.full.jpg -train_of_thought.jpg http://[server]/GP/Train%20of%20Thought.full.jpg -trained_armodon.jpg http://[server]/9E/Trained%20Armodon.full.jpg -trained_cheetah.jpg http://[server]/P3/Trained%20Cheetah.full.jpg -trained_jackal.jpg http://[server]/P3/Trained%20Jackal.full.jpg -trained_orgg.jpg http://[server]/7E/Trained%20Orgg.full.jpg -trained_pronghorn.jpg http://[server]/JU/Trained%20Pronghorn.full.jpg -traitors_clutch.jpg http://[server]/TSP/Traitor's%20Clutch.full.jpg -traitors_roar.jpg http://[server]/SHM/Traitor's%20Roar.full.jpg -tranquil_domain.jpg http://[server]/MI/Tranquil%20Domain.full.jpg -tranquil_garden.jpg http://[server]/CHK/Tranquil%20Garden.full.jpg -tranquil_grove.jpg http://[server]/6E/Tranquil%20Grove.full.jpg -tranquil_path.jpg http://[server]/AP/Tranquil%20Path.full.jpg -tranquil_thicket.jpg http://[server]/ON/Tranquil%20Thicket.full.jpg -tranquility.jpg http://[server]/7E/Tranquility.full.jpg -transcendence.jpg http://[server]/TO/Transcendence.full.jpg -transguild_courier.jpg http://[server]/DIS/Transguild%20Courier.full.jpg -transluminant.jpg http://[server]/RAV/Transluminant.full.jpg -transmogrifying_licid.jpg http://[server]/EX/Transmogrifying%20Licid.full.jpg -transmutation.jpg http://[server]/LG/Transmutation.full.jpg -transmute_artifact.jpg http://[server]/AQ/Transmute%20Artifact.full.jpg -trap_digger.jpg http://[server]/SC/Trap%20Digger.full.jpg -trap_runner.jpg http://[server]/MM/Trap%20Runner.full.jpg -trapfinders_trick.jpg http://[server]/ZEN/Trapfinder's%20Trick.full.jpg -trapjaw_kelpie.jpg http://[server]/EVE/Trapjaw%20Kelpie.full.jpg -trapmakers_snare.jpg http://[server]/ZEN/Trapmaker's%20Snare.full.jpg -traproot_kami.jpg http://[server]/BOK/Traproot%20Kami.full.jpg -trash_for_treasure.jpg http://[server]/MR/Trash%20for%20Treasure.full.jpg -traumatic_visions.jpg http://[server]/CFX/Traumatic%20Visions.full.jpg -traumatize.jpg http://[server]/M10/Traumatize.full.jpg -travelers_cloak.jpg http://[server]/IN/Traveler's%20Cloak.full.jpg -traveling_plague.jpg http://[server]/OD/Traveling%20Plague.full.jpg -treacherous_link.jpg http://[server]/UL/Treacherous%20Link.full.jpg -treacherous_urge.jpg http://[server]/PLC/Treacherous%20Urge.full.jpg -treacherous_vampire.jpg http://[server]/JU/Treacherous%20Vampire.full.jpg -treacherous_werewolf.jpg http://[server]/JU/Treacherous%20Werewolf.full.jpg -treachery.jpg http://[server]/UD/Treachery.full.jpg -treasure_hunter.jpg http://[server]/10E/Treasure%20Hunter.full.jpg -treasure_trove.jpg http://[server]/9E/Treasure%20Trove.full.jpg -tree_monkey.jpg http://[server]/9E/Tree%20Monkey.full.jpg -tree_of_tales.jpg http://[server]/MR/Tree%20of%20Tales.full.jpg -treefolk_harbinger.jpg http://[server]/LRW/Treefolk%20Harbinger.full.jpg -treefolk_healer.jpg http://[server]/IN/Treefolk%20Healer.full.jpg -treefolk_mystic.jpg http://[server]/UL/Treefolk%20Mystic.full.jpg -treefolk_seedlings.jpg http://[server]/7E/Treefolk%20Seedlings.full.jpg -treespring_lorian.jpg http://[server]/ON/Treespring%20Lorian.full.jpg -treetop_bracers.jpg http://[server]/10E/Treetop%20Bracers.full.jpg -treetop_defense.jpg http://[server]/PT/Treetop%20Defense.full.jpg -treetop_rangers.jpg http://[server]/US/Treetop%20Rangers.full.jpg -treetop_scout.jpg http://[server]/SC/Treetop%20Scout.full.jpg -treetop_sentinel.jpg http://[server]/OD/Treetop%20Sentinel.full.jpg -treetop_village.jpg http://[server]/10E/Treetop%20Village.full.jpg -tremble.jpg http://[server]/OD/Tremble.full.jpg -tremor.jpg http://[server]/8E/Tremor.full.jpg -trench_wurm.jpg http://[server]/IN/Trench%20Wurm.full.jpg -trenching_steed.jpg http://[server]/PY/Trenching%20Steed.full.jpg -trespasser_il_vec.jpg http://[server]/TSP/Trespasser%20il-Vec.full.jpg -tresserhorn_sinks.jpg http://[server]/CS/Tresserhorn%20Sinks.full.jpg -tresserhorn_skyknight.jpg http://[server]/CS/Tresserhorn%20Skyknight.full.jpg -treva_the_renewer.jpg http://[server]/IN/Treva,%20the%20Renewer.full.jpg -trevas_attendant.jpg http://[server]/IN/Treva's%20Attendant.full.jpg -trevas_charm.jpg http://[server]/PS/Treva's%20Charm.full.jpg -trevas_ruins.jpg http://[server]/PS/Treva's%20Ruins.full.jpg -trialerror.jpg http://[server]/DIS/TrialError.full.jpg -triangle_of_war.jpg http://[server]/VI/Triangle%20of%20War.full.jpg -triassic_egg.jpg http://[server]/LG/Triassic%20Egg.full.jpg -tribal_flames.jpg http://[server]/IN/Tribal%20Flames.full.jpg -tribal_forcemage.jpg http://[server]/LE/Tribal%20Forcemage.full.jpg -tribal_golem.jpg http://[server]/ON/Tribal%20Golem.full.jpg -tribal_unity.jpg http://[server]/ON/Tribal%20Unity.full.jpg -trickbind.jpg http://[server]/TSP/Trickbind.full.jpg -trickery_charm.jpg http://[server]/ON/Trickery%20Charm.full.jpg -trickster_mage.jpg http://[server]/NE/Trickster%20Mage.full.jpg -triclopean_sight.jpg http://[server]/LRW/Triclopean%20Sight.full.jpg -trinisphere.jpg http://[server]/DS/Trinisphere.full.jpg -trinket_mage.jpg http://[server]/FD/Trinket%20Mage.full.jpg -trip_noose.jpg http://[server]/SHM/Trip%20Noose.full.jpg -trip_wire.jpg http://[server]/P3/Trip%20Wire.full.jpg -triskelavus.jpg http://[server]/TSP/Triskelavus.full.jpg -triskelion.jpg http://[server]/4E/Triskelion.full.jpg -trokin_high_guard.jpg http://[server]/P2/Trokin%20High%20Guard.full.jpg -troll_ascetic.jpg http://[server]/10E/Troll%20Ascetic.full.jpg -troll_horn_cameo.jpg http://[server]/IN/Troll-Horn%20Cameo.full.jpg -trolls_of_tel_jilad.jpg http://[server]/MR/Trolls%20of%20Tel-Jilad.full.jpg -tromp_the_domains.jpg http://[server]/TSP/Tromp%20the%20Domains.full.jpg -trophy_hunter.jpg http://[server]/RAV/Trophy%20Hunter.full.jpg -tropical_island.jpg http://[server]/U/Tropical%20Island.full.jpg -tropical_storm.jpg http://[server]/MI/Tropical%20Storm.full.jpg -troubled_healer.jpg http://[server]/PY/Troubled%20Healer.full.jpg -troublesome_spirit.jpg http://[server]/PY/Troublesome%20Spirit.full.jpg -truce.jpg http://[server]/5E/Truce.full.jpg -true_believer.jpg http://[server]/10E/True%20Believer.full.jpg -trumpet_blast.jpg http://[server]/M10/Trumpet%20Blast.full.jpg -trumpeting_armodon.jpg http://[server]/TE/Trumpeting%20Armodon.full.jpg -trusted_advisor.jpg http://[server]/SOK/Trusted%20Advisor.full.jpg -trusty_machete.jpg http://[server]/ZEN/Trusty%20Machete.full.jpg -truth_or_tale.jpg http://[server]/TSP/Truth%20or%20Tale.full.jpg -trygon_predator.jpg http://[server]/DIS/Trygon%20Predator.full.jpg -tsabo_tavoc.jpg http://[server]/IN/Tsabo%20Tavoc.full.jpg -tsabos_assassin.jpg http://[server]/IN/Tsabo's%20Assassin.full.jpg -tsabos_decree.jpg http://[server]/IN/Tsabo's%20Decree.full.jpg -tsabos_web.jpg http://[server]/IN/Tsabo's%20Web.full.jpg -tsunami.jpg http://[server]/5E/Tsunami.full.jpg -tukatongue_thallid.jpg http://[server]/CFX/Tukatongue%20Thallid.full.jpg -tuknir_deathlock.jpg http://[server]/LG/Tuknir%20Deathlock.full.jpg -tuktuk_grunts.jpg http://[server]/ZEN/Tuktuk%20Grunts.full.jpg -tundra.jpg http://[server]/U/Tundra.full.jpg -tundra_kavu.jpg http://[server]/AP/Tundra%20Kavu.full.jpg -tundra_wolves.jpg http://[server]/10E/Tundra%20Wolves.full.jpg -tunnel.jpg http://[server]/4E/Tunnel.full.jpg -tunnel_vision.jpg http://[server]/RAV/Tunnel%20Vision.full.jpg -tunneler_wurm.jpg http://[server]/JU/Tunneler%20Wurm.full.jpg -turbulent_dreams.jpg http://[server]/TO/Turbulent%20Dreams.full.jpg -turf_wound.jpg http://[server]/IN/Turf%20Wound.full.jpg -turn_the_tables.jpg http://[server]/DS/Turn%20the%20Tables.full.jpg -turn_to_dust.jpg http://[server]/MR/Turn%20to%20Dust.full.jpg -turn_to_mist.jpg http://[server]/SHM/Turn%20to%20Mist.full.jpg -turnabout.jpg http://[server]/US/Turnabout.full.jpg -turntimber_basilisk.jpg http://[server]/ZEN/Turntimber%20Basilisk.full.jpg -turntimber_grove.jpg http://[server]/ZEN/Turntimber%20Grove.full.jpg -turntimber_ranger.jpg http://[server]/ZEN/Turntimber%20Ranger.full.jpg -turtleshell_changeling.jpg http://[server]/LRW/Turtleshell%20Changeling.full.jpg -twiddle.jpg http://[server]/8E/Twiddle.full.jpg -twigwalker.jpg http://[server]/OD/Twigwalker.full.jpg -twilight_drover.jpg http://[server]/RAV/Twilight%20Drover.full.jpg -twilight_mire.jpg http://[server]/EVE/Twilight%20Mire.full.jpg -twilight_shepherd.jpg http://[server]/SHM/Twilight%20Shepherd.full.jpg -twilights_call.jpg http://[server]/IN/Twilight's%20Call.full.jpg -twinblade_slasher.jpg http://[server]/EVE/Twinblade%20Slasher.full.jpg -twincast.jpg http://[server]/M10/Twincast.full.jpg -twinning_glass.jpg http://[server]/LRW/Twinning%20Glass.full.jpg -twinstrike.jpg http://[server]/DIS/Twinstrike.full.jpg -twist_allegiance.jpg http://[server]/BOK/Twist%20Allegiance.full.jpg -twisted_abomination.jpg http://[server]/SC/Twisted%20Abomination.full.jpg -twisted_experiment.jpg http://[server]/UD/Twisted%20Experiment.full.jpg -twisted_justice.jpg http://[server]/RAV/Twisted%20Justice.full.jpg -twitch.jpg http://[server]/10E/Twitch.full.jpg -two_headed_dragon.jpg http://[server]/8E/Two-Headed%20Dragon.full.jpg -two_headed_giant_of_foriys.jpg http://[server]/U/Two-Headed%20Giant%20of%20Foriys.full.jpg -two_headed_sliver.jpg http://[server]/TSP/Two-Headed%20Sliver.full.jpg -typhoon.jpg http://[server]/LG/Typhoon.full.jpg -tyrannize.jpg http://[server]/SHM/Tyrannize.full.jpg -tyrranax.jpg http://[server]/FD/Tyrranax.full.jpg \ No newline at end of file diff --git a/res/pics_link/card-pictures_token.txt b/res/pics_link/card-pictures_token.txt deleted file mode 100644 index f6f9395958a..00000000000 --- a/res/pics_link/card-pictures_token.txt +++ /dev/null @@ -1,51 +0,0 @@ -[T]ub_1_1_zombie_wizard.jpg http://magiccards.info/extras/token/alara-reborn/zombie-wizard.jpg -[T]b_1_1_rat.jpg http://magiccards.info/extras/token/shadowmoor/rat.jpg -[T]w_1_1_kithkin_soldier.jpg http://magiccards.info/extras/token/lorwyn/kithkin-soldier.jpg -[T]g_1_1_elf_warrior.jpg http://magiccards.info/extras/token/shadowmoor/elf-warrior-2.jpg -[T]g_2_2_wolf.jpg http://magiccards.info/extras/token/zendikar/wolf.jpg -[T]g_2_2_lizard.jpg http://magiccards.info/extras/token/alara-reborn/lizard.jpg -[T]w_1_1_spirit.jpg http://magiccards.info/extras/token/duel-decks-divine-vs-demonic/spirit.jpg -[T]w_n_n_avatar.jpg http://magiccards.info/extras/token/magic-2010/avatar.jpg -[T]w_4_4_angel.jpg http://magiccards.info/extras/token/conflux/angel.jpg -[T]g_1_1_insect.jpg http://magiccards.info/extras/token/player-rewards-2003/insect.jpg -[T]u_1_1_bird.jpg http://magiccards.info/extras/token/player-rewards-2001/bird.jpg -[T]w_1_1_bird.jpg http://magiccards.info/extras/token/zendikar/bird.jpg -[T]rg_1_1_dragon.jpg http://magiccards.info/extras/token/alara-reborn/dragon.jpg -[T]g_4_4_beast.jpg http://magiccards.info/extras/token/player-rewards-2001/beast.jpg -[T]g_3_3_elephant.jpg http://magiccards.info/extras/token/worldwake/elephant.jpg -[T]g_1_1_squirrel.jpg http://magiccards.info/extras/token/player-rewards-2002/squirrel.jpg -[T]g_6_6_wurm.jpg http://magiccards.info/extras/token/player-rewards-2002/wurm.jpg -[T]b_1_1_faerie_rogue.jpg http://magiccards.info/extras/token/morningtide/faerie-rogue.jpg -[T]b_2_2_zombie.jpg http://magiccards.info/extras/token/magic-2010/zombie.jpg -[T]c_1_1_shapeshifter.jpg http://magiccards.info/extras/token/lorwyn/shapeshifter.jpg -[T]c_1_1_sliver.jpg http://magiccards.info/extras/token/player-rewards-2003/sliver.jpg -[T]c_1_1_wasp.jpg http://magiccards.info/extras/token/tenth-edition/wasp.jpg -[T]g_1_1_saproling.jpg http://magiccards.info/extras/token/shards-of-alara/saproling.jpg -[T]g_2_2_bear.jpg http://magiccards.info/extras/token/player-rewards-2001/bear.jpg -[T]g_2_5_treefolk_shaman.jpg http://magiccards.info/extras/token/morningtide/treefolk-shaman.jpg -[T]g_3_3_beast.jpg http://magiccards.info/extras/token/eventide/beast.jpg -[T]b_20_20_marit_lage.jpg http://magiccards.info/extras/token/coldsnap/marit-lage.jpg -[T]r_1_1_goblin.jpg http://magiccards.info/extras/token/player-rewards-2003/goblin.jpg -[T]r_3_1_elemental.jpg http://magiccards.info/extras/token/conflux/elemental.jpg -[T]r_4_4_dragon.jpg http://magiccards.info/extras/token/shards-of-alara/dragon.jpg -[T]r_5_5_dragon.jpg http://magiccards.info/extras/token/worldwake/dragon.jpg -[T]rgw_8_8_beast.jpg http://magiccards.info/extras/token/shards-of-alara/beast.jpg -[T]rw_1_1_goblin_soldier.jpg http://magiccards.info/extras/token/eventide/goblin-soldier.jpg -[T]w_0_1_goat.jpg http://magiccards.info/extras/token/eventide/goat.jpg -[T]w_1_1_soldier.jpg http://magiccards.info/extras/token/shards-of-alara/soldier.jpg -[T]w_5_5_giant_warrior.jpg http://magiccards.info/extras/token/morningtide/giant-warrior.jpg -[T]c_3_4_gargoyle.jpg http://magiccards.info/extras/token/magic-2010/gargoyle.jpg -[T]g_1_1_snake.jpg http://magiccards.info/extras/token/zendikar/snake.jpg -[T]w_1_1_kor_soldier.jpg http://magiccards.info/extras/token/zendikar/kor-soldier.jpg -[T]w_4_4_elemental.jpg http://magiccards.info/extras/token/lorwyn/elemental-2.jpg -[T]c_0_1_eldrazi_spawn.jpg http://magiccards.info/extras/token/rise-of-the-eldrazi/eldrazi-spawn-1.jpg -[T]r_4_4_hellion.jpg http://magiccards.info/extras/token/rise-of-the-eldrazi/hellion.jpg -[T]g_0_1_plant.jpg http://magiccards.info/extras/token/worldwake/plant.jpg -[T]w_1_1_soldier_ally.jpg http://magiccards.info/extras/token/worldwake/soldier-ally.jpg -[T]c_1_1_spirit.jpg http://magiccards.info/extras/token/player-rewards-2004/spirit.jpg -[T]c_5_5_tuktuk_the_returned.jpg http://magiccards.info/extras/token/rise-of-the-eldrazi/tuktuk-the-returned.jpg -[T]gw_1_1_elf_warrior.jpg http://magiccards.info/extras/token/shadowmoor/elf-warrior-1.jpg -[T]r_3_1_elemental_haste.jpg http://magiccards.info/extras/token/shadowmoor/elemental-1.jpg -[T]r_4_4_bird.jpg http://magiccards.info/extras/token/player-rewards-2003/rukh.jpg -[T]u_1_1_thopter.jpg http://magiccards.info/extras/token/shards-of-alara/thopter.jpg -[T]w_4_4_mirror_sigil_sergeant.jpg http://[server]/CFX/Mirror-Sigil%20Sergeant.full.jpg diff --git a/res/pics_link/card-pictures_u.txt b/res/pics_link/card-pictures_u.txt deleted file mode 100644 index 32d7e7be114..00000000000 --- a/res/pics_link/card-pictures_u.txt +++ /dev/null @@ -1,126 +0,0 @@ -uba_mask.jpg http://[server]/CHK/Uba%20Mask.full.jpg -uktabi_drake.jpg http://[server]/PLC/Uktabi%20Drake.full.jpg -uktabi_efreet.jpg http://[server]/WL/Uktabi%20Efreet.full.jpg -uktabi_faerie.jpg http://[server]/MI/Uktabi%20Faerie.full.jpg -uktabi_kong.jpg http://[server]/UNH/Uktabi%20Kong.full.jpg -uktabi_orangutan.jpg http://[server]/6E/Uktabi%20Orangutan.full.jpg -uktabi_wildcats.jpg http://[server]/7E/Uktabi%20Wildcats.full.jpg -ulasht_the_hate_seed.jpg http://[server]/GP/Ulasht,%20the%20Hate%20Seed.full.jpg -umara_raptor.jpg http://[server]/ZEN/Umara%20Raptor.full.jpg -umbilicus.jpg http://[server]/US/Umbilicus.full.jpg -umbra_stalker.jpg http://[server]/EVE/Umbra%20Stalker.full.jpg -umbral_mantle.jpg http://[server]/SHM/Umbral%20Mantle.full.jpg -umezawas_jitte.jpg http://[server]/BOK/Umezawa's%20Jitte.full.jpg -unbender_tine.jpg http://[server]/ARB/Unbender%20Tine.full.jpg -unblinking_bleb.jpg http://[server]/FUT/Unblinking%20Bleb.full.jpg -unburden.jpg http://[server]/SC/Unburden.full.jpg -unchecked_growth.jpg http://[server]/BOK/Unchecked%20Growth.full.jpg -uncle_istvan.jpg http://[server]/4E/Uncle%20Istvan.full.jpg -uncontrollable_anger.jpg http://[server]/10E/Uncontrollable%20Anger.full.jpg -uncontrolled_infestation.jpg http://[server]/SC/Uncontrolled%20Infestation.full.jpg -undead_gladiator.jpg http://[server]/ON/Undead%20Gladiator.full.jpg -undead_leotau.jpg http://[server]/ALA/Undead%20Leotau.full.jpg -undead_slayer.jpg http://[server]/M10/Undead%20Slayer.full.jpg -undead_warchief.jpg http://[server]/HOP/Undead%20Warchief.full.jpg -undercity_shade.jpg http://[server]/RAV/Undercity%20Shade.full.jpg -underground_river.jpg http://[server]/10E/Underground%20River.full.jpg -underground_sea.jpg http://[server]/U/Underground%20Sea.full.jpg -undergrowth.jpg http://[server]/AL/Undergrowth1.full.jpg -undermine.jpg http://[server]/IN/Undermine.full.jpg -undertaker.jpg http://[server]/MM/Undertaker.full.jpg -undertow.jpg http://[server]/LG/Undertow.full.jpg -underworld_dreams.jpg http://[server]/M10/Underworld%20Dreams.full.jpg -undiscovered_paradise.jpg http://[server]/VI/Undiscovered%20Paradise.full.jpg -undo.jpg http://[server]/VI/Undo.full.jpg -undying_beast.jpg http://[server]/PT/Undying%20Beast.full.jpg -undying_flames.jpg http://[server]/SOK/Undying%20Flames.full.jpg -undying_rage.jpg http://[server]/TSP/Undying%20Rage.full.jpg -unearth.jpg http://[server]/UL/Unearth.full.jpg -unearthly_blizzard.jpg http://[server]/CHK/Unearthly%20Blizzard.full.jpg -unerring_sling.jpg http://[server]/MI/Unerring%20Sling.full.jpg -unforge.jpg http://[server]/DS/Unforge.full.jpg -unfulfilled_desires.jpg http://[server]/MI/Unfulfilled%20Desires.full.jpg -unhinge.jpg http://[server]/TO/Unhinge.full.jpg -unholy_citadel.jpg http://[server]/LG/Unholy%20Citadel.full.jpg -unholy_grotto.jpg http://[server]/ON/Unholy%20Grotto.full.jpg -unholy_strength.jpg http://[server]/M10/Unholy%20Strength.full.jpg -unified_strike.jpg http://[server]/ON/Unified%20Strike.full.jpg -unifying_theory.jpg http://[server]/OD/Unifying%20Theory.full.jpg -unlikely_alliance.jpg http://[server]/AL/Unlikely%20Alliance.full.jpg -unliving_psychopath.jpg http://[server]/DIS/Unliving%20Psychopath.full.jpg -unmake.jpg http://[server]/EVE/Unmake.full.jpg -unmask.jpg http://[server]/MM/Unmask.full.jpg -unnatural_hunger.jpg http://[server]/MM/Unnatural%20Hunger.full.jpg -unnatural_selection.jpg http://[server]/AP/Unnatural%20Selection.full.jpg -unnatural_speed.jpg http://[server]/CHK/Unnatural%20Speed.full.jpg -unnerve.jpg http://[server]/US/Unnerve.full.jpg -unnerving_assault.jpg http://[server]/EVE/Unnerving%20Assault.full.jpg -unquestioned_authority.jpg http://[server]/JU/Unquestioned%20Authority.full.jpg -unscythe_killer_of_kings.jpg http://[server]/ARB/Unscythe,%20Killer%20of%20Kings.full.jpg -unseen_walker.jpg http://[server]/6E/Unseen%20Walker.full.jpg -unspeakable_symbol.jpg http://[server]/SC/Unspeakable%20Symbol.full.jpg -unstable_footing.jpg http://[server]/ZEN/Unstable%20Footing.full.jpg -unstable_frontier.jpg http://[server]/CFX/Unstable%20Frontier.full.jpg -unstable_hulk.jpg http://[server]/LE/Unstable%20Hulk.full.jpg -unstable_mutation.jpg http://[server]/5E/Unstable%20Mutation.full.jpg -unstable_shapeshifter.jpg http://[server]/TE/Unstable%20Shapeshifter.full.jpg -unstoppable_ash.jpg http://[server]/MOR/Unstoppable%20Ash.full.jpg -unsummon.jpg http://[server]/M10/Unsummon.full.jpg -untaidake_the_cloud_keeper.jpg http://[server]/CHK/Untaidake,%20the%20Cloud%20Keeper.full.jpg -untamed_wilds.jpg http://[server]/7E/Untamed%20Wilds.full.jpg -unwilling_recruit.jpg http://[server]/EVE/Unwilling%20Recruit.full.jpg -unworthy_dead.jpg http://[server]/US/Unworthy%20Dead.full.jpg -unyaro_bee_sting.jpg http://[server]/MI/Unyaro%20Bee%20Sting.full.jpg -unyaro_bees.jpg http://[server]/TSP/Unyaro%20Bees.full.jpg -unyaro_griffin.jpg http://[server]/6E/Unyaro%20Griffin.full.jpg -updraft.jpg http://[server]/5E/Updraft.full.jpg -upheaval.jpg http://[server]/OD/Upheaval.full.jpg -uphill_battle.jpg http://[server]/MM/Uphill%20Battle.full.jpg -uproot.jpg http://[server]/BOK/Uproot.full.jpg -upwelling.jpg http://[server]/10E/Upwelling.full.jpg -ur_drago.jpg http://[server]/LG/Ur-Drago.full.jpg -ur_golems_eye.jpg http://[server]/9E/Ur-Golem's%20Eye.full.jpg -urborg.jpg http://[server]/LG/Urborg.full.jpg -urborg_drake.jpg http://[server]/IN/Urborg%20Drake.full.jpg -urborg_elf.jpg http://[server]/AP/Urborg%20Elf.full.jpg -urborg_emissary.jpg http://[server]/IN/Urborg%20Emissary.full.jpg -urborg_justice.jpg http://[server]/WL/Urborg%20Justice.full.jpg -urborg_mindsucker.jpg http://[server]/VI/Urborg%20Mindsucker.full.jpg -urborg_panther.jpg http://[server]/MI/Urborg%20Panther.full.jpg -urborg_phantom.jpg http://[server]/IN/Urborg%20Phantom.full.jpg -urborg_shambler.jpg http://[server]/IN/Urborg%20Shambler.full.jpg -urborg_skeleton.jpg http://[server]/IN/Urborg%20Skeleton.full.jpg -urborg_stalker.jpg http://[server]/WL/Urborg%20Stalker.full.jpg -urborg_syphon_mage.jpg http://[server]/TSP/Urborg%20Syphon-Mage.full.jpg -urborg_tomb_of_yawgmoth.jpg http://[server]/PLC/Urborg,%20Tomb%20of%20Yawgmoth.full.jpg -urborg_uprising.jpg http://[server]/AP/Urborg%20Uprising.full.jpg -urborg_volcano.jpg http://[server]/8E/Urborg%20Volcano.full.jpg -uril_the_miststalker.jpg http://[server]/ARB/Uril,%20the%20Miststalker.full.jpg -ursapine.jpg http://[server]/RAV/Ursapine.full.jpg -ursine_fylgja.jpg http://[server]/CS/Ursine%20Fylgja.full.jpg -urza.jpg http://[server]/VG/Urza.full.jpg -urzas_armor.jpg http://[server]/8E/Urza's%20Armor.full.jpg -urzas_avenger.jpg http://[server]/5E/Urza's%20Avenger.full.jpg -urzas_bauble.jpg http://[server]/5E/Urza's%20Bauble.full.jpg -urzas_blueprints.jpg http://[server]/UL/Urza's%20Blueprints.full.jpg -urzas_chalice.jpg http://[server]/AQ/Urza's%20Chalice.full.jpg -urzas_contact_lenses.jpg http://[server]/UG/Urza's%20Contact%20Lenses.full.jpg -urzas_engine.jpg http://[server]/AL/Urza's%20Engine.full.jpg -urzas_factory.jpg http://[server]/TSP/Urza's%20Factory.full.jpg -urzas_filter.jpg http://[server]/IN/Urza's%20Filter.full.jpg -urzas_guilt.jpg http://[server]/PS/Urza's%20Guilt.full.jpg -urzas_hot_tub.jpg http://[server]/UNH/Urza's%20Hot%20Tub.full.jpg -urzas_incubator.jpg http://[server]/UD/Urza's%20Incubator.full.jpg -urzas_mine.jpg http://[server]/9E/Urza's%20Mine.full.jpg -urzas_miter.jpg http://[server]/AQ/Urza's%20Miter.full.jpg -urzas_power_plant.jpg http://[server]/9E/Urza's%20Power%20Plant.full.jpg -urzas_rage.jpg http://[server]/IN/Urza's%20Rage.full.jpg -urzas_science_fair_project.jpg http://[server]/UG/Urza's%20Science%20Fair%20Project.full.jpg -urzas_tower.jpg http://[server]/9E/Urza's%20Tower.full.jpg -uthden_troll.jpg http://[server]/4E/Uthden%20Troll.full.jpg -utopia_mycon.jpg http://[server]/FUT/Utopia%20Mycon.full.jpg -utopia_sprawl.jpg http://[server]/DIS/Utopia%20Sprawl.full.jpg -utopia_tree.jpg http://[server]/9E/Utopia%20Tree.full.jpg -utopia_vow.jpg http://[server]/PLC/Utopia%20Vow.full.jpg -utvara_scalper.jpg http://[server]/DIS/Utvara%20Scalper.full.jpg -uyo_silent_prophet.jpg http://[server]/CHK/Uyo,%20Silent%20Prophet.full.jpg \ No newline at end of file diff --git a/res/pics_link/card-pictures_v.txt b/res/pics_link/card-pictures_v.txt deleted file mode 100644 index 129a601584e..00000000000 --- a/res/pics_link/card-pictures_v.txt +++ /dev/null @@ -1,283 +0,0 @@ -vacuumelt.jpg http://[server]/GP/Vacuumelt.full.jpg -vaevictis_asmadi.jpg http://[server]/LG/Vaevictis%20Asmadi.full.jpg -vagrant_plowbeasts.jpg http://[server]/CFX/Vagrant%20Plowbeasts.full.jpg -valakut_the_molten_pinnacle.jpg http://[server]/ZEN/Valakut,%20the%20Molten%20Pinnacle.full.jpg -valeron_outlander.jpg http://[server]/CFX/Valeron%20Outlander.full.jpg -valiant_guard.jpg http://[server]/CFX/Valiant%20Guard.full.jpg -valley_rannet.jpg http://[server]/ARB/Valley%20Rannet.full.jpg -valleymaker.jpg http://[server]/SHM/Valleymaker.full.jpg -valor.jpg http://[server]/JU/Valor.full.jpg -valor_made_real.jpg http://[server]/DIS/Valor%20Made%20Real.full.jpg -valorous_charge.jpg http://[server]/PT/Valorous%20Charge.full.jpg -vampire_aristocrat.jpg http://[server]/M10/Vampire%20Aristocrat.full.jpg -vampire_bats.jpg http://[server]/10E/Vampire%20Bats.full.jpg -vampire_hexmage.jpg http://[server]/ZEN/Vampire%20Hexmage.full.jpg -vampire_hounds.jpg http://[server]/EX/Vampire%20Hounds.full.jpg -vampire_lacerator.jpg http://[server]/ZEN/Vampire%20Lacerator.full.jpg -vampire_nighthawk.jpg http://[server]/ZEN/Vampire%20Nighthawk.full.jpg -vampire_nocturnus.jpg http://[server]/M10/Vampire%20Nocturnus.full.jpg -vampires_bite.jpg http://[server]/ZEN/Vampire's%20Bite.full.jpg -vampiric_dragon.jpg http://[server]/OD/Vampiric%20Dragon.full.jpg -vampiric_embrace.jpg http://[server]/US/Vampiric%20Embrace.full.jpg -vampiric_feast.jpg http://[server]/PT/Vampiric%20Feast.full.jpg -vampiric_link.jpg http://[server]/PLC/Vampiric%20Link.full.jpg -vampiric_sliver.jpg http://[server]/TSP/Vampiric%20Sliver.full.jpg -vampiric_spirit.jpg http://[server]/8E/Vampiric%20Spirit.full.jpg -vampiric_touch.jpg http://[server]/PT/Vampiric%20Touch.full.jpg -vampiric_tutor.jpg http://[server]/6E/Vampiric%20Tutor.full.jpg -vampirism.jpg http://[server]/VI/Vampirism.full.jpg -vanish_into_memory.jpg http://[server]/CS/Vanish%20into%20Memory.full.jpg -vanishing.jpg http://[server]/VI/Vanishing.full.jpg -vanquish.jpg http://[server]/FD/Vanquish.full.jpg -vaporous_djinn.jpg http://[server]/MI/Vaporous%20Djinn.full.jpg -varchilds_crusader.jpg http://[server]/AL/Varchild's%20Crusader1.full.jpg -varchilds_war_riders.jpg http://[server]/AL/Varchild's%20War-Riders.full.jpg -vassals_duty.jpg http://[server]/CHK/Vassal's%20Duty.full.jpg -vastwood_gorger.jpg http://[server]/ZEN/Vastwood%20Gorger.full.jpg -vault_of_whispers.jpg http://[server]/MR/Vault%20of%20Whispers.full.jpg -vebulid.jpg http://[server]/US/Vebulid.full.jpg -vec_townships.jpg http://[server]/TE/Vec%20Townships.full.jpg -vectis_agents.jpg http://[server]/CFX/Vectis%20Agents.full.jpg -vectis_dominator.jpg http://[server]/ARB/Vectis%20Dominator.full.jpg -vectis_silencers.jpg http://[server]/ALA/Vectis%20Silencers.full.jpg -vedalken_aethermage.jpg http://[server]/FUT/Vedalken%20AEthermage.full.jpg -vedalken_archmage.jpg http://[server]/MR/Vedalken%20Archmage.full.jpg -vedalken_dismisser.jpg http://[server]/RAV/Vedalken%20Dismisser.full.jpg -vedalken_engineer.jpg http://[server]/DS/Vedalken%20Engineer.full.jpg -vedalken_entrancer.jpg http://[server]/RAV/Vedalken%20Entrancer.full.jpg -vedalken_ghoul.jpg http://[server]/ARB/Vedalken%20Ghoul.full.jpg -vedalken_heretic.jpg http://[server]/ARB/Vedalken%20Heretic.full.jpg -vedalken_mastermind.jpg http://[server]/10E/Vedalken%20Mastermind.full.jpg -vedalken_orrery.jpg http://[server]/FD/Vedalken%20Orrery.full.jpg -vedalken_outlander.jpg http://[server]/CFX/Vedalken%20Outlander.full.jpg -vedalken_plotter.jpg http://[server]/GP/Vedalken%20Plotter.full.jpg -vedalken_shackles.jpg http://[server]/FD/Vedalken%20Shackles.full.jpg -veil_of_birds.jpg http://[server]/US/Veil%20of%20Birds.full.jpg -veil_of_secrecy.jpg http://[server]/BOK/Veil%20of%20Secrecy.full.jpg -veiled_apparition.jpg http://[server]/US/Veiled%20Apparition.full.jpg -veiled_crocodile.jpg http://[server]/US/Veiled%20Crocodile.full.jpg -veiled_sentry.jpg http://[server]/US/Veiled%20Sentry.full.jpg -veiled_serpent.jpg http://[server]/US/Veiled%20Serpent.full.jpg -veiling_oddity.jpg http://[server]/PLC/Veiling%20Oddity.full.jpg -veilstone_amulet.jpg http://[server]/FUT/Veilstone%20Amulet.full.jpg -vein_drinker.jpg http://[server]/ALA/Vein%20Drinker.full.jpg -veinfire_borderpost.jpg http://[server]/ARB/Veinfire%20Borderpost.full.jpg -veldrane_of_sengir.jpg http://[server]/HL/Veldrane%20of%20Sengir.full.jpg -veldt.jpg http://[server]/IA/Veldt.full.jpg -venarian_glimmer.jpg http://[server]/PLC/Venarian%20Glimmer.full.jpg -venarian_gold.jpg http://[server]/LG/Venarian%20Gold.full.jpg -vendetta.jpg http://[server]/MM/Vendetta.full.jpg -vendilion_clique.jpg http://[server]/MOR/Vendilion%20Clique.full.jpg -venerable_kumo.jpg http://[server]/CHK/Venerable%20Kumo.full.jpg -venerable_monk.jpg http://[server]/10E/Venerable%20Monk.full.jpg -vengeance.jpg http://[server]/9E/Vengeance.full.jpg -vengeful_dead.jpg http://[server]/SC/Vengeful%20Dead.full.jpg -vengeful_dreams.jpg http://[server]/TO/Vengeful%20Dreams.full.jpg -vengeful_firebrand.jpg http://[server]/MOR/Vengeful%20Firebrand.full.jpg -vengeful_rebirth.jpg http://[server]/ARB/Vengeful%20Rebirth.full.jpg -venom.jpg http://[server]/5E/Venom.full.jpg -venomous_breath.jpg http://[server]/MM/Venomous%20Breath.full.jpg -venomous_dragonfly.jpg http://[server]/MM/Venomous%20Dragonfly.full.jpg -venomous_fangs.jpg http://[server]/US/Venomous%20Fangs.full.jpg -venomous_vines.jpg http://[server]/JU/Venomous%20Vines.full.jpg -venomspout_brackus.jpg http://[server]/ON/Venomspout%20Brackus.full.jpg -venser_shaper_savant.jpg http://[server]/FUT/Venser,%20Shaper%20Savant.full.jpg -vensers_diffusion.jpg http://[server]/FUT/Venser's%20Diffusion.full.jpg -vensers_sliver.jpg http://[server]/TSP/Venser's%20Sliver.full.jpg -ventifact_bottle.jpg http://[server]/MI/Ventifact%20Bottle.full.jpg -verdant_catacombs.jpg http://[server]/ZEN/Verdant%20Catacombs.full.jpg -verdant_eidolon.jpg http://[server]/DIS/Verdant%20Eidolon.full.jpg -verdant_embrace.jpg http://[server]/TSP/Verdant%20Embrace.full.jpg -verdant_field.jpg http://[server]/PY/Verdant%20Field.full.jpg -verdant_force.jpg http://[server]/10E/Verdant%20Force.full.jpg -verdant_succession.jpg http://[server]/OD/Verdant%20Succession.full.jpg -verdant_touch.jpg http://[server]/SH/Verdant%20Touch.full.jpg -verdeloth_the_ancient.jpg http://[server]/IN/Verdeloth%20the%20Ancient.full.jpg -verdigris.jpg http://[server]/TE/Verdigris.full.jpg -verduran_emissary.jpg http://[server]/IN/Verduran%20Emissary.full.jpg -verduran_enchantress.jpg http://[server]/9E/Verduran%20Enchantress.full.jpg -vermiculos.jpg http://[server]/MR/Vermiculos.full.jpg -vernal_bloom.jpg http://[server]/8E/Vernal%20Bloom.full.jpg -vernal_equinox.jpg http://[server]/MM/Vernal%20Equinox.full.jpg -vertigo.jpg http://[server]/6E/Vertigo.full.jpg -vertigo_spawn.jpg http://[server]/GP/Vertigo%20Spawn.full.jpg -vesper_ghoul.jpg http://[server]/DIS/Vesper%20Ghoul.full.jpg -vesuva.jpg http://[server]/TSP/Vesuva.full.jpg -vesuvan_doppelganger.jpg http://[server]/U/Vesuvan%20Doppelganger.full.jpg -vesuvan_shapeshifter.jpg http://[server]/TSP/Vesuvan%20Shapeshifter.full.jpg -veteran_armorer.jpg http://[server]/RAV/Veteran%20Armorer.full.jpg -veteran_armorsmith.jpg http://[server]/M10/Veteran%20Armorsmith.full.jpg -veteran_bodyguard.jpg http://[server]/U/Veteran%20Bodyguard.full.jpg -veteran_brawlers.jpg http://[server]/PY/Veteran%20Brawlers.full.jpg -veteran_cavalier.jpg http://[server]/9E/Veteran%20Cavalier.full.jpg -veteran_explorer.jpg http://[server]/WL/Veteran%20Explorer.full.jpg -veteran_of_the_depths.jpg http://[server]/LRW/Veteran%20of%20the%20Depths.full.jpg -veteran_swordsmith.jpg http://[server]/M10/Veteran%20Swordsmith.full.jpg -veterans_armaments.jpg http://[server]/MOR/Veteran's%20Armaments.full.jpg -veterans_voice.jpg http://[server]/AL/Veteran's%20Voice1.full.jpg -vex.jpg http://[server]/DS/Vex.full.jpg -vexing_arcanix.jpg http://[server]/8E/Vexing%20Arcanix.full.jpg -vexing_beetle.jpg http://[server]/LE/Vexing%20Beetle.full.jpg -vexing_shusher.jpg http://[server]/SHM/Vexing%20Shusher.full.jpg -vexing_sphinx.jpg http://[server]/CS/Vexing%20Sphinx.full.jpg -vhati_il_dal.jpg http://[server]/TE/Vhati%20il-Dal.full.jpg -viashino_bey.jpg http://[server]/UL/Viashino%20Bey.full.jpg -viashino_bladescout.jpg http://[server]/TSP/Viashino%20Bladescout.full.jpg -viashino_cutthroat.jpg http://[server]/UL/Viashino%20Cutthroat.full.jpg -viashino_fangtail.jpg http://[server]/RAV/Viashino%20Fangtail.full.jpg -viashino_grappler.jpg http://[server]/IN/Viashino%20Grappler.full.jpg -viashino_heretic.jpg http://[server]/UL/Viashino%20Heretic.full.jpg -viashino_outrider.jpg http://[server]/US/Viashino%20Outrider.full.jpg -viashino_runner.jpg http://[server]/10E/Viashino%20Runner.full.jpg -viashino_sandscout.jpg http://[server]/10E/Viashino%20Sandscout.full.jpg -viashino_sandstalker.jpg http://[server]/9E/Viashino%20Sandstalker.full.jpg -viashino_sandswimmer.jpg http://[server]/US/Viashino%20Sandswimmer.full.jpg -viashino_skeleton.jpg http://[server]/ALA/Viashino%20Skeleton.full.jpg -viashino_slasher.jpg http://[server]/RAV/Viashino%20Slasher.full.jpg -viashino_slaughtermaster.jpg http://[server]/CFX/Viashino%20Slaughtermaster.full.jpg -viashino_spearhunter.jpg http://[server]/M10/Viashino%20Spearhunter.full.jpg -viashino_warrior.jpg http://[server]/6E/Viashino%20Warrior.full.jpg -viashino_weaponsmith.jpg http://[server]/US/Viashino%20Weaponsmith.full.jpg -viashivan_dragon.jpg http://[server]/VI/Viashivan%20Dragon.full.jpg -vibrating_sphere.jpg http://[server]/IA/Vibrating%20Sphere.full.jpg -vicious_betrayal.jpg http://[server]/FD/Vicious%20Betrayal.full.jpg -vicious_hunger.jpg http://[server]/8E/Vicious%20Hunger.full.jpg -vicious_kavu.jpg http://[server]/IN/Vicious%20Kavu.full.jpg -vicious_shadows.jpg http://[server]/ALA/Vicious%20Shadows.full.jpg -victimize.jpg http://[server]/US/Victimize.full.jpg -victual_sliver.jpg http://[server]/SH/Victual%20Sliver.full.jpg -view_from_above.jpg http://[server]/CFX/View%20from%20Above.full.jpg -vigean_graftmage.jpg http://[server]/DIS/Vigean%20Graftmage.full.jpg -vigean_hydropon.jpg http://[server]/DIS/Vigean%20Hydropon.full.jpg -vigean_intuition.jpg http://[server]/DIS/Vigean%20Intuition.full.jpg -vigilance.jpg http://[server]/CHK/Vigilance.full.jpg -vigilant_drake.jpg http://[server]/7E/Vigilant%20Drake.full.jpg -vigilant_martyr.jpg http://[server]/MI/Vigilant%20Martyr.full.jpg -vigilant_sentry.jpg http://[server]/JU/Vigilant%20Sentry.full.jpg -vigor.jpg http://[server]/LRW/Vigor.full.jpg -vigor_mortis.jpg http://[server]/RAV/Vigor%20Mortis.full.jpg -vigorous_charge.jpg http://[server]/IN/Vigorous%20Charge.full.jpg -vile_bile.jpg http://[server]/UNH/Vile%20Bile.full.jpg -vile_consumption.jpg http://[server]/IN/Vile%20Consumption.full.jpg -vile_deacon.jpg http://[server]/LE/Vile%20Deacon.full.jpg -vile_requiem.jpg http://[server]/US/Vile%20Requiem.full.jpg -village_elder.jpg http://[server]/MI/Village%20Elder.full.jpg -villainous_ogre.jpg http://[server]/CHK/Villainous%20Ogre.full.jpg -vindicate.jpg http://[server]/AP/Vindicate.full.jpg -vindictive_mob.jpg http://[server]/RAV/Vindictive%20Mob.full.jpg -vine_dryad.jpg http://[server]/MM/Vine%20Dryad.full.jpg -vine_kami.jpg http://[server]/CHK/Vine%20Kami.full.jpg -vine_trellis.jpg http://[server]/8E/Vine%20Trellis.full.jpg -vinelasher_kudzu.jpg http://[server]/RAV/Vinelasher%20Kudzu.full.jpg -vines_of_vastwood.jpg http://[server]/ZEN/Vines%20of%20Vastwood.full.jpg -vintara_elephant.jpg http://[server]/PY/Vintara%20Elephant.full.jpg -vintara_snapper.jpg http://[server]/PY/Vintara%20Snapper.full.jpg -violent_eruption.jpg http://[server]/TO/Violent%20Eruption.full.jpg -violent_outburst.jpg http://[server]/ARB/Violent%20Outburst.full.jpg -violent_ultimatum.jpg http://[server]/ALA/Violent%20Ultimatum.full.jpg -violet_pall.jpg http://[server]/MOR/Violet%20Pall.full.jpg -viridescent_wisps.jpg http://[server]/SHM/Viridescent%20Wisps.full.jpg -viridian_acolyte.jpg http://[server]/DS/Viridian%20Acolyte.full.jpg -viridian_joiner.jpg http://[server]/MR/Viridian%20Joiner.full.jpg -viridian_longbow.jpg http://[server]/MR/Viridian%20Longbow.full.jpg -viridian_lorebearers.jpg http://[server]/FD/Viridian%20Lorebearers.full.jpg -viridian_scout.jpg http://[server]/FD/Viridian%20Scout.full.jpg -viridian_shaman.jpg http://[server]/10E/Viridian%20Shaman.full.jpg -viridian_zealot.jpg http://[server]/DS/Viridian%20Zealot.full.jpg -virtues_ruin.jpg http://[server]/PT/Virtue's%20Ruin.full.jpg -virtuous_charge.jpg http://[server]/P3/Virtuous%20Charge.full.jpg -virulent_sliver.jpg http://[server]/FUT/Virulent%20Sliver.full.jpg -visara_the_dreadful.jpg http://[server]/ON/Visara%20the%20Dreadful.full.jpg -viscera_dragger.jpg http://[server]/ALA/Viscera%20Dragger.full.jpg -viscerid_armor.jpg http://[server]/AL/Viscerid%20Armor1.full.jpg -viscerid_deepwalker.jpg http://[server]/TSP/Viscerid%20Deepwalker.full.jpg -viscerid_drone.jpg http://[server]/AL/Viscerid%20Drone.full.jpg -viscid_lemures.jpg http://[server]/TSP/Viscid%20Lemures.full.jpg -viseling.jpg http://[server]/NE/Viseling.full.jpg -vision_charm.jpg http://[server]/VI/Vision%20Charm.full.jpg -vision_skeins.jpg http://[server]/DIS/Vision%20Skeins.full.jpg -visions.jpg http://[server]/LG/Visions.full.jpg -vital_surge.jpg http://[server]/BOK/Vital%20Surge.full.jpg -vitality_charm.jpg http://[server]/ON/Vitality%20Charm.full.jpg -vitalize.jpg http://[server]/6E/Vitalize.full.jpg -vitalizing_cascade.jpg http://[server]/MI/Vitalizing%20Cascade.full.jpg -vitalizing_wind.jpg http://[server]/PY/Vitalizing%20Wind.full.jpg -vitaspore_thallid.jpg http://[server]/PLC/Vitaspore%20Thallid.full.jpg -vithian_renegades.jpg http://[server]/ARB/Vithian%20Renegades.full.jpg -vithian_stinger.jpg http://[server]/ALA/Vithian%20Stinger.full.jpg -vitu_ghazi_the_city_tree.jpg http://[server]/RAV/Vitu-Ghazi,%20the%20City-Tree.full.jpg -vivid_crag.jpg http://[server]/LRW/Vivid%20Crag.full.jpg -vivid_creek.jpg http://[server]/LRW/Vivid%20Creek.full.jpg -vivid_grove.jpg http://[server]/LRW/Vivid%20Grove.full.jpg -vivid_marsh.jpg http://[server]/LRW/Vivid%20Marsh.full.jpg -vivid_meadow.jpg http://[server]/LRW/Vivid%20Meadow.full.jpg -vivify.jpg http://[server]/OD/Vivify.full.jpg -vizzerdrix.jpg http://[server]/9E/Vizzerdrix.full.jpg -vodalian_hypnotist.jpg http://[server]/IN/Vodalian%20Hypnotist.full.jpg -vodalian_illusionist.jpg http://[server]/WL/Vodalian%20Illusionist.full.jpg -vodalian_knights.jpg http://[server]/FE/Vodalian%20Knights.full.jpg -vodalian_mage.jpg http://[server]/FE/Vodalian%20Mage1.full.jpg -vodalian_merchant.jpg http://[server]/IN/Vodalian%20Merchant.full.jpg -vodalian_mystic.jpg http://[server]/AP/Vodalian%20Mystic.full.jpg -vodalian_serpent.jpg http://[server]/IN/Vodalian%20Serpent.full.jpg -vodalian_soldiers.jpg http://[server]/6E/Vodalian%20Soldiers.full.jpg -vodalian_war_machine.jpg http://[server]/FE/Vodalian%20War%20Machine.full.jpg -vodalian_zombie.jpg http://[server]/IN/Vodalian%20Zombie.full.jpg -voice_of_all.jpg http://[server]/10E/Voice%20of%20All.full.jpg -voice_of_duty.jpg http://[server]/UD/Voice%20of%20Duty.full.jpg -voice_of_grace.jpg http://[server]/US/Voice%20of%20Grace.full.jpg -voice_of_law.jpg http://[server]/US/Voice%20of%20Law.full.jpg -voice_of_reason.jpg http://[server]/UD/Voice%20of%20Reason.full.jpg -voice_of_the_woods.jpg http://[server]/EVG/Voice%20of%20the%20Woods.full.jpg -voice_of_truth.jpg http://[server]/NE/Voice%20of%20Truth.full.jpg -voices_from_the_void.jpg http://[server]/CFX/Voices%20from%20the%20Void.full.jpg -void.jpg http://[server]/IN/Void.full.jpg -void_maw.jpg http://[server]/CS/Void%20Maw.full.jpg -voidmage_apprentice.jpg http://[server]/LE/Voidmage%20Apprentice.full.jpg -voidmage_husher.jpg http://[server]/TSP/Voidmage%20Husher.full.jpg -voidmage_prodigy.jpg http://[server]/ON/Voidmage%20Prodigy.full.jpg -voidslime.jpg http://[server]/DIS/Voidslime.full.jpg -voidstone_gargoyle.jpg http://[server]/PLC/Voidstone%20Gargoyle.full.jpg -volcanic_awakening.jpg http://[server]/TSP/Volcanic%20Awakening.full.jpg -volcanic_dragon.jpg http://[server]/6E/Volcanic%20Dragon.full.jpg -volcanic_eruption.jpg http://[server]/4E/Volcanic%20Eruption.full.jpg -volcanic_fallout.jpg http://[server]/CFX/Volcanic%20Fallout.full.jpg -volcanic_geyser.jpg http://[server]/6E/Volcanic%20Geyser.full.jpg -volcanic_hammer.jpg http://[server]/9E/Volcanic%20Hammer.full.jpg -volcanic_island.jpg http://[server]/U/Volcanic%20Island.full.jpg -volcanic_spray.jpg http://[server]/OD/Volcanic%20Spray.full.jpg -volcanic_submersion.jpg http://[server]/ALA/Volcanic%20Submersion.full.jpg -volcanic_wind.jpg http://[server]/MM/Volcanic%20Wind.full.jpg -volcano_hellion.jpg http://[server]/PLC/Volcano%20Hellion.full.jpg -volcano_imp.jpg http://[server]/PS/Volcano%20Imp.full.jpg -volley_of_boulders.jpg http://[server]/OD/Volley%20of%20Boulders.full.jpg -volrath.jpg http://[server]/VG/Volrath.full.jpg -volrath_the_fallen.jpg http://[server]/NE/Volrath%20the%20Fallen.full.jpg -volraths_curse.jpg http://[server]/TE/Volrath's%20Curse.full.jpg -volraths_dungeon.jpg http://[server]/EX/Volrath's%20Dungeon.full.jpg -volraths_gardens.jpg http://[server]/SH/Volrath's%20Gardens.full.jpg -volraths_laboratory.jpg http://[server]/SH/Volrath's%20Laboratory.full.jpg -volraths_motion_sensor.jpg http://[server]/UG/Volrath's%20Motion%20Sensor.full.jpg -volraths_shapeshifter.jpg http://[server]/SH/Volrath's%20Shapeshifter.full.jpg -volraths_stronghold.jpg http://[server]/SH/Volrath's%20Stronghold.full.jpg -voltaic_construct.jpg http://[server]/DS/Voltaic%20Construct.full.jpg -voltaic_key.jpg http://[server]/US/Voltaic%20Key.full.jpg -volunteer_militia.jpg http://[server]/P3/Volunteer%20Militia.full.jpg -volunteer_reserves.jpg http://[server]/WL/Volunteer%20Reserves.full.jpg -voodoo_doll.jpg http://[server]/LG/Voodoo%20Doll.full.jpg -voracious_cobra.jpg http://[server]/IN/Voracious%20Cobra.full.jpg -voracious_dragon.jpg http://[server]/CFX/Voracious%20Dragon.full.jpg -voracious_hatchling.jpg http://[server]/EVE/Voracious%20Hatchling.full.jpg -vorosh_the_hunter.jpg http://[server]/PLC/Vorosh,%20the%20Hunter.full.jpg -vorrac_battlehorns.jpg http://[server]/MR/Vorrac%20Battlehorns.full.jpg -votary_of_the_conclave.jpg http://[server]/RAV/Votary%20of%20the%20Conclave.full.jpg -voyager_staff.jpg http://[server]/RAV/Voyager%20Staff.full.jpg -vug_lizard.jpg http://[server]/US/Vug%20Lizard.full.jpg -vulshok_battlegear.jpg http://[server]/MR/Vulshok%20Battlegear.full.jpg -vulshok_battlemaster.jpg http://[server]/MR/Vulshok%20Battlemaster.full.jpg -vulshok_berserker.jpg http://[server]/MR/Vulshok%20Berserker.full.jpg -vulshok_gauntlets.jpg http://[server]/MR/Vulshok%20Gauntlets.full.jpg -vulshok_morningstar.jpg http://[server]/9E/Vulshok%20Morningstar.full.jpg -vulshok_sorcerer.jpg http://[server]/FD/Vulshok%20Sorcerer.full.jpg -vulshok_war_boar.jpg http://[server]/DS/Vulshok%20War%20Boar.full.jpg -vulturous_zombie.jpg http://[server]/RAV/Vulturous%20Zombie.full.jpg \ No newline at end of file diff --git a/res/pics_link/card-pictures_w.txt b/res/pics_link/card-pictures_w.txt deleted file mode 100644 index 7fdbfc32484..00000000000 --- a/res/pics_link/card-pictures_w.txt +++ /dev/null @@ -1,446 +0,0 @@ -wail_of_the_nim.jpg http://[server]/MR/Wail%20of%20the%20Nim.full.jpg -waiting_in_the_weeds.jpg http://[server]/6E/Waiting%20in%20the%20Weeds.full.jpg -wake_of_destruction.jpg http://[server]/UD/Wake%20of%20Destruction.full.jpg -wake_of_vultures.jpg http://[server]/VI/Wake%20of%20Vultures.full.jpg -wake_thrasher.jpg http://[server]/EVE/Wake%20Thrasher.full.jpg -wakestone_gargoyle.jpg http://[server]/DIS/Wakestone%20Gargoyle.full.jpg -waking_nightmare.jpg http://[server]/CHK/Waking%20Nightmare.full.jpg -walk_the_aeons.jpg http://[server]/TSP/Walk%20the%20Aeons.full.jpg -walker_of_secret_ways.jpg http://[server]/BOK/Walker%20of%20Secret%20Ways.full.jpg -walker_of_the_grove.jpg http://[server]/MOR/Walker%20of%20the%20Grove.full.jpg -walking_archive.jpg http://[server]/DIS/Walking%20Archive.full.jpg -walking_dead.jpg http://[server]/LG/Walking%20Dead.full.jpg -walking_desecration.jpg http://[server]/ON/Walking%20Desecration.full.jpg -walking_dream.jpg http://[server]/SH/Walking%20Dream.full.jpg -walking_sponge.jpg http://[server]/UL/Walking%20Sponge.full.jpg -walking_wall.jpg http://[server]/IA/Walking%20Wall.full.jpg -wall_of_air.jpg http://[server]/10E/Wall%20of%20Air.full.jpg -wall_of_blood.jpg http://[server]/MR/Wall%20of%20Blood.full.jpg -wall_of_blossoms.jpg http://[server]/SH/Wall%20of%20Blossoms.full.jpg -wall_of_bone.jpg http://[server]/M10/Wall%20of%20Bone.full.jpg -wall_of_brambles.jpg http://[server]/5E/Wall%20of%20Brambles.full.jpg -wall_of_caltrops.jpg http://[server]/LG/Wall%20of%20Caltrops.full.jpg -wall_of_corpses.jpg http://[server]/MI/Wall%20of%20Corpses.full.jpg -wall_of_deceit.jpg http://[server]/LE/Wall%20of%20Deceit.full.jpg -wall_of_denial.jpg http://[server]/ARB/Wall%20of%20Denial.full.jpg -wall_of_diffusion.jpg http://[server]/TE/Wall%20of%20Diffusion.full.jpg -wall_of_distortion.jpg http://[server]/MM/Wall%20of%20Distortion.full.jpg -wall_of_dust.jpg http://[server]/4E/Wall%20of%20Dust.full.jpg -wall_of_earth.jpg http://[server]/LG/Wall%20of%20Earth.full.jpg -wall_of_essence.jpg http://[server]/SH/Wall%20of%20Essence.full.jpg -wall_of_faith.jpg http://[server]/M10/Wall%20of%20Faith.full.jpg -wall_of_fire.jpg http://[server]/M10/Wall%20of%20Fire.full.jpg -wall_of_frost.jpg http://[server]/M10/Wall%20of%20Frost.full.jpg -wall_of_glare.jpg http://[server]/UD/Wall%20of%20Glare.full.jpg -wall_of_granite.jpg http://[server]/PT/Wall%20of%20Granite.full.jpg -wall_of_heat.jpg http://[server]/LG/Wall%20of%20Heat.full.jpg -wall_of_hope.jpg http://[server]/LE/Wall%20of%20Hope.full.jpg -wall_of_ice.jpg http://[server]/4E/Wall%20of%20Ice.full.jpg -wall_of_junk.jpg http://[server]/US/Wall%20of%20Junk.full.jpg -wall_of_kelp.jpg http://[server]/HL/Wall%20of%20Kelp.full.jpg -wall_of_lava.jpg http://[server]/IA/Wall%20of%20Lava.full.jpg -wall_of_light.jpg http://[server]/LG/Wall%20of%20Light.full.jpg -wall_of_mulch.jpg http://[server]/ON/Wall%20of%20Mulch.full.jpg -wall_of_nets.jpg http://[server]/EX/Wall%20of%20Nets.full.jpg -wall_of_opposition.jpg http://[server]/LG/Wall%20of%20Opposition.full.jpg -wall_of_pine_needles.jpg http://[server]/IA/Wall%20of%20Pine%20Needles.full.jpg -wall_of_putrid_flesh.jpg http://[server]/LG/Wall%20of%20Putrid%20Flesh.full.jpg -wall_of_razors.jpg http://[server]/SH/Wall%20of%20Razors.full.jpg -wall_of_resistance.jpg http://[server]/MI/Wall%20of%20Resistance.full.jpg -wall_of_reverence.jpg http://[server]/CFX/Wall%20of%20Reverence.full.jpg -wall_of_roots.jpg http://[server]/MI/Wall%20of%20Roots.full.jpg -wall_of_shadows.jpg http://[server]/LG/Wall%20of%20Shadows.full.jpg -wall_of_shards.jpg http://[server]/CS/Wall%20of%20Shards.full.jpg -wall_of_shields.jpg http://[server]/IA/Wall%20of%20Shields.full.jpg -wall_of_souls.jpg http://[server]/SH/Wall%20of%20Souls.full.jpg -wall_of_spears.jpg http://[server]/8E/Wall%20of%20Spears.full.jpg -wall_of_stone.jpg http://[server]/8E/Wall%20of%20Stone.full.jpg -wall_of_swords.jpg http://[server]/10E/Wall%20of%20Swords.full.jpg -wall_of_tears.jpg http://[server]/SH/Wall%20of%20Tears.full.jpg -wall_of_tombstones.jpg http://[server]/LG/Wall%20of%20Tombstones.full.jpg -wall_of_vapor.jpg http://[server]/LG/Wall%20of%20Vapor.full.jpg -wall_of_vipers.jpg http://[server]/PY/Wall%20of%20Vipers.full.jpg -wall_of_water.jpg http://[server]/4E/Wall%20of%20Water.full.jpg -wall_of_wonder.jpg http://[server]/7E/Wall%20of%20Wonder.full.jpg -wall_of_wood.jpg http://[server]/10E/Wall%20of%20Wood.full.jpg -wallop.jpg http://[server]/IN/Wallop.full.jpg -wand_of_denial.jpg http://[server]/6E/Wand%20of%20Denial.full.jpg -wand_of_ith.jpg http://[server]/DK/Wand%20of%20Ith.full.jpg -wand_of_the_elements.jpg http://[server]/DS/Wand%20of%20the%20Elements.full.jpg -wanderbrine_rootcutters.jpg http://[server]/SHM/Wanderbrine%20Rootcutters.full.jpg -wanderers_twig.jpg http://[server]/LRW/Wanderer's%20Twig.full.jpg -wanderguard_sentry.jpg http://[server]/9E/Wanderguard%20Sentry.full.jpg -wandering_eye.jpg http://[server]/NE/Wandering%20Eye.full.jpg -wandering_goblins.jpg http://[server]/CFX/Wandering%20Goblins.full.jpg -wandering_graybeard.jpg http://[server]/MOR/Wandering%20Graybeard.full.jpg -wandering_mage.jpg http://[server]/AL/Wandering%20Mage.full.jpg -wandering_ones.jpg http://[server]/CHK/Wandering%20Ones.full.jpg -wandering_stream.jpg http://[server]/IN/Wandering%20Stream.full.jpg -wanderlust.jpg http://[server]/5E/Wanderlust.full.jpg -wanderwine_hub.jpg http://[server]/LRW/Wanderwine%20Hub.full.jpg -wanderwine_prophets.jpg http://[server]/LRW/Wanderwine%20Prophets.full.jpg -waning_wurm.jpg http://[server]/PLC/Waning%20Wurm.full.jpg -war_barge.jpg http://[server]/DK/War%20Barge.full.jpg -war_cadence.jpg http://[server]/MM/War%20Cadence.full.jpg -war_chariot.jpg http://[server]/IA/War%20Chariot.full.jpg -war_dance.jpg http://[server]/US/War%20Dance.full.jpg -war_elemental.jpg http://[server]/MR/War%20Elemental.full.jpg -war_elephant.jpg http://[server]/CH/War%20Elephant.full.jpg -war_mammoth.jpg http://[server]/5E/War%20Mammoth.full.jpg -war_spike_changeling.jpg http://[server]/MOR/War-Spike%20Changeling.full.jpg -war_tax.jpg http://[server]/MM/War%20Tax.full.jpg -war_torch_goblin.jpg http://[server]/RAV/War-Torch%20Goblin.full.jpg -warbreak_trumpeter.jpg http://[server]/LE/Warbreak%20Trumpeter.full.jpg -ward_of_bones.jpg http://[server]/EVE/Ward%20of%20Bones.full.jpg -ward_of_lights.jpg http://[server]/MI/Ward%20of%20Lights.full.jpg -ward_of_piety.jpg http://[server]/BOK/Ward%20of%20Piety.full.jpg -ward_sliver.jpg http://[server]/LE/Ward%20Sliver.full.jpg -wargate.jpg http://[server]/ARB/Wargate.full.jpg -warmonger.jpg http://[server]/MM/Warmonger.full.jpg -warmth.jpg http://[server]/6E/Warmth.full.jpg -warning.jpg http://[server]/IA/Warning.full.jpg -warp_artifact.jpg http://[server]/5E/Warp%20Artifact.full.jpg -warp_world.jpg http://[server]/M10/Warp%20World.full.jpg -warpath.jpg http://[server]/MM/Warpath.full.jpg -warpath_ghoul.jpg http://[server]/M10/Warpath%20Ghoul.full.jpg -warped_devotion.jpg http://[server]/8E/Warped%20Devotion.full.jpg -warped_researcher.jpg http://[server]/LE/Warped%20Researcher.full.jpg -warping_wurm.jpg http://[server]/MI/Warping%20Wurm.full.jpg -warren_instigator.jpg http://[server]/ZEN/Warren%20Instigator.full.jpg -warren_pilferers.jpg http://[server]/LRW/Warren%20Pilferers.full.jpg -warren_scourge_elf.jpg http://[server]/LRW/Warren-Scourge%20Elf.full.jpg -warren_weirding.jpg http://[server]/MOR/Warren%20Weirding.full.jpg -warrior_angel.jpg http://[server]/SH/Warrior%20Angel.full.jpg -warrior_en_kor.jpg http://[server]/SH/Warrior%20en-Kor.full.jpg -warriors_charge.jpg http://[server]/PT/Warrior's%20Charge1.full.jpg -warriors_honor.jpg http://[server]/10E/Warrior's%20Honor.full.jpg -warriors_oath.jpg http://[server]/P3/Warrior's%20Oath.full.jpg -warriors_stand.jpg http://[server]/P2/Warrior's%20Stand.full.jpg -wars_toll.jpg http://[server]/DIS/War's%20Toll.full.jpg -warthog.jpg http://[server]/6E/Warthog.full.jpg -wash_out.jpg http://[server]/IN/Wash%20Out.full.jpg -wasp_lancer.jpg http://[server]/SHM/Wasp%20Lancer.full.jpg -waste_away.jpg http://[server]/TO/Waste%20Away.full.jpg -wasteland.jpg http://[server]/TE/Wasteland.full.jpg -watchdog.jpg http://[server]/TE/Watchdog.full.jpg -watcher_sliver.jpg http://[server]/TSP/Watcher%20Sliver.full.jpg -watchwing_scarecrow.jpg http://[server]/SHM/Watchwing%20Scarecrow.full.jpg -watchwolf.jpg http://[server]/RAV/Watchwolf.full.jpg -water_elemental.jpg http://[server]/B/Water%20Elemental.full.jpg -water_gun_balloon_game.jpg http://[server]/UNH/Water%20Gun%20Balloon%20Game.full.jpg -water_wurm.jpg http://[server]/DK/Water%20Wurm.full.jpg -waterfront_bouncer.jpg http://[server]/MM/Waterfront%20Bouncer.full.jpg -waterspout_djinn.jpg http://[server]/VI/Waterspout%20Djinn.full.jpg -waterspout_elemental.jpg http://[server]/PS/Waterspout%20Elemental.full.jpg -waterspout_weavers.jpg http://[server]/MOR/Waterspout%20Weavers.full.jpg -waterveil_cavern.jpg http://[server]/CHK/Waterveil%20Cavern.full.jpg -watery_grave.jpg http://[server]/RAV/Watery%20Grave.full.jpg -wave_elemental.jpg http://[server]/MI/Wave%20Elemental.full.jpg -wave_of_indifference.jpg http://[server]/ON/Wave%20of%20Indifference.full.jpg -wave_of_reckoning.jpg http://[server]/MM/Wave%20of%20Reckoning.full.jpg -wave_of_terror.jpg http://[server]/WL/Wave%20of%20Terror.full.jpg -waves_of_aggression.jpg http://[server]/EVE/Waves%20of%20Aggression.full.jpg -waveskimmer_aven.jpg http://[server]/ALA/Waveskimmer%20Aven.full.jpg -waxmane_baku.jpg http://[server]/BOK/Waxmane%20Baku.full.jpg -waxwane.jpg http://[server]/IN/WaxWane.full.jpg -wayfarers_bauble.jpg http://[server]/FD/Wayfarer's%20Bauble.full.jpg -wayfaring_giant.jpg http://[server]/IN/Wayfaring%20Giant.full.jpg -waylay.jpg http://[server]/US/Waylay.full.jpg -wayward_angel.jpg http://[server]/OD/Wayward%20Angel.full.jpg -wayward_soul.jpg http://[server]/EX/Wayward%20Soul.full.jpg -weakness.jpg http://[server]/M10/Weakness.full.jpg -weakstone.jpg http://[server]/AQ/Weakstone.full.jpg -wear_away.jpg http://[server]/CHK/Wear%20Away.full.jpg -weathered_bodyguards.jpg http://[server]/TSP/Weathered%20Bodyguards.full.jpg -weathered_wayfarer.jpg http://[server]/9E/Weathered%20Wayfarer.full.jpg -weatherseed_elf.jpg http://[server]/UL/Weatherseed%20Elf.full.jpg -weatherseed_faeries.jpg http://[server]/UL/Weatherseed%20Faeries.full.jpg -weatherseed_totem.jpg http://[server]/TSP/Weatherseed%20Totem.full.jpg -weatherseed_treefolk.jpg http://[server]/UL/Weatherseed%20Treefolk.full.jpg -weaver_of_lies.jpg http://[server]/LE/Weaver%20of%20Lies.full.jpg -web.jpg http://[server]/9E/Web.full.jpg -web_of_inertia.jpg http://[server]/JU/Web%20of%20Inertia.full.jpg -wee_dragonauts.jpg http://[server]/GP/Wee%20Dragonauts.full.jpg -weed_pruner_poplar.jpg http://[server]/MOR/Weed-Pruner%20Poplar.full.jpg -weed_strangle.jpg http://[server]/LRW/Weed%20Strangle.full.jpg -wei_ambush_force.jpg http://[server]/P3/Wei%20Ambush%20Force.full.jpg -wei_assassins.jpg http://[server]/P3/Wei%20Assassins.full.jpg -wei_elite_companions.jpg http://[server]/P3/Wei%20Elite%20Companions.full.jpg -wei_infantry.jpg http://[server]/P3/Wei%20Infantry.full.jpg -wei_night_raiders.jpg http://[server]/P3/Wei%20Night%20Raiders.full.jpg -wei_scout.jpg http://[server]/P3/Wei%20Scout.full.jpg -wei_strike_force.jpg http://[server]/P3/Wei%20Strike%20Force.full.jpg -weight_of_conscience.jpg http://[server]/MOR/Weight%20of%20Conscience.full.jpg -weight_of_spires.jpg http://[server]/DIS/Weight%20of%20Spires.full.jpg -weird_harvest.jpg http://[server]/9E/Weird%20Harvest.full.jpg -weirding_shaman.jpg http://[server]/MOR/Weirding%20Shaman.full.jpg -welding_jar.jpg http://[server]/MR/Welding%20Jar.full.jpg -welkin_guide.jpg http://[server]/ALA/Welkin%20Guide.full.jpg -welkin_hawk.jpg http://[server]/EX/Welkin%20Hawk.full.jpg -welkin_tern.jpg http://[server]/ZEN/Welkin%20Tern.full.jpg -well_laid_plans.jpg http://[server]/IN/Well-Laid%20Plans.full.jpg -well_of_discovery.jpg http://[server]/PY/Well%20of%20Discovery.full.jpg -well_of_knowledge.jpg http://[server]/WL/Well%20of%20Knowledge.full.jpg -well_of_life.jpg http://[server]/PY/Well%20of%20Life.full.jpg -well_of_lost_dreams.jpg http://[server]/DS/Well%20of%20Lost%20Dreams.full.jpg -wellgabber_apothecary.jpg http://[server]/LRW/Wellgabber%20Apothecary.full.jpg -wellspring.jpg http://[server]/MI/Wellspring.full.jpg -wellwisher.jpg http://[server]/ON/Wellwisher.full.jpg -werebear.jpg http://[server]/OD/Werebear.full.jpg -western_paladin.jpg http://[server]/8E/Western%20Paladin.full.jpg -wet_willie_of_the_damned.jpg http://[server]/UNH/Wet%20Willie%20of%20the%20Damned.full.jpg -whalebone_glider.jpg http://[server]/IA/Whalebone%20Glider.full.jpg -wheel_and_deal.jpg http://[server]/ON/Wheel%20and%20Deal.full.jpg -wheel_of_fate.jpg http://[server]/TSP/Wheel%20of%20Fate.full.jpg -wheel_of_fortune.jpg http://[server]/U/Wheel%20of%20Fortune.full.jpg -wheel_of_sun_and_moon.jpg http://[server]/SHM/Wheel%20of%20Sun%20and%20Moon.full.jpg -wheel_of_torture.jpg http://[server]/UL/Wheel%20of%20Torture.full.jpg -when_fluffy_bunnies_attack.jpg http://[server]/UNH/When%20Fluffy%20Bunnies%20Attack.full.jpg -where_ancients_tread.jpg http://[server]/ALA/Where%20Ancients%20Tread.full.jpg -whetstone.jpg http://[server]/US/Whetstone.full.jpg -whetwheel.jpg http://[server]/FUT/Whetwheel.full.jpg -whim_of_volrath.jpg http://[server]/TE/Whim%20of%20Volrath.full.jpg -whimwader.jpg http://[server]/SHM/Whimwader.full.jpg -whip_sergeant.jpg http://[server]/9E/Whip%20Sergeant.full.jpg -whip_silk.jpg http://[server]/IN/Whip%20Silk.full.jpg -whip_spine_drake.jpg http://[server]/FUT/Whip-Spine%20Drake.full.jpg -whip_vine.jpg http://[server]/AL/Whip%20Vine1.full.jpg -whipcorder.jpg http://[server]/ON/Whipcorder.full.jpg -whipgrass_entangler.jpg http://[server]/LE/Whipgrass%20Entangler.full.jpg -whipkeeper.jpg http://[server]/OD/Whipkeeper.full.jpg -whiplash_trap.jpg http://[server]/HOP/Whiplash%20Trap.full.jpg -whippoorwill.jpg http://[server]/DK/Whippoorwill.full.jpg -whipstitched_zombie.jpg http://[server]/PY/Whipstitched%20Zombie.full.jpg -whiptail_moloch.jpg http://[server]/DIS/Whiptail%20Moloch.full.jpg -whiptail_wurm.jpg http://[server]/PT/Whiptail%20Wurm.full.jpg -whiptongue_frog.jpg http://[server]/EX/Whiptongue%20Frog.full.jpg -whirling_catapult.jpg http://[server]/AL/Whirling%20Catapult.full.jpg -whirling_dervish.jpg http://[server]/5E/Whirling%20Dervish.full.jpg -whirlpool_drake.jpg http://[server]/AP/Whirlpool%20Drake.full.jpg -whirlpool_rider.jpg http://[server]/AP/Whirlpool%20Rider.full.jpg -whirlpool_warrior.jpg http://[server]/AP/Whirlpool%20Warrior.full.jpg -whirlpool_whelm.jpg http://[server]/LRW/Whirlpool%20Whelm.full.jpg -whirlwind.jpg http://[server]/ST/Whirlwind.full.jpg -whispering_shade.jpg http://[server]/OD/Whispering%20Shade.full.jpg -whispers_of_the_muse.jpg http://[server]/TE/Whispers%20of%20the%20Muse.full.jpg -whispersilk_cloak.jpg http://[server]/M10/Whispersilk%20Cloak.full.jpg -white_knight.jpg http://[server]/M10/White%20Knight.full.jpg -white_mana_battery.jpg http://[server]/4E/White%20Mana%20Battery.full.jpg -white_scarab.jpg http://[server]/IA/White%20Scarab.full.jpg -white_shield_crusader.jpg http://[server]/CS/White%20Shield%20Crusader.full.jpg -white_ward.jpg http://[server]/4E/White%20Ward.full.jpg -whitemane_lion.jpg http://[server]/PLC/Whitemane%20Lion.full.jpg -whiteout.jpg http://[server]/IA/Whiteout.full.jpg -who_what_when_where_why.jpg http://[server]/UNH/Who%20What%20When%20Where%20Why.full.jpg -wicked_akuba.jpg http://[server]/CHK/Wicked%20Akuba.full.jpg -wicked_pact.jpg http://[server]/PT/Wicked%20Pact.full.jpg -wicked_reward.jpg http://[server]/VI/Wicked%20Reward.full.jpg -wicker_warcrawler.jpg http://[server]/SHM/Wicker%20Warcrawler.full.jpg -wickerbough_elder.jpg http://[server]/EVE/Wickerbough%20Elder.full.jpg -wielding_the_green_dragon.jpg http://[server]/P3/Wielding%20the%20Green%20Dragon.full.jpg -wiitigo.jpg http://[server]/IA/Wiitigo.full.jpg -wild_aesthir.jpg http://[server]/AL/Wild%20Aesthir1.full.jpg -wild_cantor.jpg http://[server]/GP/Wild%20Cantor.full.jpg -wild_colos.jpg http://[server]/UD/Wild%20Colos.full.jpg -wild_dogs.jpg http://[server]/US/Wild%20Dogs.full.jpg -wild_elephant.jpg http://[server]/MI/Wild%20Elephant.full.jpg -wild_griffin.jpg http://[server]/10E/Wild%20Griffin.full.jpg -wild_growth.jpg http://[server]/7E/Wild%20Growth.full.jpg -wild_jhovall.jpg http://[server]/MM/Wild%20Jhovall.full.jpg -wild_leotau.jpg http://[server]/CFX/Wild%20Leotau.full.jpg -wild_mammoth.jpg http://[server]/NE/Wild%20Mammoth.full.jpg -wild_might.jpg http://[server]/PY/Wild%20Might.full.jpg -wild_mongrel.jpg http://[server]/OD/Wild%20Mongrel.full.jpg -wild_nacatl.jpg http://[server]/ALA/Wild%20Nacatl.full.jpg -wild_ox.jpg http://[server]/ST/Wild%20Ox.full.jpg -wild_pair.jpg http://[server]/PLC/Wild%20Pair.full.jpg -wild_research.jpg http://[server]/AP/Wild%20Research.full.jpg -wild_ricochet.jpg http://[server]/LRW/Wild%20Ricochet.full.jpg -wild_swing.jpg http://[server]/SHM/Wild%20Swing.full.jpg -wild_wurm.jpg http://[server]/TE/Wild%20Wurm.full.jpg -wilderness_elemental.jpg http://[server]/CS/Wilderness%20Elemental.full.jpg -wilderness_hypnotist.jpg http://[server]/EVE/Wilderness%20Hypnotist.full.jpg -wildfield_borderpost.jpg http://[server]/ARB/Wildfield%20Borderpost.full.jpg -wildfire.jpg http://[server]/9E/Wildfire.full.jpg -wildfire_emissary.jpg http://[server]/MI/Wildfire%20Emissary.full.jpg -wildsize.jpg http://[server]/GP/Wildsize.full.jpg -wildslayer_elves.jpg http://[server]/SHM/Wildslayer%20Elves.full.jpg -will_o_the_wisp.jpg http://[server]/9E/Will-o'-the-Wisp.full.jpg -willbender.jpg http://[server]/LE/Willbender.full.jpg -willow_dryad.jpg http://[server]/PT/Willow%20Dryad.full.jpg -willow_elf.jpg http://[server]/ST/Willow%20Elf.full.jpg -willow_faerie.jpg http://[server]/HL/Willow%20Faerie1.full.jpg -willow_priestess.jpg http://[server]/HL/Willow%20Priestess.full.jpg -willow_satyr.jpg http://[server]/LG/Willow%20Satyr.full.jpg -wilt_leaf_cavaliers.jpg http://[server]/SHM/Wilt-Leaf%20Cavaliers.full.jpg -wilt_leaf_liege.jpg http://[server]/SHM/Wilt-Leaf%20Liege.full.jpg -wind_dancer.jpg http://[server]/7E/Wind%20Dancer.full.jpg -wind_drake.jpg http://[server]/M10/Wind%20Drake.full.jpg -wind_sail.jpg http://[server]/ST/Wind%20Sail.full.jpg -wind_shear.jpg http://[server]/VI/Wind%20Shear.full.jpg -wind_spirit.jpg http://[server]/6E/Wind%20Spirit.full.jpg -windborn_muse.jpg http://[server]/10E/Windborn%20Muse.full.jpg -windborne_charge.jpg http://[server]/ZEN/Windborne%20Charge.full.jpg -windbrisk_heights.jpg http://[server]/LRW/Windbrisk%20Heights.full.jpg -windbrisk_raptor.jpg http://[server]/SHM/Windbrisk%20Raptor.full.jpg -windfall.jpg http://[server]/US/Windfall.full.jpg -winding_canyons.jpg http://[server]/WL/Winding%20Canyons.full.jpg -winding_wurm.jpg http://[server]/US/Winding%20Wurm.full.jpg -windreaper_falcon.jpg http://[server]/MI/Windreaper%20Falcon.full.jpg -windreaver.jpg http://[server]/DIS/Windreaver.full.jpg -windrider_eel.jpg http://[server]/ZEN/Windrider%20Eel.full.jpg -winds_of_change.jpg http://[server]/5E/Winds%20of%20Change.full.jpg -winds_of_rath.jpg http://[server]/TE/Winds%20of%20Rath.full.jpg -windscouter.jpg http://[server]/PY/Windscouter.full.jpg -windseeker_centaur.jpg http://[server]/HPB/Windseeker%20Centaur.full.jpg -windstorm.jpg http://[server]/M10/Windstorm.full.jpg -windswept_heath.jpg http://[server]/JGC/Windswept%20Heath.full.jpg -windwright_mage.jpg http://[server]/ALA/Windwright%20Mage.full.jpg -wine_of_blood_and_iron.jpg http://[server]/SOK/Wine%20of%20Blood%20and%20Iron.full.jpg -wing_shards.jpg http://[server]/SC/Wing%20Shards.full.jpg -wing_snare.jpg http://[server]/8E/Wing%20Snare.full.jpg -wing_storm.jpg http://[server]/PY/Wing%20Storm.full.jpg -wingbeat_warrior.jpg http://[server]/LE/Wingbeat%20Warrior.full.jpg -winged_coatl.jpg http://[server]/ARB/Winged%20Coatl.full.jpg -winged_sliver.jpg http://[server]/TE/Winged%20Sliver.full.jpg -wingrattle_scarecrow.jpg http://[server]/SHM/Wingrattle%20Scarecrow.full.jpg -wings_of_aesthir.jpg http://[server]/IA/Wings%20of%20Aesthir.full.jpg -wings_of_hope.jpg http://[server]/IN/Wings%20of%20Hope.full.jpg -wings_of_velis_vel.jpg http://[server]/LRW/Wings%20of%20Velis%20Vel.full.jpg -winnow.jpg http://[server]/IN/Winnow.full.jpg -winnower_patrol.jpg http://[server]/MOR/Winnower%20Patrol.full.jpg -winter_blast.jpg http://[server]/5E/Winter%20Blast.full.jpg -winter_orb.jpg http://[server]/5E/Winter%20Orb.full.jpg -winter_sky.jpg http://[server]/HL/Winter%20Sky.full.jpg -wintermoon_mesa.jpg http://[server]/PY/Wintermoon%20Mesa.full.jpg -winters_chill.jpg http://[server]/IA/Winter's%20Chill.full.jpg -winters_grasp.jpg http://[server]/PT/Winter's%20Grasp.full.jpg -winters_night.jpg http://[server]/AL/Winter's%20Night.full.jpg -wipe_away.jpg http://[server]/TSP/Wipe%20Away.full.jpg -wipe_clean.jpg http://[server]/SC/Wipe%20Clean.full.jpg -wirecat.jpg http://[server]/US/Wirecat.full.jpg -wirefly_hive.jpg http://[server]/DS/Wirefly%20Hive.full.jpg -wirewood_channeler.jpg http://[server]/LE/Wirewood%20Channeler.full.jpg -wirewood_elf.jpg http://[server]/ON/Wirewood%20Elf.full.jpg -wirewood_guardian.jpg http://[server]/SC/Wirewood%20Guardian.full.jpg -wirewood_herald.jpg http://[server]/ON/Wirewood%20Herald.full.jpg -wirewood_hivemaster.jpg http://[server]/LE/Wirewood%20Hivemaster.full.jpg -wirewood_lodge.jpg http://[server]/ON/Wirewood%20Lodge.full.jpg -wirewood_pride.jpg http://[server]/ON/Wirewood%20Pride.full.jpg -wirewood_savage.jpg http://[server]/ON/Wirewood%20Savage.full.jpg -wirewood_symbiote.jpg http://[server]/SC/Wirewood%20Symbiote.full.jpg -wishmonger.jpg http://[server]/MM/Wishmonger.full.jpg -wispmare.jpg http://[server]/LRW/Wispmare.full.jpg -wistful_selkie.jpg http://[server]/EVE/Wistful%20Selkie.full.jpg -wistful_thinking.jpg http://[server]/PLC/Wistful%20Thinking.full.jpg -witch_engine.jpg http://[server]/US/Witch%20Engine.full.jpg -witch_hunter.jpg http://[server]/DK/Witch%20Hunter.full.jpg -witch_maw_nephilim.jpg http://[server]/GP/Witch-Maw%20Nephilim.full.jpg -witchs_mist.jpg http://[server]/FUT/Witch's%20Mist.full.jpg -withdraw.jpg http://[server]/PY/Withdraw.full.jpg -withered_wretch.jpg http://[server]/LE/Withered%20Wretch.full.jpg -withering_boon.jpg http://[server]/MI/Withering%20Boon.full.jpg -withering_gaze.jpg http://[server]/9E/Withering%20Gaze.full.jpg -withering_hex.jpg http://[server]/ON/Withering%20Hex.full.jpg -withering_wisps.jpg http://[server]/IA/Withering%20Wisps.full.jpg -witherscale_wurm.jpg http://[server]/SHM/Witherscale%20Wurm.full.jpg -withstand.jpg http://[server]/GP/Withstand.full.jpg -wits_end.jpg http://[server]/DIS/Wit's%20End.full.jpg -wizard_mentor.jpg http://[server]/US/Wizard%20Mentor.full.jpg -wizard_replica.jpg http://[server]/MR/Wizard%20Replica.full.jpg -wizards_school.jpg http://[server]/HL/Wizards'%20School.full.jpg -wizened_cenn.jpg http://[server]/LRW/Wizened%20Cenn.full.jpg -wizened_snitches.jpg http://[server]/RAV/Wizened%20Snitches.full.jpg -woebearer.jpg http://[server]/MR/Woebearer.full.jpg -woebringer_demon.jpg http://[server]/RAV/Woebringer%20Demon.full.jpg -woeleecher.jpg http://[server]/SHM/Woeleecher.full.jpg -wojek_apothecary.jpg http://[server]/RAV/Wojek%20Apothecary.full.jpg -wojek_embermage.jpg http://[server]/RAV/Wojek%20Embermage.full.jpg -wojek_siren.jpg http://[server]/RAV/Wojek%20Siren.full.jpg -wolf_pack.jpg http://[server]/P3/Wolf%20Pack.full.jpg -wolf_skull_shaman.jpg http://[server]/MOR/Wolf-Skull%20Shaman.full.jpg -wolverine_pack.jpg http://[server]/5E/Wolverine%20Pack.full.jpg -wonder.jpg http://[server]/JU/Wonder.full.jpg -wood_elemental.jpg http://[server]/LG/Wood%20Elemental.full.jpg -wood_elves.jpg http://[server]/9E/Wood%20Elves.full.jpg -wood_sage.jpg http://[server]/TE/Wood%20Sage.full.jpg -woodcloaker.jpg http://[server]/SC/Woodcloaker.full.jpg -wooded_bastion.jpg http://[server]/SHM/Wooded%20Bastion.full.jpg -wooded_foothills.jpg http://[server]/ON/Wooded%20Foothills.full.jpg -wooden_sphere.jpg http://[server]/8E/Wooden%20Sphere.full.jpg -woodfall_primus.jpg http://[server]/SHM/Woodfall%20Primus.full.jpg -woodland_changeling.jpg http://[server]/LRW/Woodland%20Changeling.full.jpg -woodland_druid.jpg http://[server]/OD/Woodland%20Druid.full.jpg -woodland_guidance.jpg http://[server]/LRW/Woodland%20Guidance.full.jpg -woodlurker_mimic.jpg http://[server]/EVE/Woodlurker%20Mimic.full.jpg -woodripper.jpg http://[server]/NE/Woodripper.full.jpg -woodwraith_corrupter.jpg http://[server]/RAV/Woodwraith%20Corrupter.full.jpg -woodwraith_strangler.jpg http://[server]/RAV/Woodwraith%20Strangler.full.jpg -woolly_mammoths.jpg http://[server]/IA/Woolly%20Mammoths.full.jpg -woolly_razorback.jpg http://[server]/CS/Woolly%20Razorback.full.jpg -woolly_spider.jpg http://[server]/AT/Woolly%20Spider.full.jpg -woolly_thoctar.jpg http://[server]/ALA/Woolly%20Thoctar.full.jpg -word_of_binding.jpg http://[server]/4E/Word%20of%20Binding.full.jpg -word_of_blasting.jpg http://[server]/5E/Word%20of%20Blasting.full.jpg -word_of_command.jpg http://[server]/U/Word%20of%20Command.full.jpg -word_of_seizing.jpg http://[server]/TSP/Word%20of%20Seizing.full.jpg -word_of_undoing.jpg http://[server]/IA/Word%20of%20Undoing.full.jpg -wordmail.jpg http://[server]/UNH/Wordmail.full.jpg -words_of_war.jpg http://[server]/ON/Words%20of%20War.full.jpg -words_of_waste.jpg http://[server]/ON/Words%20of%20Waste.full.jpg -words_of_wilding.jpg http://[server]/ON/Words%20of%20Wilding.full.jpg -words_of_wind.jpg http://[server]/ON/Words%20of%20Wind.full.jpg -words_of_wisdom.jpg http://[server]/OD/Words%20of%20Wisdom.full.jpg -words_of_worship.jpg http://[server]/ON/Words%20of%20Worship.full.jpg -workhorse.jpg http://[server]/EX/Workhorse.full.jpg -working_stiff.jpg http://[server]/UNH/Working%20Stiff.full.jpg -world_bottling_kit.jpg http://[server]/UNH/World-Bottling%20Kit.full.jpg -world_queller.jpg http://[server]/ZEN/World%20Queller.full.jpg -worldgorger_dragon.jpg http://[server]/JU/Worldgorger%20Dragon.full.jpg -worldheart_phoenix.jpg http://[server]/CFX/Worldheart%20Phoenix.full.jpg -worldly_counsel.jpg http://[server]/IN/Worldly%20Counsel.full.jpg -worldly_tutor.jpg http://[server]/6E/Worldly%20Tutor.full.jpg -worldpurge.jpg http://[server]/SHM/Worldpurge.full.jpg -worldslayer.jpg http://[server]/MR/Worldslayer.full.jpg -worm_harvest.jpg http://[server]/EVE/Worm%20Harvest.full.jpg -wormfang_behemoth.jpg http://[server]/JU/Wormfang%20Behemoth.full.jpg -wormfang_crab.jpg http://[server]/JU/Wormfang%20Crab.full.jpg -wormfang_drake.jpg http://[server]/JU/Wormfang%20Drake.full.jpg -wormfang_manta.jpg http://[server]/JU/Wormfang%20Manta.full.jpg -wormfang_newt.jpg http://[server]/JU/Wormfang%20Newt.full.jpg -wormfang_turtle.jpg http://[server]/JU/Wormfang%20Turtle.full.jpg -worms_of_the_earth.jpg http://[server]/DK/Worms%20of%20the%20Earth.full.jpg -wormwood_dryad.jpg http://[server]/TSP/Wormwood%20Dryad.full.jpg -wormwood_treefolk.jpg http://[server]/DK/Wormwood%20Treefolk.full.jpg -worn_powerstone.jpg http://[server]/US/Worn%20Powerstone.full.jpg -worry_beads.jpg http://[server]/MM/Worry%20Beads.full.jpg -worship.jpg http://[server]/9E/Worship.full.jpg -wort_boggart_auntie.jpg http://[server]/LRW/Wort,%20Boggart%20Auntie.full.jpg -wort_the_raidmother.jpg http://[server]/SHM/Wort,%20the%20Raidmother.full.jpg -worthy_cause.jpg http://[server]/TE/Worthy%20Cause.full.jpg -wound_reflection.jpg http://[server]/SHM/Wound%20Reflection.full.jpg -wrap_in_vigor.jpg http://[server]/FUT/Wrap%20in%20Vigor.full.jpg -wrath_of_god.jpg http://[server]/10E/Wrath%20of%20God.full.jpg -wrath_of_marit_lage.jpg http://[server]/8E/Wrath%20of%20Marit%20Lage.full.jpg -wreak_havoc.jpg http://[server]/GP/Wreak%20Havoc.full.jpg -wrecking_ball.jpg http://[server]/DIS/Wrecking%20Ball.full.jpg -wrench_mind.jpg http://[server]/MR/Wrench%20Mind.full.jpg -wrens_run_packmaster.jpg http://[server]/LRW/Wren's%20Run%20Packmaster.full.jpg -wrens_run_vanquisher.jpg http://[server]/LRW/Wren's%20Run%20Vanquisher.full.jpg -wretched_anurid.jpg http://[server]/ON/Wretched%20Anurid.full.jpg -wretched_banquet.jpg http://[server]/CFX/Wretched%20Banquet.full.jpg -writ_of_passage.jpg http://[server]/DIS/Writ%20of%20Passage.full.jpg -wu_admiral.jpg http://[server]/P3/Wu%20Admiral.full.jpg -wu_elite_cavalry.jpg http://[server]/P3/Wu%20Elite%20Cavalry.full.jpg -wu_infantry.jpg http://[server]/P3/Wu%20Infantry.full.jpg -wu_light_cavalry.jpg http://[server]/P3/Wu%20Light%20Cavalry.full.jpg -wu_longbowman.jpg http://[server]/P3/Wu%20Longbowman.full.jpg -wu_scout.jpg http://[server]/P3/Wu%20Scout.full.jpg -wu_spy.jpg http://[server]/P3/Wu%20Spy.full.jpg -wu_warship.jpg http://[server]/P3/Wu%20Warship.full.jpg -wurmcalling.jpg http://[server]/TSP/Wurmcalling.full.jpg -wurms_tooth.jpg http://[server]/M10/Wurm's%20Tooth.full.jpg -wurmskin_forger.jpg http://[server]/MR/Wurmskin%20Forger.full.jpg -wurmweaver_coil.jpg http://[server]/GP/Wurmweaver%20Coil.full.jpg -wydwen_the_biting_gale.jpg http://[server]/LRW/Wydwen,%20the%20Biting%20Gale.full.jpg -wyluli_wolf.jpg http://[server]/6E/Wyluli%20Wolf.full.jpg \ No newline at end of file diff --git a/res/pics_link/card-pictures_x.txt b/res/pics_link/card-pictures_x.txt deleted file mode 100644 index ef91596b145..00000000000 --- a/res/pics_link/card-pictures_x.txt +++ /dev/null @@ -1,8 +0,0 @@ -xantcha.jpg http://[server]/VG/Xantcha.full.jpg -xanthic_statue.jpg http://[server]/WL/Xanthic%20Statue.full.jpg -xantid_swarm.jpg http://[server]/SC/Xantid%20Swarm.full.jpg -xathrid_demon.jpg http://[server]/M10/Xathrid%20Demon.full.jpg -xenic_poltergeist.jpg http://[server]/5E/Xenic%20Poltergeist.full.jpg -xiahou_dun_the_one_eyed.jpg http://[server]/P3/Xiahou%20Dun,%20the%20One-Eyed.full.jpg -xira_arien.jpg http://[server]/CH/Xira%20Arien.full.jpg -xun_yu_wei_advisor.jpg http://[server]/P3/Xun%20Yu,%20Wei%20Advisor.full.jpg \ No newline at end of file diff --git a/res/pics_link/card-pictures_y.txt b/res/pics_link/card-pictures_y.txt deleted file mode 100644 index aaa25230835..00000000000 --- a/res/pics_link/card-pictures_y.txt +++ /dev/null @@ -1,41 +0,0 @@ -yamabushis_flame.jpg http://[server]/CHK/Yamabushi's%20Flame.full.jpg -yamabushis_storm.jpg http://[server]/CHK/Yamabushi's%20Storm.full.jpg -yare.jpg http://[server]/MI/Yare.full.jpg -yavimaya_ancients.jpg http://[server]/AL/Yavimaya%20Ancients1.full.jpg -yavimaya_ants.jpg http://[server]/AL/Yavimaya%20Ants.full.jpg -yavimaya_barbarian.jpg http://[server]/IN/Yavimaya%20Barbarian.full.jpg -yavimaya_coast.jpg http://[server]/10E/Yavimaya%20Coast.full.jpg -yavimaya_dryad.jpg http://[server]/TSP/Yavimaya%20Dryad.full.jpg -yavimaya_elder.jpg http://[server]/UD/Yavimaya%20Elder.full.jpg -yavimaya_enchantress.jpg http://[server]/10E/Yavimaya%20Enchantress.full.jpg -yavimaya_gnats.jpg http://[server]/IA/Yavimaya%20Gnats.full.jpg -yavimaya_granger.jpg http://[server]/UL/Yavimaya%20Granger.full.jpg -yavimaya_hollow.jpg http://[server]/UD/Yavimaya%20Hollow.full.jpg -yavimaya_kavu.jpg http://[server]/IN/Yavimaya%20Kavu.full.jpg -yavimaya_scion.jpg http://[server]/UL/Yavimaya%20Scion.full.jpg -yavimaya_wurm.jpg http://[server]/BD/Yavimaya%20Wurm.full.jpg -yavimayas_embrace.jpg http://[server]/AP/Yavimaya's%20Embrace.full.jpg -yawgmoth_demon.jpg http://[server]/9E/Yawgmoth%20Demon.full.jpg -yawgmoths_agenda.jpg http://[server]/IN/Yawgmoth's%20Agenda.full.jpg -yawgmoths_bargain.jpg http://[server]/UD/Yawgmoth's%20Bargain.full.jpg -yawgmoths_edict.jpg http://[server]/7E/Yawgmoth's%20Edict.full.jpg -yawgmoths_will.jpg http://[server]/US/Yawgmoth's%20Will.full.jpg -yawning_fissure.jpg http://[server]/M10/Yawning%20Fissure.full.jpg -ydwen_efreet.jpg http://[server]/AN/Ydwen%20Efreet.full.jpg -yellow_scarves_cavalry.jpg http://[server]/P3/Yellow%20Scarves%20Cavalry.full.jpg -yellow_scarves_general.jpg http://[server]/P3/Yellow%20Scarves%20General.full.jpg -yellow_scarves_troops.jpg http://[server]/P3/Yellow%20Scarves%20Troops.full.jpg -yet_another_aether_vortex.jpg http://[server]/UNH/Yet%20Another%20AEther%20Vortex.full.jpg -yixlid_jailer.jpg http://[server]/FUT/Yixlid%20Jailer.full.jpg -yoke_of_the_damned.jpg http://[server]/CFX/Yoke%20of%20the%20Damned.full.jpg -yoked_plowbeast.jpg http://[server]/ALA/Yoked%20Plowbeast.full.jpg -yomiji_who_bars_the_way.jpg http://[server]/BOK/Yomiji,%20Who%20Bars%20the%20Way.full.jpg -yore_tiller_nephilim.jpg http://[server]/GP/Yore-Tiller%20Nephilim.full.jpg -yosei_the_morning_star.jpg http://[server]/CHK/Yosei,%20the%20Morning%20Star.full.jpg -yotian_soldier.jpg http://[server]/4E/Yotian%20Soldier.full.jpg -young_wei_recruits.jpg http://[server]/P3/Young%20Wei%20Recruits.full.jpg -youthful_knight.jpg http://[server]/10E/Youthful%20Knight.full.jpg -yuan_shao_the_indecisive.jpg http://[server]/P3/Yuan%20Shao,%20the%20Indecisive.full.jpg -yuan_shaos_infantry.jpg http://[server]/P3/Yuan%20Shao's%20Infantry.full.jpg -yuki_onna.jpg http://[server]/SOK/Yuki-Onna.full.jpg -yukora_the_prisoner.jpg http://[server]/BOK/Yukora,%20the%20Prisoner.full.jpg \ No newline at end of file diff --git a/res/pics_link/card-pictures_z.txt b/res/pics_link/card-pictures_z.txt deleted file mode 100644 index 35e709fc9a5..00000000000 --- a/res/pics_link/card-pictures_z.txt +++ /dev/null @@ -1,67 +0,0 @@ -zanam_djinn.jpg http://[server]/IN/Zanam%20Djinn.full.jpg -zap.jpg http://[server]/IN/Zap.full.jpg -zealot_il_vec.jpg http://[server]/TSP/Zealot%20il-Vec.full.jpg -zealots_en_dal.jpg http://[server]/EX/Zealots%20en-Dal.full.jpg -zealous_guardian.jpg http://[server]/SHM/Zealous%20Guardian.full.jpg -zealous_inquisitor.jpg http://[server]/9E/Zealous%20Inquisitor.full.jpg -zealous_persecution.jpg http://[server]/ARB/Zealous%20Persecution.full.jpg -zebra_unicorn.jpg http://[server]/MI/Zebra%20Unicorn.full.jpg -zektar_shrine_expedition.jpg http://[server]/ZEN/Zektar%20Shrine%20Expedition.full.jpg -zelyon_sword.jpg http://[server]/FE/Zelyon%20Sword.full.jpg -zendikar_farguide.jpg http://[server]/ZEN/Zendikar%20Farguide.full.jpg -zephid.jpg http://[server]/US/Zephid.full.jpg -zephids_embrace.jpg http://[server]/US/Zephid's%20Embrace.full.jpg -zephyr_falcon.jpg http://[server]/5E/Zephyr%20Falcon.full.jpg -zephyr_net.jpg http://[server]/LRW/Zephyr%20Net.full.jpg -zephyr_spirit.jpg http://[server]/RAV/Zephyr%20Spirit.full.jpg -zephyr_sprite.jpg http://[server]/M10/Zephyr%20Sprite.full.jpg -zerapa_minotaur.jpg http://[server]/PY/Zerapa%20Minotaur.full.jpg -zhalfirin_commander.jpg http://[server]/MI/Zhalfirin%20Commander.full.jpg -zhalfirin_crusader.jpg http://[server]/VI/Zhalfirin%20Crusader.full.jpg -zhalfirin_knight.jpg http://[server]/MI/Zhalfirin%20Knight.full.jpg -zhang_fei_fierce_warrior.jpg http://[server]/P3/Zhang%20Fei,%20Fierce%20Warrior.full.jpg -zhang_he_wei_general.jpg http://[server]/P3/Zhang%20He,%20Wei%20General.full.jpg -zhang_liao_hero_of_hefei.jpg http://[server]/P3/Zhang%20Liao,%20Hero%20of%20Hefei.full.jpg -zhao_zilong_tiger_general.jpg http://[server]/P3/Zhao%20Zilong,%20Tiger%20General.full.jpg -zhou_yu_chief_commander.jpg http://[server]/P3/Zhou%20Yu,%20Chief%20Commander.full.jpg -zhuge_jin_wu_strategist.jpg http://[server]/P3/Zhuge%20Jin,%20Wu%20Strategist.full.jpg -zirilan_of_the_claw.jpg http://[server]/MI/Zirilan%20of%20the%20Claw.full.jpg -zo_zu_the_punisher.jpg http://[server]/CHK/Zo-Zu%20the%20Punisher.full.jpg -zodiac_dog.jpg http://[server]/P3/Zodiac%20Dog.full.jpg -zodiac_dragon.jpg http://[server]/P3/Zodiac%20Dragon.full.jpg -zodiac_goat.jpg http://[server]/P3/Zodiac%20Goat.full.jpg -zodiac_horse.jpg http://[server]/P3/Zodiac%20Horse.full.jpg -zodiac_monkey.jpg http://[server]/9E/Zodiac%20Monkey.full.jpg -zodiac_ox.jpg http://[server]/P3/Zodiac%20Ox.full.jpg -zodiac_pig.jpg http://[server]/P3/Zodiac%20Pig.full.jpg -zodiac_rabbit.jpg http://[server]/P3/Zodiac%20Rabbit.full.jpg -zodiac_rat.jpg http://[server]/P3/Zodiac%20Rat.full.jpg -zodiac_rooster.jpg http://[server]/P3/Zodiac%20Rooster.full.jpg -zodiac_snake.jpg http://[server]/P3/Zodiac%20Snake.full.jpg -zodiac_tiger.jpg http://[server]/P3/Zodiac%20Tiger.full.jpg -zoetic_cavern.jpg http://[server]/FUT/Zoetic%20Cavern.full.jpg -zombie.jpg http://[server]/UG/Zombie.full.jpg -zombie_assassin.jpg http://[server]/OD/Zombie%20Assassin.full.jpg -zombie_boa.jpg http://[server]/AP/Zombie%20Boa.full.jpg -zombie_brute.jpg http://[server]/LE/Zombie%20Brute.full.jpg -zombie_cannibal.jpg http://[server]/OD/Zombie%20Cannibal.full.jpg -zombie_cutthroat.jpg http://[server]/SC/Zombie%20Cutthroat.full.jpg -zombie_fanboy.jpg http://[server]/UNH/Zombie%20Fanboy.full.jpg -zombie_goliath.jpg http://[server]/M10/Zombie%20Goliath.full.jpg -zombie_infestation.jpg http://[server]/OD/Zombie%20Infestation.full.jpg -zombie_master.jpg http://[server]/6E/Zombie%20Master.full.jpg -zombie_mob.jpg http://[server]/MI/Zombie%20Mob.full.jpg -zombie_musher.jpg http://[server]/CS/Zombie%20Musher.full.jpg -zombie_outlander.jpg http://[server]/CFX/Zombie%20Outlander.full.jpg -zombie_scavengers.jpg http://[server]/WL/Zombie%20Scavengers.full.jpg -zombie_trailblazer.jpg http://[server]/TO/Zombie%20Trailblazer.full.jpg -zombify.jpg http://[server]/9E/Zombify.full.jpg -zoologist.jpg http://[server]/OD/Zoologist.full.jpg -zuberi_golden_feather.jpg http://[server]/MI/Zuberi,%20Golden%20Feather.full.jpg -zuo_ci_the_mocking_sage.jpg http://[server]/P3/Zuo%20Ci,%20the%20Mocking%20Sage.full.jpg -zur_the_enchanter.jpg http://[server]/CS/Zur%20the%20Enchanter.full.jpg -zuran_enchanter.jpg http://[server]/IA/Zuran%20Enchanter.full.jpg -zuran_orb.jpg http://[server]/IA/Zuran%20Orb.full.jpg -zuran_spellcaster.jpg http://[server]/IA/Zuran%20Spellcaster.full.jpg -zurs_weirding.jpg http://[server]/9E/Zur's%20Weirding.full.jpg -zzzyxass_abyss.jpg http://[server]/UNH/Zzzyxas's%20Abyss.full.jpg \ No newline at end of file diff --git a/res/quest/all-prices.txt b/res/quest/all-prices.txt deleted file mode 100644 index 7d790666c25..00000000000 --- a/res/quest/all-prices.txt +++ /dev/null @@ -1,10592 +0,0 @@ -Abandon Hope =25 -Abandoned Outpost =25 -Abbey Gargoyles =10 -Abbey Matron =25 -Abduction =25 -Abeyance =270 -Abjure =25 -Abolish =25 -Abomination =4 -Aboroth =19 -Aboshan, Cephalid Emperor =99 -Aboshan's Desire =25 -About Face =25 -Absolute Grace =25 -Absolute Law =25 -Absolver Thrull =25 -Absorb =191 -Absorb Vis =20 -Abu Ja'far =100 -Abuna's Chant =25 -Abundance =49 -Abyssal Gatekeeper =56 -Abyssal Horror =62 -Abyssal Hunter =56 -Abyssal Nightstalker =25 -Abyssal Nocturnus =74 -Abyssal Specter =25 -Academy Rector =326 -Academy Researchers =25 -Academy Ruins =226 -Accelerate =25 -Accelerated Mutation =26 -Acceptable Losses =25 -Accumulated Knowledge =26 -Accursed Centaur =25 -Acid Rain =1099 -Acidic Dagger =74 -Acidic Slime =25 -Acidic Sliver =25 -Acidic Soil =38 -Acolyte of Xathrid =25 -Acorn Harvest =25 -Acquire =49 -Acridian =25 -Act of Treason =25 -Active Volcano =11 -Ad Nauseam =64 -Adamaro, First to Desire =47 -Adarkar Sentinel =9 -Adarkar Unicorn =25 -Adarkar Valkyrie =348 -Adarkar Wastes =87 -Adarkar Windform =25 -Adder-Staff Boggart =25 -Addle =25 -Adun Oakenshield =900 -Advance Scout =25 -Advanced Hoverguard =25 -Adventurers' Guildhouse =139 -Adventuring Gear =25 -Advice from the Fae =25 -Aegis of Honor =31 -Aegis of the Meek =49 -Aeolipile =46 -Aeon Chronicler =36 -AErathi Berserker =99 -Aerial Caravan =25 -Aerie Mystics =27 -Aerie Ouphes =50 -Aesthetic Consultation =99 -Aesthir Glider =12 -AEther Barrier =25 -AEther Burst =25 -AEther Charge =25 -AEther Figment =25 -AEther Flash =25 -AEther Membrane =25 -AEther Mutation =12 -AEther Rift =78 -AEther Shockwave =10 -AEther Snap =119 -AEther Spellbomb =25 -AEther Sting =25 -AEther Storm =3 -AEther Tide =26 -AEther Vial =893 -AEther Web =26 -AEtherflame Wall =17 -AEthermage's Touch =25 -AEtherplasm =25 -AEthersnipe =25 -AEthertow =25 -Afflict =25 -Afiya Grove =74 -Afterlife =25 -Aftershock =25 -Ageless Entity =100 -Ageless Sentinels =13 -Agent of Masks =25 -Agent of Shauku =25 -Agent of Stromgald =12 -Aggravated Assault =77 -Aggression =50 -Aggressive Urge =25 -Agility =25 -Agonizing Demise =25 -Agonizing Memories =25 -Agony Warp =25 -Agrus Kos, Wojek Veteran =44 -Air Bladder =25 -Air Elemental =25 -Airborne Aid =25 -Airdrop Condor =25 -Aisling Leprechaun =33 -Ajani Goldmane =547 -Ajani Vengeant =754 -Akki Avalanchers =25 -Akki Blizzard-Herder =17 -Akki Coalflinger =19 -Akki Drillmaster =25 -Akki Lavarunner =25 -Akki Raider =99 -Akki Rockspeaker =25 -Akki Underling =25 -Akki Underminer =19 -Akoum Refuge =26 -Akrasan Squire =29 -Akroma, Angel of Fury =250 -Akroma, Angel of Wrath =398 -Akroma's Blessing =33 -Akroma's Devoted =48 -Akroma's Memorial =503 -Akroma's Vengeance =78 -Akron Legionnaire =38 -Aku Djinn =98 -Akuta, Born of Ash =200 -Al-abara's Carpet =674 -Alabaster Dragon =99 -Alabaster Leech =25 -Alabaster Potion =25 -Alabaster Wall =25 -Alaborn Cavalier =99 -Alaborn Grenadier =25 -Alaborn Veteran =135 -Alaborn Zealot =7 -Aladdin =100 -Aladdin's Lamp =99 -Aladdin's Ring =25 -Alarum =99 -Albino Troll =99 -Alchor's Tomb =338 -Aleatory =99 -Alert Shu Infantry =100 -Alexi, Zephyr Mage =99 -Alexi's Cloak =25 -Algae Gharial =25 -Ali Baba =31 -Ali from Cairo =3651 -Aliban's Tower =25 -All Hallow's Eve =2410 -All Suns' Dawn =161 -Allay =25 -Alley Grifters =25 -Allied Strategies =25 -Allosaurus Rider =84 -Alloy Golem =25 -Alluring Scent =49 -Alluring Siren =25 -Alms =25 -Alpha Kavu =23 -Alpha Myr =25 -Alpha Status =89 -Altar Golem =50 -Altar of Bone =74 -Altar of Dementia =320 -Altar of Shadows =38 -Altar's Light =12 -Alter Reality =28 -Aluren =298 -Ambassador Laquatus =64 -Ambassador Oak =18 -Amber Prison =25 -Ambiguity =100 -Ambition's Cost =25 -Ambush =439 -Ambush Commander =107 -Ambush Party =25 -Amnesia =50 -Amoeboid Changeling =25 -Amok =100 -Amphibious Kavu =26 -Amrou Kithkin =25 -Amrou Scout =25 -Amrou Seekers =26 -Amugaba =25 -Amulet of Kroog =8 -Amulet of Quoz =48 -Amulet of Unmaking =70 -An-Havva Constable =49 -An-Havva Inn =25 -An-Havva Township =99 -An-Zerrin Ruins =56 -Ana Battlemage =25 -Ana Disciple =26 -Ana Sanctuary =50 -Anaba Ancestor =47 -Anaba Bodyguard =25 -Anaba Shaman =25 -Anaba Spirit Crafter =55 -Anaconda =6 -Anarchist =25 -Anarchy =99 -Anathemancer =50 -Anavolver =36 -Ancestor's Chosen =25 -Ancestor's Prophet =74 -Ancestral Knowledge =68 -Ancestral Mask =35 -Ancestral Memories =25 -Ancestral Recall =35100 -Ancestral Tribute =41 -Ancestral Vision =378 -Ancient Amphitheater =49 -Ancient Craving =137 -Ancient Den =61 -Ancient Grudge =25 -Ancient Hydra =25 -Ancient Kavu =25 -Ancient Ooze =68 -Ancient Runes =100 -Ancient Silverback =42 -Ancient Spider =52 -Ancient Spring =25 -Ancient Tomb =420 -Ancient Ziggurat =77 -Andradite Leech =25 -Angel of Despair =486 -Angel of Fury =393 -Angel of Light =1211 -Angel of Mercy =6 -Angel of Retribution =62 -Angel of Salvation =80 -Angel Token =172 -Angel's Feather =25 -Angel's Grace =87 -Angel's Herald =25 -Angel's Mercy =20 -Angel's Trumpet =60 -Angelfire Crusader =26 -Angelic Benediction =25 -Angelic Blessing =25 -Angelic Chorus =85 -Angelic Curator =5 -Angelic Favor =25 -Angelic Page =5 -Angelic Protector =48 -Angelic Renewal =25 -Angelic Shield =50 -Angelic Voices =97 -Angelic Wall =25 -Angelsong =31 -Anger =34 -Angry Mob =15 -Angus Mackenzie =590 -Animal Boneyard =48 -Animal Magnetism =112 -Animate Artifact =14 -Animate Dead =60 -Animate Land =6 -Animate Wall =25 -Ankh of Mishra =12 -Annex =25 -Annihilate =25 -Annul =25 -Anodet Lurker =25 -Anoint =25 -Ant Queen =64 -Antagonism =26 -Anthem of Rakdos =25 -Anthroplasm =25 -Anti-Magic Aura =15 -Antler Skulkin =25 -Anurid Barkripper =25 -Anurid Brushhopper =75 -Anurid Murkdiver =25 -Anurid Scavenger =8 -Anurid Swarmsnapper =25 -Anvil of Bogardan =225 -Apathy =25 -Apes of Rath =49 -Apex Hawks =14 -Aphetto Alchemist =39 -Aphetto Dredging =25 -Aphetto Exterminator =50 -Aphetto Grifter =36 -Aphetto Runecaster =99 -Aphetto Vulture =25 -Aphotic Wisps =25 -Apocalypse Chime =25 -Apocalypse Hydra =110 -Apothecary Initiate =68 -Apprentice Necromancer =51 -Apprentice Sorcerer =52 -Apprentice Wizard =25 -Aquamoeba =36 -Aquamorph Entity =17 -Aquastrand Spider =25 -Aquitect's Will =31 -Araba Mothrider =25 -Arachnoid =25 -Arashi, the Sky Asunder =49 -Arbiter of Knollridge =21 -Arboria =114 -Arc Blade =25 -Arc Lightning =25 -Arc Mage =25 -Arc-Slogger =61 -Arcades Sabboth =39 -Arcane Denial =35 -Arcane Laboratory =29 -Arcane Sanctum =101 -Arcane Spyglass =25 -Arcane Teachings =25 -Arcanis the Omnipotent =89 -Arcanum Wings =25 -Arcbound Bruiser =25 -Arcbound Crusher =49 -Arcbound Fiend =49 -Arcbound Hybrid =25 -Arcbound Lancer =99 -Arcbound Overseer =59 -Arcbound Ravager =933 -Arcbound Reclaimer =48 -Arcbound Slith =36 -Arcbound Stinger =25 -Arcbound Wanderer =99 -Arcbound Worker =31 -Archaeological Dig =56 -Archangel =128 -Archdemon of Unx =41 -Archery Training =38 -Architects of Will =99 -Archive Trap =178 -Archivist =24 -Archmage Ascension =30 -Archon of Justice =31 -Arctic Flats =61 -Arctic Foxes =25 -Arctic Merfolk =26 -Arctic Nishoba =25 -Arctic Wolves =6 -Arcum Dagsson =99 -Arcum's Sleigh =9 -Arcum's Weathervane =25 -Arcum's Whistle =25 -Ardent Militia =17 -Ardent Plea =36 -Ardent Soldier =25 -Arena =124 -Arena of the Ancients =99 -Arenson's Aura =25 -Argivian Archaeologist =644 -Argivian Blacksmith =99 -Argivian Find =25 -Argivian Restoration =36 -Argothian Elder =99 -Argothian Enchantress =751 -Argothian Pixies =25 -Argothian Swine =25 -Argothian Treefolk =39 -Argothian Wurm =139 -Arid Mesa =893 -Ark of Blight =25 -Armadillo Cloak =29 -Armageddon =99 -Armageddon Clock =17 -Armament Master =39 -Armed Response =25 -Armillary Sphere =20 -Armistice =25 -Armor of Faith =25 -Armor of Thorns =49 -Armor Sliver =25 -Armor Thrull =25 -Armored Ascension =38 -Armored Galleon =45 -Armored Guardian =99 -Armored Pegasus =25 -Armorer Guildmage =33 -Arms Dealer =25 -Army Ants =62 -Army of Allah =296 -Arnjlot's Ascent =25 -Arrest =25 -Arrogant Vampire =6 -Arrogant Wurm =71 -Arrow Volley Trap =49 -Arsenal Thresher =25 -Artifact Blast =25 -Artifact Mutation =82 -Artifact Possession =39 -Artifact Ward =25 -Artificer's Intuition =99 -Artificial Evolution =74 -Ascendant Evincar =111 -Ascending Aven =25 -Asha's Favor =25 -Ashcoat Bear =25 -Ashen Firebeast =50 -Ashen Ghoul =56 -Ashen Monstrosity =25 -Ashen Powder =100 -Ashen-Skin Zubera =36 -Ashenmoor Cohort =25 -Ashenmoor Gouger =33 -Ashenmoor Liege =152 -Ashes to Ashes =25 -Ashling the Pilgrim =31 -Ashling, the Extinguisher =84 -Ashling's Prerogative =25 -Ashnod's Altar =5 -Ashnod's Battle Gear =33 -Ashnod's Coupon =400 -Ashnod's Cylix =25 -Ashnod's Transmogrant =8 -Asmira, Holy Avenger =33 -Aspect of Mongoose =25 -Aspect of Wolf =50 -Ass Whuppin' =199 -Assassinate =25 -Assault Zeppelid =25 -Assault/Battery =25 -Assembly Hall =36 -Assembly-Worker =4 -Assert Authority =99 -Assquatch =25 -Astral Slide =25 -Astral Steel =26 -Astrolabe =39 -Atalya, Samite Master =100 -Atog =25 -Atogatog =43 -Attrition =63 -Attunement =83 -Augur il-Vec =25 -Augur of Skulls =25 -Augury Adept =80 -Auntie's Hovel =83 -Auntie's Snitch =35 -Aura Barbs =25 -Aura Blast =25 -Aura Extraction =25 -Aura Flux =26 -Aura Fracture =25 -Aura Graft =25 -Aura Mutation =75 -Aura of Dominion =6 -Aura of Silence =12 -Aura Shards =60 -Aura Thief =125 -Auramancer =25 -Auramancer's Guise =29 -Auratog =28 -Auratouched Mage =6 -Aurification =99 -Auriok Bladewarden =12 -Auriok Champion =149 -Auriok Glaivemaster =5 -Auriok Salvagers =49 -Auriok Siege Sled =99 -Auriok Steelshaper =88 -Auriok Transfixer =5 -Auriok Windwalker =39 -Aurochs =10 -Aurochs Herd =25 -Aurora Eidolon =5 -Aurora Griffin =26 -Auspicious Ancestor =149 -Austere Command =88 -Autochthon Wurm =50 -Autumn Willow =93 -Avalanche =100 -Avalanche Riders =19 -Avarax =25 -Avarice Totem =99 -Avatar of Discord =117 -Avatar of Fury =217 -Avatar of Hope =54 -Avatar of Me =75 -Avatar of Might =55 -Avatar of Will =85 -Avatar of Woe =260 -Aven Archer =25 -Aven Augur =25 -Aven Brigadier =99 -Aven Cloudchaser =5 -Aven Envoy =25 -Aven Farseer =5 -Aven Fateshaper =25 -Aven Fisher =25 -Aven Flock =5 -Aven Fogbringer =25 -Aven Liberator =5 -Aven Mimeomancer =44 -Aven Mindcensor =25 -Aven Redeemer =25 -Aven Riftwatcher =25 -Aven Shrine =25 -Aven Smokeweaver =25 -Aven Soulgazer =25 -Aven Squire =20 -Aven Trailblazer =20 -Aven Trooper =25 -Aven Warhawk =50 -Aven Windreader =25 -Avenger en-Dal =25 -Avenging Angel =64 -Avenging Druid =25 -Avian Changeling =25 -Avizoa =99 -Avoid Fate =34 -Awakener Druid =90 -Awakening =61 -Awakening Zone=749 -Awe Strike =25 -Awesome Presence =12 -Axegrinder Giant =25 -Axelrod Gunnarson =25 -Ayesha Tanaka =25 -Aysen Abbey =50 -Aysen Bureaucrats =25 -Aysen Crusader =121 -Aysen Highway =10 -Ayumi, the Last Visitor =47 -Azami, Lady of Scrolls =75 -Azimaet Drake =15 -Azorius ARthermage =25 -Azorius Chancery =17 -Azorius First-Wing =25 -Azorius Guildmage =54 -Azorius Herald =33 -Azorius Ploy =25 -Azorius Signet =25 -Azure Drake =25 -Azusa, Lost but Seeking =137 -Back to Basics =402 -Backdraft =125 -Backfire =9 -Backlash =115 -Backslide =25 -Bad Moon =99 -Bad River =62 -Badlands =2672 -Baki's Curse =48 -Baku Altar =38 -Bala Ged Thief =29 -Balance =150 -Balance of Power =6 -Balancing Act =99 -Balduvian Barbarians =25 -Balduvian Bears =25 -Balduvian Conjurer =25 -Balduvian Dead =99 -Balduvian Fallen =25 -Balduvian Frostwaker =25 -Balduvian Horde =46 -Balduvian Hydra =62 -Balduvian Rage =25 -Balduvian Shaman =25 -Balduvian Trading Post =37 -Balduvian War-Makers =12 -Balduvian Warlord =25 -Balefire Liege =333 -Baleful Stare =25 -Ball Lightning =224 -Ballista Squad =25 -Balloon Peddler =25 -Ballynock Cohort =25 -Ballynock Trapper =26 -Ballyrush Banneret =36 -Balm of Restoration =50 -Baloth Cage Trap =33 -Baloth Woodcrasher =25 -Balshan Beguiler =25 -Balshan Collaborator =25 -Balshan Griffin =25 -Balthor the Defiled =93 -Balthor the Stout =99 -Bamboozle =56 -Bandage =25 -Bane of the Living =49 -Banefire =277 -Baneslayer Angel =4198 -Banewasp Affliction =25 -Banishing Knack =25 -Banshee =25 -Banshee's Blade =25 -Bant Battlemage =25 -Bant Charm =39 -Bant Panorama =25 -Bant Sojourners =25 -Bant Sureblade =25 -Barbarian Bully =25 -Barbarian General =150 -Barbarian Guides =25 -Barbarian Horde =100 -Barbarian Lunatic =25 -Barbarian Outcast =25 -Barbarian Riftcutter =31 -Barbarian Ring =64 -Barbary Apes =25 -Barbed Field =25 -Barbed Foliage =25 -Barbed Lightning =50 -Barbed Sextant =25 -Barbed Shocker =25 -Barbed Sliver =25 -Barbed Wire =25 -Barbed-Back Wurm =25 -Bargain =49 -Bargaining Table =25 -Barishi =25 -Barkhide Mauler =25 -Barkshell Blessing =6 -Barktooth Warbeard =100 -Barl's Cage =25 -Baron Sengir =319 -Barrel Down Sokenzan =25 -Barreling Attack =74 -Barren Glory =25 -Barren Moor =25 -Barrenton Cragtreads =25 -Barrenton Medic =25 -Barrin, Master Wizard =25 -Barrin's Codex =27 -Barrin's Spite =25 -Barrin's Unmaking =25 -Barrow Ghoul =25 -Bartel Runeaxe =349 -Barter in Blood =16 -Baru, Fist of Krosa =38 -Basal Sliver =25 -Basal Thrull =25 -Basalt Gargoyle =5 -Basalt Golem =25 -Basalt Monolith =38 -Bash to Bits =25 -Basking Rootwalla =25 -Bathe in Light =25 -Baton of Courage =25 -Baton of Morale =50 -Battered Golem =25 -Battering Craghorn =25 -Battering Ram =25 -Battering Sliver =25 -Battering Wurm =31 -Battle Cry =25 -Battle Frenzy =25 -Battle Hurda =14 -Battle Mastery =25 -Battle of Wits =25 -Battle Rampart =25 -Battle Screech =99 -Battle Squadron =100 -Battle Strain =50 -Battle-Mad Ronin =25 -Battlefield Forge =105 -Battlefield Medic =5 -Battlefield Percher =25 -Battlefield Scrounger =25 -Battlegate Mimic =25 -Battlegrace Angel =135 -Battlegrowth =25 -Battletide Alchemist =29 -Battlewand Oak =25 -Battlewise Aven =25 -Batwing Brume =25 -Bay Falcon =25 -Bayou =3115 -Bayou Dragonfly =25 -Bazaar of Baghdad =20451 -Bazaar of Wonders =87 -Beacon Behemoth =20 -Beacon Hawk =5 -Beacon of Creation =111 -Beacon of Destiny =29 -Beacon of Destruction =49 -Beacon of Immortality =91 -Beacon of Tomorrows =83 -Beacon of Unrest =101 -Bear Cub =56 -Bear Token =33 -Bearscape =25 -Beast Attack =25 -Beast Hunt =25 -Beast of Burden =25 -Beast Token =17 -Beast Walkers =48 -Beastmaster Ascension =44 -Beastmaster's Magemark =25 -Beasts of Bogardan =149 -Beckon Apparition =25 -Bedlam =29 -Befoul =5 -Behemoth Sledge =85 -Behemoth's Herald =25 -Belbe's Armor =9 -Belbe's Percher =12 -Belbe's Portal =119 -Belfry Spirit =25 -Belligerent Hatchling =38 -Bellowing Fiend =25 -Belltower Sphinx =6 -Beloved Chaplain =6 -Ben-Ben, Akki Hermit =49 -Benalish Cavalry =26 -Benalish Commander =42 -Benalish Emissary =25 -Benalish Heralds =25 -Benalish Hero =25 -Benalish Infantry =25 -Benalish Knight =7 -Benalish Lancer =25 -Benalish Missionary =25 -Benalish Trapper =25 -Bend or Break =25 -Benediction of Moons =25 -Benevolent Ancestor =25 -Benevolent Bodyguard =25 -Benevolent Unicorn =25 -Benthic Behemoth =39 -Benthic Djinn =74 -Benthic Explorers =12 -Benthicore =25 -Bequeathal =25 -Bereavement =25 -Berserk =3124 -Berserk Murlodont =25 -Berserkers of Blood Ridge =25 -Beseech the Queen =51 -Bestial Fury =26 -Betrayal =48 -Betrayal of Flesh =99 -Betrothed of Fire =8 -Bewilder =17 -Bifurcate =41 -Big Game Hunter =36 -Bile Urchin =25 -Bind =36 -Binding Agony =25 -Binding Grasp =15 -Biomantic Mastery =62 -Bioplasm =25 -Biorhythm =50 -Birchlore Rangers =50 -Bird Maiden =26 -Bird Token =69 -Birds of Paradise =326 -Biting Tether =25 -Bitter Ordeal =69 -Bitterblossom =812 -Bituminous Blast =62 -Black Carriage =74 -Black Knight =25 -Black Lotus =78645 -Black Mana Battery =99 -Black Market =25 -Black Poplar Shaman =25 -Black Scarab =25 -Black Vise =41 -Black Ward =25 -Blacker Lotus =99 -Blackmail =38 -Blade of the Bloodchief =63 -Blade of the Sixth Pride =25 -Blade Sliver =50 -Blademane Baku =17 -Blades of Velis Vel =25 -Bladetusk Boar =25 -Bladewing the Risen =112 -Bladewing's Thrall =99 -Blanchwood Armor =25 -Blanchwood Treefolk =25 -Blanket of Night =95 -Blasted Landscape =25 -Blaster Mage =25 -Blasting Station =99 -Blastoderm =16 -Blatant Thievery =99 -Blaze =6 -Blaze of Glory =837 -Blazethorn Scarecrow =17 -Blazing Archon =69 -Blazing Blade Askari =26 -Blazing Effigy =25 -Blazing Salvo =25 -Blazing Shoal =25 -Blazing Specter =40 -Blazing Torch =49 -Blessed Breath =25 -Blessed Orator =25 -Blessed Reversal =25 -Blessed Wind =94 -Blessed Wine =25 -Blessing =11 -Blessing of Leeches =25 -Blessing of the Nephilim =31 -Blight =6 -Blight Sickle =25 -Blighted Shaman =28 -Blightning =87 -Blightsoil Druid =25 -Blightspeaker =17 -Blind Creeper =25 -Blind Fury =25 -Blind Hunter =25 -Blind Phantasm =25 -Blind Seer =25 -Blind with Anger =99 -Blind-Spot Giant =25 -Blinding Angel =85 -Blinding Beam =25 -Blinding Light =25 -Blinding Mage =22 -Blinding Powder =25 -Blinking Spirit =50 -Blinkmoth Infusion =99 -Blinkmoth Nexus =127 -Blinkmoth Urn =25 -Blinkmoth Well =99 -Blister Beetle =25 -Blistering Barrier =25 -Blistering Dieflyn =25 -Blistering Firecat =117 -Blitz Hellion =31 -Blizzard =100 -Blizzard Elemental =25 -Blizzard Specter =97 -Bloated Toad =5 -Blockade Runner =25 -Blockbuster =5 -Blood Celebrant =25 -Blood Clock =47 -Blood Crypt =669 -Blood Cultist =25 -Blood Frenzy =25 -Blood Funnel =37 -Blood Hound =25 -Blood Knight =33 -Blood Lust =25 -Blood Moon =282 -Blood Oath =122 -Blood of the Martyr =25 -Blood Pet =25 -Blood Rites =52 -Blood Seeker =112 -Blood Speaker =31 -Blood Tribute =34 -Blood Tyrant =54 -Blood Vassal =25 -Bloodbond March =25 -Bloodbraid Elf =292 -Bloodchief Ascension =105 -Bloodcurdler =25 -Bloodfire Colossus =25 -Bloodfire Dwarf =26 -Bloodfire Infusion =26 -Bloodfire Kavu =27 -Bloodghast =550 -Bloodhall Ooze =59 -Bloodied Ghost =25 -Bloodletter Quill =25 -Bloodline Shaman =25 -Bloodmark Mentor =100 -Bloodpyre Elemental =25 -Bloodrock Cyclops =25 -Bloodscale Prowler =25 -Bloodscent =99 -Bloodshed Fever =25 -Bloodshot Cyclops =25 -Bloodshot Trainee =38 -Bloodstained Mire =1052 -Bloodstoke Howler =25 -Bloodstone Cameo =48 -Bloodthirsty Ogre =25 -Bloodthorn Taunter =25 -Bloom Tender =97 -Blossoming Wreath =25 -Blowfly Infestation =25 -Blue Elemental Blast =25 -Blue Mana Battery =15 -Blue Scarab =25 -Blue Ward =14 -Blurred Mongoose =37 -Boa Constrictor =99 -Boartusk Liege =160 -Body Double =40 -Body of Jukai =25 -Body Snatcher =84 -Bog Down =26 -Bog Elemental =49 -Bog Glider =25 -Bog Gnarr =26 -Bog Hoodlums =25 -Bog Imp =25 -Bog Initiate =50 -Bog Raiders =99 -Bog Rats =6 -Bog Serpent =17 -Bog Smugglers =25 -Bog Tatters =25 -Bog Witch =41 -Bog Wraith =19 -Bog Wreckage =6 -Bog-Strider Ash =25 -Bogardan Firefiend =25 -Bogardan Hellkite =195 -Bogardan Lancer =25 -Bogardan Phoenix =99 -Bogardan Rager =26 -Boggart Arsonists =25 -Boggart Birth Rite =25 -Boggart Forager =25 -Boggart Harbinger =25 -Boggart Loggers =25 -Boggart Mob =42 -Boggart Ram-Gang =76 -Boggart Shenanigans =8 -Boggart Sprite-Chaser =25 -Boil =6 -Boiling Blood =8 -Boiling Seas =25 -Bola Warrior =25 -Bold Defense =25 -Boldwyr Heavyweights =99 -Boldwyr Intimidator =25 -Bomb Squad =25 -Bond of Agony =25 -Bonded Fetch =25 -Bone Dancer =52 -Bone Flute =33 -Bone Harvest =99 -Bone Mask =99 -Bone Saw =20 -Bone Shaman =100 -Bone Shredder =24 -Bone Splinters =25 -Boneknitter =56 -Boneshard Slasher =25 -Bonesplitter =22 -Bonesplitter Sliver =50 -Bonethorn Valesk =50 -Booby Trap =97 -Book Burning =25 -Book of Rass =25 -Boom/Bust =40 -Boomerang =10 -Boon Reflection =86 -Booster Tutor =104 -Borborygmos =25 -Border Guard =50 -Border Patrol =25 -Borderland Behemoth =25 -Borderland Ranger =25 -Boreal Centaur =25 -Boreal Druid =56 -Boreal Griffin =25 -Boreal Shelf =56 -Boris Devilboon =400 -Boros Fury-Shield =56 -Boros Garrison =34 -Boros Guildmage =31 -Boros Recruit =25 -Boros Signet =25 -Boros Swiftblade =35 -Borrowing 100,000 Arrows =500 -Borrowing the East Wind =775 -Boseiju, Who Shelters All =125 -Bosh, Iron Golem =150 -Bosium Strip =50 -Bosk Banneret =25 -Bosom Buddy =1 -Bottle Gnomes =50 -Bottle of Suleiman =25 -Bottled Cloister =25 -Bottomless Pit =25 -Bottomless Vault =93 -Bouncing Beebles =25 -Bound in Silence =48 -Bound/Determined =25 -Bounteous Kirin =44 -Bountiful Harvest =25 -Bounty Hunter =99 -Bounty of the Hunt =25 -Brace for Impact =27 -Brackwater Elemental =20 -Braid of Fire =238 -Braids, Cabal Minion =60 -Braids, Conjurer Adept =32 -Braidwood Cup =99 -Braidwood Sextant =25 -Brain Freeze =159 -Brain Gorgers =17 -Brain Pry =25 -Brainbite =25 -Braingeyser =162 -Brainspoil =25 -Brainstorm =56 -Brainwash =25 -Bramble Creeper =25 -Bramble Elemental =25 -Bramblewood Paragon =110 -Branching Bolt =25 -Branchsnap Lorian =31 -Brand =125 -Brand of Ill Omen =99 -Branded Brawlers =25 -Brass Gnat =17 -Brass Herald =25 -Brass Man =25 -Brass Secretary =17 -Brass-Talon Chimera =98 -Brassclaw Orcs =240 -Bravado =25 -Brave the Elements =48 -Brawl =25 -Brawn =25 -Breach =5 -Break Asunder =25 -Break Open =25 -Breaking Point =149 -Breaking Wave =99 -Breakthrough =71 -Breath of Darigaaz =25 -Breath of Dreams =800 -Breath of Fury =25 -Breath of Life =25 -Breath of Malfegor =25 -Breathstealer =100 -Breathstealer's Crypt =98 -Breeding Pit =22 -Breeding Pool =1014 -Breezekeeper =25 -Briar Patch =25 -Briar Shield =36 -Briarberry Cohort =25 -Briarhorn =48 -Briarknit Kami =25 -Bribery =200 -Bridge from Below =495 -Brightflame =36 -Brighthearth Banneret =25 -Brightstone Ritual =31 -Brigid, Hero of Kinsbaile =34 -Brilliant Halo =8 -Brilliant Plan =170 -Brilliant Ultimatum =27 -Brimstone Dragon =876 -Brine Elemental =6 -Brine Hag =98 -Brine Seer =29 -Brine Shaman =25 -Bringer of the Black Dawn =81 -Bringer of the Blue Dawn =272 -Bringer of the Green Dawn =53 -Bringer of the Red Dawn =49 -Bringer of the White Dawn =125 -Brink of Madness =99 -Brion Stoutarm =39 -Broken Ambitions =25 -Broken Dam =100 -Broken Fall =25 -Broken Visage =87 -Brontotherium =25 -Bronze Bombshell =45 -Bronze Calendar =51 -Bronze Horse =99 -Bronze Tablet =25 -Brood of Cockroaches =98 -Brood Sliver =142 -Broodhatch Nantuko =25 -Brooding Saurian =25 -Broodmate Dragon =420 -Broodstar =58 -Brothers of Fire =26 -Brothers Yamazaki =3 -Browbeat =177 -Brown Ouphe =20 -Browse =25 -Brush With Death =10 -Brushland =71 -Brushwagg =74 -Brutal Deceiver =25 -Brutal Suppression =25 -Brute Force =25 -Bubble Matrix =99 -Bubbling Beebles =26 -Bubbling Muck =33 -Budoka Gardener =85 -Budoka Pupil =69 -Builder's Bane =25 -Bull Aurochs =25 -Bull Cerodon =25 -Bull Elephant =25 -Bull Hippo =25 -Bullwhip =25 -Bulwark =99 -Buoyancy =25 -Burden of Greed =25 -Bureaucracy =100 -Burgeoning =266 -Buried Alive =137 -Burn Trail =25 -Burning Fields =100 -Burning Inquiry =25 -Burning of Xinye =967 -Burning Palm Efreet =25 -Burning Sands =118 -Burning Shield Askari =100 -Burning Wish =345 -Burning-Eye Zubera =10 -Burning-Tree Bloodscale =25 -Burning-Tree Shaman =67 -Burnout =36 -Burnt Offering =28 -Burr Grafter =25 -Burrenton Bombardier =25 -Burrenton Forge-Tender =30 -Burrenton Shield-Bearers =25 -Burrowing =25 -Burst Lightning =50 -Burst of Energy =25 -Burst of Speed =4 -Bushi Tenderfoot =62 -Butcher Orgg =49 -Cabal Archon =31 -Cabal Coffers =346 -Cabal Conditioning =25 -Cabal Executioner =25 -Cabal Inquisitor =25 -Cabal Interrogator =68 -Cabal Patriarch =49 -Cabal Pit =25 -Cabal Ritual =52 -Cabal Shrine =25 -Cabal Slaver =25 -Cabal Surgeon =25 -Cabal Therapy =405 -Cabal Torturer =25 -Cabal Trainee =25 -Cache Raiders =37 -Cackling Fiend =25 -Cackling Flames =25 -Cackling Imp =25 -Cackling Witch =40 -Cadaverous Bloom =168 -Cadaverous Knight =25 -Cage of Hands =25 -Cagemail =25 -Cairn Wanderer =33 -Calciderm =6 -Calciform Pools =25 -Caldera Hellion =42 -Caldera Kavu =26 -Caldera Lake =66 -Call for Blood =17 -Call of the Herd =68 -Call of the Wild =50 -Call the Skybreaker =37 -Call to Arms =37 -Call to Glory =5 -Call to Heel =25 -Call to the Grave =138 -Call to the Netherworld =25 -Caller of Gales =25 -Caller of the Claw =99 -Caller of the Hunt =48 -Callous Deceiver =25 -Callous Giant =25 -Callous Oppressor =25 -Callow Jushi =33 -Calming Licid =25 -Calming Verse =25 -Caltrops =25 -Camel =33 -Camouflage =154 -Cancel =5 -Candelabra of Tawnos =2870 -Candles of Leng =62 -Candles' Glow =99 -Canker Abomination =37 -Cankerous Thirst =49 -Cannibalize =25 -Canopy Claws =25 -Canopy Crawler =31 -Canopy Dragon =138 -Canopy Spider =25 -Canopy Surge =25 -Cantivore =79 -Canyon Drake =100 -Canyon Minotaur =3 -Canyon Wildcat =5 -Cao Cao, Lord of Wei =1000 -Cao Ren, Wei Commander =517 -Capashen Knight =26 -Capashen Standard =26 -Capashen Templar =26 -Capashen Unicorn =123 -Capricious Efreet =53 -Capricious Sorcerer =90 -Capsize =25 -Captain of the Watch =134 -Captain Sisay =81 -Captain's Maneuver =36 -Captivating Glance =25 -Captive Flame =50 -Capture of Jingzhou =1409 -Captured Sunlight =99 -Carapace =25 -Caravan Hurda =25 -Carbonize =28 -Cardboard Carapace =116 -Careful Consideration =25 -Careful Study =52 -Caregiver =25 -Caribou Range =48 -Carnage Altar =37 -Carnassid =33 -Carnival of Souls =25 -Carnivorous Death-Parrot =1 -Carnivorous Plant =25 -Carnophage =25 -Carom =25 -Carpet of Flowers =48 -Carrier Pigeons =12 -Carrion =99 -Carrion Ants =25 -Carrion Beetles =25 -Carrion Feeder =25 -Carrion Howler =25 -Carrion Rats =25 -Carrion Thrash =25 -Carrion Wall =25 -Carrion Wurm =25 -Carrionette =49 -Carry Away =29 -Cartographer =25 -Carven Caryatid =25 -Cascade Bluffs =243 -Castigate =25 -Casting of Bones =12 -Castle =20 -Castle Raptors =17 -Castle Sengir =50 -Cat Burglar =17 -Cat Warriors =25 -Cataclysm =191 -Catacomb Dragon =130 -Catalog =49 -Catalyst Stone =25 -Catapult Master =87 -Catapult Squad =25 -Catastrophe =75 -Cateran Brute =25 -Cateran Enforcer =25 -Cateran Kidnappers =41 -Cateran Overlord =50 -Cateran Persuader =25 -Cateran Slaver =100 -Cateran Summons =25 -Caterwauling Boggart =25 -Cathartic Adept =25 -Cathedral of Serra =100 -Cathodion =25 -Cauldron Dance =25 -Cauldron Haze =25 -Cauldron of Souls =38 -Caustic Rain =25 -Caustic Tar =25 -Caustic Wasps =54 -Cautery Sliver =25 -Cavalry Master =6 -Cave People =25 -Cave Sense =25 -Cave Tiger =25 -Cave-In =84 -Cavern Crawler =25 -Cavern Harpy =25 -Cavern Thoctar =25 -Caverns of Despair =300 -Caves of Koilos =94 -Cease-Fire =25 -Ceaseless Searblades =25 -Celestial Ancient =43 -Celestial Convergence =35 -Celestial Colonnade =539 -Celestial Crusader =5 -Celestial Dawn =25 -Celestial Gatekeeper =25 -Celestial Kirin =49 -Celestial Mantle =42 -Celestial Prism =68 -Celestial Purge =26 -Celestial Sword =63 -Cemetery Gate =99 -Cemetery Puca =39 -Cemetery Reaper =72 -Cenn's Enlistment =25 -Cenn's Heir =25 -Cenn's Tactician =36 -Censorship =25 -Centaur Archer =25 -Centaur Chieftain =25 -Centaur Courser =25 -Centaur Garden =25 -Centaur Glade =100 -Centaur Omenreader =25 -Centaur Rootcaster =25 -Centaur Safeguard =25 -Centaur Veteran =25 -Cephalid Aristocrat =25 -Cephalid Broker =25 -Cephalid Coliseum =145 -Cephalid Constable =33 -Cephalid Illusionist =62 -Cephalid Inkshrouder =25 -Cephalid Looter =31 -Cephalid Pathmage =25 -Cephalid Retainer =25 -Cephalid Sage =25 -Cephalid Scout =25 -Cephalid Shrine =25 -Cephalid Snitch =25 -Cephalid Vandal =99 -Cerebral Vortex =25 -Ceremonial Guard =25 -Cerodon Yearling =25 -Cerulean Sphinx =25 -Cerulean Wisps =100 -Cessation =25 -Ceta Disciple =26 -Ceta Sanctuary =25 -Cetavolver =25 -Chain Lightning =1001 -Chain of Acid =25 -Chain of Plasma =26 -Chain of Silence =25 -Chain of Smog =25 -Chain of Vapor =51 -Chain Stasis =48 -Chainbreaker =21 -Chainer, Dementia Master =25 -Chainer's Edict =66 -Chainflinger =25 -Chains of Mephistopheles =4864 -Chalice of the Void =946 -Chamber of Manipulation =6 -Chambered Nautilus =25 -Chameleon Blur =17 -Chameleon Colossus =279 -Chameleon Spirit =25 -Champion Lancer =199 -Champion's Victory =99 -Chance Encounter =200 -Chandler =25 -Chandra Ablaze =268 -Chandra Nalaar =274 -Change of Heart =50 -Changeling Berserker =25 -Changeling Hero =37 -Changeling Sentinel =25 -Changeling Titan =25 -Channel =27 -Channel the Suns =73 -Chant of Vitu-Ghazi =6 -Chaos Charm =67 -Chaos Confetti =100 -Chaos Harlequin =25 -Chaos Lord =100 -Chaos Moon =100 -Chaos Orb =3700 -Chaoslace =25 -Chaosphere =33 -Chaotic Backlash =48 -Chaotic Goo =25 -Chaotic Strike =25 -Char =34 -Char-Rumbler =150 -Charcoal Diamond =25 -Charge Across the Araba =25 -Charging Paladin =5 -Charging Rhino =7 -Charging Slateback =25 -Charging Troll =48 -Chariot of the Sun =25 -Charisma =234 -Charm Peddler =25 -Charm School =25 -Charmed Griffin =25 -Charmed Pendant =25 -Charnelhoard Wurm =36 -Chartooth Cougar =26 -Chastise =25 -Chatter of the Squirrel =25 -Checks and Balances =15 -Chicken a la King =6 -Chicken Egg =25 -Chieftain en-Dal =25 -Child of Alara =71 -Child of Gaea =62 -Child of Night =25 -Child of Thorns =17 -Childhood Horror =25 -Children of Korlis =25 -Chill =19 -Chill Haunting =99 -Chill to the Bone =25 -Chilling Apparition =25 -Chilling Shade =25 -Chime of Night =26 -Chimeric Coils =25 -Chimeric Egg =17 -Chimeric Idol =49 -Chimeric Sphere =25 -Chimeric Staff =25 -Chimney Imp =25 -Chisei, Heart of Oceans =25 -Chittering Rats =25 -Chlorophant =52 -Cho-Arrim Alchemist =97 -Cho-Arrim Bruiser =25 -Cho-Arrim Legate =5 -Cho-Manno, Revolutionary =49 -Cho-Manno's Blessing =41 -Choice of Damnations =125 -Choke =113 -Choking Sands =25 -Choking Tethers =25 -Choking Vines =25 -Chord of Calling =104 -Chorus of the Conclave =25 -Chorus of Woe =22 -Chromatic Armor =63 -Chromatic Sphere =25 -Chromatic Star =25 -Chrome Mox =1395 -Chromescale Drake =25 -Chromeshell Crab =49 -Chromium =58 -Chronatog =124 -Chronatog Totem =25 -Chronomantic Escape =62 -Chronosavant =35 -Chronozoa =37 -Chub Toad =25 -Churning Eddy =17 -Cinder Cloud =25 -Cinder Crawler =26 -Cinder Elemental =25 -Cinder Giant =100 -Cinder Marsh =48 -Cinder Pyromancer =25 -Cinder Seer =5 -Cinder Shade =25 -Cinder Storm =199 -Cinder Wall =5 -Cinderbones =25 -Cinderhaze Wretch =47 -Circle of Affliction =25 -Circle of Despair =74 -Circle of Protection: Artifacts =15 -Circle of Protection: Black =6 -Circle of Protection: Blue =25 -Circle of Protection: Green =6 -Circle of Protection: Red =6 -Circle of Protection: Shadow =25 -Circle of Protection: White =25 -Circle of Solace =99 -Circling Vultures =25 -Circu, Dimir Lobotomist =157 -Circular Logic =61 -Citadel of Pain =45 -Citanul Centaurs =53 -Citanul Druid =109 -Citanul Flute =42 -Citanul Hierophants =95 -Citanul Woodreaders =17 -City in a Bottle =630 -City of Ass =114 -City of Brass =49 -City of Shadows =114 -City of Solitude =124 -City of Traitors =1695 -Civic Guildmage =25 -Civic Wayfinder =25 -Clarion Ultimatum =40 -Clash of Realities =25 -Claws of Gix =25 -Claws of Wirewood =25 -Clay Pigeon =25 -Clay Statue =25 -Cleanfall =25 -Cleanse =900 -Cleansing =226 -Cleansing Beam =25 -Cleansing Meditation =25 -Clear =25 -Clear the Land =53 -Clearwater Goblet =99 -Clergy en-Vec =25 -Clergy of the Holy Nimbus =25 -Clickslither =58 -Cliff Threader =25 -Cliffrunner Behemoth =49 -Clinging Darkness =25 -Cloak and Dagger =25 -Cloak of Confusion =25 -Cloak of Feathers =6 -Cloak of Invisibility =25 -Cloak of Mists =99 -Clock of Omens =99 -Clockspinning =25 -Clockwork Avian =99 -Clockwork Beast =25 -Clockwork Beetle =25 -Clockwork Condor =5 -Clockwork Dragon =100 -Clockwork Gnomes =25 -Clockwork Hydra =25 -Clockwork Steed =25 -Clockwork Swarm =99 -Clockwork Vorrac =99 -Clone =34 -Close Quarters =62 -Clot Sliver =33 -Cloud Cover =49 -Cloud Djinn =25 -Cloud Dragon =99 -Cloud Elemental =25 -Cloud Key =99 -Cloud of Faeries =34 -Cloud Pirates =39 -Cloud Spirit =25 -Cloud Sprite =5 -Cloudchaser Eagle =5 -Cloudchaser Kestrel =8 -Cloudcrest Lake =25 -Cloudcrown Oak =25 -Cloudgoat Ranger =100 -Cloudheath Drake =25 -Cloudhoof Kirin =66 -Cloudpost =30 -Cloudreach Cavalry =56 -Cloudseeder =25 -Cloudskate =25 -Cloudstone Curio =293 -Cloudthresher =65 -Clout of the Dominus =25 -Cloven Casting =39 -Clutch of the Undercity =25 -Clutch of Undeath =26 -Coal Golem =25 -Coal Stoker =56 -Coalhauler Swine =25 -Coalition Flag =99 -Coalition Relic =82 -Coalition Victory =42 -Coast Watcher =26 -Coastal Drake =99 -Coastal Hornclaw =25 -Coastal Piracy =10 -Coastal Tower =50 -Coastal Wizard =99 -Coat of Arms =129 -Cobalt Golem =26 -Cobra Trap =62 -Cockatrice =25 -Cocoon =9 -Coercion =25 -Coffin Puppets =25 -Coffin Purge =25 -Coffin Queen =199 -Cognivore =49 -Coiled Tinviper =99 -Coiling Oracle =35 -Coiling Woodworm =25 -Coils of the Medusa =25 -Cold Snap =42 -Cold Storage =25 -Cold-Eyed Selkie =250 -Coldsteel Heart =121 -Colfenor's Plans =25 -Colfenor's Urn =25 -Collapsing Borders =25 -Collective Restraint =91 -Collective Unconscious =68 -Colos Yearling =26 -Colossal Might =25 -Colossus of Sardia =25 -Coma Veil =25 -Combat Medic =25 -Command of Unsummoning =6 -Commandeer =83 -Commander Eesha =94 -Commander Greven il-Vec =49 -Commando Raid =25 -Commune with Nature =25 -Complex Automaton =25 -Complicate =25 -Composite Golem =25 -Compost =36 -Compulsion =42 -Compulsive Research =14 -Concentrate =25 -Concerted Effort =40 -Conch Horn =6 -Conclave Equenaut =25 -Conclave Phalanx =50 -Conclave's Blessing =25 -Concordant Crossroads =239 -Condemn =12 -Condescend =41 -Cone of Flame =25 -Confessor =25 -Confiscate =25 -Conflagrate =25 -Confound =56 -Confusion in the Ranks =100 -Congregate =35 -Congregation at Dawn =46 -Conjurer's Ban =25 -Conjurer's Bauble =25 -Conquer =25 -Conqueror's Pledge =77 -Consecrate Land =25 -Conservator =10 -Consign to Dream =25 -Conspiracy =33 -Constant Mists =25 -Constricting Tendrils =20 -Consult the Necrosages =25 -Consume Spirit =25 -Consume Strength =25 -Consuming Bonfire =25 -Consuming Ferocity =25 -Consuming Vortex =25 -Consumptive Goo =25 -Contagion =25 -Contaminated Bond =25 -Contamination =142 -Contemplation =25 -Contempt =25 -Contested Cliffs =58 -Contract from Below =58 -Control Magic =43 -Control of the Court =415 -Controlled Instincts =25 -Controvert =25 -Convalescence =74 -Convalescent Care =62 -Conversion =33 -Conviction =25 -Convincing Mirage =20 -Convolute =25 -Convulsing Licid =100 -Coordinated Barrage =25 -Copper Gnomes =99 -Copper Myr =25 -Copper Tablet =42 -Copper-Leaf Angel =69 -Copperhoof Vorrac =49 -Copy Artifact =133 -Copy Enchantment =41 -Coral Atoll =98 -Coral Eel =5 -Coral Fighters =25 -Coral Helm =25 -Coral Merfolk =25 -Coral Net =17 -Coral Reef =25 -Coral Trickster =17 -Coretapper =62 -Cornered Market =48 -Corpse Connoisseur =25 -Corpse Dance =95 -Corpse Harvester =46 -Corpulent Corpse =17 -Corrosion =98 -Corrosive Mentor =25 -Corrupt =25 -Corrupt Court Official =405 -Corrupt Eunuchs =150 -Corrupt Official =25 -Corrupted Roots =27 -Corrupting Licid =25 -Cosi's Trickster =31 -Cosmic Horror =50 -Cosmic Larva =25 -Council of Advisors =100 -Counsel of the Soratami =25 -Counterbalance =498 -Counterbore =44 -Counterintelligence =100 -Counterspell =36 -Countersquall =25 -Countryside Crusher =112 -Courier Hawk =25 -Courier's Capsule =25 -Court Archers =25 -Court Homunculus =25 -Court Hussar =25 -Covenant of Minds =44 -Cover of Darkness =206 -Cover of Winter =48 -Covert Operative =25 -Covetous Dragon =108 -Cowardice =15 -Cowed by Wisdom =25 -Crabapple Cohort =25 -Crack the Earth =17 -Crackdown =99 -Crackleburr =75 -Crackling Club =25 -Cradle Guard =99 -Cradle of Vitality =47 -Cradle to Grave =25 -Crafty Pathmage =25 -Crag Puca =25 -Crag Saurian =25 -Cragganwick Cremator =30 -Cranial Extraction =216 -Cranial Plating =77 -Crash =25 -Crash Landing =28 -Crash of Rhinos =25 -Crashing Boars =50 -Crashing Centaur =25 -Crater Hellion =99 -Craven Giant =25 -Craw Giant =25 -Craw Wurm =3 -Crawling Filth =17 -Crawlspace =35 -Crazed Armodon =74 -Crazed Firecat =25 -Crazed Goblin =25 -Crazed Skirge =17 -Creakwood Ghoul =25 -Creakwood Liege =208 -Cream of the Crop =44 -Creature Bond =25 -Credit Voucher =5 -Creeping Mold =12 -Cremate =25 -Crenellated Wall =6 -Crested Craghorn =25 -Crevasse =33 -Crib Swap =25 -Crime/Punishment =121 -Crimson Acolyte =25 -Crimson Hellkite =83 -Crimson Kobolds =150 -Crimson Manticore =38 -Crimson Roc =6 -Crimson Wisps =25 -Crippling Fatigue =25 -Cromat =44 -Crookclaw Elder =31 -Crookclaw Transmuter =17 -Crooked Scales =25 -Crookshank Kobolds =150 -Crop Rotation =34 -Crosis, the Purger =114 -Crosis's Attendant =88 -Crosis's Catacombs =32 -Crosis's Charm =17 -Crossbow Ambush =49 -Crossbow Infantry =5 -Crosswinds =34 -Crovax the Cursed =65 -Crovax, Ascendant Hero =41 -Crowd Favorites =99 -Crowd of Cinders =25 -Crown of Ascension =25 -Crown of Awe =25 -Crown of Convergence =37 -Crown of Flames =25 -Crown of Fury =25 -Crown of Suspicion =25 -Crown of the Ages =99 -Crown of Vigor =25 -Crucible of Fire =37 -Crucible of Worlds =740 -Crude Rampart =25 -Cruel Bargain =900 -Cruel Deceiver =25 -Cruel Edict =8 -Cruel Fate =195 -Cruel Revival =25 -Cruel Tutor =202 -Cruel Ultimatum =204 -Crumble =25 -Crumbling Ashes =50 -Crumbling Necropolis =110 -Crumbling Sanctuary =41 -Crusade =99 -Crusading Knight =100 -Crush of Wurms =150 -Crush Underfoot =50 -Crushing Pain =25 -Cry of Contrition =25 -Cryoclasm =26 -Crypt Angel =87 -Crypt Champion =25 -Crypt Cobra =66 -Crypt Creeper =25 -Crypt of Agadeem =48 -Crypt Rats =36 -Crypt Ripper =25 -Crypt Sliver =56 -Cryptic Annelid =33 -Cryptic Command =659 -Cryptic Gateway =186 -Cryptwailing =31 -Crystal Chimes =56 -Crystal Golem =25 -Crystal Quarry =166 -Crystal Rod =39 -Crystal Seer =25 -Crystal Shard =31 -Crystal Spray =25 -Crystal Vein =25 -Crystalline Sliver =66 -Crystallization =99 -Cudgel Troll =25 -Culling Scales =99 -Culling Sun =52 -Culling the Weak =28 -Cultbrand Cinder =25 -Cultural Exchange =56 -Cumber Stone =26 -Cunning =24 -Cunning Advisor =500 -Cunning Bandit =6 -Cunning Lethemancer =30 -Cunning Wish =351 -Cuombajj Witches =10 -Curfew =25 -Curiosity =54 -Curse Artifact =79 -Curse of Chains =25 -Curse of Marit Lage =62 -Curse of the Cabal =43 -Curse of the Fire Penguin =199 -Cursecatcher =112 -Cursed Flesh =25 -Cursed Land =25 -Cursed Monstrosity =25 -Cursed Rack =99 -Cursed Ronin =25 -Cursed Scroll =537 -Cursed Totem =49 -Curtain of Light =25 -Custody Battle =25 -Customs Depot =25 -Cut the Earthly Bond =29 -Cut the Tethers =99 -Cutthroat il-Dal =25 -Cycle of Life =74 -Cyclical Evolution =25 -Cyclone =25 -Cyclopean Giant =17 -Cyclopean Mummy =25 -Cyclopean Snare =25 -Cyclopean Tomb =1335 -Cylian Elf =25 -Cylian Sunsinger =37 -Cytoplast Manipulator =77 -Cytoplast Root-Kin =34 -Cytoshape =45 -Cytospawn Shambler =100 -D'Avenant Archer =25 -D'Avenant Healer =17 -Daggerclaw Imp =9 -Daily Regimen =25 -Dakkon Blackblade =33 -Dakmor Ghoul =49 -Dakmor Lancer =99 -Dakmor Plague =25 -Dakmor Salvage =33 -Dakmor Sorceress =755 -Damnation =991 -Dampen Thought =48 -Damping Engine =25 -Damping Field =99 -Damping Matrix =321 -Dance of Many =33 -Dance of Shadows =99 -Dance of the Dead =52 -Dancing Scimitar =25 -Dandân =25 -Daraja Griffin =25 -Darba =25 -Darien, King of Kjeldor =133 -Darigaaz, the Igniter =173 -Darigaaz's Attendant =25 -Darigaaz's Caldera =66 -Darigaaz's Charm =26 -Daring Apprentice =25 -Daring Leap =62 -Dark Banishing =6 -Dark Confidant =1534 -Dark Depths =2336 -Dark Hatchling =64 -Dark Heart of the Wood =25 -Dark Maze =25 -Dark Offering =25 -Dark Privilege =59 -Dark Ritual =20 -Dark Sphere =49 -Dark Supplicant =85 -Dark Suspicions =49 -Dark Temper =20 -Dark Triumph =5 -Dark Withering =6 -Darkblast =23 -Darkest Hour =31 -Darkheart Sliver =99 -Darkling Stalker =25 -Darklit Gargoyle =25 -Darkness =136 -Darkpact =97 -Darksteel Brute =41 -Darksteel Citadel =41 -Darksteel Colossus =151 -Darksteel Forge =609 -Darksteel Gargoyle =100 -Darksteel Garrison =49 -Darksteel Ingot =39 -Darksteel Pendant =25 -Darksteel Reactor =44 -Darkwatch Elves =25 -Darkwater Catacombs =146 -Darkwater Egg =48 -Darting Merfolk =199 -Daru Cavalier =25 -Daru Encampment =48 -Daru Healer =5 -Daru Lancer =25 -Daru Mender =2999 -Daru Sanctifier =25 -Daru Spiritualist =25 -Daru Stinger =100 -Daru Warchief =128 -Dash Hopes =125 -Daughter of Autumn =99 -Daunting Defender =5 -Dauntless Dourbark =62 -Dauntless Escort =264 -Dauthi Cutthroat =47 -Dauthi Embrace =25 -Dauthi Ghoul =93 -Dauthi Horror =24 -Dauthi Jackal =31 -Dauthi Marauder =31 -Dauthi Mercenary =81 -Dauthi Mindripper =25 -Dauthi Slayer =16 -Dauthi Trapper =25 -Dauthi Warlord =25 -Dawn Charm =25 -Dawn Elemental =100 -Dawn of the Dead =62 -Dawn's Reflection =25 -Dawnfluke =25 -Dawnglow Infusion =37 -Dawning Purist =25 -Dawnray Archer =25 -Dawnstrider =99 -Day of Destiny =35 -Day of Judgment =561 -Day of the Dragons =100 -Daybreak Coronet =83 -Daze =158 -Dazzling Beauty =25 -Dead Ringers =26 -Dead-Iron Sledge =99 -Dead/Gone =25 -Deadapult =25 -Deadfall =81 -Deadhead =36 -Deadly Grub =17 -Deadly Insect =26 -Deadly Recluse =45 -Deadshot =100 -Deadshot Minotaur =75 -Deadwood Treefolk =25 -Deal Damage =46 -Death Baron =186 -Death Bomb =26 -Death Charmer =25 -Death Cloud =75 -Death Grasp =63 -Death Match =99 -Death Mutation =25 -Death of a Thousand Stings =25 -Death or Glory =45 -Death Pit Offering =6 -Death Pits of Rath =67 -Death Pulse =25 -Death Rattle =25 -Death Spark =25 -Death Speakers =25 -Death Stroke =49 -Death Ward =25 -Death Watch =25 -Death Wish =65 -Death-Mask Duplicant =29 -Death's Duet =99 -Death's-Head Buzzard =26 -Deathbringer Liege =315 -Deathbringer Thoctar =32 -Deathcoil Wurm =192 -Deathcurse Ogre =25 -Deathgazer =25 -Deathgreeter =20 -Deathgrip =27 -Deathknell Kami =29 -Deathlace =25 -Deathmark =6 -Deathmark Prelate =10 -Deathmask Nezumi =25 -Deathrender =114 -Deathspore Thallid =25 -Debt of Loyalty =25 -Debtors' Knell =205 -Decaying Soil =49 -Deception =99 -Decimate =168 -Declaration of Naught =28 -Decompose =25 -Decomposition =25 -Deconstruct =26 -Decree of Annihilation =86 -Decree of Justice =130 -Decree of Pain =99 -Decree of Savagery =25 -Decree of Silence =97 -Dedicated Martyr =25 -Deep Analysis =20 -Deep Reconnaissance =6 -Deep Spawn =4 -Deep Water =25 -Deep Wood =25 -Deep-Sea Kraken =52 -Deep-Slumber Titan =56 -Deepcavern Imp =25 -Deepchannel Mentor =25 -Deepfire Elemental =25 -Deeptread Merrow =25 -Deepwood Drummer =25 -Deepwood Elder =25 -Deepwood Ghoul =25 -Deepwood Legate =6 -Deepwood Tantiv =25 -Deepwood Wolverine =25 -Defender en-Vec =25 -Defender of Chaos =26 -Defender of Law =99 -Defender of the Order =25 -Defense Grid =91 -Defense of the Heart =389 -Defensive Formation =25 -Defensive Maneuvers =25 -Defiant Elf =25 -Defiant Falcon =41 -Defiant Stand =25 -Defiant Vanguard =25 -Defiler of Souls =85 -Defiling Tears =25 -Deflection =49 -Deft Duelist =20 -Deftblade Elite =25 -Defy Gravity =25 -Dega Disciple =26 -Dega Sanctuary =25 -Degavolver =25 -Deglamer =25 -Dehydration =25 -Deity of Scars =89 -Deja Vu =99 -Delay =25 -Delaying Shield =25 -Delif's Cone =25 -Delif's Cube =6 -Delirium =25 -Delirium Skeins =25 -Delraich =95 -Deluge =25 -Delusions of Mediocrity =49 -Dematerialize =25 -Dementia Sliver =42 -Demigod of Revenge =503 -Demolish =25 -Demon Token =20 -Demon's Herald =25 -Demon's Horn =25 -Demon's Jester =25 -Demonfire =68 -Demonic Attorney =89 -Demonic Collusion =49 -Demonic Consultation =75 -Demonic Dread =25 -Demonic Hordes =106 -Demonic Torment =100 -Demonic Tutor =511 -Demonspine Whip =99 -Demoralize =25 -Demystify =25 -Denied! =1049 -Denizen of the Deep =53 -Dense Canopy =99 -Dense Foliage =79 -Deny Reality =25 -Denying Wind =99 -Deranged Hermit =336 -Derelor =6 -Dermoplasm =25 -Descendant of Kiyomaro =41 -Descendant of Masumaro =49 -Descendant of Soramaro =25 -Desecrated Earth =25 -Desecration Elemental =47 -Desecrator Hag =49 -Desert =56 -Desert Nomads =100 -Desert Sandstorm =100 -Desert Twister =6 -Deserted Temple =109 -Desertion =82 -Desolation =98 -Desolation Angel =86 -Desolation Giant =25 -Desperate Charge =350 -Desperate Gambit =36 -Desperate Research =25 -Desperate Ritual =26 -Despoil =25 -Despondency =99 -Despotic Scepter =100 -Destructive Flow =39 -Destructive Urge =31 -Detainment Spell =17 -Detonate =12 -Detritivore =25 -Deus of Calamity =272 -Devastate =25 -Devastating Dreams =174 -Devastation =226 -Devoted Caretaker =99 -Devoted Druid =50 -Devoted Hero =99 -Devoted Retainer =5 -Devour in Shadow =41 -Devouring Deep =10 -Devouring Greed =56 -Devouring Light =25 -Devouring Rage =25 -Devouring Strossus =108 -Devout Harpist =25 -Devout Lightcaster =58 -Devout Monk =35 -Devout Witness =25 -Dewdrop Spy =25 -Diabolic Edict =144 -Diabolic Intent =154 -Diabolic Machine =25 -Diabolic Servitude =33 -Diabolic Tutor =37 -Diabolic Vision =33 -Diamond Faerie =37 -Diamond Kaleidoscope =98 -Diamond Valley =5183 -Diaochan, Artful Beauty =999 -Dichotomancy =62 -Didgeridoo =25 -Diligent Farmhand =25 -Dimensional Breach =37 -Diminishing Returns =25 -Dimir Aqueduct =51 -Dimir Cutpurse =107 -Dimir Doppelganger =88 -Dimir Guildmage =36 -Dimir House Guard =25 -Dimir Infiltrator =25 -Dimir Machinations =25 -Dimir Signet =25 -Din of the Fireherd =42 -Dingus Egg =25 -Dingus Staff =14 -Diplomatic Escort =6 -Diplomatic Immunity =6 -Dire Undercurrents =28 -Dire Wolves =25 -Dirge of Dread =25 -Dirtcowl Wurm =99 -Dirtwater Wraith =25 -Dirty Wererat =25 -Disappear =6 -Disarm =25 -Disciple of Grace =5 -Disciple of Kangee =26 -Disciple of Law =25 -Disciple of Malice =25 -Disciple of Tevesh Szat =25 -Disciple of the Vault =39 -Discombobulate =12 -Discordant Dirge =25 -Discordant Spirit =74 -Disease Carriers =26 -Diseased Vermin =24 -Disembowel =25 -Disempower =25 -Disenchant =15 -Disentomb =25 -Disfigure =113 -Disharmony =399 -Disintegrate =10 -Dismal Failure =25 -Dismantle =99 -Dismantling Blow =25 -Dismiss =10 -Disorder =25 -Disorient =25 -Dispeller's Capsule =25 -Dispersal Shield =26 -Disperse =25 -Dispersing Orb =25 -Disrupt =25 -Disrupting Scepter =6 -Disrupting Shoal =50 -Disruption Aura =49 -Disruptive Pitmage =25 -Disruptive Student =25 -Dissipate =51 -Distant Melody =25 -Distorting Lens =25 -Distorting Wake =25 -Distress =31 -Disturbed Burial =28 -Disturbing Plot =25 -Dive Bomber =5 -Divebomber Griffin =25 -Divergent Growth =27 -Diversionary Tactics =27 -Divert =54 -Divination =25 -Divine Congregation =17 -Divine Intervention =269 -Divine Light =25 -Divine Offering =25 -Divine Presence =25 -Divine Retribution =25 -Divine Sacrament =99 -Divine Transformation =15 -Divine Verdict =25 -Diviner's Wand =25 -Diving Griffin =5 -Divining Witch =50 -Divinity of Pride =316 -Dizzy Spell =25 -Dizzying Gaze =26 -Djinn Illuminatus =66 -Djinn of the Lamp =99 -Djinn of Wishes =39 -Do or Die =149 -Dodecapod =36 -Dogged Hunter =25 -Dogpile =25 -Dolmen Gate =56 -Dominaria's Judgment =30 -Dominate =25 -Dominating Licid =150 -Domineer =99 -Dominus of Fealty =136 -Donate =137 -Dong Zhou, the Tyrant =167 -Doom Blade =25 -Doom Cannon =25 -Doomed Necromancer =56 -Doomgape =98 -Doomsday =34 -Doomsday Specter =99 -Door of Destinies =231 -Door to Nothingness =250 -Doran, the Siege Tower =218 -Dormant Sliver =41 -Dormant Volcano =98 -Dosan the Falling Leaf =43 -Dosan's Oldest Chant =25 -Double Cleave =25 -Double Cross =500 -Double Negative =23 -Double Take =100 -Doubling Cube =97 -Doubling Season =1065 -Doubtless One =60 -Douse =62 -Douse in Gloom =25 -Dovescape =47 -Downdraft =68 -Downhill Charge =25 -Dowsing Shaman =25 -Draco =118 -Draconian Cylix =6 -Dracoplasm =48 -Drafna's Restoration =100 -Drag Down =25 -Dragon Appeasement =25 -Dragon Arch =251 -Dragon Blood =12 -Dragon Breath =25 -Dragon Broodmother =232 -Dragon Engine =25 -Dragon Fangs =25 -Dragon Fodder =47 -Dragon Mage =87 -Dragon Mask =25 -Dragon Roost =49 -Dragon Scales =25 -Dragon Shadow =26 -Dragon Token =22 -Dragon Tyrant =200 -Dragon Whelp =6 -Dragon Wings =25 -Dragon's Claw =25 -Dragon's Herald =25 -Dragonmaster Outcast =513 -Dragonskull Summit =693 -Dragonsoul Knight =25 -Dragonspeaker Shaman =138 -Dragonstalker =50 -Dragonstorm =129 -Drain Life =20 -Drain Power =26 -Drain the Well =25 -Draining Whelk =31 -Drake Familiar =25 -Drake Hatchling =25 -Drake-Skull Cameo =25 -Dralnu, Lich Lord =32 -Dralnu's Crusade =25 -Dralnu's Pet =14 -Dramatic Entrance =43 -Drastic Revelation =25 -Drawn Together =125 -Dread =30 -Dread Charge =99 -Dread of Night =12 -Dread Reaper =90 -Dread Return =38 -Dread Slag =62 -Dread Specter =25 -Dread Warlock =25 -Dread Wight =32 -Dreadship Reef =25 -Dreadwing =25 -Dream Cache =5 -Dream Chisel =25 -Dream Coat =87 -Dream Fighter =25 -Dream Fracture =73 -Dream Halls =963 -Dream Leash =32 -Dream Prowler =25 -Dream Salvage =17 -Dream Stalker =5 -Dream Thief =25 -Dream Thrush =25 -Dream Tides =98 -Dream's Grip =26 -Dreamborn Muse =33 -Dreamcatcher =25 -Dreams of the Dead =37 -Dreamscape Artist =17 -Dreamspoiler Witches =25 -Dreamwinder =25 -Dredge =17 -Dreg Reaver =25 -Dregs of Sorrow =25 -Dregscape Zombie =25 -Drekavac =25 -Drelnoch =25 -Drift of Phantasms =25 -Drift of the Dead =25 -Drifter il-Dal =5 -Drifting Djinn =25 -Drifting Meadow =25 -Drill-Skimmer =25 -Drinker of Sorrow =38 -Dripping Dead =25 -Dripping-Tongue Zubera =25 -Dromad Purebred =25 -Dromar, the Banisher =179 -Dromar's Attendant =25 -Dromar's Cavern =66 -Dromar's Charm =31 -Dromosaur =25 -Droning Bureaucrats =12 -Drooling Groodion =50 -Drooling Ogre =25 -Drop of Honey =2717 -Dross Crocodile =25 -Dross Golem =25 -Dross Harvester =74 -Dross Prowler =25 -Dross Scorpion =26 -Drought =49 -Drove of Elves =147 -Drowned =458 -Drowned Catacomb =471 -Drowned Rusalka =34 -Drowner Initiate =25 -Drowner of Secrets =25 -Drudge Reavers =26 -Drudge Skeletons =25 -Drudge Spell =25 -Druid Lyrist =50 -Druid of the Anima =25 -Druid's Call =97 -Drumhunter =5 -Dry Spell =25 -Dryad Arbor =25 -Dryad Sophisticate =25 -Dryad's Caress =25 -Dual Nature =77 -Duct Crawler =25 -Dueling Grounds =50 -Duergar Assailant =38 -Duergar Cave-Guard =25 -Duergar Hedge-Mage =43 -Duergar Mine-Captain =100 -Dumb Ass =20 -Dune-Brood Nephilim =25 -Dunerider Outlaw =25 -Dungeon Shade =25 -Duplicant =71 -Duplicity =25 -Duress =32 -Durkwood Baloth =26 -Durkwood Boars =25 -Durkwood Tracker =5 -Dusk Imp =5 -Dusk Urchins =38 -Duskdale Wurm =25 -Duskmantle, House of Shadow =12 -Duskrider Falcon =25 -Duskrider Peregrine =33 -Duskwalker =25 -Duskworker =99 -Dust Bowl =123 -Dust Corona =17 -Dust Elemental =42 -Dust of Moments =25 -Dust to Dust =99 -Dwarven Armorer =6 -Dwarven Armory =99 -Dwarven Berserker =100 -Dwarven Blastminer =36 -Dwarven Bloodboiler =62 -Dwarven Catapult =6 -Dwarven Demolition Team =49 -Dwarven Driller =83 -Dwarven Grunt =25 -Dwarven Hold =93 -Dwarven Landslide =26 -Dwarven Lieutenant =4 -Dwarven Miner =25 -Dwarven Nomad =25 -Dwarven Patrol =50 -Dwarven Pony =48 -Dwarven Recruiter =25 -Dwarven Ruins =25 -Dwarven Scorcher =25 -Dwarven Sea Clan =48 -Dwarven Shrine =37 -Dwarven Soldier =25 -Dwarven Song =99 -Dwarven Strike Force =6 -Dwarven Thaumaturgist =74 -Dwarven Trader =99 -Dwarven Vigilantes =25 -Dwarven Warriors =20 -Dwarven Weaponsmith =7 -Dwell on the Past =25 -Dying Wail =26 -Dystopia =93 -Eager Cadet =25 -Early Frost =25 -Early Harvest =62 -Earnest Fellowship =38 -Earsplitting Rats =25 -Earth Elemental =25 -Earth Rift =25 -Earth Surge =19 -Earthbind =49 -Earthblighter =25 -Earthbrawn =25 -Earthcraft =475 -Earthen Goo =25 -Earthlink =100 -Earthquake =102 -Earthshaker =99 -Earwig Squad =36 -Eastern Paladin =84 -Eater of Days =42 -Eater of the Dead =99 -Ebon Dragon =562 -Ebon Drake =99 -Ebon Praetor =5 -Ebon Stronghold =10 -Ebonblade Reaper =25 -Ebony Charm =25 -Ebony Horse =86 -Ebony Owl Netsuke =25 -Ebony Rhino =99 -Ebony Treefolk =36 -Echo Chamber =33 -Echo Tracer =25 -Echoing Calm =25 -Echoing Courage =25 -Echoing Decay =25 -Echoing Ruin =25 -Echoing Truth =35 -Edge of Autumn =25 -Edge of the Divinity =25 -Edgewalker =25 -Eerie Procession =28 -Ego Erasure =25 -Eiganjo Castle =75 -Eiganjo Free-Riders =29 -Eight-and-a-Half-Tails =136 -Eightfold Maze =1122 -Ekundu Cyclops =25 -Ekundu Griffin =25 -El-Hajjaj =42 -Eladamri, Lord of Leaves =477 -Eladamri's Call =117 -Eladamri's Vineyard =121 -Elder Druid =25 -Elder Land Wurm =50 -Elder Mastery =27 -Elder Pine of Jukai =25 -Elder Spawn =99 -Eldrazi Monument =586 -Electric Eel =25 -Electrolyze =28 -Electropotence =31 -Electrostatic Bolt =25 -Electryte =99 -Elemental Appeal =45 -Elemental Augury =50 -Elemental Mastery =41 -Elemental Resonance =25 -Elephant Ambush =25 -Elephant Grass =159 -Elephant Graveyard =1842 -Elephant Guide =7 -Elephant Resurgence =25 -Elephant Token =7 -Elf Replica =26 -Elfhame Palace =56 -Elfhame Sanctuary =99 -Elite Archers =25 -Elite Cat Warrior =99 -Elite Javelineer =6 -Elite Vanguard =52 -Elixir of Vitality =25 -Elkin Bottle =51 -Elkin Lair =62 -Elsewhere Flask =25 -Elspeth, Knight-Errant =3179 -Elven Cache =24 -Elven Fortress =25 -Elven Lyre =6 -Elven Palisade =50 -Elven Riders =6 -Elven Rite =25 -Elven Warhounds =99 -Elves of Deep Shadow =26 -Elvish Aberration =99 -Elvish Archdruid =557 -Elvish Archers =33 -Elvish Bard =22 -Elvish Berserker =25 -Elvish Branchbender =25 -Elvish Champion =99 -Elvish Eulogist =25 -Elvish Farmer =92 -Elvish Fury =47 -Elvish Guidance =25 -Elvish Handservant =25 -Elvish Harbinger =81 -Elvish Healer =25 -Elvish Herder =25 -Elvish Hexhunter =25 -Elvish House Party =25 -Elvish Hunter =25 -Elvish Lookout =25 -Elvish Lyrist =25 -Elvish Pathcutter =25 -Elvish Pioneer =25 -Elvish Piper =82 -Elvish Promenade =142 -Elvish Ranger =38 -Elvish Scout =25 -Elvish Scrapper =32 -Elvish Skysweeper =25 -Elvish Soultiller =99 -Elvish Spirit Guide =302 -Elvish Vanguard =143 -Elvish Visionary =25 -Elvish Warrior =20 -Embalmed Brawler =25 -Embargo =25 -Ember Beast =25 -Ember Gale =25 -Ember Shot =25 -Ember Weaver =20 -Ember-Fist Zubera =25 -Embermage Goblin =25 -Emberstrike Duo =25 -Emberwilde Augur =25 -Emberwilde Caliph =25 -Emberwilde Djinn =74 -Emblazoned Golem =25 -Emblem of the Warmind =25 -Embolden =25 -Emerald Charm =48 -Emerald Dragonfly =25 -Emerald Medallion =179 -Emerald Oryx =25 -Emeria Angel =142 -Emeria, the Sky Ruin =77 -Emissary of Despair =99 -Emissary of Hope =25 -Emmessi Tome =25 -Emperor Crocodile =25 -Empress Galina =56 -Empty City Ruse =400 -Empty the Catacombs =20 -Empty the Warrens =44 -Empty-Shrine Kannushi =25 -Empyrial Archangel =215 -Empyrial Armor =29 -Empyrial Plate =25 -Enchanted Evening =56 -Enchantment Alteration =33 -Enchantress's Presence =224 -Enclave Elite =15 -Encroach =25 -Endangered Armodon =25 -Endbringer's Revel =25 -Endemic Plague =74 -Endless Cockroaches =99 -Endless Horizons =62 -Endless Scream =6 -Endless Swarm =47 -Endless Whispers =25 -Endless Wurm =99 -Endoskeleton =25 -Endrek Sahr, Master Breeder =38 -Endure =25 -Enduring Ideal =78 -Enduring Renewal =36 -Enemy of the Guildpact =25 -Energizer =74 -Energy Arc =25 -Energy Bolt =87 -Energy Chamber =105 -Energy Field =147 -Energy Flux =4 -Energy Storm =199 -Energy Tap =16 -Energy Vortex =94 -Enervate =25 -Enfeeblement =5 -Engineered Explosives =1323 -Engineered Plague =90 -Engulfing Flames =50 -Enigma Eidolon =25 -Enigma Sphinx =27 -Enlightened Tutor =444 -Enlisted Wurm =25 -Enlistment Officer =25 -Enormous Baloth =22 -Enrage =25 -Enraging Licid =100 -Enshrined Memories =28 -Enslave =25 -Enslaved Dwarf =17 -Enslaved Horror =25 -Enslaved Scout =12 -Ensnare =16 -Ensnaring Bridge =136 -Ensouled Scimitar =49 -Entangler =77 -Entangling Trap =25 -Entangling Vines =25 -Enter the Dungeon =99 -Entomb =2389 -Entrails Feaster =49 -Entropic Eidolon =25 -Entropic Specter =34 -Envelop =25 -Eon Hub =100 -Ephemeron =74 -Epic Proportions =22 -Epic Struggle =46 -Epicenter =25 -Epochrasite =102 -Equal Treatment =99 -Equilibrium =49 -Equinox =1 -Equipoise =87 -Eradicate =17 -Erase =26 -Erayo, Soratami Ascendant =319 -Erg Raiders =6 -Erhnam Djinn =19 -Erithizon =25 -Eron the Relentless =25 -Erosion =25 -Errand of Duty =12 -Errant Doomsayers =17 -Errant Ephemeron =17 -Errant Minion =25 -Errantry =25 -Erratic Explosion =25 -Erratic Mutation =17 -Erratic Portal =62 -Ersatz Gnomes =25 -Ertai, the Corrupted =42 -Ertai, Wizard Adept =244 -Ertai's Familiar =74 -Ertai's Meddling =25 -Ertai's Trickery =20 -Escape Artist =25 -Escape Routes =25 -Escaped Shapeshifter =112 -Esper Battlemage =25 -Esper Charm =49 -Esper Cormorants =20 -Esper Panorama =36 -Esper Sojourners =25 -Esper Stormblade =32 -Esperzoa =25 -Essence Bottle =10 -Essence Drain =25 -Essence Filter =25 -Essence Flare =25 -Essence Fracture =99 -Essence Leak =25 -Essence Scatter =25 -Essence Sliver =53 -Essence Vortex =10 -Essence Warden =23 -Etched Oracle =71 -Eternal Dominion =47 -Eternal Dragon =91 -Eternal Flame =99 -Eternal Warrior =25 -Eternal Witness =236 -Eternity Snare =17 -Eternity Vessel =49 -Ether Well =25 -Ethercaste Knight =99 -Ethereal Champion =25 -Ethereal Haze =41 -Ethereal Usher =29 -Ethereal Whiskergill =49 -Etherium Abomination =25 -Etherium Astrolabe =25 -Etherium Sculptor =33 -Ethersworn Adjudicator =159 -Ethersworn Canonist =330 -Ethersworn Shieldmage =25 -Etherwrought Page =25 -Eunuchs' Intrigues =115 -Eureka =2219 -Evacuation =42 -Evangelize =25 -Evaporate =25 -Evasive Action =29 -Even the Odds =25 -Everbark Shaman =25 -Everglades =25 -Everglove Courier =25 -Everlasting Torment =150 -Evermind =25 -Evershrike =30 -Evil Eye of Orms-by-Gore =25 -Evil Eye of Urborg =6 -Evil Presence =25 -Evincar's Justice =25 -Eviscerator =25 -Evolution Charm =25 -Evolution Vat =25 -Exalted Angel =610 -Exalted Dragon =99 -Excavation =50 -Excavator =38 -Excise =25 -Exclude =36 -Excommunicate =3 -Excruciator =50 -Execute =31 -Executioner's Capsule =25 -Exhaustion =25 -Exhume =88 -Exhumer Thrull =25 -Exile =89 -Exile into Darkness =25 -Exiled Boggart =25 -Exiled Doomsayer =62 -Exorcist =250 -Exoskeletal Armor =38 -Exotic Curse =25 -Exotic Disease =23 -Exotic Orchard =143 -Expedition Map =30 -Expendable Troops =25 -Experiment Kraj =68 -Exploding Borders =25 -Exploration =1742 -Explorer's Scope =25 -Explosive Growth =25 -Explosive Vegetation =44 -Expunge =25 -Extinction =72 -Extinguish =6 -Extirpate =737 -Extortion =36 -Extra Arms =31 -Extract =127 -Extractor Demon =57 -Extraplanar Lens =128 -Extravagant Spirit =38 -Extruder =29 -Exuberant Firestoker =25 -Eye for an Eye =17 -Eye of Nowhere =25 -Eye of Ramos =49 -Eye of Singularity =98 -Eye of the Storm =25 -Eye of Yawgmoth =25 -Eye Spy =25 -Eyeblight's Ending =25 -Eyes of the Watcher =49 -Eyes of the Wisent =48 -Fa'adiyah Seer =25 -Fable of Wolf and Owl =62 -Fabricate =35 -Face of Fear =25 -Faceless Butcher =25 -Faceless Devourer =25 -Faces of the Past =25 -Facevaulter =25 -Fact or Fiction =111 -Fade Away =99 -Fade from Memory =25 -Faerie Conclave =47 -Faerie Harbinger =25 -Faerie Macabre =25 -Faerie Mechanist =25 -Faerie Noble =91 -Faerie Squadron =25 -Faerie Swarm =38 -Faerie Tauntings =25 -Faerie Trickery =25 -Faith Healer =67 -Faith's Fetters =25 -Faithful Squire =25 -Fallen Angel =19 -Fallen Askari =25 -Fallen Cleric =29 -Fallen Ideal =6 -Falling Star =55 -Falling Timber =26 -Fallow Earth =25 -Fallow Wurm =25 -Fallowsage =25 -False Cure =99 -False Dawn =50 -False Defeat =214 -False Demise =6 -False Memories =25 -False Mourning =127 -False Orders =99 -False Peace =25 -False Prophet =75 -Falter =25 -Familiar Ground =33 -Familiar's Ruse =28 -Famished Ghoul =25 -Fanatical Devotion =25 -Fanatical Fever =99 -Fang Skulkin =25 -Fangren Firstborn =97 -Fangren Hunter =50 -Fangren Pathcutter =49 -Fanning the Flames =25 -Far Wanderings =25 -Farhaven Elf =25 -Farmstead =68 -Farrel's Mantle =25 -Farrel's Zealot =480 -Farrelite Priest =4 -Farseek =25 -Farsight Mask =51 -Fastbond =474 -Fasting =30 -Fatal Attraction =25 -Fatal Blow =25 -Fatal Frenzy =49 -Fatal Lore =62 -Fatal Mutation =28 -Fate Transfer =25 -Fatespinner =33 -Fatestitcher =12 -Fathom Seer =25 -Fathom Trawl =18 -Fatigue =33 -Fault Line =100 -Fault Riders =25 -Faultgrinder =25 -Favor of the Mighty =19 -Favor of the Overbeing =25 -Favorable Destiny =25 -Fear =16 -Feast of Blood =29 -Feast of Flesh =25 -Feast of the Unicorn =50 -Feast of Worms =25 -Feast or Famine =12 -Fecundity =25 -Feebleness =17 -Feedback =25 -Feedback Bolt =49 -Feeding Frenzy =7 -Feint =25 -Feldon's Cane =25 -Felidar Sovereign =142 -Fellwar Stone =25 -Femeref Archers =27 -Femeref Enchantress =9 -Femeref Healer =25 -Femeref Knight =25 -Femeref Scouts =25 -Fen Stalker =25 -Fencer Clique =25 -Fencer's Magemark =25 -Fend Off =26 -Fendeep Summoner =32 -Feral Animist =28 -Feral Deceiver =25 -Feral Hydra =46 -Feral Instinct =5 -Feral Lightning =29 -Feral Shadow =25 -Feral Thallid =6 -Feral Throwback =25 -Ferocious Charge =25 -Ferocity =550 -Feroz's Ban =25 -Ferropede =33 -Fertile Ground =25 -Fertile Imagination =26 -Fertilid =25 -Fervent Charge =25 -Fervent Denial =25 -Fervor =50 -Festering Evil =87 -Festering Goblin =25 -Festering March =7 -Festering Wound =56 -Festival =25 -Festival of the Guildpact =25 -Festival of Trokin =56 -Fetid Heath =235 -Fetid Horror =12 -Feudkiller's Verdict =31 -Fever Charm =25 -Fevered Convulsions =25 -Fevered Strength =12 -Fickle Efreet =100 -Fiddlehead Kami =25 -Field Marshal =125 -Field of Dreams =125 -Field of Reality =25 -Field of Souls =65 -Field Surgeon =26 -Fieldmist Borderpost =41 -Fierce Empath =25 -Fiery Bombardment =25 -Fiery Conclusion =25 -Fiery Fall =25 -Fiery Gambit =54 -Fiery Hellhound =25 -Fiery Justice =41 -Fiery Mantle =14 -Fiery Temper =25 -Fight or Flight =60 -Fight to the Death =31 -Fighting Chance =74 -Fighting Drake =25 -Figure of Destiny =580 -Filigree Angel =63 -Filigree Fracture =25 -Filigree Sages =5 -Fill with Fright =22 -Filth =36 -Filthy Cur =25 -Final Fortune =100 -Final Judgment =99 -Final Punishment =49 -Final Revels =33 -Final Strike =149 -Final-Sting Faerie =25 -Finest Hour =94 -Fire Ambush =99 -Fire and Brimstone =25 -Fire Ants =50 -Fire at Will =25 -Fire Bowman =200 -Fire Covenant =50 -Fire Diamond =25 -Fire Dragon =361 -Fire Drake =25 -Fire Elemental =19 -Fire Imp =37 -Fire Juggler =25 -Fire Snake =99 -Fire Sprites =25 -Fire Tempest =99 -Fire Whip =25 -Fire-Belly Changeling =25 -Fire-Field Ogre =25 -Fire-Lit Thicket =215 -Fire/Ice =86 -Fireball =16 -Fireblast =58 -Firebolt =38 -Firebrand Ranger =25 -Firebreathing =4 -Firecat Blitz =99 -Firefly =400 -Firefright Mage =17 -Firemane Angel =95 -Firemaw Kavu =25 -Fires of Yavimaya =31 -Firescreamer =25 -Fireshrieker =25 -Fireslinger =25 -Firespout =89 -Firestorm =418 -Firestorm Hellkite =50 -Firestorm Phoenix =999 -Firewake Sliver =42 -Firewild Borderpost =25 -First Volley =25 -Fishliver Oil =25 -Fissure =25 -Fist of Suns =121 -Fistful of Force =25 -Fists of Ironwood =41 -Fists of the Anvil =25 -Fists of the Demigod =25 -Fit of Rage =22 -Flagstones of Trokair =422 -Flailing Drake =25 -Flailing Manticore =100 -Flailing Ogre =25 -Flailing Soldier =25 -Flame Burst =25 -Flame Elemental =25 -Flame Fusillade =25 -Flame Jab =25 -Flame Javelin =75 -Flame Jet =25 -Flame Rift =25 -Flame Spirit =25 -Flame Wave =31 -Flame-Kin War Scout =25 -Flame-Kin Zealot =25 -Flameblast Dragon =79 -Flamebreak =200 -Flamecore Elemental =26 -Flamekin Bladewhirl =48 -Flamekin Brawler =25 -Flamekin Harbinger =25 -Flamekin Spitfire =25 -Flames of the Blood Hand =115 -Flameshot =25 -Flamestick Courier =25 -Flametongue Kavu =39 -Flamewave Invoker =25 -Flaming Gambit =6 -Flaming Sword =25 -Flanking Troops =100 -Flare =19 -Flaring Flame-Kin =20 -Flaring Pain =25 -Flash =88 -Flash Conscription =25 -Flash Counter =22 -Flash Flood =17 -Flash Foliage =25 -Flash of Defiance =25 -Flash of Insight =25 -Flashfires =19 -Flashfreeze =25 -Flay =25 -Flayed Nim =50 -Fledgling Djinn =25 -Fledgling Dragon =92 -Fledgling Imp =25 -Fledgling Mawcor =6 -Fledgling Osprey =26 -Fleetfoot Panther =16 -Fleeting Aven =25 -Fleeting Image =25 -Flesh Reaver =99 -Fleshbag Marauder =25 -Fleshformer =25 -Fleshgrafter =25 -Fleshwrither =25 -Flicker =66 -Flickerform =33 -Flickering Spirit =17 -Flickering Ward =49 -Flickerwisp =25 -Flight =25 -Flight of Fancy =25 -Fling =4 -Flint Golem =21 -Floating Shield =17 -Floating-Dream Zubera =25 -Flock of Rabid Sheep =25 -Flood =26 -Flood Plain =62 -Floodbringer =17 -Floodchaser =25 -Flooded Grove =249 -Flooded Shoreline =33 -Flooded Strand =1426 -Flooded Woodlands =50 -Floodgate =26 -Floodwater Dam =87 -Floral Spuzzem =25 -Flourishing Defenses =25 -Flow of Ideas =6 -Flow of Maggots =25 -Flowering Field =25 -Flowstone Armor =25 -Flowstone Blade =25 -Flowstone Channeler =18 -Flowstone Charger =99 -Flowstone Crusher =25 -Flowstone Embrace =25 -Flowstone Flood =26 -Flowstone Giant =25 -Flowstone Hellion =31 -Flowstone Mauler =100 -Flowstone Overseer =67 -Flowstone Salamander =100 -Flowstone Sculpture =99 -Flowstone Shambler =25 -Flowstone Slide =25 -Flowstone Strike =25 -Flowstone Surge =25 -Flowstone Thopter =25 -Flowstone Wall =25 -Fluctuator =211 -Flurry of Wings =99 -Flux =25 -Flying Carpet =25 -Flying Men =101 -Fodder Cannon =25 -Fodder Launch =25 -Fog =25 -Fog Bank =72 -Fog Elemental =25 -Fog of Gnats =111 -Fog Patch =25 -Foil =78 -Fold into AEther =68 -Folk Medicine =25 -Folk of An-Havva =25 -Folk of the Pines =25 -Followed Footsteps =119 -Fomori Nomad =22 -Font of Mythos =350 -Food Chain =96 -Fool's Demise =56 -Fool's Tome =25 -Foot Soldiers =25 -Footbottom Feast =25 -Foothill Guide =25 -Footsteps of the Goryo =41 -Foratog =73 -Forbid =33 -Forbidden Crypt =97 -Forbidden Lore =26 -Forbidden Orchard =455 -Forbidden Ritual =137 -Forbidding Watchtower =25 -Force Bubble =25 -Force of Nature =77 -Force of Savagery =49 -Force of Will =3033 -Force Spike =52 -Force Void =25 -Forced Fruition =24 -Forced March =32 -Forced Retreat =100 -Forcefield =5800 -Forcemage Advocate =8 -Foresee =25 -Foreshadow =25 -Foresight =12 -Forest =5 -Forest Bear =100 -Forethought Amulet =199 -Forfend =17 -Forge Armor =12 -Forget =17 -Forgotten Ancient =181 -Forgotten Cave =25 -Forgotten Harvest =99 -Forgotten Lore =25 -Foriysian Brigade =25 -Foriysian Interceptor =17 -Foriysian Totem =25 -Fork =579 -Forked Lightning =150 -Forked-Branch Garami =25 -Form of the Dragon =66 -Form of the Squirrel =50 -Forsaken City =72 -Forsaken Wastes =74 -Fortified Area =26 -Fortify =26 -Fortitude =25 -Fortune Thief =25 -Fossil Find =37 -Foster =68 -Foul Familiar =25 -Foul Imp =25 -Foul Presence =28 -Fountain of Cho =29 -Fountain of Youth =10 -Fountain Watch =66 -Fowl Play =25 -Foxfire =25 -Foxfire Oak =25 -Fraction Jackson =25 -Fractured Loyalty =50 -Fracturing Gust =27 -Frankenstein's Monster =99 -Frankie Peanuts =51 -Frantic Purification =25 -Frantic Search =19 -Frazzle =28 -Frazzled Editor =20 -Free-for-All =99 -Free-Range Chicken =25 -Freed from the Real =25 -Freewind Equenaut =25 -Freewind Falcon =5 -Frenetic Efreet =25 -Frenetic Ogre =25 -Frenetic Raptor =25 -Frenetic Sliver =25 -Frenzied Goblin =25 -Frenzied Tilling =25 -Frenzy Sliver =25 -Fresh Volunteers =25 -Freyalise Supplicant =25 -Freyalise's Charm =50 -Freyalise's Radiance =25 -Freyalise's Winds =26 -Frightcrawler =25 -Frightshroud Courier =25 -Frog Tongue =49 -Frogmite =19 -Frogtosser Banneret =25 -Frontier Guide =49 -Frontline Sage =20 -Frontline Strategist =25 -Frost Giant =50 -Frost Marsh =26 -Frost Ogre =17 -Frost Raptor =25 -Frostling =25 -Frostweb Spider =25 -Frostwielder =25 -Frozen AEther =25 -Frozen Shade =24 -Frozen Solid =25 -Fruition =50 -Fugitive Druid =43 -Fugitive Wizard =25 -Fugue =25 -Fulminator Mage =128 -Fumiko the Lowblood =88 -Funeral Charm =88 -Funeral March =25 -Funeral Pyre =25 -Fungal Behemoth =25 -Fungal Bloom =99 -Fungal Reaches =16 -Fungal Shambler =4 -Fungus Elemental =50 -Fungus Sliver =53 -Fungusaur =25 -Furious Assault =17 -Furnace Brood =26 -Furnace Dragon =20 -Furnace of Rath =71 -Furnace Spirit =25 -Furnace Whelp =25 -Fury Charm =41 -Fury of the Horde =25 -Fury Sliver =42 -Furystoke Giant =25 -Fusion Elemental =27 -Fylamarid =100 -Fylgja =16 -Fyndhorn Bow =800 -Fyndhorn Brownie =25 -Fyndhorn Druid =25 -Fyndhorn Elder =40 -Fyndhorn Elves =25 -Fyndhorn Pollen =63 -Gabriel Angelfire =67 -Gaddock Teeg =246 -Gaea's Anthem =139 -Gaea's Avenger =99 -Gaea's Balance =25 -Gaea's Blessing =16 -Gaea's Bounty =25 -Gaea's Cradle =2136 -Gaea's Embrace =75 -Gaea's Herald =44 -Gaea's Liege =15 -Gaea's Might =25 -Gaea's Skyfolk =25 -Gaea's Touch =68 -Gainsay =44 -Gale Force =25 -Galepowder Mage =21 -Galina's Knight =20 -Gallantry =33 -Gallowbraid =25 -Galvanic Arc =25 -Galvanic Key =25 -Gamble =420 -Game of Chaos =25 -Game Preserve =25 -Game-Trail Changeling =25 -Gamekeeper =25 -Gang of Elk =5 -Gangrenous Goliath =82 -Gangrenous Zombies =25 -Gargantuan Gorilla =93 -Gargoyle Castle =45 -Garruk Wildspeaker =762 -Garza Zol, Plague Queen =179 -Garza's Assassin =25 -Gaseous Form =19 -Gate Hound =25 -Gate to Phyrexia =126 -Gate to the AEther =25 -Gatekeeper of Malakir =88 -Gathan Raiders =25 -Gather Courage =25 -Gather Specimens =30 -Gatherer of Graces =8 -Gauntlet of Might =4000 -Gauntlet of Power =221 -Gauntlets of Chaos =25 -Gaze of Adamaro =25 -Gaze of Justice =18 -Gaze of Pain =25 -Gaze of the Gorgon =25 -Gelectrode =49 -Gelid Shackles =25 -Gemhide Sliver =91 -Gemini Engine =59 -Gempalm Avenger =25 -Gempalm Incinerator =27 -Gempalm Polluter =41 -Gempalm Sorcerer =25 -Gempalm Strider =25 -Gemstone Array =100 -Gemstone Caverns =73 -Gemstone Mine =231 -General Jarkeld =26 -General's Kabuto =62 -General's Regalia =25 -Genesis =209 -Genesis Chamber =64 -Genju of the Cedars =25 -Genju of the Falls =49 -Genju of the Fens =25 -Genju of the Fields =25 -Genju of the Realm =25 -Genju of the Spires =25 -Geothermal Crevice =5 -Gerrard Capashen =99 -Gerrard's Battle Cry =97 -Gerrard's Command =26 -Gerrard's Irregulars =25 -Gerrard's Verdict =19 -Gerrard's Wisdom =17 -Gerrymandering =25 -Get a Life =100 -Geth's Grimoire =25 -Geyser Glider =12 -Ghastlord of Fugue =128 -Ghastly Demise =25 -Ghastly Discovery =25 -Ghastly Remains =62 -Ghazban Ogre =6 -Ghitu Encampment =25 -Ghitu Fire =17 -Ghitu Fire-Eater =5 -Ghitu Firebreathing =17 -Ghitu Slinger =33 -Ghitu War Cry =26 -Ghor-Clan Bloodscale =31 -Ghor-Clan Savage =25 -Ghost Council of Orzhova =54 -Ghost Hounds =25 -Ghost Quarter =184 -Ghost Ship =25 -Ghost Tactician =17 -Ghost Town =25 -Ghost Warden =25 -Ghost-Lit Nourisher =25 -Ghost-Lit Raider =99 -Ghost-Lit Redeemer =25 -Ghost-Lit Stalker =25 -Ghost-Lit Warder =25 -Ghostfire =25 -Ghostflame Sliver =25 -Ghosthelm Courier =25 -Ghostly Changeling =37 -Ghostly Flame =99 -Ghostly Prison =271 -Ghostly Visit =100 -Ghostly Wings =25 -Ghosts of the Damned =25 -Ghosts of the Innocent =25 -Ghostway =71 -Ghoul's Feast =25 -Giant Albatross =25 -Giant Ambush Beetle =25 -Giant Badger =90 -Giant Caterpillar =25 -Giant Cockroach =25 -Giant Crab =25 -Giant Dustwasp =10 -Giant Fan =99 -Giant Growth =25 -Giant Harbinger =25 -Giant Mantis =25 -Giant Octopus =25 -Giant Oyster =25 -Giant Scorpion =25 -Giant Shark =98 -Giant Slug =25 -Giant Solifuge =51 -Giant Spider =25 -Giant Strength =25 -Giant Tortoise =15 -Giant Trap Door Spider =99 -Giant Turtle =25 -Giant Warthog =25 -Giant's Ire =25 -Giantbaiting =25 -Gibbering Descent =25 -Gibbering Hyenas =25 -Gibbering Kami =25 -Gift of Estates =64 -Gift of Granite =25 -Gift of the Deity =25 -Gift of the Gargantuan =12 -Gift of the Woods =12 -Gifts Ungiven =219 -Gigadrowse =31 -Gigantiform =35 -Gigapede =99 -Gilded Drake =252 -Gilded Light =99 -Gilded Lotus =256 -Gilder Bairn =30 -Gilt-Leaf Ambush =25 -Gilt-Leaf Archdruid =51 -Gilt-Leaf Palace =106 -Gilt-Leaf Seer =25 -Giltspire Avenger =47 -Glacial Chasm =100 -Glacial Crevasses =26 -Glacial Fortress =578 -Glacial Plating =25 -Glacial Ray =25 -Glacial Wall =6 -Glaciers =550 -Glade Gnarr =28 -Glamer Spinners =25 -Glamerdye =38 -Glare of Subdual =66 -Glarecaster =64 -Glarewielder =25 -Glass Asp =17 -Glass Golem =25 -Glassdust Hulk =62 -Glasses of Urza =33 -Glaze Fiend =25 -Gleam of Resistance =20 -Gleancrawler =40 -Gleeful Sabotage =25 -Gleemax =99 -Glen Elendra Archmage =208 -Glen Elendra Liege =123 -Glen Elendra Pranksters =38 -Gliding Licid =25 -Glimmerdust Nap =25 -Glimmering Angel =25 -Glimmervoid =226 -Glimpse of Nature =609 -Glimpse the Unthinkable =1316 -Glint-Eye Nephilim =25 -Glintwing Invoker =25 -Glissa Sunseeker =59 -Glitterfang =25 -Glittering Lion =25 -Glittering Lynx =25 -Glittering Wish =58 -Global Ruin =25 -Gloom =12 -Gloomdrifter =25 -Gloomlance =25 -Gloomwidow =50 -Gloomwidow's Feast =25 -Glorious Anthem =76 -Glorious Charge =25 -Glory =99 -Glory of Warfare =46 -Glory Seeker =25 -Gloryscale Viashino =25 -Glowering Rogon =25 -Glowing Anemone =25 -Glowrider =21 -Gluttonous Slime =25 -Gluttonous Zombie =25 -Glyph of Delusion =23 -Glyph of Destruction =25 -Glyph of Doom =25 -Glyph of Life =38 -Glyph of Reincarnation =28 -Gnarled Effigy =37 -Gnarled Mass =17 -Gnat Alley Creeper =25 -Gnat Miser =32 -Goatnapper =33 -Gobhobbler Rats =4 -Goblin Archaeologist =25 -Goblin Artillery =25 -Goblin Artisans =26 -Goblin Assassin =50 -Goblin Assault =85 -Goblin Balloon Brigade =25 -Goblin Berserker =69 -Goblin Bomb =124 -Goblin Bombardment =62 -Goblin Bowling Team =25 -Goblin Brawler =25 -Goblin Brigand =25 -Goblin Burrows =25 -Goblin Bushwhacker =49 -Goblin Cadets =49 -Goblin Cannon =99 -Goblin Caves =25 -Goblin Charbelcher =155 -Goblin Chariot =25 -Goblin Chieftain =220 -Goblin Chirurgeon =33 -Goblin Clearcutter =38 -Goblin Cohort =17 -Goblin Commando =170 -Goblin Deathraiders =25 -Goblin Digging Team =25 -Goblin Dirigible =99 -Goblin Dynamo =25 -Goblin Elite Infantry =25 -Goblin Festival =62 -Goblin Fire Fiend =25 -Goblin Firebug =25 -Goblin Firestarter =49 -Goblin Flectomancer =25 -Goblin Flotilla =6 -Goblin Furrier =25 -Goblin Game =17 -Goblin Gardener =25 -Goblin General =199 -Goblin Glider =25 -Goblin Goon =19 -Goblin Grappler =25 -Goblin Grenade =6 -Goblin Grenadiers =17 -Goblin Guide =329 -Goblin Hero =25 -Goblin King =33 -Goblin Kites =4 -Goblin Lackey =777 -Goblin Legionnaire =25 -Goblin Lookout =25 -Goblin Lore =35 -Goblin Lyre =63 -Goblin Machinist =25 -Goblin Marshal =58 -Goblin Masons =26 -Goblin Matron =25 -Goblin Medics =25 -Goblin Mime =400 -Goblin Mountaineer =25 -Goblin Mutant =25 -Goblin Offensive =6 -Goblin Outlander =25 -Goblin Patrol =25 -Goblin Piker =25 -Goblin Piledriver =951 -Goblin Psychopath =49 -Goblin Pyromancer =49 -Goblin Raider =25 -Goblin Razerunners =35 -Goblin Recruiter =62 -Goblin Replica =50 -Goblin Rimerunner =25 -Goblin Ringleader =106 -Goblin Rock Sled =25 -Goblin Roughrider =14 -Goblin Ruinblaster =26 -Goblin Sappers =25 -Goblin Scouts =11 -Goblin Secret Agent =20 -Goblin Settler =230 -Goblin Sharpshooter =511 -Goblin Shortcutter =25 -Goblin Shrine =25 -Goblin Ski Patrol =16 -Goblin Sky Raider =25 -Goblin Skycutter =17 -Goblin Sledder =25 -Goblin Snowman =25 -Goblin Soothsayer =43 -Goblin Spelunkers =25 -Goblin Spy =25 -Goblin Striker =26 -Goblin Swine-Rider =25 -Goblin Taskmaster =25 -Goblin Tinkerer =25 -Goblin Token =52 -Goblin Trenches =33 -Goblin Turncoat =25 -Goblin Tutor =25 -Goblin Vandal =25 -Goblin War Buggy =25 -Goblin War Cry =50 -Goblin War Drums =27 -Goblin War Paint =25 -Goblin War Strike =25 -Goblin War Wagon =26 -Goblin Warchief =100 -Goblin Warrens =97 -Goblin Welder =462 -Goblin Wizard =587 -Goblins of the Flarg =25 -Godhead of Awe =79 -Godless Shrine =739 -Godo, Bandit Warlord =99 -Godo's Irregulars =99 -Gods' Eye, Gate to the Reikai =25 -Godsire =167 -Godtoucher =25 -Godtracker of Jund =25 -Goham Djinn =25 -Gold Myr =25 -Golden Wish =99 -Goldenglow Moth =25 -Goldmeadow Dodger =25 -Goldmeadow Harrier =25 -Goldmeadow Lookout =31 -Goldmeadow Stalwart =13 -Golem-Skin Gauntlets =12 -Golgari Brownscale =25 -Golgari Germination =6 -Golgari Grave-Troll =112 -Golgari Guildmage =25 -Golgari Rot Farm =25 -Golgari Rotwurm =25 -Golgari Signet =25 -Golgari Thug =92 -Golgothian Sylex =99 -Goliath Beetle =6 -Goliath Spider =25 -Gomazoa =33 -Goretusk Firebeast =25 -Gorger Wurm =25 -Gorgon Flail =28 -Gorgon Recluse =26 -Gorilla Berserkers =12 -Gorilla Chieftain =12 -Gorilla Shaman =20 -Gorilla Titan =25 -Gorilla War Cry =12 -Gorilla Warrior =25 -Goryo's Vengeance =93 -Gossamer Chains =25 -Gossamer Phantasm =5 -Gosta Dirk =226 -Govern the Guildless =47 -Grab the Reins =99 -Graceful Adept =25 -Graceful Antelope =28 -Graceful Reprieve =33 -Grafted Skullcap =12 -Grafted Wargear =99 -Grand Arbiter Augustin IV =193 -Grand Coliseum =106 -Grand Melee =49 -Grandmother Sengir =93 -Granger Guildmage =25 -Granite Gargoyle =99 -Granite Grip =25 -Granite Shard =99 -Granny's Payback =210 -Granulate =25 -Grapeshot =41 -Grapeshot Catapult =6 -Graphic Violence =20 -Grappling Hook =33 -Grassland Crusader =25 -Grasslands =48 -Gratuitous Violence =100 -Grave Consequences =25 -Grave Defiler =25 -Grave Pact =100 -Grave Peril =25 -Grave Robbers =25 -Grave Scrabbler =22 -Grave Servitude =12 -Grave-Shell Scarab =25 -Gravebane Zombie =25 -Gravebind =99 -Graveborn Muse =41 -Gravedigger =25 -Gravegouger =17 -Gravel Slinger =25 -Gravelgill Axeshark =16 -Gravelgill Duo =100 -Graven Cairns =171 -Graven Dominator =35 -Gravespawn Sovereign =99 -Gravestorm =87 -Gravity Sphere =388 -Graxiplon =25 -Gray Ogre =24 -Graypelt Hunter =15 -Graypelt Refuge =37 -Grayscaled Gharial =25 -Grazing Gladehart =25 -Grazing Kelpie =25 -Great Defender =52 -Great Furnace =51 -Great Sable Stag =422 -Great Wall =52 -Great Whale =96 -Greatbow Doyen =48 -Greater Auramancy =153 -Greater Forgeling =99 -Greater Gargadon =84 -Greater Good =75 -Greater Harvester =25 -Greater Morphling =100 -Greater Mossdog =5 -Greater Realm of Preservation =6 -Greater Werewolf =25 -Greed =53 -Greel, Mind Raker =49 -Greel's Caress =25 -Green Mana Battery =44 -Green Scarab =25 -Green Ward =63 -Greener Pastures =62 -Greenseeker =17 -Greenweaver Druid =27 -Grid Monitor =37 -Grief Tyrant =25 -Griffin Canyon =109 -Griffin Guide =6 -Griffin Sentinel =20 -Grifter's Blade =31 -Grim Discovery =25 -Grim Feast =99 -Grim Harvest =25 -Grim Lavamancer =704 -Grim Monolith =470 -Grim Poppet =33 -Grim Reminder =25 -Grim Tutor =9972 -Grimclaw Bats =25 -Grimoire Thief =95 -Grinding Station =25 -Grindstone =1655 -Grinning Demon =66 -Grinning Ignus =25 -Grinning Totem =14 -Grip of Amnesia =25 -Grip of Chaos =44 -Gristle Grinner =25 -Gristleback =28 -Grixis Battlemage =25 -Grixis Charm =25 -Grixis Grimblade =25 -Grixis Illusionist =25 -Grixis Panorama =36 -Grixis Slavedriver =25 -Grixis Sojourners =25 -Grizzled Leotau =50 -Grizzled Wolverine =15 -Grizzly Bears =25 -Grizzly Fate =25 -Groffskithur =26 -Grollub =99 -Grotesque Hybrid =45 -Ground Rift =17 -Ground Seal =55 -Groundbreaker =103 -Groundling Pouncer =25 -Groundskeeper =25 -Grove of the Burnwillows =362 -Growth Spurt =100 -Grozoth =57 -Gruul Guildmage =25 -Gruul Nodorog =25 -Gruul Scrapper =25 -Gruul Signet =25 -Gruul Turf =25 -Gruul War Plow =25 -Guan Yu, Sainted Warrior =800 -Guan Yu's 1,000-Li March =1400 -Guard Dogs =22 -Guardian Angel =25 -Guardian Beast =3058 -Guardian Idol =49 -Guardian of Cloverdell =25 -Guardian of Solitude =99 -Guardian of the Guildpact =25 -Guardian of Vitu-Ghazi =99 -Guardian Seraph =42 -Guardian's Magemark =25 -Guardians of Akrasa =25 -Guerrilla Tactics =8 -Guided Passage =99 -Guided Strike =25 -Guiding Spirit =92 -Guile =37 -Guiltfeeder =190 -Guilty Conscience =69 -Gulf Squid =25 -Guma =75 -Gurzigost =44 -Gush =39 -Gustcloak Cavalier =33 -Gustcloak Harrier =25 -Gustcloak Runner =25 -Gustcloak Savior =99 -Gustcloak Sentinel =25 -Gustcloak Skirmisher =25 -Gustha's Scepter =25 -Gustrider Exuberant =31 -Gutless Ghoul =25 -Guttural Response =25 -Gutwrencher Oni =25 -Guul Draz Specter =37 -Guul Draz Vampire =25 -Gwafa Hazid, Profiteer =33 -Gwendlyn Di Corci =1122 -Gwyllion Hedge-Mage =175 -Haakon, Stromgald Scourge =107 -Haazda Exonerator =25 -Haazda Shield Mate =25 -Hag Hedge-Mage =25 -Hagra Crocodile =25 -Hagra Diabolist =25 -Hail of Arrows =28 -Hail Storm =25 -Hair-Strung Koto =50 -Hakim, Loreweaver =25 -Halam Djinn =25 -Halberdier =25 -Halcyon Glaze =6 -Halfdane =579 -Hall of Gemstone =74 -Hall of the Bandit Lord =37 -Hallow =25 -Hallowed Burial =114 -Hallowed Fountain =1015 -Hallowed Ground =25 -Hallowed Healer =25 -Halls of Mist =48 -Halo Hunter =32 -Hamletback Goliath =34 -Hammer Mage =12 -Hammer of Bogardan =42 -Hammerfist Giant =25 -Hammerhead Shark =25 -Hammerheim =82 -Hammerheim Deadeye =6 -Hana Kami =37 -Hanabi Blast =25 -Hand of Cruelty =99 -Hand of Death =25 -Hand of Honor =16 -Hand of Justice =99 -Hand to Hand =25 -Hankyu =99 -Hanna, Ship's Navigator =66 -Hanna's Custody =44 -Hapless Researcher =25 -Harbinger of Night =56 -Harbinger of Spring =17 -Harbor Guardian =25 -Harm's Way =41 -Harmattan Efreet =25 -Harmonic Convergence =26 -Harmonic Sliver =50 -Harmonize =108 -Harmony of Nature =187 -Harpoon Sniper =58 -Harrier Griffin =28 -Harrow =19 -Harsh Deceiver =25 -Harsh Judgment =36 -Harsh Justice =249 -Harsh Mercy =28 -Haru-Onna =28 -Harvest Gwyllion =25 -Harvest Mage =25 -Harvest Wurm =25 -Harvester Druid =25 -Hasran Ogress =100 -Hatchet Bully =25 -Hatching Plans =20 -Hate Weaver =6 -Hateflayer =31 -Hatred =208 -Haunted Angel =99 -Haunted Cadaver =9999 -Haunted Crossroads =56 -Haunting Apparition =25 -Haunting Echoes =107 -Haunting Hymn =25 -Haunting Misery =25 -Haunting Wind =49 -Havenwood Battleground =25 -Havenwood Wurm =17 -Havoc =25 -Havoc Demon =112 -Hawkeater Moth =99 -Hazduhr the Abbot =48 -Haze of Rage =25 -Hazerider Drake =25 -Hazezon Tamar =1130 -Hazy Homunculus =25 -He Who Hungers =25 -Head Games =33 -Headhunter =12 -Headless Horseman =25 -Headlong Rush =25 -Headstone =25 -Heal =25 -Heal the Scars =25 -Healer's Headdress =25 -Healing Leaves =5 -Healing Salve =5 -Heap Doll =25 -Heart of Bogardan =112 -Heart of Light =30 -Heart of Ramos =33 -Heart of Yavimaya =40 -Heart Sliver =32 -Heart Warden =25 -Heart Wolf =48 -Heartbeat of Spring =114 -Hearth Charm =25 -Hearth Kami =25 -Hearthcage Giant =25 -Hearthfire Hobgoblin =56 -Heartlash Cinder =25 -Heartless Hidetsugu =6 -Heartmender =52 -Heartseeker =47 -Heartstabber Mosquito =25 -Heartstone =47 -Heartwood Dryad =25 -Heartwood Giant =74 -Heartwood Shard =99 -Heartwood Storyteller =35 -Heartwood Treefolk =25 -Heat of Battle =25 -Heat Ray =25 -Heat Shimmer =24 -Heat Stroke =75 -Heat Wave =25 -Heaven's Gate =65 -Heavy Ballista =10 -Heavy Fog =100 -Hecatomb =12 -Hedge Troll =25 -Hedron Crab =46 -Hedron Scrabbler =25 -Heed the Mists =25 -Heedless One =76 -Heidar, Rimewind Master =25 -Heightened Awareness =31 -Helionaut =26 -Heliophial =25 -Helium Squirter =25 -Helix Pinnacle =72 -Hell Swarm =36 -Hell-Bent Raider =52 -Hell's Caretaker =99 -Hell's Thunder =346 -Helldozer =47 -Hellfire =752 -Hellfire Mongrel =25 -Hellhole Rats =25 -Hellkite Charger =33 -Hellkite Hatchling =25 -Hellkite Overlord =265 -Hellspark Elemental =64 -Helm of Awakening =50 -Helm of Chatzuk =25 -Helm of Kaldra =99 -Helm of Obedience =222 -Helm of Possession =77 -Helm of the Ghastlord =47 -Hematite Golem =25 -Hematite Talisman =25 -Henchfiend of Ukor =22 -Henge Guardian =25 -Henge of Ramos =25 -Herald of Leshrac =50 -Herald of Serra =99 -Herbal Poultice =25 -Herd Gnarr =17 -Heritage Druid =90 -Hermetic Study =25 -Hermit Druid =33 -Hero's Demise =99 -Hero's Resolve =25 -Heroes Remembered =47 -Heroes' Reunion =69 -Heroic Defiance =26 -Heroism =4 -Hesitation =35 -Hex =25 -Hibernation =25 -Hibernation Sliver =66 -Hibernation's End =48 -Hickory Woodlot =25 -Hidden Ancients =99 -Hidden Gibbons =22 -Hidden Guerrillas =50 -Hidden Herd =25 -Hidden Horror =25 -Hidden Path =99 -Hidden Predators =25 -Hidden Retreat =74 -Hidden Spider =25 -Hidden Stag =40 -Hide/Seek =75 -Hideous End =30 -Hideous Laughter =99 -Hidetsugu's Second Rite =56 -High Ground =25 -High Market =193 -High Seas =25 -High Tide =33 -Highland Berserker =25 -Highland Weald =25 -Highway Robber =25 -Higure, the Still Wind =25 -Hikari, Twilight Guardian =30 -Hill Giant =24 -Hillcomber Giant =25 -Hinder =68 -Hindering Light =25 -Hindering Touch =25 -Hint of Insanity =99 -Hipparion =15 -Hired Giant =6 -Hired Muscle =25 -Hisoka, Minamo Sensei =25 -Hisoka's Defiance =17 -Hisoka's Guard =25 -Hissing Iguanar =25 -Hissing Miasma =25 -Hit/Run =25 -Hive Mind =47 -Hivestone =27 -Hivis of the Scale =93 -Hoar Shade =25 -Hoarder's Greed =25 -Hobble =26 -Hobgoblin Dragoon =25 -Hokori, Dust Drinker =97 -Hold the Line =47 -Holistic Wisdom =99 -Hollow Dogs =25 -Hollow Specter =75 -Hollow Trees =99 -Hollow Warrior =25 -Hollowborn Barghest =25 -Hollowsage =25 -Holy Armor =25 -Holy Day =25 -Holy Light =25 -Holy Strength =20 -Homarid =49 -Homarid Shaman =20 -Homarid Spawning Bed =4 -Homarid Warrior =25 -Homing Sliver =44 -Homura, Human Ascendant =97 -Honden of Cleansing Fire =25 -Honden of Infinite Rage =31 -Honden of Life's Web =25 -Honden of Night's Reach =4 -Honden of Seeing Winds =25 -Honor Guard =25 -Honor of the Pure =361 -Honor-Worn Shaku =49 -Honorable Passage =25 -Honorable Scout =26 -Hooded Kavu =25 -Hoodwink =56 -Hoof Skulkin =25 -Hoofprints of the Stag =42 -Hope and Glory =26 -Hope Charm =25 -Hopping Automaton =34 -Horde of Boggarts =25 -Horde of Notions =39 -Horizon Canopy =223 -Horizon Seed =25 -Horn of Deafening =25 -Horn of Greed =99 -Horn of Plenty =100 -Horn of Ramos =99 -Horned Cheetah =25 -Horned Helm =25 -Horned Kavu =25 -Horned Sliver =137 -Horned Troll =25 -Horned Turtle =20 -Hornet Cannon =25 -Hornet Cobra =25 -Hornet Harasser =25 -Horobi, Death's Wail =25 -Horobi's Whisper =17 -Horrible Hordes =25 -Horror of Horrors =98 -Horseshoe Crab =25 -Hostile Realm =25 -Hostility =34 -Hot Springs =40 -Hotheaded Giant =25 -Hour of Reckoning =31 -Hoverguard Observer =29 -Hoverguard Sweepers =28 -Howl from Beyond =24 -Howling Banshee =90 -Howling Fury =56 -Howling Gale =6 -Howling Mine =33 -Howling Wolf =56 -Howltooth Hollow =39 -Hua Tuo, Honored Physician =2033 -Huang Zhong, Shu General =786 -Hulking Cyclops =25 -Hulking Goblin =99 -Hulking Ogre =26 -Hull Breach =25 -Hum of the Radix =99 -Humble =25 -Humble Budoka =25 -Humility =487 -Hunding Gjornersen =53 -Hundred-Talon Kami =25 -Hundred-Talon Strike =17 -Hundroog =25 -Hunger of the Nim =25 -Hungry Hungry Heifer =25 -Hungry Mist =25 -Hungry Spriggan =25 -Hunt Down =25 -Hunted Dragon =65 -Hunted Horror =55 -Hunted Lammasu =25 -Hunted Phantasm =27 -Hunted Troll =30 -Hunted Wumpus =25 -Hunter of Eyeblights =25 -Hunter Sliver =50 -Hunting Cheetah =898 -Hunting Drake =38 -Hunting Grounds =152 -Hunting Kavu =25 -Hunting Moa =25 -Hunting Triad =25 -Hunting Wilds =25 -Hurkyl's Recall =25 -Hurloon Minotaur =24 -Hurloon Shaman =26 -Hurloon Wrangler =25 -Hurly-Burly =25 -Hurr Jackal =25 -Hurricane =15 -Hush =20 -Hyalopterous Lemure =25 -Hydroblast =6 -Hydromorph Gull =99 -Hymn of Rebirth =25 -Hymn to Tourach =25 -Hypergenesis =167 -Hyperion Blacksmith =55 -Hypervolt Grasp =28 -Hypnotic Cloud =25 -Hypnotic Specter =86 -Hypnox =87 -Hypochondria =8 -Hystrodon =25 -Ib Halfheart, Goblin Tactician =48 -Icatian Crier =17 -Icatian Infantry =99 -Icatian Javelineers =25 -Icatian Lieutenant =27 -Icatian Moneychanger =100 -Icatian Phalanx =4 -Icatian Priest =4 -Icatian Scout =25 -Icatian Skirmishers =33 -Icatian Store =81 -Icatian Town =47 -Ice Cage =20 -Ice Cauldron =99 -Ice Cave =25 -Ice Floe =25 -Ice Storm =887 -Icefall =25 -Icequake =25 -Ichneumon Druid =99 -Ichor Slick =25 -Ichorid =234 -Icy Manipulator =36 -Icy Prison =26 -Ideas Unbound =31 -Identity Crisis =34 -Idle Thoughts =25 -Idyllic Tutor =123 -Ifh-Biff Efreet =1107 -Igneous Golem =25 -Igneous Pouncer =99 -Ignite Disorder =25 -Ignite Memories =12 -Ignoble Soldier =5 -Ignorant Bliss =50 -Ihsan's Shade =10 -Iizuka the Ruthless =25 -Ill-Gotten Gains =142 -Illicit Auction =25 -Illuminate =6 -Illuminated Folio =25 -Illuminated Wings =26 -Illumination =25 -Illusion/Reality =25 -Illusionary Forces =25 -Illusionary Mask =4322 -Illusionary Presence =999 -Illusionary Servant =25 -Illusionary Terrain =167 -Illusionary Wall =10 -Illusions of Grandeur =239 -Illusory Demon =25 -Imagecrafter =25 -Imaginary Pet =93 -Immaculate Magistrate =236 -Immobilizing Ink =25 -Immolation =49 -Immortal Coil =39 -Imp's Mischief =39 -Impatience =25 -Impelled Giant =25 -Impending Disaster =76 -Imperial Edict =300 -Imperial Hellkite =99 -Imperial Mask =47 -Imperial Recruiter =10400 -Imperial Seal =26056 -Imperiosaur =25 -Imperious Perfect =229 -Implements of Sacrifice =99 -Implode =6 -Imposing Visage =25 -Imprison =299 -Impromptu Raid =40 -Improvised Armor =25 -Imps' Taunt =25 -Impulse =30 -Impulsive Maneuvers =25 -In the Eye of Chaos =2196 -In the Web of War =99 -Iname as One =25 -Iname, Death Aspect =25 -Iname, Life Aspect =163 -Incandescent Soulstoke =76 -Incendiary =29 -Incendiary Command =34 -Incinerate =23 -Incite Hysteria =25 -Incite War =25 -Incoming! =84 -Incremental Blight =49 -Incremental Growth =25 -Incurable Ogre =25 -Indebted Samurai =8 -Indentured Djinn =25 -Indentured Oaf =25 -Independent Troops =100 -Indestructibility =46 -Indestructible Aura =25 -Index =25 -Indigo Faerie =25 -Indomitable Ancients =127 -Indomitable Will =25 -Indrik Stomphowler =19 -Induce Paranoia =25 -Inertia Bubble =25 -Inescapable Brute =25 -Infantry Veteran =25 -Infected Vermin =28 -Infectious Horror =25 -Infectious Host =25 -Infectious Rage =6 -Infernal Caretaker =25 -Infernal Contract =30 -Infernal Darkness =99 -Infernal Denizen =50 -Infernal Genesis =62 -Infernal Harvest =25 -Infernal Kirin =47 -Infernal Medusa =75 -Infernal Spawn of Evil =99 -Infernal Spawn of Infernal Spawn of Evil =49 -Infernal Tribute =74 -Infernal Tutor =233 -Inferno =25 -Inferno Elemental =90 -Inferno Trap =25 -Infest =6 -Infested Roothold =25 -Infiltrate =25 -Infiltrator il-Kor =25 -Infiltrator's Magemark =17 -Infinite Authority =125 -Infinite Hourglass =25 -Inflame =25 -Information Dealer =25 -Infused Arrows =49 -Ingenious Thief =25 -Ingot Chewer =25 -Inheritance =25 -Initiate of Blood =5 -Initiates of the Ebon Hand =25 -Ink Dissolver =25 -Ink-Eyes, Servant of Oni =499 -Ink-Treader Nephilim =25 -Inkfathom Divers =25 -Inkfathom Infiltrator =25 -Inkfathom Witch =25 -Inkwell Leviathan =140 -Inner Calm, Outer Strength =29 -Inner Fire =29 -Inner Sanctum =49 -Inner-Chamber Guard =99 -Inner-Flame Acolyte =25 -Inner-Flame Igniter =25 -Innocence Kami =25 -Innocent Blood =35 -Inquisition =29 -Inquisitor's Snare =25 -Insect Token =128 -Inside Out =25 -Insidious Bookworms =37 -Insidious Dreams =125 -Insight =25 -Insist =25 -Insolence =26 -Inspiration =25 -Inspired Sprite =25 -Inspirit =25 -Instigator =599 -Instill Energy =14 -Instill Furor =25 -Insubordination =25 -Insurrection =75 -Interdict =25 -Intervene =25 -Intervention Pact =50 -Intet, the Dreamer =67 -Intimidation =20 -Intimidation Bolt =44 -Intimidator Initiate =68 -Into the Fray =25 -Into the North =25 -Into the Roil =39 -Into Thin Air =25 -Intrepid Hero =100 -Intruder Alarm =112 -Intuition =915 -Inundate =50 -Invasion Plans =29 -Invert the Skies =25 -Invigorate =63 -Invigorating Boon =25 -Invigorating Falls =25 -Invincible Hymn =33 -Inviolability =49 -Invisibility =26 -Invoke Prejudice =1483 -Invoke the Firemind =30 -Invulnerability =25 -Ion Storm =25 -Iona, Shield of Emeria =472 -Ior Ruin Expedition =25 -Ire of Kaminari =30 -Iridescent Angel =93 -Iridescent Drake =6 -Irini Sengir =27 -Iron Lance =27 -Iron Maiden =100 -Iron Myr =33 -Iron Star =25 -Iron Tusk Elephant =25 -Iron Will =25 -Iron-Barb Hellion =99 -Iron-Heart Chimera =25 -Ironclaw Buzzardiers =17 -Ironclaw Curse =33 -Ironclaw Orcs =16 -Ironfist Crusher =25 -Ironroot Treefolk =25 -Ironshell Beetle =25 -Irradiate =25 -Irrigation Ditch =17 -Isamaru, Hound of Konda =266 -Isao, Enlightened Bushi =10 -Island =5 -Island Fish Jasconius =25 -Island of Wak-Wak =2117 -Island Sanctuary =50 -Isleback Spawn =30 -Isochron Scepter =395 -Isperia the Inscrutable =56 -Ith, High Arcanist =99 -Ivory Charm =25 -Ivory Crane Netsuke =25 -Ivory Cup =25 -Ivory Gargoyle =25 -Ivory Giant =17 -Ivory Guardians =27 -Ivory Mask =84 -Ivory Tower =113 -Ivy Dancer =25 -Ivy Elemental =100 -Ivy Seer =29 -Iwamori of the Open Fist =25 -Ixidor, Reality Sculptor =69 -Ixidor's Will =33 -Ixidron =48 -Izzet Boilerworks =25 -Izzet Chronarch =25 -Izzet Guildmage =25 -Izzet Signet =25 -Jabari's Banner =23 -Jabari's Influence =93 -Jace Beleren =630 -Jace, the Mind Sculptor =5055 -Jack-in-the-Mox =99 -Jackal Familiar =25 -Jackal Pup =28 -Jackalope Herd =26 -Jacques le Vert =524 -Jade Idol =50 -Jade Leech =25 -Jade Monolith =52 -Jade Statue =99 -Jaded Response =28 -Jagged Lightning =25 -Jagged Poppet =25 -Jagged-Scar Archers =48 -Jalum Grifter =99 -Jalum Tome =25 -Jamuraan Lion =25 -Jandor's Ring =99 -Jandor's Saddlebags =25 -Jangling Automaton =18 -Jareth, Leonine Titan =99 -Jasmine Boreal =50 -Jasmine Seer =29 -Jawbone Skulkin =25 -Jaws of Stone =48 -Jaya Ballard, Task Mage =68 -Jayemdae Tome =25 -Jedit Ojanen =55 -Jedit Ojanen of Efrava =43 -Jedit's Dragoons =25 -Jenara, Asura of War =272 -Jerrard of the Closed Fist =62 -Jeska, Warrior Adept =72 -Jester's Cap =104 -Jester's Mask =99 -Jester's Scepter =33 -Jester's Sombrero =99 -Jet Medallion =260 -Jetting Glasskite =25 -Jeweled Amulet =33 -Jeweled Bird =114 -Jeweled Spirit =25 -Jeweled Torque =28 -Jhessian Balmgiver =56 -Jhessian Infiltrator =25 -Jhessian Lookout =25 -Jhessian Zombies =25 -Jhoira of the Ghitu =74 -Jhoira's Timebug =25 -Jhoira's Toolbox =25 -Jhovall Queen =33 -Jhovall Rider =25 -Jihad =2715 -Jilt =25 -Jinx =25 -Jinxed Choker =25 -Jinxed Idol =62 -Jinxed Ring =38 -Jiwari, the Earth Aflame =88 -Jodah's Avenger =25 -Johan =118 -Johnny, Combo Player =99 -Johtull Wurm =25 -Joiner Adept =75 -Jokulhaups =25 -Jokulmorder =50 -Jolrael, Empress of Beasts =30 -Jolrael's Centaur =25 -Jolrael's Favor =25 -Jolt =25 -Jolting Merfolk =25 -Joraga Bard =25 -Jotun Grunt =164 -Jotun Owl Keeper =25 -Journey of Discovery =25 -Journey to Nowhere =27 -Journeyer's Kite =49 -Joven =33 -Joven's Ferrets =33 -Joven's Tools =19 -Jovial Evil =199 -Joyous Respite =25 -Jugan, the Rising Star =99 -Juggernaut =25 -Juju Bubble =25 -Jukai Messenger =25 -Jumbo Imp =25 -Jump =20 -Jund Battlemage =10 -Jund Charm =29 -Jund Hackblade =25 -Jund Panorama =36 -Jund Sojourners =25 -Jungle Barrier =25 -Jungle Basin =31 -Jungle Lion =193 -Jungle Patrol =74 -Jungle Shrine =99 -Jungle Troll =25 -Jungle Weaver =25 -Jungle Wurm =25 -Juniper Order Advocate =17 -Juniper Order Druid =25 -Juniper Order Ranger =121 -Junk Diver =50 -Junk Golem =37 -Junktroller =25 -Junkyo Bell =69 -Juntu Stakes =49 -Junun Efreet =99 -Jushi Apprentice =25 -Just Fate =49 -Justice =25 -Juvenile Gloomwidow =44 -Juxtapose =25 -Juzam Djinn =12033 -Jwar Isle Refuge =25 -Kabira Crossroads =33 -Kabira Evangel =59 -Kaboom! =99 -Kabuto Moth =25 -Kaervek the Merciless =44 -Kaervek's Hex =25 -Kaervek's Purge =33 -Kaervek's Spite =74 -Kaervek's Torch =43 -Kagemaro, First to Suffer =37 -Kagemaro's Clutch =25 -Kaho, Minamo Historian =69 -Kaijin of the Vanishing Touch =49 -Kaleidostone =25 -Kalitas, Bloodchief of Ghet =120 -Kalonian Behemoth =39 -Kamahl, Fist of Krosa =255 -Kamahl, Pit Fighter =29 -Kamahl's Desire =25 -Kamahl's Sledge =25 -Kamahl's Summons =25 -Kami of Ancient Law =25 -Kami of Empty Graves =25 -Kami of False Hope =25 -Kami of Fire's Roar =25 -Kami of Lunacy =99 -Kami of Old Stone =25 -Kami of Tattered Shoji =17 -Kami of the Crescent Moon =26 -Kami of the Honored Dead =25 -Kami of the Hunt =25 -Kami of the Painted Road =99 -Kami of the Palace Fields =5 -Kami of the Tended Garden =25 -Kami of the Waning Moon =25 -Kami of Twisted Reflection =25 -Kangee, Aerie Keeper =80 -Karakas =928 -Karma =10 -Karmic Guide =91 -Karmic Justice =217 -Karn, Silver Golem =196 -Karn's Touch =62 -Karona, False God =62 -Karona's Zealot =99 -Karoo =98 -Karoo Meerkat =25 -Karplusan Forest =83 -Karplusan Giant =25 -Karplusan Minotaur =25 -Karplusan Strider =25 -Karplusan Wolverine =25 -Karplusan Yeti =33 -Karrthus, Tyrant of Jund =141 -Karstoderm =29 -Kashi-Tribe Elite =25 -Kashi-Tribe Reaver =74 -Kashi-Tribe Warriors =25 -Katabatic Winds =87 -Kataki, War's Wage =167 -Kathari Bomber =25 -Kathari Remnant =25 -Kathari Screecher =25 -Kavu Aggressor =25 -Kavu Chameleon =25 -Kavu Climber =25 -Kavu Glider =26 -Kavu Howler =26 -Kavu Lair =99 -Kavu Mauler =25 -Kavu Monarch =75 -Kavu Predator =83 -Kavu Primarch =25 -Kavu Recluse =26 -Kavu Runner =29 -Kavu Scout =25 -Kavu Titan =72 -Kaysa =25 -Kazandu Blademaster =50 -Kazandu Refuge =44 -Kazuul Warlord =33 -Kederekt Creeper =25 -Kederekt Leviathan =30 -Kederekt Parasite =41 -Keen Sense =25 -Keen-Eyed Archers =99 -Keeneye Aven =25 -Keening Banshee =25 -Keep Watch =25 -Keeper of Kookus =25 -Keeper of Progenitus =41 -Keeper of the Beasts =25 -Keeper of the Dead =12 -Keeper of the Flame =25 -Keeper of the Light =99 -Keeper of the Mind =26 -Keeper of the Nine Gales =99 -Keeper of the Sacred Word =20 -Keeper of Tresserhorn =99 -Keepers of the Faith =25 -Kei Takahashi =18 -Keiga, the Tide Star =176 -Keldon Arsonist =25 -Keldon Battlewagon =25 -Keldon Berserker =25 -Keldon Champion =84 -Keldon Firebombers =37 -Keldon Halberdier =17 -Keldon Mantle =26 -Keldon Marauders =25 -Keldon Megaliths =31 -Keldon Necropolis =28 -Keldon Twilight =38 -Keldon Vandals =6 -Keldon Warlord =13 -Kelinore Bat =49 -Kelsinko Ranger =25 -Kemuri-Onna =29 -Kentaro, the Smiling Cat =47 -Kezzerdrix =74 -Khabal Ghoul =1286 -Khalni Gem =23 -Khalni Heart Expedition =30 -Kher Keep =33 -Kiki-Jiki, Mirror Breaker =300 -Kiku, Night's Flower =93 -Kiku's Shadow =30 -Kill Switch =30 -Kill-Suit Cultist =25 -Killer Bees =25 -Killer Instinct =41 -Killer Whale =12 -Kilnmouth Dragon =207 -Kindle =16 -Kindle the Carnage =25 -Kindled Fury =25 -King Cheetah =12 -King Crab =6 -King Suleiman =559 -King's Assassin =75 -Kingfisher =12 -Kinsbaile Balloonist =25 -Kinsbaile Borderguard =53 -Kinsbaile Cavalier =57 -Kinsbaile Skirmisher =25 -Kinscaer Harpoonist =25 -Kira, Great Glass-Spinner =411 -Kird Ape =28 -Kiri-Onna =30 -Kirtar's Desire =42 -Kirtar's Wrath =99 -Kismet =6 -Kiss of Death =25 -Kiss of the Amesha =25 -Kitchen Finks =227 -Kithkin Armor =25 -Kithkin Daggerdare =25 -Kithkin Greatheart =25 -Kithkin Harbinger =25 -Kithkin Healer =25 -Kithkin Mourncaller =25 -Kithkin Rabble =31 -Kithkin Shielddare =25 -Kithkin Spellduster =25 -Kithkin Zealot =25 -Kithkin Zephyrnaut =25 -Kitsune Blademaster =25 -Kitsune Bonesetter =25 -Kitsune Dawnblade =25 -Kitsune Diviner =25 -Kitsune Healer =17 -Kitsune Loreweaver =25 -Kitsune Mystic =25 -Kitsune Palliator =25 -Kitsune Riftwalker =25 -Kiyomaro, First to Stand =25 -Kjeldoran Dead =25 -Kjeldoran Elite Guard =7 -Kjeldoran Escort =5 -Kjeldoran Frostbeast =50 -Kjeldoran Gargoyle =25 -Kjeldoran Guard =25 -Kjeldoran Home Guard =49 -Kjeldoran Javelineer =25 -Kjeldoran Knight =26 -Kjeldoran Outpost =284 -Kjeldoran Outrider =25 -Kjeldoran Phalanx =26 -Kjeldoran Pride =12 -Kjeldoran Royal Guard =25 -Kjeldoran Skycaptain =25 -Kjeldoran Skyknight =25 -Kjeldoran War Cry =25 -Kjeldoran Warrior =25 -Knacksaw Clique =27 -Knight Errant =25 -Knight of Dawn =56 -Knight of Dusk =36 -Knight of Meadowgrain =143 -Knight of New Alara =75 -Knight of Stromgald =31 -Knight of Sursi =25 -Knight of the Hokey Pokey =25 -Knight of the Holy Nimbus =37 -Knight of the Mists =25 -Knight of the Reliquary =970 -Knight of the Skyward Eye =25 -Knight of the White Orchid =364 -Knight of Valor =5 -Knight-Captain of Eos =35 -Knighthood =25 -Knights of Thorn =104 -Knollspine Dragon =53 -Knollspine Invocation =25 -Knotvine Mystic =100 -Knotvine Paladin =69 -Knowledge Exploitation =41 -Knowledge Vault =125 -Knucklebone Witch =28 -Kobold Drill Sergeant =250 -Kobold Overlord =2219 -Kobold Taskmaster =41 -Kobolds of Kher Keep =150 -Kodama of the Center Tree =99 -Kodama of the North Tree =107 -Kodama of the South Tree =25 -Kodama's Might =25 -Kodama's Reach =25 -Kokusho, the Evening Star =670 -Konda, Lord of Eiganjo =97 -Konda's Banner =111 -Konda's Hatamoto =6 -Kongming, Sleeping Dragon =850 -Kongming's Contraptions =99 -Kookus =87 -Kor Aeronaut =31 -Kor Cartographer =25 -Kor Chant =25 -Kor Dirge =25 -Kor Duelist =25 -Kor Haven =96 -Kor Hookmaster =25 -Kor Line-Slinger =14 -Kor Outfitter =25 -Kor Sanctifiers =25 -Kor Skyfisher =25 -Korlash, Heir to Blackblade =351 -Kormus Bell =25 -Koskun Falls =58 -Koskun Keep =50 -Kozilek, Butcher of Truth =1434 -Kraken Hatchling =25 -Kraken's Eye =25 -Krakilin =99 -Kranioceros =17 -Krark-Clan Engineers =49 -Krark-Clan Grunt =25 -Krark-Clan Ironworks =25 -Krark-Clan Ogre =25 -Krark-Clan Shaman =5 -Krark-Clan Stoker =25 -Krark's Thumb =81 -Kresh the Bloodbraided =61 -Kris Mage =25 -Krosan Archer =25 -Krosan Avenger =25 -Krosan Beast =90 -Krosan Cloudscraper =43 -Krosan Colossus =100 -Krosan Constrictor =25 -Krosan Drover =25 -Krosan Grip =158 -Krosan Groundshaker =25 -Krosan Reclamation =36 -Krosan Restorer =41 -Krosan Tusker =25 -Krosan Verge =45 -Krosan Vorine =25 -Krosan Warchief =16 -Krosan Wayfarer =25 -Krovikan Elementalist =25 -Krovikan Fetish =25 -Krovikan Horror =25 -Krovikan Mist =25 -Krovikan Plague =24 -Krovikan Rot =25 -Krovikan Scoundrel =25 -Krovikan Sorcerer =22 -Krovikan Vampire =50 -Krovikan Whispers =25 -Kry Shield =99 -Kudzu =104 -Kukemssa Pirates =74 -Kukemssa Serpent =25 -Kulrath Knight =42 -Kumano, Master Yamabushi =34 -Kumano's Blessing =17 -Kumano's Pupils =99 -Kuon, Ogre Ascendant =28 -Kurgadon =28 -Kuro, Pitlord =25 -Kuro's Taken =25 -Kusari-Gama =24 -Kyoki, Sanity's Eclipse =25 -Kyren Archive =25 -Kyren Glider =25 -Kyren Legate =199 -Kyren Negotiations =12 -Kyren Sniper =38 -Kyren Toy =36 -Kyscu Drake =25 -Lab Rats =25 -Labyrinth Minotaur =25 -Laccolith Grunt =25 -Laccolith Rig =25 -Laccolith Titan =62 -Laccolith Warrior =5 -Laccolith Whelp =25 -Lace with Moonglove =25 -Lady Caleria =175 -Lady Evangela =175 -Lady Orca =25 -Lady Sun =1350 -Lady Zhurong, Warrior Queen =466 -Lairwatch Giant =25 -Lake of the Dead =99 -Lammastide Weave =25 -Lance =24 -Lancers en-Kor =21 -Land Cap =29 -Land Equilibrium =1175 -Land Grant =52 -Land Leeches =25 -Land Tax =339 -Land's Edge =35 -Landbind Ritual =47 -Landfill =165 -Landslide =5 -Lantern Kami =25 -Lantern of Insight =25 -Lantern-Lit Graveyard =99 -Lapis Lazuli Talisman =99 -Lapse of Certainty =100 -Laquatus's Champion =110 -Laquatus's Creativity =25 -Laquatus's Disdain =25 -Larceny =6 -Lash Out =25 -Lashknife =25 -Lashknife Barrier =14 -Last Breath =25 -Last Caress =26 -Last Chance =90 -Last Gasp =25 -Last Laugh =33 -Last Rites =25 -Last Stand =56 -Last Word =69 -Last-Ditch Effort =5 -Lat-Nam's Legacy =12 -Latchkey Faerie =25 -Latulla, Keldon Overseer =53 -Latulla's Orders =25 -Laughing Hyena =20 -Launch =49 -Lava Axe =25 -Lava Blister =36 -Lava Burst =99 -Lava Dart =25 -Lava Flow =125 -Lava Hounds =6 -Lava Runner =121 -Lava Spike =97 -Lava Storm =25 -Lava Tubes =100 -Lava Zombie =25 -Lavaball Trap =31 -Lavaborn Muse =48 -Lavacore Elemental =25 -Lavalanche =46 -Lavamancer's Skill =25 -Lawbringer =25 -Lay of the Land =25 -Lay Waste =5 -Lead Astray =25 -Lead Golem =6 -Lead-Belly Chimera =25 -Leaden Fists =25 -Leaden Myr =25 -Leaf Dancer =25 -Leaf Gilder =29 -Leaf-Crowned Elder =91 -Leafdrake Roost =49 -Leap =25 -Leap of Flame =17 -Leaping Lizard =25 -Leashling =25 -Leave No Trace =25 -Leech Bonder =25 -Leeches =97 -Leeching Licid =21 -Leechridden Swamp =53 -Leering Emblem =25 -Leering Gargoyle =25 -Leery Fogbeast =25 -Legacy Weapon =25 -Legacy's Allure =25 -Legerdemain =50 -Legions of Lim-Dul =25 -Leonin Abunas =99 -Leonin Armorguard =25 -Leonin Battlemage =50 -Leonin Bladetrap =49 -Leonin Bola =25 -Leonin Den-Guard =5 -Leonin Elder =25 -Leonin Scimitar =25 -Leonin Shikari =100 -Leonin Skyhunter =25 -Leonin Squire =25 -Leonin Sun Standard =57 -Leshrac's Rite =25 -Leshrac's Sigil =25 -Lesser Gargadon =25 -Lesser Werewolf =99 -Lethal Vapors =49 -Lethargy Trap =25 -Letter Bomb =63 -Leveler =99 -Leviathan =25 -Levitation =25 -Lexivore =25 -Ley Druid =4 -Ley Line =28 -Leyline of Lifeforce =52 -Leyline of Lightning =25 -Leyline of Singularity =38 -Leyline of the Meek =28 -Leyline of the Void =638 -Lhurgoyf =25 -Liability =36 -Liar's Pendulum =99 -Liberate =25 -Liberated Dwarf =25 -Library of Alexandria =13751 -Library of Lat-Nam =52 -Library of Leng =25 -Lich =1612 -Lich Lord of Unx =76 -Lich's Mirror =92 -Lich's Tomb =25 -Lichenthrope =49 -Liege of the Axe =49 -Liege of the Hollows =31 -Liege of the Pit =23 -Lieutenant Kirtar =49 -Life and Limb =50 -Life Burst =28 -Life Chisel =125 -Life from the Loam =514 -Life Matrix =156 -Life/Death =36 -Lifeblood =99 -Lifeforce =25 -Lifegift =122 -Lifelace =25 -Lifeline =396 -Lifelink =25 -Lifespark Spellbomb =26 -Lifespinner =99 -Lifetap =25 -Lifted by Clouds =25 -Light from Within =217 -Light of Day =6 -Light of Sanction =33 -Lightbringer =25 -Lightning Angel =74 -Lightning Axe =25 -Lightning Blast =25 -Lightning Blow =26 -Lightning Bolt =49 -Lightning Cloud =25 -Lightning Coils =56 -Lightning Crafter =54 -Lightning Dart =25 -Lightning Dragon =187 -Lightning Elemental =6 -Lightning Greaves =278 -Lightning Helix =159 -Lightning Hounds =68 -Lightning Reaver =49 -Lightning Reflexes =25 -Lightning Rift =20 -Lightning Serpent =137 -Lightning Storm =25 -Lightning Surge =74 -Lightning Talons =25 -Lightwielder Paladin =35 -Lignify =25 -Liliana Vess =342 -Lilting Refrain =99 -Lim-Dul the Necromancer =110 -Lim-Dul's Cohort =25 -Lim-Dul's Hex =25 -Lim-Dul's High Guard =12 -Lim-Dul's Paladin =19 -Lim-Dul's Vault =63 -Limestone Golem =25 -Limited Resources =41 -Lin Sivvi, Defiant Hero =68 -Linessa, Zephyr Mage =38 -Lingering Death =29 -Lingering Mirage =99 -Lingering Tormentor =25 -Lion's Eye Diamond =2505 -Lionheart Maverick =25 -Liquid Fire =6 -Liquify =25 -Lithatog =99 -Lithophage =36 -Liu Bei, Lord of Shu =650 -Living Airship =26 -Living Armor =25 -Living Artifact =25 -Living Death =150 -Living End =123 -Living Hive =50 -Living Inferno =25 -Living Lands =25 -Living Plane =550 -Living Terrain =25 -Living Tsunami =30 -Living Wall =3 -Living Wish =183 -Livonya Silone =425 -Llanowar Augur =25 -Llanowar Behemoth =25 -Llanowar Cavalry =25 -Llanowar Dead =25 -Llanowar Druid =36 -Llanowar Elite =25 -Llanowar Elves =16 -Llanowar Empath =9 -Llanowar Knight =99 -Llanowar Mentor =25 -Llanowar Reborn =76 -Llanowar Sentinel =16 -Llanowar Vanguard =25 -Llanowar Wastes =134 -Llawan, Cephalid Empress =86 -Loafing Giant =25 -Loam Dweller =29 -Loamdragger Giant =25 -Loaming Shaman =42 -Lobotomy =37 -Loch Korrigan =25 -Locket of Yesterdays =5 -Lockjaw Snapper =6 -Locust Miser =25 -Locust Swarm =200 -Lodestone Bauble =25 -Lodestone Myr =99 -Logic Knot =25 -Lone Wolf =25 -Lonely Sandbar =21 -Long-Forgotten Gohei =79 -Long-Term Plans =21 -Longbow Archer =50 -Longhorn Firebeast =25 -Looming Hoverguard =99 -Looming Shade =25 -Looter il-Kor =25 -Lord Magnus =99 -Lord of Atlantis =135 -Lord of Extinction =256 -Lord of the Pit =53 -Lord of the Undead =115 -Lord of Tresserhorn =22 -Lore Broker =25 -Lorescale Coatl =51 -Lorthos, the Tidemaker =44 -Lose Hope =22 -Lost Auramancers =7 -Lost Hours =25 -Lost in Thought =25 -Lost Order of Jarkeld =49 -Lost Soul =8 -Lotus Bloom =396 -Lotus Blossom =73 -Lotus Cobra =917 -Lotus Guardian =74 -Lotus Petal =215 -Lotus Vale =429 -Lovisa Coldeyes =48 -Lowland Basilisk =25 -Lowland Giant =50 -Lowland Oaf =25 -Lowland Tracker =25 -Loxodon Anchorite =25 -Loxodon Gatekeeper =32 -Loxodon Hierarch =158 -Loxodon Mender =26 -Loxodon Mystic =30 -Loxodon Peacekeeper =25 -Loxodon Punisher =8 -Loxodon Stalwart =62 -Loxodon Warhammer =122 -Loyal Gyrfalcon =25 -Loyal Retainers =7686 -Loyal Sentry =33 -Lu Bu, Master-at-Arms =950 -Lu Meng, Wu General =417 -Lu Su, Wu Advisor =250 -Lu Xun, Scholar General =471 -Lucent Liminid =22 -Lull =5 -Lullmage Mentor =33 -Lumbering Satyr =25 -Lumengrid Augur =37 -Lumengrid Sentinel =74 -Lumengrid Warden =25 -Luminarch Ascension =129 -Luminesce =6 -Luminescent Rain =25 -Luminous Angel =62 -Luminous Guardian =25 -Lumithread Field =22 -Lunar Avenger =49 -Lunge =25 -Lunk Errant =25 -Lure =25 -Lure of Prey =50 -Lurebound Scarecrow =25 -Lurker =99 -Lurking Evil =62 -Lurking Informant =25 -Lurking Jackals =25 -Lurking Nightstalker =27 -Lurking Predators =45 -Lurking Skirge =25 -Lush Growth =25 -Lymph Sliver =25 -Lynx =448 -Lys Alana Bowmaster =25 -Lys Alana Huntmaster =21 -Lys Alana Scarblade =49 -Lyzolda, the Blood Witch =45 -Ma Chao, Western Warrior =167 -Macabre Waltz =25 -Macetail Hystrodon =25 -Machinate =25 -Mad Auntie =47 -Mad Dog =25 -Madblind Mountain =25 -Maddening Imp =87 -Maddening Wind =25 -Madrush Cyclops =34 -Maelstrom Archangel =276 -Maelstrom Djinn =25 -Maelstrom Nexus =88 -Maelstrom Pulse =1572 -Maga, Traitor to Mortals =87 -Mage il-Vec =99 -Mage Slayer =25 -Mage's Guile =25 -Magebane Armor =49 -Magefire Wings =25 -Mages' Contest =25 -Mageta The Lion =91 -Mageta's Boon =25 -Magewright's Stone =25 -Maggot Carrier =25 -Maggot Therapy =25 -Magical Hack =38 -Magister Sphinx =39 -Magistrate's Scepter =99 -Magistrate's Veto =12 -Magma Burst =50 -Magma Giant =49 -Magma Jet =101 -Magma Mine =98 -Magma Phoenix =44 -Magma Rift =25 -Magma Sliver =185 -Magma Spray =48 -Magma Vein =25 -Magmasaur =50 -Magmatic Core =25 -Magnetic Flux =25 -Magnetic Mountain =41 -Magnetic Theft =49 -Magnetic Web =74 -Magnify =17 -Magnigoth Treefolk =38 -Magnivore =40 -Magosi, the Waterveil =34 -Magus of the Abyss =25 -Magus of the Arena =38 -Magus of the Bazaar =50 -Magus of the Candelabra =25 -Magus of the Coffers =32 -Magus of the Disk =53 -Magus of the Future =44 -Magus of the Jar =15 -Magus of the Library =24 -Magus of the Mirror =51 -Magus of the Moat =63 -Magus of the Moon =374 -Magus of the Scroll =31 -Magus of the Tabernacle =41 -Magus of the Unseen =38 -Magus of the Vineyard =56 -Mahamoti Djinn =50 -Major Teroh =99 -Makeshift Mannequin =20 -Makindi Shieldmate =25 -Malach of the Dawn =25 -Malachite Golem =26 -Malachite Talisman =99 -Malakir Bloodwitch =243 -Malevolent Awakening =38 -Malfegor =75 -Malicious Advice =50 -Malignant Growth =49 -Mammoth Harness =48 -Man-o'-War =25 -Mana Breach =25 -Mana Cache =99 -Mana Chains =25 -Mana Clash =16 -Mana Crypt =3385 -Mana Cylix =7 -Mana Drain =8630 -Mana Echoes =170 -Mana Flair =20 -Mana Flare =49 -Mana Geyser =25 -Mana Leak =7 -Mana Leech =99 -Mana Matrix =150 -Mana Maze =25 -Mana Prism =25 -Mana Reflection =53 -Mana Screw =50 -Mana Seism =99 -Mana Severance =99 -Mana Short =34 -Mana Skimmer =17 -Mana Tithe =79 -Mana Vapors =25 -Mana Vault =99 -Mana Vortex =150 -Mana Web =92 -Manabarbs =25 -Manabond =706 -Manacles of Decay =26 -Manaforce Mace =25 -Manaforge Cinder =62 -Manakin =25 -Manamorphose =50 -Manaplasm =38 -Mangara of Corondor =39 -Mangara's Blessing =48 -Mangara's Equity =25 -Mangara's Tome =100 -Maniacal Rage =25 -Manipulate Fate =25 -Mannichi, the Fevered Dream =25 -Manriki-Gusari =99 -Manta Ray =5 -Manta Riders =25 -Mantis Engine =5 -Mantle of Leadership =25 -Maralen of the Mornsong =33 -Marauding Knight =75 -Maraxus of Keld =73 -Marble Chalice =25 -Marble Diamond =25 -Marble Priest =40 -Marble Titan =25 -March of Souls =31 -March of the Machines =31 -Marhault Elsdragon =40 -Marisi's Twinclaws =99 -Marjhan =48 -Mark of Asylum =60 -Mark of Eviction =31 -Mark of Fury =25 -Mark of Mutiny =30 -Mark of Sakiko =29 -Mark of the Oni =25 -Marker Beetles =26 -Maro =25 -Marrow Chomper =99 -Marrow-Gnawer =75 -Marsh Boa =25 -Marsh Casualties =25 -Marsh Crocodile =6 -Marsh Flats =861 -Marsh Flitter =25 -Marsh Gas =25 -Marsh Goblins =25 -Marsh Lurker =25 -Marsh Threader =14 -Marsh Viper =25 -Marshaling Cry =25 -Marshaling the Troops =550 -Marshdrinker Giant =25 -Martial Coup =316 -Marton Stromgald =99 -Martyr of Ashes =25 -Martyr of Bones =25 -Martyr of Frost =25 -Martyr of Sands =25 -Martyr of Spores =25 -Martyr's Cause =25 -Martyr's Cry =300 -Martyrdom =12 -Martyred Rusalka =28 -Martyrs of Korlis =169 -Martyrs' Tomb =28 -Masako the Humorless =110 -Mask of Intolerance =99 -Mask of Law and Grace =25 -Mask of Memory =36 -Mask of Riddles =25 -Mask of the Mimic =48 -Masked Admirers =45 -Masked Gorgon =25 -Mass Calcify =24 -Mass Hysteria =85 -Mass of Ghouls =25 -Massacre =11 -Master Apothecary =74 -Master Decoy =5 -Master Healer =25 -Master of Arms =400 -Master of Etherium =330 -Master of the Hunt =650 -Master of the Veil =31 -Master of the Wild Hunt =762 -Master Transmuter =230 -Masticore =377 -Masumaro, First to Live =6 -Matca Rioters =25 -Matopi Golem =98 -Matsu-Tribe Birdstalker =29 -Matsu-Tribe Decoy =25 -Matsu-Tribe Sniper =25 -Mausoleum Turnkey =25 -Mawcor =25 -Mayael the Anima =65 -Mayael's Aria =58 -Maze of Ith =1197 -Maze of Shadows =25 -Meadowboon =25 -Measure of Wickedness =25 -Meddle =25 -Meddling Kids =1100 -Meddling Mage =337 -Medicine Bag =26 -Medicine Runner =25 -Meditate =350 -Meekstone =79 -Megatherium =36 -Megatog =74 -Meglonoth =41 -Megrim =49 -Meishin, the Mind Cage =47 -Melancholy =5 -Melee =15 -Melesse Spirit =25 -Meloku the Clouded Mirror =111 -Meltdown =25 -Memnarch =207 -Memory Crystal =25 -Memory Erosion =114 -Memory Jar =220 -Memory Lapse =25 -Memory Plunder =40 -Memory Sluice =37 -Menacing Ogre =62 -Mending Hands =17 -Meng Huo, Barbarian King =952 -Meng Huo's Horde =100 -Mental Discipline =17 -Mental Note =25 -Mephidross Vampire =542 -Mephitic Ooze =70 -Mercadia's Downfall =25 -Mercadian Atlas =36 -Mercadian Bazaar =25 -Mercadian Lift =25 -Mercenary Informer =25 -Mercenary Knight =850 -Merchant of Secrets =25 -Merchant Scroll =53 -Merchant Ship =500 -Mercurial Kite =26 -Mercy Killing =48 -Merfolk Assassin =33 -Merfolk Looter =25 -Merfolk of the Pearl Trident =16 -Merfolk Raiders =25 -Merfolk Seastalkers =25 -Merfolk Seer =25 -Merfolk Sovereign =94 -Merfolk Thaumaturgist =5 -Merfolk Traders =25 -Merfolk Wayfinder =31 -Merieke Ri Berit =25 -Merrow Bonegnawer =25 -Merrow Commerce =25 -Merrow Grimeblotter =99 -Merrow Harbinger =25 -Merrow Levitator =25 -Merrow Reejerey =166 -Merrow Wavebreakers =25 -Merrow Witsniper =25 -Merseine =7 -Mesa Chicken =100 -Mesa Enchantress =39 -Mesa Falcon =25 -Mesa Pegasus =25 -Mesmeric Fiend =25 -Mesmeric Orb =99 -Mesmeric Sliver =25 -Mesmeric Trance =26 -Messenger Falcons =25 -Metal Fatigue =25 -Metallic Sliver =27 -Metallurgeon =5 -Metalworker =721 -Metamorphic Wurm =38 -Metamorphose =28 -Metamorphosis =99 -Metathran Aerostat =33 -Metathran Elite =6 -Metathran Soldier =25 -Metathran Transport =25 -Metathran Zombie =25 -Meteor Crater =170 -Meteor Shower =31 -Meteor Storm =25 -Metrognome =62 -Michiko Konda, Truth Seeker =79 -Midnight Banshee =81 -Midnight Charm =25 -Midnight Covenant =25 -Midnight Ritual =12 -Midsummer Revel =97 -Might of Alara =25 -Might of Oaks =19 -Might of Old Krosa =31 -Might of the Nephilim =25 -Might Sliver =54 -Might Weaver =25 -Mightstone =99 -Mighty Emergence =5 -Mijae Djinn =78 -Mikokoro, Center of the Sea =112 -Militant Monk =17 -Militia's Pride =37 -Millikin =25 -Millstone =47 -Mimeofacture =25 -Minamo Scrollkeeper =25 -Minamo Sightbender =99 -Minamo, School at Water's Edge =91 -Minamo's Meddling =17 -Mind Bend =25 -Mind Bomb =35 -Mind Burst =25 -Mind Control =25 -Mind Extraction =100 -Mind Funeral =163 -Mind Games =49 -Mind Harness =99 -Mind Knives =99 -Mind Maggots =38 -Mind Over Matter =124 -Mind Peel =29 -Mind Ravel =25 -Mind Rot =25 -Mind Shatter =40 -Mind Slash =6 -Mind Sludge =25 -Mind Spring =51 -Mind Stone =19 -Mind Swords =25 -Mind Twist =132 -Mind Warp =25 -Mind Whip =50 -Mind's Desire =84 -Mind's Eye =80 -Mindbender Spores =112 -Mindblaze =38 -Mindbreak Trap =160 -Mindlash Sliver =25 -Mindleech Mass =25 -Mindless Automaton =25 -Mindless Null =25 -Mindlock Orb =32 -Mindmoil =25 -Mindslaver =157 -Mindslicer =49 -Mindstab =26 -Mindstab Thrull =25 -Mindstorm Crown =66 -Mindwarper =31 -Mindwhip Sliver =25 -Mindwrack Liege =84 -Mine Bearer =25 -Mine Excavation =25 -Mine Layer =75 -Minion of Leshrac =44 -Minion of Tevesh Szat =33 -Minion of the Wastes =144 -Minion Reflector =28 -Minions' Murmurs =25 -Minister of Impediments =25 -Minotaur Explorer =25 -Minotaur Illusionist =26 -Minotaur Tactician =26 -Minotaur Warrior =635 -Miracle Worker =25 -Miraculous Recovery =112 -Mirari =74 -Mirari's Wake =290 -Mire Blight =25 -Mire Boa =25 -Mire Kavu =26 -Mire Shade =25 -Miren, the Moaning Well =99 -Mirozel =26 -Mirri the Cursed =120 -Mirri, Cat Warrior =75 -Mirri's Guile =142 -Mirrodin's Core =57 -Mirror Entity =116 -Mirror Gallery =272 -Mirror Golem =12 -Mirror Mirror =100 -Mirror of Fate =58 -Mirror Sheen =66 -Mirror Strike =25 -Mirror Universe =3886 -Mirror Wall =25 -Mirror-Sigil Sergeant =91 -Mirrorweave =55 -Mirrorwood Treefolk =22 -Miscalculation =25 -Mischievous Poltergeist =42 -Mischievous Quanar =99 -Misdirection =541 -Mise =99 -Misers' Cage =74 -Misery Charm =27 -Misfortune =48 -Misfortune's Gain =100 -Misguided Rage =26 -Mishra, Artificer Prodigy =57 -Mishra's Bauble =98 -Mishra's Factory =81 -Mishra's Groundbreaker =49 -Mishra's Helix =162 -Mishra's War Machine =39 -Mishra's Workshop =21348 -Misinformation =17 -Miss Demeanor =81 -Misshapen Fiend =25 -Misstep =25 -Mist Dragon =108 -Mist Leopard =25 -Mist of Stagnation =25 -Mistbind Clique =146 -Mistblade Shinobi =29 -Mistform Dreamer =7 -Mistform Mask =5 -Mistform Mutant =25 -Mistform Seaswift =25 -Mistform Shrieker =25 -Mistform Skyreaver =25 -Mistform Sliver =25 -Mistform Stalker =25 -Mistform Ultimus =25 -Mistform Wakecaster =25 -Mistform Wall =25 -Mistform Warchief =21 -Mistmeadow Skulk =12 -Mistmeadow Witch =48 -Mistmoon Griffin =48 -Mistral Charger =25 -Mistveil Plains =25 -Mistvein Borderpost =50 -Misty Rainforest =865 -Mizzium Transreliquat =25 -Mnemonic Nexus =38 -Mnemonic Sliver =42 -Moat =49 -Mob Justice =49 -Mob Mentality =98 -Mobile Fort =62 -Mobilization =25 -Mobilize =99 -Mogg Alarm =25 -Mogg Assassin =49 -Mogg Bombers =25 -Mogg Cannon =100 -Mogg Conscripts =33 -Mogg Fanatic =45 -Mogg Flunkies =25 -Mogg Hollows =17 -Mogg Infestation =87 -Mogg Jailer =50 -Mogg Maniac =56 -Mogg Raider =25 -Mogg Salvage =25 -Mogg Sentry =32 -Mogg Squad =100 -Mogg Toady =25 -Mogg War Marshal =25 -Moggcatcher =55 -Mold Adder =25 -Mold Demon =161 -Mold Shambler =25 -Molder =100 -Molder Slug =12 -Moldervine Cloak =45 -Mole Worms =25 -Molimo, Maro-Sorcerer =30 -Molten Disaster =32 -Molten Firebird =25 -Molten Frame =25 -Molten Hydra =58 -Molten Influence =51 -Molten Rain =25 -Molten Ravager =25 -Molten Sentry =35 -Molten Slagheap =41 -Molting Harpy =25 -Molting Skin =25 -Moment of Silence =25 -Moment's Peace =25 -Momentary Blink =36 -Momentum =25 -Momir Vig, Simic Visionary =60 -Monk Idealist =33 -Monk Realist =25 -Monkey Cage =74 -Monkey Monkey Monkey =20 -Mons's Goblin Raiders =21 -Monsoon =99 -Monstrify =25 -Monstrous Carabid =75 -Monstrous Growth =25 -Monstrous Hound =99 -Moon Sprite =25 -Moonbow Illusionist =25 -Moonglove Changeling =50 -Moonglove Extract =25 -Moonglove Winnower =25 -Moonhold =25 -Moonlace =5 -Moonlight Bargain =25 -Moonlit Strider =17 -Moonlit Wake =25 -Moonring Island =25 -Moonring Mirror =25 -Moonwing Moth =25 -Moor Fiend =25 -Moorish Cavalry =25 -Morale =8 -Morality Shift =47 -Moratorium Stone =25 -Morbid Bloom =25 -Morbid Hunger =25 -Morgue Theft =25 -Morgue Thrull =25 -Morgue Toad =99 -Morinfen =49 -Moriok Rigger =47 -Moriok Scavenger =25 -Moroii =5 -Morphling =706 -Morsel Theft =25 -Morselhoarder =21 -Mortal Combat =25 -Mortal Wound =25 -Mortify =64 -Mortipede =25 -Mortiphobia =25 -Mortivore =74 -Mortuary =25 -Mosquito Guard =25 -Moss Diamond =25 -Moss Kami =25 -Moss Monster =25 -Mossbridge Troll =42 -Mossdog =25 -Mossfire Egg =25 -Mossfire Valley =90 -Mosstodon =25 -Mosswort Bridge =52 -Mothdust Changeling =25 -Mother of Runes =50 -Mothrider Samurai =25 -Mountain =5 -Mountain Bandit =100 -Mountain Goat =25 -Mountain Stronghold =99 -Mountain Titan =100 -Mountain Valley =10 -Mountain Yeti =50 -Mounted Archers =25 -Mourner's Shield =49 -Mournful Zombie =26 -Mourning =25 -Mourning Thrull =25 -Mournwhelk =25 -Mouth of Ronom =48 -Mox Diamond =3586 -Mox Emerald =29277 -Mox Jet =33575 -Mox Pearl =31691 -Mox Ruby =32250 -Mox Sapphire =37689 -Mtenda Griffin =25 -Mtenda Herder =25 -Mtenda Lion =25 -Muck Drubb =25 -Muck Rats =25 -Mudbrawler Cohort =25 -Mudbrawler Raiders =25 -Mudbutton Clanger =25 -Mudbutton Torchrunner =25 -Muddle the Mixture =25 -Mudhole =25 -Mudslide =100 -Mulch =25 -Mulldrifter =20 -Multani, Maro-Sorcerer =65 -Multani's Acolyte =36 -Multani's Decree =25 -Multani's Harmony =36 -Multani's Presence =26 -Mundungu =98 -Mungha Wurm =25 -Muraganda Petroglyphs =49 -Murasa Pyromancer =37 -Murderous Betrayal =14 -Murderous Redcap =45 -Murderous Spoils =25 -Murk Dwellers =25 -Murkfiend Liege =214 -Murmuring Bosk =146 -Murmurs from Beyond =25 -Muscle Burst =25 -Muscle Sliver =40 -Muse Vessel =31 -Musician =99 -Mutavault =1014 -Mutilate =146 -Muzzle =25 -Mwonvuli Acid-Moss =25 -Mwonvuli Ooze =33 -Mycoid Shepherd =52 -Mycologist =25 -Mycoloth =142 -Mycosynth Golem =526 -Mycosynth Lattice =179 -Myojin of Cleansing Fire =69 -Myojin of Infinite Rage =48 -Myojin of Life's Web =67 -Myojin of Night's Reach =25 -Myojin of Seeing Winds =25 -Myr Adapter =25 -Myr Enforcer =9 -Myr Incubator =61 -Myr Landshaper =25 -Myr Matrix =41 -Myr Mindservant =99 -Myr Moonvessel =38 -Myr Prototype =12 -Myr Quadropod =25 -Myr Retriever =39 -Myr Servitor =25 -Myr Token =56 -Mystic Compass =6 -Mystic Crusader =41 -Mystic Decree =19 -Mystic Denial =25 -Mystic Enforcer =48 -Mystic Familiar =25 -Mystic Gate =256 -Mystic Melting =25 -Mystic Might =33 -Mystic Penitent =25 -Mystic Remora =18 -Mystic Restraints =25 -Mystic Snake =70 -Mystic Speculation =150 -Mystic Veil =25 -Mystic Visionary =25 -Mystic Zealot =25 -Mystical Teachings =25 -Mystical Tutor =317 -Mythic Proportions =75 -Nacatl Hunt-Pride =25 -Nacatl Outlander =20 -Nacatl Savage =20 -Nacatl War-Pride =12 -Nacre Talisman =50 -Nafs Asp =100 -Nagao, Bound by Honor =138 -Nakaya Shade =25 -Naked Singularity =100 -Nalathni Dragon =103 -Nameless Inversion =93 -Nameless One =25 -Nameless Race =72 -Nantuko Blightcutter =93 -Nantuko Calmer =25 -Nantuko Cultivator =25 -Nantuko Disciple =25 -Nantuko Elder =41 -Nantuko Husk =25 -Nantuko Mentor =25 -Nantuko Monastery =36 -Nantuko Shade =755 -Nantuko Shaman =17 -Nantuko Shrine =100 -Nantuko Tracer =25 -Nantuko Vigilante =25 -Narcissism =33 -Narcomoeba =28 -Narrow Escape =25 -Narwhal =74 -Nath of the Gilt-Leaf =53 -Nath's Buffoon =25 -Nath's Elite =25 -Natural Affinity =25 -Natural Balance =110 -Natural Emergence =36 -Natural Order =2236 -Natural Selection =556 -Natural Spring =25 -Naturalize =25 -Nature's Blessing =24 -Nature's Chosen =67 -Nature's Cloak =119 -Nature's Kiss =37 -Nature's Lore =25 -Nature's Resurgence =25 -Nature's Revolt =33 -Nature's Ruin =100 -Nature's Spiral =45 -Nature's Will =47 -Nature's Wrath =48 -Nausea =25 -Naya Battlemage =25 -Naya Charm =26 -Naya Hushblade =50 -Naya Panorama =36 -Naya Sojourners =25 -Nebuchadnezzar =155 -Neck Snap =25 -Necra Disciple =26 -Necra Sanctuary =30 -Necratog =37 -Necravolver =25 -Necrite =25 -Necro-Impotence =100 -Necrogen Mists =25 -Necrogen Spellbomb =25 -Necrogenesis =31 -Necrologia =14 -Necromancer's Covenant =30 -Necromancer's Magemark =25 -Necromancy =63 -Necromantic Thirst =33 -Necroplasm =25 -Necropolis =25 -Necropotence =165 -Necrosavant =25 -Necroskitter =180 -Necrotic Sliver =75 -Nectar Faerie =50 -Need for Speed =62 -Needle Drop =25 -Needle Specter =39 -Needle Storm =19 -Needlebite Trap =37 -Needlebug =12 -Needlepeak Spider =17 -Needleshot Gourna =25 -Nefarious Lich =74 -Nefashu =99 -Negate =25 -Neko-Te =33 -Nekrataal =25 -Nemata, Grove Guardian =104 -Nemesis Mask =67 -Nemesis of Reason =232 -Nessian Courser =9 -Nesting Wurm =25 -Nether Shadow =38 -Nether Spirit =291 -Nether Traitor =51 -Nether Void =5227 -Netherborn Phalanx =4 -Netter en-Dal =25 -Nettle Sentinel =25 -Nettletooth Djinn =25 -Nettlevine Blight =25 -Nettling Curse =25 -Nettling Imp =25 -Neurok Familiar =29 -Neurok Hoversail =28 -Neurok Prodigy =25 -Neurok Spy =25 -Neurok Stealthsuit =25 -Neurok Transmuter =25 -Neverending Torment =97 -Nevermaker =25 -Nevinyrral's Disk =133 -New Benalia =31 -New Frontiers =192 -Nezumi Bone-Reader =25 -Nezumi Cutthroat =25 -Nezumi Graverobber =16 -Nezumi Ronin =25 -Nezumi Shadow-Watcher =25 -Nezumi Shortfang =105 -Niall Silvain =100 -Nicol Bolas =49 -Nicol Bolas, Planeswalker =605 -Night Dealings =25 -Night of Souls' Betrayal =84 -Night Soil =20 -Night's Whisper =32 -Night/Day =25 -Nightcreep =25 -Nightguard Patrol =25 -Nighthaze =14 -Nightmare =28 -Nightmare Incursion =24 -Nightmare Lash =59 -Nightmare Void =25 -Nightscape Apprentice =25 -Nightscape Battlemage =25 -Nightscape Familiar =25 -Nightscape Master =81 -Nightshade Assassin =6 -Nightshade Schemers =14 -Nightshade Seer =5 -Nightshade Stinger =25 -Nightsky Mimic =25 -Nightsoil Kami =25 -Nightstalker Engine =104 -Nightwind Glider =25 -Nihilistic Glee =25 -Nihilith =31 -Nikko-Onna =25 -Nim Abomination =29 -Nim Devourer =25 -Nim Grotesque =49 -Nim Lasher =25 -Nim Replica =26 -Nim Shambler =12 -Nim Shrieker =12 -Nimana Sell-Sword =25 -Nimble Mongoose =98 -Nimbus Maze =113 -Nimbus Wings =25 -Nine-Ringed Bo =5 -Ninja of the Deep Hours =41 -Nip Gwyllion =25 -Nissa Revane =742 -Nissa's Chosen =101 -Niv-Mizzet, the Firemind =374 -Niveous Wisps =25 -Nivix, Aerie of the Firemind =25 -Nix =25 -No Mercy =91 -No Quarter =50 -No Rest for the Wicked =25 -No-Dachi =99 -Nobilis of War =65 -Noble Benefactor =149 -Noble Elephant =25 -Noble Hierarch =1452 -Noble Panther =74 -Noble Purpose =25 -Noble Stand =25 -Noble Steeds =12 -Noble Templar =26 -Noble Vestige =25 -Nocturnal Raid =25 -Noetic Scales =59 -Noggin Whack =25 -Noggle Bandit =25 -Noggle Bridgebreaker =25 -Noggle Hedge-Mage =25 -Noggle Ransacker =25 -Nomad Decoy =6 -Nomad Mythmaker =37 -Nomad Stadium =25 -Nomadic Elf =25 -Nomads en-Kor =63 -Norin the Wary =28 -Norritt =100 -North Star =350 -Northern Paladin =25 -Norwood Priestess =525 -Norwood Ranger =25 -Nostalgic Dreams =57 -Nosy Goblin =25 -Notorious Assassin =56 -Notorious Throng =29 -Nourish =42 -Nourishing Shoal =25 -Nova Chaser =75 -Nova Cleric =25 -Nova Pentacle =483 -Novijen Sages =47 -Novijen, Heart of Progress =25 -Now I Know My ABC's =100 -Noxious Field =25 -Noxious Ghoul =138 -Noxious Hatchling =25 -Noxious Toad =100 -Noxious Vapors =25 -Nucklavee =48 -Nuisance Engine =99 -Null Brooch =65 -Null Chamber =51 -Null Profusion =44 -Null Rod =635 -Nullmage Advocate =25 -Nullmage Shepherd =6 -Nullstone Gargoyle =57 -Nulltread Gargantuan =25 -Numai Outcast =6 -Numot, the Devastator =61 -Nurturer Initiate =68 -Nurturing Licid =25 -Nut Collector =92 -Nyxathid =170 -O-Naginata =28 -Oaken Brawler =25 -Oakenform =25 -Oakgnarl Warrior =25 -Oasis =31 -Oath of Druids =532 -Oath of Ghouls =74 -Oath of Lieges =74 -Oath of Lim-Dul =25 -Oath of Mages =99 -Oath of Scholars =25 -Oathkeeper, Takeno's Daisho =30 -Oathsworn Giant =25 -Ob Nixilis, the Fallen =212 -Obelisk of Alara =36 -Obelisk of Bant =25 -Obelisk of Esper =25 -Obelisk of Grixis =25 -Obelisk of Jund =25 -Obelisk of Naya =25 -Obelisk of Undoing =25 -Oblation =62 -Obliterate =82 -Oblivion Crown =25 -Oblivion Ring =31 -Oblivion Stone =138 -Oboro Breezecaller =25 -Oboro Envoy =33 -Oboro, Palace in the Clouds =99 -Obsessive Search =25 -Obsianus Golem =6 -Obsidian Acolyte =25 -Obsidian Battle-Axe =4 -Obsidian Fireheart =63 -Obstinate Familiar =62 -Ocular Halo =25 -Odds/Ends =25 -Odious Trow =25 -Odylic Wraith =25 -Off Balance =25 -Offalsnout =31 -Offering to Asha =25 -Ogre Arsonist =99 -Ogre Enforcer =98 -Ogre Gatecrasher =25 -Ogre Leadfoot =26 -Ogre Marauder =47 -Ogre Recluse =25 -Ogre Savant =25 -Ogre Shaman =100 -Ogre Taskmaster =6 -Ogre Warrior =99 -Ohran Viper =324 -Ohran Yeti =25 -Okiba-Gang Shinobi =25 -Okina Nightwatch =25 -Okina, Temple to the Grandfathers =34 -Okk =25 -Old Fogey =100 -Old Ghastbark =25 -Old Man of the Sea =2812 -Omega Myr =26 -Omen =33 -Omen of Fire =25 -Omnibian =29 -Once More with Feeling =99 -Ondu Cleric =25 -One Dozen Eyes =12 -One with Nature =74 -One with Nothing =47 -Oni of Wild Places =25 -Oni Possession =6 -Onulet =25 -Onyx Goblet =25 -Onyx Talisman =25 -Oona, Queen of the Fae =197 -Oona's Blackguard =28 -Oona's Gatewarden =25 -Oona's Grace =25 -Oona's Prowler =65 -Ooze Garden =30 -Opal Acrolith =25 -Opal Archangel =100 -Opal Avenger =17 -Opal Caryatid =25 -Opal Champion =25 -Opal Gargoyle =25 -Opal Guardian =31 -Opal Titan =20 -Opalescence =74 -Opaline Bracers =25 -Opaline Sliver =66 -Open the Vaults =62 -Ophidian =41 -Ophidian Eye =25 -Opportunist =49 -Opportunity =15 -Opposition =118 -Oppression =29 -Oppressive Will =4 -Opt =40 -Oracle en-Vec =74 -Oracle of Mul Daya =77 -Oracle of Nectars =47 -Oracle's Attendants =25 -Oran-Rief Recluse =25 -Oran-Rief Survivalist =28 -Oran-Rief, the Vastwood =164 -Oraxid =25 -Orb of Dreams =103 -Orbweaver Kumo =25 -Orc General =299 -Orchard Warden =25 -Orcish Artillery =25 -Orcish Bloodpainter =25 -Orcish Cannonade =17 -Orcish Cannoneers =25 -Orcish Captain =4 -Orcish Conscripts =4 -Orcish Farmer =16 -Orcish Healer =25 -Orcish Librarian =25 -Orcish Lumberjack =25 -Orcish Mechanics =32 -Orcish Mine =25 -Orcish Oriflamme =40 -Orcish Paratroopers =20 -Orcish Settlers =14 -Orcish Spy =16 -Orcish Squatters =33 -Orcish Veteran =33 -Order of Leitbur =25 -Order of the Ebon Hand =24 -Order of the Golden Cricket =25 -Order of the Sacred Bell =25 -Order of the Sacred Torch =25 -Order of the Stars =38 -Order of the White Shield =25 -Order of Whiteclay =34 -Order of Yawgmoth =58 -Order/Chaos =25 -Ordered Migration =25 -Ordruun Commando =25 -Ore Gorger =6 -Organ Grinder =25 -Organ Harvest =37 -Orgg =6 -Orim's Chant =1173 -Orim's Cure =25 -Orim's Prayer =25 -Orim's Thunder =25 -Orim's Touch =25 -Oriss, Samite Guardian =52 -Ornate Kanzashi =25 -Ornithopter =8 -Orochi Eggwatcher =5 -Orochi Hatchery =49 -Orochi Leafcaller =25 -Orochi Ranger =5 -Orochi Sustainer =25 -Oros, the Avenger =62 -Orzhov Basilica =35 -Orzhov Euthanist =25 -Orzhov Guildmage =29 -Orzhov Pontiff =46 -Orzhov Signet =25 -Orzhova, the Church of Deals =12 -Osai Vultures =25 -Ostiary Thrull =25 -Ostracize =25 -Otarian Juggernaut =33 -Otherworldly Journey =25 -Oubliette =99 -Ouphe Vandals =99 -Outbreak =25 -Outmaneuver =25 -Outrage Shaman =25 -Outrider en-Kor =5 -Outrider of Jhess =25 -Overabundance =25 -Overbeing of Myth =34 -Overblaze =36 -Overburden =25 -Overeager Apprentice =5 -Overgrown Estate =30 -Overgrown Tomb =648 -Overgrowth =25 -Overlaid Terrain =50 -Overload =25 -Overmaster =38 -Override =301 -Overrule =25 -Overrun =19 -Oversold Cemetery =221 -Oversoul of Dusk =124 -Overtaker =69 -Overwhelm =25 -Overwhelming Forces =2956 -Overwhelming Instinct =25 -Overwhelming Intellect =24 -Ovinize =41 -Ovinomancer =25 -Ow =99 -Oxidda Golem =49 -Oxidize =25 -Oyobi, Who Split the Heavens =25 -Pacifism =25 -Pact of Negation =439 -Pact of the Titan =55 -Pain Kami =25 -Pain Magnification =25 -Pain's Reward =47 -Pain/Suffering =25 -Painbringer =50 -Painful Memories =25 -Painter's Servant =259 -Painwracker Oni =25 -Palace Guard =25 -Paladin en-Vec =69 -Paladin of Prahv =25 -Pale Bears =100 -Pale Moon =62 -Pale Recluse =25 -Pale Wayfarer =50 -Paleoloth =43 -Palinchron =99 -Palladia-Mors =100 -Palliation Accord =25 -Pallid Mycoderm =17 -Pallimud =74 -Panacea =199 -Pandemonium =13 -Pang Tong, Young Phoenix =699 -Panglacial Wurm =92 -Pangosaur =25 -Panic =25 -Panic Attack =3 -Panoptic Mirror =235 -Panther Warriors =25 -Paper Tiger =26 -Paperfin Rascal =25 -Paradigm Shift =99 -Paradise Mantle =71 -Paradise Plume =25 -Paradox Haze =48 -Paragon of the Amesha =25 -Parallax Dementia =25 -Parallax Inhibitor =44 -Parallax Nexus =100 -Parallax Tide =50 -Parallax Wave =106 -Parallectric Feedback =26 -Parallel Evolution =133 -Parallel Thoughts =69 -Paralyze =25 -Paralyzing Grasp =25 -Parapet =25 -Parapet Watchers =25 -Parasitic Bond =25 -Parasitic Strix =25 -Parch =26 -Pardic Arsonist =33 -Pardic Collaborator =6 -Pardic Dragon =49 -Pardic Firecat =25 -Pardic Lancer =25 -Pardic Miner =38 -Pardic Swordsmith =50 -Pariah =60 -Pariah's Shield =105 -Paroxysm =26 -Part the Veil =25 -Part Water =125 -Patagia Golem =25 -Patagia Viper =25 -Patchwork Gnomes =30 -Path of Anger's Flame =25 -Path of Peace =49 -Path to Exile =494 -Patriarch's Bidding =151 -Patriarch's Desire =25 -Patrician's Scorn =25 -Patrol Hound =25 -Patrol Signaler =25 -Patron of the Akki =69 -Patron of the Kitsune =47 -Patron of the Moon =47 -Patron of the Nezumi =117 -Patron of the Orochi =48 -Patron of the Wild =25 -Patron Wizard =268 -Pattern of Rebirth =110 -Paupers' Cage =74 -Pavel Maliki =40 -Pay No Heed =25 -Peace and Quiet =5 -Peace of Mind =25 -Peace Talks =98 -Peacekeeper =92 -Peach Garden Oath =56 -Pearl Dragon =66 -Pearl Medallion =274 -Pearl Shard =66 -Pearled Unicorn =25 -Pearlspear Courier =99 -Peat Bog =25 -Pedantic Learning =25 -Peek =25 -Peel from Reality =25 -Peer Pressure =37 -Peer Through Depths =48 -Pegasus Charger =49 -Pegasus Refuge =60 -Pegasus Stampede =26 -Pegasus Token =25 -Pemmin's Aura =94 -Penance =26 -Pendelhaven =66 -Pendelhaven Elder =31 -Pendrell Drake =25 -Pendrell Flux =25 -Pendrell Mists =92 -Pentad Prism =25 -Pentagram of the Ages =25 -Pentarch Paladin =54 -Pentarch Ward =25 -Pentavite Token =25 -Pentavus =42 -Penumbra Bobcat =26 -Penumbra Kavu =50 -Penumbra Spider =17 -Penumbra Wurm =62 -People of the Woods =49 -Peppersmoke =25 -Peregrine Drake =99 -Peregrine Mask =25 -Perilous Forays =25 -Perilous Research =36 -Perimeter Captain =32 -Perish =49 -Pernicious Deed =706 -Perplex =25 -Persecute =256 -Personal Incarnation =49 -Personal Tutor =593 -Persuasion =48 -Pestermite =25 -Pestilence =24 -Pestilence Rats =6000 -Pestilent Kathari =38 -Petalmane Baku =17 -Petals of Insight =6 -Petra Sphinx =101 -Petradon =38 -Petrahydrox =25 -Petravark =25 -Petrified Field =125 -Petrified Plating =25 -Petrified Wood-Kin =25 -Pewter Golem =26 -Phage the Untouchable =213 -Phantasmagorian =36 -Phantasmal Fiend =12 -Phantasmal Forces =10 -Phantasmal Mount =25 -Phantasmal Sphere =25 -Phantasmal Terrain =25 -Phantatog =25 -Phantom Centaur =41 -Phantom Flock =25 -Phantom Monster =25 -Phantom Nantuko =76 -Phantom Nishoba =191 -Phantom Nomad =25 -Phantom Tiger =25 -Phantom Warrior =6 -Phantom Whelp =25 -Phantom Wings =49 -Phantom Wurm =5 -Phelddagrif =97 -Phobian Phantasm =25 -Phosphorescent Feast =25 -Phthisis =25 -Phyrexian Altar =112 -Phyrexian Arena =110 -Phyrexian Battleflies =25 -Phyrexian Bloodstock =26 -Phyrexian Boon =12 -Phyrexian Broodlings =26 -Phyrexian Colossus =25 -Phyrexian Debaser =26 -Phyrexian Defiler =5 -Phyrexian Delver =25 -Phyrexian Denouncer =26 -Phyrexian Devourer =25 -Phyrexian Dreadnought =2259 -Phyrexian Driver =25 -Phyrexian Etchings =49 -Phyrexian Furnace =25 -Phyrexian Gargantua =25 -Phyrexian Ghoul =25 -Phyrexian Gremlins =28 -Phyrexian Grimoire =25 -Phyrexian Hulk =14 -Phyrexian Infiltrator =25 -Phyrexian Ironfoot =90 -Phyrexian Lens =33 -Phyrexian Marauder =87 -Phyrexian Monitor =26 -Phyrexian Negator =243 -Phyrexian Plaguelord =26 -Phyrexian Portal =106 -Phyrexian Processor =157 -Phyrexian Prowler =25 -Phyrexian Purge =66 -Phyrexian Rager =25 -Phyrexian Reaper =29 -Phyrexian Reclamation =17 -Phyrexian Scuta =71 -Phyrexian Slayer =25 -Phyrexian Snowcrusher =25 -Phyrexian Soulgorger =49 -Phyrexian Splicer =25 -Phyrexian Totem =17 -Phyrexian Tower =160 -Phyrexian Tribute =74 -Phyrexian Tyranny =20 -Phyrexian Vault =6 -Phyrexian Walker =41 -Phyrexian War Beast =25 -Phytohydra =50 -Pianna, Nomad Captain =49 -Piety =99 -Piety Charm =25 -Pikemen =25 -Pilgrim of Justice =25 -Pilgrim of Virtue =25 -Pili-Pala =22 -Pillage =31 -Pillaging Horde =68 -Pillar of the Paruns =219 -Pillar Tombs of Aku =74 -Pillarfield Ox =25 -Pillory of the Sleepless =25 -Pincer Spider =25 -Pincher Beetles =25 -Pine Barrens =66 -Pinecrest Ridge =25 -Pinpoint Avalanche =25 -Pious Kitsune =25 -Pious Warrior =25 -Piper's Melody =25 -Piracy =330 -Piracy Charm =25 -Piranha Marsh =29 -Pirate Ship =25 -Pit Imp =62 -Pit Keeper =17 -Pit Raptor =25 -Pit Scorpion =13 -Pit Spawn =45 -Pit Trap =25 -Pitchstone Wall =6 -Pitfall Trap =31 -Pithing Needle =247 -Pixie Queen =786 -Plagiarize =12 -Plague Beetle =25 -Plague Boiler =25 -Plague Dogs =100 -Plague Fiend =25 -Plague of Vermin =25 -Plague Rats =26 -Plague Sliver =33 -Plague Spitter =48 -Plague Spores =26 -Plague Wind =10 -Plague Witch =25 -Plaguebearer =3 -Plagued Rusalka =6 -Plains =5 -Planar Birth =156 -Planar Cleansing =51 -Planar Collapse =125 -Planar Despair =25 -Planar Gate =501 -Planar Guide =25 -Planar Overlay =33 -Planar Portal =99 -Planar Void =99 -Planeswalker's Favor =25 -Planeswalker's Fury =25 -Planeswalker's Mirth =25 -Planeswalker's Mischief =41 -Planeswalker's Scorn =50 -Plant Elemental =49 -Plasma Elemental =25 -Plateau =2445 -Plated Geopede =29 -Plated Pegasus =30 -Plated Rootwalla =15 -Plated Slagwurm =32 -Plated Sliver =25 -Plated Spider =17 -Platinum Angel =202 -Plaxcaster Frogling =99 -Plaxmanta =25 -Pledge of Loyalty =25 -Plover Knights =25 -Plow Through Reito =25 -Plow Under =71 -Plumes of Peace =5 -Plumeveil =69 -Plunder =17 -Plunge into Darkness =45 -Pointy Finger of Doom =99 -Poison Arrow =750 -Poison the Well =25 -Poisonbelly Ogre =25 -Polar Kraken =75 -Political Trickery =25 -Pollen Lullaby =25 -Pollen Remedy =26 -Pollenbright Wings =56 -Polluted Bonds =40 -Polluted Delta =1809 -Polluted Mire =31 -Polymorph =22 -Ponder =52 -Pongify =25 -Pooling Venom =25 -Porphyry Nodes =54 -Port Inspector =25 -Portcullis =58 -Portent =25 -Possessed Aven =62 -Possessed Barbarian =25 -Possessed Centaur =74 -Possessed Nomad =49 -Possessed Portal =25 -Poultice Sliver =25 -Poultrygeist =299 -Pouncing Jaguar =27 -Pouncing Kavu =25 -Pouncing Wurm =25 -Powder Keg =275 -Power Armor =25 -Power Artifact =457 -Power Conduit =99 -Power Leak =25 -Power Matrix =99 -Power of Fire =25 -Power Sink =5 -Power Surge =44 -Power Taint =25 -Powerleech =109 -Powerstone Minefield =99 -Pox =148 -Pradesh Gypsies =25 -Prahv, Spires of Order =12 -Preacher =378 -Precognition =25 -Predator Dragon =53 -Predator, Flagship =74 -Predator's Strike =25 -Predatory Advantage =31 -Predatory Focus =25 -Predatory Hunger =25 -Predatory Nightstalker =50 -Predatory Urge =31 -Predict =48 -Preeminent Captain =221 -Preemptive Strike =100 -Preferred Selection =74 -Premature Burial =3 -Presence of Gond =25 -Presence of the Master =25 -Presence of the Wise =44 -Pretender's Claim =25 -Price of Glory =38 -Price of Progress =367 -Prickly Boggart =25 -Pride of Lions =28 -Pride of the Clouds =100 -Priest of Gix =72 -Priest of Titania =243 -Priest of Yawgmoth =19 -Primal Bellow =37 -Primal Beyond =59 -Primal Boost =25 -Primal Clay =25 -Primal Command =124 -Primal Forcemage =25 -Primal Frenzy =25 -Primal Growth =50 -Primal Order =25 -Primal Plasma =17 -Primal Rage =30 -Primal Whisperer =25 -Primalcrux =79 -Primeval Force =25 -Primeval Light =49 -Primeval Shambler =26 -Primitive Etchings =38 -Primitive Justice =24 -Primoc Escapee =25 -Primordial Ooze =56 -Primordial Sage =25 -Prince of Thralls =55 -Princess Lucrezia =104 -Prismatic Boon =5 -Prismatic Circle =25 -Prismatic Lace =69 -Prismatic Lens =25 -Prismatic Omen =126 -Prismatic Strands =27 -Prismatic Ward =25 -Prismwake Merrow =25 -Prison Barricade =25 -Prison Term =33 -Pristine Angel =182 -Private Research =6 -Privileged Position =276 -Prized Unicorn =25 -Probe =25 -Proclamation of Rebirth =89 -Prodigal Pyromancer =25 -Prodigal Sorcerer =25 -Profane Command =109 -Profane Prayers =25 -Progenitus =963 -Prohibit =25 -Promise of Bunrei =99 -Promise of Power =52 -Promised Kannushi =25 -Propaganda =236 -Proper Burial =25 -Prophetic Bolt =32 -Prosperity =28 -Protean Hulk =157 -Protean Hydra =102 -Protective Bubble =25 -Protective Sphere =25 -Proteus Machine =33 -Proteus Staff =25 -Protomatter Powder =25 -Provoke =33 -Prowess of the Fair =56 -Prowling Pangolin =25 -Psionic Blast =116 -Psionic Entity =99 -Psionic Gift =28 -Psionic Sliver =45 -Psychatog =42 -Psychic Allergy =50 -Psychic Battle =25 -Psychic Drain =33 -Psychic Membrane =99 -Psychic Network =150 -Psychic Overload =99 -Psychic Possession =25 -Psychic Puppetry =25 -Psychic Purge =50 -Psychic Spear =17 -Psychic Theft =35 -Psychic Trance =25 -Psychic Transfer =25 -Psychic Venom =25 -Psychic Vortex =99 -Psychogenic Probe =100 -Psychotic Episode =17 -Psychotic Fury =25 -Psychotic Haze =17 -Psychotrope Thallid =38 -Pteron Ghost =25 -Puca's Mischief =30 -Puffer Extract =5 -Pull from Eternity =31 -Pull Under =25 -Pulling Teeth =25 -Pulmonic Sliver =50 -Pulsating Illusion =6 -Pulse of Llanowar =25 -Pulse of the Dross =25 -Pulse of the Fields =38 -Pulse of the Forge =34 -Pulse of the Grid =49 -Pulse of the Tangle =28 -Pulsemage Advocate =99 -Pulverize =63 -Punctuate =20 -Puncture Blast =25 -Puncture Bolt =25 -Punish Ignorance =41 -Punishing Fire =23 -Puppet Conjurer =5 -Puppet Master =25 -Puppet Strings =48 -Puppet's Verdict =36 -Puppeteer =6 -Puppeteer Clique =46 -Pure Intentions =13 -Pure Reflection =99 -Pure/Simple =25 -Purelace =25 -Puresight Merrow =25 -Purgatory =88 -Purge =100 -Purging Scythe =50 -Purify =42 -Purity =49 -Purraj of Urborg =143 -Pursuit of Knowledge =99 -Pus Kami =25 -Put Away =25 -Putrefaction =28 -Putrefy =89 -Putrid Cyclops =25 -Putrid Imp =74 -Putrid Leech =25 -Putrid Raptor =28 -Putrid Warrior =26 -Pygmy Allosaurus =28 -Pygmy Hippo =25 -Pygmy Kavu =26 -Pygmy Pyrosaur =25 -Pygmy Razorback =25 -Pygmy Troll =26 -Pyknite =99 -Pyramids =561 -Pyre Charger =17 -Pyre Zombie =44 -Pyric Salamander =33 -Pyrite Spellbomb =19 -Pyroblast =25 -Pyroclasm =6 -Pyroclast Consul =25 -Pyrohemia =36 -Pyrokinesis =60 -Pyromancer Ascension =43 -Pyromancer's Swath =28 -Pyromancy =41 -Pyromania =6 -Pyromatics =25 -Pyrostatic Pillar =54 -Pyrotechnics =25 -Pyrrhic Revival =25 -Python =25 -Qasali Ambusher =31 -Qasali Pridemage =65 -Quagmire =13 -Quagmire Druid =25 -Quagmire Lamprey =25 -Quagnoth =46 -Quarum Trench Gnomes =282 -Quash =16 -Quenchable Fire =19 -Quest for Ancient Secrets =37 -Quest for Pure Flame =31 -Quest for the Gemblades =25 -Quest for the Gravelord =28 -Quest for the Holy Relic =54 -Questing Phelddagrif =33 -Question Elemental? =25 -Quick Sliver =25 -Quickchange =25 -Quicken =33 -Quickening Licid =25 -Quicksand =25 -Quicksilver Amulet =139 -Quicksilver Behemoth =25 -Quicksilver Dagger =35 -Quicksilver Dragon =67 -Quicksilver Elemental =49 -Quicksilver Fountain =81 -Quicksilver Wall =25 -Quiet Disrepair =25 -Quiet Purity =25 -Quiet Speculation =25 -Quietus Spike =74 -Quill-Slinger Boggart =25 -Quilled Sliver =34 -Quillmane Baku =17 -Quillspike =50 -Quirion Druid =50 -Quirion Dryad =60 -Quirion Elves =25 -Quirion Explorer =25 -Quirion Ranger =23 -Quirion Sentinel =25 -Quirion Trailblazer =25 -Qumulox =62 -Rabble-Rouser =25 -Rabid Elephant =25 -Rabid Rats =25 -Rabid Wolverines =26 -Rabid Wombat =25 -Rack and Ruin =25 -Rackling =20 -Radha, Heir to Keld =61 -Radiant Essence =24 -Radiant Kavu =50 -Radiant, Archangel =371 -Radiant's Dragoons =25 -Radiant's Judgment =26 -Radiate =44 -Radjan Spirit =29 -Rafiq of the Many =662 -Rag Dealer =25 -Rag Man =25 -Ragamuffyn =25 -Rage Forger =25 -Rage Reflection =44 -Rage Weaver =6 -Ragged Veins =25 -Raging Bull =25 -Raging Cougar =99 -Raging Goblin =6 -Raging Gorilla =25 -Raging Kavu =99 -Raging River =615 -Raging Spirit =25 -Ragnar =176 -Raiding Party =100 -Rain of Blades =99 -Rain of Daggers =99 -Rain of Embers =25 -Rain of Filth =25 -Rain of Gore =49 -Rain of Rust =25 -Rain of Salt =78 -Rain of Tears =25 -Rainbow Crow =25 -Rainbow Efreet =98 -Rainbow Vale =44 -Raise Dead =25 -Raise the Alarm =25 -Raka Disciple =26 -Raka Sanctuary =99 -Rakalite =25 -Rakavolver =25 -Rakdos Augermage =43 -Rakdos Carnarium =25 -Rakdos Guildmage =56 -Rakdos Ickspitter =19 -Rakdos Pit Dragon =160 -Rakdos Riteknife =25 -Rakdos Signet =25 -Rakdos the Defiler =65 -Rakeclaw Gargantuan =25 -Raking Canopy =48 -Rakka Mar =38 -Raksha Golden Cub =17 -Rally =175 -Rally the Horde =99 -Rally the Righteous =25 -Rally the Troops =100 -Ramirez DePietro =81 -Ramosian Captain =50 -Ramosian Commander =50 -Ramosian Lieutenant =25 -Ramosian Rally =25 -Ramosian Revivalist =6 -Ramosian Sergeant =25 -Ramosian Sky Marshal =94 -Rampaging Baloths =173 -Rampant Elephant =25 -Rampant Growth =25 -Rampart Crawler =25 -Ramses Overdark =185 -Rancid Earth =25 -Rancor =105 -Ranger en-Vec =37 -Ranger of Eos =731 -Rank and File =25 -Ransack =25 -Rapid Decay =25 -Rapid Fire =40 -Rappelling Scouts =48 -Rashida Scalebane =121 -Rashka the Slayer =25 -Rasputin Dreamweaver =225 -Ratcatcher =25 -Rath's Edge =85 -Rathi Assassin =26 -Rathi Dragon =95 -Rathi Fiend =25 -Rathi Intimidator =5 -Rathi Trapper =17 -Rats of Rath =25 -Rats' Feast =25 -Rattleblaze Scarecrow =25 -Ravaged Highlands =25 -Ravages of War =5296 -Ravaging Horde =300 -Ravaging Riftwurm =25 -Raven Familiar =43 -Raven Guild Initiate =26 -Raven Guild Master =297 -Raven's Crime =29 -Raven's Run Dragoon =25 -Ravenous Baboons =81 -Ravenous Baloth =107 -Ravenous Rats =25 -Ravenous Skirge =49 -Ravenous Trap =66 -Ravenous Vampire =49 -Raving Oni-Slave =25 -Ray of Command =22 -Ray of Distortion =25 -Ray of Erasure =25 -Ray of Revelation =31 -Rayne, Academy Chancellor =50 -Raze =25 -Razia, Boros Archangel =77 -Razia's Purification =37 -Razing Snidd =25 -Razor Barrier =26 -Razor Golem =25 -Razor Pendulum =25 -Razorclaw Bear =99 -Razorfin Abolisher =25 -Razorfin Hunter =25 -Razorfoot Griffin =20 -Razorgrass Screen =25 -Razorjaw Oni =38 -Razormane Masticore =71 -Razortooth Rats =5 -Reach of Branches =25 -Reach Through Mists =25 -Read the Runes =99 -Reality Acid =17 -Reality Anchor =33 -Reality Ripple =25 -Reality Strobe =7 -Reality Twist =149 -Realm Razer =36 -Reanimate =388 -Reap =25 -Reap and Sow =25 -Reaper King =66 -Reaping the Graves =25 -Reaping the Rewards =5 -Rebel Informer =25 -Rebellion of the Flamekin =25 -Rebirth =25 -Reborn Hero =99 -Reborn Hope =25 -Rebound =25 -Rebuff the Wicked =129 -Rebuild =47 -Rebuking Ceremony =52 -Recall =25 -Recantation =25 -Reciprocate =25 -Reckless Abandon =25 -Reckless Assault =33 -Reckless Charge =25 -Reckless Embermage =25 -Reckless Ogre =26 -Reckless One =21 -Reckless Scholar =25 -Reckless Spite =25 -Reckless Wurm =25 -Reclaim =25 -Reclamation =99 -Reclusive Wight =99 -Recoil =22 -Recollect =99 -Reconnaissance =25 -Reconstruction =9 -Recoup =62 -Recover =25 -Recross the Paths =50 -Recumbent Bliss =25 -Recuperate =26 -Recurring Nightmare =719 -Recycle =88 -Red Cliffs Armada =100 -Red Elemental Blast =14 -Red Mana Battery =79 -Red Scarab =25 -Red Ward =23 -Red-Hot Hottie =20 -Redeem =19 -Redeem the Lost =6 -Reduce to Dreams =49 -Redwood Treefolk =25 -Reef Pirates =25 -Reef Shaman =25 -Reflect Damage =62 -Reflecting Mirror =35 -Reflecting Pool =622 -Reflex Sliver =25 -Reflexes =25 -Refresh =25 -Refreshing Rain =25 -Regal Force =126 -Regal Unicorn =25 -Regenerate =25 -Regeneration =25 -Regress =25 -Regrowth =73 -Reign of Chaos =25 -Reign of Terror =99 -Reincarnation =193 -Reinforcements =12 -Reins of Power =99 -Reins of the Vinesteed =25 -Reiterate =55 -Reito Lantern =4 -Reiver Demon =106 -Rejuvenate =49 -Rejuvenation Chamber =99 -Reki, the History of Kamigawa =25 -Rekindled Flame =25 -Reknit =99 -Relearn =12 -Release the Ants =25 -Relentless Assault =25 -Relentless Rats =39 -Relic Bane =12 -Relic Barrier =62 -Relic Bind =32 -Relic Crush =5 -Relic of Progenitus =40 -Relic Ward =98 -Reliquary Monk =26 -Reliquary Tower =36 -Remand =82 -Remedy =25 -Remembrance =75 -Reminisce =25 -Remodel =20 -Remote Farm =41 -Remote Isle =25 -Remove =3799 -Remove Enchantments =25 -Remove Soul =25 -Rend Flesh =25 -Rend Spirit =25 -Rendclaw Trow =25 -Rending Vines =25 -Renegade Troops =100 -Renegade Warlord =100 -Renewal =29 -Renewed Faith =28 -Renounce =25 -Reparations =74 -Repeal =25 -Repel =25 -Repel Intruders =25 -Repentance =25 -Repentant Blacksmith =25 -Repentant Vampire =99 -Repercussion =69 -Replenish =446 -Repopulate =5 -Reprisal =25 -Reprocess =25 -Repulse =36 -Reroute =50 -Rescind =25 -Rescue =899 -Research the Deep =25 -Research/Development =25 -Reset =1331 -Reshape =49 -Resilient Wanderer =25 -Resistance Fighter =25 -Resize =25 -Resounding Roar =25 -Resounding Scream =25 -Resounding Silence =25 -Resounding Thunder =37 -Resounding Wave =25 -Respite =25 -Resplendent Mentor =25 -Restless Apparition =25 -Restless Bones =25 -Restless Dead =25 -Restless Dreams =50 -Restock =29 -Restore Balance =34 -Restrain =25 -Resurrection =6 -Resuscitate =26 -Retaliate =41 -Retaliation =25 -Retaliator Griffin =31 -Retether =25 -Rethink =25 -Retraced Image =12 -Retract =25 -Retribution =49 -Retribution of the Meek =112 -Retromancer =25 -Return of the Nightstalkers =99 -Return to Battle =100 -Return to Dust =6 -Reveillark =144 -Reveille Squad =25 -Reveka, Wizard Savant =38 -Revelation =99 -Revelsong Horn =50 -Revenant =49 -Revenant Patriarch =19 -Reverberation =175 -Revered Dead =25 -Revered Elder =25 -Revered Unicorn =25 -Reverence =79 -Reverent Mantra =36 -Reverent Silence =25 -Reversal of Fortune =25 -Reverse Damage =21 -Reverse Polarity =32 -Reverse the Sands =25 -Revive =36 -Reviving Dose =25 -Reviving Vapors =50 -Reward the Faithful =99 -Rewards of Diversity =25 -Reweave =25 -Rewind =22 -Reya Dawnbringer =149 -Rhox =49 -Rhox Bodyguard =25 -Rhox Brute =25 -Rhox Charger =5 -Rhox Meditant =25 -Rhox Pikemaster =25 -Rhox War Monk =61 -Rhys the Exiled =73 -Rhys the Redeemed =238 -Rhystic Cave =36 -Rhystic Circle =25 -Rhystic Deluge =25 -Rhystic Lightning =25 -Rhystic Scrying =29 -Rhystic Shield =25 -Rhystic Study =38 -Rhystic Syphon =25 -Rhystic Tutor =87 -Rib Cage Spider =25 -Ribbon Snake =25 -Ribbons of Night =26 -Ribbons of the Reikai =17 -Ricochet =27 -Riddle of Lightning =22 -Ridge Rannet =25 -Ridged Kusite =17 -Ridgeline Rager =25 -Ridgetop Raptor =37 -Riding Red Hare =100 -Riding the Dilu Horse =1088 -Rift Bolt =38 -Rift Elemental =27 -Riftmarked Knight =25 -Riftstone Portal =12 -Riftsweeper =12 -Riftwing Cloudskate =25 -Righteous Aura =25 -Righteous Avengers =99 -Righteous Cause =100 -Righteous Fury =281 -Righteous Indignation =26 -Righteous War =62 -Righteousness =14 -Rime Dryad =25 -Rime Transfusion =25 -Rimebound Dead =25 -Rimefeather Owl =48 -Rimehorn Aurochs =25 -Rimescale Dragon =120 -Rimewind Cryomancer =25 -Rimewind Taskmage =25 -Ring of Gix =30 -Ring of Immortals =394 -Ring of Ma'ruf =1114 -Ring of Renewal =6 -Rings of Brighthearth =55 -Ringskipper =25 -Riot Spikes =25 -Rip-Clan Crasher =25 -Riptide =25 -Riptide Biologist =25 -Riptide Chronologist =25 -Riptide Crab =25 -Riptide Director =25 -Riptide Entrancer =49 -Riptide Laboratory =129 -Riptide Mangler =25 -Riptide Pilferer =25 -Riptide Replicator =47 -Riptide Shapeshifter =50 -Riptide Survivor =99 -Rise from the Grave =35 -Rise of the Hobgoblins =59 -Rise/Fall =25 -Rishadan Airship =25 -Rishadan Brigand =25 -Rishadan Cutpurse =25 -Rishadan Footpad =48 -Rishadan Pawnshop =52 -Rishadan Port =1224 -Rising Waters =30 -Risky Move =25 -Rite of Consumption =25 -Rite of Flame =98 -Rite of Passage =49 -Rite of Replication =60 -Rites of Flourishing =56 -Rites of Initiation =25 -Rites of Refusal =25 -Rites of Spring =25 -Rith, the Awakener =191 -Rith's Attendant =25 -Rith's Charm =16 -Rith's Grove =39 -Ritual of Restoration =25 -Ritual of Steel =25 -Ritual of Subdual =62 -Ritual of the Machine =48 -Rivalry =44 -Rivals' Duel =6 -Riven Turnbull =12 -River Bear =25 -River Boa =25 -River Delta =62 -River Kaijin =5 -River Kelpie =25 -River Merfolk =12 -River of Tears =259 -River's Grasp =25 -Riverfall Mimic =25 -Rix Maadi, Dungeon Palace =25 -Roar of Jukai =17 -Roar of Reclamation =25 -Roar of the Crowd =25 -Roar of the Kha =12 -Roar of the Wurm =31 -Roaring Slagwurm =25 -Robber Fly =28 -Robe of Mirrors =12 -Roc Hatchling =25 -Roc of Kher Ridges =188 -Rock Badger =6 -Rock Basilisk =74 -Rock Hydra =67 -Rock Jockey =19 -Rock Lobster =17 -Rock Slide =25 -Rockcaster Platoon =25 -Rocket Launcher =99 -Rocket-Powered Turbo Slug =90 -Rockshard Elemental =25 -Rockslide Ambush =114 -Rockslide Elemental =25 -Rocky Tar Pit =25 -Rod of Ruin =10 -Rofellos, Llanowar Emissary =618 -Rofellos's Gift =26 -Rogue Elephant =42 -Rogue Kavu =25 -Rogue Skycaptain =48 -Rohgahh of Kher Keep =1138 -Roil Elemental =32 -Roiling Horror =25 -Rolling Earthquake =7124 -Rolling Spoil =5 -Rolling Stones =73 -Rolling Thunder =49 -Ronin Cavekeeper =25 -Ronin Cliffrider =25 -Ronin Houndmaster =5 -Ronin Warclub =48 -Ronom Hulk =25 -Ronom Serpent =50 -Ronom Unicorn =25 -Roofstalker Wight =29 -Root Cage =6 -Root Elemental =62 -Root Greevil =26 -Root Maze =27 -Root Sliver =50 -Root Spider =25 -Root-Kin Ally =6 -Rootbound Crag =481 -Rootbreaker Wurm =25 -Rootgrapple =25 -Rooting Kavu =25 -Rootrunner =5 -Roots =25 -Roots of Life =25 -Rootwalla =25 -Rootwater Alligator =26 -Rootwater Commando =25 -Rootwater Depths =62 -Rootwater Diver =25 -Rootwater Hunter =5 -Rootwater Matriarch =25 -Rootwater Mystic =26 -Rootwater Shaman =97 -Rootwater Thief =86 -Rorix Bladewing =262 -Rosheen Meanderer =40 -Roterothopter =25 -Rotlung Reanimator =79 -Rotting Giant =25 -Rotting Rats =25 -Rough/Tumble =17 -Roughshod Mentor =25 -Rouse =25 -Rout =112 -Rowan Treefolk =100 -Rowen =25 -Royal Assassin =86 -Royal Decree =49 -Royal Herbalist =12 -Royal Trooper =100 -Rubinia Soulsinger =235 -Ruby Leech =25 -Ruby Medallion =181 -Rude Awakening =50 -Rugged Prairie =270 -Ruham Djinn =25 -Ruination =77 -Ruinous Minotaur =25 -Ruins of Trokair =10 -Rukh Egg =25 -Rukh Token =199 -Rule of Law =24 -Rumbling Crescendo =62 -Rumbling Slum =33 -Rummaging Wizard =25 -Run Wild =25 -Rune of Protection: Artifacts =26 -Rune of Protection: Black =25 -Rune of Protection: Blue =25 -Rune of Protection: Green =49 -Rune of Protection: Lands =25 -Rune of Protection: Red =25 -Rune of Protection: White =25 -Rune Snag =63 -Rune-Cervin Rider =25 -Rune-Tail, Kitsune Ascendant =100 -Runeboggle =25 -Runeclaw Bear =25 -Runed Arch =62 -Runed Halo =157 -Runed Stalactite =25 -Runeflare Trap =37 -Runes of the Deus =25 -Runesword =25 -Rupture =99 -Rupture Spire =31 -Rush of Knowledge =25 -Rushing River =33 -Rushing-Tide Zubera =25 -Rushwood Dryad =25 -Rushwood Elemental =49 -Rushwood Grove =25 -Rushwood Herbalist =25 -Rushwood Legate =9 -Rust =25 -Rust Elemental =49 -Rustic Clachan =46 -Rusting Golem =25 -Rustmouth Ogre =99 -Rustrazor Butcher =25 -Rustspore Ram =12 -Ruthless Cullblade =16 -Rysorian Badger =48 -Ryusei, the Falling Star =90 -Saber Ants =50 -Sabertooth Alley Cat =50 -Sabertooth Cobra =36 -Sabertooth Nishoba =69 -Sabretooth Tiger =25 -Sacellum Archers =25 -Sacellum Godspeaker =26 -Sachi, Daughter of Seshiro =7 -Sacred Boon =99 -Sacred Foundry =662 -Sacred Ground =79 -Sacred Guide =74 -Sacred Mesa =8 -Sacred Nectar =25 -Sacred Prey =25 -Sacred Rites =25 -Sacrifice =25 -Sadistic Augermage =25 -Sadistic Glee =114 -Sadistic Hypnotist =38 -Sadistic Sacrament =53 -Safe Haven =49 -Safe Passage =25 -Safeguard =74 -Safehold Duo =25 -Safehold Elite =25 -Safehold Sentry =25 -Safewright Quest =25 -Saffi Eriksdotter =64 -Sage Aven =25 -Sage of Epityr =26 -Sage of Fables =25 -Sage of Lat-Nam =25 -Sage Owl =25 -Sage's Dousing =10 -Sage's Knowledge =100 -Sages of the Anima =49 -Sailmonger =29 -Sakashima the Impostor =95 -Sakura-Tribe Elder =51 -Sakura-Tribe Scout =33 -Sakura-Tribe Springcaller =25 -Salt Flats =33 -Salt Marsh =12 -Saltblast =27 -Saltcrusted Steppe =25 -Saltfield Recluse =17 -Saltskitter =25 -Salvage =49 -Salvage Slasher =25 -Salvage Titan =33 -Salvaging Station =77 -Samite Alchemist =25 -Samite Archer =25 -Samite Blessing =50 -Samite Censer-Bearer =25 -Samite Elder =25 -Samite Healer =25 -Samite Ministration =25 -Samite Pilgrim =26 -Samite Sanctuary =25 -Samurai Enforcers =56 -Samurai of the Pale Curtain =69 -Sanctimony =25 -Sanctum Custodian =15 -Sanctum Gargoyle =14 -Sanctum Guardian =25 -Sanctum Plowbeast =99 -Sand Golem =25 -Sand Silos =86 -Sand Squid =25 -Sandals of Abdallah =222 -Sandbar Crocodile =25 -Sandbar Merfolk =25 -Sandbar Serpent =99 -Sands of Time =98 -Sandskin =25 -Sandsower =6 -Sandstone Deadfall =25 -Sandstone Needle =25 -Sandstone Warrior =25 -Sandstorm =25 -Sandstorm Eidolon =25 -Sangrite Backlash =25 -Sangrite Surge =25 -Sangrophage =17 -Sanguine Bond =163 -Sanguine Guard =99 -Sanguine Praetor =25 -Sanity Gnawers =99 -Sanity Grinding =159 -Sapling of Colfenor =37 -Sapphire Charm =25 -Sapphire Leech =25 -Sapphire Medallion =370 -Saprazzan Bailiff =25 -Saprazzan Breaker =6 -Saprazzan Cove =41 -Saprazzan Heir =125 -Saprazzan Legate =25 -Saprazzan Outrigger =25 -Saprazzan Raider =25 -Saprazzan Skerry =25 -Saproling Burst =73 -Saproling Cluster =87 -Saproling Infestation =25 -Saproling Symbiosis =199 -Saproling Token =110 -Sapseep Forest =26 -Sarcatog =26 -Sarcomancy =240 -Sarcomite Myr =25 -Sarkhan Vol =862 -Sarpadian Empires, Vol. VII =49 -Sasaya, Orochi Ascendant =47 -Saute =20 -Savaen Elves =25 -Savage Beating =73 -Savage Conception =25 -Savage Firecat =97 -Savage Gorilla =26 -Savage Hunger =38 -Savage Lands =108 -Savage Offensive =25 -Savage Silhouette =25 -Savage Thallid =17 -Savage Twister =25 -Savannah =2835 -Savannah Lions =74 -Savor the Moment =31 -Savra, Queen of the Golgari =35 -Sawback Manticore =25 -Sawtooth Loon =22 -Sawtooth Ogre =25 -Sawtooth Thresher =25 -Scab-Clan Mauler =25 -Scabland =33 -Scald =12 -Scalding Salamander =26 -Scalding Tarn =863 -Scalding Tongs =74 -Scale of Chiss-Goria =26 -Scalebane's Elite =98 -Scaled Hulk =17 -Scaled Wurm =25 -Scalpelexis =25 -Scandalmonger =27 -Scapegoat =25 -Scapeshift =253 -Scar =25 -Scarab of the Unseen =24 -Scarblade Elite =28 -Scare Tactics =26 -Scarecrone =69 -Scarecrow =49 -Scarland Thrinax =25 -Scarred Puma =25 -Scarred Vinebreeder =25 -Scars of the Veteran =99 -Scarscale Ritual =25 -Scarwood Bandits =99 -Scarwood Goblins =25 -Scarwood Hag =100 -Scarwood Treefolk =17 -Scathe Zombies =24 -Scatter the Seeds =25 -Scattering Stroke =25 -Scattershot =26 -Scattershot Archer =41 -Scavenged Weaponry =25 -Scavenger Drake =25 -Scavenger Folk =25 -Scavenging Ghoul =44 -Scavenging Scarab =25 -Scent of Brine =26 -Scent of Cinder =362 -Scent of Ivy =26 -Scent of Jasmine =25 -Scent of Nightshade =25 -Scepter of Dominance =46 -Scepter of Fugue =31 -Scepter of Insight =25 -Schismotivate =28 -School of Piranha =26 -School of the Unseen =25 -Scion of Darkness =141 -Scion of Oona =155 -Scion of the Ur-Dragon =55 -Scion of the Wild =45 -Scissors Lizard =100 -Scorched Earth =100 -Scorched Ruins =210 -Scorched Rusalka =25 -Scorching Lava =25 -Scorching Missile =25 -Scorching Spear =99 -Scorching Winds =100 -Scoria Cat =25 -Scoria Wurm =25 -Scornful AEther-Lich =25 -Scornful Egotist =26 -Scour =25 -Scourge Devil =25 -Scourge of Kher Ridges =63 -Scourge of Numai =38 -Scourge of the Nobilis =69 -Scourglass =68 -Scout's Warning =33 -Scouting Trek =99 -Scrabbling Claws =25 -Scragnoth =25 -Scrap =25 -Scrapbasket =25 -Scrapheap =20 -Screaming Fury =25 -Screaming Seahawk =31 -Screams from Within =48 -Screams of the Damned =25 -Screeching Buzzard =25 -Screeching Griffin =25 -Screeching Harpy =25 -Screeching Sliver =25 -Scrivener =100 -Scroll of Origins =25 -Scroll Rack =858 -Scrounge =99 -Scrubland =2705 -Scryb Ranger =15 -Scryb Sprites =12 -Scrying Glass =99 -Scrying Sheets =116 -Sculpting Steel =88 -Scute Mob =130 -Scuttlemutt =25 -Scuttling Death =25 -Scuzzback Marauders =25 -Scuzzback Scrapper =25 -Scythe Tiger =30 -Sea Drake =2953 -Sea Eagle =90 -Sea Gate Loremaster =35 -Sea Monster =25 -Sea Scryer =49 -Sea Serpent =25 -Sea Snidd =26 -Sea Spirit =25 -Sea Sprite =6 -Sea Troll =25 -Sea's Claim =5 -Seafarer's Quay =45 -Seafloor Debris =6 -Seahunter =50 -Seal of Cleansing =31 -Seal of Doom =25 -Seal of Fire =25 -Seal of Primordium =25 -Seal of Removal =25 -Seal of Strength =25 -Sealed Fate =25 -Search for Survivors =49 -Search for Tomorrow =25 -Searing Flesh =25 -Searing Meditation =26 -Searing Rays =37 -Searing Spear Askari =25 -Searing Touch =100 -Searing Wind =6 -Seascape Aerialist =49 -Seashell Cameo =99 -Seaside Citadel =94 -Seaside Haven =25 -Seasinger =44 -Season of the Witch =99 -Seasoned Marshal =25 -Seasoned Tactician =24 -Seat of the Synod =60 -Secluded Glen =105 -Secluded Steppe =25 -Second Chance =52 -Second Sight =99 -Second Sunrise =69 -Second Thoughts =25 -Second Wind =25 -Secretkeeper =25 -Security Detail =25 -Sedge Sliver =55 -Sedge Troll =56 -Sedraxis Alchemist =25 -Sedraxis Specter =153 -Sedris, the Traitor King =59 -Seed Spark =25 -Seed the Land =47 -Seedborn Muse =98 -Seedcradle Witch =4 -Seedguide Ash =25 -Seedling Charm =25 -Seeds of Innocence =10 -Seeds of Strength =25 -Seedtime =59 -Seek the Horizon =38 -Seeker =15 -Seeker of Skybreak =25 -Seer's Vision =99 -Seething Anger =6 -Seething Pathblazer =25 -Seething Song =56 -Segmented Wurm =49 -Segovian Leviathan =25 -Seht's Tiger =25 -Seismic Assault =44 -Seismic Mage =100 -Seismic Shudder =25 -Seismic Spike =25 -Seismic Strike =3 -Seizan, Perverter of Truth =38 -Seize the Day =49 -Seize the Soul =25 -Seizures =6800 -Sejiri Refuge =35 -Sek'Kuar, Deathkeeper =48 -Sekki, Seasons' Guide =188 -Selenia, Dark Angel =123 -Selesnya Evangel =25 -Selesnya Guildmage =25 -Selesnya Sagittars =25 -Selesnya Sanctuary =26 -Selesnya Signet =25 -Selfless Exorcist =25 -Selkie Hedge-Mage =25 -Sell-Sword Brute =25 -Sen Triplets =193 -Sengir Autocrat =29 -Sengir Bats =25 -Sengir Nosferatu =42 -Sengir Vampire =62 -Sensation Gorger =25 -Sensei Golden-Tail =97 -Sensei's Divining Top =511 -Sentinel =99 -Sentinels of Glen Elendra =25 -Sentry Oak =25 -Seraph =50 -Serendib Djinn =1752 -Serendib Efreet =258 -Serendib Sorcerer =27 -Serene Heart =25 -Serene Offering =25 -Serene Sunset =8 -Serenity =64 -Serpent Assassin =6 -Serpent Generator =25 -Serpent of the Endless Sea =49 -Serpent Skin =25 -Serpent Warrior =6 -Serpentine Basilisk =25 -Serpentine Kavu =25 -Serra Advocate =34 -Serra Angel =25 -Serra Avatar =1180 -Serra Avenger =422 -Serra Aviary =26 -Serra Bestiary =25 -Serra Inquisitors =25 -Serra Paladin =25 -Serra Sphinx =41 -Serra Zealot =25 -Serra's Blessing =25 -Serra's Boon =25 -Serra's Embrace =34 -Serra's Hymn =15 -Serra's Liturgy =11 -Serra's Sanctum =950 -Serrated Arrows =25 -Serrated Biskelion =21 -Serum Powder =85 -Serum Tank =12 -Serum Visions =25 -Servant of Volrath =15 -Seshiro the Anointed =125 -Seton, Krosan Protector =325 -Seton's Desire =25 -Seton's Scout =25 -Sever Soul =50 -Severed Legion =25 -Sewer Rats =25 -Sewerdreg =25 -Sewers of Estark =99 -Sewn-Eye Drake =75 -Sex Appeal =25 -Shackles =25 -Shade of Trokair =17 -Shade's Breath =25 -Shade's Form =25 -Shadow Guildmage =25 -Shadow Lance =25 -Shadow of Doubt =39 -Shadow Rider =99 -Shadow Rift =25 -Shadow Sliver =25 -Shadowbane =49 -Shadowblood Egg =25 -Shadowblood Ridge =66 -Shadowfeed =25 -Shadowmage Infiltrator =115 -Shadowstorm =100 -Shah of Naar Isle =25 -Shahrazad =3045 -Shaleskin Bruiser =25 -Shaleskin Plower =50 -Shallow Grave =167 -Shaman en-Kor =151 -Shaman's Trance =25 -Shambling Remains =22 -Shambling Shell =25 -Shambling Strider =25 -Shambling Swarm =25 -Shanodin Dryads =25 -Shape of the Wiitigo =37 -Shape Stealer =25 -Shaper Guildmage =25 -Shaper Parasite =17 -Shapesharer =41 -Shapeshifter =26 -Shapeshifter's Marrow =25 -Shard Convergence =15 -Shard Phoenix =28 -Shard Volley =25 -Sharding Sphinx =36 -Shared Animosity =25 -Shared Fate =24 -Shared Triumph =102 -Sharuum the Hegemon =145 -Shatter =18 -Shattered Crypt =25 -Shattered Dreams =99 -Shattering Pulse =25 -Shattering Spree =67 -Shatterskull Giant =25 -Shatterstorm =54 -Shauku, Endbringer =149 -Shauku's Minion =25 -Sheep Token =54 -Shelkin Brownie =49 -Shell of the Last Kappa =25 -Shell Skulkin =25 -Shelldock Isle =40 -Shelter =25 -Sheltered Valley =121 -Sheltering Ancient =25 -Sheltering Prayers =25 -Shepherd of Rot =25 -Shepherd of the Lost =62 -Shield Bearer =33 -Shield Dancer =99 -Shield Mate =25 -Shield of Duty and Reason =26 -Shield of Kaldra =97 -Shield of the Ages =25 -Shield of the Oversoul =33 -Shield of the Righteous =25 -Shield Sphere =78 -Shield Wall =19 -Shielding Plax =27 -Shieldmage Advocate =25 -Shieldmage Elder =25 -Shieldmate's Blessing =49 -Shields of Velis Vel =25 -Shifting Borders =25 -Shifting Sky =8 -Shifting Sliver =50 -Shifting Wall =66 -Shifty Doppelganger =25 -Shimatsu the Bloodcloaked =99 -Shimian Night Stalker =25 -Shimian Specter =130 -Shimmer =38 -Shimmering Barrier =50 -Shimmering Efreet =48 -Shimmering Glasskite =17 -Shimmering Grotto =25 -Shimmering Mirage =26 -Shimmering Wings =25 -Shinen of Fear's Chill =25 -Shinen of Flight's Wings =25 -Shinen of Fury's Fire =25 -Shinen of Life's Roar =25 -Shinen of Stars' Light =25 -Shinewend =25 -Shining Shoal =49 -Shinka Gatekeeper =17 -Shinka, the Bloodsoaked Keep =22 -Shirei, Shizo's Caretaker =77 -Shisato, Whispering Hunter =42 -Shiv's Embrace =25 -Shivan Dragon =25 -Shivan Emissary =25 -Shivan Gorge =71 -Shivan Harvest =28 -Shivan Hellkite =83 -Shivan Meteor =48 -Shivan Oasis =35 -Shivan Phoenix =100 -Shivan Raptor =31 -Shivan Reef =112 -Shivan Sand-Mage =25 -Shivan Wumpus =42 -Shivan Wurm =44 -Shivan Zombie =25 -Shizo, Death's Storehouse =100 -Shizuko, Caller of Autumn =47 -Shoal Serpent =13 -Shock =3 -Shock Troops =25 -Shocker =65 -Shoe Tree =20 -Shore Snapper =25 -Shorecrasher Mimic =25 -Shoreline Raider =25 -Shoreline Ranger =25 -Shoving Match =28 -Show and Tell =1202 -Shower of Coals =99 -Shower of Sparks =25 -Shrapnel Blast =60 -Shred Memory =25 -Shrewd Hatchling =25 -Shriek of Dread =26 -Shrieking Drake =25 -Shrieking Grotesque =26 -Shrieking Mogg =75 -Shrieking Specter =338 -Shriekmaw =27 -Shrink =25 -Shriveling Rot =25 -Shrouded Lore =25 -Shrouded Serpent =49 -Shu Cavalry =100 -Shu Defender =100 -Shu Elite Companions =100 -Shu Elite Infantry =100 -Shu Farmer =100 -Shu Foot Soldiers=50 -Shu General =150 -Shu Grain Caravan =100 -Shu Soldier-Farmers =250 -Shuko =25 -Shunt =37 -Shuriken =25 -Shyft =99 -Sibilant Spirit =48 -Sick and Tired =26 -Sicken =5 -Sickening Dreams =31 -Sickening Shoal =6 -Sickle Ripper =68 -Sidar Jabari =121 -Sideswipe =99 -Sidewinder Sliver =50 -Siege Mastodon =20 -Siege of Towers =25 -Siege Wurm =25 -Siege-Gang Commander =156 -Sift =25 -Sift Through Sands =25 -Sighted-Caste Sorcerer =25 -Sigil Blessing =25 -Sigil Captain =29 -Sigil of Distinction =51 -Sigil of Sleep =25 -Sigil of the Empty Throne =101 -Sigil of the Nayan Gods =25 -Sigil of the New Dawn =41 -Sigil Tracer =36 -Sigiled Behemoth =75 -Sigiled Paladin =40 -Sign in Blood =56 -Silence =244 -Silent Arbiter =250 -Silent Assassin =33 -Silent Attendant =25 -Silent Specter =99 -Silent-Chant Zubera =25 -Silhana Ledgewalker =25 -Silhana Starfletcher =25 -Silhouette =20 -Silk Net =26 -Silkbind Faerie =25 -Silkenfist Fighter =25 -Silkenfist Order =25 -Silklash Spider =58 -Silkwing Scout =25 -Silt Crawler =25 -Silver Drake =26 -Silver Erne =25 -Silver Knight =63 -Silver Myr =25 -Silver Seraph =198 -Silverback Ape =50 -Silvercoat Lion =35 -Silvergill Adept =62 -Silvergill Douser =25 -Silverglade Elemental =25 -Silverglade Pathfinder =38 -Silverstorm Samurai =17 -Silvos, Rogue Elemental =311 -Simian Brawler =25 -Simian Grunts =26 -Simian Spirit Guide =33 -Simic Basilisk =5 -Simic Growth Chamber =25 -Simic Guildmage =25 -Simic Initiate =25 -Simic Ragworm =25 -Simic Signet =25 -Simic Sky Swallower =64 -Simoon =26 -Simplify =25 -Simulacrum =33 -Sindbad =25 -Sinew Sliver =53 -Singe =26 -Singe-Mind Ogre =25 -Singing Tree =1414 -Sinister Strength =50 -Sink into Takenuma =25 -Sinkhole =2652 -Sinking Feeling =25 -Sins of the Past =26 -Sinstriker's Will =25 -Sir Shandlar of Eberyn =40 -Sire of the Storm =25 -Siren's Call =40 -Sirocco =25 -Sisay's Ingenuity =99 -Sisay's Ring =12 -Sisters of Stone Death =53 -Sisters of the Flame =26 -Sivitri Scarzam =33 -Sivvi's Ruse =5 -Sivvi's Valor =25 -Sizzle =25 -Skarrg, the Rage Pits =6 -Skarrgan Firebird =25 -Skarrgan Pit-Skulk =25 -Skarrgan Skybreaker =28 -Skeletal Changeling =25 -Skeletal Kathari =25 -Skeletal Scrying =19 -Skeletal Vampire =54 -Skeleton Scavengers =25 -Skeleton Shard =99 -Skeleton Ship =149 -Skeletonize =25 -Skill Borrower =28 -Skinthinner =25 -Skirge Familiar =99 -Skirk Alarmist =25 -Skirk Commando =25 -Skirk Drill Sergeant =25 -Skirk Fire Marshal =99 -Skirk Marauder =25 -Skirk Outrider =5 -Skirk Prospector =37 -Skirk Ridge Exhumer =41 -Skirk Shaman =25 -Skirk Volcanist =28 -Skittering Horror =6 -Skittering Monstrosity =6 -Skittish Kavu =25 -Skittish Valesk =25 -Skizzik =111 -Skizzik Surger =31 -Skred =25 -Skulking Fugitive =25 -Skulking Ghost =25 -Skulking Knight =5 -Skull Catapult =6 -Skull Collector =6 -Skull Fracture =56 -Skull of Orm =26 -Skull of Ramos =50 -Skullcage =43 -Skullclamp =117 -Skullmane Baku =30 -Skullmead Cauldron =25 -Skullmulcher =32 -Skullscorch =50 -Skullsnatcher =25 -Skulltap =26 -Sky Diamond =25 -Sky Hussar =25 -Sky Ruin Drake =12 -Sky Spirit =50 -Sky Swallower =25 -Sky Weaver =25 -Skyclaw Thrash =75 -Skycloud Egg =48 -Skycloud Expanse =96 -Skyfire Kirin =47 -Skyhunter Cub =26 -Skyhunter Patrol =17 -Skyhunter Prowler =25 -Skyhunter Skirmisher =56 -Skyknight Legionnaire =25 -Skyreach Manta =25 -Skyrider Trainee =25 -Skyscribing =30 -Skyshaper =25 -Skyship Weatherlight =24 -Skyshooter =6 -Skyshroud Archer =49 -Skyshroud Behemoth =56 -Skyshroud Blessing =53 -Skyshroud Claim =25 -Skyshroud Condor =25 -Skyshroud Cutter =25 -Skyshroud Elf =33 -Skyshroud Elite =54 -Skyshroud Falcon =25 -Skyshroud Forest =50 -Skyshroud Poacher =93 -Skyshroud Ranger =25 -Skyshroud Ridgeback =48 -Skyshroud Sentinel =25 -Skyshroud Troll =25 -Skyshroud Troopers =25 -Skyshroud Vampire =48 -Skyshroud War Beast =74 -Skyward Eye Prophets =99 -Skywing Aven =25 -Slagwurm Armor =25 -Slashing Tiger =795 -Slate of Ancestry =58 -Slaughter =26 -Slaughter Cry =5 -Slaughter Pact =118 -Slaughterhouse Bouncer =25 -Slave of Bolas =21 -Slay =6 -Sleep =17 -Sleeper Agent =30 -Sleeper's Guile =25 -Sleeper's Robe =25 -Sleeping Potion =30 -Sleight of Hand =25 -Sleight of Mind =25 -Slice and Dice =36 -Slimy Kavu =25 -Slingshot Goblin =50 -Slinking Giant =25 -Slinking Serpent =25 -Slinking Skirge =26 -Slippery Bogle =25 -Slippery Karst =25 -Slipstream Eel =10 -Slipstream Serpent =17 -Sliptide Serpent =25 -Slith Ascendant =99 -Slith Bloodletter =12 -Slith Firewalker =4 -Slith Predator =74 -Slith Strider =12 -Slithering Shade =25 -Slithermuse =35 -Slithery Stalker =28 -Sliver Legion =868 -Sliver Overlord =374 -Sliver Queen =2182 -Sliver Token =699 -Sliversmith =25 -Slobad, Goblin Tinkerer =25 -Slow Motion =46 -Sludge Strider =14 -Sluggishness =26 -Slumbering Tora =100 -Smallpox =74 -Smash =25 -Smash to Smithereens =25 -Smite =25 -Smogsteed Rider =28 -Smoke =25 -Smokebraider =75 -Smokespew Invoker =25 -Smokestack =757 -Smolder Initiate =25 -Smoldering Butcher =25 -Smoldering Crater =25 -Smoldering Tar =50 -Smother =25 -Snag =179 -Snake Basket =96 -Snake Cult Initiation =41 -Snake Pit =9 -Snakeform =25 -Snap =25 -Snapback =25 -Snapping Drake =25 -Snapping Thragg =25 -Snarling Undorak =25 -Sneak Attack =810 -Sneaky Homunculus =25 -Snorting Gahr =25 -Snow Devil =25 -Snow Fortress =26 -Snow Hound =25 -Snow-Covered Forest =10 -Snow-Covered Island =10 -Snow-Covered Mountain =10 -Snow-Covered Plains =10 -Snow-Covered Swamp =10 -Snowblind =100 -Snuff Out =76 -Soar =49 -Soaring Hope =25 -Soaring Seacliff =25 -Soilshaper =24 -Sokenzan Bruiser =25 -Sokenzan Renegade =26 -Sokenzan Spellblade =25 -Sol Grail =99 -Sol Ring =655 -Sol'kanar the Swamp King =43 -Solar Blast =50 -Solar Tide =25 -Solarion =50 -Soldevi Adnate =12 -Soldevi Digger =97 -Soldevi Excavations =99 -Soldevi Golem =63 -Soldevi Heretic =12 -Soldevi Machinist =25 -Soldevi Sage =12 -Soldevi Sentry =99 -Soldevi Simulacrum =25 -Soldevi Steam Beast =12 -Soldier of Fortune =100 -Soldier Replica =26 -Soldier Token =114 -Solemn Offering =20 -Solemn Simulacrum =147 -Solfatara =25 -Solidarity =25 -Solitary Confinement =217 -Soltari Champion =111 -Soltari Crusader =49 -Soltari Emissary =74 -Soltari Foot Soldier =25 -Soltari Guerrillas =25 -Soltari Lancer =25 -Soltari Monk =28 -Soltari Priest =38 -Soltari Trooper =25 -Soltari Visionary =25 -Somber Hoverguard =25 -Somnomancer =25 -Somnophore =54 -Song of Blood =25 -Song of Serenity =20 -Songs of the Damned =25 -Songstitcher =25 -Sonic Burst =25 -Sonic Seizure =25 -Soot Imp =33 -Sootfeather Flock =25 -Soothing Balm =25 -Soothsaying =38 -Sootstoke Kindler =25 -Sootwalkers =25 -Sophic Centaur =17 -Soramaro, First to Dream =25 -Soratami Cloud Chariot =25 -Soratami Cloudskater =25 -Soratami Mindsweeper =25 -Soratami Mirror-Guard =25 -Soratami Mirror-Mage =99 -Soratami Rainshaper =25 -Soratami Savant =99 -Soratami Seer =25 -Soraya the Falconer =68 -Sorceress Queen =72 -Sorcerous Sight =25 -Sorin Markov =786 -Sorrow's Path =99 -Sorry =25 -Sosuke, Son of Seshiro =25 -Sosuke's Summons =48 -Soul Barrier =25 -Soul Bleed =35 -Soul Burn =25 -Soul Channeling =25 -Soul Charmer =25 -Soul Collector =25 -Soul Echo =94 -Soul Exchange =6 -Soul Feast =12 -Soul Foundry =182 -Soul Kiss =25 -Soul Link =25 -Soul Manipulation =25 -Soul Net =6 -Soul Nova =12 -Soul of Magma =25 -Soul Reap =25 -Soul Rend =300 -Soul Scourge =25 -Soul Sculptor =246 -Soul Shepherd =25 -Soul Snuffers =37 -Soul Spike =43 -Soul Stair Expedition =25 -Soul Strings =25 -Soul Warden =25 -Soul's Fire =25 -Soul's Grace =25 -Soul's Majesty =31 -Soul's Might =25 -Soulblast =25 -Soulbright Flamekin =28 -Soulcatcher =93 -Soulcatchers' Aerie =81 -Souldrinker =299 -Soulgorger Orgg =29 -Soulless One =56 -Soulless Revival =25 -Soulquake =50 -Souls of the Faultless =50 -Soulscour =25 -Soulshriek =25 -Soulsworn Jury =25 -Soultether Golem =16 -Sound the Call =25 -Southern Elephant =99 -Southern Paladin =86 -Sovereigns of Lost Alara =46 -Sower of Temptation =387 -Sowing Salt =12 -Spark Elemental =25 -Spark Fiend =49 -Spark Mage =25 -Spark Spray =26 -Sparkcaster =25 -Sparkmage Apprentice =25 -Sparksmith =25 -Sparkspitter =6 -Sparring Collar =25 -Sparring Golem =25 -Spatial Binding =25 -Spatula of the Ages =37 -Spawnbroker =25 -Spawning Pit =33 -Spawning Pool =25 -Spawnwrithe =27 -Spearbreaker Behemoth =29 -Specter's Shroud =21 -Specter's Wail =25 -Spectral Bears =48 -Spectral Cloak =40 -Spectral Force =39 -Spectral Guardian =87 -Spectral Lynx =35 -Spectral Procession =100 -Spectral Searchlight =25 -Spectral Shield =800 -Spectral Shift =99 -Spectral Sliver =38 -Spell Blast =25 -Spell Burst =25 -Spell Counter =99 -Spell Pierce =52 -Spell Snare =302 -Spell Snip =25 -Spell Syphon =25 -Spellbane Centaur =62 -Spellbinder =60 -Spellbook =25 -Spellbound Dragon =40 -Spellbreaker Behemoth =82 -Spellgorger Barbarian =25 -Spelljack =119 -Spellshift =35 -Spellshock =25 -Spellstutter Sprite =40 -Spelltithe Enforcer =37 -Spellweaver Helix =38 -Spellweaver Volute =28 -Spellwild Ouphe =25 -Sphere of Duty =25 -Sphere of Grace =25 -Sphere of Law =36 -Sphere of Purity =25 -Sphere of Reason =25 -Sphere of Resistance =298 -Sphere of Truth =25 -Sphinx Ambassador =55 -Sphinx of Jwar Isle =103 -Sphinx of Lost Truths =35 -Sphinx of the Steel Wind =636 -Sphinx Sovereign =76 -Sphinx Summoner =49 -Sphinx's Herald =25 -Spider Climb =450 -Spidersilk Armor =25 -Spidersilk Net =25 -Spiderwig Boggart =25 -Spike Breeder =199 -Spike Cannibal =25 -Spike Colony =5 -Spike Drone =25 -Spike Feeder =12 -Spike Hatcher =99 -Spike Rogue =26 -Spike Soldier =25 -Spike Tiller =32 -Spike Weaver =75 -Spike Worker =5 -Spikeshot Goblin =56 -Spiketail Drake =28 -Spiketail Drakeling =48 -Spiketail Hatchling =25 -Spin into Myth =25 -Spinal Embrace =56 -Spinal Graft =25 -Spinal Parasite =74 -Spinal Villain =674 -Spincrusher =25 -Spindrift Drake =25 -Spined Basher =25 -Spined Fluke =99 -Spined Sliver =25 -Spined Wurm =25 -Spineless Thug =25 -Spinerock Knoll =42 -Spinneret Sliver =25 -Spinning Darkness =25 -Spiny Starfish =12 -Spiraling Embers =25 -Spire Barrage =25 -Spire Golem =25 -Spire Owl =25 -Spirit Cairn =99 -Spirit en-Dal =25 -Spirit en-Kor =56 -Spirit Flare =25 -Spirit Link =50 -Spirit Loop =49 -Spirit Mirror =99 -Spirit of Resistance =25 -Spirit of the Hearth =40 -Spirit of the Night =344 -Spirit Shackle =25 -Spirit Shield =8 -Spirit Token =20 -Spirit Weaver =25 -Spiritmonger =271 -Spiritual Asylum =49 -Spiritual Focus =36 -Spiritual Guardian =6 -Spiritual Sanctuary =99 -Spiritual Visit =29 -Spiritualize =50 -Spite/Malice =25 -Spitebellows =25 -Spiteflame Witch =25 -Spiteful Bully =25 -Spiteful Visions =31 -Spitemare =48 -Spitfire Handler =25 -Spitting Drake =25 -Spitting Earth =25 -Spitting Gourna =25 -Spitting Hydra =38 -Spitting Image =45 -Spitting Sliver =25 -Spitting Slug =25 -Spitting Spider =6 -Splinter =25 -Splintering Wind =25 -Split-Tail Miko =17 -Splitting Headache =25 -Spoils of Evil =49 -Spoils of the Vault =99 -Spoils of Victory =170 -Spoils of War =33 -Spontaneous Combustion =50 -Spontaneous Generation =82 -Spore Burst =25 -Spore Cloud =33 -Spore Flower =52 -Spore Frog =75 -Sporeback Troll =25 -Sporesower Thallid =29 -Sporogenesis =49 -Sporoloth Ancient =31 -Spotted Griffin =99 -Spreading Algae =29 -Spreading Plague =25 -Spreading Seas =35 -Spring Cleaning =25 -Spring of Eternal Peace =100 -Springing Tiger =25 -Springjack Knight =25 -Springjack Pasture =25 -Springjack Shepherd =25 -Springleaf Drum =25 -Sprite Noble =25 -Sprout =18 -Sprout Swarm =25 -Sprouting Phytohydra =25 -Sprouting Thrinax =52 -Sprouting Vines =26 -Spur Grappler =25 -Spurnmage Advocate =25 -Spurred Wolverine =25 -Spy Network =33 -Squall =25 -Squall Drifter =25 -Squall Line =32 -Squallmonger =25 -Squandered Resources =74 -Squeaking Pie Grubfellows =25 -Squeaking Pie Sneak =25 -Squealing Devil =25 -Squee, Goblin Nabob =152 -Squee's Embrace =19 -Squee's Revenge =25 -Squee's Toy =25 -Squeeze =36 -Squelch =25 -Squire =25 -Squirming Mass =26 -Squirrel Farm =33 -Squirrel Mob =112 -Squirrel Nest =194 -Squirrel Token =172 -Squirrel Wrangler =55 -Stabilizer =99 -Staff of Domination =259 -Staff of the Ages =66 -Staff of Zegon =99 -Stag Beetle =25 -Stalker Hag =21 -Stalking Assassin =50 -Stalking Bloodsucker =97 -Stalking Stones =25 -Stalking Tiger =25 -Stalking Vengeance =25 -Stalking Yeti =25 -Stamina =27 -Stampede =33 -Stampede Driver =5 -Stampeding Rhino =45 -Stampeding Serow =25 -Stampeding Wildebeests =16 -Stand Firm =25 -Stand or Fall =25 -Stand Together =29 -Stand/Deliver =25 -Standard Bearer =179 -Standardize =25 -Standing Stones =25 -Standing Troops =25 -Standstill =705 -Stangg =49 -Star Compass =22 -Starke of Rath =59 -Starlight =49 -Starlight Invoker =25 -Starlit Angel =56 -Starlit Sanctum =43 -Starstorm =93 -Starved Rusalka =28 -Stasis =86 -Stasis Cell =25 -Stasis Cocoon =25 -Statecraft =50 -Static Orb =44 -Staunch Defenders =12 -Staying Power =25 -Steadfast Guard =25 -Steadfastness =99 -Steal Artifact =22 -Steal Enchantment =39 -Steal Strength =29 -Steam Blast =25 -Steam Catapult =281 -Steam Spitter =25 -Steam Vents =753 -Steam Vines =25 -Steamclaw =25 -Steamcore Weird =25 -Steamflogger Boss =26 -Steel Golem =25 -Steel Leaf Paladin =25 -Steel of the Godhead =3 -Steel Wall =25 -Steelclad Serpent =25 -Steeling Stance =25 -Steelshaper Apprentice =25 -Steelshaper's Gift =81 -Steely Resolve =188 -Stench of Decay =12 -Stench of Evil =25 -Stenchskipper =26 -Steppe Lynx =21 -Sterling Grove =313 -Stern Judge=29 -Stern Proctor =62 -Steward of Valeron =25 -Stifle =1214 -Stigma Lasher =178 -Still Life =25 -Stillmoon Cavalier =282 -Stinging Barrier =25 -Stinging Licid =6 -Stingmoggie =25 -Stingscourger =25 -Stinkdrinker Bandit =25 -Stinkweed Imp =60 -Stir the Grave =25 -Stir the Pride =49 -Stitch in Time =60 -Stitch Together =50 -Stoic Angel =118 -Stoic Champion =25 -Stoic Ephemera =25 -Stolen Grain =1000 -Stomp and Howl =25 -Stomping Ground =895 -Stomping Slabs =25 -Stone Calendar =59 -Stone Catapult =203 -Stone Giant =66 -Stone Kavu =26 -Stone Rain =6 -Stone Spirit =25 -Stone-Seeder Hierophant =25 -Stone-Throwing Devils =62 -Stone-Tongue Basilisk =35 -Stonebrow, Krosan Hero =43 -Stonecloaker =25 -Stonehewer Giant =99 -Stoneshaker Shaman =5 -Stonewood Invocation =39 -Stonewood Invoker =25 -Stonework Puma =25 -Stonybrook Angler =25 -Stonybrook Banneret =50 -Stonybrook Schoolmaster =25 -Storage Matrix =42 -Storm Cauldron =25 -Storm Crow =12 -Storm Elemental =24 -Storm Entity =47 -Storm Front =25 -Storm Herd =35 -Storm Seeker =12 -Storm Shaman =25 -Storm Spirit =63 -Storm World =325 -Stormbind =24 -Stormcaller's Boon =25 -Stormcloud Djinn =65 -Stormfront Pegasus =45 -Stormfront Riders =27 -Stormscale Anarch =28 -Stormscape Apprentice =25 -Stormscape Battlemage =25 -Stormscape Familiar =25 -Stormscape Master =35 -Stormwatch Eagle =25 -Story Circle =25 -Strafe =25 -Strands of Night =25 -Strands of Undeath =49 -Strange Inversion =52 -Strangling Soot =25 -Stratadon =25 -Strategic Planning =5109 -Strategy, Schmategy =175 -Stratozeppelid =28 -Straw Golem =25 -Straw Soldiers =100 -Stream Hopper =25 -Stream of Acid =229 -Stream of Consciousness =25 -Stream of Life =25 -Stream of Unconsciousness =25 -Streambed Aquitects =25 -Street Savvy =25 -Street Wraith =25 -Streetbreaker Wurm =25 -Strength in Numbers =17 -Strength of Cedars =5 -Strength of Isolation =25 -Strength of Lunacy =25 -Strength of Night =26 -Strength of Unity =25 -Strip Bare =25 -Strip Mine =182 -Striped Bears =25 -Stroke of Genius =235 -Stromgald Cabal =25 -Stromgald Crusader =164 -Stromgald Spy =25 -Strongarm Tactics =25 -Strongarm Thug =25 -Stronghold Assassin =63 -Stronghold Biologist =25 -Stronghold Discipline =25 -Stronghold Gambit =74 -Stronghold Machinist =6 -Stronghold Overseer =41 -Stronghold Rats =25 -Stronghold Taskmaster =25 -Stronghold Zeppelin =28 -Struggle for Sanity =25 -Student of Elements =25 -Stuffy Doll =350 -Stun =25 -Stun Sniper =25 -Stunted Growth =29 -Stupefying Touch =25 -Stupor =27 -Sturdy Hatchling =25 -Su-Chi =371 -Subdue =25 -Submerge =66 -Subterranean Hangar =25 -Subterranean Shambler =17 -Subterranean Spirit =97 -Subversion =68 -Sudden Death =8 -Sudden Impact =25 -Sudden Shock =49 -Sudden Spoiling =80 -Sudden Strength =25 -Suffocating Blast =99 -Suffocation =36 -Suicidal Charge =25 -Sulam Djinn =25 -Suleiman's Legacy =98 -Sulfur Elemental =25 -Sulfur Vent =25 -Sulfuric Vapors =48 -Sulfuric Vortex =95 -Sulfurous Blast =25 -Sulfurous Springs =71 -Summer Bloom =62 -Summon the School =18 -Summoner's Bane =25 -Summoner's Egg =47 -Summoner's Pact =419 -Summoning Station =55 -Summoning Trap =41 -Sun Clasp =25 -Sun Droplet =45 -Sun Quan, Lord of Wu =1500 -Sun's Bounty =25 -Sunastian Falconer =40 -Sunbeam Spellbomb =25 -Suncrusher =33 -Sunder =67 -Sunder from Within =99 -Sundering Titan =136 -Sundering Vitae =25 -Sunfire Balm =25 -Sunflare Shaman =25 -Sunforger =44 -Sunglasses of Urza =25 -Sungrass Egg =50 -Sungrass Prairie =85 -Sunhome Enforcer =25 -Sunhome, Fortress of the Legion =8 -Sunken City =25 -Sunken Field =6 -Sunken Hope =25 -Sunken Ruins =425 -Sunlance =25 -Sunpetal Grove =450 -Sunrise Sovereign =28 -Sunscape Apprentice =25 -Sunscape Battlemage =6 -Sunscape Familiar =25 -Sunscape Master =58 -Sunscour =72 -Sunseed Nurturer =5 -Sunspring Expedition =25 -Sunstone =800 -Sunstrike Legionnaire =25 -Suntail Hawk =25 -Suntouched Myr =25 -Sunweb =25 -Super Secret Tech =99 -Superior Numbers =100 -Supersize =20 -Supply/Demand =25 -Suppress =33 -Suppression Field =36 -Supreme Exemplar =72 -Supreme Inquisitor =57 -Suq'Ata Assassin =98 -Suq'Ata Firewalker =49 -Suq'Ata Lancer =25 -Surestrike Trident =52 -Surge of Strength =25 -Surge of Thoughtweft =25 -Surge of Zeal =25 -Surgespanner =23 -Surging AEther =17 -Surging Dementia =25 -Surging Flame =20 -Surging Might =25 -Surging Sentinels =25 -Surprise Deployment =26 -Surrakar Marauder =100 -Surveilling Sprite =25 -Survival of the Fittest =1549 -Survivor of the Unseen =25 -Sustainer of the Realm =15 -Sustaining Spirit =87 -Sustenance =27 -Suture Spirit =25 -Sutured Ghoul =75 -Svogthos, the Restless Tomb =27 -Svyelunite Priest =4 -Svyelunite Temple =25 -Swallowing Plague =25 -Swamp =5 -Swamp Mosquito =23 -Swans of Bryn Argoll =109 -Swarm of Rats =15 -Swarmyard =74 -Swat =25 -Sway of Illusion =25 -Sway of the Stars =74 -Swell of Courage =25 -Swelter =49 -Swerve =54 -Swift Silence =52 -Swirl the Mists =56 -Swirling Sandstorm =25 -Swirling Spriggan =25 -Swooping Talon =38 -Sword Dancer =25 -Sword of Fire and Ice =930 -Sword of Kaldra =222 -Sword of Light and Shadow =560 -Sword of the Ages =500 -Sword of the Chosen =74 -Sword of the Meek =211 -Sword of the Paruns =44 -Swords to Plowshares =222 -Sworn Defender =25 -Sygg, River Cutthroat =64 -Sygg, River Guide =28 -Sylvan Basilisk =49 -Sylvan Bounty =25 -Sylvan Echoes =25 -Sylvan Hierophant =25 -Sylvan Library =106 -Sylvan Messenger =88 -Sylvan Might =25 -Sylvan Paradise =125 -Sylvan Safekeeper =47 -Sylvan Scrying =25 -Sylvan Tutor =301 -Sylvan Yeti =52 -Sylvok Explorer =25 -Symbiosis =25 -Symbiotic Beast =25 -Symbiotic Deployment =49 -Symbiotic Elf =25 -Symbiotic Wurm =55 -Symbol of Unsummoning =6 -Synapse Sliver =80 -Synchronous Sliver =25 -Syncopate =25 -Synod Artificer =81 -Synod Centurion =49 -Synod Sanctum =99 -Syphon Life =25 -Syphon Mind =6 -Syphon Soul =25 -Szadek, Lord of Secrets =69 -Tablet of Epityr =76 -Tahngarth, Talruum Hero =75 -Tahngarth's Glare =25 -Tahngarth's Rage =100 -Taiga =3317 -Tainted AEther =69 -Tainted Field =79 -Tainted Isle =49 -Tainted Pact =53 -Tainted Peak =49 -Tainted Sigil =25 -Tainted Specter =74 -Tainted Well =25 -Tainted Wood =66 -Taj-Nar Swordsmith =99 -Tajuru Archer =49 -Take Possession =25 -Takeno, Samurai General =99 -Takeno's Cavalry =17 -Takenuma Bleeder =5 -Takklemaggot =69 -Talara's Bane =25 -Talara's Battalion =279 -Talas Air Ship =50 -Talas Explorer =25 -Talas Researcher =192 -Talas Warrior =292 -Talisman of Dominance =49 -Talisman of Impulse =33 -Talisman of Indulgence =49 -Talisman of Progress =12 -Talisman of Unity =49 -Tallowisp =25 -Talon of Pain =25 -Talon Sliver =41 -Talon Trooper =25 -Talonrend =25 -Talruum Champion =25 -Talruum Minotaur =20 -Talruum Piper =74 -Tamanoa =97 -Tangle =37 -Tangle Asp =25 -Tangle Golem =25 -Tangle Kelp =25 -Tangle Spider =25 -Tangle Wire =326 -Tanglebloom =25 -Tangleroot =86 -Tanglesap =25 -Tanglewalker =6 -Taniwha =25 -Taoist Hermit =1000 -Tar Fiend =24 -Tar Pit Warrior =25 -Tar Pitcher =37 -Tarfire =25 -Tariff =34 -Tarmogoyf =6326 -Tarnished Citadel =100 -Tarox Bladewing =51 -Tarpan =25 -Task Force =86 -Task Mage Assembly =100 -Taste for Mayhem =25 -Taste of Paradise =12 -Tatsumasa, the Dragon's Fang =125 -Tattered Drake =25 -Tatterkite =25 -Tattermunge Duo =25 -Tattermunge Maniac =19 -Tattermunge Witch =28 -Tattoo Ward =25 -Taunt =99 -Taunting Challenge =674 -Taunting Elf =25 -Taurean Mauler =115 -Tawnos's Coffin =617 -Tawnos's Wand =26 -Tawnos's Weaponry =25 -Teardrop Kami =17 -Tears of Rage =25 -Tectonic Break =17 -Tectonic Fiend =5 -Tectonic Instability =25 -Teeka's Dragon =128 -Teetering Peaks =25 -Teferi, Mage of Zhalfir =186 -Teferi's Care =25 -Teferi's Curse =25 -Teferi's Drake =25 -Teferi's Imp =74 -Teferi's Isle =25 -Teferi's Moat =33 -Teferi's Puzzle Box =15 -Teferi's Realm =47 -Teferi's Response =19 -Teferi's Veil =25 -Tek =84 -Tel-Jilad Archers =26 -Tel-Jilad Chosen =25 -Tel-Jilad Exile =25 -Tel-Jilad Justice =29 -Tel-Jilad Lifebreather =25 -Tel-Jilad Outrider =25 -Tel-Jilad Stylus =99 -Tel-Jilad Wolf =25 -Telekinesis =248 -Telekinetic Bonds =25 -Telekinetic Sliver =50 -Telemin Performance =60 -Telepathic Spies =25 -Telepathy =25 -Teleport =99 -Telethopter =25 -Telim'Tor =100 -Telim'Tor's Darts =38 -Telim'Tor's Edict =25 -Teller of Tales =25 -Telling Time =49 -Temper =38 -Tempest Drake =21 -Tempest Efreet =150 -Tempest of Light =12 -Tempest Owl =25 -Temple Acolyte =25 -Temple Garden =715 -Temple of the False God =34 -Temporal Adept =17 -Temporal Aperture =103 -Temporal Cascade =49 -Temporal Distortion =25 -Temporal Eddy =17 -Temporal Extortion =49 -Temporal Fissure =26 -Temporal Isolation =25 -Temporal Manipulation =562 -Temporal Spring =25 -Temporary Insanity =30 -Temporary Truce =115 -Tempting Licid =25 -Tempting Wurm =25 -Tendo Ice Bridge =181 -Tendrils of Agony =53 -Tendrils of Corruption =25 -Tendrils of Despair =5 -Teneb, the Harvester =57 -Tenza, Godo's Maul =5 -Tephraderm =100 -Terashi's Cry =25 -Terashi's Grasp =25 -Terashi's Verdict =99 -Teremko Griffin =25 -Terminal Moraine =33 -Terminate =53 -Teroh's Faithful =25 -Teroh's Vanguard =99 -Terra Stomper =34 -Terraformer =25 -Terrain Generator =36 -Terramorphic Expanse =4 -Terrarion =25 -Terravore =459 -Territorial Baloth =6 -Territorial Dispute =25 -Terror =3 -Test of Endurance =188 -Test of Faith =99 -Testament of Faith =25 -Tethered Griffin =50 -Tethered Skirge =5 -Tetravus =50 -Tetsuo Umezawa =651 -Teysa, Orzhov Scion =46 -Tezzeret the Seeker =867 -Thalakos Deceiver =97 -Thalakos Dreamsower =33 -Thalakos Drifters =62 -Thalakos Lowlands =36 -Thalakos Mistfolk =6 -Thalakos Scout =29 -Thalakos Seer =5 -Thalakos Sentry =25 -Thallid =25 -Thallid Devourer =25 -Thallid Germinator =56 -Thallid Shell-Dweller =25 -That Which Was Taken =216 -Thaumatog =99 -Thawing Glaciers =254 -The Abyss =5764 -The Brute =25 -The Cheese Stands Alone =170 -The Fallen =25 -The Hive =25 -The Lady of the Mountain =69 -The Rack =58 -The Tabernacle at Pendrell Vale =23962 -The Unspeakable =47 -The Wretched =62 -Theft of Dreams =26 -Thelon of Havenwood =48 -Thelon's Chant =75 -Thelon's Curse =8 -Thelonite Druid =4 -Thelonite Hermit =44 -Thelonite Monk =6 -Thermal Blast =25 -Thermal Flux =25 -Thermal Glider =25 -Thermal Navigator =25 -Thermokarst =25 -Thermopod =25 -Thick-Skinned Goblin =25 -Thicket Basilisk =49 -Thicket Elemental =69 -Thief of Hope =16 -Thieves' Auction =100 -Thieves' Fortune =25 -Thieving Magpie =25 -Thieving Sprite =25 -Thing from the Deep =49 -Think Tank =25 -Think Twice =5 -Thirst =12 -Thirst for Knowledge =53 -Thistledown Duo =25 -Thistledown Liege =87 -Thopter Foundry =32 -Thopter Squadron =74 -Thorn Elemental =48 -Thorn of Amethyst =90 -Thorn Thallid =33 -Thorn-Thrash Viashino =25 -Thornbite Staff =37 -Thornling =290 -Thornscape Apprentice =25 -Thornscape Battlemage =9 -Thornscape Familiar =25 -Thornscape Master =25 -Thorntooth Witch =25 -Thornwatch Scarecrow =25 -Thornweald Archer =25 -Thornwind Faeries =37 -Thought Courier =25 -Thought Devourer =29 -Thought Dissector =25 -Thought Eater =25 -Thought Hemorrhage =244 -Thought Lash =48 -Thought Nibbler =25 -Thought Prison =99 -Thought Reflection =25 -Thoughtbind =5 -Thoughtbound Primoc =25 -Thoughtcast =48 -Thoughtcutter Agent =25 -Thoughtlace =25 -Thoughtleech =25 -Thoughtpicker Witch =25 -Thoughts of Ruin =37 -Thoughtseize =1047 -Thoughtweft Gambit =25 -Thoughtweft Trio =30 -Thousand-legged Kami =25 -Thousand-Year Elixir =27 -Thran Dynamo =88 -Thran Forge =25 -Thran Foundry =30 -Thran Golem =35 -Thran Lens =37 -Thran Quarry =192 -Thran Tome =51 -Thran Turbine =25 -Thran War Machine =5 -Thran Weaponry =25 -Thrashing Mudspawn =99 -Thrashing Wumpus =71 -Thraximundar =89 -Threads of Disloyalty =281 -Threaten =6 -Three Tragedies =50 -Three Visits =200 -Three Wishes =98 -Thresher Beast =25 -Thrill of the Hunt =25 -Thriss, Nantuko Primus =100 -Thrive =25 -Throat Slitter =25 -Throne of Bone =25 -Through the Breach =25 -Thrull Champion =33 -Thrull Retainer =4 -Thrull Surgeon =50 -Thrull Wizard =4 -Thrumming Stone =420 -Thumbscrews =74 -Thunder Dragon =391 -Thunder of Hooves =25 -Thunder Spirit =1656 -Thunder Totem =25 -Thunder Wall =25 -Thunder-Thrash Elder =25 -Thunderblade Charge =25 -Thunderblust =58 -Thunderbolt =27 -Thunderclap =25 -Thundercloud Elemental =25 -Thundercloud Shaman =25 -Thunderheads =28 -Thundering Giant =25 -Thundering Wurm =475 -Thundermare =71 -Thunderscape Apprentice =25 -Thunderscape Battlemage =7 -Thunderscape Familiar =25 -Thunderscape Master =25 -Thundersong Trumpeter =5 -Thunderstaff =50 -Thwart =144 -Tibor and Lumia =46 -Ticking Gnomes =25 -Tidal Bore =25 -Tidal Control =25 -Tidal Courier =25 -Tidal Flats =25 -Tidal Influence =50 -Tidal Kraken =49 -Tidal Surge =25 -Tidal Visionary =25 -Tidal Warrior =49 -Tidal Wave =25 -Tide of War =33 -Tidehollow Sculler =38 -Tidehollow Strix =31 -Tideshaper Mystic =25 -Tidespout Tyrant =78 -Tidewalker =25 -Tidewater Minion =25 -Tidings =49 -Tiger Claws =21 -Tigereye Cameo =30 -Tilling Treefolk =25 -Timber Protector =108 -Timber Wolves =25 -Timberland Ruins =25 -Timberline Ridge =47 -Timbermare =36 -Timbermaw Larva =25 -Timberwatch Elf =55 -Time and Tide =98 -Time Bomb =48 -Time Ebb =25 -Time Elemental =17 -Time Machine =99 -Time of Need =56 -Time Sieve =89 -Time Stop =33 -Time Stretch =51 -Time Vault =18441 -Time Walk =35223 -Time Warp =380 -Timebender =25 -Timecrafting =37 -Timesifter =25 -Timetwister =15340 -Timid Drake =25 -Timmerian Fiends =62 -Timmy, Power Gamer =50 -Tin Street Hooligan =25 -Tin-Wing Chimera =98 -Tinder Farm =25 -Tinder Wall =25 -Tinker =248 -Tireless Tribe =53 -Titan's Revenge =25 -Titania's Boon =25 -Titania's Chosen =141 -Titania's Song =25 -Titanic Bulvox =25 -Titanic Ultimatum =49 -Titanium Golem =26 -Tithe =128 -Tivadar of Thorn =47 -Tivadar's Crusade =139 -To Arms! =25 -Tobias Andrion =99 -Toil to Renown =25 -Toils of Night and Day =25 -Tolaria =44 -Tolaria West =1273 -Tolarian Academy =2161 -Tolarian Drake =25 -Tolarian Emissary =25 -Tolarian Entrancer =116 -Tolarian Sentinel =5 -Tolarian Serpent =100 -Tolarian Winds =25 -Tolsimir Wolfblood =53 -Tomb of Urami =29 -Tombfire =31 -Tombstalker =660 -Tombstone Stairwell =137 -Tome Scour =3 -Tomorrow, Azami's Familiar =62 -Tonic Peddler =5 -Tooth and Claw =39 -Tooth and Nail =160 -Tooth of Chiss-Goria =26 -Tooth of Ramos =49 -Topan Ascetic =25 -Topple =25 -Topsy Turvy =100 -Tor Giant =16 -Tor Wauki =99 -Torch Drake =25 -Torch Slinger =25 -Torch Song =25 -Torchling =28 -Torii Watchward =25 -Tormented Angel =41 -Tormod's Crypt =58 -Tornado =48 -Tornado Elemental =99 -Torpid Moloch =25 -Torpor Dust =25 -Torrent of Fire =49 -Torrent of Lava =74 -Torrent of Souls =33 -Torrent of Stone =17 -Torsten Von Ursus =68 -Tortoise Formation =25 -Torture =7 -Torture Chamber =50 -Tortured Existence =150 -Toshiro Umezawa =64 -Total War =63 -Totem Speaker =48 -Touch and Go =20 -Touch of Brilliance =49 -Touch of Darkness =475 -Touch of Death =25 -Touch of Invisibility =25 -Touch of Vitae =25 -Touchstone =25 -Tourach's Chant =6 -Tourach's Gate =6 -Tower Above =99 -Tower Drake =25 -Tower Gargoyle =25 -Tower of Champions =99 -Tower of Coireall =150 -Tower of Eons =47 -Tower of Fortunes =38 -Tower of Murmurs =25 -Tower of the Magistrate =54 -Towering Baloth =25 -Toxic Iguanar =25 -Toxic Stench =25 -Toxin Sliver =375 -Toymaker =5 -Trace of Abundance =25 -Tracker =39 -Trade Caravan =25 -Trade Routes =55 -Trade Secrets =14 -Tradewind Rider =153 -Tragic Poet =25 -Trailblazer =8500 -Trailblazer's Boots =25 -Train of Thought =17 -Trained Armodon =5 -Trained Cheetah =99 -Trained Jackal =100 -Trained Orgg =5 -Trained Pronghorn =25 -Traitor's Clutch =17 -Traitor's Roar =100 -Tranquil Domain =25 -Tranquil Garden =6 -Tranquil Grove =25 -Tranquil Path =26 -Tranquil Thicket =41 -Tranquility =20 -Transcendence =44 -Transguild Courier =41 -Transluminant =25 -Transmogrifying Licid =26 -Transmutation =12 -Transmute Artifact =555 -Trap Digger =25 -Trap Runner =37 -Trapfinder's Trick =25 -Trapjaw Kelpie =25 -Trapmaker's Snare =33 -Traproot Kami =25 -Trash for Treasure =66 -Traumatic Visions =25 -Traumatize =142 -Traveler's Cloak =25 -Traveling Plague =25 -Treacherous Link =5 -Treacherous Urge =25 -Treacherous Vampire =25 -Treacherous Werewolf =25 -Treachery =254 -Treasure Hunter =25 -Treasure Trove =25 -Tree Monkey =45 -Tree of Tales =21 -Treefolk Harbinger =6 -Treefolk Healer =3 -Treefolk Mystic =25 -Treefolk Seedlings =25 -Treespring Lorian =25 -Treetop Bracers =25 -Treetop Defense =50 -Treetop Rangers =25 -Treetop Scout =25 -Treetop Sentinel =25 -Treetop Village =67 -Tremble =25 -Tremor =25 -Trench Wurm =25 -Trespasser il-Vec =25 -Tresserhorn Sinks =25 -Tresserhorn Skyknight =25 -Treva, the Renewer =222 -Treva's Attendant =25 -Treva's Charm =7 -Treva's Ruins =49 -Triangle of War =98 -Triassic Egg =99 -Tribal Flames =25 -Tribal Forcemage =88 -Tribal Golem =99 -Tribal Unity =65 -Trickbind =109 -Trickery Charm =25 -Trickster Mage =25 -Triclopean Sight =25 -Trinisphere =290 -Trinket Mage =23 -Trip Noose =38 -Trip Wire =100 -Triskelavus =48 -Triskelion =75 -Troll Ascetic =162 -Troll-Horn Cameo =25 -Trolls of Tel-Jilad =4 -Tromp the Domains =25 -Trophy Hunter =6 -Tropical Island =4057 -Tropical Storm =25 -Troubled Healer =24 -Troublesome Spirit =25 -Truce =25 -True Believer =71 -Trumpet Blast =25 -Trumpeting Armodon =25 -Trusted Advisor =25 -Trusty Machete =27 -Truth or Tale =16 -Trygon Predator =146 -Tsabo Tavoc =91 -Tsabo's Assassin =33 -Tsabo's Decree =55 -Tsabo's Web =54 -Tsunami =25 -Tukatongue Thallid =25 -Tuknir Deathlock =118 -Tuktuk Grunts =25 -Tundra =1600 -Tundra Kavu =25 -Tundra Wolves =25 -Tunnel =20 -Tunnel Vision =25 -Tunneler Wurm =99 -Turbulent Dreams =25 -Turf Wound =22 -Turn the Tables =25 -Turn to Dust =25 -Turn to Mist =25 -Turnabout =74 -Turntimber Basilisk =28 -Turntimber Grove =25 -Turntimber Ranger =41 -Turtleshell Changeling =49 -Twiddle =25 -Twigwalker =6 -Twilight Drover =25 -Twilight Mire =231 -Twilight Shepherd =95 -Twilight's Call =43 -Twinblade Slasher =50 -Twincast =146 -Twinning Glass =28 -Twinstrike =99 -Twist Allegiance =25 -Twisted Abomination =25 -Twisted Experiment =26 -Twisted Justice =25 -Twitch =25 -Two-Headed Dragon =125 -Two-Headed Giant of Foriys =1445 -Two-Headed Sliver =25 -Typhoon =99 -Tyrannize =56 -Tyrranax =12 -Uba Mask =57 -Uktabi Drake =25 -Uktabi Efreet =25 -Uktabi Faerie =25 -Uktabi Kong =100 -Uktabi Orangutan =48 -Uktabi Wildcats =97 -Ulasht, the Hate Seed =25 -Umara Raptor =25 -Umbilicus =25 -Umbra Stalker =25 -Umbral Mantle =100 -Umezawa's Jitte =1815 -Unbender Tine =25 -Unblinking Bleb =9 -Unburden =26 -Unchecked Growth =29 -Uncle Istvan =25 -Uncontrollable Anger =28 -Uncontrolled Infestation =25 -Undead Gladiator =113 -Undead Leotau =25 -Undead Slayer =25 -Undead Warchief =168 -Undercity Shade =6 -Underground River =52 -Underground Sea =5617 -Undergrowth =12 -Undermine =277 -Undertaker =25 -Undertow =99 -Underworld Dreams =25 -Undiscovered Paradise =965 -Undo =49 -Undying Beast =99 -Undying Flames =5 -Undying Rage =25 -Unearth =13 -Unearthly Blizzard =25 -Unerring Sling =25 -Unforge =25 -Unfulfilled Desires =25 -Unhinge =25 -Unholy Citadel =175 -Unholy Grotto =150 -Unholy Strength =25 -Unified Strike =25 -Unifying Theory =49 -Unlikely Alliance =24 -Unliving Psychopath =25 -Unmake =70 -Unmask =350 -Unnatural Hunger =36 -Unnatural Selection =68 -Unnatural Speed =25 -Unnerve =25 -Unnerving Assault =25 -Unquestioned Authority =48 -Unscythe, Killer of Kings =49 -Unseen Walker =25 -Unspeakable Symbol =28 -Unstable Footing =40 -Unstable Frontier =25 -Unstable Hulk =25 -Unstable Mutation =25 -Unstable Shapeshifter =42 -Unstoppable Ash =38 -Unsummon =25 -Untaidake, the Cloud Keeper =200 -Untamed Wilds =25 -Unwilling Recruit =48 -Unworthy Dead =25 -Unyaro Bees =30 -Unyaro Griffin =25 -Updraft =25 -Upheaval =136 -Uphill Battle =25 -Uproot =17 -Upwelling =25 -Ur-Drago =246 -Ur-Golem's Eye =27 -Urborg =84 -Urborg Drake =49 -Urborg Elf =25 -Urborg Emissary =25 -Urborg Justice =56 -Urborg Mindsucker =25 -Urborg Panther =25 -Urborg Phantom =25 -Urborg Shambler =25 -Urborg Skeleton =25 -Urborg Stalker =74 -Urborg Syphon-Mage =25 -Urborg Uprising =26 -Urborg Volcano =25 -Urborg, Tomb of Yawgmoth =590 -Uril, the Miststalker =183 -Ursapine =58 -Ursine Fylgja =31 -Urza's Armor =25 -Urza's Avenger =25 -Urza's Bauble =24 -Urza's Blueprints =99 -Urza's Chalice =34 -Urza's Engine =25 -Urza's Factory =57 -Urza's Filter =50 -Urza's Guilt =99 -Urza's Incubator =347 -Urza's Mine =6 -Urza's Miter =175 -Urza's Power Plant =6 -Urza's Rage =106 -Urza's Tower =6 -Uthden Troll =25 -Utopia Mycon =41 -Utopia Sprawl =25 -Utopia Tree =104 -Utopia Vow =25 -Utvara Scalper =25 -Uyo, Silent Prophet =25 -Vacuumelt =17 -Vaevictis Asmadi =49 -Vagrant Plowbeasts =99 -Valakut, the Molten Pinnacle =69 -Valeron Outlander =25 -Valiant Guard =25 -Valley Rannet =75 -Valleymaker =25 -Valor =6 -Valor Made Real =25 -Valorous Charge =199 -Vampire Aristocrat =25 -Vampire Bats =25 -Vampire Hexmage =57 -Vampire Hounds =25 -Vampire Lacerator =60 -Vampire Nighthawk =111 -Vampire Nocturnus =1615 -Vampire's Bite =28 -Vampiric Dragon =300 -Vampiric Embrace =38 -Vampiric Feast =25 -Vampiric Link =46 -Vampiric Sliver =39 -Vampiric Spirit =165 -Vampiric Tutor =888 -Vampirism =74 -Vanish into Memory =31 -Vanishing =25 -Vanquish =99 -Vaporous Djinn =25 -Varchild's Crusader =12 -Varchild's War-Riders =97 -Vassal's Duty =25 -Vastwood Gorger =25 -Vault of Whispers =27 -Vebulid =49 -Vec Townships =99 -Vectis Agents =25 -Vectis Dominator =25 -Vectis Silencers =25 -Vedalken AEthermage =25 -Vedalken Archmage =17 -Vedalken Dismisser =25 -Vedalken Engineer =25 -Vedalken Entrancer =25 -Vedalken Ghoul =25 -Vedalken Heretic =41 -Vedalken Mastermind =25 -Vedalken Orrery =91 -Vedalken Outlander =25 -Vedalken Plotter =25 -Vedalken Shackles =739 -Veil of Birds =25 -Veil of Secrecy =25 -Veiled Apparition =25 -Veiled Crocodile =87 -Veiled Sentry =25 -Veiled Serpent =25 -Veiling Oddity =17 -Veilstone Amulet =31 -Vein Drinker =28 -Veinfire Borderpost =20 -Veldrane of Sengir =25 -Veldt =99 -Venarian Glimmer =25 -Venarian Gold =34 -Vendetta =25 -Vendilion Clique =594 -Venerable Kumo =25 -Venerable Monk =25 -Vengeance =25 -Vengeful Dead =97 -Vengeful Dreams =74 -Vengeful Firebrand =29 -Vengeful Rebirth =25 -Venom =25 -Venomous Breath =6 -Venomous Dragonfly =25 -Venomous Fangs =19 -Venomous Vines =25 -Venomspout Brackus =25 -Venser, Shaper Savant =163 -Venser's Diffusion =25 -Venser's Sliver =25 -Ventifact Bottle =74 -Verdant Catacombs =929 -Verdant Eidolon =25 -Verdant Embrace =44 -Verdant Field =25 -Verdant Force =58 -Verdant Succession =69 -Verdant Touch =24 -Verdeloth the Ancient =33 -Verdigris =25 -Verduran Emissary =25 -Verduran Enchantress =25 -Vermiculos =49 -Vernal Bloom =57 -Vernal Equinox =68 -Vertigo =25 -Vertigo Spawn =28 -Vesper Ghoul =29 -Vesuva =153 -Vesuvan Doppelganger =275 -Vesuvan Shapeshifter =73 -Veteran Armorer =25 -Veteran Armorsmith =25 -Veteran Bodyguard =31 -Veteran Brawlers =17 -Veteran Cavalier =99 -Veteran Explorer =18 -Veteran of the Depths =25 -Veteran Swordsmith =25 -Veteran's Armaments =25 -Veteran's Voice =12 -Vex =25 -Vexing Arcanix =25 -Vexing Beetle =25 -Vexing Shusher =247 -Vexing Sphinx =48 -Vhati il-Dal =27 -Viashino Bey =26 -Viashino Bladescout =17 -Viashino Cutthroat =26 -Viashino Fangtail =25 -Viashino Grappler =25 -Viashino Heretic =25 -Viashino Outrider =25 -Viashino Runner =26 -Viashino Sandscout =28 -Viashino Sandstalker =15 -Viashino Sandswimmer =100 -Viashino Skeleton =25 -Viashino Slasher =25 -Viashino Slaughtermaster =25 -Viashino Spearhunter =49 -Viashino Warrior =25 -Viashino Weaponsmith =25 -Viashivan Dragon =249 -Vibrating Sphere =63 -Vicious Betrayal =5 -Vicious Hunger =25 -Vicious Kavu =25 -Vicious Shadows =28 -Victimize =59 -Victual Sliver =144 -View from Above =25 -Vigean Graftmage =99 -Vigean Hydropon =25 -Vigean Intuition =25 -Vigilance =167 -Vigilant Drake =25 -Vigilant Martyr =25 -Vigilant Sentry =25 -Vigor =136 -Vigor Mortis =31 -Vigorous Charge =25 -Vile Consumption =49 -Vile Deacon =25 -Vile Requiem =25 -Village Elder =25 -Villainous Ogre =25 -Vindicate =1114 -Vindictive Mob =38 -Vine Dryad =76 -Vine Kami =25 -Vine Trellis =25 -Vinelasher Kudzu =64 -Vines of Vastwood =27 -Vintara Elephant =25 -Vintara Snapper =28 -Violent Eruption =25 -Violent Outburst =25 -Violent Ultimatum =50 -Violet Pall =25 -Viridescent Wisps =25 -Viridian Acolyte =25 -Viridian Joiner =25 -Viridian Longbow =45 -Viridian Lorebearers =49 -Viridian Scout =25 -Viridian Shaman =25 -Viridian Zealot =52 -Virtue's Ruin =110 -Virtuous Charge =100 -Virulent Sliver =36 -Visara the Dreadful =456 -Viscera Dragger =25 -Viscerid Armor =12 -Viscerid Deepwalker =17 -Viscerid Drone =24 -Viscid Lemures =17 -Viseling =25 -Vision Charm =36 -Vision Skeins =25 -Vital Surge =49 -Vitality Charm =25 -Vitalize =25 -Vitalizing Cascade =29 -Vitalizing Wind =100 -Vitaspore Thallid =25 -Vithian Renegades =48 -Vithian Stinger =25 -Vitu-Ghazi, the City-Tree =12 -Vivid Crag =94 -Vivid Creek =25 -Vivid Grove =25 -Vivid Marsh =20 -Vivid Meadow =50 -Vivify =4 -Vizzerdrix =25 -Vodalian Hypnotist =25 -Vodalian Illusionist =50 -Vodalian Knights =67 -Vodalian Mage =33 -Vodalian Merchant =25 -Vodalian Mystic =27 -Vodalian Serpent =25 -Vodalian Soldiers =25 -Vodalian War Machine =6 -Vodalian Zombie =25 -Voice of All =62 -Voice of Duty =25 -Voice of Grace =25 -Voice of Law =25 -Voice of Reason =36 -Voice of the Woods =84 -Voice of Truth =38 -Voices from the Void =27 -Void =32 -Void Maw =48 -Voidmage Apprentice =25 -Voidmage Husher =49 -Voidmage Prodigy =50 -Voidslime =128 -Voidstone Gargoyle =30 -Volcanic Awakening =25 -Volcanic Dragon =90 -Volcanic Eruption =43 -Volcanic Fallout =77 -Volcanic Geyser =8 -Volcanic Hammer =6 -Volcanic Island =3248 -Volcanic Spray =6 -Volcanic Submersion =25 -Volcanic Wind =6 -Volcano Hellion =62 -Volcano Imp =26 -Volley of Boulders =25 -Volrath's Curse =25 -Volrath's Dungeon =86 -Volrath's Gardens =49 -Volrath's Laboratory =75 -Volrath's Motion Sensor =25 -Volrath's Shapeshifter =146 -Volrath's Stronghold =851 -Voltaic Construct =99 -Voltaic Key =203 -Volunteer Militia =25 -Volunteer Reserves =25 -Voodoo Doll =25 -Voracious Cobra =52 -Voracious Dragon =49 -Voracious Hatchling =42 -Vorosh, the Hunter =74 -Vorrac Battlehorns =26 -Votary of the Conclave =25 -Voyager Staff =5 -Vug Lizard =50 -Vulshok Battlegear =43 -Vulshok Battlemaster =33 -Vulshok Berserker =50 -Vulshok Gauntlets =26 -Vulshok Morningstar =25 -Vulshok Sorcerer =25 -Vulshok War Boar =29 -Vulturous Zombie =103 -Wail of the Nim =25 -Waiting in the Weeds =36 -Wake of Destruction =49 -Wake of Vultures =25 -Wake Thrasher =295 -Wakestone Gargoyle =30 -Waking Nightmare =25 -Walk the Aeons =26 -Walker of Secret Ways =25 -Walker of the Grove =25 -Walking Archive =62 -Walking Dead =25 -Walking Desecration =50 -Walking Dream =25 -Walking Sponge =26 -Walking Wall =25 -Wall of Air =25 -Wall of Blood =99 -Wall of Blossoms =77 -Wall of Bone =25 -Wall of Brambles =24 -Wall of Caltrops =28 -Wall of Corpses =33 -Wall of Deceit =31 -Wall of Denial =143 -Wall of Diffusion =38 -Wall of Distortion =25 -Wall of Dust =28 -Wall of Earth =49 -Wall of Essence =36 -Wall of Faith =25 -Wall of Fire =6 -Wall of Frost =12 -Wall of Glare =46 -Wall of Heat =25 -Wall of Hope =56 -Wall of Ice =25 -Wall of Junk =25 -Wall of Kelp =48 -Wall of Lava =25 -Wall of Light =100 -Wall of Mulch =166 -Wall of Nets =74 -Wall of Opposition =49 -Wall of Pine Needles =25 -Wall of Putrid Flesh =145 -Wall of Razors =25 -Wall of Resistance =25 -Wall of Reverence =335 -Wall of Roots =15 -Wall of Shadows =35 -Wall of Shards =25 -Wall of Shields =25 -Wall of Souls =50 -Wall of Spears =25 -Wall of Stone =10 -Wall of Swords =12 -Wall of Tears =50 -Wall of Tombstones =69 -Wall of Vapor =14 -Wall of Vipers =25 -Wall of Water =25 -Wall of Wonder =6 -Wall of Wood =25 -Wallop =25 -Wand of Denial =25 -Wand of Ith =49 -Wand of the Elements =25 -Wanderbrine Rootcutters =25 -Wanderer's Twig =25 -Wanderguard Sentry =25 -Wandering Eye =25 -Wandering Goblins =20 -Wandering Graybeard =25 -Wandering Mage =25 -Wandering Ones =25 -Wandering Stream =25 -Wanderlust =5 -Wanderwine Hub =76 -Wanderwine Prophets =20 -Waning Wurm =50 -War Barge =25 -War Cadence =29 -War Chariot =25 -War Dance =99 -War Elemental =82 -War Elephant =33 -War Mammoth =25 -War Tax =48 -War-Spike Changeling =25 -War-Torch Goblin =25 -War's Toll =25 -Warbreak Trumpeter =99 -Ward of Bones =25 -Ward of Lights =25 -Ward of Piety =25 -Ward Sliver =17 -Wargate =25 -Warmonger =58 -Warmth =25 -Warp Artifact =25 -Warp World =25 -Warpath =27 -Warpath Ghoul =45 -Warped Devotion =7 -Warped Researcher =31 -Warping Wurm =74 -Warren Instigator =299 -Warren Pilferers =25 -Warren Weirding =29 -Warren-Scourge Elf =25 -Warrior Angel =49 -Warrior en-Kor =25 -Warrior's Charge =199 -Warrior's Honor =25 -Warrior's Oath =1300 -Warrior's Stand =99 -Warthog =25 -Wash Out =77 -Wasp Lancer =25 -Waste Away =17 -Wasteland =1820 -Watchdog =25 -Watcher Sliver =25 -Watchwing Scarecrow =25 -Watchwolf =79 -Water Elemental =19 -Water Gun Balloon Game =50 -Water Wurm =10 -Waterfront Bouncer =25 -Waterspout Djinn =98 -Waterspout Elemental =37 -Waterspout Weavers =25 -Waterveil Cavern =6 -Watery Grave =843 -Wave Elemental =25 -Wave of Indifference =25 -Wave of Reckoning =25 -Wave of Terror =33 -Waves of Aggression =25 -Waveskimmer Aven =25 -Wax/Wane =25 -Waxmane Baku =25 -Wayfarer's Bauble =31 -Wayfaring Giant =25 -Waylay =25 -Wayward Angel =192 -Wayward Soul =26 -Weakness =24 -Weakstone =109 -Wear Away =25 -Weathered Bodyguards =25 -Weathered Wayfarer =100 -Weatherseed Elf =25 -Weatherseed Faeries =25 -Weatherseed Totem =25 -Weatherseed Treefolk =91 -Weaver of Lies =25 -Web =25 -Web of Inertia =52 -Wee Dragonauts =25 -Weed Strangle =25 -Weed-Pruner Poplar =25 -Wei Ambush Force =100 -Wei Assassins =1000 -Wei Elite Companions =500 -Wei Infantry =100 -Wei Night Raiders =1010 -Wei Scout =100 -Wei Strike Force =100 -Weight of Conscience =17 -Weight of Spires =25 -Weird Harvest =25 -Weirding Shaman =52 -Welding Jar =32 -Welkin Guide =25 -Welkin Hawk =6 -Welkin Tern =100 -Well of Discovery =25 -Well of Knowledge =75 -Well of Life =28 -Well of Lost Dreams =125 -Well-Laid Plans =49 -Wellgabber Apothecary =25 -Wellspring =74 -Wellwisher =63 -Werebear =25 -Western Paladin =5 -Whalebone Glider =25 -Wheel and Deal =122 -Wheel of Fate =23 -Wheel of Fortune =523 -Wheel of Sun and Moon =152 -Wheel of Torture =25 -Where Ancients Tread =25 -Whetstone =6 -Whetwheel =25 -Whim of Volrath =93 -Whimwader =25 -Whip Sergeant =25 -Whip Silk =25 -Whip Vine =12 -Whip-Spine Drake =9 -Whipcorder =25 -Whipgrass Entangler =25 -Whipkeeper =25 -Whiplash Trap =29 -Whippoorwill =36 -Whipstitched Zombie =25 -Whiptail Moloch =55 -Whirling Catapult =49 -Whirling Dervish =6 -Whirlpool Drake =27 -Whirlpool Rider =25 -Whirlpool Warrior =35 -Whirlpool Whelm =25 -Whirlwind =54 -Whispering Shade =25 -Whispers of the Muse =25 -Whispersilk Cloak =42 -White Knight =18 -White Mana Battery =42 -White Scarab =49 -White Shield Crusader =25 -White Ward =23 -Whitemane Lion =25 -Who/What/When/Where/Why =75 -Wicked Akuba =25 -Wicked Pact =68 -Wicked Reward =25 -Wicker Warcrawler =6 -Wickerbough Elder =25 -Wielding the Green Dragon =100 -Wiitigo =99 -Wild Aesthir =12 -Wild Cantor =25 -Wild Colos =26 -Wild Dogs =36 -Wild Elephant =25 -Wild Griffin =30 -Wild Growth =25 -Wild Jhovall =25 -Wild Leotau =25 -Wild Mammoth =25 -Wild Might =25 -Wild Mongrel =26 -Wild Nacatl =38 -Wild Ox =250 -Wild Pair =53 -Wild Research =53 -Wild Ricochet =24 -Wild Swing =50 -Wild Wurm =49 -Wilderness Elemental =34 -Wilderness Hypnotist =25 -Wildfield Borderpost =154 -Wildfire =30 -Wildfire Emissary =25 -Wildsize =25 -Wildslayer Elves =68 -Will-o'-the-Wisp =153 -Willbender =25 -Willow Elf =37 -Willow Faerie =25 -Willow Priestess =58 -Willow Satyr =277 -Wilt-Leaf Cavaliers =86 -Wilt-Leaf Liege =350 -Wind Dancer =25 -Wind Drake =25 -Wind Shear =98 -Wind Spirit =20 -Windborn Muse =49 -Windborne Charge =71 -Windbrisk Heights =106 -Windbrisk Raptor =25 -Windfall =83 -Winding Canyons =130 -Winding Wurm =25 -Windreaper Falcon =25 -Windreaver =74 -Windrider Eel =25 -Winds of Change =13 -Winds of Rath =33 -Windscouter =25 -Windseeker Centaur =25 -Windstorm =21 -Windswept Heath =1272 -Windwright Mage =25 -Wine of Blood and Iron =25 -Wing Shards =33 -Wing Snare =5 -Wing Storm =25 -Wingbeat Warrior =25 -Winged Coatl =25 -Winged Sliver =39 -Wingrattle Scarecrow =17 -Wings of Aesthir =7 -Wings of Hope =25 -Wings of Velis Vel =25 -Winnow =25 -Winnower Patrol =25 -Winter Blast =26 -Winter Orb =138 -Winter Sky =48 -Winter's Chill =26 -Winter's Grasp =48 -Winter's Night =25 -Wintermoon Mesa =99 -Wipe Away =25 -Wipe Clean =26 -Wirecat =34 -Wirefly Hive =99 -Wirewood Channeler =25 -Wirewood Elf =25 -Wirewood Guardian =25 -Wirewood Herald =56 -Wirewood Hivemaster =54 -Wirewood Lodge =86 -Wirewood Pride =25 -Wirewood Savage =34 -Wirewood Symbiote =98 -Wishmonger =50 -Wispmare =25 -Wistful Selkie =25 -Wistful Thinking =56 -Wit's End =25 -Witch Engine =62 -Witch Hunter =33 -Witch-Maw Nephilim =25 -Witch's Mist =38 -Withdraw =25 -Withered Wretch =25 -Withering Boon =25 -Withering Gaze =25 -Withering Hex =25 -Withering Wisps =299 -Witherscale Wurm =27 -Withstand =25 -Wizard Mentor =25 -Wizard Replica =26 -Wizards' School =10 -Wizened Cenn =24 -Wizened Snitches =25 -Woebearer =12 -Woebringer Demon =24 -Woeleecher =25 -Wojek Apothecary =6 -Wojek Embermage =5 -Wojek Siren =6 -Wolf-Skull Shaman =25 -Wolfbriar Elemental =153 -Wonder =75 -Wood Elemental =99 -Wood Elves =6 -Wood Sage =53 -Woodcloaker =26 -Wooded Bastion =229 -Wooded Foothills =1232 -Wooden Sphere =26 -Woodfall Primus =81 -Woodland Changeling =25 -Woodland Druid =25 -Woodland Guidance =33 -Woodlurker Mimic =25 -Woodripper =5 -Woodwraith Corrupter =37 -Woodwraith Strangler =25 -Woolly Mammoths =25 -Woolly Razorback =48 -Woolly Spider =25 -Woolly Thoctar =42 -Word of Binding =15 -Word of Blasting =25 -Word of Command =2236 -Word of Seizing =29 -Word of Undoing =25 -Words of War =49 -Words of Waste =74 -Words of Wilding =99 -Words of Wind =99 -Words of Wisdom =25 -Words of Worship =106 -Workhorse =74 -World Queller =36 -World-Bottling Kit =199 -Worldgorger Dragon =118 -Worldheart Phoenix =31 -Worldly Counsel =20 -Worldly Tutor =135 -Worldpurge =31 -Worldslayer =55 -Worm Harvest =37 -Wormfang Behemoth =47 -Wormfang Crab =25 -Wormfang Drake =25 -Wormfang Manta =99 -Wormfang Newt =25 -Wormfang Turtle =25 -Worms of the Earth =50 -Wormwood Dryad =18 -Wormwood Treefolk =33 -Worn Powerstone =50 -Worry Beads =36 -Worship =126 -Wort, Boggart Auntie =42 -Wort, the Raidmother =25 -Worthy Cause =37 -Wound Reflection =46 -Wrap in Vigor =22 -Wrath of God =364 -Wrath of Marit Lage =25 -Wreak Havoc =5 -Wrecking Ball =25 -Wren's Run Packmaster =106 -Wren's Run Vanquisher =102 -Wrench Mind =25 -Wretched Anurid =25 -Wretched Banquet =25 -Writ of Passage =25 -Wu Admiral =99 -Wu Elite Cavalry =100 -Wu Infantry =100 -Wu Light Cavalry =100 -Wu Longbowman =100 -Wu Scout =100 -Wu Spy =99 -Wu Warship =100 -Wurm Token =114 -Wurm's Tooth =25 -Wurmcalling =29 -Wurmskin Forger =25 -Wurmweaver Coil =25 -Wydwen, the Biting Gale =25 -Wyluli Wolf =48 -Xanthic Statue =87 -Xantid Swarm =93 -Xathrid Demon =60 -Xenic Poltergeist =25 -Xiahou Dun, the One-Eyed =1742 -Xira Arien =99 -Xun Yu, Wei Advisor =33 -Yamabushi's Flame =12 -Yamabushi's Storm =25 -Yare =78 -Yavimaya Ancients =25 -Yavimaya Ants =21 -Yavimaya Barbarian =25 -Yavimaya Coast =158 -Yavimaya Dryad =5 -Yavimaya Elder =27 -Yavimaya Enchantress =4 -Yavimaya Gnats =34 -Yavimaya Granger =26 -Yavimaya Hollow =132 -Yavimaya Kavu =25 -Yavimaya Scion =26 -Yavimaya Wurm =6 -Yavimaya's Embrace =69 -Yawgmoth Demon =25 -Yawgmoth's Agenda =97 -Yawgmoth's Bargain =90 -Yawgmoth's Edict =25 -Yawgmoth's Will =806 -Yawning Fissure =25 -Ydwen Efreet =358 -Yellow Scarves Cavalry =100 -Yellow Scarves General =595 -Yellow Scarves Troops =100 -Yet Another AEther Vortex =99 -Yixlid Jailer =25 -Yoke of the Damned =25 -Yoked Plowbeast =25 -Yomiji, Who Bars the Way =25 -Yore-Tiller Nephilim =25 -Yosei, the Morning Star =298 -Yotian Soldier =5 -Young Wei Recruits =100 -Youthful Knight =25 -Yuan Shao, the Indecisive =695 -Yuki-Onna =29 -Yukora, the Prisoner =25 -Zanam Djinn =39 -Zap =25 -Zealot il-Vec =17 -Zealots en-Dal =20 -Zealous Guardian =25 -Zealous Inquisitor =37 -Zealous Persecution =28 -Zebra Unicorn =25 -Zektar Shrine Expedition =30 -Zelyon Sword =6 -Zendikar Farguide =56 -Zephid =86 -Zephid's Embrace =99 -Zephyr Falcon =25 -Zephyr Net =25 -Zephyr Spirit =25 -Zephyr Sprite =25 -Zerapa Minotaur =25 -Zhalfirin Commander =25 -Zhalfirin Crusader =98 -Zhalfirin Knight =25 -Zhang Fei, Fierce Warrior =2242 -Zhang He, Wei General =1000 -Zhang Liao, Hero of Hefei =169 -Zhao Zilong, Tiger General =750 -Zhou Yu, Chief Commander =430 -Zhuge Jin, Wu Strategist =142 -Zirilan of the Claw =91 -Zo-Zu the Punisher =25 -Zodiac Dog =56 -Zodiac Dragon =9900 -Zodiac Goat =100 -Zodiac Horse =99 -Zodiac Monkey =25 -Zodiac Ox =99 -Zodiac Pig =343 -Zodiac Rabbit =114 -Zodiac Rat =450 -Zodiac Rooster =100 -Zodiac Snake =38 -Zodiac Tiger =825 -Zoetic Cavern =47 -Zombie Assassin =25 -Zombie Boa =25 -Zombie Brute =36 -Zombie Cannibal =25 -Zombie Cutthroat =26 -Zombie Goliath =25 -Zombie Infestation =67 -Zombie Master =80 -Zombie Mob =25 -Zombie Musher =25 -Zombie Outlander =25 -Zombie Scavengers =25 -Zombie Token =105 -Zombie Trailblazer =99 -Zombify =30 -Zoologist =30 -Zuberi, Golden Feather =99 -Zuo Ci, the Mocking Sage =750 -Zur the Enchanter =125 -Zur's Weirding =25 -Zuran Enchanter =25 -Zuran Orb =40 diff --git a/res/quest/decks/Abraham Lincoln 3.dck b/res/quest/decks/Abraham Lincoln 3.dck deleted file mode 100644 index 68516d4f5c7..00000000000 --- a/res/quest/decks/Abraham Lincoln 3.dck +++ /dev/null @@ -1,46 +0,0 @@ -Abraham Lincoln 3 -[general] -constructed -[main] -4 Plateau -2 Flooded Strand -3 Arid Mesa -1 Island -1 Plains -1 Tundra -4 Volcanic Island -3 Scalding Tarn -1 Mox Ruby -1 Mox Sapphire -1 Mox Pearl -1 Radiant, Archangel -1 Sky Spirit -1 Talon Trooper -3 Skyknight Legionnaire -1 Archon of Redemption -1 Ryusei, the Falling Star -3 Lightning Angel -1 Serra Avenger -1 Tempest Drake -1 Firemane Angel -1 Niv-Mizzet, the Firemind -1 Azorius First-Wing -1 Zephyr Sprite -1 Flying Men -1 Esper Cormorants -1 Lantern Kami -1 Numot, the Devastator -1 Granite Gargoyle -1 Pride of the Clouds -1 Tremor -1 Lightning Helix -2 Earthquake -4 Flamebreak -1 Ancestral Recall -1 Concentrate -1 Swords to Plowshares -1 Time Walk -1 Gravitational Shift -1 Thunder Dragon -1 Volcanic Spray -[sideboard] diff --git a/res/quest/decks/Albert Einstein 2.dck b/res/quest/decks/Albert Einstein 2.dck deleted file mode 100644 index 77ca60018db..00000000000 --- a/res/quest/decks/Albert Einstein 2.dck +++ /dev/null @@ -1,28 +0,0 @@ -Albert Einstein 2 -[general] -constructed -[main] -1 Isamaru, Hound of Konda -2 Ancient Spider -3 Rib Cage Spider -1 Tromp the Domains -2 Charging Troll -9 Plains -2 Temple Garden -2 Retribution of the Meek -2 Savannah Lions -1 Garruk Wildspeaker -2 Watchwolf -2 Harmonize -9 Forest -3 Voice of Duty -2 Needle Storm -2 Steward of Valeron -2 Weathered Wayfarer -1 Regrowth -1 Mirri, Cat Warrior -4 Savannah -2 Warrior's Charge -2 Wilt-Leaf Cavaliers -3 Crib Swap -[sideboard] diff --git a/res/quest/decks/Albert Einstein 3.dck b/res/quest/decks/Albert Einstein 3.dck deleted file mode 100644 index 2a724d3b83d..00000000000 --- a/res/quest/decks/Albert Einstein 3.dck +++ /dev/null @@ -1,32 +0,0 @@ -Albert Einstein 3 -[general] -constructed -[main] -4 Savannah -4 Razorverge Thicket -4 Windswept Heath -4 Plains -5 Forest -1 Mox Pearl -1 Mox Emerald -2 Savannah Lions -1 Elite Vanguard -1 Isamaru, Hound of Konda -1 Weathered Wayfarer -1 Gaddock Teeg -1 Kataki, War's Wage -2 Accorder Paladin -4 Watchwolf -4 Kitchen Finks -4 Wilt-Leaf Cavaliers -1 Mirri, Cat Warrior -2 Garruk Wildspeaker -1 Master of the Wild Hunt -3 Mirran Crusader -1 Ancient Spider -1 Hero of Bladehold -1 Aura Shards -4 Retribution of the Meek -4 Swords to Plowshares -2 Needle Storm -[sideboard] diff --git a/res/quest/decks/Aquaman 1.dck b/res/quest/decks/Aquaman 1.dck deleted file mode 100644 index 9e01dff9d66..00000000000 --- a/res/quest/decks/Aquaman 1.dck +++ /dev/null @@ -1,44 +0,0 @@ -Aquaman 1 -[general] -constructed -[main] -1 Accorder Paladin -1 Caravan Escort -1 Cerulean Wyvern -1 Dromad Purebred -1 Elite Vanguard -1 Hada Spy Patrol -1 Ikiral Outrider -1 Jedit's Dragoons -1 Juggernaut -1 Kasimir the Lone Wolf -1 Kor Cartographer -1 Kor Hookmaster -1 Sejiri Merfolk -1 Skywatcher Adept -1 Snapping Drake -2 Soul's Attendant -1 Spiritual Guardian -1 Tobias Andrion -1 Vizzerdrix -1 Wall of Frost -1 Wall of Hope -1 Wild Griffin -1 Armored Ascension -1 Arrest -1 Condemn -1 Drake Umbra -1 Flayer Husk -1 Guard Duty -1 Inspired Charge -1 Into the Roil -1 Journey to Nowhere -1 Pitfall Trap -1 Shared Discovery -1 Unsummon -1 Warlord's Axe -1 Dread Statuary -11 Island -11 Plains -1 Sejiri Refuge -[sideboard] diff --git a/res/quest/decks/Aquaman 2.dck b/res/quest/decks/Aquaman 2.dck deleted file mode 100644 index b71c17868cf..00000000000 --- a/res/quest/decks/Aquaman 2.dck +++ /dev/null @@ -1,25 +0,0 @@ -Aquaman 2 -[general] -constructed -[main] -1 Mortarpod -1 Sword of Feast and Famine -2 Condemn -4 Wall of Omens -4 Squadron Hawk -4 Stoneforge Mystic -4 Counterspell -3 Remove Soul -1 Sun Titan -4 War Priest of Thune -2 Day of Judgment -4 Counsel of the Soratami -5 Island -5 Plains -1 Arid Mesa -4 Celestial Colonnade -2 Glacial Fortress -1 Scalding Tarn -4 Seachrome Coast -4 Tectonic Edge -[sideboard] diff --git a/res/quest/decks/Aquaman 3.dck b/res/quest/decks/Aquaman 3.dck deleted file mode 100644 index cc5a28d5dc9..00000000000 --- a/res/quest/decks/Aquaman 3.dck +++ /dev/null @@ -1,25 +0,0 @@ -Aquaman 3 -[general] -constructed -[main] -4 Baneslayer Angel -1 Linvala, Keeper of Silence -4 Squadron Hawk -4 Stoneforge Mystic -4 Absorb -1 Bribery -4 Counterspell -4 Day of Judgment -1 Jace Beleren -4 Repulse -1 Swords to Plowshares -2 Sword of Feast and Famine -1 Arid Mesa -4 Celestial Colonnade -2 Glacial Fortress -5 Island -5 Plains -1 Scalding Tarn -4 Seachrome Coast -4 Tectonic Edge -[sideboard] \ No newline at end of file diff --git a/res/quest/decks/Aragorn 2.dck b/res/quest/decks/Aragorn 2.dck deleted file mode 100644 index f0d309dd777..00000000000 --- a/res/quest/decks/Aragorn 2.dck +++ /dev/null @@ -1,40 +0,0 @@ -Aragorn 2 -[general] -constructed -[main] -1 Forest -2 Plains -1 Swamp -1 Mountain -3 Taiga -4 Bayou -4 Savannah -1 Scrubland -4 Undiscovered Paradise -1 Reflecting Pool -2 Forbidden Orchard -1 Thawing Glaciers -1 Hagra Crocodile -1 Adventuring Gear -2 Khalni Heart Expedition -1 Eternity Vessel -1 Bloodghast -1 Territorial Baloth -2 Plated Geopede -2 Hedron Rover -2 Steppe Lynx -1 Avenger of Zendikar -2 Emeria Angel -2 Ior Ruin Expedition -1 Ob Nixilis, the Fallen -1 Rampaging Baloths -1 Baloth Woodcrasher -2 Surrakar Marauder -2 Grazing Gladehart -2 Seer's Sundial -2 Fledgling Griffin -2 Vinelasher Kudzu -1 Dune-Brood Nephilim -1 Cosi's Ravager -1 Exploration -[sideboard] diff --git a/res/quest/decks/Atomic Robo 3.dck b/res/quest/decks/Atomic Robo 3.dck deleted file mode 100644 index 148630736c3..00000000000 --- a/res/quest/decks/Atomic Robo 3.dck +++ /dev/null @@ -1,24 +0,0 @@ -Atomic Robo 3 -[general] -constructed -[main] -4 Phyrexia's Core -4 Polluted Delta -4 Underground Sea -6 Island -1 Swamp -1 Mox Sapphire -1 Mox Jet -4 Thopter Foundry -4 Arcbound Ravager -4 Sword of the Meek -4 Ichor Wellspring -4 Mycosynth Wellspring -4 Junk Diver -4 Myr Retriever -4 Myr Sire -4 Skullclamp -1 Spine of Ish Sah -1 Scrapheap -1 Etherium Astrolabe -[sideboard] diff --git a/res/quest/decks/Bamm Bamm Rubble 1.dck b/res/quest/decks/Bamm Bamm Rubble 1.dck deleted file mode 100644 index e534724d201..00000000000 --- a/res/quest/decks/Bamm Bamm Rubble 1.dck +++ /dev/null @@ -1,34 +0,0 @@ -Bamm Bamm Rubble 1 -[general] -constructed -[main] -3 Forest -2 Island -2 Mountain -2 Plains -2 Swamp -2 Bad River -2 Flood Plain -3 Grasslands -3 Mountain Valley -2 Rocky Tar Pit -2 Tromp the Domains -1 Sejiri Merfolk -1 Hedge Troll -2 Might of Alara -2 Gaea's Might -3 Wandering Goblins -1 Kird Ape -4 Aven Trailblazer -3 Exotic Disease -3 Tribal Flames -1 Power Armor -3 Allied Strategies -1 Collective Restraint -1 Loam Lion -1 Sedge Troll -2 Wild Nacatl -1 Wandering Stream -4 Matca Rioters -1 Voices from the Void -[sideboard] diff --git a/res/quest/decks/Barney Rubble 1.dck b/res/quest/decks/Barney Rubble 1.dck deleted file mode 100644 index 32fb4d426c2..00000000000 --- a/res/quest/decks/Barney Rubble 1.dck +++ /dev/null @@ -1,41 +0,0 @@ -Barney Rubble 1 -[general] -constructed -[main] -4 Coastal Tower -4 Boreal Shelf -7 Island -7 Plains -1 Mnemonic Wall -1 Oona's Gatewarden -1 Wall of Air -1 Stinging Barrier -1 Minamo Scrollkeeper -1 Wall of Omens -1 Pride Guardian -1 Sunweb -1 Kaijin of the Vanishing Touch -1 Psychic Membrane -1 Glacial Wall -1 Angelic Wall -1 Razorgrass Screen -1 Guardians of Akrasa -1 Wall of Tears -1 Shimmering Barrier -1 Wall of Spears -1 Wall of Light -1 Wall of Denial -1 Necropolis -1 Serra's Embrace -1 Divine Transformation -1 Zephid's Embrace -1 Armadillo Cloak -4 Sovereigns of Lost Alara -2 Inspiration -3 Divination -1 Absorb -1 Hindering Light -1 Offering to Asha -1 Propaganda -1 Sacred Nectar -[sideboard] diff --git a/res/quest/decks/Barney Rubble 2.dck b/res/quest/decks/Barney Rubble 2.dck deleted file mode 100644 index 97920d13e34..00000000000 --- a/res/quest/decks/Barney Rubble 2.dck +++ /dev/null @@ -1,26 +0,0 @@ -Barney Rubble 2 -[general] -constructed -[main] -4 Ghostly Prison -1 Angelic Wall -1 Guardians of Akrasa -4 Sejiri Refuge -2 Mythic Proportions -4 Coastal Tower -4 Plains -2 Concentrate -1 Whispersilk Cloak -1 Stinging Barrier -4 Absorb -4 Island -4 Sovereigns of Lost Alara -4 Wall of Omens -1 Zephid's Embrace -1 Plumeveil -4 Tundra -3 Wall of Denial -3 Wall of Reverence -4 Propaganda -4 Perimeter Captain -[sideboard] diff --git a/res/quest/decks/Barney Rubble 3.dck b/res/quest/decks/Barney Rubble 3.dck deleted file mode 100644 index abbf6e60fe6..00000000000 --- a/res/quest/decks/Barney Rubble 3.dck +++ /dev/null @@ -1,25 +0,0 @@ -Barney Rubble 3 -[general] -constructed -[main] -4 Ghostly Prison -4 Sejiri Refuge -4 Coastal Tower -1 Mox Sapphire -3 Plains -1 Seashell Cameo -1 Whispersilk Cloak -4 Absorb -1 Mass Calcify -3 Island -1 Ancestral Recall -4 Sovereigns of Lost Alara -4 Wall of Omens -1 Mox Pearl -4 Tundra -4 Wall of Denial -4 Wall of Reverence -2 Eldrazi Conscription -4 Propaganda -4 Perimeter Captain -[sideboard] diff --git a/res/quest/decks/Bart Simpson 1.dck b/res/quest/decks/Bart Simpson 1.dck deleted file mode 100644 index f68501b4aae..00000000000 --- a/res/quest/decks/Bart Simpson 1.dck +++ /dev/null @@ -1,32 +0,0 @@ -Bart Simpson 1 -[general] -constructed -[main] -4 Forest -4 Island -4 Swamp -4 Verdant Catacombs -4 Misty Rainforest -4 Drowned Catacomb -1 Gnarled Mass -1 Scavenged Weaponry -2 Wanderbrine Rootcutters -2 Wall of Air -1 Somnomancer -2 Minister of Impediments -1 Grappler Spider -1 Flight -1 Moonglove Winnower -2 Rathi Trapper -1 Yavimaya Enchantress -3 Wall of Blossoms -1 Ambassador Oak -1 Simic Ragworm -1 Abomination -1 Theft of Dreams -3 Roots -3 Dehydration -3 Paralyzing Grasp -3 Glimmerdust Nap -2 Eternity Snare -[sideboard] diff --git a/res/quest/decks/Bart Simpson 2.dck b/res/quest/decks/Bart Simpson 2.dck deleted file mode 100644 index 7daba505e19..00000000000 --- a/res/quest/decks/Bart Simpson 2.dck +++ /dev/null @@ -1,36 +0,0 @@ -Bart Simpson 2 -[general] -constructed -[main] -4 Plains -4 Forest -3 Island -4 Tropical Island -4 Tundra -4 Savannah -1 Aura Gnarlid -1 Harrier Griffin -1 Alaborn Cavalier -1 Seasoned Marshal -1 Trained Armodon -1 Serra Angel -1 Messenger Falcons -1 Rhox War Monk -3 Minister of Impediments -1 Yavimaya Enchantress -1 White Knight -1 Moorish Cavalry -2 Wall of Blossoms -2 Squall Drifter -1 Master Decoy -1 Fruition -1 Theft of Dreams -1 Kismet -1 Roots -1 Mystic Restraints -1 Thirst -1 Entangling Vines -3 Dehydration -4 Glimmerdust Nap -4 Paralyzing Grasp -[sideboard] diff --git a/res/quest/decks/Bart Simpson 3.dck b/res/quest/decks/Bart Simpson 3.dck deleted file mode 100644 index 97fea667561..00000000000 --- a/res/quest/decks/Bart Simpson 3.dck +++ /dev/null @@ -1,39 +0,0 @@ -Bart Simpson 3 -[general] -constructed -[main] -2 Island -3 Plains -2 Forest -4 Tropical Island -4 Savannah -4 Tundra -1 Mox Emerald -1 Mox Pearl -1 Mox Sapphire -2 Harrier Griffin -1 Rhox War Monk -1 Yavimaya Enchantress -1 Seasoned Marshal -1 Alaborn Cavalier -1 Jenara, Asura of War -1 Flanking Troops -1 Watchwolf -1 Aura Gnarlid -1 Whipcorder -3 Minister of Impediments -1 Squall Drifter -1 Stormscape Apprentice -1 Thornscape Apprentice -1 Ancestral Recall -1 Time Walk -1 Theft of Dreams -1 Kismet -1 Frozen AEther -3 Mystic Restraints -1 Thirst -4 Paralyzing Grasp -3 Entangling Vines -1 Dehydration -4 Glimmerdust Nap -[sideboard] diff --git a/res/quest/decks/Batman 3.dck b/res/quest/decks/Batman 3.dck deleted file mode 100644 index f25f60c90b0..00000000000 --- a/res/quest/decks/Batman 3.dck +++ /dev/null @@ -1,23 +0,0 @@ -Batman 3 -[general] -constructed -[main] -4 Wooded Foothills -4 Arid Mesa -4 Stomping Ground -4 Taiga -4 Valakut, the Molten Pinnacle -6 Mountain -2 Forest -1 Mox Emerald -1 Mox Ruby -4 Primeval Titan -4 Cultivate -4 Wood Elves -4 Khalni Heart Expedition -4 Bloodbraid Elf -3 Tarmogoyf -1 Avenger of Zendikar -2 Life from the Loam -4 Prismatic Omen -[sideboard] diff --git a/res/quest/decks/Bela Lugosi 3.dck b/res/quest/decks/Bela Lugosi 3.dck deleted file mode 100644 index 854f3762cd3..00000000000 --- a/res/quest/decks/Bela Lugosi 3.dck +++ /dev/null @@ -1,17 +0,0 @@ -Bela Lugosi 3 -[general] -constructed -[main] -4 Vampire Nocturnus -3 Anowon, the Ruin Sage -4 Malakir Bloodwitch -2 Child of Night -22 Swamp -1 Mox Jet -4 Vampire Nighthawk -4 Bloodghast -4 Ruthless Cullblade -4 Guul Draz Vampire -4 Guul Draz Assassin -4 Go for the Throat -[sideboard] diff --git a/res/quest/decks/Betty Rubble 3.dck b/res/quest/decks/Betty Rubble 3.dck deleted file mode 100644 index 11756c3cc34..00000000000 --- a/res/quest/decks/Betty Rubble 3.dck +++ /dev/null @@ -1,28 +0,0 @@ -Betty Rubble 3 -[general] -constructed -[main] -4 Birds of Paradise -4 Nest Invader -3 Brood Birthing -1 Mob Justice -3 Awakening Zone -3 Growth Spasm -4 Kozilek's Predator -4 Broodwarden -1 Dread Drone -1 Emrakul's Hatcher -2 Doubling Season -1 Essence Feed -1 Rapacious One -4 Hand of Emrakul -1 Mox Emerald -1 Mox Jet -1 Mox Ruby -4 Forest -3 Mountain -2 Swamp -4 Badlands -4 Bayou -4 Taiga -[sideboard] diff --git a/res/quest/decks/Blackbeard 3.dck b/res/quest/decks/Blackbeard 3.dck deleted file mode 100644 index 6dc904a9fa3..00000000000 --- a/res/quest/decks/Blackbeard 3.dck +++ /dev/null @@ -1,28 +0,0 @@ -Blackbeard 3 -[general] -constructed -[main] -18 Plains -1 Daru Encampment -1 Mox Pearl -2 Tithe -4 Preeminent Captain -4 Veteran Armorsmith -3 Ballyrush Banneret -3 Veteran Swordsmith -3 Daru Warchief -3 Field Marshal -2 Captain of the Watch -2 Ranger of Eos -1 Aven Brigadier -1 Rhox Pikemaster -1 Veteran Armorer -1 Aven Riftwatcher -1 Soltari Foot Soldier -1 Raise the Alarm -1 Mobilization -1 Elspeth, Knight-Errant -4 Path to Exile -1 Conqueror's Pledge -1 Martial Coup -[sideboard] diff --git a/res/quest/decks/Boba Fett 3.dck b/res/quest/decks/Boba Fett 3.dck deleted file mode 100644 index 4ecc69e2243..00000000000 --- a/res/quest/decks/Boba Fett 3.dck +++ /dev/null @@ -1,37 +0,0 @@ -Boba Fett 3 -[general] -constructed -[main] -3 Plateau -3 Wooded Foothills -3 Druid of the Anima -3 Taiga -3 Windswept Heath -2 Dragonmaster Outcast -1 Mox Emerald -1 Rith, the Awakener -2 Lightning Dragon -1 Jugan, the Rising Star -1 Brimstone Dragon -1 Cultivate -2 Sarkhan Vol -1 Mox Pearl -1 Ryusei, the Falling Star -2 Volcanic Dragon -2 Savannah -2 Dragon Broodmother -2 Hunted Dragon -4 Jungle Shrine -4 Lightning Helix -1 Plains -1 Palladia-Mors -1 Dragon Roost -1 Forest -2 Crucible of Fire -1 Mox Ruby -1 Viashivan Dragon -4 Dragonspeaker Shaman -1 Imperial Hellkite -2 Rorix Bladewing -1 Mountain -[sideboard] diff --git a/res/quest/decks/Boris Karloff 3.dck b/res/quest/decks/Boris Karloff 3.dck deleted file mode 100644 index 252555ac518..00000000000 --- a/res/quest/decks/Boris Karloff 3.dck +++ /dev/null @@ -1,26 +0,0 @@ -Boris Karloff 3 -[general] -constructed -[main] -4 Teetering Peaks -2 Sacred Foundry -4 Plateau -4 Arid Mesa -4 Scalding Tarn -4 Marsh Flats -2 Plains -1 Mountain -4 Goblin Guide -2 Plated Geopede -4 Steppe Lynx -4 Flame Slash -4 Hellspark Elemental -4 Path to Exile -4 Lightning Bolt -3 Ranger of Eos -3 Stoneforge Mystic -3 Journey to Nowhere -1 Sword of Fire and Ice -1 Sword of Feast and Famine -1 Sword of Body and Mind -[sideboard] diff --git a/res/quest/decks/Boromir 2.dck b/res/quest/decks/Boromir 2.dck deleted file mode 100644 index a7d7c8d515c..00000000000 --- a/res/quest/decks/Boromir 2.dck +++ /dev/null @@ -1,27 +0,0 @@ -Boromir 2 -[general] -constructed -[main] -22 Forest -4 Elvish Piper -4 Quicksilver Amulet -4 Harmonize -4 Rampant Growth -2 Wall of Blossoms -2 Vine Trellis -2 Elvish Visionary -1 Carven Caryatid -1 Wistful Selkie -1 Naturalize -3 Nourish -1 Benthic Behemoth -1 Body of Jukai -1 Godsire -1 Goliath Spider -1 Scaled Wurm -1 Skeletal Wurm -1 Symbiotic Wurm -1 Teeka's Dragon -1 Zodiac Dragon -1 Tidal Kraken -[sideboard] diff --git a/res/quest/decks/Boromir 3.dck b/res/quest/decks/Boromir 3.dck deleted file mode 100644 index 67c3e17bd1d..00000000000 --- a/res/quest/decks/Boromir 3.dck +++ /dev/null @@ -1,28 +0,0 @@ -Boromir 3 -[general] -constructed -[main] -21 Forest -1 Mox Emerald -4 Elvish Piper -4 Quicksilver Amulet -4 Harmonize -4 Rampant Growth -4 Wall of Blossoms -3 Elvish Visionary -1 Dramatic Entrance -1 Naturalize -1 Nourish -1 Defense of the Heart -1 Natural Order -1 It That Betrays -1 Ulamog, the Infinite Gyre -1 Kozilek, Butcher of Truth -1 Progenitus -1 Darksteel Colossus -1 Angel of Despair -1 Hellkite Overlord -1 Inkwell Leviathan -1 Akroma, Angel of Wrath -1 Sphinx of the Steel Wind -[sideboard] diff --git a/res/quest/decks/Boromir 4.dck b/res/quest/decks/Boromir 4.dck deleted file mode 100644 index c297162406f..00000000000 --- a/res/quest/decks/Boromir 4.dck +++ /dev/null @@ -1,29 +0,0 @@ -Boromir 4 -[general] -constructed -[main] -4 Misty Rainforest -4 Tropical Island -3 Polluted Delta -3 Scalding Tarn -3 Flooded Strand -1 Forest -1 Island -1 Mox Jet -1 Mox Emerald -1 Mox Pearl -1 Mox Ruby -1 Mox Sapphire -1 Ancestral Recall -1 Time Walk -4 Show and Tell -4 Dramatic Entrance -4 Defense of the Heart -4 Personal Tutor -4 Emrakul, the Aeons Torn -4 Progenitus -2 Ulamog, the Infinite Gyre -2 Blightsteel Colossus -4 Echoing Truth -2 Spell Snare -[sideboard] diff --git a/res/quest/decks/Buffy 1.dck b/res/quest/decks/Buffy 1.dck deleted file mode 100644 index 0d18b14f944..00000000000 --- a/res/quest/decks/Buffy 1.dck +++ /dev/null @@ -1,43 +0,0 @@ -Buffy 1 -[general] -constructed -[main] -1 Blind Creeper|5DN -1 Skulking Knight|TSP -1 Withered Wretch|TSB -1 Grixis Slavedriver|CFX -1 Undead Warchief|TSB -1 Smokespew Invoker|LGN -19 Swamp|MBS -1 Null Champion|ROE -1 Grave Defiler|APC -1 Wretched Anurid|ONS -1 Grasp of Darkness|SOM -4 Verdant Catacombs|ZEN -1 Unholy Grotto|ONS -1 Spined Basher|ONS -1 Legions of Lim-Dul|ICE -1 Stromgald Crusader|CSP -1 Dreg Reaver|ALA -1 Dross Crocodile|10E -1 Cackling Fiend|USG -1 Rank and File|ULG -1 Festering Goblin|10E -1 Nested Ghoul|MBS -1 Infectious Horror|CFX -1 Anurid Murkdiver|ONS -1 Mass of Ghouls|10E -1 Aphetto Vulture|ONS -1 Cadaverous Knight|MIR -1 Tresserhorn Skyknight|CSP -1 Waning Wurm|PLC -2 Cruel Revival|ONS -1 Feeding Frenzy|ONS -1 Spineless Thug|10E -1 Phyrexian Bloodstock|PLS -1 Infernal Caretaker|LGN -1 Vengeful Dead|SCG -1 Bog Raiders|M11 -1 Creakwood Ghoul|EVE -1 Cyclopean Mummy|LEG -[sideboard] diff --git a/res/quest/decks/Buffy 2.dck b/res/quest/decks/Buffy 2.dck deleted file mode 100644 index 4c01a7a50bb..00000000000 --- a/res/quest/decks/Buffy 2.dck +++ /dev/null @@ -1,42 +0,0 @@ -Buffy 2 -[general] -constructed -[main] -1 Skulking Knight|TSP -1 Withered Wretch|TSB -1 Grixis Slavedriver|CFX -1 Undead Warchief|TSB -1 Cemetery Reaper|M10 -1 Smokespew Invoker|LGN -19 Swamp|MBS -2 Zombie Master|6ED -2 Null Champion|ROE -1 Wretched Anurid|ONS -1 Tendrils of Corruption|M10 -1 Grasp of Darkness|SOM -4 Verdant Catacombs|ZEN -1 Unholy Grotto|ONS -1 Spined Basher|ONS -1 Noxious Ghoul|LGN -1 Stromgald Crusader|CSP -1 Dreg Reaver|ALA -1 Dross Crocodile|10E -1 Nefashu|SCG -2 Festering Goblin|10E -1 Anurid Murkdiver|ONS -1 Nested Ghoul|MBS -1 Infectious Horror|CFX -1 Mass of Ghouls|10E -1 Aphetto Vulture|ONS -1 Grave Pact|10E -1 Cadaverous Knight|MIR -2 Cruel Revival|ONS -1 Feeding Frenzy|ONS -1 Spineless Thug|10E -1 Call to the Grave|SCG -1 Lim-Dul the Necromancer|TSP -1 Lord of the Undead|PLS -1 Vengeful Dead|SCG -1 Grave Defiler|APC -1 Soulless One|ONS -[sideboard] diff --git a/res/quest/decks/Buffy 3.dck b/res/quest/decks/Buffy 3.dck deleted file mode 100644 index 24159d0d475..00000000000 --- a/res/quest/decks/Buffy 3.dck +++ /dev/null @@ -1,24 +0,0 @@ -Buffy 3 -[general] -constructed -[main] -1 Unholy Grotto|ONS -1 Graveborn Muse|10E -1 Bad Moon|TSB -2 Stromgald Crusader|CSP -3 Undead Warchief|TSB -1 Festering Goblin|10E -3 Sarcomancy|TMP -3 Cemetery Reaper|M10 -3 Grave Titan|M11 -1 Grave Pact|10E -19 Swamp|MBS -4 Death Baron|ALA -3 Grave Defiler|APC -3 Cruel Revival|ONS -1 Feeding Frenzy|ONS -3 Tendrils of Corruption|M10 -3 Grasp of Darkness|SOM -4 Verdant Catacombs|ZEN -1 Lord of the Undead|PLS -[sideboard] diff --git a/res/quest/decks/C3PO 1.dck b/res/quest/decks/C3PO 1.dck deleted file mode 100644 index 50eeb980f06..00000000000 --- a/res/quest/decks/C3PO 1.dck +++ /dev/null @@ -1,48 +0,0 @@ -C3PO 1 -[general] -constructed -[main] -10 Mountain -6 Swamp -4 Blood Crypt -1 Mad Auntie -1 Frogtosser Banneret -1 Goblin Ringleader -1 Knucklebone Witch -1 Sensation Gorger -1 Goblin General -1 Goblin King -1 Goblin Marshal -1 Goblin Matron -1 Reckless One -1 Mogg War Marshal -1 Mogg Fanatic -1 Goblin Deathraiders -1 Prickly Boggart -1 Exiled Boggart -1 Akki Raider -1 Akki Underling -1 Bloodmark Mentor -1 Boggart Harbinger -1 Boros Recruit -1 Crazed Goblin -1 Dragon Fodder -1 Goblin Cavaliers -1 Lavafume Invoker -1 Goblin Balloon Brigade -1 Goblin Berserker -1 Goblin Brigand -1 Goblin Bully -1 Goblin Chariot -1 Goblin Glider -1 Marsh Goblins -1 Goblin Medics -1 Goblin Mountaineer -1 Goblin Mutant -1 Goblin Outlander -1 Goblin Patrol -1 Goblin Piker -1 Goblin Raider -1 Boggart Birth Rite -1 Tarfire -[sideboard] diff --git a/res/quest/decks/C3PO 2.dck b/res/quest/decks/C3PO 2.dck deleted file mode 100644 index 900c9e08883..00000000000 --- a/res/quest/decks/C3PO 2.dck +++ /dev/null @@ -1,39 +0,0 @@ -C3PO 2 -[general] -constructed -[main] -8 Mountain -4 Swamp -4 Badlands -4 Blood Crypt -1 Goblin Burrows -1 Wort, Boggart Auntie -4 Mad Auntie -3 Frogtosser Banneret -3 Goblin Ringleader -3 Knucklebone Witch -1 Goblin Lackey -1 Sensation Gorger -1 Goblin Chieftain -1 Goblin General -1 Goblin King -1 Goblin Marshal -1 Goblin Matron -1 Goblin Piledriver -1 Goblin Warchief -1 Reckless One -1 Siege-Gang Commander -1 Mogg War Marshal -1 Goblin Guide -1 Mogg Fanatic -1 Goblin Deathraiders -1 Boggart Harbinger -1 Prickly Boggart -1 Kiki-Jiki, Mirror Breaker -1 Squee, Goblin Nabob -1 Mudbutton Torchrunner -1 Path of Anger's Flame -1 Boggart Birth Rite -2 Tarfire -1 Goblin Grenade -[sideboard] diff --git a/res/quest/decks/C3PO 3.dck b/res/quest/decks/C3PO 3.dck deleted file mode 100644 index a8977e8c355..00000000000 --- a/res/quest/decks/C3PO 3.dck +++ /dev/null @@ -1,37 +0,0 @@ -C3PO 3 -[general] -constructed -[main] -6 Mountain -4 Swamp -4 Badlands -4 Blood Crypt -1 Mox Ruby -1 Mox Jet -1 Wort, Boggart Auntie -4 Mad Auntie -3 Frogtosser Banneret -3 Goblin Ringleader -3 Knucklebone Witch -3 Goblin Lackey -1 Sensation Gorger -1 Goblin Chieftain -1 Goblin King -1 Goblin Piledriver -1 Goblin Warchief -1 Reckless One -1 Siege-Gang Commander -1 Warren Instigator -1 Mogg War Marshal -1 Goblin Guide -1 Goblin Arsonist -1 Goblin Deathraiders -1 Prickly Boggart -1 Kiki-Jiki, Mirror Breaker -1 Squee, Goblin Nabob -1 Mudbutton Torchrunner -1 Murderous Redcap -4 Lightning Bolt -1 Goblin Grenade -1 Patriarch's Bidding -[sideboard] diff --git a/res/quest/decks/Captain America 2.dck b/res/quest/decks/Captain America 2.dck deleted file mode 100644 index fde00a3ad05..00000000000 --- a/res/quest/decks/Captain America 2.dck +++ /dev/null @@ -1,37 +0,0 @@ -Captain America 2 -[general] -constructed -[main] -1 Island|2ED -4 Seaside Citadel|ALA -3 Jhessian Infiltrator|ALA -1 Swords to Plowshares|4ED -1 Hindering Light|ALA -1 Rafiq of the Many|ALA -1 Plains|4ED -2 Hallowed Fountain|DIS -2 Tundra|3ED -1 Island|LRW -1 Forest|2ED -3 Oust|ROE -2 Savannah|3ED -2 Akrasan Squire|ALA -1 Plains|POR -1 Arcane Sanctum|ALA -4 Sigil Blessing|ALA -3 Knight of the Skyward Eye|ALA -1 Plains|MBS -1 Plains|ALA -2 Rhox War Monk|ALA -1 Battlegrace Angel|ALA -2 Sigiled Paladin|ALA -4 Bant Panorama|ALA -1 Swords to Plowshares|LEA -3 Deft Duelist|ALA -1 Excommunicate|M11 -2 Excommunicate|M10 -1 Excommunicate|ALA -4 Steward of Valeron|ALA -1 Forest|4ED -2 Ranger of Eos|ALA -[sideboard] \ No newline at end of file diff --git a/res/quest/decks/Captain America 3.dck b/res/quest/decks/Captain America 3.dck deleted file mode 100644 index 096398a5fe2..00000000000 --- a/res/quest/decks/Captain America 3.dck +++ /dev/null @@ -1,36 +0,0 @@ -Captain America 3 -[general] -constructed -[main] -4 Seaside Citadel|ALA -2 Dueling Grounds|INV -1 Triclopean Sight|LRW -3 Rafiq of the Many|ALA -3 Tropical Island|3ED -1 Swords to Plowshares|LEB -1 Island|9ED -1 Forest|USG -1 Plains|ICE -1 Tundra|3ED -3 Sigil of the Nayan Gods|ARB -2 Qasali Pridemage|ARB -4 Knotvine Paladin|ARB -1 Terramorphic Expanse|TSP -2 Sovereigns of Lost Alara|ARB -3 Savannah|3ED -1 Swords to Plowshares|ICE -4 Grizzled Leotau|ARB -2 Terramorphic Expanse|M11 -1 Forest|S99 -1 Epic Proportions|LRW -1 Plains|MRD -1 Terramorphic Expanse|10E -1 Forest|10E -1 Swords to Plowshares|2ED -4 Stoic Angel|ALA -4 Noble Hierarch|CFX -1 Battlegrace Angel|ALA -1 Swords to Plowshares|LEA -3 Finest Hour|ARB -1 Plains|LEB -[sideboard] \ No newline at end of file diff --git a/res/quest/decks/Catwoman 1.dck b/res/quest/decks/Catwoman 1.dck deleted file mode 100644 index 4735e1d7ef2..00000000000 --- a/res/quest/decks/Catwoman 1.dck +++ /dev/null @@ -1,24 +0,0 @@ -Catwoman 1 -[general] -constructed -[main] -4 Elite Cat Warrior -4 Kjeldoran War Cry -3 Jungle Lion -4 Temple Garden -6 Plains -3 Commune with Nature -3 Savannah Lions -2 Unyaro Bee Sting -4 Penumbra Bobcat -6 Forest -4 Horned Cheetah -2 Marble Diamond -4 King Cheetah -1 Regrowth -1 Jedit Ojanen of Efrava -1 Mirri, Cat Warrior -2 Sunlance -4 Razorverge Thicket -2 Moss Diamond -[sideboard] diff --git a/res/quest/decks/Catwoman 2.dck b/res/quest/decks/Catwoman 2.dck deleted file mode 100644 index 03286e14013..00000000000 --- a/res/quest/decks/Catwoman 2.dck +++ /dev/null @@ -1,28 +0,0 @@ -Catwoman 2 -[general] -constructed -[main] -4 Plateau -4 Taiga -2 Elite Cat Warrior -4 Kjeldoran War Cry -4 Lightning Helix -3 Plains -3 Savannah Lions -3 Commune with Nature -4 Penumbra Bobcat -3 Forest -2 Canyon Wildcat -4 Horned Cheetah -2 Obelisk of Naya -1 Marble Diamond -2 King Cheetah -1 Regrowth -1 Jedit Ojanen of Efrava -1 Mirri, Cat Warrior -2 Raging Cougar -4 Savannah -1 Moss Diamond -3 Wild Nacatl -2 Mountain -[sideboard] diff --git a/res/quest/decks/Cave Troll 3.dck b/res/quest/decks/Cave Troll 3.dck deleted file mode 100644 index 32a2a213b01..00000000000 --- a/res/quest/decks/Cave Troll 3.dck +++ /dev/null @@ -1,22 +0,0 @@ -[metadata] -Name=Cave Troll 3 -Deck Type=constructed -[main] -2 Chainer's Edict|TOR -2 Go for the Throat|MBS -3 Ravenous Rats|10E -3 Null Brooch|EXO -4 Nyxathid|CFX -2 Executioner's Capsule|ALA -4 Quicksand|WWK -1 Liliana Vess|M11 -3 The Rack|TSB -3 Guul Draz Specter|ZEN -19 Swamp|MBS -3 Bottomless Pit|STH -2 Hymn to Tourach|FEM -2 Inquisition of Kozilek|ROE -2 Grasp of Darkness|SOM -2 Cunning Lethemancer|ALA -3 Quest for the Nihil Stone|WWK -[sideboard] diff --git a/res/quest/decks/Comic Book Guy 3.dck b/res/quest/decks/Comic Book Guy 3.dck deleted file mode 100644 index 23c644c3435..00000000000 --- a/res/quest/decks/Comic Book Guy 3.dck +++ /dev/null @@ -1,22 +0,0 @@ -Comic Book Guy 3 -[general] -constructed -[main] -4 Sacred Foundry -4 Plateau -3 Lightning Helix -7 Plains -4 Rukh Egg -4 Flamebreak -3 Auriok Champion -4 Silver Knight -3 Lightning Bolt -1 Mox Ruby -1 Mox Pearl -4 Roc Egg -2 Feudkiller's Verdict -2 Earthquake -4 Skyknight Legionnaire -3 Kor Firewalker -7 Mountain -[sideboard] diff --git a/res/quest/decks/Crocodile Dundee 1.dck b/res/quest/decks/Crocodile Dundee 1.dck deleted file mode 100644 index 6ae9ed0d1d1..00000000000 --- a/res/quest/decks/Crocodile Dundee 1.dck +++ /dev/null @@ -1,27 +0,0 @@ -Crocodile Dundee 1 -[general] -constructed -[main] -22 Mountain -3 Bloodmark Mentor -3 Cinder Pyromancer -4 Mudbrawler Cohort -1 Rockslide Ambush -1 Spitting Earth -3 Seismic Strike -1 Spire Barrage -1 Blood Knight -2 Slith Firewalker -2 Pyre Charger -1 Feral Lightning -1 Ball Lightning -1 Blistering Firecat -3 Eternal Flame -1 Tenza, Godo's Maul -1 Goblin Charbelcher -2 Oxidda Golem -2 AErathi Berserker -1 Flowstone Overseer -2 Frost Giant -2 Giant Strength -[sideboard] diff --git a/res/quest/decks/Crocodile Dundee 2.dck b/res/quest/decks/Crocodile Dundee 2.dck deleted file mode 100644 index 063aa71a8ba..00000000000 --- a/res/quest/decks/Crocodile Dundee 2.dck +++ /dev/null @@ -1,34 +0,0 @@ -Crocodile Dundee 2 -[general] -constructed -[main] -22 Mountain -1 Ruby Medallion -3 Bloodmark Mentor -3 Cinder Pyromancer -3 Mudbrawler Cohort -1 Rockslide Ambush -1 Spitting Earth -1 Seismic Strike -1 Spire Barrage -1 Flame Javelin -1 Blood Knight -1 Kargan Dragonlord -1 Slith Firewalker -1 Pyre Charger -1 Feral Lightning -1 Ball Lightning -1 Blistering Firecat -1 Kiki-Jiki, Mirror Breaker -1 Rorix Bladewing -4 Tarox Bladewing -1 Eternal Flame -1 Tenza, Godo's Maul -1 Oxidda Golem -1 AErathi Berserker -1 Frost Giant -1 Giant Strength -2 Heartlash Cinder -1 Lightning Cloud -1 Outrage Shaman -[sideboard] diff --git a/res/quest/decks/Crocodile Dundee 3.dck b/res/quest/decks/Crocodile Dundee 3.dck deleted file mode 100644 index f6a1003e469..00000000000 --- a/res/quest/decks/Crocodile Dundee 3.dck +++ /dev/null @@ -1,25 +0,0 @@ -Crocodile Dundee 3 -[general] -constructed -[main] -21 Mountain -1 Mox Ruby -1 Ruby Medallion -3 Bloodmark Mentor -2 Cinder Pyromancer -2 Mudbrawler Cohort -2 Rockslide Ambush -2 Spitting Earth -3 Spire Barrage -3 Flame Javelin -2 Blood Knight -4 Kargan Dragonlord -1 Slith Firewalker -1 Pyre Charger -1 Feral Lightning -4 Ball Lightning -1 Blistering Firecat -1 Kiki-Jiki, Mirror Breaker -1 Rorix Bladewing -4 Tarox Bladewing -[sideboard] diff --git a/res/quest/decks/Cyclops 2.dck b/res/quest/decks/Cyclops 2.dck deleted file mode 100644 index 434485ddef0..00000000000 --- a/res/quest/decks/Cyclops 2.dck +++ /dev/null @@ -1,177 +0,0 @@ -Cyclops 2 -[general] -constructed -[main] -4 Darkheart Sliver|PLC -4 Watery Grave|RAV -4 Akoum Refuge|ZEN -1 Underground Sea|2ED -4 Obelisk of Bant|ALA -2 Urborg Volcano|8ED -4 Pinecrest Ridge|CHK -1 Bayou|2ED -1 Tundra|LEB -4 Reflecting Pool|TMP -1 Tundra|LEA -4 Tranquil Garden|CHK -2 Tundra|3ED -4 Watcher Sliver|TSP -1 Elfhame Palace|8ED -4 Obelisk of Esper|ALA -4 Kazandu Refuge|ZEN -3 Spined Sliver|TSB -4 Bloodstone Cameo|INV -4 Graypelt Refuge|ZEN -4 Synchronous Sliver|PLC -4 Talon Sliver|TMP -4 Crumbling Necropolis|ALA -4 Dromar's Cavern|PLS -4 Shadow Sliver|TSP -2 Underground Sea|3ED -4 Troll-Horn Cameo|INV -4 Spitting Sliver|PLC -1 Scrubland|3ED -3 Coastal Tower|INV -4 Heart Sliver|TMP -4 Razorverge Thicket|SOM -4 Seashell Cameo|INV -4 Treva's Ruins|PLS -4 Cinder Marsh|TMP -1 Coat of Arms|EXO -1 Tropical Island|2ED -1 Scrubland|2ED -4 Drake-Skull Cameo|INV -4 Battering Sliver|PLC -1 Plateau|LEA -1 Plateau|LEB -1 Bayou|3ED -4 Veinfire Borderpost|ARB -1 Volcanic Island|3ED -2 Plateau|2ED -4 Darkslick Shores|SOM -3 Shivan Oasis|8ED -4 Jwar Isle Refuge|ZEN -4 Ancient Amphitheater|LRW -1 Badlands|2ED -1 Coastal Tower|8ED -4 Breeding Pool|DIS -4 Darksteel Ingot|DST -4 Venser's Sliver|TSP -4 Mogg Hollows|TMP -4 Plated Sliver|LGN -2 Savannah|3ED -4 Stirring Wildwood|WWK -4 Rith's Grove|PLS -4 Sliver Legion|FUT -4 Auntie's Hovel|LRW -4 Muscle Sliver|TMP -4 Jungle Shrine|ALA -4 Virulent Sliver|FUT -2 Tropical Island|LEB -4 Sacred Foundry|RAV -4 Horned Sliver|TMP -4 Fieldmist Borderpost|ARB -4 Crystalline Sliver|STH -4 Seachrome Coast|SOM -4 Vampiric Sliver|TSP -4 Lantern-Lit Graveyard|CHK -4 Obelisk of Grixis|ALA -4 Telekinetic Sliver|TSP -4 Salt Marsh|8ED -4 Firewild Borderpost|ARB -4 Spinneret Sliver|TSP -3 Sunpetal Grove|M10 -2 Dragonskull Summit|M11 -4 Crosis's Catacombs|PLS -1 Sunpetal Grove|M11 -4 Thalakos Lowlands|TMP -4 Grove of the Burnwillows|FUT -2 Dragonskull Summit|M10 -4 Steam Vents|GPT -4 Lymph Sliver|FUT -4 Bonesplitter Sliver|TSP -4 Spectral Sliver|LGN -4 Gemhide Sliver|TSP -4 Blood Crypt|DIS -4 Sinew Sliver|PLC -4 Victual Sliver|STH -1 Coat of Arms|9ED -4 Wanderwine Hub|LRW -4 Obelisk of Naya|ALA -1 Scrubland|LEA -1 Badlands|LEA -1 Scrubland|LEB -4 Raging Ravine|WWK -4 Darigaaz's Caldera|PLS -1 Spined Sliver|STH -1 Bayou|LEB -1 Bayou|LEA -1 Essence Sliver|LGN -4 Sliver Overlord|SCG -4 Rootwater Depths|TMP -2 Coat of Arms|7ED -1 Badlands|LEB -4 Venser's Journal|SOM -4 Barbed Sliver|TMP -2 Urborg Volcano|INV -4 Cloudcrest Lake|CHK -4 Metallic Sliver|TMP -4 Celestial Colonnade|WWK -4 Waterveil Cavern|CHK -2 Savannah|LEA -4 Arcane Sanctum|ALA -3 Taiga|LEB -4 Mistvein Borderpost|ARB -4 Winged Sliver|TMP -4 Obelisk of Jund|ALA -4 Magma Sliver|LGN -4 Savage Lands|ALA -4 Fungus Sliver|TSP -4 Godless Shrine|GPT -1 Volcanic Island|2ED -4 Lavaclaw Reaches|WWK -4 Quick Sliver|LGN -4 Seaside Citadel|ALA -4 Armor Sliver|TMP -4 Root Sliver|LGN -4 Clot Sliver|TMP -4 Blackcleave Cliffs|SOM -4 Necrotic Sliver|PLC -4 Fury Sliver|TSP -4 Overgrown Tomb|RAV -3 Elfhame Palace|INV -4 Stomping Ground|GPT -1 Tropical Island|3ED -4 Blade Sliver|LGN -4 Tigereye Cameo|INV -4 Reflex Sliver|PLC -3 Essence Sliver|TSB -4 Crypt Sliver|LGN -4 Psionic Sliver|TSP -4 Hallowed Fountain|DIS -1 Shivan Oasis|INV -1 Badlands|3ED -2 Volcanic Island|LEB -4 Might Sliver|TSP -3 Drowned Catacomb|M10 -4 Aluren|TMP -4 Acidic Sliver|STH -1 Drowned Catacomb|M11 -4 Toxin Sliver|LGN -3 Glacial Fortress|M10 -1 Glacial Fortress|M11 -4 Creeping Tar Pit|WWK -4 Rootbound Crag|M11 -4 Copperline Gorge|SOM -4 Sidewinder Sliver|TSP -4 Wildfield Borderpost|ARB -1 Taiga|3ED -4 Secluded Glen|LRW -4 Sliver Queen|STH -4 Sejiri Refuge|ZEN -4 Temple Garden|RAV -4 Poultice Sliver|PLC -1 Underground Sea|LEA -4 Brood Sliver|LGN -4 Synapse Sliver|LGN -[sideboard] diff --git a/res/quest/decks/Cyclops 3.dck b/res/quest/decks/Cyclops 3.dck deleted file mode 100644 index 0e2bb1f828f..00000000000 --- a/res/quest/decks/Cyclops 3.dck +++ /dev/null @@ -1,47 +0,0 @@ -Cyclops 3 -[general] -constructed -[main] -1 Underground Sea -1 Plateau -2 Taiga -1 Tundra -2 Bayou -2 Savannah -4 Wooded Foothills -4 Misty Rainforest -1 Windswept Heath -1 Mox Pearl -1 Mox Emerald -1 Mox Jet -1 Mox Ruby -1 Mox Sapphire -1 Muscle Sliver -1 Horned Sliver -1 Ancestral Recall -1 Blade Sliver -1 Watcher Sliver -1 Breath of Life -1 Naturalize -1 Fury Sliver -1 Heart Sliver -3 Metallic Sliver -3 Concentrate -1 Synchronous Sliver -2 Winged Sliver -1 Plated Sliver -1 Might Sliver -1 Darksteel Ingot -1 Battering Sliver -4 Gemhide Sliver -1 Bonesplitter Sliver -1 Sinew Sliver -1 Essence Sliver -1 Reflex Sliver -1 Brood Sliver -1 Clot Sliver -1 Crystalline Sliver -1 Lymph Sliver -1 Sidewinder Sliver -1 Sliver Legion -[sideboard] diff --git a/res/quest/decks/Da Vinci 1.dck b/res/quest/decks/Da Vinci 1.dck deleted file mode 100644 index fb07c29e3eb..00000000000 --- a/res/quest/decks/Da Vinci 1.dck +++ /dev/null @@ -1,37 +0,0 @@ -Da Vinci 1 -[general] -constructed -[main] -22 Swamp -4 Ashenmoor Cohort -1 Bad Moon -3 Corrosive Mentor -3 Crowd of Cinders -1 Corrupt -1 Intimidation -1 Mind Sludge -1 Nightmare -1 Tendrils of Corruption -1 Black Knight -1 Dauthi Slayer -1 Death Stroke -1 Enfeeblement -1 Hand of Cruelty -1 Distress -1 Nantuko Shade -1 Nether Traitor -1 Sign in Blood -1 Hideous End -1 Nocturnal Raid -1 Vicious Hunger -1 Cosmic Horror -1 Cruel Bargain -1 Ihsan's Shade -1 Underworld Dreams -1 Distress -1 Devour in Shadow -1 Dunerider Outlaw -1 Fear -1 Fog of Gnats -1 Foul Imp -[sideboard] diff --git a/res/quest/decks/Da Vinci 2.dck b/res/quest/decks/Da Vinci 2.dck deleted file mode 100644 index 24a2db17429..00000000000 --- a/res/quest/decks/Da Vinci 2.dck +++ /dev/null @@ -1,37 +0,0 @@ -Da Vinci 2 -[general] -constructed -[main] -22 Swamp -1 Jet Medallion -1 Ascendant Evincar -2 Ashenmoor Cohort -2 Bad Moon -2 Corrosive Mentor -2 Crowd of Cinders -1 Hellfire -1 Corrupt -1 Intimidation -4 Korlash, Heir to Blackblade -1 Mind Sludge -1 Nightmare -1 Tendrils of Corruption -1 Halo Hunter -1 Helldozer -1 Visara the Dreadful -1 Black Knight -1 Dauthi Slayer -1 Death Stroke -1 Enfeeblement -1 Hand of Cruelty -1 Distress -1 Nether Traitor -1 Sign in Blood -1 Gatekeeper of Malakir -1 Nocturnal Raid -1 Vicious Hunger -1 Cosmic Horror -1 Ihsan's Shade -1 Underworld Dreams -1 Dunerider Outlaw -[sideboard] diff --git a/res/quest/decks/Da Vinci 3.dck b/res/quest/decks/Da Vinci 3.dck deleted file mode 100644 index e7b6ee4744f..00000000000 --- a/res/quest/decks/Da Vinci 3.dck +++ /dev/null @@ -1,35 +0,0 @@ -Da Vinci 3 -[general] -constructed -[main] -19 Swamp -1 Mox Jet -4 Polluted Delta -4 Korlash, Heir to Blackblade -1 Ascendant Evincar -2 Bad Moon -2 Corrosive Mentor -1 Hellfire -2 Corrupt -2 Phyrexian Obliterator -1 Mind Sludge -1 Nightmare -1 Tendrils of Corruption -1 Halo Hunter -1 Massacre Wurm -1 Visara the Dreadful -2 Black Knight -1 Gatekeeper of Malakir -1 Dauthi Slayer -1 Death Stroke -1 Grasp of Darkness -1 Hand of Cruelty -2 Hymn to Tourach -1 Nantuko Shade -1 Nether Traitor -1 Sinkhole -1 Lashwrithe -1 Geth's Verdict -1 Wrench Mind -1 Dunerider Outlaw -[sideboard] diff --git a/res/quest/decks/Darrin Stephens 1.dck b/res/quest/decks/Darrin Stephens 1.dck deleted file mode 100644 index 700dbdf2a4a..00000000000 --- a/res/quest/decks/Darrin Stephens 1.dck +++ /dev/null @@ -1,39 +0,0 @@ -Darrin Stephens 1 -[general] -constructed -[main] -3 Thoughtcast -1 Scepter of Insight -1 Horrible Hordes -1 Trinket Mage -2 Frogmite -1 Ancient Den -2 Thirst for Knowledge -3 Somber Hoverguard -4 Seat of the Synod -10 Island -1 Magnetic Flux -1 Assert Authority -1 Vault of Whispers -1 Cloudheath Drake -2 Silver Myr -1 AEther Spellbomb -1 Vedalken Archmage -4 Darksteel Citadel -1 Arcbound Stinger -1 Myr Enforcer -1 Chrome Steed -1 Steelclad Serpent -3 Etherium Sculptor -1 Qumulox -1 Stonework Puma -1 Great Furnace -3 Arcbound Worker -1 Tree of Tales -1 Snapsail Glider -1 Courier's Capsule -1 Cumber Stone -1 Faerie Mechanist -1 Spined Thopter -1 Neurok Familiar -[sideboard] diff --git a/res/quest/decks/Darrin Stephens 2.dck b/res/quest/decks/Darrin Stephens 2.dck deleted file mode 100644 index cb55ed332cc..00000000000 --- a/res/quest/decks/Darrin Stephens 2.dck +++ /dev/null @@ -1,31 +0,0 @@ -Darrin Stephens 2 -[general] -constructed -[main] -4 Thoughtcast -1 Ethersworn Adjudicator -1 Scepter of Insight -1 Tezzeret the Seeker -4 Master of Etherium -1 Trinket Mage -4 Frogmite -1 Ancient Den -2 Thirst for Knowledge -3 Somber Hoverguard -1 Broodstar -10 Island -4 Seat of the Synod -1 Magnetic Flux -1 Assert Authority -1 Vault of Whispers -1 Silver Myr -1 AEther Spellbomb -1 Vedalken Archmage -4 Darksteel Citadel -4 Myr Enforcer -4 Etherium Sculptor -2 Qumulox -1 Great Furnace -1 Tree of Tales -3 Arcbound Worker -[sideboard] diff --git a/res/quest/decks/Darrin Stephens 3.dck b/res/quest/decks/Darrin Stephens 3.dck deleted file mode 100644 index 7b6da45c5f3..00000000000 --- a/res/quest/decks/Darrin Stephens 3.dck +++ /dev/null @@ -1,32 +0,0 @@ -Darrin Stephens 3 -[general] -constructed -[main] -1 Ethersworn Adjudicator -4 Thoughtcast -1 Tezzeret the Seeker -1 Mox Emerald -4 Master of Etherium -4 Frogmite -1 Tinker -1 Darksteel Colossus -2 Somber Hoverguard -1 Broodstar -9 Island -4 Seat of the Synod -1 Ancestral Recall -1 Mox Pearl -1 Mox Jet -1 Mox Sapphire -1 AEther Spellbomb -1 Timetwister -1 Mox Ruby -1 Vedalken Archmage -4 Darksteel Citadel -4 Myr Enforcer -4 Etherium Sculptor -1 Qumulox -1 Time Walk -1 Bone Saw -4 Arcbound Worker -[sideboard] diff --git a/res/quest/decks/Darrin Stephens 4.dck b/res/quest/decks/Darrin Stephens 4.dck deleted file mode 100644 index 44464a10777..00000000000 --- a/res/quest/decks/Darrin Stephens 4.dck +++ /dev/null @@ -1,29 +0,0 @@ -Darrin Stephens 4 -[general] -constructed -[main] -5 Island -4 Seat of the Synod -4 Darksteel Citadel -1 Mox Pearl -1 Mox Jet -1 Mox Sapphire -1 Mox Ruby -1 Mox Emerald -4 Mox Opal -1 Ancestral Recall -1 Time Walk -1 Timetwister -1 Tinker -1 Blightsteel Colossus -1 Ethersworn Adjudicator -4 Myr Enforcer -2 Etherium Sculptor -4 Arcbound Worker -4 Master of Etherium -4 Frogmite -4 Thoughtcast -4 Ornithopter -4 Memnite -2 Etched Champion -[sideboard] diff --git a/res/quest/decks/Darth Vader 3.dck b/res/quest/decks/Darth Vader 3.dck deleted file mode 100644 index 800546d758e..00000000000 --- a/res/quest/decks/Darth Vader 3.dck +++ /dev/null @@ -1,78 +0,0 @@ -Darth Vader 3 -[general] -constructed -[main] -31 Island -31 Plains -4 Tundra -4 Arcane Sanctum -4 Coastal Tower -4 Glacial Fortress -4 Sejiri Refuge -4 Boreal Shelf -4 Celestial Colonnade -1 Library of Alexandria -1 Mikokoro, Center of the Sea -4 Man-o'-War -4 Aven Riftwatcher -4 Peacekeeper -4 Magus of the Moat -4 Wall of Reverence -4 Wall of Denial -4 Wall of Omens -4 Plumeveil -4 Perimeter Captain -3 Stalwart Shield-Bearers -4 Windborn Muse -4 Soul Warden -4 Sower of Temptation -2 Grand Arbiter Augustin IV -2 Gwafa Hazid, Profiteer -2 Commander Eesha -1 Soul's Attendant -1 Intrepid Hero -1 Mulldrifter -1 Hanna, Ship's Navigator -1 Serra Angel -1 Thieving Magpie -1 Arcanis the Omnipotent -1 Mawcor -1 Keiga, the Tide Star -1 Prodigal Sorcerer -1 Isamaru, Hound of Konda -1 Riptide Crab -1 Auriok Champion -1 Kozilek, Butcher of Truth -1 Ulamog, the Infinite Gyre -2 Elspeth, Knight-Errant -2 Ajani Goldmane -4 Wrath of God -4 Day of Judgment -4 Hallowed Burial -4 Retribution of the Meek -4 Winds of Rath -4 Planar Cleansing -4 Akroma's Vengeance -4 Purify -4 Evacuation -4 Upheaval -3 Inundate -4 Time Reversal -4 Crib Swap -4 Swords to Plowshares -4 Invincible Hymn -4 Bribery -4 Concentrate -3 Absorb -2 Repulse -2 Kiss of the Amesha -1 Reduce to Dreams -1 Resurrection -1 Timetwister -1 Ancestral Recall -1 Time Walk -4 Idyllic Tutor -4 Academy Rector -4 Enlightened Tutor -4 Battle of Wits -[sideboard] diff --git a/res/quest/decks/Data 3.dck b/res/quest/decks/Data 3.dck deleted file mode 100644 index 64d4a491bd3..00000000000 --- a/res/quest/decks/Data 3.dck +++ /dev/null @@ -1,27 +0,0 @@ -Data 3 -[general] -constructed -[main] -1 Tethered Griffin -3 Quag Vampires -4 Marsh Threader -3 Stern Judge -2 Blistergrub -1 Mesa Enchantress -4 Crusading Knight -1 Bog Wraith -1 Moor Fiend -2 Celestial Ancient -1 Bog Tatters -1 Fountain Watch -3 Evil Presence -4 Contaminated Ground -3 Tainted Well -2 Karma -1 Mox Jet -1 Mox Pearl -11 Plains -4 Vault of Whispers -3 Arcane Sanctum -4 Dromar's Cavern -[sideboard] diff --git a/res/quest/decks/Deadpool 2.dck b/res/quest/decks/Deadpool 2.dck deleted file mode 100644 index 600e6dd8501..00000000000 --- a/res/quest/decks/Deadpool 2.dck +++ /dev/null @@ -1,26 +0,0 @@ -Deadpool 2 -[general] -constructed -[main] -2 Vicious Kavu -2 Ashenmoor Gouger -2 Sootwalkers -2 Ashenmoor Liege -2 Blazing Specter -2 Demigod of Revenge -2 Pyre Zombie -2 Emberstrike Duo -2 Grixis Grimblade -2 Gobhobbler Rats -2 Shivan Zombie -2 Goblin Deathraiders -2 Shambling Remains -2 Fulminator Mage -2 Fists of the Demigod -2 Terminate -4 Scar -4 Blackcleave Cliffs -4 Dragonskull Summit -8 Mountain -8 Swamp -[sideboard] \ No newline at end of file diff --git a/res/quest/decks/Deadpool 3.dck b/res/quest/decks/Deadpool 3.dck deleted file mode 100644 index d80e37565aa..00000000000 --- a/res/quest/decks/Deadpool 3.dck +++ /dev/null @@ -1,20 +0,0 @@ -Deadpool 3 -[general] -constructed -[main] -4 Ashenmoor Gouger -4 Ashenmoor Liege -4 Demigod of Revenge -4 Emberstrike Duo -4 Grixis Grimblade -4 Jund Hackblade -4 Shambling Remains -1 Defiler of Souls -3 Fists of the Demigod -4 Terminate -4 Blackcleave Cliffs -4 Dragonskull Summit -4 Lavaclaw Reaches -6 Mountain -6 Swamp -[sideboard] diff --git a/res/quest/decks/Demon 3.dck b/res/quest/decks/Demon 3.dck deleted file mode 100644 index a09db35c9de..00000000000 --- a/res/quest/decks/Demon 3.dck +++ /dev/null @@ -1,21 +0,0 @@ -Demon 3 -[general] -constructed -[main] -1 Go for the Throat|MBS -1 Loxodon Warhammer|10E -4 Demon's Jester|DIS -4 Daggerclaw Imp|GPT -16 Swamp|MBS -1 Doom Blade|M11 -1 Sign in Blood|M10 -4 Halo Hunter|ZEN -1 Terror|10E -3 Demon's Horn|M11 -4 Grinning Demon|ONS -4 Bojuka Bog|WWK -4 Foul Imp|9ED -4 Bog Imp|9ED -4 Verdant Catacombs|ZEN -4 Mark of the Oni|BOK -[sideboard] diff --git a/res/quest/decks/Dilbert 3.dck b/res/quest/decks/Dilbert 3.dck deleted file mode 100644 index d18a85b3a39..00000000000 --- a/res/quest/decks/Dilbert 3.dck +++ /dev/null @@ -1,28 +0,0 @@ -Dilbert 3 -[general] -constructed -[main] -3 Spark Elemental -2 Deathgreeter -3 Quest for the Gravelord -3 Hellspark Elemental -2 Kavu Lair -3 Smoke -3 Ball Lightning -3 Groundbreaker -2 Mighty Emergence -4 Blistering Firecat -4 Lightning Serpent -3 Blitz Hellion -1 Stonebrow, Krosan Hero -1 Mox Emerald -1 Mox Jet -1 Mox Ruby -4 Badlands -4 Bayou -4 Taiga -3 Darigaaz's Caldera -2 Rootbound Crag -3 Savage Lands -1 Raging Ravine -[sideboard] diff --git a/res/quest/decks/Dino 2.dck b/res/quest/decks/Dino 2.dck deleted file mode 100644 index 4a49594ce63..00000000000 --- a/res/quest/decks/Dino 2.dck +++ /dev/null @@ -1,33 +0,0 @@ -Dino 2 -[general] -constructed -[main] -1 Steel Wall -1 Mycosynth Golem -4 Frogmite -4 Ancient Den -1 Tanglebloom -1 Defense Grid -3 Seat of the Synod -1 Bonesplitter -1 Ornithopter -1 Tooth of Chiss-Goria -3 Vault of Whispers -1 Scale of Chiss-Goria -3 Metallic Sliver -1 Arcbound Slith -1 Shield Sphere -1 Alpha Myr -4 Darksteel Citadel -1 Arcbound Stinger -4 Lodestone Golem -4 Myr Enforcer -1 Phyrexian Walker -3 Great Furnace -2 Skullclamp -3 Tree of Tales -4 Arcbound Worker -1 Tablet of Epityr -1 Brass Gnat -1 Steel Overseer -[sideboard] diff --git a/res/quest/decks/Dino 3.dck b/res/quest/decks/Dino 3.dck deleted file mode 100644 index 4f7cedc31ab..00000000000 --- a/res/quest/decks/Dino 3.dck +++ /dev/null @@ -1,33 +0,0 @@ -Dino 3 -[general] -constructed -[main] -1 Mox Emerald -1 Mycosynth Golem -4 Frogmite -3 Ancient Den -1 Defense Grid -2 Seat of the Synod -2 Bonesplitter -4 Ornithopter -1 Mox Pearl -2 Vault of Whispers -1 Mox Jet -1 Arcbound Slith -3 Metallic Sliver -1 Mox Sapphire -1 Shield Sphere -1 All Is Dust -1 Mox Ruby -4 Darksteel Citadel -1 Arcbound Stinger -4 Lodestone Golem -4 Myr Enforcer -2 Phyrexian Walker -2 Great Furnace -2 Bone Saw -4 Arcbound Worker -4 Skullclamp -2 Tree of Tales -1 Arcbound Crusher -[sideboard] diff --git a/res/quest/decks/Doc Holiday 1.dck b/res/quest/decks/Doc Holiday 1.dck deleted file mode 100644 index 98c10f51039..00000000000 --- a/res/quest/decks/Doc Holiday 1.dck +++ /dev/null @@ -1,38 +0,0 @@ -Doc Holiday 1 -[general] -constructed -[main] -3 Aphetto Runecaster -3 Aven Farseer -1 Primal Whisperer -2 Reviving Dose -1 Guided Strike -4 Seaside Citadel -4 Plains -4 Island -4 Forest -4 Coastal Tower -4 Elfhame Palace -2 Obelisk of Bant -4 Crystallization -1 Branchsnap Lorian -1 Hystrodon -1 Ascending Aven -4 Scornful Egotist -1 Defender of the Order -1 Echo Tracer -1 Liege of the Axe -1 Nantuko Vigilante -1 Wingbeat Warrior -1 Root Elemental -1 Crude Rampart -1 Daru Lancer -1 Daru Mender -1 Disruptive Pitmage -1 Fledgling Mawcor -1 Foothill Guide -1 Gravel Slinger -1 Riptide Biologist -1 Riptide Pilferer -1 Whip-Spine Drake -[sideboard] diff --git a/res/quest/decks/Doc Holiday 2.dck b/res/quest/decks/Doc Holiday 2.dck deleted file mode 100644 index 87b9dfa5a52..00000000000 --- a/res/quest/decks/Doc Holiday 2.dck +++ /dev/null @@ -1,32 +0,0 @@ -Doc Holiday 2 -[general] -constructed -[main] -3 Bant Sureblade -2 Giltspire Avenger -1 Jenara, Asura of War -1 Knight of New Alara -1 Murkfiend Liege -1 Rhox War Monk -1 Stoic Angel -1 Treva, the Renewer -2 Trygon Predator -4 Messenger Falcons -4 Sunscape Familiar -1 Ragnar -1 Angus Mackenzie -1 Storm Spirit -4 Crystallization -3 Temporal Spring -1 Kiss of the Amesha -1 Daring Leap -1 Hindering Light -1 AEther Mutation -1 Captured Sunlight -5 Forest -5 Island -5 Plains -2 Razorverge Thicket -3 Seachrome Coast -4 Seaside Citadel -[sideboard] diff --git a/res/quest/decks/Doc Holiday 3.dck b/res/quest/decks/Doc Holiday 3.dck deleted file mode 100644 index eff1a5bf934..00000000000 --- a/res/quest/decks/Doc Holiday 3.dck +++ /dev/null @@ -1,22 +0,0 @@ -Doc Holiday 3 -[general] -constructed -[main] -4 Bant Sureblade -4 Giltspire Avenger -2 Jenara, Asura of War -3 Knight of New Alara -4 Murkfiend Liege -4 Rhox War Monk -4 Stoic Angel -1 Treva, the Renewer -2 Trygon Predator -4 Crystallization -4 Temporal Spring -4 Forest -4 Island -4 Plains -4 Razorverge Thicket -4 Seachrome Coast -4 Seaside Citadel -[sideboard] diff --git a/res/quest/decks/Doran 3.dck b/res/quest/decks/Doran 3.dck deleted file mode 100644 index 9daab97affb..00000000000 --- a/res/quest/decks/Doran 3.dck +++ /dev/null @@ -1,36 +0,0 @@ -Doran 3 -[general] -constructed -[main] -1 Swamp -1 Forest -1 Plains -3 Bayou -3 Scrubland -3 Savannah -3 Graypelt Refuge -2 Verdant Catacombs -2 Marsh Flats -1 Mox Emerald -1 Mox Jet -1 Mox Pearl -4 Doran, the Siege Tower -4 Time of Need -2 Primal Rage -2 Putrefy -2 Mortify -2 Vindicate -2 Maelstrom Pulse -4 Retribution of the Meek -1 Cultivate -2 Ancient Spider -1 Border Patrol -1 Caravan Hurda -1 Dromad Purebred -3 Grizzled Leotau -3 Indomitable Ancients -1 Kami of Old Stone -1 Sapling of Colfenor -1 Sporecap Spider -1 Tormented Angel -[sideboard] diff --git a/res/quest/decks/Dr No 3.dck b/res/quest/decks/Dr No 3.dck deleted file mode 100644 index 8d137bdc981..00000000000 --- a/res/quest/decks/Dr No 3.dck +++ /dev/null @@ -1,28 +0,0 @@ -Dr No 3 -[general] -constructed -[main] -4 Underground Sea -2 Megrim -1 Mox Sapphire -4 Wall of Air -3 The Rack -2 Swamp -4 Hymn to Tourach -4 Drowned Catacomb -2 Distress -1 Enlightened Tutor -2 Glacial Fortress -4 Scrubland -2 Duress -1 Mox Pearl -4 Tundra -2 Mind Twist -4 Coercion -2 Ostracize -1 Mox Jet -2 Thoughtseize -1 Balance -4 Gerrard's Verdict -4 Propaganda -[sideboard] diff --git a/res/quest/decks/Dr Strangelove 3.dck b/res/quest/decks/Dr Strangelove 3.dck deleted file mode 100644 index f5970922103..00000000000 --- a/res/quest/decks/Dr Strangelove 3.dck +++ /dev/null @@ -1,17 +0,0 @@ -Dr Strangelove 3 -[general] -constructed -[main] -4 Sanity Grinding|EVE -4 Counterspell|7ED -4 Glen Elendra Liege|SHM -4 Ghastlord of Fugue|SHM -4 Plumeveil|SHM -4 Misty Rainforest|ZEN -4 Wistful Selkie|EVE -4 Scalding Tarn|ZEN -4 Overbeing of Myth|EVE -4 Dominus of Fealty|EVE -4 Wasp Lancer|SHM -16 Island|MBS -[sideboard] diff --git a/res/quest/decks/Electro 2.dck b/res/quest/decks/Electro 2.dck deleted file mode 100644 index 27f1975575d..00000000000 --- a/res/quest/decks/Electro 2.dck +++ /dev/null @@ -1,43 +0,0 @@ -Electro 2 -[general] -constructed -[main] -1 Lightning Bolt|M11 -2 Mountain|MBS -2 Drumhunter|ALA -1 Rumbling Slum|GPT -1 Journey to Nowhere|ZEN -2 Plateau|3ED -2 Druid of the Anima|ALA -1 Mycoid Shepherd|ARB -1 Mosstodon|ALA -2 Stomping Ground|GPT -1 Fires of Yavimaya|INV -1 Cliffrunner Behemoth|CFX -2 Mighty Emergence|ALA -1 Leyline of Vitality|M11 -1 Rakeclaw Gargantuan|ALA -1 Oust|ROE -2 Forest|MBS -1 Spellbreaker Behemoth|ARB -2 Savannah|3ED -4 Jungle Shrine|ALA -1 Relic Crush|ZEN -2 Sacred Foundry|RAV -2 Exuberant Firestoker|ALA -1 Kranioceros|CFX -2 Taiga|3ED -2 Where Ancients Tread|ALA -2 Lightning Helix|RAV -2 Plains|MBS -1 Kavu Lair|INV -1 Enlisted Wurm|ARB -1 Incurable Ogre|ALA -1 Rith, the Awakener|INV -2 Temple Garden|RAV -1 Reborn Hope|ARB -2 Sunseed Nurturer|ALA -2 Rampant Growth|M10 -2 Woolly Thoctar|ALA -2 Reflecting Pool|SHM -[sideboard] diff --git a/res/quest/decks/Electro 3.dck b/res/quest/decks/Electro 3.dck deleted file mode 100644 index 08df095fd16..00000000000 --- a/res/quest/decks/Electro 3.dck +++ /dev/null @@ -1,36 +0,0 @@ -Electro 3 -[general] -constructed -[main] -4 Jungle Shrine -3 Plateau -3 Taiga -3 Savannah -3 Arid Mesa -3 Wooded Foothills -3 Windswept Heath -1 Mox Emerald -1 Mox Ruby -1 Mox Pearl -1 Thornscape Familiar -1 Druid of the Anima -1 Drumhunter -2 Exuberant Firestoker -1 Kavu Lair -1 Mayael the Anima -1 Mighty Emergence -2 Sunseed Nurturer -2 Paleoloth -1 Where Ancients Tread -2 Mycoid Shepherd -1 Vagrant Plowbeasts -1 Blistering Barrier -1 Meglonoth -4 Woolly Thoctar -2 Cliffrunner Behemoth -1 Hunted Lammasu -1 Rumbling Slum -4 Lightning Helix -4 Swords to Plowshares -1 Mayael's Aria -[sideboard] diff --git a/res/quest/decks/Elrond 1.dck b/res/quest/decks/Elrond 1.dck deleted file mode 100644 index bf6d808adb8..00000000000 --- a/res/quest/decks/Elrond 1.dck +++ /dev/null @@ -1,40 +0,0 @@ -Elrond 1 -[general] -constructed -[main] -2 Plains -2 Forest -4 Elfhame Palace -4 Graypelt Refuge -4 Arctic Flats -3 Razorverge Thicket -4 Sunpetal Grove -3 Aura Gnarlid -4 Rabid Wombat -2 Kor Spiritdancer -2 Gatherer of Graces -1 Gate Hound -2 Skyrider Trainee -1 Drove of Elves -2 Totem-Guide Hartebeest -1 Taoist Hermit -1 Silhana Ledgewalker -1 Slippery Bogle -1 Sacred Wolf -1 Zuo Ci, the Mocking Sage -1 Ancestral Mask -1 Fencer's Magemark -1 Beastmaster's Magemark -1 Guardian's Magemark -1 Brilliant Halo -1 Divine Transformation -1 Dryad's Favor -1 Gift of the Woods -1 Holy Strength -1 Lance -1 Lifelink -1 Predatory Hunger -1 Primal Frenzy -1 Ritual of Steel -1 Seeker -[sideboard] diff --git a/res/quest/decks/Elrond 2.dck b/res/quest/decks/Elrond 2.dck deleted file mode 100644 index 4a9eb54b610..00000000000 --- a/res/quest/decks/Elrond 2.dck +++ /dev/null @@ -1,45 +0,0 @@ -Elrond 2 -[general] -constructed -[main] -1 Plains -1 Forest -1 Elfhame Palace -4 Savannah -4 Graypelt Refuge -1 Arctic Flats -2 Windswept Heath -4 Jungle Shrine -2 Taiga -2 Plateau -1 Heroes' Reunion -1 Winds of Rath -3 Aura Gnarlid -3 Rabid Wombat -2 Kor Spiritdancer -2 Gatherer of Graces -1 Uril, the Miststalker -1 Gate Hound -1 Skyrider Trainee -1 Thran Golem -1 Drove of Elves -1 Totem-Guide Hartebeest -1 Troll Ascetic -1 Silhana Ledgewalker -1 Slippery Bogle -1 Sacred Wolf -1 Zuo Ci, the Mocking Sage -1 Ancestral Mask -1 Fencer's Magemark -1 Brilliant Halo -2 Rancor -1 Treetop Bracers -1 Unquestioned Authority -1 Tiger Claws -1 Asha's Favor -1 Nimbus Wings -1 Hero's Resolve -1 Battle Mastery -1 Serra's Embrace -2 Armadillo Cloak -[sideboard] diff --git a/res/quest/decks/Elrond 3.dck b/res/quest/decks/Elrond 3.dck deleted file mode 100644 index a28effe1023..00000000000 --- a/res/quest/decks/Elrond 3.dck +++ /dev/null @@ -1,35 +0,0 @@ -Elrond 3 -[general] -constructed -[main] -1 Plains -1 Forest -4 Savannah -4 Graypelt Refuge -4 Windswept Heath -4 Jungle Shrine -1 Taiga -1 Plateau -1 Mox Emerald -1 Mox Pearl -2 Winds of Rath -2 Swords to Plowshares -2 Lightning Helix -4 Aura Gnarlid -4 Kor Spiritdancer -3 Uril, the Miststalker -2 Gatherer of Graces -1 Gate Hound -1 Thran Golem -1 Troll Ascetic -1 Silhana Ledgewalker -4 Rancor -1 Dust Corona -1 Hyena Umbra -1 Spider Umbra -2 Armadillo Cloak -1 Unquestioned Authority -1 Fencer's Magemark -2 Ancestral Mask -2 Canopy Cover -[sideboard] diff --git a/res/quest/decks/Endora 2.dck b/res/quest/decks/Endora 2.dck deleted file mode 100644 index 87157cebbda..00000000000 --- a/res/quest/decks/Endora 2.dck +++ /dev/null @@ -1,36 +0,0 @@ -Endora 2 -[general] -constructed -[main] -1 Femeref Enchantress -1 Hoofprints of the Stag -1 Privileged Position -1 Seal of Cleansing -2 Verduran Enchantress -1 Ajani's Mantra -4 Savannah -3 Ghostly Prison -4 Enchantress's Presence -1 Honden of Cleansing Fire -1 Journey to Nowhere -1 Kismet -4 Oblivion Ring -7 Plains -4 Graypelt Refuge -1 Centaur Glade -2 Argothian Enchantress -1 Seal of Primordium -7 Forest -1 Yavimaya Enchantress -2 Mesa Enchantress -1 Sigil of the Empty Throne -1 Awakening Zone -1 Mana Matrix -1 Honden of Life's Web -1 Lucent Liminid -1 Caribou Range -1 Convalescent Care -1 Bound in Silence -1 Pacifism -1 Guard Duty -[sideboard] diff --git a/res/quest/decks/Endora 3.dck b/res/quest/decks/Endora 3.dck deleted file mode 100644 index d6c2cebef59..00000000000 --- a/res/quest/decks/Endora 3.dck +++ /dev/null @@ -1,34 +0,0 @@ -Endora 3 -[general] -constructed -[main] -1 Hoofprints of the Stag -1 Privileged Position -1 Seal of Cleansing -1 Verduran Enchantress -2 Exploration -4 Savannah -4 Windswept Heath -3 Ghostly Prison -4 Enchantress's Presence -1 Honden of Cleansing Fire -4 Journey to Nowhere -1 Kismet -4 Oblivion Ring -4 Plains -1 Mox Emerald -1 Mox Pearl -4 Graypelt Refuge -1 Centaur Glade -4 Argothian Enchantress -1 Seal of Primordium -4 Forest -1 Yavimaya Enchantress -1 Mesa Enchantress -2 Sigil of the Empty Throne -1 Awakening Zone -1 Honden of Life's Web -1 Ajani's Mantra -1 Pacifism -1 Arrest -[sideboard] diff --git a/res/quest/decks/Eomer 2.dck b/res/quest/decks/Eomer 2.dck deleted file mode 100644 index 1055fc51e4f..00000000000 --- a/res/quest/decks/Eomer 2.dck +++ /dev/null @@ -1,22 +0,0 @@ -Eomer 2 -[general] -constructed -[main] -4 Cavalry Master|TSP -2 Arid Mesa|ZEN -2 Path to Exile|CFX -4 Sidewinder Sliver|TSP -4 Knight of Sursi|FUT -4 Benalish Cavalry|TSP -1 Knighthood|7ED -4 Marsh Flats|ZEN -2 Lashknife Barrier|PLS -16 Plains|MBS -2 Emeria, the Sky Ruin|ZEN -4 Zhalfirin Commander|TSB -2 Oust|ROE -1 Crusade|6ED -4 Femeref Knight|MIR -2 Swords to Plowshares|ICE -2 Inspired Charge|M11 -[sideboard] \ No newline at end of file diff --git a/res/quest/decks/Ezio 3.dck b/res/quest/decks/Ezio 3.dck deleted file mode 100644 index e1c4e2e2b5c..00000000000 --- a/res/quest/decks/Ezio 3.dck +++ /dev/null @@ -1,18 +0,0 @@ -Ezio 3 -[general] -constructed -[main] -4 Guul Draz Assassin|ROE -4 Scarblade Elite|MOR -2 Pulling Teeth|MOR -2 Mind Sludge|ZEN -4 Weed-Pruner Poplar|MOR -20 Swamp|MBS -2 Night's Whisper|5DN -4 Nekrataal|10E -2 Despise|NPH -4 Assassinate|M11 -4 Royal Assassin|M11 -4 Verdant Catacombs|ZEN -4 Nameless Inversion|LRW -[sideboard] diff --git a/res/quest/decks/Fat Albert 1.dck b/res/quest/decks/Fat Albert 1.dck deleted file mode 100644 index 38147aee593..00000000000 --- a/res/quest/decks/Fat Albert 1.dck +++ /dev/null @@ -1,27 +0,0 @@ -Fat Albert 1 -[general] -constructed -[main] -3 Druid of the Anima -4 Jungle Shrine -4 Seaside Citadel -3 Urborg Elf -4 Dosan's Oldest Chant -1 Utopia Tree -3 Harmonize -3 Keldon Warlord -1 Enlightened Tutor -7 Forest -1 Spidersilk Armor -4 Gemhide Sliver -1 Fecundity -4 Savage Lands -2 Winter Orb -1 Phyrexian Gargantua -2 Naturalize -4 Elfhame Palace -2 Loxodon Gatekeeper -4 Elvish Harbinger -1 Primordial Sage -1 Dune-Brood Nephilim -[sideboard] diff --git a/res/quest/decks/Fat Albert 2.dck b/res/quest/decks/Fat Albert 2.dck deleted file mode 100644 index 085c937ca7b..00000000000 --- a/res/quest/decks/Fat Albert 2.dck +++ /dev/null @@ -1,31 +0,0 @@ -Fat Albert 2 -[general] -constructed -[main] -4 Taiga -4 Tropical Island -7 Forest -4 Bayou -4 Savannah -3 Druid of the Anima -3 Urborg Elf -4 Gemhide Sliver -4 Elvish Harbinger -4 Winter Orb -2 Seedborn Muse -1 Murkfiend Liege -2 Windstorm -1 Juzam Djinn -1 Dosan's Oldest Chant -1 Ancestral Recall -1 Keldon Warlord -1 Enlightened Tutor -1 Lichenthrope -1 Spidersilk Armor -1 Fecundity -1 Drifting Djinn -2 Naturalize -1 Adun Oakenshield -1 Benalish Heralds -1 Blessed Orator -[sideboard] diff --git a/res/quest/decks/Fat Albert 3.dck b/res/quest/decks/Fat Albert 3.dck deleted file mode 100644 index 47b0244605c..00000000000 --- a/res/quest/decks/Fat Albert 3.dck +++ /dev/null @@ -1,34 +0,0 @@ -Fat Albert 3 -[general] -constructed -[main] -1 Scepter of Insight -3 Birds of Paradise -4 Tropical Island -4 Misty Rainforest -4 Dryad Arbor -1 Mox Emerald -3 Urborg Elf -1 Ancestral Recall -1 Time Walk -2 Fabricate -1 Spidersilk Armor -4 Winter Orb -1 Naturalize -1 Temporal Spring -4 Noble Hierarch -1 Mox Sapphire -5 Forest -4 Gemhide Sliver -2 Scion of the Wild -4 Seedborn Muse -1 Thrun, the Last Troll -1 Kalonian Behemoth -1 Simic Sky Swallower -1 Gaea's Anthem -1 Collective Unconscious -1 Biomantic Mastery -1 Propaganda -1 Overrun -4 Murkfiend Liege -[sideboard] diff --git a/res/quest/decks/Fin Fang Foom 1.dck b/res/quest/decks/Fin Fang Foom 1.dck deleted file mode 100644 index b1f1c33be07..00000000000 --- a/res/quest/decks/Fin Fang Foom 1.dck +++ /dev/null @@ -1,23 +0,0 @@ -Fin Fang Foom 1 -[general] -constructed -[main] -24 Forest|MBS -2 Beast Hunt|ZEN -2 Naturalize|M11 -2 Glistener Elf|NPH -2 Virulent Sliver -2 Pistus Strike|MBS -2 Plague Myr|MBS -2 Blight Mamba|SOM -2 Viridian Corrupter|MBS -2 Rot Wolf|MBS -2 Cystbearer|SOM -3 Phyrexian Digester -4 Marsh Viper -4 Carrion Call|SOM -2 Blightwidow|MBS -2 Tel-Jilad Fallen -1 Corpse Cur -1 Serpent Generator -[sideboard] \ No newline at end of file diff --git a/res/quest/decks/Fin Fang Foom 2.dck b/res/quest/decks/Fin Fang Foom 2.dck deleted file mode 100644 index 7add41faf00..00000000000 --- a/res/quest/decks/Fin Fang Foom 2.dck +++ /dev/null @@ -1,22 +0,0 @@ -Fin Fang Foom 2 -[general] -constructed -[main] -3 Cystbearer|SOM -2 Carrion Call|SOM -1 Viridian Claw|MBS -4 Blightwidow|MBS -2 Lead the Stampede|MBS -1 Phyrexian Juggernaut|MBS -1 Glistener Elf|NPH -2 Phyrexian Swarmlord|NPH -3 Pistus Strike|MBS -2 Leyline of Vitality|M11 -2 Plague Myr|MBS -20 Forest|MBS -4 Viridian Corrupter|MBS -4 Blight Mamba|SOM -3 Rot Wolf|MBS -2 Naturalize|M11 -4 Verdant Catacombs|ZEN -[sideboard] \ No newline at end of file diff --git a/res/quest/decks/Fin Fang Foom 3.dck b/res/quest/decks/Fin Fang Foom 3.dck deleted file mode 100644 index 93ae4ef38ea..00000000000 --- a/res/quest/decks/Fin Fang Foom 3.dck +++ /dev/null @@ -1,23 +0,0 @@ -Fin Fang Foom 3 -[general] -constructed -[main] -2 Ichor Rats|SOM -2 Cystbearer|SOM -2 Phyrexian Vatmother|MBS -3 Plague Stinger|SOM -2 Corpse Cur|SOM -4 Hand of the Praetors|SOM -3 Lead the Stampede|MBS -2 Skithiryx, the Blight Dragon|SOM -3 Glistener Elf|NPH -2 Phyrexian Swarmlord|NPH -10 Swamp|MBS -2 Septic Rats|MBS -2 Putrefax|SOM -3 Ichorclaw Myr|SOM -3 Phyrexian Crusader|MBS -1 Viridian Corrupter|MBS -10 Forest|MBS -4 Verdant Catacombs|ZEN -[sideboard] diff --git a/res/quest/decks/Fred Flintstone 3.dck b/res/quest/decks/Fred Flintstone 3.dck deleted file mode 100644 index 6269072026d..00000000000 --- a/res/quest/decks/Fred Flintstone 3.dck +++ /dev/null @@ -1,31 +0,0 @@ -Fred Flintstone 3 -[general] -constructed -[main] -2 Savannah -2 Tundra -3 Tropical Island -4 Misty Rainforest -3 Windswept Heath -3 Reliquary Tower -1 Library of Alexandria -1 Mox Emerald -1 Mox Pearl -1 Mox Sapphire -4 Noble Hierarch -2 Hoofprints of the Stag -4 Lorescale Coatl -4 Overbeing of Myth -1 Psychosis Crawler -1 Ancestral Recall -2 Font of Mythos -2 Howling Mine -2 Exploration -4 Wall of Blossoms -3 Thieving Magpie -1 Cold-Eyed Selkie -1 Jungle Barrier -3 Oblivion Ring -2 Ivory Tower -1 Hindering Light -[sideboard] diff --git a/res/quest/decks/Frodo 1.dck b/res/quest/decks/Frodo 1.dck deleted file mode 100644 index d4f8986d37c..00000000000 --- a/res/quest/decks/Frodo 1.dck +++ /dev/null @@ -1,30 +0,0 @@ -Frodo 1 -[general] -constructed -[main] -4 Sacred Foundry -4 Stomping Ground -3 Kird Ape -4 Striped Bears -4 Plains -2 Grizzled Leotau -1 Savannah Lions -2 Castle Raptors -4 Forest -2 Iona's Judgment -2 Reprisal -2 Nacatl Outlander -1 Strafe -2 Scorching Spear -1 Loam Lion -2 Serra's Blessing -4 Barbary Apes -4 Temple Garden -1 Wild Nacatl -4 Mountain -1 Spoils of Victory -1 Hedge Troll -1 Might Weaver -3 Quirion Dryad -1 Thornscape Familiar -[sideboard] diff --git a/res/quest/decks/Frodo 2.dck b/res/quest/decks/Frodo 2.dck deleted file mode 100644 index 8ec6f11ea42..00000000000 --- a/res/quest/decks/Frodo 2.dck +++ /dev/null @@ -1,27 +0,0 @@ -Frodo 2 -[general] -constructed -[main] -4 Plateau -4 Taiga -2 Arid Mesa -2 Wooded Foothills -1 Windswept Heath -3 Kird Ape -4 Striped Bears -2 Lightning Helix -2 Plains -4 Savannah Lions -1 Glorious Anthem -3 Plated Geopede -1 Forest -3 Path to Exile -2 Lightning Bolt -3 Loam Lion -2 Serra's Blessing -4 Barbary Apes -2 Steppe Lynx -4 Savannah -3 Wild Nacatl -4 Mountain -[sideboard] diff --git a/res/quest/decks/Frodo 3.dck b/res/quest/decks/Frodo 3.dck deleted file mode 100644 index 3387aa545b2..00000000000 --- a/res/quest/decks/Frodo 3.dck +++ /dev/null @@ -1,27 +0,0 @@ -Frodo 3 -[general] -constructed -[main] -2 Plateau -2 Taiga -4 Arid Mesa -4 Wooded Foothills -2 Windswept Heath -4 Kird Ape -1 Mox Emerald -3 Woolly Thoctar -4 Lightning Helix -2 Glorious Anthem -2 Gaddock Teeg -4 Plated Geopede -1 Forest -4 Path to Exile -4 Lightning Bolt -1 Mox Ruby -1 Mox Pearl -4 Loam Lion -4 Steppe Lynx -2 Savannah -4 Wild Nacatl -1 Mountain -[sideboard] diff --git a/res/quest/decks/Galadriel 2.dck b/res/quest/decks/Galadriel 2.dck deleted file mode 100644 index 221639c355d..00000000000 --- a/res/quest/decks/Galadriel 2.dck +++ /dev/null @@ -1,27 +0,0 @@ -Galadriel 2 -[general] -constructed -[main] -15 Forest -2 Thawing Glaciers -3 Mountain Valley -4 Sapseep Forest -4 Amulet of Vigor -2 Khalni Heart Expedition -1 Time Vault -3 Explosive Vegetation -2 Kodama's Reach -2 Cultivate -4 Rampant Growth -1 Fruition -4 Scarwood Treefolk -2 Rusted Sentinel -4 Howl of the Night Pack -1 Primeval Titan -1 Beacon of Creation -1 Timbermaw Larva -1 Reach of Branches -1 Baru, Fist of Krosa -1 Grazing Gladehart -1 Mwonvuli Acid-Moss -[sideboard] diff --git a/res/quest/decks/Galahad 1.dck b/res/quest/decks/Galahad 1.dck deleted file mode 100644 index 4a2aa83588c..00000000000 --- a/res/quest/decks/Galahad 1.dck +++ /dev/null @@ -1,30 +0,0 @@ -Galahad 1 -[general] -constructed -[main] -1 Befoul -2 White Shield Crusader -1 Deathmark -8 Swamp -2 Stillmoon Cavalier -8 Plains -1 Knight Exemplar -2 Craven Knight -2 Glorious Charge -2 Ghostly Visit -2 Plover Knights -2 Knight of the White Orchid -2 Oust -2 Lionheart Maverick -1 Black Knight -4 Arcane Sanctum -1 Silver Knight -2 Headless Horseman -2 Kinsbaile Cavalier -1 Thistledown Liege -2 Soltari Crusader -4 Godless Shrine -2 Serra's Blessing -3 Knight Errant -1 White Knight -[sideboard] diff --git a/res/quest/decks/Galahad 2.dck b/res/quest/decks/Galahad 2.dck deleted file mode 100644 index 46f64d2a06a..00000000000 --- a/res/quest/decks/Galahad 2.dck +++ /dev/null @@ -1,28 +0,0 @@ -Galahad 2 -[general] -constructed -[main] -7 Plains -7 Swamp -2 Godless Shrine -4 Scrubland -2 Stillmoon Cavalier -2 Knight Exemplar -1 Glorious Charge -2 Knight of Meadowgrain -2 Plover Knights -3 Knight of the White Orchid -3 Black Knight -1 Kulrath Knight -1 Thistledown Liege -1 Wilt-Leaf Cavaliers -1 Swords to Plowshares -2 Silver Knight -4 Kinsbaile Cavalier -2 Soltari Crusader -2 Serra's Blessing -4 Godless Shrine -2 Paladin en-Vec -3 Path to Exile -2 Doom Blade -[sideboard] diff --git a/res/quest/decks/Galahad 3.dck b/res/quest/decks/Galahad 3.dck deleted file mode 100644 index 4e3cc63bd19..00000000000 --- a/res/quest/decks/Galahad 3.dck +++ /dev/null @@ -1,28 +0,0 @@ -Galahad 3 -[general] -constructed -[main] -2 Armageddon -6 Swamp -6 Plains -4 Scrubland -4 Godless Shrine -1 Day of Judgment -4 Knight Exemplar -4 Knight of Meadowgrain -3 Knight of the White Orchid -2 Black Knight -4 Swords to Plowshares -2 Silver Knight -2 Kinsbaile Cavalier -1 Mox Pearl -1 Serra's Blessing -3 Paladin en-Vec -2 Path to Exile -1 Mox Jet -2 White Knight -3 Doom Blade -1 Kulrath Knight -1 Thistledown Liege -1 Wilt-Leaf Cavaliers -[sideboard] diff --git a/res/quest/decks/Genghis Khan 1.dck b/res/quest/decks/Genghis Khan 1.dck deleted file mode 100644 index b1b17e4d080..00000000000 --- a/res/quest/decks/Genghis Khan 1.dck +++ /dev/null @@ -1,33 +0,0 @@ -Genghis Khan 1 -[general] -constructed -[main] -4 Terramorphic Expanse -2 Birds of Paradise -4 Rith's Grove -3 Druid of the Anima -2 Utopia Tree -1 Armageddon -1 Winter Orb -2 Eternal Witness -2 Plains -3 Benalish Knight -3 Steward of Valeron -2 Harmonize -1 Collective Unconscious -4 Forest -1 Kodama's Reach -3 Quirion Dryad -2 Obelisk of Naya -1 Tithe -2 Mungha Wurm -4 Elfhame Palace -2 Llanowar Behemoth -3 Skyknight Legionnaire -2 Meadowboon -2 Quest for Renewal -1 Heroes' Reunion -1 Violent Outburst -1 Artifact Mutation -1 Tremble -[sideboard] diff --git a/res/quest/decks/Genghis Khan 2.dck b/res/quest/decks/Genghis Khan 2.dck deleted file mode 100644 index a38c8099896..00000000000 --- a/res/quest/decks/Genghis Khan 2.dck +++ /dev/null @@ -1,27 +0,0 @@ -Genghis Khan 2 -[general] -constructed -constructed -[main] -4 Stomping Ground -4 Temple Garden -4 Windswept Heath -4 Wooded Foothills -3 Misty Rainforest -4 Obelisk of Naya -4 Birds of Paradise -2 Druid of the Anima -1 Noble Hierarch -1 Utopia Tree -3 Armageddon -3 Ravages of War -4 Tremble -4 Mana Tithe -3 Terravore -3 Knight of the Reliquary -1 Loxodon Gatekeeper -2 Akki Raider -2 Roiling Terrain -3 Mungha Wurm -[sideboard] - diff --git a/res/quest/decks/Genghis Khan 3.dck b/res/quest/decks/Genghis Khan 3.dck deleted file mode 100644 index b49785bec7b..00000000000 --- a/res/quest/decks/Genghis Khan 3.dck +++ /dev/null @@ -1,29 +0,0 @@ -Genghis Khan 3 -[general] -constructed -[main] -2 Taiga -2 Savannah -4 Windswept Heath -4 Wooded Foothills -2 Misty Rainforest -1 Mox Emerald -1 Mox Ruby -1 Mox Pearl -1 Mox Jet -1 Mox Sapphire -4 Darksteel Ingot -4 Birds of Paradise -1 Druid of the Anima -3 Noble Hierarch -4 Armageddon -4 Ravages of War -4 Tremble -4 Mana Tithe -4 Terravore -4 Knight of the Reliquary -1 Loxodon Gatekeeper -1 Akki Raider -2 Roiling Terrain -1 Lightning Helix -[sideboard] diff --git a/res/quest/decks/George of the Jungle 1.dck b/res/quest/decks/George of the Jungle 1.dck deleted file mode 100644 index 5a41bea93ac..00000000000 --- a/res/quest/decks/George of the Jungle 1.dck +++ /dev/null @@ -1,27 +0,0 @@ -George of the Jungle 1 -[general] -constructed -[main] -2 Sacred Foundry -2 Battlefield Forge -1 Expedition Map -4 Jungle Shrine -1 Disenchant -4 Boros Recruit -4 Hobgoblin Dragoon -2 Cerodon Yearling -2 Angelfire Crusader -2 Ordruun Commando -1 Ghostfire -3 Battlegate Mimic -2 Skyknight Legionnaire -2 Duergar Hedge-Mage -3 Belligerent Hatchling -3 Stun Sniper -8 Plains -1 Flowstone Charger -2 Scourge of the Nobilis -2 Double Cleave -8 Mountain -1 Spitemare -[sideboard] diff --git a/res/quest/decks/George of the Jungle 2.dck b/res/quest/decks/George of the Jungle 2.dck deleted file mode 100644 index a113fd54bd2..00000000000 --- a/res/quest/decks/George of the Jungle 2.dck +++ /dev/null @@ -1,33 +0,0 @@ -George of the Jungle 2 -[general] -constructed -[main] -1 Bull Cerodon -4 Sacred Foundry -2 Battlefield Forge -4 Plateau -2 Squee's Embrace -1 Hobgoblin Dragoon -3 Belligerent Hatchling -2 Lightning Helix -2 Stun Sniper -8 Plains -2 Flowstone Charger -1 Ajani Vengeant -2 Figure of Destiny -2 Double Cleave -2 Hearthfire Hobgoblin -3 Battlegate Mimic -2 Skyknight Legionnaire -8 Mountain -1 Boros Recruit -1 Balefire Liege -1 Boros Swiftblade -1 Cerodon Yearling -2 Glory of Warfare -1 Brion Stoutarm -1 Duergar Hedge-Mage -1 Firemane Angel -1 Flame-Kin Zealot -1 Spitemare -[sideboard] diff --git a/res/quest/decks/George of the Jungle 3.dck b/res/quest/decks/George of the Jungle 3.dck deleted file mode 100644 index 3ba1efdab8e..00000000000 --- a/res/quest/decks/George of the Jungle 3.dck +++ /dev/null @@ -1,27 +0,0 @@ -George of the Jungle 3 -[general] -constructed -[main] -1 Bull Cerodon -4 Sacred Foundry -4 Plateau -2 Squee's Embrace -4 Belligerent Hatchling -4 Lightning Helix -2 Stun Sniper -2 Boros Swiftblade -7 Plains -2 Flowstone Charger -2 Ajani Vengeant -1 Mox Ruby -1 Mox Pearl -2 Figure of Destiny -2 Double Cleave -2 Hearthfire Hobgoblin -4 Battlegate Mimic -2 Skyknight Legionnaire -7 Mountain -3 Balefire Liege -1 Brion Stoutarm -1 Cerodon Yearling -[sideboard] diff --git a/res/quest/decks/Gimli 2.dck b/res/quest/decks/Gimli 2.dck deleted file mode 100644 index c1a1339e965..00000000000 --- a/res/quest/decks/Gimli 2.dck +++ /dev/null @@ -1,26 +0,0 @@ -Gimli 2 -[general] -constructed -[main] -5 Swamp -5 Plains -4 Scrubland -4 Arcane Sanctum -4 Darksteel Citadel -3 Darksteel Ingot -1 Darksteel Myr -1 Darksteel Relic -2 Darksteel Axe -3 Darksteel Gargoyle -2 Darksteel Sentinel -2 Darksteel Juggernaut -1 Stuffy Doll -2 Phylactery Lich -1 Konda, Lord of Eiganjo -1 Sapling of Colfenor -4 Wrath of God -4 Damnation -4 Day of Judgment -4 Planar Cleansing -3 Akroma's Vengeance -[sideboard] diff --git a/res/quest/decks/Gimli 3.dck b/res/quest/decks/Gimli 3.dck deleted file mode 100644 index debc4f4548d..00000000000 --- a/res/quest/decks/Gimli 3.dck +++ /dev/null @@ -1,28 +0,0 @@ -Gimli 3 -[general] -constructed -[main] -5 Swamp -1 Plains -4 Scrubland -4 Marsh Flats -4 Arcane Sanctum -4 Bloodstained Mire -2 The Tabernacle at Pendrell Vale -4 Darksteel Citadel -4 Darksteel Ingot -1 Darksteel Axe -1 Myr Matrix -2 Darksteel Gargoyle -2 Darksteel Sentinel -4 Stuffy Doll -4 Phylactery Lich -1 Konda, Lord of Eiganjo -1 Sapling of Colfenor -4 Wrath of God -4 Damnation -2 Day of Judgment -3 Planar Cleansing -2 Akroma's Vengeance -2 The Abyss -[sideboard] diff --git a/res/quest/decks/Gold Finger 3.dck b/res/quest/decks/Gold Finger 3.dck deleted file mode 100644 index 0ce9cce1385..00000000000 --- a/res/quest/decks/Gold Finger 3.dck +++ /dev/null @@ -1,24 +0,0 @@ -Gold Finger 3 -[general] -constructed -[main] -24 Island -1 Mox Sapphire -4 Counterspell -1 Remove Soul -1 Preemptive Strike -1 Essence Scatter -1 False Summoning -4 Spell Snare -4 Dismiss -2 Repulse -2 Snap -2 Serra Sphinx -2 Ivory Tower -1 Memnarch -3 Plumeveil -1 Ancestral Recall -1 Time Walk -3 Cloud of Faeries -2 Treachery -[sideboard] diff --git a/res/quest/decks/Gold Finger 4.dck b/res/quest/decks/Gold Finger 4.dck deleted file mode 100644 index 380566e3ee0..00000000000 --- a/res/quest/decks/Gold Finger 4.dck +++ /dev/null @@ -1,21 +0,0 @@ -Gold Finger 4 -[general] -constructed -[main] -24 Island -1 Mox Sapphire -4 Psychic Barrier -4 Mana Drain -4 Spell Snare -4 Dismiss -2 Repulse -1 Snap -2 Serra Sphinx -1 Consecrated Sphinx -3 Plumeveil -1 Ancestral Recall -1 Time Walk -4 Treachery -1 Back to Basics -3 Fact or Fiction -[sideboard] diff --git a/res/quest/decks/Grampa Simpson 1.dck b/res/quest/decks/Grampa Simpson 1.dck deleted file mode 100644 index db6781ebab5..00000000000 --- a/res/quest/decks/Grampa Simpson 1.dck +++ /dev/null @@ -1,42 +0,0 @@ -Grampa Simpson 1 -[general] -constructed -[main] -4 Sacred Foundry -8 Plains -8 Mountain -1 Leonin Scimitar -1 Lightning Talons -1 Agility -1 Warlord's Axe -1 Blight Sickle -1 Silverskin Armor -1 No-Dachi -1 Vulshok Morningstar -1 Ogre's Cleaver -1 Trusty Machete -1 Dust Corona -1 Kitesail -1 The Brute -1 Nimbus Wings -1 Goblin War Paint -1 Soulsurge Elemental -1 Mourning Thrull -2 Skyhunter Skirmisher -1 Battle Hurda -3 Ridgetop Raptor -1 Boros Swiftblade -1 Hearthfire Hobgoblin -1 Ballynock Cohort -2 Kor Duelist -1 Kitsune Blademaster -1 Kjeldoran Gargoyle -2 Viashino Slaughtermaster -1 Viashino Spearhunter -1 Boros Recruit -1 Hobgoblin Dragoon -1 Youthful Knight -1 Ambush Party -1 Anaba Bodyguard -1 Cloud Crusader -[sideboard] diff --git a/res/quest/decks/Grampa Simpson 2.dck b/res/quest/decks/Grampa Simpson 2.dck deleted file mode 100644 index 41038a02707..00000000000 --- a/res/quest/decks/Grampa Simpson 2.dck +++ /dev/null @@ -1,24 +0,0 @@ -Grampa Simpson 2 -[general] -constructed -[main] -4 Sacred Foundry -4 Jungle Shrine -4 Plateau -3 Kor Duelist -4 Plains -4 Glorious Anthem -4 Skyhunter Skirmisher -4 Bonesplitter -1 Kinsbaile Cavalier -4 Student of Warfare -1 Ridgetop Raptor -1 Gorgon Flail -4 Loxodon Warhammer -4 Boros Swiftblade -4 Viashino Slaughtermaster -1 Ogre's Cleaver -1 Rakdos Pit Dragon -4 Hearthfire Hobgoblin -4 Mountain -[sideboard] diff --git a/res/quest/decks/Grampa Simpson 3.dck b/res/quest/decks/Grampa Simpson 3.dck deleted file mode 100644 index c65cb54aaf4..00000000000 --- a/res/quest/decks/Grampa Simpson 3.dck +++ /dev/null @@ -1,30 +0,0 @@ -Grampa Simpson 3 -[general] -constructed -[main] -2 Marisi's Twinclaws -1 Kor Duelist -4 Jungle Shrine -3 Plateau -2 Taiga -4 Windswept Heath -2 Warren Instigator -1 Plains -3 Glorious Anthem -3 Skyhunter Skirmisher -4 Bonesplitter -2 Scrubland -1 Badlands -1 Kinsbaile Cavalier -1 Mox Ruby -4 Student of Warfare -1 Mox Pearl -1 Gorgon Flail -3 Loxodon Warhammer -4 Boros Swiftblade -4 Viashino Slaughtermaster -1 Savannah -4 Hearthfire Hobgoblin -1 Rancor -4 Mirran Crusader -[sideboard] diff --git a/res/quest/decks/Green Arrow 2.dck b/res/quest/decks/Green Arrow 2.dck deleted file mode 100644 index e5f4aae1e52..00000000000 --- a/res/quest/decks/Green Arrow 2.dck +++ /dev/null @@ -1,23 +0,0 @@ -Green Arrow 2 -[general] -constructed -[main] -1 Gaea's Anthem|PLC -4 Elvish Archers|7ED -1 Overwhelming Stampede|M11 -4 Terramorphic Expanse|M11 -1 Crosswinds|USG -4 Jagged-Scar Archers|LRW -4 Thornweald Archer|FUT -4 Greatbow Doyen|MOR -4 Norwood Archers|S99 -1 Viridian Longbow|MRD -1 Overrun|M10 -1 Leyline of Vitality|M11 -4 Ezuri's Archers|SOM -2 Plow Under|8ED -20 Forest|MBS -1 Howl of the Night Pack|M10 -2 Harmonize|PLC -1 Rancor|ULG -[sideboard] diff --git a/res/quest/decks/Green Lantern 3.dck b/res/quest/decks/Green Lantern 3.dck deleted file mode 100644 index dfa889e0c44..00000000000 --- a/res/quest/decks/Green Lantern 3.dck +++ /dev/null @@ -1,32 +0,0 @@ -Green Lantern 3 -[general] -constructed -[main] -4 Tidehollow Strix -4 Grixis Grimblade -4 Vampire Nighthawk -2 Giant Scorpion -1 Nirkana Cutthroat -1 Pestilent Kathari -2 Viridian Claw -2 Bladed Pinions -3 Arcane Teachings -2 Hermetic Study -3 Power of Fire -2 Psionic Gift -1 Electropotence -1 Mox Jet -1 Mox Ruby -1 Mox Sapphire -4 Badlands -4 Underground Sea -4 Volcanic Island -3 Crosis's Catacombs -1 Leechridden Swamp -3 Crumbling Necropolis -1 Creeping Tar Pit -1 Lavaclaw Reaches -1 Ancestral Recall -3 Concentrate -1 Time Walk -[sideboard] diff --git a/res/quest/decks/Hagrid 2.dck b/res/quest/decks/Hagrid 2.dck deleted file mode 100644 index 357ee627aec..00000000000 --- a/res/quest/decks/Hagrid 2.dck +++ /dev/null @@ -1,22 +0,0 @@ -Hagrid 2 -[general] -constructed -[main] -4 Pyroclasm|M11 -20 Mountain|MBS -1 Sunrise Sovereign|LRW -4 Lash Out|LRW -4 Arid Mesa|ZEN -4 Blind-Spot Giant|LRW -1 Craven Giant|STH -1 Giant's Ire|LRW -4 Fire Diamond|7ED -2 Shatterskull Giant|ZEN -1 Magma Giant|5DN -4 Thundercloud Shaman|LRW -4 Stinkdrinker Daredevil|LRW -4 Spitting Earth|10E -1 Borderland Behemoth|MOR -1 Inferno Titan|M11 -[sideboard] - diff --git a/res/quest/decks/Han Solo 3.dck b/res/quest/decks/Han Solo 3.dck deleted file mode 100644 index 4dce49dfd2c..00000000000 --- a/res/quest/decks/Han Solo 3.dck +++ /dev/null @@ -1,26 +0,0 @@ -Han Solo 3 -[general] -constructed -[main] -4 Tundra -4 Plains -4 Glacial Fortress -4 Windswept Heath -4 Flooded Strand -4 Marsh Flats -4 Enlightened Tutor -4 Idyllic Tutor -4 Enchanted Evening -4 Azorius First-Wing -2 Aven Cloudchaser -2 Cloudchaser Eagle -4 Cloudchaser Kestrel -1 Dawning Purist -1 Fountain Watch -4 War Priest of Thune -1 Revoke Existence -1 Stern Proctor -4 Wispmare -1 Ancestral Recall -1 Time Walk -[sideboard] diff --git a/res/quest/decks/Hans 3.dck b/res/quest/decks/Hans 3.dck deleted file mode 100644 index fc2af60bee2..00000000000 --- a/res/quest/decks/Hans 3.dck +++ /dev/null @@ -1,27 +0,0 @@ -Hans 3 -[general] -constructed -[main] -4 Mountain|MBS -2 Highland Berserker|ZEN -4 Talus Paladin|WWK -4 Akoum Battlesinger|WWK -4 Kazandu Blademaster|ZEN -4 Jungle Shrine|ALA -4 Arid Mesa|ZEN -4 Hada Freeblade|WWK -2 Oran-Rief Survivalist|ZEN -4 Plains|MBS -1 Murasa Pyromancer|ZEN -3 Graypelt Hunter|WWK -4 Ondu Cleric|ZEN -1 Sunpetal Grove|M10 -1 Tajuru Archer|ZEN -2 Oust|ROE -3 Sunpetal Grove|M11 -4 Forest|MBS -2 Turntimber Ranger|ZEN -1 Solemn Offering|M11 -1 Kazuul Warlord|ZEN -1 Join the Ranks|WWK -[sideboard] diff --git a/res/quest/decks/Harry Potter 1.dck b/res/quest/decks/Harry Potter 1.dck deleted file mode 100644 index 9d2c420650e..00000000000 --- a/res/quest/decks/Harry Potter 1.dck +++ /dev/null @@ -1,25 +0,0 @@ -Harry Potter 1 -[general] -constructed -[main] -4 Vedalken Entrancer -2 Remove Soul -1 Traumatize -4 Hedron Crab -2 Essence Scatter -1 Keening Stone -22 Island -3 Brain Freeze -1 Boomerang -1 Jace Beleren -2 Tome Scour -2 Vision Skeins -2 Cancel -4 Howling Mine -3 Millstone -2 Unsummon -2 Cathartic Adept -1 Ray of Erasure -1 Shriekhorn -1 Merrow Witsniper -[sideboard] diff --git a/res/quest/decks/Harry Potter 2.dck b/res/quest/decks/Harry Potter 2.dck deleted file mode 100644 index 94d939412de..00000000000 --- a/res/quest/decks/Harry Potter 2.dck +++ /dev/null @@ -1,28 +0,0 @@ -Harry Potter 2 -[general] -constructed -[main] -1 Vedalken Entrancer -4 Underground Sea -3 Remove Soul -2 Glimpse the Unthinkable -1 Traumatize -4 Hedron Crab -7 Swamp -3 Mind Funeral -1 Damnation -1 Keening Stone -11 Island -1 Brain Freeze -1 Jace Beleren -1 Ambassador Laquatus -4 Tome Scour -1 Nemesis of Reason -3 Counterspell -4 Howling Mine -1 Millstone -1 Unsummon -1 Jace's Erasure -1 Shriekhorn -1 Memory Erosion -[sideboard] diff --git a/res/quest/decks/Harry Potter 3.dck b/res/quest/decks/Harry Potter 3.dck deleted file mode 100644 index cb759ce9933..00000000000 --- a/res/quest/decks/Harry Potter 3.dck +++ /dev/null @@ -1,25 +0,0 @@ -Harry Potter 3 -[general] -constructed -[main] -4 Underground Sea -4 Polluted Delta -4 Remove Soul -4 Glimpse the Unthinkable -1 Mox Sapphire -4 Hedron Crab -3 Mind Funeral -5 Swamp -2 Damnation -9 Island -1 Ancestral Recall -1 Divination -2 Jace Beleren -3 Tome Scour -2 Nemesis of Reason -1 Time Walk -4 Howling Mine -4 Counterspell -1 Mox Jet -1 Szadek, Lord of Secrets -[sideboard] diff --git a/res/quest/decks/Hellboy 3.dck b/res/quest/decks/Hellboy 3.dck deleted file mode 100644 index 9db135aa98b..00000000000 --- a/res/quest/decks/Hellboy 3.dck +++ /dev/null @@ -1,25 +0,0 @@ -Hellboy 3 -[general] -constructed -[main] -5 Swamp -7 Mountain -4 Badlands -4 Bloodstained Mire -1 Mox Ruby -1 Mox Jet -4 Blightning -4 Breath of Malfegor -4 Flame Jet -4 Lava Axe -4 Lava Spike -4 Keldon Marauders -4 Spark Elemental -2 Night's Whisper -2 Flame Rift -1 Hidetsugu's Second Rite -1 Ball Lightning -1 Hellspark Elemental -1 Keldon Champion -1 Fire Servant -[sideboard] diff --git a/res/quest/decks/Hercules 1.dck b/res/quest/decks/Hercules 1.dck deleted file mode 100644 index e4ae1143529..00000000000 --- a/res/quest/decks/Hercules 1.dck +++ /dev/null @@ -1,45 +0,0 @@ -Hercules 1 -[general] -constructed -[main] -4 Safehold Duo -2 Bant Sureblade -2 Naya Hushblade -1 Sunscape Familiar -1 Thornscape Familiar -1 Steward of Valeron -1 Ancient Spider -1 Asmira, Holy Avenger -1 Jasmine Boreal -1 Torsten Von Ursus -1 Juniper Order Ranger -1 Lord Magnus -1 Old Ghastbark -1 Charging Troll -1 Enlisted Wurm -1 Grizzled Leotau -1 Horned Cheetah -1 Zebra Unicorn -1 Radiant Essence -1 Ranger en-Vec -1 Raven's Run Dragoon -1 Centaur Safeguard -1 Leonin Armorguard -1 Messenger Falcons -1 Scalebane's Elite -1 Aura Shards -1 Aura Mutation -1 Captured Sunlight -1 Heroes' Reunion -1 Pollenbright Wings -1 Reknit -2 Elfhame Palace -6 Forest -3 Grasslands -3 Arctic Flats -6 Plains -1 Brushland -1 Tranquil Garden -1 Vec Townships -1 Veldt -[sideboard] \ No newline at end of file diff --git a/res/quest/decks/Hercules 2.dck b/res/quest/decks/Hercules 2.dck deleted file mode 100644 index 1c5a05317ed..00000000000 --- a/res/quest/decks/Hercules 2.dck +++ /dev/null @@ -1,41 +0,0 @@ -Hercules 2 -[general] -constructed -[main] -2 Ancient Spider -3 Bant Sureblade -1 Centaur Safeguard -3 Kitchen Finks -1 Leonin Armorguard -1 Messenger Falcons -3 Naya Hushblade -1 Armadillo Cloak -1 Aura Shards -1 Behemoth Sledge -1 Enlisted Wurm -1 Crystallization -1 Asmira, Holy Avenger -1 Safehold Duo -1 Captured Sunlight -1 Charging Troll -1 Grizzled Leotau -1 Heartmender -1 Shield of the Oversoul -1 Sigil Blessing -1 Loxodon Hierarch -1 Mirari's Wake -1 Mycoid Shepherd -1 Mystic Enforcer -1 Oversoul of Dusk -1 Phantom Nishoba -1 Tolsimir Wolfblood -1 Wilt-Leaf Liege -1 Watchwolf -1 Wilt-Leaf Cavaliers -3 Sunpetal Grove -6 Forest -4 Grasslands -4 Graypelt Refuge -6 Plains -1 Vitu-Ghazi, the City-Tree -[sideboard] \ No newline at end of file diff --git a/res/quest/decks/Hercules 3.dck b/res/quest/decks/Hercules 3.dck deleted file mode 100644 index 2cc6e31e4e7..00000000000 --- a/res/quest/decks/Hercules 3.dck +++ /dev/null @@ -1,30 +0,0 @@ -Hercules 3 -[general] -constructed -[main] -4 Bant Sureblade -4 Naya Hushblade -2 Watchwolf -4 Kitchen Finks -4 Wilt-Leaf Cavaliers -4 Wilt-Leaf Liege -1 Knight of New Alara -1 Loxodon Hierarch -1 Tolsimir Wolfblood -2 Oversoul of Dusk -2 Shield of the Oversoul -1 Gaddock Teeg -1 Armadillo Cloak -1 Aura Shards -1 Behemoth Sledge -1 Crystallization -1 Mycoid Shepherd -3 Path to Exile -1 Mox Emerald -1 Mox Pearl -4 Savannah -4 Forest -4 Windswept Heath -4 Graypelt Refuge -4 Plains -[sideboard] \ No newline at end of file diff --git a/res/quest/decks/Hermione Granger 3.dck b/res/quest/decks/Hermione Granger 3.dck deleted file mode 100644 index 4355822efe6..00000000000 --- a/res/quest/decks/Hermione Granger 3.dck +++ /dev/null @@ -1,19 +0,0 @@ -Hermione Granger 3 -[general] -constructed -[main] -4 Prophetic Bolt|APC -10 Mountain|MBS -4 Razorfin Hunter|APC -4 Electrolyze|GPT -1 Niv-Mizzet, the Firemind|GPT -4 Scalding Tarn|ZEN -4 Riverfall Mimic|EVE -10 Island|MBS -4 Crag Puca|EVE -4 Clout of the Dominus|EVE -2 Quicksilver Dagger|APC -1 Stitch in Time|GPT -4 Dominus of Fealty|EVE -4 Mindwrack Liege|EVE -[sideboard] diff --git a/res/quest/decks/Higgins 3.dck b/res/quest/decks/Higgins 3.dck deleted file mode 100644 index 148667ed5ab..00000000000 --- a/res/quest/decks/Higgins 3.dck +++ /dev/null @@ -1,35 +0,0 @@ -Higgins 3 -[general] -constructed -[main] -4 Underground Sea -2 Badlands -4 Volcanic Island -2 Crumbling Necropolis -4 Bloodstained Mire -4 Polluted Delta -1 Swamp -1 Island -1 Mox Jet -1 Mox Ruby -1 Mox Sapphire -4 Spreading Seas -4 Terminate -1 Gatekeeper of Malakir -1 Ancestral Recall -1 Time Walk -1 Undermine -1 Spell Snare -1 Countersquall -2 Propaganda -1 Recoil -1 Siege-Gang Commander -1 Slave of Bolas -4 Blightning -1 Burst Lightning -1 Jace, the Mind Sculptor -1 Liliana Vess -4 Lightning Bolt -4 Sedraxis Specter -1 Cruel Ultimatum -[sideboard] diff --git a/res/quest/decks/Hobbes 3.dck b/res/quest/decks/Hobbes 3.dck deleted file mode 100644 index 8cc6f00bec7..00000000000 --- a/res/quest/decks/Hobbes 3.dck +++ /dev/null @@ -1,33 +0,0 @@ -Hobbes 3 -[general] -constructed -[main] -1 Mox Emerald -1 Mox Jet -1 Mox Sapphire -4 Tropical Island -1 Bayou -3 Misty Rainforest -4 Polluted Delta -2 Undiscovered Paradise -3 Bazaar of Baghdad -2 Forest -3 Hermit Druid -1 Dreamborn Muse -3 Careful Study -4 Mental Note -1 Worry Beads -3 Narcomoeba -3 Bridge from Below -3 Ichorid -3 Bloodghast -3 Golgari Grave-Troll -3 Stinkweed Imp -1 Shambling Shell -2 Dread Return -1 Darkblast -1 Life from the Loam -1 Roar of the Wurm -1 Corpse Connoisseur -1 Sword of the Meek -[sideboard] diff --git a/res/quest/decks/Hobbes 4.dck b/res/quest/decks/Hobbes 4.dck deleted file mode 100644 index 6eaf35adb0d..00000000000 --- a/res/quest/decks/Hobbes 4.dck +++ /dev/null @@ -1,27 +0,0 @@ -Hobbes 4 -[general] -constructed -[main] -1 Mox Emerald -1 Mox Sapphire -4 Tropical Island -4 Flooded Strand -4 Polluted Delta -1 Scalding Tarn -4 Bazaar of Baghdad -2 Forest -3 Hermit Druid -3 Careful Study -4 Mental Note -4 Narcomoeba -4 Bridge from Below -4 Ichorid -4 Bloodghast -4 Golgari Grave-Troll -4 Stinkweed Imp -1 Dread Return -1 Darkblast -1 Life from the Loam -1 Wonder -1 Brawn -[sideboard] diff --git a/res/quest/decks/Homer Simpson 1.dck b/res/quest/decks/Homer Simpson 1.dck deleted file mode 100644 index 8609457ac52..00000000000 --- a/res/quest/decks/Homer Simpson 1.dck +++ /dev/null @@ -1,26 +0,0 @@ -Homer Simpson 1 -[general] -constructed -[main] -4 Crumbling Necropolis -6 Mountain -4 Island -10 Swamp -4 Mortician Beetle -2 Deathgreeter -1 Hissing Iguanar -1 Nether Traitor -1 Quest for the Gravelord -1 Rockslide Elemental -1 Scavenger Drake -4 Cruel Edict -2 Diabolic Edict -2 Gatekeeper of Malakir -4 Hellspark Elemental -4 Spark Elemental -4 Arc Runner -1 Hell's Thunder -1 Predatory Nightstalker -1 Slave of Bolas -2 Divination -[sideboard] diff --git a/res/quest/decks/Homer Simpson 2.dck b/res/quest/decks/Homer Simpson 2.dck deleted file mode 100644 index 98feb4f2e08..00000000000 --- a/res/quest/decks/Homer Simpson 2.dck +++ /dev/null @@ -1,30 +0,0 @@ -Homer Simpson 2 -[general] -constructed -[main] -4 Underground Sea -4 Badlands -4 Crumbling Necropolis -4 Bloodstained Mire -4 Polluted Delta -4 Swamp -4 Mortician Beetle -1 Thraximundar -1 Grave Pact -1 Deathgreeter -1 Hissing Iguanar -1 Nether Traitor -1 Quest for the Gravelord -1 Rockslide Elemental -4 Cruel Edict -2 Chainer's Edict -2 Diabolic Edict -2 Gatekeeper of Malakir -4 Hellspark Elemental -4 Spark Elemental -1 Arc Runner -1 Hell's Thunder -1 Predatory Nightstalker -1 Slave of Bolas -2 Divination -[sideboard] diff --git a/res/quest/decks/Homer Simpson 3.dck b/res/quest/decks/Homer Simpson 3.dck deleted file mode 100644 index e6425a92a71..00000000000 --- a/res/quest/decks/Homer Simpson 3.dck +++ /dev/null @@ -1,28 +0,0 @@ -Homer Simpson 3 -[general] -constructed -[main] -4 Underground Sea -4 Badlands -4 Crumbling Necropolis -4 Bloodstained Mire -4 Polluted Delta -1 Swamp -1 Mox Jet -1 Mox Ruby -1 Mox Sapphire -1 Ancestral Recall -1 Time Walk -4 Mortician Beetle -2 Thraximundar -2 Grave Pact -2 Nether Traitor -1 Hissing Iguanar -4 Chainer's Edict -2 Diabolic Edict -4 Gatekeeper of Malakir -4 Hellspark Elemental -4 Spark Elemental -2 Hell's Thunder -2 Slave of Bolas -[sideboard] diff --git a/res/quest/decks/Iceman 3.dck b/res/quest/decks/Iceman 3.dck deleted file mode 100644 index ebbf3041bdd..00000000000 --- a/res/quest/decks/Iceman 3.dck +++ /dev/null @@ -1,34 +0,0 @@ -Iceman 3 -[general] -constructed -[main] -4 Underground Sea -4 Polluted Delta -4 Drowned Catacomb -1 Mox Pearl -1 Mox Jet -1 Mox Sapphire -1 Mox Ruby -1 Mox Emerald -4 Swamp -4 Island -1 Ancestral Recall -1 Time Walk -4 Warped Devotion -2 Recoil -1 Churning Eddy -1 Capsize -1 Dematerialize -1 Deny Reality -1 Glowing Anemone -1 Aven Fogbringer -1 Into the Roil -1 Jace, the Mind Sculptor -2 Repulse -4 Evacuation -4 Inundate -4 Sunder -2 Upheaval -2 Shadowmage Infiltrator -1 Sphinx of Jwar Isle -[sideboard] diff --git a/res/quest/decks/Indiana Jones 1.dck b/res/quest/decks/Indiana Jones 1.dck deleted file mode 100644 index 5a474f253d5..00000000000 --- a/res/quest/decks/Indiana Jones 1.dck +++ /dev/null @@ -1,42 +0,0 @@ -Indiana Jones 1 -[general] -constructed -[main] -4 Urborg Volcano -4 Salt Marsh -4 Frost Marsh -4 Tresserhorn Sinks -8 Swamp -1 Sol'kanar the Swamp King -4 Smolder Initiate -1 Purraj of Urborg -1 Throne of Bone -1 Demon's Horn -1 Drastic Revelation -1 Brainbite -1 Mask of Riddles -1 Sleeper's Robe -1 Axelrod Gunnarson -1 Blood Cultist -1 Boris Devilboon -1 Marsh Goblins -1 Sanity Gnawers -1 Scar -1 Vicious Kavu -1 Nightscape Familiar -1 Countersquall -1 Gravelgill Axeshark -1 Ramses Overdark -1 Slinking Serpent -1 Urborg Drake -2 Sewn-Eye Drake -1 Afflict -1 Annihilate -1 Cremate -1 Last Caress -1 Mind Ravel -1 Scavenged Weaponry -1 Touch of Death -1 Raise Dead -1 Crypt Angel -[sideboard] diff --git a/res/quest/decks/Indiana Jones 2.dck b/res/quest/decks/Indiana Jones 2.dck deleted file mode 100644 index 34e86198495..00000000000 --- a/res/quest/decks/Indiana Jones 2.dck +++ /dev/null @@ -1,31 +0,0 @@ -Indiana Jones 2 -[general] -constructed -[main] -4 Underground Sea -8 Swamp -4 Badlands -4 Volcanic Island -4 Crumbling Necropolis -2 Mourning Thrull -3 Bad Moon -3 Vodalian Zombie -2 Concentrate -2 Dakmor Bat -2 Stone-Throwing Devils -3 Sedge Troll -1 Raise Dead -2 Sol'kanar the Swamp King -4 Smolder Initiate -1 Purraj of Urborg -1 Crypt Angel -1 Nightscape Familiar -1 Slave of Bolas -1 Sewn-Eye Drake -1 Kederekt Parasite -1 Elder Mastery -1 Fire-Field Ogre -1 Grixis Grimblade -2 Terminate -1 Countersquall -[sideboard] diff --git a/res/quest/decks/Indiana Jones 3.dck b/res/quest/decks/Indiana Jones 3.dck deleted file mode 100644 index 6050cb7300b..00000000000 --- a/res/quest/decks/Indiana Jones 3.dck +++ /dev/null @@ -1,35 +0,0 @@ -Indiana Jones 3 -[general] -constructed -[main] -4 Underground Sea -3 Polluted Delta -1 Sewn-Eye Drake -2 Blightning -3 Sedraxis Specter -2 Wasp Lancer -1 Ancestral Recall -1 Black Knight -1 Tidehollow Strix -2 Bad Moon -1 Mox Jet -3 Grixis Grimblade -4 Terminate -1 Zombie Outlander -3 Swamp -1 Mox Sapphire -2 Concentrate -2 Slave of Bolas -4 Badlands -3 Bloodstained Mire -1 Mox Ruby -3 Sedge Troll -2 Volcanic Island -2 Scalding Tarn -1 Goblin Outlander -2 Sol'kanar the Swamp King -1 Purraj of Urborg -1 Gwendlyn Di Corci -1 Nicol Bolas, Planeswalker -1 Tetsuo Umezawa -[sideboard] diff --git a/res/quest/decks/Jabba the Hut 3.dck b/res/quest/decks/Jabba the Hut 3.dck deleted file mode 100644 index 2231b5124ea..00000000000 --- a/res/quest/decks/Jabba the Hut 3.dck +++ /dev/null @@ -1,21 +0,0 @@ -Jabba the Hut 3 -[general] -constructed -[main] -3 Darksteel Axe -3 Hand of the Praetors -4 Ichorclaw Myr -3 Necropede -4 Plague Stinger -4 Phyrexian Crusader -3 Phyrexian Vatmother -2 Doom Blade -3 Counterspell -3 Corrupted Conscience -4 Despise -5 Island -7 Swamp -4 Darkslick Shores -4 Drowned Catacomb -4 Inkmoth Nexus -[sideboard] \ No newline at end of file diff --git a/res/quest/decks/Jack Sparrow 1.dck b/res/quest/decks/Jack Sparrow 1.dck deleted file mode 100644 index cfade9d2367..00000000000 --- a/res/quest/decks/Jack Sparrow 1.dck +++ /dev/null @@ -1,45 +0,0 @@ -Jack Sparrow 1 -[general] -constructed -[main] -1 Cloud Pirates -1 Water Wurm -1 Caller of Gales -1 Sea's Claim -1 Fear -1 Expedition Map -1 Talas Merchant -1 Talas Scout -1 School of Piranha -1 Drowned -1 Spreading Seas -1 Lingering Mirage -1 Cruel Edict -1 Rishadan Airship -1 Steam Frigate -1 Reef Pirates -1 Talas Warrior -1 Chambered Nautilus -1 Steam Frigate -1 Seasinger -1 Whispersilk Cloak -1 Scavenged Weaponry -1 Drag Down -1 Forced Retreat -1 Talas Air Ship -1 Screeching Drake -1 Giant Octopus -1 Narwhal -1 Coastal Piracy -2 Armored Galleon -2 Pirate Ship -1 Sandbar Serpent -1 Wu Admiral -1 Ramirez DePietro -11 Island -4 Swamp -2 Drowned Catacomb -3 Underground Sea -2 Watery Grave -2 Polluted Delta -[sideboard] diff --git a/res/quest/decks/Jack Sparrow 2.dck b/res/quest/decks/Jack Sparrow 2.dck deleted file mode 100644 index 489ff794bd0..00000000000 --- a/res/quest/decks/Jack Sparrow 2.dck +++ /dev/null @@ -1,25 +0,0 @@ -Jack Sparrow 2 -[general] -constructed -[main] -4 Cloud Pirates -2 Talas Scout -4 Spreading Seas -1 Cloak of Mists -1 Sunken City -2 Rishadan Airship -2 Steam Frigate -2 Reef Pirates -4 Talas Warrior -2 Whispersilk Cloak -2 Talas Air Ship -3 Coastal Piracy -2 Armored Galleon -4 Pirate Ship -1 Ramirez DePietro -10 Island -4 Drowned Catacomb -4 Underground Sea -3 Watery Grave -3 Polluted Delta -[sideboard] diff --git a/res/quest/decks/James Bond 1.dck b/res/quest/decks/James Bond 1.dck deleted file mode 100644 index 43127d9b8bb..00000000000 --- a/res/quest/decks/James Bond 1.dck +++ /dev/null @@ -1,35 +0,0 @@ -James Bond 1 -[general] -constructed -[main] -4 Elfhame Palace -4 Arctic Flats -4 Razorverge Thicket -6 Plains -4 Forest -4 Metallic Sliver -1 Plated Sliver -2 Virulent Sliver -1 Sidewinder Sliver -4 Woodland Changeling -1 Muscle Sliver -1 Sinew Sliver -1 Talon Sliver -1 Spinneret Sliver -1 Horned Sliver -1 Reflex Sliver -1 Watcher Sliver -1 Changeling Sentinel -1 Brood Sliver -1 Fungus Sliver -1 Lymph Sliver -1 Root Sliver -4 Venser's Sliver -2 Disenchant -2 Deglamer -1 Oust -2 Afterlife -1 Harmonize -1 Holy Strength -1 Reknit -[sideboard] diff --git a/res/quest/decks/James Bond 2.dck b/res/quest/decks/James Bond 2.dck deleted file mode 100644 index 4fde5f78fc5..00000000000 --- a/res/quest/decks/James Bond 2.dck +++ /dev/null @@ -1,32 +0,0 @@ -James Bond 2 -[general] -constructed -[main] -4 Savannah -4 Windswept Heath -4 Razorverge Thicket -6 Plains -4 Forest -4 Metallic Sliver -2 Plated Sliver -3 Virulent Sliver -2 Sidewinder Sliver -3 Muscle Sliver -2 Sinew Sliver -2 Talon Sliver -1 Spinneret Sliver -1 Horned Sliver -1 Reflex Sliver -1 Watcher Sliver -1 Essence Sliver -1 Might Sliver -1 Brood Sliver -1 Fungus Sliver -1 Lymph Sliver -1 Root Sliver -1 Venser's Sliver -2 Disenchant -2 Deglamer -4 Oust -1 Harmonize -[sideboard] diff --git a/res/quest/decks/James Bond 3.dck b/res/quest/decks/James Bond 3.dck deleted file mode 100644 index 7ea0046fcbb..00000000000 --- a/res/quest/decks/James Bond 3.dck +++ /dev/null @@ -1,28 +0,0 @@ -James Bond 3 -[general] -constructed -[main] -4 Savannah -4 Windswept Heath -4 Wooded Foothills -3 Razorverge Thicket -4 Plains -1 Forest -1 Mox Emerald -1 Mox Pearl -4 Plated Sliver -4 Virulent Sliver -4 Sidewinder Sliver -4 Muscle Sliver -4 Sinew Sliver -2 Talon Sliver -1 Spinneret Sliver -1 Horned Sliver -1 Reflex Sliver -1 Watcher Sliver -1 Essence Sliver -2 Might Sliver -4 Oblivion Ring -4 Path to Exile -1 Harmonize -[sideboard] diff --git a/res/quest/decks/James T Kirk 3.dck b/res/quest/decks/James T Kirk 3.dck deleted file mode 100644 index af0a545ee54..00000000000 --- a/res/quest/decks/James T Kirk 3.dck +++ /dev/null @@ -1,23 +0,0 @@ -James T Kirk 3 -[general] -constructed -[main] -3 Megrim -4 Liliana's Caress -4 Animate Dead -23 Swamp -4 Hymn to Tourach -4 Stupor -4 Wrench Mind -1 Deception -1 Mind Rot -1 Unhinge -1 Waking Nightmare -1 Nekrataal -1 Bone Shredder -2 Liliana Vess -2 Hypnotic Specter -1 Keening Banshee -2 Doom Blade -1 Go for the Throat -[sideboard] diff --git a/res/quest/decks/Joe Kidd 1.dck b/res/quest/decks/Joe Kidd 1.dck deleted file mode 100644 index 95a4d965126..00000000000 --- a/res/quest/decks/Joe Kidd 1.dck +++ /dev/null @@ -1,32 +0,0 @@ -Joe Kidd 1 -[general] -constructed -[main] -4 Arcane Sanctum -8 Swamp -8 Plains -2 Godless Shrine -2 Caves of Koilos -1 Orzhova, the Church of Deals -3 Beckon Apparition -3 Mourning Thrull -1 Pillory of the Sleepless -2 Nightsky Mimic -2 Harvest Gwyllion -1 Possessed Nomad -2 Voracious Hatchling -1 Shadow Lance -2 Agent of Masks -1 Castigate -3 Nip Gwyllion -1 Mournful Zombie -1 Haunted Angel -2 Bloodied Ghost -1 Righteous War -1 Edge of the Divinity -3 Gwyllion Hedge-Mage -1 Mortify -1 Restless Apparition -1 Tidehollow Sculler -1 Soul Link -[sideboard] diff --git a/res/quest/decks/Joe Kidd 2.dck b/res/quest/decks/Joe Kidd 2.dck deleted file mode 100644 index 0b239fcf111..00000000000 --- a/res/quest/decks/Joe Kidd 2.dck +++ /dev/null @@ -1,30 +0,0 @@ -Joe Kidd 2 -[general] -constructed -[main] -2 Mourning Thrull -1 Pillory of the Sleepless -4 Nightsky Mimic -4 Scrubland -2 Harvest Gwyllion -1 Death Grasp -1 Souls of the Faultless -4 Voracious Hatchling -4 Godless Shrine -2 Vindicate -1 Gerrard's Verdict -3 Nip Gwyllion -2 Gwyllion Hedge-Mage -1 Castigate -8 Swamp -2 Stillmoon Cavalier -8 Plains -1 Tidehollow Sculler -2 Culling Sun -2 Unmake -1 Restless Apparition -1 Edge of the Divinity -1 Agent of Masks -1 Mortify -1 Deathbringer Liege -[sideboard] diff --git a/res/quest/decks/Joe Kidd 3.dck b/res/quest/decks/Joe Kidd 3.dck deleted file mode 100644 index dc3ca868b76..00000000000 --- a/res/quest/decks/Joe Kidd 3.dck +++ /dev/null @@ -1,29 +0,0 @@ -Joe Kidd 3 -[general] -constructed -[main] -3 Mourning Thrull -5 Swamp -5 Plains -1 Stillmoon Cavalier -4 Nightsky Mimic -4 Scrubland -4 Marsh Flats -2 Harvest Gwyllion -1 Culling Sun -1 Mox Pearl -4 Voracious Hatchling -4 Godless Shrine -1 Angel of Despair -1 Death Grasp -2 Vindicate -3 Unmake -1 Mortify -1 Debtors' Knell -1 Mox Jet -2 Divinity of Pride -4 Gerrard's Verdict -1 Nip Gwyllion -1 Edge of the Divinity -4 Deathbringer Liege -[sideboard] diff --git a/res/quest/decks/Kang 2.dck b/res/quest/decks/Kang 2.dck deleted file mode 100644 index 459d39adba8..00000000000 --- a/res/quest/decks/Kang 2.dck +++ /dev/null @@ -1,27 +0,0 @@ -Kang 2 -[general] -constructed -[main] -2 Benthic Djinn -2 Dimir Cutpurse -2 Dimir Infiltrator -2 Esper Stormblade -2 Ghastlord of Fugue -2 Glen Elendra Liege -2 Gravelgill Duo -2 Grixis Grimblade -2 Inkfathom Infiltrator -2 Moroii -2 Shadowmage Infiltrator -2 Tidehollow Strix -2 Urborg Drake -2 Vodalian Zombie -2 Wasp Lancer -2 Dire Undercurrents -2 Recoil -2 Undermine -4 Darkslick Shores -4 Drowned Catacomb -8 Island -8 Swamp -[sideboard] \ No newline at end of file diff --git a/res/quest/decks/Kang 3.dck b/res/quest/decks/Kang 3.dck deleted file mode 100644 index af9304131e2..00000000000 --- a/res/quest/decks/Kang 3.dck +++ /dev/null @@ -1,20 +0,0 @@ -Kang 3 -[general] -constructed -[main] -4 Benthic Djinn -2 Ghastlord of Fugue -4 Glen Elendra Liege -4 Inkfathom Infiltrator -4 Shadowmage Infiltrator -4 Tidehollow Strix -4 Wasp Lancer -2 Dire Undercurrents -4 Recoil -4 Undermine -4 Creeping Tar Pit -4 Darkslick Shores -4 Drowned Catacomb -6 Island -6 Swamp -[sideboard] \ No newline at end of file diff --git a/res/quest/decks/King Arthur 1.dck b/res/quest/decks/King Arthur 1.dck deleted file mode 100644 index 61c1839b230..00000000000 --- a/res/quest/decks/King Arthur 1.dck +++ /dev/null @@ -1,38 +0,0 @@ -King Arthur 1 -[general] -constructed -[main] -3 Lionheart Maverick -1 Leonin Scimitar -1 Sylvok Lifestaff -1 One with Nature -1 Safewright Quest -3 Steward of Valeron -1 Knight of the White Orchid -1 Leonin Skyhunter -2 Llanowar Knight -1 Respite -1 Gerrard's Command -1 Journeyer's Kite -1 Knight of the Reliquary -2 Wilt-Leaf Cavaliers -1 Springjack Knight -1 Charging Paladin -1 Zhalfirin Knight -1 Stomp and Howl -1 Folk Medicine -2 Raven's Run Dragoon -1 Knight of New Alara -1 Moorish Cavalry -1 Wilt-Leaf Liege -1 Sidar Jabari -1 Rune-Cervin Rider -1 Trokin High Guard -1 Juniper Order Ranger -1 Plover Knights -1 Cyclical Evolution -10 Forest -10 Plains -2 Elfhame Palace -2 Graypelt Refuge -[sideboard] diff --git a/res/quest/decks/King Arthur 2.dck b/res/quest/decks/King Arthur 2.dck deleted file mode 100644 index c4ac565e147..00000000000 --- a/res/quest/decks/King Arthur 2.dck +++ /dev/null @@ -1,33 +0,0 @@ -King Arthur 2 -[general] -constructed -[main] -1 Lionheart Maverick -1 Student of Warfare -1 Adventuring Gear -1 Trusty Machete -2 Safewright Quest -4 Steward of Valeron -1 Knight of the White Orchid -1 Accorder Paladin -1 No-Dachi -1 Sigil Blessing -1 Reknit -2 Knight of the Reliquary -3 Wilt-Leaf Cavaliers -1 Skyhunter Cub -1 Asha's Favor -2 Kinsbaile Cavalier -2 Knight of New Alara -3 Wilt-Leaf Liege -1 Kabira Vindicator -1 Lead the Stampede -3 Juniper Order Ranger -1 Lightwielder Paladin -1 Mirari's Wake -2 Savannah -9 Forest -9 Plains -1 Elfhame Palace -3 Graypelt Refuge -[sideboard] diff --git a/res/quest/decks/King Arthur 3.dck b/res/quest/decks/King Arthur 3.dck deleted file mode 100644 index 3ef04d70147..00000000000 --- a/res/quest/decks/King Arthur 3.dck +++ /dev/null @@ -1,31 +0,0 @@ -King Arthur 3 -[general] -constructed -[main] -4 Steward of Valeron -2 Knight Exemplar -2 Knight of the White Orchid -2 Knight of the Reliquary -4 Wilt-Leaf Cavaliers -2 Knight of New Alara -2 Kinsbaile Cavalier -4 Wilt-Leaf Liege -4 Juniper Order Ranger -1 Sigil Blessing -1 Aura Shards -1 Armadillo Cloak -1 Behemoth Sledge -1 Shield of the Oversoul -1 Sigil of the Nayan Gods -1 Mirari's Wake -1 Hymn of Rebirth -1 Sword of Vengeance -1 Sword of Feast and Famine -1 Mox Emerald -1 Mox Pearl -4 Savannah -6 Forest -6 Plains -2 Elfhame Palace -4 Graypelt Refuge -[sideboard] diff --git a/res/quest/decks/King Edward 1.dck b/res/quest/decks/King Edward 1.dck deleted file mode 100644 index bde3fa5dc8d..00000000000 --- a/res/quest/decks/King Edward 1.dck +++ /dev/null @@ -1,32 +0,0 @@ -King Edward 1 -[general] -constructed -[main] -4 Arcane Sanctum -4 Birds of Paradise -4 Jungle Shrine -2 Lightning Elemental -2 Briarhorn -2 Shriekmaw -1 Tribal Flames -2 Harmonize -1 Beacon of Unrest -4 Seaside Citadel -2 Spark Elemental -2 Inner-Flame Acolyte -2 Cinderbones -2 Tithe -1 Thunder Spirit -4 Savage Lands -1 Breath of Life -4 Crumbling Necropolis -2 Naturalize -1 Greater Forgeling -3 Cloud Elemental -1 Bogardan Firefiend -1 Bramble Creeper -4 Brighthearth Banneret -1 Cultbrand Cinder -1 Earth Elemental -1 Lucent Liminid -[sideboard] diff --git a/res/quest/decks/King Edward 2.dck b/res/quest/decks/King Edward 2.dck deleted file mode 100644 index 2c2a4a54643..00000000000 --- a/res/quest/decks/King Edward 2.dck +++ /dev/null @@ -1,33 +0,0 @@ -King Edward 2 -[general] -constructed -[main] -2 Wooded Foothills -2 Scalding Tarn -1 Arid Mesa -3 Underground Sea -3 Taiga -1 Lightning Elemental -1 Air Elemental -2 Ashenmoor Gouger -2 Harmonize -3 Scrubland -3 Spark Elemental -2 Inner-Flame Acolyte -3 Cinderbones -3 Savannah -2 Cloud Elemental -2 Brute Force -4 Birds of Paradise -2 Briarhorn -2 Sickle Ripper -2 Tribal Flames -2 Thunder Spirit -3 Volcanic Island -4 Brighthearth Banneret -2 Fusion Elemental -1 Horde of Notions -1 Nova Chaser -1 Supreme Exemplar -1 Barishi -[sideboard] diff --git a/res/quest/decks/King Edward 3.dck b/res/quest/decks/King Edward 3.dck deleted file mode 100644 index 14209411cbf..00000000000 --- a/res/quest/decks/King Edward 3.dck +++ /dev/null @@ -1,43 +0,0 @@ -King Edward 3 -[general] -constructed -[main] -2 Plateau -2 Taiga -1 Tropical Island -1 Scrubland -1 Tundra -1 Badlands -2 Volcanic Island -3 Wooded Foothills -3 Scalding Tarn -3 Arid Mesa -1 Mox Emerald -1 Mox Pearl -1 Mox Jet -1 Mox Sapphire -1 Mox Ruby -1 Air Elemental -1 Mulldrifter -1 Ancestral Recall -1 Time Walk -2 Inner-Flame Acolyte -2 Spark Elemental -2 Naturalize -2 Meadowboon -2 Briarhorn -2 Shriekmaw -2 Concentrate -1 Darksteel Ingot -1 Sickle Ripper -1 Spawnwrithe -3 Tribal Flames -1 Thornling -1 Thunder Spirit -2 Horde of Notions -1 Nova Chaser -1 Supreme Exemplar -4 Brighthearth Banneret -2 Fusion Elemental -1 Morselhoarder -[sideboard] diff --git a/res/quest/decks/King Goldemar 1.dck b/res/quest/decks/King Goldemar 1.dck deleted file mode 100644 index e39118150ec..00000000000 --- a/res/quest/decks/King Goldemar 1.dck +++ /dev/null @@ -1,28 +0,0 @@ -King Goldemar 1 -[general] -constructed -[main] -17 Mountain -4 Kher Keep -4 Crimson Kobolds -4 Crookshank Kobolds -4 Kobold Drill Sergeant -4 Kobold Overlord -4 Kobold Taskmaster -4 Kobolds of Kher Keep -1 Artifact Blast -1 Crush -1 Fire Ambush -1 First Volley -1 Flare -1 Misguided Rage -1 Mob Justice -1 Pinpoint Avalanche -1 Victorious Destruction -1 Yawning Fissure -1 Bloodshed Fever -1 Bravado -1 Furious Assault -1 Onslaught -1 Sluggishness -[sideboard] diff --git a/res/quest/decks/King Kong 1.dck b/res/quest/decks/King Kong 1.dck deleted file mode 100644 index 9ecb2ee99b9..00000000000 --- a/res/quest/decks/King Kong 1.dck +++ /dev/null @@ -1,35 +0,0 @@ -King Kong 1 -[general] -constructed -[main] -4 Gilt-Leaf Palace -2 Arctic Flats -2 Elfhame Palace -2 Evolving Wilds -2 Terramorphic Expanse -8 Forest -2 Plains -2 Swamp -2 Deranged Hermit -3 Chatter of the Squirrel -3 Squirrel Nest -3 Acorn Harvest -1 Nut Collector -1 Krosan Beast -1 Changeling Hero -1 Moonglove Changeling -3 Avian Changeling -2 Ghostly Changeling -2 Skeletal Changeling -1 Enfeeblement -1 Cessation -1 Darksteel Ingot -1 Despondency -1 Greel's Caress -2 Druid's Call -3 Kodama's Reach -1 Bound in Silence -1 Clinging Darkness -1 Pacifism -1 Feebleness -[sideboard] diff --git a/res/quest/decks/King Kong 2.dck b/res/quest/decks/King Kong 2.dck deleted file mode 100644 index 890ce0582fb..00000000000 --- a/res/quest/decks/King Kong 2.dck +++ /dev/null @@ -1,29 +0,0 @@ -King Kong 2 -[general] -constructed -[main] -8 Forest -2 Plains -2 Swamp -4 Bayou -4 Savannah -2 Scrubland -1 Murmuring Bosk -1 Swarmyard -4 Deranged Hermit -4 Acorn Harvest -4 Squirrel Nest -4 Chatter of the Squirrel -4 Squirrel Mob -1 Nut Collector -1 Changeling Hero -1 Feebleness -3 Avian Changeling -4 Kodama's Reach -1 Skeletal Changeling -1 Enfeeblement -1 Ghostly Changeling -1 Spidersilk Armor -1 Putrefy -1 Mortify -[sideboard] diff --git a/res/quest/decks/King Kong 3.dck b/res/quest/decks/King Kong 3.dck deleted file mode 100644 index 5599a8eb492..00000000000 --- a/res/quest/decks/King Kong 3.dck +++ /dev/null @@ -1,35 +0,0 @@ -King Kong 3 -[general] -constructed -[main] -4 Savannah -4 Wooded Foothills -4 Taiga -4 Windswept Heath -4 Forest -1 Mox Emerald -1 Mox Ruby -1 Mox Pearl -1 Swarmyard -4 Deranged Hermit -1 Nut Collector -4 Squirrel Mob -1 Squirrel Nest -4 Acorn Harvest -4 Chatter of the Squirrel -1 Avian Changeling -1 Chameleon Colossus -1 Taurean Mauler -1 Woodland Changeling -1 Jacques le Vert -1 Crib Swap -1 Leyline of the Meek -1 Parallel Evolution -4 Lightning Helix -1 Aura Shards -1 Titanic Ultimatum -1 Captured Sunlight -1 Fracturing Gust -1 Spidersilk Armor -1 Kodama's Reach -[sideboard] diff --git a/res/quest/decks/Kojak 1.dck b/res/quest/decks/Kojak 1.dck deleted file mode 100644 index ada5c99a886..00000000000 --- a/res/quest/decks/Kojak 1.dck +++ /dev/null @@ -1,28 +0,0 @@ -Kojak 1 -[general] -constructed -[main] -4 Merrow Levitator -1 Spire Golem -4 Briarberry Cohort -2 Concentrate -2 Muddle the Mixture -1 Kami of the Crescent Moon -1 Sunken City -22 Island -1 Inundate -2 Boomerang -2 Eye of Nowhere -1 Dandan -4 Faerie Swarm -1 Manta Ray -2 Invisibility -1 Thalakos Seer -1 Flow of Ideas -1 Counterspell -1 Deepchannel Mentor -2 Serpent of the Endless Sea -2 Tidings -1 Amnesia -1 Harbor Serpent -[sideboard] diff --git a/res/quest/decks/Kojak 2.dck b/res/quest/decks/Kojak 2.dck deleted file mode 100644 index b5dcbb348f7..00000000000 --- a/res/quest/decks/Kojak 2.dck +++ /dev/null @@ -1,31 +0,0 @@ -Kojak 2 -[general] -constructed -[main] -22 Island -1 Sapphire Medallion -4 Briarberry Cohort -2 Deepchannel Mentor -3 Faerie Swarm -2 Inundate -2 Merrow Levitator -1 Sunken City -2 Flow of Ideas -1 Invisibility -2 Boomerang -2 Eye of Nowhere -2 Counterspell -1 Muddle the Mixture -2 Tidings -2 Concentrate -1 Kami of the Crescent Moon -1 Thalakos Seer -1 Dandân -1 Manta Ray -1 Serpent of the Endless Sea -1 Amnesia -1 Arcanis the Omnipotent -1 Sphinx of Magosi -1 Spire Golem -1 Harbor Serpent -[sideboard] diff --git a/res/quest/decks/Kojak 3.dck b/res/quest/decks/Kojak 3.dck deleted file mode 100644 index 59cdc9349de..00000000000 --- a/res/quest/decks/Kojak 3.dck +++ /dev/null @@ -1,27 +0,0 @@ -Kojak 3 -[general] -constructed -[main] -21 Island -1 Mox Sapphire -1 Sapphire Medallion -1 Ancestral Recall -1 Time Walk -2 Boomerang -2 Eye of Nowhere -4 Counterspell -2 Tidings -2 Concentrate -1 Kami of the Crescent Moon -1 Thalakos Seer -4 Briarberry Cohort -2 Deepchannel Mentor -3 Faerie Swarm -3 Inundate -1 Merrow Levitator -1 Sunken City -2 Flow of Ideas -1 Arcanis the Omnipotent -2 Sphinx of Magosi -1 Spire Golem -[sideboard] diff --git a/res/quest/decks/Lisa Simpson 2.dck b/res/quest/decks/Lisa Simpson 2.dck deleted file mode 100644 index 1998230ed26..00000000000 --- a/res/quest/decks/Lisa Simpson 2.dck +++ /dev/null @@ -1,30 +0,0 @@ -Lisa Simpson 2 -[general] -constructed -[main] -7 Forest -7 Plains -4 Savannah -4 Graypelt Refuge -3 Kjeldoran Outpost -4 Mycoloth -3 Skullmulcher -2 Doubling Season -1 Squirrel Nest -3 Reprisal -1 Chatter of the Squirrel -1 Aura Mutation -1 Beckon Apparition -1 Elspeth, Knight-Errant -1 Hunting Triad -1 Master's Call -3 Raise the Alarm -3 Awakening Zone -2 Growth Spasm -1 Kjeldoran Home Guard -1 Kozilek's Predator -3 Nest Invader -1 Ambassador Oak -1 Leyline of Vitality -1 Selesnya Guildmage -[sideboard] diff --git a/res/quest/decks/Luke Skywalker 3.dck b/res/quest/decks/Luke Skywalker 3.dck deleted file mode 100644 index 57f528fe581..00000000000 --- a/res/quest/decks/Luke Skywalker 3.dck +++ /dev/null @@ -1,22 +0,0 @@ -Luke Skywalker 3 -[general] -constructed -[main] -4 Flooded Strand -4 Tundra -4 Hallowed Fountain -9 Plains -1 Island -1 Mox Pearl -1 Mox Sapphire -3 Enlightened Tutor -1 Disenchant -4 Training Grounds -4 Swords to Plowshares -4 Ramosian Captain -4 Ramosian Lieutenant -4 Ramosian Commander -4 Ramosian Revivalist -4 Aven Riftwatcher -4 Cho-Manno, Revolutionary -[sideboard] diff --git a/res/quest/decks/Maggie Simpson 3.dck b/res/quest/decks/Maggie Simpson 3.dck deleted file mode 100644 index 5a39bdccda9..00000000000 --- a/res/quest/decks/Maggie Simpson 3.dck +++ /dev/null @@ -1,31 +0,0 @@ -Maggie Simpson 3 -[general] -constructed -[main] -1 Hellkite Overlord -2 Taiga -4 Wooded Foothills -1 Dragonmaster Outcast -1 Mox Emerald -1 Swamp -4 Jund Hackblade -4 Bituminous Blast -4 Savage Lands -1 Forest -3 Badlands -4 Bloodstained Mire -4 Blightning -1 Mox Ruby -4 Maelstrom Pulse -3 Scarland Thrinax -1 Emberstrike Duo -2 Bayou -4 Bloodbraid Elf -1 Tattermunge Duo -1 Broodmate Dragon -1 Mox Jet -2 Madrush Cyclops -4 Sprouting Thrinax -1 Woodlurker Mimic -1 Mountain -[sideboard] diff --git a/res/quest/decks/Magneto 3.dck b/res/quest/decks/Magneto 3.dck deleted file mode 100644 index 5e644a84f6d..00000000000 --- a/res/quest/decks/Magneto 3.dck +++ /dev/null @@ -1,20 +0,0 @@ -Magneto 3 -[general] -constructed -[main] -3 Big Game Hunter -3 Bone Shredder -3 Nekrataal -3 Shriekmaw -3 Dark Hatchling -3 Animate Dead -2 Puppeteer Clique -1 Beacon of Unrest -1 Liliana Vess -23 Swamp -1 Mox Jet -2 Ashen Powder -4 Go for the Throat -4 Horrifying Revelation -4 Hymn to Tourach -[sideboard] diff --git a/res/quest/decks/Magnum 1.dck b/res/quest/decks/Magnum 1.dck deleted file mode 100644 index 6205bd327c8..00000000000 --- a/res/quest/decks/Magnum 1.dck +++ /dev/null @@ -1,36 +0,0 @@ -Magnum 1 -[general] -constructed -[main] -3 Seaside Citadel -8 Island -7 Forest -2 Breeding Pool -2 Yavimaya Coast -1 Novijen, Heart of Progress -2 Skyshroud Forest -2 Temporal Spring -1 Cold-Eyed Selkie -2 Shielding Plax -2 Gaea's Skyfolk -1 Gilder Bairn -3 Trapjaw Kelpie -2 Slippery Bogle -1 Voidslime -2 Wistful Selkie -2 Sturdy Hatchling -2 Shorecrasher Mimic -1 Fable of Wolf and Owl -1 Murkfiend Liege -1 Lorescale Coatl -1 Favor of the Overbeing -2 Coiling Oracle -1 AEther Mutation -1 Biomantic Mastery -1 Groundling Pouncer -1 Jungle Barrier -1 Leafdrake Roost -2 Selkie Hedge-Mage -1 Vedalken Heretic -1 Living Airship -[sideboard] diff --git a/res/quest/decks/Magnum 2.dck b/res/quest/decks/Magnum 2.dck deleted file mode 100644 index 30e5751b25a..00000000000 --- a/res/quest/decks/Magnum 2.dck +++ /dev/null @@ -1,34 +0,0 @@ -Magnum 2 -[general] -constructed -[main] -4 Tropical Island -8 Island -2 Yavimaya Coast -5 Forest -2 Temporal Spring -2 Breeding Pool -2 Cold-Eyed Selkie -2 Assault Zeppelid -1 Shielding Plax -2 Gaea's Skyfolk -1 Yavimaya's Embrace -2 Trapjaw Kelpie -1 Jungle Barrier -1 Slippery Bogle -1 Selkie Hedge-Mage -1 Dryad Arbor -2 Wistful Selkie -1 Trygon Predator -3 Sturdy Hatchling -1 Leafdrake Roost -3 Shorecrasher Mimic -2 Favor of the Overbeing -1 Fable of Wolf and Owl -1 Vedalken Heretic -1 Jhessian Infiltrator -2 Lorescale Coatl -1 Voidslime -3 Murkfiend Liege -2 Coiling Oracle -[sideboard] diff --git a/res/quest/decks/Magnum 3.dck b/res/quest/decks/Magnum 3.dck deleted file mode 100644 index 0832ad3b63e..00000000000 --- a/res/quest/decks/Magnum 3.dck +++ /dev/null @@ -1,35 +0,0 @@ -Magnum 3 -[general] -constructed -[main] -2 Cold-Eyed Selkie -2 Assault Zeppelid -1 Mox Emerald -1 Shielding Plax -4 Tropical Island -4 Misty Rainforest -2 Gaea's Skyfolk -1 Mox Sapphire -1 Yavimaya's Embrace -3 Island -2 Slippery Bogle -3 Forest -4 Dryad Arbor -1 Wistful Selkie -1 Jungle Barrier -3 Temporal Spring -3 Sturdy Hatchling -1 Leafdrake Roost -1 Simic Sky Swallower -2 Breeding Pool -4 Shorecrasher Mimic -2 Favor of the Overbeing -1 Fable of Wolf and Owl -1 Overbeing of Myth -1 Vedalken Heretic -1 Jhessian Infiltrator -2 Lorescale Coatl -1 Voidslime -3 Murkfiend Liege -2 Coiling Oracle -[sideboard] diff --git a/res/quest/decks/Marge Simpson 2.dck b/res/quest/decks/Marge Simpson 2.dck deleted file mode 100644 index 785ecc01645..00000000000 --- a/res/quest/decks/Marge Simpson 2.dck +++ /dev/null @@ -1,33 +0,0 @@ -Marge Simpson 2 -[general] -constructed -[main] -8 Mountain -8 Forest -4 Stomping Ground -4 Wooded Foothills -1 Dragon Broodmother -1 Predator Dragon -2 Thunder-Thrash Elder -1 Skullmulcher -2 Mycoloth -1 Gorger Wurm -1 Thorn-Thrash Viashino -2 Doubling Season -1 Artifact Mutation -1 Violent Outburst -1 Squirrel Nest -1 Chatter of the Squirrel -1 Hunting Triad -2 Awakening Zone -2 Growth Spasm -1 Kozilek's Predator -2 Nest Invader -1 Ambassador Oak -1 Leyline of Vitality -1 Dragon Fodder -1 Empty the Warrens -4 Goblin Assault -3 Mogg War Marshal -2 Rukh Egg -[sideboard] diff --git a/res/quest/decks/Morpheus 3.dck b/res/quest/decks/Morpheus 3.dck deleted file mode 100644 index ef359a81be4..00000000000 --- a/res/quest/decks/Morpheus 3.dck +++ /dev/null @@ -1,22 +0,0 @@ -Morpheus 3 -[general] -constructed -[main] -21 Forest -1 Mox Emerald -4 Llanowar Elves -4 Imperious Perfect -4 Elvish Champion -4 Immaculate Magistrate -4 Elvish Archdruid -3 Nissa's Chosen -2 Nissa Revane -1 Timberwatch Elf -2 Elvish Visionary -1 Coat of Arms -2 Wellwisher -3 Sylvan Messenger -2 Wolf-Skull Shaman -1 Winnower Patrol -1 Eladamri, Lord of Leaves -[sideboard] diff --git a/res/quest/decks/Mr Slate 2.dck b/res/quest/decks/Mr Slate 2.dck deleted file mode 100644 index 5d37c237147..00000000000 --- a/res/quest/decks/Mr Slate 2.dck +++ /dev/null @@ -1,35 +0,0 @@ -Mr Slate 2 -[general] -constructed -[main] -4 Spreading Seas -2 Cold-Eyed Selkie -3 Kabira Crossroads -1 Mox Sapphire -2 Lord of Atlantis -3 Plains -2 Enclave Elite -6 Island -2 Merfolk Sovereign -1 Avian Changeling -4 Glacial Fortress -1 Inkfathom Divers -4 Echoing Truth -1 Merrow Harbinger -1 Mox Pearl -1 Deeptread Merrow -4 Tundra -4 Counterspell -3 Stonybrook Banneret -1 Stonybrook Schoolmaster -1 Sejiri Merfolk -1 Riptide Pilferer -1 Rootwater Hunter -1 Saprazzan Heir -1 Skywatcher Adept -1 Sygg, River Guide -1 Fallowsage -1 Frostwind Invoker -1 Galina's Knight -1 Merfolk Seer -[sideboard] diff --git a/res/quest/decks/Mr Slate 3.dck b/res/quest/decks/Mr Slate 3.dck deleted file mode 100644 index b112424ef35..00000000000 --- a/res/quest/decks/Mr Slate 3.dck +++ /dev/null @@ -1,23 +0,0 @@ -Mr Slate 3 -[general] -constructed -[main] -4 Spreading Seas -3 Cold-Eyed Selkie -3 Kabira Crossroads -1 Mox Sapphire -4 Lord of Atlantis -3 Plains -2 Enclave Elite -6 Island -4 Merfolk Sovereign -3 Avian Changeling -4 Glacial Fortress -4 Echoing Truth -1 Mox Pearl -4 Tundra -4 Counterspell -4 Stonybrook Banneret -1 Stonybrook Schoolmaster -4 Sejiri Merfolk -[sideboard] diff --git a/res/quest/decks/Nagini 2.dck b/res/quest/decks/Nagini 2.dck deleted file mode 100644 index ec3c7fd8db5..00000000000 --- a/res/quest/decks/Nagini 2.dck +++ /dev/null @@ -1,27 +0,0 @@ -Nagini 2 -[general] -constructed -[main] -2 Tangle Asp|5DN -2 River Boa|ZEN -2 Mire Boa|PLC -2 Ohran Viper|CSP -2 Kashi-Tribe Elite|SOK -2 Orochi Ranger|CHK -2 Sosuke's Summons|BOK -2 Kashi-Tribe Warriors|CHK -2 Death-Hood Cobra|NPH -1 Overwhelming Stampede|M11 -1 Needle Storm|9ED -2 Stonewood Invocation|TSP -2 Seshiro the Anointed|CHK -2 Sakura-Tribe Elder|CHK -1 Sachi, Daughter of Seshiro|CHK -1 Boa Constrictor|MMQ -2 Hornet Cobra|LEG -20 Forest|MBS -2 Kashi-Tribe Reaver|CHK -1 Whirlwind|S99 -4 Verdant Catacombs|ZEN -3 Sosuke, Son of Seshiro|CHK -[sideboard] diff --git a/res/quest/decks/Napoleon 3.dck b/res/quest/decks/Napoleon 3.dck deleted file mode 100644 index 6efa61f8d0c..00000000000 --- a/res/quest/decks/Napoleon 3.dck +++ /dev/null @@ -1,33 +0,0 @@ -Napoleon 3 -[general] -constructed -[main] -3 Angelic Wall -1 Mox Emerald -2 Swamp -4 Shield Sphere -1 Plains -2 Stalwart Shield-Bearers -1 Darksteel Ingot -4 Rolling Stones -1 Forest -3 Scrubland -4 Windswept Heath -1 Mox Pearl -2 Perimeter Captain -4 Bayou -2 Vindicate -1 Convalescent Care -2 Phyrexian Walker -4 Wall of Blossoms -1 Convalescence -3 Savannah -1 Vine Trellis -1 Mox Jet -3 Doran, the Siege Tower -1 Wall of Ice -3 Wall of Omens -1 Wall of Vines -1 Wall of Reverence -3 Retribution of the Meek -[sideboard] diff --git a/res/quest/decks/Ned Flanders 1.dck b/res/quest/decks/Ned Flanders 1.dck deleted file mode 100644 index 64c86bbd818..00000000000 --- a/res/quest/decks/Ned Flanders 1.dck +++ /dev/null @@ -1,31 +0,0 @@ -Ned Flanders 1 -[general] -constructed -[main] -1 Cranial Extraction -1 Nightmare -1 Chill to the Bone -1 Ghostly Visit -1 Soul Feast -4 Buried Alive -4 Beacon of Unrest -1 Sengir Vampire -2 Entomb -2 Coercion -1 Skeletal Wurm -1 Ebon Dragon -1 Vicious Hunger -1 Perish the Thought -4 Zombify -22 Swamp -1 Living Death -1 Stronghold Discipline -1 Hand of Death -1 Douse in Gloom -1 Last Caress -1 Cruel Edict -2 Night's Whisper -2 Delirium Skeins -1 Teeka's Dragon -1 Laquatus's Champion -[sideboard] diff --git a/res/quest/decks/Ned Flanders 2.dck b/res/quest/decks/Ned Flanders 2.dck deleted file mode 100644 index e0dcffbe71e..00000000000 --- a/res/quest/decks/Ned Flanders 2.dck +++ /dev/null @@ -1,23 +0,0 @@ -Ned Flanders 2 -[general] -constructed -[main] -1 Hellkite Overlord -4 Zombify -22 Swamp -2 Terror -1 Douse in Gloom -2 Last Caress -4 Buried Alive -4 Night's Whisper -1 Avatar of Woe -4 Beacon of Unrest -4 Animate Dead -4 Entomb -1 Smother -1 Angel of Despair -2 Delirium Skeins -2 Doom Blade -1 Simic Sky Swallower -2 Infest -[sideboard] diff --git a/res/quest/decks/Ned Flanders 3.dck b/res/quest/decks/Ned Flanders 3.dck deleted file mode 100644 index 2c5fb87f004..00000000000 --- a/res/quest/decks/Ned Flanders 3.dck +++ /dev/null @@ -1,25 +0,0 @@ -Ned Flanders 3 -[general] -constructed -[main] -1 Hellkite Overlord -21 Swamp -4 Hymn to Tourach -1 Terror -1 Sinkhole -1 Eyeblight's Ending -1 It That Betrays -1 Reanimate -2 Zombify -4 Buried Alive -4 Night's Whisper -4 Exhume -1 Pestilence Demon -4 Animate Dead -4 Entomb -1 Smother -1 Inkwell Leviathan -1 Doom Blade -1 Mox Jet -2 Infest -[sideboard] diff --git a/res/quest/decks/Ned Flanders 4.dck b/res/quest/decks/Ned Flanders 4.dck deleted file mode 100644 index 70345ae48ab..00000000000 --- a/res/quest/decks/Ned Flanders 4.dck +++ /dev/null @@ -1,25 +0,0 @@ -Ned Flanders 4 -[general] -constructed -[main] -1 Blazing Archon -21 Swamp -4 Hymn to Tourach -1 Terror -1 Sinkhole -1 Eyeblight's Ending -1 Akroma, Angel of Wrath -1 Reanimate -2 Zombify -4 Buried Alive -4 Night's Whisper -4 Exhume -1 Sphinx of the Steel Wind -4 Animate Dead -4 Entomb -1 Go for the Throat -1 Inkwell Leviathan -1 Doom Blade -1 Mox Jet -2 Infest -[sideboard] diff --git a/res/quest/decks/Neo 3.dck b/res/quest/decks/Neo 3.dck deleted file mode 100644 index ce6abce86d7..00000000000 --- a/res/quest/decks/Neo 3.dck +++ /dev/null @@ -1,26 +0,0 @@ -Neo 3 -[general] -constructed -[main] -4 Taiga -4 Wooded Foothills -4 Copperline Gorge -1 Raging Ravine -4 Forest -4 Mountain -1 Mox Emerald -1 Mox Ruby -4 Jund Hackblade -4 Naya Hushblade -2 Rip-Clan Crasher -4 Boggart Ram-Gang -2 Tattermunge Duo -3 Vithian Renegades -4 Boartusk Liege -4 Bloodbraid Elf -2 Rumbling Slum -2 Spellbreaker Behemoth -1 Sarkhan Vol -3 Runes of the Deus -2 Deus of Calamity -[sideboard] diff --git a/res/quest/decks/Newton 3.dck b/res/quest/decks/Newton 3.dck deleted file mode 100644 index 8834735d73b..00000000000 --- a/res/quest/decks/Newton 3.dck +++ /dev/null @@ -1,16 +0,0 @@ -Newton 3 -[general] -constructed -[main] -4 Marsh Flats -4 Scrubland -4 Godless Shrine -4 Plains -6 Swamp -1 Mox Jet -1 Mox Pearl -24 Relentless Rats -4 Vindicate -4 Thrumming Stone -4 Swords to Plowshares -[sideboard] diff --git a/res/quest/decks/Oberon 1.dck b/res/quest/decks/Oberon 1.dck deleted file mode 100644 index fd23c1b3303..00000000000 --- a/res/quest/decks/Oberon 1.dck +++ /dev/null @@ -1,31 +0,0 @@ -Oberon 1 -[general] -constructed -[main] -2 Briarberry Cohort|SHM -2 Faerie Swarm|SHM -2 Nightshade Schemers|MOR -1 Dire Undercurrents|SHM -1 Biting Tether|SHM -3 Ringskipper|LRW -8 Swamp|MBS -1 Puppeteer Clique|SHM -3 Oona's Gatewarden|SHM -2 Violet Pall|MOR -3 Dewdrop Spy|MOR -2 Zephyr Net|LRW -2 Faerie Trickery|LRW -4 Drowned Catacomb|M11 -1 Scion of Oona|LRW -2 Faerie Harbinger|LRW -2 Nightshade Stinger|LRW -1 Wasp Lancer|SHM -8 Island|MBS -4 Secluded Glen|LRW -1 Glen Elendra Liege|SHM -1 Familiar's Ruse|LRW -1 Final-Sting Faerie|MOR -1 Dreamspoiler Witches|LRW -1 Wydwen, the Biting Gale|LRW -1 Peppersmoke|LRW -[sideboard] diff --git a/res/quest/decks/Oberon 2.dck b/res/quest/decks/Oberon 2.dck deleted file mode 100644 index b54d3698d72..00000000000 --- a/res/quest/decks/Oberon 2.dck +++ /dev/null @@ -1,35 +0,0 @@ -Oberon 2 -[general] -constructed -[main] -2 Briarberry Cohort|SHM -1 Faerie Swarm|SHM -1 Bitterblossom|MOR -2 Nightshade Schemers|MOR -1 Dire Undercurrents|SHM -1 Biting Tether|SHM -2 Ringskipper|LRW -8 Swamp|MBS -1 Puppeteer Clique|SHM -1 Vendilion Clique|MOR -1 Oona's Gatewarden|SHM -2 Violet Pall|MOR -1 Dewdrop Spy|MOR -2 Zephyr Net|LRW -2 Faerie Trickery|LRW -4 Drowned Catacomb|M11 -2 Scion of Oona|LRW -1 Faerie Harbinger|LRW -2 Nightshade Stinger|LRW -1 Glen Elendra Archmage|EVE -1 Wasp Lancer|SHM -8 Island|MBS -4 Secluded Glen|LRW -1 Glen Elendra Liege|SHM -2 Familiar's Ruse|LRW -1 Final-Sting Faerie|MOR -2 Mistbind Clique|LRW -2 Sower of Temptation|LRW -1 Wydwen, the Biting Gale|LRW -1 Sprite Noble|TSP -[sideboard] diff --git a/res/quest/decks/Oberon 3.dck b/res/quest/decks/Oberon 3.dck deleted file mode 100644 index 00a4be7b83b..00000000000 --- a/res/quest/decks/Oberon 3.dck +++ /dev/null @@ -1,20 +0,0 @@ -Oberon 3 -[general] -constructed -[main] -4 Scion of Oona|LRW -4 Drowned Catacomb|M11 -4 Bitterblossom|MOR -4 Wasp Lancer|SHM -8 Island|MBS -4 Glen Elendra Liege|SHM -4 Secluded Glen|LRW -8 Swamp|MBS -1 Vendilion Clique|MOR -4 Despise|NPH -2 Jace Beleren|M11 -4 Violet Pall|MOR -4 Sower of Temptation|LRW -1 Wydwen, the Biting Gale|LRW -4 Faerie Trickery|LRW -[sideboard] diff --git a/res/quest/decks/Odin 3.dck b/res/quest/decks/Odin 3.dck deleted file mode 100644 index 2d1d6b53bc8..00000000000 --- a/res/quest/decks/Odin 3.dck +++ /dev/null @@ -1,20 +0,0 @@ -Odin 3 -[general] -constructed -[main] -4 Augury Adept -4 Bant Sureblade -2 Esper Cormorants -4 Esper Stormblade -4 Sky Hussar -4 Thistledown Liege -2 Grand Arbiter Augustin IV -4 Absorb -4 Curse of Chains -4 Steel of the Godhead -4 Celestial Colonnade -4 Glacial Fortress -6 Island -6 Plains -4 Seachrome Coast -[sideboard] \ No newline at end of file diff --git a/res/quest/decks/Optimus Prime 3.dck b/res/quest/decks/Optimus Prime 3.dck deleted file mode 100644 index 2e146957d83..00000000000 --- a/res/quest/decks/Optimus Prime 3.dck +++ /dev/null @@ -1,19 +0,0 @@ -Optimus Prime 3 -[general] -constructed -[main] -4 Counterspell|7ED -4 Arcbound Worker|DST -4 Misty Rainforest|ZEN -1 Mox Opal|SOM -4 Tezzeret's Gambit|NPH -4 Steel Overseer|M11 -1 Mox Sapphire|2ED -4 Arcbound Slith|DST -18 Island|MBS -4 Steady Progress|SOM -2 Arcbound Crusher|DST -4 Arcbound Stinger|DST -2 Contagion Engine|SOM -4 Vapor Snag|NPH -[sideboard] diff --git a/res/quest/decks/Pebbles Flintstone 2.dck b/res/quest/decks/Pebbles Flintstone 2.dck deleted file mode 100644 index 9d63da901af..00000000000 --- a/res/quest/decks/Pebbles Flintstone 2.dck +++ /dev/null @@ -1,40 +0,0 @@ -Pebbles Flintstone 2 -[general] -constructed -[main] -1 Armored Griffin -1 Tempest Drake -1 Radiant, Archangel -1 Riptide Crab -4 Coastal Tower -1 Skyshroud Falcon -4 Blinding Light -1 Shu General -5 Island -1 Herald of Serra -1 Zephyr Falcon -1 Nightguard Patrol -1 Skyhunter Prowler -1 Theft of Dreams -4 Tundra -1 Alaborn Grenadier -1 Serra Angel -1 Shepherd of the Lost -1 Courier Hawk -3 Marble Titan -1 Diving Griffin -7 Plains -2 Guan Yu's 1,000-Li March -1 Bay Falcon -1 Yotian Soldier -4 Meekstone -1 Razor Golem -1 Standing Troops -1 Angel of Light -1 Border Patrol -1 Borrowing 100,000 Arrows -1 Serra Avenger -1 Griffin Sentinel -1 Castle -1 Juntu Stakes -[sideboard] diff --git a/res/quest/decks/Pebbles Flintstone 3.dck b/res/quest/decks/Pebbles Flintstone 3.dck deleted file mode 100644 index 25ec79c0a81..00000000000 --- a/res/quest/decks/Pebbles Flintstone 3.dck +++ /dev/null @@ -1,40 +0,0 @@ -Pebbles Flintstone 3 -[general] -constructed -[main] -1 Tempest Drake -1 Armored Griffin -1 Radiant, Archangel -4 Sejiri Refuge -1 Riptide Crab -4 Coastal Tower -4 Blinding Light -1 Shu General -1 Absorb -3 Island -1 Herald of Serra -1 Skyhunter Prowler -1 Mox Pearl -4 Tundra -1 Shepherd of the Lost -1 Serra Angel -1 Courier Hawk -3 Marble Titan -1 Diving Griffin -1 Jhovall Queen -1 Honor of the Pure -1 Castle -1 Kismet -1 Frozen AEther -1 Kazandu Blademaster -1 Mox Sapphire -4 Plains -3 Guan Yu's 1,000-Li March -4 Meekstone -1 Standing Troops -1 Border Patrol -3 Serra Avenger -1 Griffin Sentinel -1 Zhang Fei, Fierce Warrior -1 Reverence -[sideboard] diff --git a/res/quest/decks/Picard 3.dck b/res/quest/decks/Picard 3.dck deleted file mode 100644 index bae5ec19b58..00000000000 --- a/res/quest/decks/Picard 3.dck +++ /dev/null @@ -1,34 +0,0 @@ -Picard 3 -[general] -constructed -[main] -2 Wellwisher -1 Mox Emerald -4 Tropical Island -3 Immaculate Magistrate -1 Island -1 Ancestral Recall -1 Mox Pearl -4 Tundra -4 Savannah -3 Imperious Perfect -2 Essence Warden -3 Gaea's Skyfolk -1 Mox Sapphire -2 Plains -2 Sylvan Messenger -1 Wolf-Skull Shaman -3 Forest -1 Winnower Patrol -1 Timberwatch Elf -1 Rune-Cervin Rider -3 Llanowar Elves -3 Safehold Elite -1 Rhys the Redeemed -4 Wilt-Leaf Cavaliers -1 Tolsimir Wolfblood -4 Wilt-Leaf Liege -1 Elvish Vanguard -1 Time Walk -1 Coiling Oracle -[sideboard] diff --git a/res/quest/decks/Pinky and the Brain 2.dck b/res/quest/decks/Pinky and the Brain 2.dck deleted file mode 100644 index a42f54c0202..00000000000 --- a/res/quest/decks/Pinky and the Brain 2.dck +++ /dev/null @@ -1,33 +0,0 @@ -Pinky and the Brain 2 -[general] -constructed -[main] -4 Royal Assassin -4 King's Assassin -3 Steam Catapult -8 Swamp -8 Plains -4 Scrubland -4 Marsh Flats -3 Kismet -2 Disenchant -1 Masako the Humorless -1 Aysen Bureaucrats -1 Benalish Trapper -1 Blinding Mage -1 Errant Doomsayers -1 Goldmeadow Harrier -1 Kor Line-Slinger -1 Master Decoy -1 Rathi Trapper -1 Squall Drifter -1 Whipcorder -1 Minister of Impediments -1 Silkbind Faerie -1 Abyssal Hunter -1 Ballynock Trapper -1 Ostiary Thrull -1 Harrier Griffin -1 Kitsune Dawnblade -1 Loxodon Mystic -[sideboard] diff --git a/res/quest/decks/Pointy Haired Boss 3.dck b/res/quest/decks/Pointy Haired Boss 3.dck deleted file mode 100644 index c261d5fd025..00000000000 --- a/res/quest/decks/Pointy Haired Boss 3.dck +++ /dev/null @@ -1,29 +0,0 @@ -Pointy Haired Boss 3 -[general] -constructed -[main] -3 Perimeter Captain -4 Wall of Denial -3 Wall of Tears -3 Mana Leak -2 Miscalculation -3 Disruptive Student -3 Disruptive Pitmage -3 Sunscape Master -1 Seedborn Muse -2 Hokori, Dust Drinker -2 Winter Orb -1 Ajani Goldmane -1 Garruk Wildspeaker -3 Birds of Paradise -3 Noble Hierarch -1 Mox Emerald -1 Mox Pearl -1 Mox Sapphire -3 Forest -1 Plains -4 Savannah -4 Tropical Island -4 Tundra -4 Undiscovered Paradise -[sideboard] diff --git a/res/quest/decks/Princess Selenia 1.dck b/res/quest/decks/Princess Selenia 1.dck deleted file mode 100644 index aa7f721ac7b..00000000000 --- a/res/quest/decks/Princess Selenia 1.dck +++ /dev/null @@ -1,26 +0,0 @@ -Princess Selenia 1 -[general] -constructed -[main] -4 Savage Lands -4 Seaside Citadel -4 Terramorphic Expanse -4 Frost Marsh -4 Forest -3 Island -1 Swamp -4 Song of Serenity -4 Wanderlust -3 Aura Gnarlid -3 Yavimaya Enchantress -1 Maddening Wind -2 Curse of Chains -1 Followed Footsteps -2 Paralyzing Grasp -2 Narcolepsy -2 Slow Motion -4 Stupefying Touch -4 Parasitic Bond -3 Soul Bleed -3 Wall of Putrid Flesh -[sideboard] diff --git a/res/quest/decks/Professor X 2.dck b/res/quest/decks/Professor X 2.dck deleted file mode 100644 index 98dc284697a..00000000000 --- a/res/quest/decks/Professor X 2.dck +++ /dev/null @@ -1,50 +0,0 @@ -Professor X 2 -[general] -constructed -[main] -4 Arcane Sanctum -3 Sejiri Refuge -2 Jwar Isle Refuge -4 Ancient Den -4 Seat of the Synod -4 Vault of Whispers -1 Courier's Capsule -1 Court Homunculus -1 Cumber Stone -1 Darklit Gargoyle -1 Dispeller's Capsule -1 Enigma Sphinx -1 Esper Battlemage -1 Esper Cormorants -1 Esper Stormblade -1 Ethercaste Knight -1 Etherium Abomination -1 Etherium Sculptor -1 Ethersworn Adjudicator -1 Executioner's Capsule -1 Faerie Mechanist -1 Filigree Angel -1 Glassdust Hulk -1 Glaze Fiend -1 Mask of Riddles -1 Master of Etherium -1 Metallurgeon -1 Parasitic Strix -1 Porcelain Legionnaire -1 Salvage Slasher -1 Sanctum Gargoyle -1 Scourglass -1 Sharding Sphinx -1 Sharuum the Hegemon -1 Sludge Strider -1 Sphinx Sovereign -1 Sphinx Summoner -1 Sphinx of the Steel Wind -1 Steelclad Serpent -1 Thoughtcutter Agent -1 Tidehollow Sculler -1 Tidehollow Strix -1 Tower Gargoyle -1 Vedalken Outlander -1 Windwright Mage -[sideboard] diff --git a/res/quest/decks/Professor X 3.dck b/res/quest/decks/Professor X 3.dck deleted file mode 100644 index ede4f3dd198..00000000000 --- a/res/quest/decks/Professor X 3.dck +++ /dev/null @@ -1,43 +0,0 @@ -Professor X 3 -[general] -constructed -[main] -2 Underground Sea -2 Polluted Delta -1 Scrubland -1 Marsh Flats -2 Tundra -2 Flooded Strand -1 Ancient Den -3 Seat of the Synod -1 Vault of Whispers -1 Mox Jet -1 Mox Sapphire -1 Mox Pearl -1 Mox Opal -4 Arcane Sanctum -3 Court Homunculus -1 Executioner's Capsule -1 Dispeller's Capsule -4 Esper Stormblade -4 Etherium Sculptor -1 Glaze Fiend -1 Mask of Riddles -1 Salvage Slasher -1 Tidehollow Strix -1 Scepter of Fugue -4 Master of Etherium -1 Sanctum Gargoyle -1 Cumber Stone -1 Esper Cormorants -1 Scepter of Insight -1 Sludge Strider -1 Tower Gargoyle -2 Scourglass -1 Sphinx Summoner -1 Glassdust Hulk -1 Ethersworn Adjudicator -1 Enigma Sphinx -1 Filigree Angel -1 Sharuum the Hegemon -[sideboard] diff --git a/res/quest/decks/R2-D2 3.dck b/res/quest/decks/R2-D2 3.dck deleted file mode 100644 index 7299f8f35d3..00000000000 --- a/res/quest/decks/R2-D2 3.dck +++ /dev/null @@ -1,22 +0,0 @@ -R2-D2 3 -[general] -constructed -[main] -20 Island -1 The Tabernacle at Pendrell Vale -1 Mox Sapphire -4 Evacuation -4 Upheaval -4 Trinket Mage -4 Black Vise -1 Echoing Truth -3 Boomerang -1 Repulse -4 Hoodwink -3 Words of Wisdom -1 Ancestral Recall -4 Vision Skeins -3 Howling Mine -1 Remand -1 Frozen AEther -[sideboard] diff --git a/res/quest/decks/Radagast 2.dck b/res/quest/decks/Radagast 2.dck deleted file mode 100644 index 4bfea282ca0..00000000000 --- a/res/quest/decks/Radagast 2.dck +++ /dev/null @@ -1,23 +0,0 @@ -Radagast 2 -[general] -constructed -[main] -23 Forest -4 Muraganda Petroglyphs -2 Hornet Sting -2 Hurricane -1 Needle Storm -1 Momentous Fall -4 Elvish Warrior -4 Leatherback Baloth -3 Gnarled Mass -3 Trained Armodon -3 Call of the Herd -1 Beacon of Creation -3 Imperiosaur -2 Bestial Menace -1 Beast Attack -1 Moss Monster -1 Silverback Ape -1 Craw Wurm -[sideboard] diff --git a/res/quest/decks/Radiant 3.dck b/res/quest/decks/Radiant 3.dck deleted file mode 100644 index 04f93bbb187..00000000000 --- a/res/quest/decks/Radiant 3.dck +++ /dev/null @@ -1,39 +0,0 @@ -Radiant 3 -[general] -constructed -[main] -2 Plains -2 Island -4 Tundra -4 Sejiri Refuge -4 Glacial Fortress -4 Flooded Strand -1 Mox Sapphire -1 Mox Pearl -2 Radiant, Archangel -2 Soulcatcher -3 Archon of Redemption -3 Pride of the Clouds -1 Angelic Curator -1 Araba Mothrider -1 Aven Riftwatcher -1 Azorius First-Wing -1 Serra Avenger -1 Cloud Elemental -1 Cloud of Faeries -1 Cloud Spirit -1 Commander Eesha -1 Courier Hawk -1 Divinity of Pride -1 Emeria Angel -1 Esper Cormorants -1 Hunted Lammasu -1 Iridescent Angel -1 Keiga, the Tide Star -1 Serendib Efreet -1 Stormscape Familiar -1 Spectral Procession -1 Serra Aviary -4 Moat -4 Gravitational Shift -[sideboard] diff --git a/res/quest/decks/Ratbert 2.dck b/res/quest/decks/Ratbert 2.dck deleted file mode 100644 index 517f932c1ae..00000000000 --- a/res/quest/decks/Ratbert 2.dck +++ /dev/null @@ -1,26 +0,0 @@ -Ratbert 2 -[general] -constructed -[main] -23 Swamp -4 Thran Lens -1 Dread -1 Gluttonous Zombie -1 Guiltfeeder -1 Lingering Tormentor -3 Nezumi Cutthroat -2 Order of Yawgmoth -2 Prickly Boggart -2 Severed Legion -1 Dross Prowler -1 Razortooth Rats -3 Shriekmaw -1 Woebearer -3 Halo Hunter -1 Crowd of Cinders -4 Dross Golem -1 Geth, Lord of the Vault -2 Wrench Mind -2 Death Stroke -1 Grasp of Darkness -[sideboard] diff --git a/res/quest/decks/Redwall 2.dck b/res/quest/decks/Redwall 2.dck deleted file mode 100644 index 663294d88a9..00000000000 --- a/res/quest/decks/Redwall 2.dck +++ /dev/null @@ -1,18 +0,0 @@ -Redwall 2 -[general] -constructed -[main] -4 Lightning Bolt|M11 -3 Pyroclasm|M11 -4 AEther Membrane|PLC -20 Mountain|MBS -4 Rage Nimbus|ROE -3 Goblin Charbelcher|MRD -4 Terramorphic Expanse|M11 -4 Vent Sentinel|ROE -1 Meekstone|7ED -1 Ensnaring Bridge|8ED -4 Wall of Razors|STH -4 Ogre Sentry|ROE -4 Steel Wall|MRD -[sideboard] \ No newline at end of file diff --git a/res/quest/decks/Riddler 3.dck b/res/quest/decks/Riddler 3.dck deleted file mode 100644 index d4d4d8dc3eb..00000000000 --- a/res/quest/decks/Riddler 3.dck +++ /dev/null @@ -1,27 +0,0 @@ -Riddler 3 -[general] -constructed -[main] -4 Arid Mesa -4 Plateau -4 Windswept Heath -5 Plains -5 Mountain -1 Mox Pearl -1 Mox Ruby -4 Spitemare -4 Swans of Bryn Argoll -3 Deep-Slumber Titan -3 Stuffy Doll -4 Wall of Hope -1 Cinder Giant -1 Subterranean Spirit -2 AEther Flash -1 Caltrops -1 Powerstone Minefield -3 Pyrohemia -4 Pyroclasm -2 Volcanic Fallout -2 Tremor -1 Chain Reaction -[sideboard] diff --git a/res/quest/decks/Riddler 4.dck b/res/quest/decks/Riddler 4.dck deleted file mode 100644 index d1997687fb5..00000000000 --- a/res/quest/decks/Riddler 4.dck +++ /dev/null @@ -1,22 +0,0 @@ -Riddler 4 -[general] -constructed -[main] -4 Arid Mesa -4 Plateau -4 Windswept Heath -3 Scalding Tarn -6 Plains -1 Mountain -4 Spitemare -4 Swans of Bryn Argoll -4 Stuffy Doll -4 Wall of Hope -4 Guilty Conscience -4 Pyroclasm -4 Volcanic Fallout -2 Tremor -2 Chain Reaction -4 Enlightened Tutor -2 Idyllic Tutor -[sideboard] diff --git a/res/quest/decks/Rocky 1.dck b/res/quest/decks/Rocky 1.dck deleted file mode 100644 index 30babbc20d1..00000000000 --- a/res/quest/decks/Rocky 1.dck +++ /dev/null @@ -1,37 +0,0 @@ -Rocky 1 -[general] -constructed -[main] -4 Jungle Shrine -2 Beasts of Bogardan -1 Air Elemental -3 Plains -2 Darksteel Ingot -3 Island -1 Threaten -2 Oraxid -3 Repentant Blacksmith -2 Galina's Knight -2 Disciple of Law -2 Talon Trooper -1 Shield Wall -1 Guided Strike -3 Freewind Falcon -4 Coastal Tower -4 Crumbling Necropolis -1 Vulshok Refugee -4 Mountain -2 Vedalken Outlander -2 Hazerider Drake -1 Defender of Law -1 Volcanic Fallout -1 Pyroclasm -1 Tremor -1 Flamebreak -1 Desert Sandstorm -1 Devastate -1 Whipflare -1 Steam Blast -1 Hindering Light -1 Orcish Mine -[sideboard] diff --git a/res/quest/decks/Rocky 2.dck b/res/quest/decks/Rocky 2.dck deleted file mode 100644 index 2b284908be1..00000000000 --- a/res/quest/decks/Rocky 2.dck +++ /dev/null @@ -1,51 +0,0 @@ -Rocky 2 -[general] -constructed -[main] -4 Ancient Amphitheater -4 Jungle Shrine -4 Crumbling Necropolis -2 Glacial Fortress -1 Shivan Reef -2 Terramorphic Expanse -2 Evolving Wilds -3 Mountain -2 Plains -2 Island -1 Flamebreak -1 Chain Reaction -1 Task Mage Assembly -1 Desert Sandstorm -1 Devastate -1 Magma Giant -1 Pyroclasm -1 Pyrohemia -1 Seismic Shudder -1 Steam Blast -1 Subterranean Spirit -1 Sulfurous Blast -1 Tremor -1 Volcanic Fallout -1 Volcanic Spray -1 Whipflare -1 Aven Smokeweaver -1 Beasts of Bogardan -1 Defender of Law -1 Freewind Falcon -1 Galina's Knight -1 Guardian of the Guildpact -1 Hazerider Drake -1 Kor Firewalker -1 Narwhal -1 Oraxid -1 Repentant Blacksmith -1 Sea Sprite -1 Silver Knight -1 Soltari Priest -1 Thermal Glider -1 Tivadar of Thorn -1 Vedalken Outlander -1 Voice of Law -1 Vulshok Refugee -1 Weatherseed Faeries -[sideboard] diff --git a/res/quest/decks/Rocky 3.dck b/res/quest/decks/Rocky 3.dck deleted file mode 100644 index 9d11016d73b..00000000000 --- a/res/quest/decks/Rocky 3.dck +++ /dev/null @@ -1,35 +0,0 @@ -Rocky 3 -[general] -constructed -[main] -4 Plateau -1 Tundra -4 Volcanic Island -4 Arid Mesa -4 Scalding Tarn -3 Mountain -1 Mox Pearl -1 Mox Ruby -1 Mox Sapphire -1 Ancestral Recall -1 Time Walk -3 Flamebreak -4 Chain Reaction -1 Task Mage Assembly -1 Pyrohemia -2 Subterranean Spirit -1 Tremor -4 Pyroclasm -2 Auriok Champion -1 Galina's Knight -1 Guardian of the Guildpact -1 Hazerider Drake -4 Kor Firewalker -1 Paladin en-Vec -2 Silver Knight -2 Soltari Priest -1 Tivadar of Thorn -1 Vedalken Outlander -2 Vulshok Refugee -1 Weatherseed Faeries -[sideboard] diff --git a/res/quest/decks/Rogue 3.dck b/res/quest/decks/Rogue 3.dck deleted file mode 100644 index dd2958f19d5..00000000000 --- a/res/quest/decks/Rogue 3.dck +++ /dev/null @@ -1,30 +0,0 @@ -Rogue 3 -[general] -constructed -[main] -23 Mountain -1 Mox Ruby -2 Fire Diamond -1 Chandra Nalaar -1 Solemn Simulacrum -3 Lightning Bolt -1 Dragonmaster Outcast -1 Dragon Roost -2 Crucible of Fire -4 Dragonspeaker Shaman -1 Ryusei, the Falling Star -2 Imperial Hellkite -1 Shivan Dragon -4 Tarox Bladewing -1 Bogardan Hellkite -1 Brimstone Dragon -1 Dragon Tyrant -1 Furnace Whelp -2 Hunted Dragon -2 Lightning Dragon -1 Rakdos Pit Dragon -1 Rorix Bladewing -1 Shivan Hellkite -1 Volcanic Dragon -1 Zodiac Dragon -[sideboard] diff --git a/res/quest/decks/Samantha Stephens 1.dck b/res/quest/decks/Samantha Stephens 1.dck deleted file mode 100644 index cf0633e569d..00000000000 --- a/res/quest/decks/Samantha Stephens 1.dck +++ /dev/null @@ -1,36 +0,0 @@ -Samantha Stephens 1 -[general] -constructed -[main] -5 Plains -5 Island -4 Cloudcrest Lake -4 Coastal Tower -4 Boreal Shelf -4 Painter's Servant -4 Enlightened Tutor -3 Fabricate -3 Barrenton Cragtreads -2 Flashfreeze -1 Galina's Knight -1 Vedalken Outlander -1 Kor Firewalker -1 Defender of Law -1 Disciple of Law -1 Freewind Falcon -1 Narwhal -1 Oraxid -1 Paladin en-Vec -1 Repentant Blacksmith -1 Sea Sprite -1 Silver Knight -1 Thermal Glider -1 Voice of Law -1 Weatherseed Faeries -2 Hazerider Drake -1 Warmth -1 Celestial Purge -1 Red Ward -1 Aven Smokeweaver -1 Iron Star -[sideboard] diff --git a/res/quest/decks/Samantha Stephens 2.dck b/res/quest/decks/Samantha Stephens 2.dck deleted file mode 100644 index 49fa965f9e5..00000000000 --- a/res/quest/decks/Samantha Stephens 2.dck +++ /dev/null @@ -1,33 +0,0 @@ -Samantha Stephens 2 -[general] -constructed -[main] -5 Plains -5 Island -4 Tundra -4 Coastal Tower -4 Sejiri Refuge -4 Painter's Servant -4 Enlightened Tutor -4 Fabricate -2 Barrenton Cragtreads -2 Flashfreeze -1 Galina's Knight -1 Vedalken Outlander -1 Auriok Champion -1 Kor Firewalker -1 Freewind Falcon -1 Paladin en-Vec -1 Sea Sprite -1 Silver Knight -1 Soltari Priest -1 Thermal Glider -1 Tivadar of Thorn -1 Voice of Law -1 Weatherseed Faeries -2 Hazerider Drake -1 Mind Harness -1 Warmth -4 Celestial Purge -1 Mask of Law and Grace -[sideboard] diff --git a/res/quest/decks/Samantha Stephens 3.dck b/res/quest/decks/Samantha Stephens 3.dck deleted file mode 100644 index b9a1cc732a3..00000000000 --- a/res/quest/decks/Samantha Stephens 3.dck +++ /dev/null @@ -1,32 +0,0 @@ -Samantha Stephens 3 -[general] -constructed -[main] -2 Plains -1 Karakas -3 Island -4 Tundra -4 Flooded Strand -4 Coastal Tower -4 Sejiri Refuge -1 Ancestral Recall -1 Time Walk -4 Painter's Servant -1 Grindstone -4 Enlightened Tutor -4 Fabricate -1 Trinket Mage -1 Barrenton Cragtreads -2 Flashfreeze -2 Galina's Knight -1 Vedalken Outlander -1 Tivadar of Thorn -1 Sea Sprite -1 Silver Knight -1 Soltari Priest -2 Hazerider Drake -2 Kor Firewalker -2 Mind Harness -4 Celestial Purge -2 Douse -[sideboard] diff --git a/res/quest/decks/Samantha Stephens 4.dck b/res/quest/decks/Samantha Stephens 4.dck deleted file mode 100644 index f40be051a8b..00000000000 --- a/res/quest/decks/Samantha Stephens 4.dck +++ /dev/null @@ -1,24 +0,0 @@ -Samantha Stephens 4 -[general] -constructed -[main] -2 Plains -1 Karakas -3 Island -4 Tundra -4 Flooded Strand -4 Seachrome Coast -4 Sejiri Refuge -1 Ancestral Recall -1 Time Walk -4 Painter's Servant -4 Grindstone -4 Enlightened Tutor -4 Fabricate -4 Trinket Mage -1 Grand Arbiter Augustin IV -4 Swords to Plowshares -4 Spell Snare -4 Dispel -3 Disperse -[sideboard] diff --git a/res/quest/decks/Samwise Gamgee 2.dck b/res/quest/decks/Samwise Gamgee 2.dck deleted file mode 100644 index 4b67e9bb3ad..00000000000 --- a/res/quest/decks/Samwise Gamgee 2.dck +++ /dev/null @@ -1,34 +0,0 @@ -Samwise Gamgee 2 -[general] -constructed -[main] -22 Plains -3 Wizened Cenn -3 Ballyrush Banneret -3 Cenn's Heir -3 Kithkin Zephyrnaut -3 Surge of Thoughtweft -1 Amrou Kithkin -1 Amrou Seekers -1 Apothecary Initiate -1 Augury Adept -1 Ballynock Cohort -1 Ballynock Trapper -1 Barrenton Cragtreads -1 Figure of Destiny -1 Goldmeadow Dodger -1 Goldmeadow Harrier -1 Kinsbaile Cavalier -1 Kinsbaile Skirmisher -1 Kithkin Harbinger -1 Kithkin Healer -1 Kithkin Rabble -1 Knight of Meadowgrain -1 Mistmeadow Skulk -1 Mosquito Guard -1 Plover Knights -1 Preeminent Captain -1 Resplendent Mentor -1 Somnomancer -1 Springjack Shepherd -[sideboard] diff --git a/res/quest/decks/Samwise Gamgee 3.dck b/res/quest/decks/Samwise Gamgee 3.dck deleted file mode 100644 index 9ca61997546..00000000000 --- a/res/quest/decks/Samwise Gamgee 3.dck +++ /dev/null @@ -1,21 +0,0 @@ -Samwise Gamgee 3 -[general] -constructed -[main] -2 Burrenton Bombardier|MOR -4 Arid Mesa|ZEN -4 Wizened Cenn|LRW -3 Kinsbaile Borderguard|MOR -1 Worship|9ED -3 Knight of Meadowgrain|LRW -3 Ballyrush Banneret|MOR -3 Kithkin Zephyrnaut|MOR -2 Mosquito Guard|MOR -3 Mistmeadow Skulk|SHM -18 Plains|MBS -3 Ballynock Cohort|SHM -3 Cenn's Heir|LRW -3 Honor of the Pure|M11 -2 Emeria, the Sky Ruin|ZEN -3 Surge of Thoughtweft|LRW -[sideboard] diff --git a/res/quest/decks/Saruman 2.dck b/res/quest/decks/Saruman 2.dck deleted file mode 100644 index 85331de4fc8..00000000000 --- a/res/quest/decks/Saruman 2.dck +++ /dev/null @@ -1,28 +0,0 @@ -Saruman 2 -[general] -constructed -[main] -4 Underground Sea -4 Badlands -4 Volcanic Island -4 Crumbling Necropolis -5 Swamp -4 Megrim -4 Liliana's Caress -1 Geth's Grimoire -1 Abyssal Nocturnus -1 Sedraxis Specter -1 Cunning Lethemancer -4 Burning Inquiry -4 Wheel and Deal -1 Windfall -4 Blightning -1 Hymn to Tourach -4 Stupor -1 Deception -1 Unhinge -1 Mind Rot -2 Sinkhole -3 Rain of Tears -2 Terminate -[sideboard] diff --git a/res/quest/decks/Saruman 3.dck b/res/quest/decks/Saruman 3.dck deleted file mode 100644 index 20e29dbb291..00000000000 --- a/res/quest/decks/Saruman 3.dck +++ /dev/null @@ -1,27 +0,0 @@ -Saruman 3 -[general] -constructed -[main] -4 Underground Sea -4 Badlands -4 Volcanic Island -4 Crumbling Necropolis -2 Swamp -1 Mox Jet -1 Mox Ruby -1 Mox Sapphire -4 Megrim -4 Liliana's Caress -1 Geth's Grimoire -4 Burning Inquiry -1 Wheel of Fortune -4 Wheel and Deal -1 Windfall -4 Blightning -4 Hymn to Tourach -4 Stupor -4 Sinkhole -2 Rain of Tears -1 Ancestral Recall -1 Damnation -[sideboard] diff --git a/res/quest/decks/Sauron 2.dck b/res/quest/decks/Sauron 2.dck deleted file mode 100644 index 9ace03db91b..00000000000 --- a/res/quest/decks/Sauron 2.dck +++ /dev/null @@ -1,37 +0,0 @@ -Sauron 2 -[general] -constructed -[main] -4 Underground Sea -4 Frost Marsh -4 Salt Marsh -4 Jwar Isle Refuge -2 Reliquary Tower -3 Swamp -1 Mikokoro, Center of the Sea -3 Black Vise -1 Timetwister -1 Kami of the Crescent Moon -4 Underworld Dreams -1 Temple Bell -1 Jace Beleren -1 Forced Fruition -2 Vision Skeins -4 Wheel and Deal -1 Mind's Eye -2 Howling Mine -1 Font of Mythos -1 Seizan, Perverter of Truth -1 Time Reversal -2 Propaganda -1 Frozen AEther -1 Ivory Tower -2 Deny Reality -2 Boomerang -1 Windfall -1 Teferi's Puzzle Box -1 Anvil of Bogardan -1 Temple Bell -1 Swans of Bryn Argoll -1 Consecrated Sphinx -[sideboard] diff --git a/res/quest/decks/Scooby Doo 3.dck b/res/quest/decks/Scooby Doo 3.dck deleted file mode 100644 index 60c7d636f44..00000000000 --- a/res/quest/decks/Scooby Doo 3.dck +++ /dev/null @@ -1,27 +0,0 @@ -Scooby Doo 3 -[general] -constructed -[main] -4 Ancient Amphitheater -4 Sacred Foundry -4 Plateau -4 Arid Mesa -4 Plains -4 Mountain -1 Mox Ruby -1 Mox Pearl -2 Darksteel Ingot -4 Avian Changeling -4 Fire-Belly Changeling -2 Brion Stoutarm -4 Stinkdrinker Daredevil -4 Cloudgoat Ranger -4 Inferno Titan -4 Sunrise Sovereign -1 Feudkiller's Verdict -2 Blind-Spot Giant -1 Borderland Behemoth -1 Thundercloud Shaman -1 Sunhome Enforcer -[sideboard] - diff --git a/res/quest/decks/Scotty 2.dck b/res/quest/decks/Scotty 2.dck deleted file mode 100644 index 43aa828dfcf..00000000000 --- a/res/quest/decks/Scotty 2.dck +++ /dev/null @@ -1,41 +0,0 @@ -Scotty 2 -[general] -constructed -[main] -4 Death Speakers -2 Auriok Champion -2 Duskrider Falcon -1 Llanowar Knight -1 Valeron Outlander -2 Dry Spell -1 Nightwind Glider -1 Mystic Crusader -1 Paladin en-Vec -1 Stillmoon Cavalier -2 Plague Spitter -1 Last Caress -1 Lifegift -1 Voice of Grace -1 Phantom Centaur -1 Mystic Enforcer -1 Chameleon Colossus -1 Last Laugh -2 Evincar's Justice -1 Nihilistic Glee -1 Scalebane's Elite -1 Melesse Spirit -1 Karmic Guide -2 Festering Evil -2 Famine -1 Darksteel Ingot -3 Forest -4 Plains -4 Swamp -2 Bayou -2 Savannah -2 Scrubland -2 Godless Shrine -1 Arcane Sanctum -2 Graypelt Refuge -2 Piranha Marsh -[sideboard] diff --git a/res/quest/decks/Seabiscuit 1.dck b/res/quest/decks/Seabiscuit 1.dck deleted file mode 100644 index 5474d49c883..00000000000 --- a/res/quest/decks/Seabiscuit 1.dck +++ /dev/null @@ -1,32 +0,0 @@ -Seabiscuit 1 -[general] -constructed -[main] -1 Ancient Den -22 Plains -3 Ardent Recruit -2 Auriok Edgewright -2 Auriok Sunchaser -1 Treasure Hunter -1 Dispense Justice -2 Ghalma's Warden -2 Leonin Elder -1 Razor Hippogriff -1 Argivian Archaeologist -1 Master's Call -1 Myrsmith -3 Court Homunculus -2 Dispeller's Capsule -1 Marble Chalice -1 Metallurgeon -2 Sanctum Gargoyle -2 Gold Myr -2 Origin Spellbomb -1 Angel's Feather -1 Angelic Voices -1 Arcbound Worker -1 Battered Golem -1 Chrome Steed -1 Frogmite -1 Porcelain Legionnaire -[sideboard] diff --git a/res/quest/decks/Seabiscuit 2.dck b/res/quest/decks/Seabiscuit 2.dck deleted file mode 100644 index 47b3aaa595f..00000000000 --- a/res/quest/decks/Seabiscuit 2.dck +++ /dev/null @@ -1,28 +0,0 @@ -Seabiscuit 2 -[general] -constructed -[main] -4 Ancient Den -4 Darksteel Citadel -1 Karakas -14 Plains -4 Ardent Recruit -4 Auriok Edgewright -4 Auriok Sunchaser -1 Dispense Justice -3 Ghalma's Warden -1 Indomitable Archangel -1 Leonin Elder -1 Argivian Archaeologist -1 Master's Call -1 Myrsmith -4 Court Homunculus -2 Dispeller's Capsule -1 Marble Chalice -1 Metallurgeon -2 Sanctum Gargoyle -2 Gold Myr -2 Origin Spellbomb -1 Angel's Feather -1 Angelic Voices -[sideboard] diff --git a/res/quest/decks/Seabiscuit 3.dck b/res/quest/decks/Seabiscuit 3.dck deleted file mode 100644 index e7fba3445b9..00000000000 --- a/res/quest/decks/Seabiscuit 3.dck +++ /dev/null @@ -1,29 +0,0 @@ -Seabiscuit 3 -[general] -constructed -[main] -4 Ancient Den -4 Darksteel Citadel -1 Karakas -8 Plains -1 Mox Emerald -1 Mox Jet -1 Mox Opal -1 Mox Pearl -1 Mox Ruby -1 Mox Sapphire -4 Ardent Recruit -4 Auriok Edgewright -4 Auriok Sunchaser -1 Dispense Justice -3 Ghalma's Warden -1 Indomitable Archangel -1 Myrsmith -4 Court Homunculus -2 Dispeller's Capsule -2 Sanctum Gargoyle -2 Origin Spellbomb -4 Memnite -3 Arcbound Worker -2 Skullclamp -[sideboard] diff --git a/res/quest/decks/Secret Squirrel 3.dck b/res/quest/decks/Secret Squirrel 3.dck deleted file mode 100644 index 55ad6d230b0..00000000000 --- a/res/quest/decks/Secret Squirrel 3.dck +++ /dev/null @@ -1,19 +0,0 @@ -Secret Squirrel 3 -[general] -constructed -[main] -1 Mox Emerald -3 Coat of Arms -1 Nut Collector -4 Squirrel Mob -2 Harmonize -1 Overrun -4 Acorn Harvest -22 Forest -4 Kodama's Reach -4 Squirrel Nest -4 Chatter of the Squirrel -4 Deranged Hermit -4 Wall of Blossoms -2 Naturalize -[sideboard] diff --git a/res/quest/decks/Sherlock Holmes 1.dck b/res/quest/decks/Sherlock Holmes 1.dck deleted file mode 100644 index a7e16f48479..00000000000 --- a/res/quest/decks/Sherlock Holmes 1.dck +++ /dev/null @@ -1,39 +0,0 @@ -Sherlock Holmes 1 -[general] -constructed -[main] -22 Forest -1 Sapseep Forest -1 An-Havva Constable -1 An-Havva Inn -1 Aspect of Wolf -3 Baru, Fist of Krosa -1 Beacon of Creation -1 Coiling Woodworm -2 Crabapple Cohort -1 Deadfall -1 Drove of Elves -1 Elvish Warrior -1 Feral Thallid -1 Fruition -1 Gaea's Bounty -1 Gorilla Pack -1 Kaysa -1 Meng Huo, Barbarian King -1 Multani's Acolyte -2 Nettle Sentinel -1 Niall Silvain -1 Nurturer Initiate -2 People of the Woods -1 Primal Bellow -1 Reach of Branches -1 Roughshod Mentor -1 Rushwood Elemental -1 Three Visits -1 Timbermaw Larva -1 Traproot Kami -1 Treefolk Seedlings -1 Waiting in the Weeds -1 Wooden Sphere -1 Wurm's Tooth -[sideboard] diff --git a/res/quest/decks/Sherlock Holmes 2.dck b/res/quest/decks/Sherlock Holmes 2.dck deleted file mode 100644 index b4845c36604..00000000000 --- a/res/quest/decks/Sherlock Holmes 2.dck +++ /dev/null @@ -1,41 +0,0 @@ -Sherlock Holmes 2 -[general] -constructed -[main] -22 Forest -1 Emerald Medallion -1 Three Visits -1 An-Havva Inn -4 Baru, Fist of Krosa -1 Crabapple Cohort -1 Drove of Elves -1 Howl of the Night Pack -1 Kaysa -1 Khalni Hydra -1 Meng Huo, Barbarian King -1 Nettle Sentinel -1 Hunting Cheetah -1 Reach of Branches -1 Roughshod Mentor -1 Craw Giant -1 Force of Nature -1 Blanchwood Armor -1 Jedit Ojanen of Efrava -1 Kodama of the North Tree -1 Leatherback Baloth -1 Rushwood Elemental -1 Garruk's Companion -1 Juvenile Gloomwidow -1 People of the Woods -1 Uktabi Wildcats -1 Coiling Woodworm -1 Fruition -1 Primal Bellow -1 Timbermaw Larva -1 Bellowing Tanglewurm -1 Norwood Priestess -1 Primalcrux -1 Regal Force -1 Titania's Chosen -1 Trolls of Tel-Jilad -[sideboard] diff --git a/res/quest/decks/Sherlock Holmes 3.dck b/res/quest/decks/Sherlock Holmes 3.dck deleted file mode 100644 index 0ee79f078c2..00000000000 --- a/res/quest/decks/Sherlock Holmes 3.dck +++ /dev/null @@ -1,30 +0,0 @@ -Sherlock Holmes 3 -[general] -constructed -[main] -21 Forest -1 Mox Emerald -1 Emerald Medallion -3 Three Visits -4 Baru, Fist of Krosa -1 Crabapple Cohort -1 Drove of Elves -1 Howl of the Night Pack -1 Kaysa -3 Khalni Hydra -1 Meng Huo, Barbarian King -1 Natural Order -3 Nettle Sentinel -1 Reach of Branches -1 Roughshod Mentor -1 Jugan, the Rising Star -1 Kodama of the North Tree -4 Leatherback Baloth -1 Rushwood Elemental -1 Silvos, Rogue Elemental -1 Terra Stomper -1 Weatherseed Treefolk -4 Garruk's Companion -1 Bellowing Tanglewurm -1 Primalcrux -[sideboard] diff --git a/res/quest/decks/Shrek 1.dck b/res/quest/decks/Shrek 1.dck deleted file mode 100644 index 5d770253983..00000000000 --- a/res/quest/decks/Shrek 1.dck +++ /dev/null @@ -1,22 +0,0 @@ -Shrek 1 -[general] -constructed -[main] -24 Swamp -4 Gutwrencher Oni -3 Painwracker Oni -4 Scourge of Numai -1 Mark of the Oni -4 Raving Oni-Slave -4 Villainous Ogre -4 Takenuma Bleeder -2 Blood Speaker -2 Viscera Dragger -1 Slaughterhouse Bouncer -2 Skeletal Changeling -1 Douse in Gloom -1 Last Kiss -1 Syphon Soul -1 Shadowfeed -1 Vampiric Link -[sideboard] diff --git a/res/quest/decks/Silver Samurai 2.dck b/res/quest/decks/Silver Samurai 2.dck deleted file mode 100644 index be8b7c62fef..00000000000 --- a/res/quest/decks/Silver Samurai 2.dck +++ /dev/null @@ -1,25 +0,0 @@ -Silver Samurai 2 -[general] -constructed -[main] -2 Arrest|SOM -3 Devoted Retainer|CHK -4 Arid Mesa|ZEN -2 Sensei Golden-Tail|CHK -1 Konda, Lord of Eiganjo|CHK -3 Kitsune Blademaster|CHK -3 Araba Mothrider|SOK -3 Indebted Samurai|BOK -2 Samurai Enforcers|CHK -18 Plains|MBS -4 Call to Glory|CHK -2 Mighty Leap|M11 -2 Hand of Honor|SOK -1 Mothrider Samurai|CHK -3 Nagao, Bound by Honor|CHK -2 Emeria, the Sky Ruin|ZEN -2 Pacifism|M11 -1 Oust|ROE -1 Inspired Charge|M11 -1 Konda's Hatamoto|CHK -[sideboard] diff --git a/res/quest/decks/Silver Surfer 3.dck b/res/quest/decks/Silver Surfer 3.dck deleted file mode 100644 index 6d385f280b0..00000000000 --- a/res/quest/decks/Silver Surfer 3.dck +++ /dev/null @@ -1,21 +0,0 @@ -Silver Surfer 3 -[general] -constructed -[main] -2 Bellowing Tanglewurm|SOM -2 Go for the Throat|MBS -1 Mox Emerald|2ED -3 Lignify|LRW -4 Llanowar Elves|M11 -4 Hunted Wumpus|10E -4 Tempting Wurm|ONS -3 Borderland Ranger|M10 -3 Swamp|MBS -4 Despise|NPH -12 Forest|MBS -3 Ostracize|7ED -4 Maelstrom Pulse|ARB -3 Iwamori of the Open Fist|BOK -4 Bayou|3ED -4 Verdant Catacombs|ZEN -[sideboard] diff --git a/res/quest/decks/Spiderman 2.dck b/res/quest/decks/Spiderman 2.dck deleted file mode 100644 index 9abb6f5a505..00000000000 --- a/res/quest/decks/Spiderman 2.dck +++ /dev/null @@ -1,34 +0,0 @@ -Spiderman 2 -[general] -constructed -[main] -18 Plains -4 Flagstones of Trokair -1 Karakas -2 Elite Vanguard -2 Savannah Lions -2 Tundra Wolves -2 Soul Warden -1 Path to Exile -2 Reprisal -1 Disenchant -1 Soltari Priest -2 Hand of Honor -1 Kazandu Blademaster -1 Knight of Meadowgrain -1 Leonin Skyhunter -1 Silver Knight -1 Soltari Monk -1 White Knight -1 Paladin en-Vec -1 Thunder Spirit -2 Aven Riftwatcher -1 Cloud Crusader -1 Elspeth, Knight-Errant -2 Armageddon -3 Glorious Anthem -1 Ajani Goldmane -1 Mass Calcify -1 Ranger of Eos -2 Valorous Charge -[sideboard] diff --git a/res/quest/decks/Spiderman 3.dck b/res/quest/decks/Spiderman 3.dck deleted file mode 100644 index 25fa3f5d97b..00000000000 --- a/res/quest/decks/Spiderman 3.dck +++ /dev/null @@ -1,28 +0,0 @@ -Spiderman 3 -[general] -constructed -[main] -18 Plains -4 Flagstones of Trokair -1 Karakas -1 Mox Pearl -1 Isamaru, Hound of Konda -2 Elite Vanguard -4 Savannah Lions -2 Soul Warden -4 Path to Exile -2 Soltari Priest -2 Hand of Honor -2 Kazandu Blademaster -2 Knight of Meadowgrain -1 Leonin Skyhunter -1 Silver Knight -1 Soltari Monk -1 White Knight -2 Aven Riftwatcher -1 Elspeth, Knight-Errant -4 Honor of the Pure -1 Ajani Goldmane -1 Mass Calcify -2 Ranger of Eos -[sideboard] diff --git a/res/quest/decks/Spock 2.dck b/res/quest/decks/Spock 2.dck deleted file mode 100644 index ca76747ce74..00000000000 --- a/res/quest/decks/Spock 2.dck +++ /dev/null @@ -1,23 +0,0 @@ -Spock 2 -[general] -constructed -[main] -1 Norwood Archers -1 Elvish Warrior -1 Llanowar Mentor -1 Stonewood Invoker -1 Immaculate Magistrate -1 Fyndhorn Elves -1 Caller of the Claw -4 Wolf-Skull Shaman -1 Leaf Gilder -17 Forest -1 Skyshroud Troopers -4 Winnower Patrol -1 Elvish Archers -1 Viridian Shaman -1 Thelonite Hermit -1 Llanowar Elves -1 Essence Warden -1 Elvish Ranger -[sideboard] diff --git a/res/quest/decks/Storm 1.dck b/res/quest/decks/Storm 1.dck deleted file mode 100644 index 98b536bb308..00000000000 --- a/res/quest/decks/Storm 1.dck +++ /dev/null @@ -1,46 +0,0 @@ -Storm 1 -[general] -constructed -[main] -4 Plains -2 Forest -2 Swamp -4 Razorverge Thicket -4 Arcane Sanctum -4 Graypelt Refuge -4 Kabira Crossroads -1 Serra Ascendant -4 Ajani's Pridemate -1 Ageless Entity -1 Cradle of Vitality -1 Sanguine Bond -1 Feudkiller's Verdict -1 Apothecary Initiate -1 Deathgreeter -1 Devout Monk -1 Essence Warden -1 Soul Warden -1 Soul's Attendant -1 Child of Night -1 Lone Missionary -1 Mourning Thrull -1 Temple Acolyte -1 Aven Riftwatcher -1 Grazing Gladehart -1 Kemba's Skyguard -1 Divine Offering -1 Douse in Gloom -1 Contemplation -1 Last Kiss -1 Sacred Nectar -1 Divine Offering -1 Bargain -1 Shadowfeed -1 Ajani's Mantra -1 Blessed Wine -1 Marble Chalice -1 Recumbent Bliss -1 Reviving Dose -1 Touch of Death -1 Angel's Mercy -[sideboard] diff --git a/res/quest/decks/Storm 2.dck b/res/quest/decks/Storm 2.dck deleted file mode 100644 index 92a87717167..00000000000 --- a/res/quest/decks/Storm 2.dck +++ /dev/null @@ -1,45 +0,0 @@ -Storm 2 -[general] -constructed -[main] -1 Bayou -4 Savannah -4 Scrubland -3 Marsh Flats -3 Verdant Catacombs -3 Windswept Heath -4 Graypelt Refuge -2 Kabira Crossroads -2 Serra Ascendant -4 Ajani's Pridemate -1 Cradle of Vitality -1 Ageless Entity -1 Divinity of Pride -1 Felidar Sovereign -1 Sanguine Bond -1 Feudkiller's Verdict -1 Apothecary Initiate -1 Deathgreeter -1 Devout Monk -1 Essence Warden -1 Soul Warden -1 Soul's Attendant -1 Child of Night -1 Lone Missionary -1 Mourning Thrull -1 Temple Acolyte -1 Aven Riftwatcher -1 Kitchen Finks -1 Dakmor Ghoul -1 Armadillo Cloak -1 Douse in Gloom -1 Last Kiss -1 Whitesun's Passage -1 Divine Offering -1 Heroes' Reunion -1 Shadowfeed -1 Ajani's Mantra -1 Ajani Goldmane -1 Captured Sunlight -1 Sever Soul -[sideboard] diff --git a/res/quest/decks/Storm 3.dck b/res/quest/decks/Storm 3.dck deleted file mode 100644 index 18a5119727d..00000000000 --- a/res/quest/decks/Storm 3.dck +++ /dev/null @@ -1,33 +0,0 @@ -Storm 3 -[general] -constructed -[main] -1 Bayou -4 Savannah -4 Scrubland -3 Marsh Flats -2 Verdant Catacombs -3 Windswept Heath -3 Graypelt Refuge -1 Kabira Crossroads -1 Mox Emerald -1 Mox Jet -1 Mox Pearl -4 Serra Ascendant -4 Ajani's Pridemate -3 Ageless Entity -3 Divinity of Pride -2 Felidar Sovereign -1 Sanguine Bond -1 Feudkiller's Verdict -4 Ranger of Eos -4 Kitchen Finks -1 Essence Warden -1 Soul Warden -1 Soul's Attendant -1 Ajani Goldmane -1 Loxodon Hierarch -1 Wall of Reverence -1 Leyline of Vitality -2 Swords to Plowshares -[sideboard] diff --git a/res/quest/decks/Sun Quan 2.dck b/res/quest/decks/Sun Quan 2.dck deleted file mode 100644 index 46f9d937bb2..00000000000 --- a/res/quest/decks/Sun Quan 2.dck +++ /dev/null @@ -1,31 +0,0 @@ -Sun Quan 2 -[general] -constructed -[main] -2 Wu Scout|PTK -1 Lu Xun, Scholar General|PTK -1 Lu Su, Wu Advisor|PTK -1 Champion's Victory|PTK -2 Red Cliffs Armada|PTK -1 Sun Quan, Lord of Wu|PTK -1 Mystic Denial|PTK -1 Counterintelligence|PTK -2 Wu Warship|PTK -2 Wu Admiral|PTK -2 Council of Advisors|PTK -1 Sun Ce, Young Conquerer|PTK -4 Terramorphic Expanse|M11 -2 Wu Elite Cavalry|PTK -2 Forced Retreat|PTK -2 Wu Light Cavalry|PTK -20 Island|MBS -1 Zhou Yu, Chief Commander|PTK -2 Wu Infantry|PTK -1 Preemptive Strike|PTK -1 Capture of Jingzhou|PTK -1 Borrowing 100,000 Arrows|PTK -2 Zhuge Jin, Wu Strategist|PTK -2 Wu Longbowman|PTK -2 Straw Soldiers|PTK -1 Brilliant Plan|PTK -[sideboard] \ No newline at end of file diff --git a/res/quest/decks/Superman 3.dck b/res/quest/decks/Superman 3.dck deleted file mode 100644 index 8c55e3e11be..00000000000 --- a/res/quest/decks/Superman 3.dck +++ /dev/null @@ -1,36 +0,0 @@ -Superman 3 -[general] -constructed -[main] -2 Bloodhall Ooze -2 Spike Drone -3 Soulcatcher -3 Vinelasher Kudzu -3 Taurean Mauler -2 Twilight Drover -1 Asmira, Holy Avenger -1 Fangren Firstborn -2 Forgotten Ancient -2 Dirtcowl Wurm -2 Juniper Order Ranger -1 Rushwood Elemental -1 Spike Hatcher -1 Borborygmos -2 Doubling Season -1 Idyllic Tutor -2 Battlegrowth -3 Titania's Boon -1 Dragon Blood -1 Ajani Goldmane -1 Mox Emerald -1 Mox Pearl -1 Mox Ruby -1 Forest -1 Mountain -1 Plains -4 Plateau -4 Savannah -4 Taiga -4 Jungle Shrine -2 Raging Ravine -[sideboard] diff --git a/res/quest/decks/Tarzan 1.dck b/res/quest/decks/Tarzan 1.dck deleted file mode 100644 index da30ec9f732..00000000000 --- a/res/quest/decks/Tarzan 1.dck +++ /dev/null @@ -1,38 +0,0 @@ -Tarzan 1 -[general] -constructed -[main] -2 Kird Ape -2 Tree Monkey -2 Barbary Apes -2 Zodiac Monkey -1 Simian Grunts -1 Uktabi Orangutan -1 Gorilla Pack -1 Raging Gorilla -1 Gorilla Warrior -3 Ravenous Baboons -1 Gorilla Chieftain -3 Silverback Ape -2 Ancient Silverback -7 Forest -7 Mountain -2 Taiga -2 Rootbound Crag -1 Treetop Village -1 Skarrg, the Rage Pits -2 Copperline Gorge -2 Stomping Ground -2 Earthbind -2 Giant Growth -1 Kitesail -1 Elven Lyre -1 Guerrilla Tactics -1 Wallop -1 Path of Anger's Flame -1 Wing Snare -1 Violent Outburst -1 Living Armor -1 Pattern of Rebirth -1 Claws of Wirewood -[sideboard] diff --git a/res/quest/decks/Tarzan 2.dck b/res/quest/decks/Tarzan 2.dck deleted file mode 100644 index dbcf62e6a17..00000000000 --- a/res/quest/decks/Tarzan 2.dck +++ /dev/null @@ -1,29 +0,0 @@ -Tarzan 2 -[general] -constructed -[main] -3 Kird Ape -2 Barbary Apes -2 Zodiac Monkey -1 Gorilla Warrior -1 Raging Gorilla -2 Simian Grunts -2 Uktabi Orangutan -2 Ravenous Baboons -2 Apes of Rath -2 Gorilla Chieftain -4 Silverback Ape -3 Ancient Silverback -5 Forest -7 Mountain -4 Taiga -4 Rootbound Crag -2 Treetop Village -2 Skarrg, the Rage Pits -2 Hidden Gibbons -3 Plummet -1 Chaosphere -2 Raking Canopy -1 Spidersilk Armor -1 Sarkhan Vol -[sideboard] diff --git a/res/quest/decks/Terminator 3.dck b/res/quest/decks/Terminator 3.dck deleted file mode 100644 index 7acbab07d1d..00000000000 --- a/res/quest/decks/Terminator 3.dck +++ /dev/null @@ -1,20 +0,0 @@ -Terminator 3 -[general] -constructed -[main] -22 Swamp -1 Mox Jet -4 Glaze Fiend -4 Salvage Slasher -4 Executioner's Capsule -4 The Abyss -3 Vault Skirge -1 Scepter of Fugue -2 Stench of Decay -3 Dross Golem -4 Lashwrithe -2 Solemn Simulacrum -2 Batterskull -2 Etched Champion -2 Wrench Mind -[sideboard] diff --git a/res/quest/decks/The Great Gazoo 3.dck b/res/quest/decks/The Great Gazoo 3.dck deleted file mode 100644 index b3fd8aca68a..00000000000 --- a/res/quest/decks/The Great Gazoo 3.dck +++ /dev/null @@ -1,29 +0,0 @@ -The Great Gazoo 3 -[general] -constructed -[main] -4 Sacred Foundry -4 Plateau -4 Jungle Shrine -1 Soltari Priest -1 Stuffy Doll -2 Rolling Earthquake -5 Plains -1 Voice of Law -3 Flamebreak -3 Thermal Glider -3 Silver Knight -2 Starstorm -1 Abbey Gargoyles -1 Mox Ruby -1 Mox Pearl -1 Ryusei, the Falling Star -4 Freewind Falcon -4 Paladin en-Vec -1 Earthquake -4 Mountain -4 Kor Firewalker -1 Wildfire -4 Chain Reaction -1 Seismic Shudder -[sideboard] diff --git a/res/quest/decks/Tom Bombadil 3.dck b/res/quest/decks/Tom Bombadil 3.dck deleted file mode 100644 index f80935d5a45..00000000000 --- a/res/quest/decks/Tom Bombadil 3.dck +++ /dev/null @@ -1,23 +0,0 @@ -Tom Bombadil 3 -[general] -constructed -[main] -1 Explore|WWK -1 Harrow|ZEN -1 Overwhelming Stampede|M11 -3 Garruk Wildspeaker|M11 -4 Cultivate|M11 -2 Khalni Hydra|ROE -2 Lead the Stampede|MBS -4 Call of the Herd|TSB -4 Garruk's Packleader|M11 -2 Leatherback Baloth|WWK -1 Praetor's Counsel|MBS -2 Vengevine|ROE -1 Overrun|M10 -2 Obstinate Baloth|M11 -4 Garruk's Companion|M11 -20 Forest|MBS -2 Thrun, the Last Troll|MBS -4 Verdant Catacombs|ZEN -[sideboard] diff --git a/res/quest/decks/Totoro 2.dck b/res/quest/decks/Totoro 2.dck deleted file mode 100644 index 6e56190a90c..00000000000 --- a/res/quest/decks/Totoro 2.dck +++ /dev/null @@ -1,34 +0,0 @@ -Totoro 2 -[general] -constructed -[main] -4 Forest -1 Swamp -1 Island -4 Bayou -4 Tropical Island -4 Underground Sea -4 Jwar Isle Refuge -4 Thief of Hope -1 Infernal Kirin -1 Bounteous Kirin -1 Cloudhoof Kirin -4 Long-Forgotten Gohei -4 Sire of the Storm -3 Kami of the Hunt -3 Scaled Hulk -1 Orbweaver Kumo -1 Thousand-legged Kami -1 Venerable Kumo -1 Nightsoil Kami -1 Kami of Lunacy -1 Kami of Empty Graves -1 Gibbering Kami -1 Forked-Branch Garami -1 Crawling Filth -1 Kami of the Tended Garden -1 Kodama's Reach -2 Ribbons of the Reikai -3 Rend Flesh -1 Waking Nightmare -[sideboard] diff --git a/res/quest/decks/Treebeard 1.dck b/res/quest/decks/Treebeard 1.dck deleted file mode 100644 index 19aedac4ff9..00000000000 --- a/res/quest/decks/Treebeard 1.dck +++ /dev/null @@ -1,36 +0,0 @@ -Treebeard 1 -[general] -constructed -[main] -22 Forest -1 Reach of Branches -2 Battlewand Oak -3 Orchard Warden -4 Bosk Banneret -1 Cloudcrown Oak -1 Gaea's Avenger -1 Cradle Guard -1 Wormwood Treefolk -1 Crabapple Cohort -1 Dauntless Dourbark -1 Yavimaya Scion -1 Old Ghastbark -1 Foxfire Oak -1 Blanchwood Treefolk -1 Ironroot Treefolk -1 Rowan Treefolk -1 Heartwood Treefolk -1 Ambassador Oak -1 Oakgnarl Warrior -1 Redwood Treefolk -1 Scarwood Treefolk -2 Leaf-Crowned Elder -2 Treefolk Harbinger -1 Yavimaya Ancients -1 Storm Seeker -1 Three Visits -1 Argothian Treefolk -1 Bog-Strider Ash -1 Everbark Shaman -1 Rootgrapple -[sideboard] diff --git a/res/quest/decks/Treebeard 2.dck b/res/quest/decks/Treebeard 2.dck deleted file mode 100644 index 70e7bfc905d..00000000000 --- a/res/quest/decks/Treebeard 2.dck +++ /dev/null @@ -1,38 +0,0 @@ -Treebeard 2 -[general] -constructed -[main] -14 Forest -4 Bayou -4 Savannah -1 Reach of Branches -2 Battlewand Oak -2 Orchard Warden -4 Bosk Banneret -1 Cloudcrown Oak -1 Weatherseed Treefolk -1 Gaea's Avenger -1 Cradle Guard -1 Wormwood Treefolk -1 Crabapple Cohort -1 Sapling of Colfenor -1 Timber Protector -3 Dauntless Dourbark -1 Yavimaya Scion -1 Old Ghastbark -1 Foxfire Oak -1 Ebony Treefolk -1 Blanchwood Treefolk -1 Ironroot Treefolk -1 Rowan Treefolk -1 Heartwood Treefolk -1 Ambassador Oak -1 Indomitable Ancients -1 Oakgnarl Warrior -1 Redwood Treefolk -1 Scarwood Treefolk -1 Doran, the Siege Tower -2 Leaf-Crowned Elder -1 Treefolk Harbinger -1 Rootgrapple -[sideboard] diff --git a/res/quest/decks/Treebeard 3.dck b/res/quest/decks/Treebeard 3.dck deleted file mode 100644 index 4883281ad30..00000000000 --- a/res/quest/decks/Treebeard 3.dck +++ /dev/null @@ -1,27 +0,0 @@ -Treebeard 3 -[general] -constructed -[main] -13 Forest -4 Bayou -4 Savannah -1 Mox Emerald -1 Putrefy -2 Reach of Branches -2 Cloudcrown Oak -4 Battlewand Oak -4 Orchard Warden -4 Bosk Banneret -1 Cloudcrown Oak -1 Weatherseed Treefolk -1 Cradle Guard -1 Sapling of Colfenor -4 Timber Protector -4 Dauntless Dourbark -1 Old Ghastbark -1 Ebony Treefolk -1 Indomitable Ancients -1 Oakgnarl Warrior -1 Doran, the Siege Tower -4 Leaf-Crowned Elder -[sideboard] diff --git a/res/quest/decks/Uncle Owen 3.dck b/res/quest/decks/Uncle Owen 3.dck deleted file mode 100644 index 9ee51da7b0a..00000000000 --- a/res/quest/decks/Uncle Owen 3.dck +++ /dev/null @@ -1,34 +0,0 @@ -Uncle Owen 3 -[general] -constructed -[main] -2 Underground Sea -3 Polluted Delta -2 Pongify -1 Keiga, the Tide Star -1 Mox Sapphire -2 Go for the Throat -2 Terror -1 Swamp -4 Concentrate -1 Plains -2 Shadowmage Infiltrator -2 Sower of Temptation -4 Terror -4 Control Magic -1 Island -1 Ancestral Recall -3 Obelisk of Esper -2 Scrubland -3 Marsh Flats -4 Swords to Plowshares -1 Mox Pearl -1 Liliana Vess -2 Tundra -3 Flooded Strand -1 Bribery -1 Mox Jet -2 Crib Swap -2 Wrath of God -2 Damnation -[sideboard] diff --git a/res/quest/decks/Walle 2.dck b/res/quest/decks/Walle 2.dck deleted file mode 100644 index c1fe0dde5ed..00000000000 --- a/res/quest/decks/Walle 2.dck +++ /dev/null @@ -1,17 +0,0 @@ -Walle 2 -[general] -constructed -[main] -16 Plains|MBS -4 Master's Call|MBS -4 Arid Mesa|ZEN -4 Hovermyr|NPH -4 Myr Enforcer|MRD -4 Perilous Myr|SOM -4 Myr Matrix|DST -4 Myr Galvanizer|SOM -4 Gold Myr|SOM -4 Myrsmith|SOM -4 Myr Retriever|MRD -4 Marsh Flats|ZEN -[sideboard] \ No newline at end of file diff --git a/res/quest/decks/Wally 3.dck b/res/quest/decks/Wally 3.dck deleted file mode 100644 index 80d5065b21b..00000000000 --- a/res/quest/decks/Wally 3.dck +++ /dev/null @@ -1,19 +0,0 @@ -Wally 3 -[general] -constructed -[main] -4 Memnite -4 Ornithopter -4 Signal Pest -4 Steel Overseer -3 Ajani Goldmane -4 Glint Hawk Idol -4 Go for the Throat -4 Master's Call -3 Mox Opal -4 Tempered Steel -4 Scrubland -4 Glimmerpost -11 Plains -3 Swamp -[sideboard] \ No newline at end of file diff --git a/res/quest/decks/White Knight 1.dck b/res/quest/decks/White Knight 1.dck deleted file mode 100644 index f661140c00a..00000000000 --- a/res/quest/decks/White Knight 1.dck +++ /dev/null @@ -1,17 +0,0 @@ -White Knight 1 -[general] -constructed -[main] -4 Saltblast -24 Plains -4 Caravan Escort -3 Skyhunter Prowler -3 Veteran Cavalier -3 Kabira Vindicator -4 Lionheart Maverick -4 Youthful Knight -4 Oust -2 Knight of Cliffhaven -2 Knight Errant -3 Benalish Cavalry -[sideboard] \ No newline at end of file diff --git a/res/quest/decks/White Knight 2.dck b/res/quest/decks/White Knight 2.dck deleted file mode 100644 index 391e3ca9dec..00000000000 --- a/res/quest/decks/White Knight 2.dck +++ /dev/null @@ -1,23 +0,0 @@ -White Knight 2 -[general] -constructed -[main] -3 Veteran Cavalier -3 Kabira Vindicator -4 Lionheart Maverick -2 Knight of Cliffhaven -2 Knight Errant -3 Benalish Cavalry -2 Accorder Paladin -1 Hero of Bladehold -1 Knight Exemplar -2 Leonin Skyhunter -1 Mirran Crusader -2 Student of Warfare -2 White Knight -2 Caravan Escort -2 Oust -2 Saltblast -2 Path of Peace -24 Plains -[sideboard] \ No newline at end of file diff --git a/res/quest/decks/White Knight 3.dck b/res/quest/decks/White Knight 3.dck deleted file mode 100644 index 38269554664..00000000000 --- a/res/quest/decks/White Knight 3.dck +++ /dev/null @@ -1,17 +0,0 @@ -White Knight 3 -[general] -constructed -[main] -4 Accorder Paladin -4 Hero of Bladehold -4 Knight Exemplar -4 Leonin Skyhunter -4 Mirran Crusader -4 Student of Warfare -3 White Knight -2 Ajani Goldmane -3 Elspeth Tirel -4 Honor of the Pure -4 Emeria, the Sky Ruin -20 Plains -[sideboard] \ No newline at end of file diff --git a/res/quest/decks/Wilma Flintstone 1.dck b/res/quest/decks/Wilma Flintstone 1.dck deleted file mode 100644 index b09caf8b456..00000000000 --- a/res/quest/decks/Wilma Flintstone 1.dck +++ /dev/null @@ -1,34 +0,0 @@ -Wilma Flintstone 1 -[general] -constructed -[main] -7 Forest -7 Swamp -3 Gilt-Leaf Palace -2 Llanowar Wastes -2 Pine Barrens -4 Savage Lands -1 Dark Heart of the Wood -1 Death Mutation -1 Drain the Well -1 Ebony Treefolk -1 Gift of the Deity -1 Golgari Germination -1 Golgari Guildmage -1 Golgari Rotwurm -1 Hag Hedge-Mage -3 Llanowar Dead -1 Maelstrom Pulse -3 Noxious Hatchling -3 Woodlurker Mimic -2 Odious Trow -1 Putrefy -2 Rendclaw Trow -1 Shambling Shell -3 Stalker Hag -2 Woodwraith Strangler -1 Elves of Deep Shadow -1 Possessed Centaur -2 Bog Gnarr -1 Quirion Dryad -[sideboard] diff --git a/res/quest/decks/Wilma Flintstone 2.dck b/res/quest/decks/Wilma Flintstone 2.dck deleted file mode 100644 index d35570ae0f8..00000000000 --- a/res/quest/decks/Wilma Flintstone 2.dck +++ /dev/null @@ -1,24 +0,0 @@ -Wilma Flintstone 2 -[general] -constructed -[main] -1 Putrid Leech -2 Gilt-Leaf Palace -3 Rendclaw Trow -3 Maelstrom Pulse -4 Bayou -3 Odious Trow -4 Llanowar Dead -8 Swamp -3 Stalker Hag -2 Ebony Treefolk -1 Grave-Shell Scarab -8 Forest -3 Putrefy -1 Canker Abomination -4 Noxious Hatchling -4 Woodlurker Mimic -2 Drain the Well -3 Creakwood Liege -2 Vulturous Zombie -[sideboard] diff --git a/res/quest/decks/Wilma Flintstone 3.dck b/res/quest/decks/Wilma Flintstone 3.dck deleted file mode 100644 index 56de2e0cbbc..00000000000 --- a/res/quest/decks/Wilma Flintstone 3.dck +++ /dev/null @@ -1,28 +0,0 @@ -Wilma Flintstone 3 -[general] -constructed -[main] -2 Llanowar Dead -1 Lord of Extinction -1 Mox Emerald -7 Swamp -1 Stalker Hag -2 Overgrown Tomb -2 Ebony Treefolk -2 Rendclaw Trow -7 Forest -4 Maelstrom Pulse -4 Putrefy -4 Bayou -1 Mox Jet -4 Noxious Hatchling -1 Odious Trow -4 Woodlurker Mimic -1 Sapling of Colfenor -1 Nath of the Gilt-Leaf -2 Drain the Well -3 Spiritmonger -4 Creakwood Liege -1 Deity of Scars -1 Glissa, the Traitor -[sideboard] diff --git a/res/quest/decks/Wolverine 3.dck b/res/quest/decks/Wolverine 3.dck deleted file mode 100644 index 6c90c5578d2..00000000000 --- a/res/quest/decks/Wolverine 3.dck +++ /dev/null @@ -1,22 +0,0 @@ -Wolverine 3 -[general] -constructed -[main] -4 Bayou -4 Overgrown Tomb -4 Verdant Catacombs -4 Bloodstained Mire -10 Swamp -4 Quag Sickness -4 Tendrils of Corruption -4 Korlash, Heir to Blackblade -3 Mind Sludge -3 Corrupt -3 Nightmare -1 Dakmor Sorceress -1 Sima Yi, Wei Field Marshal -4 Farseek -3 Farhaven Elf -2 Spoils of Victory -2 Kodama's Reach -[sideboard] diff --git a/res/quest/decks/Wonder Woman 2.dck b/res/quest/decks/Wonder Woman 2.dck deleted file mode 100644 index 247b9ba2e5c..00000000000 --- a/res/quest/decks/Wonder Woman 2.dck +++ /dev/null @@ -1,36 +0,0 @@ -Wonder Woman 2 -[general] -constructed -[main] -24 Plains -2 Auriok Glaivemaster -2 Kitesail Apprentice -2 Kor Duelist -2 Leonin Den-Guard -2 Sunspear Shikari -2 Stoneforge Mystic -1 Myr Adapter -1 Training Drone -1 Kemba, Kha Regent -1 Loxodon Punisher -1 Skyhunter Cub -1 Steelshaper Apprentice -1 Raksha Golden Cub -1 Vulshok Morningstar -1 Bone Saw -1 Bonesplitter -1 Leonin Scimitar -1 Shuko -1 Sylvok Lifestaff -1 Basilisk Collar -1 Bladed Pinions -1 Blight Sickle -1 Darksteel Axe -1 Gorgon Flail -1 Kitesail -1 Neurok Hoversail -1 Runed Stalactite -1 Specter's Shroud -1 Spidersilk Net -1 Trusty Machete -[sideboard] diff --git a/res/quest/decks/Wyatt Earp 1.dck b/res/quest/decks/Wyatt Earp 1.dck deleted file mode 100644 index f0316eaae1d..00000000000 --- a/res/quest/decks/Wyatt Earp 1.dck +++ /dev/null @@ -1,36 +0,0 @@ -Wyatt Earp 1 -[general] -constructed -[main] -22 Plains -1 Angel's Feather -1 Angelic Voices -1 Apothecary Initiate -1 Auspicious Ancestor -3 Ballynock Cohort -1 Ballynock Trapper -1 Battle Screech -1 Blinding Light -1 Favorable Destiny -1 Ivory Giant -3 Kithkin Rabble -1 Knight of the White Orchid -2 Landbind Ritual -1 Resplendent Mentor -1 Spiritual Sanctuary -3 Springjack Shepherd -2 Valorous Charge -1 Zealots en-Dal -1 Sunlance -1 Saltblast -1 Blessing -1 Alaborn Grenadier -1 Amrou Kithkin -1 Hand of Honor -1 Leonin Skyhunter -1 Longbow Archer -1 Soltari Monk -1 White Knight -1 Silver Knight -1 Abbey Gargoyles -[sideboard] diff --git a/res/quest/decks/Wyatt Earp 2.dck b/res/quest/decks/Wyatt Earp 2.dck deleted file mode 100644 index 864bd9e8299..00000000000 --- a/res/quest/decks/Wyatt Earp 2.dck +++ /dev/null @@ -1,39 +0,0 @@ -Wyatt Earp 2 -[general] -constructed -[main] -22 Plains -1 Pearl Medallion -3 Ballynock Cohort -1 Ballynock Trapper -1 Blinding Light -1 Celestial Crusader -1 Crovax, Ascendant Hero -2 Crusade -1 Divine Sacrament -1 Hand of Justice -1 Holy Light -3 Kithkin Rabble -1 Knight of the White Orchid -1 Mass Calcify -1 Springjack Shepherd -1 Sunlance -1 Abbey Gargoyles -1 Unmake -1 Saltblast -1 Alaborn Grenadier -1 Auriok Champion -1 Hand of Honor -1 Knight of Meadowgrain -1 Leonin Skyhunter -1 Longbow Archer -1 Serra Avenger -1 Soltari Monk -1 Valorous Charge -1 Landbind Ritual -1 Devout Lightcaster -1 Opal Guardian -1 White Knight -1 Silver Knight -1 Loyal Gyrfalcon -[sideboard] diff --git a/res/quest/decks/Wyatt Earp 3.dck b/res/quest/decks/Wyatt Earp 3.dck deleted file mode 100644 index 9734ea6ea5e..00000000000 --- a/res/quest/decks/Wyatt Earp 3.dck +++ /dev/null @@ -1,30 +0,0 @@ -Wyatt Earp 3 -[general] -constructed -[main] -21 Plains -1 Karakas -1 Mox Pearl -4 Honor of the Pure -1 Celestial Crusader -1 Crovax, Ascendant Hero -2 Knight of the White Orchid -2 Mass Calcify -1 Springjack Shepherd -1 Dawn Elemental -2 Unmake -2 Swords to Plowshares -1 Auriok Champion -1 Hand of Honor -3 Knight of Meadowgrain -4 Serra Avenger -1 Soltari Monk -1 White Knight -1 Soltari Priest -1 Silver Knight -2 Kazandu Blademaster -1 Crackdown -4 Mirran Crusader -1 Spectral Procession -1 Purity -[sideboard] diff --git a/res/quest/decks/quest1.dck b/res/quest/decks/quest1.dck deleted file mode 100644 index 3bd1e8985c3..00000000000 --- a/res/quest/decks/quest1.dck +++ /dev/null @@ -1,42 +0,0 @@ -quest1 -[general] -constructed -[main] -24 Plains -1 Abbey Gargoyles -1 Archon of Redemption -1 Border Guard -1 Cho-Arrim Bruiser -1 Commander Eesha -1 Daru Lancer -1 Femeref Scouts -1 Foot Soldiers -1 Fountain Watch -1 Harvest Gwyllion -1 Hearthfire Hobgoblin -1 Herald of Serra -1 Hero of Bladehold -1 Linvala, Keeper of Silence -1 Makindi Griffin -1 Mirran Crusader -1 Peregrine Griffin -1 Spiritual Guardian -1 Standing Troops -1 Starlit Angel -1 Staunch Defenders -1 Teroh's Faithful -1 Warrior Angel -1 Wilt-Leaf Cavaliers -1 Zealots en-Dal -1 Beckon Apparition -1 Blessed Reversal -1 Chastise -1 Condemn -1 Disempower -1 Excommunicate -1 Last Breath -1 Narrow Escape -1 Rebuff the Wicked -1 Retribution of the Meek -1 Sunlance -[sideboard] diff --git a/res/quest/decks/quest10.dck b/res/quest/decks/quest10.dck deleted file mode 100644 index a2363fab55e..00000000000 --- a/res/quest/decks/quest10.dck +++ /dev/null @@ -1,29 +0,0 @@ -quest10 -[general] -constructed -[main] -1 Cadaverous Knight -1 Bog Raiders -1 Gluttonous Zombie -22 Swamp -1 Stillmoon Cavalier -1 Scathe Zombies -3 Terror -2 Douse in Gloom -1 Headless Horseman -2 Lord of the Undead -3 Duress -1 Stromgald Crusader -1 Walking Dead -1 Severed Legion -1 Fallen Cleric -2 Cemetery Reaper -3 Gravedigger -1 Bad Moon -1 Mox Jet -4 Raise Dead -1 Dregscape Zombie -4 Mass of Ghouls -1 Warpath Ghoul -1 Viscera Dragger -[sideboard] diff --git a/res/quest/decks/quest11.dck b/res/quest/decks/quest11.dck deleted file mode 100644 index 2565a2b4cd9..00000000000 --- a/res/quest/decks/quest11.dck +++ /dev/null @@ -1,49 +0,0 @@ -quest11 -[general] -constructed -[main] -1 Isamaru, Hound of Konda -4 Plateau -1 Radiant, Archangel -4 Taiga -1 Zuo Ci, the Mocking Sage -1 Mox Emerald -1 Rakka Mar -1 Concordant Crossroads -1 Meng Huo, Barbarian King -1 Jeska, Warrior Adept -2 Loyal Retainers -1 Jacques le Vert -1 Tolsimir Wolfblood -1 Squee, Goblin Nabob -1 Kaysa -1 Earthcraft -1 Mox Pearl -1 Mikokoro, Center of the Sea -1 Eladamri, Lord of Leaves -1 Eladamri's Call -1 Mirri, Cat Warrior -1 Exploration -4 Savannah -1 Gaddock Teeg -1 Honden of Cleansing Fire -1 Pianna, Nomad Captain -1 Azusa, Lost but Seeking -3 Plains -1 Captain Sisay -1 Okina, Temple to the Grandfathers -1 Honden of Infinite Rage -1 Reki, the History of Kamigawa -1 Goblin Assault -1 Umezawa's Jitte -3 Forest -1 Fecundity -1 Mox Ruby -1 Tuktuk the Explorer -1 Zuberi, Golden Feather -1 Fastbond -1 Honden of Life's Web -1 Kongming, "Sleeping Dragon" -3 Mountain -1 Tuknir Deathlock -[sideboard] diff --git a/res/quest/decks/quest12.dck b/res/quest/decks/quest12.dck deleted file mode 100644 index 4c0da6a5ac3..00000000000 --- a/res/quest/decks/quest12.dck +++ /dev/null @@ -1,26 +0,0 @@ -quest12 -[general] -constructed -[main] -2 Birds of Paradise -4 Knight of the Reliquary -2 Elspeth, Knight-Errant -2 Eternal Witness -1 Progenitus -5 Plains -3 Natural Order -2 Garruk Wildspeaker -1 Umezawa's Jitte -7 Forest -2 Stoneforge Mystic -4 Swords to Plowshares -1 Dryad Arbor -4 Qasali Pridemage -4 Tarmogoyf -1 Loxodon Warhammer -2 Path to Exile -4 Noble Hierarch -1 Quietus Spike -4 Savannah -4 Wasteland -[sideboard] diff --git a/res/quest/decks/quest13.dck b/res/quest/decks/quest13.dck deleted file mode 100644 index fdc2ba1a02d..00000000000 --- a/res/quest/decks/quest13.dck +++ /dev/null @@ -1,27 +0,0 @@ -quest13 -[general] -constructed -[main] -4 Underground Sea -4 Spreading Seas -4 Remove Soul -1 Avatar of Fury -1 Mox Sapphire -2 Damnation -4 Crumbling Necropolis -2 Island -1 Ancestral Recall -4 Badlands -4 Fire-Field Ogre -4 Kargan Dragonlord -4 Lightning Bolt -2 Nicol Bolas -1 Mox Ruby -4 Sedraxis Specter -4 Volcanic Island -1 Time Walk -4 Counterspell -2 Cruel Ultimatum -1 Mox Jet -2 Mountain -[sideboard] diff --git a/res/quest/decks/quest14.dck b/res/quest/decks/quest14.dck deleted file mode 100644 index 7734d6457dc..00000000000 --- a/res/quest/decks/quest14.dck +++ /dev/null @@ -1,23 +0,0 @@ -quest14 -[general] -constructed -[main] -4 Birds of Paradise -1 Plague Wind -1 Mox Emerald -4 Phyrexian Arena -6 Swamp -4 Damnation -2 Garruk Wildspeaker -3 Harmonize -2 Buried Alive -7 Forest -4 Bayou -4 Howling Mine -4 Ostracize -3 Noble Hierarch -2 Bloodghast -4 Vengevine -1 Mox Jet -4 Essence Warden -[sideboard] diff --git a/res/quest/decks/quest15.dck b/res/quest/decks/quest15.dck deleted file mode 100644 index 9a34aac4b1f..00000000000 --- a/res/quest/decks/quest15.dck +++ /dev/null @@ -1,24 +0,0 @@ -quest15 -[general] -constructed -[main] -4 Plateau -4 Druid of the Anima -4 Taiga -1 Mox Emerald -3 Temple Garden -3 Glorious Anthem -3 Stomping Ground -4 Elvish Champion -4 Lightning Bolt -1 Mox Ruby -1 Mox Pearl -3 Gaea's Anthem -4 Blaze -3 Fireball -4 Savannah -3 Beastmaster Ascension -3 Keen-Eyed Archers -4 Elvish Harbinger -4 Llanowar Elves -[sideboard] diff --git a/res/quest/decks/quest16.dck b/res/quest/decks/quest16.dck deleted file mode 100644 index 91382935c9e..00000000000 --- a/res/quest/decks/quest16.dck +++ /dev/null @@ -1,28 +0,0 @@ -quest16 -[general] -constructed -[main] -1 Proper Burial -2 Disenchant -1 Mox Emerald -4 Sporesower Thallid -2 Psychotrope Thallid -5 Plains -4 Graypelt Refuge -2 Mycoloth -4 Sunpetal Grove -2 Rampant Growth -1 Enlightened Tutor -4 Mycologist -2 Kodama's Reach -5 Forest -4 Thallid -1 Mox Pearl -1 Desert Twister -1 Exploration -4 Pallid Mycoderm -2 Defense of the Heart -4 Savannah -1 Doubling Season -3 Thelonite Hermit -[sideboard] diff --git a/res/quest/decks/quest17.dck b/res/quest/decks/quest17.dck deleted file mode 100644 index 9befd406764..00000000000 --- a/res/quest/decks/quest17.dck +++ /dev/null @@ -1,28 +0,0 @@ -quest17 -[general] -constructed -[main] -4 Terminate -4 Taiga -2 Dragonskull Summit -1 Mox Emerald -1 Swamp -4 Putrid Leech -2 Bituminous Blast -2 Siege-Gang Commander -1 Garruk Wildspeaker -3 Savage Lands -1 Forest -4 Badlands -4 Blightning -4 Lightning Bolt -1 Mox Ruby -4 Maelstrom Pulse -2 Rootbound Crag -4 Bayou -4 Bloodbraid Elf -2 Sarkhan the Mad -1 Mox Jet -4 Sprouting Thrinax -1 Mountain -[sideboard] diff --git a/res/quest/decks/quest18.dck b/res/quest/decks/quest18.dck deleted file mode 100644 index 3a5374e9b0f..00000000000 --- a/res/quest/decks/quest18.dck +++ /dev/null @@ -1,25 +0,0 @@ -quest18 -[general] -constructed -[main] -4 Birds of Paradise -4 Knight of the Reliquary -2 Sejiri Steppe -1 Mox Emerald -4 Tropical Island -2 Elspeth, Knight-Errant -1 Mox Sapphire -2 Plains -2 Island -4 Forest -4 Sovereigns of Lost Alara -3 Jace Beleren -1 Mox Pearl -4 Dauntless Escort -4 Tundra -4 Steppe Lynx -4 Baneslayer Angel -4 Noble Hierarch -4 Savannah -2 Eldrazi Conscription -[sideboard] diff --git a/res/quest/decks/quest19.dck b/res/quest/decks/quest19.dck deleted file mode 100644 index cbde1cde189..00000000000 --- a/res/quest/decks/quest19.dck +++ /dev/null @@ -1,22 +0,0 @@ -quest19 -[general] -constructed -[main] -4 Birds of Paradise -3 Armistice -1 Mox Emerald -6 Plains -4 Temple Garden -4 Utopia Tree -3 Door to Nothingness -4 Darksteel Ingot -3 Harmonize -1 Enlightened Tutor -6 Forest -4 Peacekeeper -4 Gemhide Sliver -4 Magus of the Moat -1 Mox Pearl -4 Eladamri's Call -4 Savannah -[sideboard] diff --git a/res/quest/decks/quest2.dck b/res/quest/decks/quest2.dck deleted file mode 100644 index 841139a6b30..00000000000 --- a/res/quest/decks/quest2.dck +++ /dev/null @@ -1,29 +0,0 @@ -quest2 -[general] -constructed -[main] -20 Island -4 Wasteland -1 Cognivore -4 Visions of Beyond -1 Bonehoard -1 Conversion Chamber -4 Veil of Birds -1 Veiled Apparition -1 Veiled Serpent -1 Straw Golem -1 Isolation Cell -1 Chimeric Egg -1 Soul Barrier -4 Aven Fogbringer -4 Glowing Anemone -2 Cloud Pirates -2 Cloud Sprite -1 Cosi's Trickster -1 Water Wurm -1 Wandering Ones -1 Slippery Bogle -1 Merfolk of the Pearl Trident -1 Fugitive Wizard -1 Grayscaled Gharial -[sideboard] diff --git a/res/quest/decks/quest20.dck b/res/quest/decks/quest20.dck deleted file mode 100644 index d6ddaf27b80..00000000000 --- a/res/quest/decks/quest20.dck +++ /dev/null @@ -1,34 +0,0 @@ -quest20 -[general] -constructed -[main] -4 Underground Sea -4 Tropical Island -1 Mox Emerald -4 Oath of Druids -1 Kozilek, Butcher of Truth -1 Thirst for Knowledge -4 Island -1 Brainstorm -1 Ancestral Recall -4 Spell Pierce -1 Sphinx of the Steel Wind -2 Duress -1 Mox Pearl -1 Iona, Shield of Emeria -1 Mox Jet -1 Balance -1 Ulamog, the Infinite Gyre -1 Mox Sapphire -4 Accumulated Knowledge -1 Tinker -2 Echoing Truth -4 Forbidden Orchard -1 Mox Ruby -3 Serum Visions -4 Volcanic Island -1 Time Walk -4 Counterspell -1 Thoughtseize -1 Emrakul, the Aeons Torn -[sideboard] diff --git a/res/quest/decks/quest21.dck b/res/quest/decks/quest21.dck deleted file mode 100644 index 546b00c8bac..00000000000 --- a/res/quest/decks/quest21.dck +++ /dev/null @@ -1,31 +0,0 @@ -quest21 -[general] -constructed -[main] -2 Underground Sea -2 Plateau -2 Taiga -2 Tropical Island -1 Tromp the Domains -1 Sejiri Merfolk -2 Scrubland -2 Tundra -2 Bayou -2 Savannah -3 Wandering Goblins -3 Kird Ape -4 Matca Rioters -1 Aven Trailblazer -3 Exotic Disease -4 Tribal Flames -2 Badlands -1 Forest -4 Allied Strategies -3 Loam Lion -4 Collective Restraint -2 Volcanic Island -4 Wild Nacatl -1 Legacy Weapon -1 Mountain -2 Wandering Stream -[sideboard] diff --git a/res/quest/decks/quest22.dck b/res/quest/decks/quest22.dck deleted file mode 100644 index 538293a4152..00000000000 --- a/res/quest/decks/quest22.dck +++ /dev/null @@ -1,14 +0,0 @@ -quest22 -[general] -constructed -[main] -6 Swamp -4 Underground Sea -4 Jwar Isle Refuge -4 Frost Marsh -4 Watery Grave -4 Fabricate -1 Mystical Tutor -4 Thrumming Stone -29 Relentless Rats -[sideboard] diff --git a/res/quest/decks/quest3.dck b/res/quest/decks/quest3.dck deleted file mode 100644 index 3d0f89af791..00000000000 --- a/res/quest/decks/quest3.dck +++ /dev/null @@ -1,21 +0,0 @@ -quest3 -[general] -constructed -[main] -4 Dark Ritual -2 Anowon, the Ruin Sage -3 Gatekeeper of Malakir -2 Phyrexian Arena -20 Swamp -4 Douse in Gloom -2 Pulse Tracker -1 Shizo, Death's Storehouse -4 Malakir Bloodwitch -4 Vampire Nighthawk -4 Bad Moon -3 Bloodghast -1 Mox Jet -4 Doom Blade -1 Mirri the Cursed -1 Volrath's Stronghold -[sideboard] diff --git a/res/quest/decks/quest4.dck b/res/quest/decks/quest4.dck deleted file mode 100644 index 90bb9217f35..00000000000 --- a/res/quest/decks/quest4.dck +++ /dev/null @@ -1,18 +0,0 @@ -quest4 -[general] -constructed -[main] -4 Goblin Grenade -1 Kher Keep -4 Warren Instigator -4 Siege-Gang Commander -4 Goblin King -4 Goblin Ringleader -4 Lightning Bolt -1 Mox Ruby -4 Goblin Matron -4 Mudbutton Torchrunner -4 Goblin General -4 Goblin Lackey -18 Mountain -[sideboard] diff --git a/res/quest/decks/quest5.dck b/res/quest/decks/quest5.dck deleted file mode 100644 index e7c1e1def39..00000000000 --- a/res/quest/decks/quest5.dck +++ /dev/null @@ -1,23 +0,0 @@ -quest5 -[general] -constructed -[main] -2 Wellwisher -3 Norwood Archers -1 Mox Emerald -3 Immaculate Magistrate -3 Sylvan Messenger -2 Nevinyrral's Disk -1 Wolf-Skull Shaman -3 Harmonize -3 Overrun -19 Forest -1 Winnower Patrol -3 Timberwatch Elf -3 Gaea's Anthem -2 Naturalize -2 Moss Diamond -4 Llanowar Elves -3 Imperious Perfect -2 Essence Warden -[sideboard] diff --git a/res/quest/decks/quest6.dck b/res/quest/decks/quest6.dck deleted file mode 100644 index d1ad5300b39..00000000000 --- a/res/quest/decks/quest6.dck +++ /dev/null @@ -1,76 +0,0 @@ -quest6 -[general] -constructed -[main] -20 Island -20 Swamp -1 Complex Automaton -1 Eldrazi Monument -1 Esperzoa -1 Forethought Amulet -1 Masticore -1 Molten-Tail Masticore -1 Puppet Conjurer -1 Razormane Masticore -1 Rejuvenation Chamber -1 Rusting Golem -1 Soldevi Simulacrum -1 Soultether Golem -1 Thran War Machine -1 Urza's Blueprints -1 Aku Djinn -1 Arnjlot's Ascent -1 Benthic Djinn -1 Binding Grasp -1 Blessing of Leeches -1 Breeding Pit -1 Carnophage -1 Cloudskate -1 Cosmic Horror -1 Demonic Appetite -1 Drifter il-Dal -1 Ebon Praetor -1 Fledgling Djinn -1 Flow of Maggots -1 Greater Harvester -1 Grinning Demon -1 Illusionary Forces -1 Illusionary Wall -1 Illusions of Grandeur -1 Imaginary Pet -1 Junun Efreet -1 Juzam Djinn -1 Kezzerdrix -1 Kuro, Pitlord -1 Liege of the Pit -1 Lord of the Pit -1 Melancholy -1 Minion of Tevesh Szat -1 Molting Harpy -1 Moroii -1 Mystic Remora -1 Oni Possession -4 Pact of Negation -1 Pact of the Titan -1 Phantasmal Forces -1 Phobian Phantasm -1 Pit Raptor -1 Pit Spawn -1 Raven Familiar -1 Sangrophage -1 Sarcomancy -1 School of Piranha -1 Serendib Efreet -1 Shauku, Endbringer -1 Skull Collector -4 Slaughter Pact -1 Spindrift Drake -1 Spiteful Bully -1 Thirst -1 Trusted Advisor -1 Unstable Mutation -1 Vampire Lacerator -1 Waning Wurm -1 Whipstitched Zombie -1 Yawgmoth Demon -[sideboard] diff --git a/res/quest/decks/quest7.dck b/res/quest/decks/quest7.dck deleted file mode 100644 index e33eb89fbc2..00000000000 --- a/res/quest/decks/quest7.dck +++ /dev/null @@ -1,38 +0,0 @@ -quest7 -[general] -constructed -[main] -2 Plateau -2 Aven Riftwatcher -2 Taiga -1 Mox Emerald -1 Ancestral Recall -2 Beacon of Unrest -2 Angel of Mercy -4 Scrubland -1 Nath of the Gilt-Leaf -2 Reya Dawnbringer -1 Mox Pearl -1 Liliana Vess -1 Demonic Tutor -1 Mox Jet -4 Savannah -1 Doran, the Siege Tower -2 Jungle Shrine -4 Birds of Paradise -2 Eternal Witness -1 Elspeth, Knight-Errant -1 Mox Sapphire -1 Timetwister -4 Darksteel Ingot -2 Yore-Tiller Nephilim -1 Visara the Dreadful -1 Mox Ruby -2 Sensei's Divining Top -2 Angel of Despair -2 Volcanic Island -4 Mox Diamond -3 Delirium Skeins -1 Magus of the Disk -1 Godsire -[sideboard] diff --git a/res/quest/decks/quest8.dck b/res/quest/decks/quest8.dck deleted file mode 100644 index b0f07d3d4d7..00000000000 --- a/res/quest/decks/quest8.dck +++ /dev/null @@ -1,22 +0,0 @@ -quest8 -[general] -constructed -[main] -1 Temple Garden -1 Mox Emerald -1 Arctic Wolves -4 Sound the Call -2 Wolfbriar Elemental -1 Plains -4 Wyluli Wolf -4 Rampant Growth -4 Watchwolf -1 Overrun -4 Howl of the Night Pack -18 Forest -4 Kodama's Reach -2 Muraganda Petroglyphs -1 Bestial Menace -4 Tundra Wolves -4 Savannah -[sideboard] diff --git a/res/quest/decks/quest9.dck b/res/quest/decks/quest9.dck deleted file mode 100644 index 1e609e6fb36..00000000000 --- a/res/quest/decks/quest9.dck +++ /dev/null @@ -1,23 +0,0 @@ -quest9 -[general] -constructed -[main] -2 Avenger of Zendikar -1 Sapling of Colfenor -1 Mox Emerald -4 Tropical Island -1 Mox Sapphire -3 Khalni Garden -4 Utopia Tree -2 Wall of Wood -7 Island -4 Carnivorous Plant -1 Lichenthrope -10 Forest -3 Jace, the Mind Sculptor -4 Jungle Barrier -4 Wistful Selkie -4 Wall of Blossoms -4 Vine Trellis -1 Overbeing of Myth -[sideboard] diff --git a/res/quest/easy.txt b/res/quest/easy.txt deleted file mode 100644 index a841ca4620e..00000000000 --- a/res/quest/easy.txt +++ /dev/null @@ -1,54 +0,0 @@ -Aquaman 1 -Aragorn 1 -Bamm Bamm Rubble 1 -Barney Rubble 1 -Bart Simpson 1 -Buffy 1 -C3PO 1 -Catwoman 1 -Conan the Barbarian 1 -Cow 1 -Crocodile Dundee 1 -Da Vinci 1 -Darrin Stephens 1 -Dino 1 -Doc Holiday 1 -Elrond 1 -Fat Albert 1 -Fin Fang Foom 1 -Frodo 1 -Galahad 1 -Genghis Khan 1 -George of the Jungle 1 -Grampa Simpson 1 -Green Arrow 1 -Harry Potter 1 -Hercules 1 -Homer Simpson 1 -Indiana Jones 1 -Jack Sparrow 1 -James Bond 1 -Joe Kidd 1 -Kang 1 -King Arthur 1 -King Edward 1 -King Goldemar 1 -King Kong 1 -Kojak 1 -Leprechaun 1 -Magnum 1 -Ned Flanders 1 -Oberon 1 -Odin 1 -Princess Selenia 1 -Rocky 1 -Samantha Stephens 1 -Seabiscuit 1 -Sherlock Holmes 1 -Shrek 1 -Storm 1 -Tarzan 1 -Treebeard 1 -Wilma Flintstone 1 -White Knight 1 -Wyatt Earp 1 diff --git a/res/quest/hard.txt b/res/quest/hard.txt deleted file mode 100644 index 2365ecb8625..00000000000 --- a/res/quest/hard.txt +++ /dev/null @@ -1,117 +0,0 @@ -Abraham Lincoln 3 -Albert Einstein 3 -Alice in Wonderland 3 -Aquaman 3 -Atomic Robo 3 -Barney Rubble 3 -Bart Simpson 3 -Batman 3 -Bela Lugosi 3 -Betty Rubble 3 -Blackbeard 3 -Boba Fett 3 -Boris Karloff 3 -Boromir 3 -Bridge Troll 3 -Buffy 3 -C3PO 3 -Captain America 3 -Cave Troll 3 -Comic Book Guy 3 -Crocodile Dundee 3 -Cyclops 3 -Da Vinci 3 -Darrin Stephens 3 -Darth Vader 3 -Data 3 -Deadpool 3 -Demon 3 -Dilbert 3 -Dino 3 -Doc Holiday 3 -Doran 3 -Dr No 3 -Dr Strangelove 3 -Electro 3 -Elrond 3 -Endora 3 -Ezio 3 -Fat Albert 3 -Fin Fang Foom 3 -Fred Flintstone 3 -Frodo 3 -Galahad 3 -Genghis Khan 3 -George of the Jungle 3 -Gimli 3 -Gold Finger 3 -Grampa Simpson 3 -Green Arrow 3 -Green Lantern 3 -Han Solo 3 -Hans 3 -Harry Potter 3 -Hellboy 3 -Hercules 3 -Hermione Granger 3 -Higgins 3 -Hobbes 3 -Homer Simpson 3 -Iceman 3 -Indiana Jones 3 -Jabba the Hut 3 -James Bond 3 -James T Kirk 3 -Joe Kidd 3 -Kang 3 -King Arthur 3 -King Edward 3 -King Kong 3 -Kojak 3 -Krypto 3 -Luke Skywalker 3 -Maggie Simpson 3 -Magneto 3 -Magnum 3 -Mister Fantastic 3 -Morpheus 3 -Mr Slate 3 -Napoleon 3 -Ned Flanders 3 -Neo 3 -Newton 3 -Oberon 3 -Odin 3 -Optimus Prime 3 -Pebbles Flintstone 3 -Picard 3 -Pointy Haired Boss 3 -Professor X 3 -R2-D2 3 -Radiant 3 -Radioactive Man 3 -Riddler 3 -Rocky 3 -Rogue 3 -Samantha Stephens 3 -Samwise Gamgee 3 -Saruman 3 -Scooby Doo 3 -Scotty 3 -Seabiscuit 3 -Secret Squirrel 3 -Sherlock Holmes 3 -Silver Surfer 3 -Spiderman 3 -Storm 3 -Superman 3 -Terminator 3 -The Great Gazoo 3 -Tom Bombadil 3 -Treebeard 3 -Uncle Owen 3 -Wally 3 -White Knight 3 -Wilma Flintstone 3 -Wolverine 3 -Wyatt Earp 3 diff --git a/res/quest/medium.txt b/res/quest/medium.txt deleted file mode 100644 index b556f9ebc20..00000000000 --- a/res/quest/medium.txt +++ /dev/null @@ -1,87 +0,0 @@ -Albert Einstein 2 -Alice in Wonderland 2 -Apu Nahasapeemapetilon 2 -Aquaman 2 -Aragorn 2 -Barney Rubble 2 -Bart Simpson 2 -Boromir 2 -Buffy 2 -C3PO 2 -Captain America 2 -Catwoman 2 -Conan the Barbarian 2 -Crocodile Dundee 2 -Cyclops 2 -Da Vinci 2 -Darrin Stephens 2 -Deadpool 2 -Dino 2 -Doc Holiday 2 -Dogbert 2 -Electro 2 -Elrond 2 -Endora 2 -Eomer 2 -Fat Albert 2 -Fin Fang Foom 2 -Frodo 2 -Galadriel 2 -Galahad 2 -Gambit 2 -Genghis Khan 2 -George of the Jungle 2 -Gimli 2 -Grampa Simpson 2 -Green Arrow 2 -Hagrid 2 -Harry Potter 2 -Hercules 2 -Homer Simpson 2 -Indiana Jones 2 -Jack Sparrow 2 -James Bond 2 -Joe Kidd 2 -Kang 2 -King Arthur 2 -King Edward 2 -King Kong 2 -Kojak 2 -Krypto 2 -Lisa Simpson 2 -Magnum 2 -Marge Simpson 2 -Nagini 2 -Ned Flanders 2 -Neo 2 -Oberon 2 -Odin 2 -Pebbles Flintstone 2 -Pinky and the Brain 2 -Professor X 2 -Radagast 2 -Ratbert 2 -Redwall 2 -Reverend Lovejoy 2 -Rocky 2 -Samantha Stephens 2 -Samwise Gamgee 2 -Saruman 2 -Sauron 2 -Scotty 2 -Seabiscuit 2 -Sherlock Holmes 2 -Silver Samurai 2 -Spiderman 2 -Spock 2 -Storm 2 -Sun Quan 2 -Tarzan 2 -The Thing 2 -Totoro 2 -Treebeard 2 -Walle 2 -White Knight 2 -Wilma Flintstone 2 -Wonder Woman 2 -Wyatt Earp 2 diff --git a/res/quest/price.txt b/res/quest/price.txt deleted file mode 100644 index e0423a9a4d4..00000000000 --- a/res/quest/price.txt +++ /dev/null @@ -1,2851 +0,0 @@ -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 -Dandân =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.preferences b/res/quest/quest.preferences deleted file mode 100644 index 053aa9735a7..00000000000 --- a/res/quest/quest.preferences +++ /dev/null @@ -1,30 +0,0 @@ -difficultyString=Easy,Normal,Hard,Very Hard -# Num of Wins for each Difficulty to gain a Booster, Rank, Duel vs Tougher AI Decks -winsForBooster=1,1,2,2 -winsForRankIncrease=3,4,5,6 -winsForMediumAI=10,9,8,7 -winsForHardAI=20,18,16,14 -winsForVeryHardAI=40,36,32,28 -# When starting a quest this is how much of each type you'll start with. Plus your starting Credits. -startingBasicLand=20 -startingSnowBasicLand=5 -startingCommons=82,80,78,76 -startingUncommons=20,18,16,15 -startingRares=10,10,10,8 -startingCredits=250 -# When winning a booster pack, this is what you'll expect to see in a pack. -boosterPackCommon=7 -boosterPackUncommon=3 -boosterPackRare=1 -# Match rewards that are used by the quest system -matchRewardBase=10 -matchRewardTotalWins=0.3 -matchRewardNoLosses=10 -matchRewardPoisonWinBonus=50 -matchRewardMilledWinBonus=40 -matchRewardAltWinBonus=100 -matchRewardWinOnFirstTurn=1500 -matchRewardWinByTurnFive=250 -matchRewardWinByTurnTen=50 -matchRewardWinByTurnFifteen=5 -matchRewardMullToZero=500 \ No newline at end of file diff --git a/res/quest/quest.properties b/res/quest/quest.properties deleted file mode 100644 index 31f7d17653c..00000000000 --- a/res/quest/quest.properties +++ /dev/null @@ -1,17 +0,0 @@ -common--file=common.txt -uncommon--file=uncommon.txt -rare--file=rare.txt - -price--file=all-prices.txt -quests--file=quests.txt - -easy--file=easy.txt -medium--file=medium.txt -hard--file=hard.txt -veryhard--file=veryhard.txt - -data-xml--file=questData.dat -data--file=questData -prefs--file=quest.preferences - -decks-dir--file=decks \ No newline at end of file diff --git a/res/quest/quests.txt b/res/quest/quests.txt deleted file mode 100644 index f18666d83e3..00000000000 --- a/res/quest/quests.txt +++ /dev/null @@ -1,221 +0,0 @@ -1 -Dungeon Crawling (White) -This realm is guarded by a divine entity laying his protecting hand on each living being. -Medium -Repeatable -20 -Three white rares -100 -Dungeon Crawling White.jpg - -2 -Dungeon Crawling (Blue) -This realm holds knowledge so vast it can overburden the unwary. -Medium -Repeatable -20 -Three blue rares -100 -Dungeon Crawling Blue.jpg - -3 -Dungeon Crawling (Black) -Guarded by black creatures. -Medium -Repeatable -20 -Three black rares -100 -Dungeon Crawling Black.jpg - -4 -Dungeon Crawling (Red) -Guarded by red creatures. -Medium -Repeatable -20 -Three red rares -100 -Dungeon Crawling Red.jpg - -5 -Dungeon Crawling (Green) -Guarded by green creatures. -Medium -Repeatable -20 -Three green rares -100 -Dungeon Crawling Green.jpg - -6 -Dungeon Crawling (Colorless) -The inhabitants of this plane tread with a light step. -Hard -Repeatable -28 -Three colorless rares -150 -Dungeon Crawling Colorless.jpg - -7 -Dungeon Crawling (Gold) -Guarded by gold creatures. -Hard -Repeatable -28 -Three multi-colored rares -150 -Dungeon Crawling Gold.jpg - -8 -A Wolf in Sheep's Clothing -The local sheep farm is under attack by a pack of wolves. Kill the wolves, save the sheep! -Medium -Not Repeatable -28 -Three random rares -200 -A Wolf in Sheeps Clothing.jpg - -9 -Bushwhacked! -You find yourself surrounded by carnivorous plants and poisonous vines. Cut your way out of this foresty mess and make it home safe. -Hard -Not Repeatable -40 -Four green rares -225 -Bushwhacked.jpg - -10 -Zombie Attack! -The village of Haven is getting attacked by the Zombie horde! Protect the village. -Hard -Not Repeatable -40 -Four black rares -200 -Zombie Attack.jpg - -11 -The King's Contest -The king is holding a contest. You are invited to participate and compete against other legends of this era. -Hard -Not Repeatable -40 -Three random rares -150 -The Kings Contest.jpg - -12 -Barroom Brawl -A drunken giant of a man takes a swing at you, your brew spills and a fight breaks out. -Hard -Not Repeatable -64 -Four random rares -250 -Barroom Brawl.jpg - -13 -The Court Jester -The Court Jester pulls a prank on you. Will you laugh it off or pay him back? -Hard -Not Repeatable -52 -Four multi-colored rares -300 -The Court Jester.jpg - -14 -Ancient Battlefield -You visit an ancient battlefield at midnight. It is overgrown and dark. You trip on a root, utter a curse and wish that you could see. -Hard -Not Repeatable -64 -Four random rares -250 -Ancient Battlefield.jpg - -15 -Don't Play With Matches -The goblins are battling the elves. Those pesky elves, will they ever learn. Do not play with fire! -Hard -Not Repeatable -52 -Four red rares -200 -Dont Play With Matches.jpg - -16 -Mines of Kazum Durl -While exploring a mine with a group of dwarves the mine caves in. You start to dig out and then realize that your group is not alone. -Hard -Not Repeatable -52 -Four green rares -250 -Mines of Kazum Durl.jpg - -17 -House Party -Your friends decide to hold a house party at your home tonight. Later that night uninvited guests show up and disrupt the party. -Hard -Not Repeatable -64 -Four colorless rares -250 -House Party.jpg - -18 -Crows in the Field -Crows are eating the seed planted in the local farm fields. The farmers are scared. Those crows are big, you will need some help. -Hard -Not Repeatable -64 -Five random rares -300 -Crows in the Field.jpg - -19 -The Desert Caravan -A caravan is transporting silk across the desert. While setting up camp for the night you are attacked by thieves. Defend yourself. -Hard -Not Repeatable -80 -Five random rares -300 -The Desert Caravan.jpg - -20 -Blood Oath -A druid saves your life and the two of you take a blood oath. It is now time to fulfill your oath. -Hard -Not Repeatable -80 -Five colorless rares -300 -Blood Oath.jpg - -21 -Private Domain -During your travels, you accidentally stumble upon the domain of an evil, powerful wizard. A fight to the death ensues. -Expert -Not Repeatable -96 -Six random rares -500 -Private Domain.jpg - -22 -The Pied Piper -A mysterious man threatens to flood the land with a relentless stream of hungry rats. Cross his plan before it's too late. -Hard -Not Repeatable -32 -three random rares -150 -The Pied Piper.jpg - -End \ No newline at end of file diff --git a/res/quest/themes/-1 -1 Counters BG.thm b/res/quest/themes/-1 -1 Counters BG.thm deleted file mode 100644 index b9152f50776..00000000000 --- a/res/quest/themes/-1 -1 Counters BG.thm +++ /dev/null @@ -1,48 +0,0 @@ -BasicLandPercentage=16 - -[Group MaxCnt=4 Percentage=21] -Bayou -Overgrown Tomb -Savage Lands -Verdant Catacombs -[/Group] - -[Group MaxCnt=4 Percentage=18] -Carnifex Demon -Crumbling Ashes -Flourishing Defenses -Kulrath Knight -Lockjaw Snapper -[/Group] - -[Group MaxCnt=4 Percentage=20] -Contagion Clasp -Fevered Convulsions -Gnarled Effigy -Harbinger of Night -Skinrender -Serrated Arrows -Soul Snuffers -Trigon of Corruption -[/Group] - -[Group MaxCnt=2 Percentage=4] -Contagion Engine -Cultbrand Cinder -Midnight Banshee -[/Group] - -[Group MaxCnt=4 Percentage=15] -Heartmender -Noxious Hatchling -Tatterkite -Wickerbough Elder -[/Group] - -[Group MaxCnt=2 Percentage=6] -Deity of Scars -Grim Poppet -Melira's Keepers -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Anti Black WB.thm b/res/quest/themes/Anti Black WB.thm deleted file mode 100644 index 8f042d1d1d3..00000000000 --- a/res/quest/themes/Anti Black WB.thm +++ /dev/null @@ -1,59 +0,0 @@ -BasicLandPercentage=17 - -[Group MaxCnt=4 Percentage=19] -Scrubland -Arcane Sanctum -Marsh Flats -[/Group] - -[Group MaxCnt=4 Percentage=19] -Haunted Angel -Hunted Lammasu -Painter's Servant -Painter's Servant -[/Group] - -[Group MaxCnt=4 Percentage=14] -Death Speakers -Disciple of Grace -Duskrider Falcon -Hand of Honor -Nightwind Glider -Order of Leitbur -Order of the White Shield -Soltari Monk -White Knight -White Shield Crusader -[/Group] - -[Group MaxCnt=4 Percentage=12] -Cemetery Gate -Stillmoon Cavalier -Devout Lightcaster -Devout Lightcaster -Paladin en-Vec -Voice of Grace -Wall of Light -Melesse Spirit -[/Group] - -[Group MaxCnt=4 Percentage=9] -Dakmor Plague -Dry Spell -Famine -Pestilence -[/Group] - -[Group MaxCnt=4 Percentage=10] -Celestial Purge -Celestial Purge -Purge -Purge -Sphere of Grace -Sphere of Grace -Starlight -Demon's Horn -Throne of Bone -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Anti Black WG.thm b/res/quest/themes/Anti Black WG.thm deleted file mode 100644 index b05702c28e6..00000000000 --- a/res/quest/themes/Anti Black WG.thm +++ /dev/null @@ -1,63 +0,0 @@ -BasicLandPercentage=17 - -[Group MaxCnt=4 Percentage=19] -Savannah -Graypelt Refuge -Windswept Heath -Razorverge Thicket -Sunpetal Grove -[/Group] - -[Group MaxCnt=4 Percentage=19] -Haunted Angel -Hunted Lammasu -Painter's Servant -Painter's Servant -[/Group] - -[Group MaxCnt=4 Percentage=15] -Mold Adder -Whirling Dervish -Death Speakers -Disciple of Grace -Duskrider Falcon -Hand of Honor -Nightwind Glider -Order of Leitbur -Order of the White Shield -Soltari Monk -White Knight -White Shield Crusader -[/Group] - -[Group MaxCnt=4 Percentage=16] -Chameleon Colossus -Darkwatch Elves -Great Sable Stag -Nantuko Blightcutter -Devout Lightcaster -Devout Lightcaster -Paladin en-Vec -Voice of Grace -Wall of Light -[/Group] - -[Group MaxCnt=2 Percentage=4] -Bog Gnarr -Melesse Spirit -Oversoul of Dusk -[/Group] - -[Group MaxCnt=4 Percentage=10] -Celestial Purge -Celestial Purge -Purge -Purge -Sphere of Grace -Sphere of Grace -Starlight -Demon's Horn -Throne of Bone -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Anti Red WR.thm b/res/quest/themes/Anti Red WR.thm deleted file mode 100644 index 179da025fb4..00000000000 --- a/res/quest/themes/Anti Red WR.thm +++ /dev/null @@ -1,73 +0,0 @@ -BasicLandPercentage=14 - -[Group MaxCnt=4 Percentage=21] -Plateau -Sacred Foundry -Jungle Shrine -Arid Mesa -[/Group] - -[Group MaxCnt=4 Percentage=14] -Auriok Champion -Disciple of Law -Kor Firewalker -Kor Firewalker -Repentant Blacksmith -Silver Knight -Soltari Priest -[/Group] - -[Group MaxCnt=4 Percentage=11] -Defender of Law -Mystic Crusader -Paladin en-Vec -Thermal Glider -Tivadar of Thorn -[/Group] - -[Group MaxCnt=4 Percentage=7] -Abbey Gargoyles -Beasts of Bogardan -Subterranean Spirit -Subterranean Spirit -Sphere of Law -Sphere of Law -Sphere of Law -[/Group] - -[Group MaxCnt=1 Percentage=2] -Akroma, Angel of Wrath -Ivory Guardians -[/Group] - -[Group MaxCnt=4 Percentage=12] -Pyroclasm -Pyroclasm -Pyroclasm -Rain of Embers -Seismic Shudder -Tremor -Volcanic Spray -[/Group] - -[Group MaxCnt=4 Percentage=15] -AEther Flash -AEther Flash -Chain Reaction -Chain Reaction -Desert Sandstorm -Flamebreak -Flamebreak -Pyrohemia -Steam Blast -Sulfurous Blast -Volcanic Fallout -[/Group] - -[Group MaxCnt=1 Percentage=2] -Fire Tempest -Inferno -Ryusei, the Falling Star -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Arcane Spirits UBG.thm b/res/quest/themes/Arcane Spirits UBG.thm deleted file mode 100644 index e6a36c39d5a..00000000000 --- a/res/quest/themes/Arcane Spirits UBG.thm +++ /dev/null @@ -1,96 +0,0 @@ -BasicLandPercentage=16 - -[Group MaxCnt=4 Percentage=21] -Underground Sea -Tropical Island -Bayou -Verdant Catacombs -Polluted Delta -Misty Rainforest -[/Group] - -[Group MaxCnt=3 Percentage=5] -Baku Altar -Guardian of Solitude -Loam Dweller -[/Group] - -[Group MaxCnt=3 Percentage=16] -Kami of the Hunt -Kami of the Waning Moon -Long-Forgotten Gohei -Long-Forgotten Gohei -Long-Forgotten Gohei -Thief of Hope -Thief of Hope -Thief of Hope -[/Group] - -[Group MaxCnt=2 Percentage=5] -Infernal Kirin -Infernal Kirin -Jade Idol -Kodama of the South Tree -Kodama of the South Tree -Kodama of the South Tree -[/Group] - -[Group MaxCnt=2 Percentage=4] -Briarknit Kami -Cloudhoof Kirin -Fiddlehead Kami -Kodama of the Center Tree -[/Group] - -[Group MaxCnt=1 Percentage=5] -Bounteous Kirin -Kyoki, Sanity's Eclipse -Orbweaver Kumo -Scaled Hulk -Sire of the Storm -[/Group] - -[Group MaxCnt=4 Percentage=4] -Eye of Nowhere -Eye of Nowhere -Reach Through Mists -[/Group] - -[Group MaxCnt=4 Percentage=15] -Inner Calm, Outer Strength -Kodama's Reach -Kodama's Reach -Rend Flesh -Rend Flesh -Waking Nightmare -[/Group] - -[Group MaxCnt=3 Percentage=4] -Gibbering Kami -Joyous Respite -Kami of Empty Graves -Kami of the Tended Garden -Uproot -[/Group] - -[Group MaxCnt=3 Percentage=3] -Dance of Shadows -Death of a Thousand Stings -Forked-Branch Garami -Harbinger of Spring -Ribbons of the Reikai -Strength of Cedars -Three Tragedies -Venerable Kumo -[/Group] - -[Group MaxCnt=2 Percentage=2] -Body of Jukai -Crawling Filth -Kami of Lunacy -Nightsoil Kami -Pull Under -Thousand-legged Kami -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Artifacts Colorless.thm b/res/quest/themes/Artifacts Colorless.thm deleted file mode 100644 index f9fae6ed666..00000000000 --- a/res/quest/themes/Artifacts Colorless.thm +++ /dev/null @@ -1,71 +0,0 @@ -BasicLandPercentage=0 - -[Group MaxCnt=4 Percentage=34] -Ancient Den -Darksteel Citadel -Great Furnace -Seat of the Synod -Tree of Tales -Vault of Whispers -[/Group] - -[Group MaxCnt=4 Percentage=10] -Arcbound Worker -Arcbound Worker -Arcbound Worker -Tablet of Epityr -Urza's Chalice -[/Group] - -[Group MaxCnt=4 Percentage=20] -Arcbound Ravager -Arcbound Slith -Arcbound Stinger -Frogmite -Frogmite -Golem's Heart -Steel Overseer -Steel Overseer -[/Group] - -[Group MaxCnt=4 Percentage=15] -Battered Golem -Etched Champion -Golem Foundry -Scale of Chiss-Goria -Scrapheap -Serum Tank -Snapsail Glider -Tooth of Chiss-Goria -[/Group] - -[Group MaxCnt=4 Percentage=14] -Arcbound Crusher -Arcbound Hybrid -Chrome Steed -Drill-Skimmer -Lodestone Golem -Lodestone Golem -Myr Enforcer -Myr Enforcer -[/Group] - -[Group MaxCnt=4 Percentage=4] -Arcbound Bruiser -Darksteel Juggernaut -Darksteel Juggernaut -[/Group] - -[Group MaxCnt=1 Percentage=3] -All Is Dust -All Is Dust -Arcbound Lancer -Darksteel Forge -Darksteel Forge -Mycosynth Golem -Mycosynth Golem -Razorfield Rhino -Summoning Station -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Auras WRG.thm b/res/quest/themes/Auras WRG.thm deleted file mode 100644 index c1569778a66..00000000000 --- a/res/quest/themes/Auras WRG.thm +++ /dev/null @@ -1,89 +0,0 @@ -BasicLandPercentage=10 - -[Group MaxCnt=4 Percentage=23] -Jungle Shrine -Arid Mesa -Wooded Foothills -Windswept Heath -[/Group] - -[Group MaxCnt=4 Percentage=20] -Aura Gnarlid -Aura Gnarlid -Kor Spiritdancer -Kor Spiritdancer -Kor Spiritdancer -Gatherer of Graces -Rabid Wombat -Uril, the Miststalker -[/Group] - -[Group MaxCnt=4 Percentage=7] -Gate Hound -Gate Hound -Skyrider Trainee -Thran Golem -Thran Golem -[/Group] - -[Group MaxCnt=2 Percentage=5] -Totem-Guide Hartebeest -Troll Ascetic -Sacred Wolf -Silhana Ledgewalker -Slippery Bogle -Taoist Hermit -Zuo Ci, the Mocking Sage -[/Group] - -[Group MaxCnt=3 Percentage=10] -Dust Corona -Holy Strength -Hyena Umbra -Rancor -Spider Umbra -[/Group] - -[Group MaxCnt=3 Percentage=9] -AEther Web -Agility -Brilliant Halo -Canopy Cover -Canopy Cover -Eland Umbra -Goblin War Paint -Hero's Resolve -Inviolability -Nimbus Wings -Squee's Embrace -Strength of Isolation -Treetop Bracers -Volcanic Strength -[/Group] - -[Group MaxCnt=3 Percentage=12] -Ancestral Mask -Ancestral Mask -Armadillo Cloak -Asha's Favor -Battle Mastery -Beastmaster's Magemark -Boar Umbra -Fencer's Magemark -Fencer's Magemark -Guardian's Magemark -Lightning Talons -Tiger Claws -Snake Umbra -Unquestioned Authority -[/Group] - -[Group MaxCnt=1 Percentage=3] -Celestial Mantle -Epic Proportions -Mammoth Umbra -Serra's Embrace -Winds of Rath -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Ball Lightning R.thm b/res/quest/themes/Ball Lightning R.thm deleted file mode 100644 index e3cec59a03d..00000000000 --- a/res/quest/themes/Ball Lightning R.thm +++ /dev/null @@ -1,34 +0,0 @@ -BasicLandPercentage=35 - -[Group MaxCnt=4 Percentage=11] -Smoke -Bedlam -[/Group] - -[Group MaxCnt=4 Percentage=15] -Hellspark Elemental -Spark Elemental -Viashino Sandscout -[/Group] - -[Group MaxCnt=4 Percentage=23] -Arc Runner -Ball Lightning -Hell's Thunder -Viashino Sandstalker -[/Group] - -[Group MaxCnt=4 Percentage=12] -Blistering Firecat -Blistering Firecat -Giant Solifuge -Viashino Cutthroat -[/Group] - -[Group MaxCnt=1 Percentage=4] -Ashen Monstrosity -Flameborn Hellion -Thundermare -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Black Vise UB.thm b/res/quest/themes/Black Vise UB.thm deleted file mode 100644 index 930999adb70..00000000000 --- a/res/quest/themes/Black Vise UB.thm +++ /dev/null @@ -1,74 +0,0 @@ -BasicLandPercentage=22 - -[Group MaxCnt=4 Percentage=13] -Underground Sea -Polluted Delta -[/Group] - -[Group MaxCnt=4 Percentage=15] -Black Vise -Black Vise -Black Vise -Black Vise -Ebony Owl Netsuke -Iron Maiden -Misers' Cage -Trinket Mage -Viseling -[/Group] - -[Group MaxCnt=4 Percentage=14] -Vision Skeins -Wheel and Deal -Timetwister -Words of Wisdom -Time Reversal -[/Group] - -[Group MaxCnt=4 Percentage=10] -Howling Mine -Howling Mine -Howling Mine -Howling Mine -Font of Mythos -Spiteful Visions -[/Group] - -[Group MaxCnt=1 Percentage=4] -Jace Beleren -Jace Beleren -Kami of the Crescent Moon -Kami of the Crescent Moon -Seizan, Perverter of Truth -Mikokoro, Center of the Sea -[/Group] - -[Group MaxCnt=4 Percentage=9] -Aven Fogbringer -Clutch of the Undercity -Deny Reality -Glowing Anemone -Hoodwink -Regress -Temporal Eddy -Remand -[/Group] - -[Group MaxCnt=3 Percentage=8] -Befoul -Caustic Rain -Despoil -Drain the Well -Poison the Well -Rain of Tears -Sinkhole -Stream of Acid -[/Group] - -[Group MaxCnt=3 Percentage=5] -Frozen AEther -Winter Orb -Sphere of Resistance -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Burn R.thm b/res/quest/themes/Burn R.thm deleted file mode 100644 index 098042b4f59..00000000000 --- a/res/quest/themes/Burn R.thm +++ /dev/null @@ -1,45 +0,0 @@ -BasicLandPercentage=35 - -[Group MaxCnt=4 Percentage=12] -Sulfuric Vapors -Fire Servant -Leyline of Punishment -[/Group] - -[Group MaxCnt=4 Percentage=7] -Lava Spike -[/Group] - -[Group MaxCnt=4 Percentage=10] -Flame Jet -Flame Jet -Flame Jet -Smash to Smithereens -[/Group] - -[Group MaxCnt=4 Percentage=10] -Sizzle -Sizzle -Sizzle -Molten Rain -[/Group] - -[Group MaxCnt=4 Percentage=17] -Eternal Flame -Melt Terrain -Poison the Well -Roiling Terrain -Scorching Missile -Scorching Missile -[/Group] - -[Group MaxCnt=2 Percentage=9] -Burning Fields -Burning Fields -Ignite Memories -Lava Axe -Lava Axe -Searing Flesh -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Clerics WB.thm b/res/quest/themes/Clerics WB.thm deleted file mode 100644 index 4165e9f916f..00000000000 --- a/res/quest/themes/Clerics WB.thm +++ /dev/null @@ -1,73 +0,0 @@ -BasicLandPercentage=15 - -[Group MaxCnt=4 Percentage=20] -Scrubland -Godless Shrine -Arcane Sanctum -Marsh Flats -[/Group] - -[Group MaxCnt=4 Percentage=25] -Akroma's Devoted -Daunting Defender -Doubtless One -Edgewalker -Profane Prayers -Rotlung Reanimator -[/Group] - -[Group MaxCnt=4 Percentage=8] -Apothecary Initiate -Death Speakers -Devout Monk -Disciple of the Vault -Empty-Shrine Kannushi -Foothill Guide -Leonin Elder -Soul Warden -Soul's Attendant -Weathered Wayfarer -[/Group] - -[Group MaxCnt=4 Percentage=13] -Augur il-Vec -Auriok Champion -Beloved Chaplain -Disciple of Grace -Disciple of Law -Disciple of Malice -Exorcist -Headhunter -Monk Realist -Order of Leitbur -Order of the Ebon Hand -Soltari Monk -Soltari Priest -Starlight Invoker -Temple Acolyte -War Priest of Thune -[/Group] - -[Group MaxCnt=4 Percentage=11] -Glowrider -Keepers of the Faith -Reliquary Monk -Transcendent Master -Undead Slayer -Venerable Monk -[/Group] - -[Group MaxCnt=2 Percentage=6] -Blessed Orator -Teroh's Faithful -Ancestor's Prophet -Tireless Missionaries -[/Group] - -[Group MaxCnt=1 Percentage=2] -Ancestor's Chosen -Ivory Guardians -Noble Templar -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Dermageddon WG.thm b/res/quest/themes/Dermageddon WG.thm deleted file mode 100644 index 1b33ef69fec..00000000000 --- a/res/quest/themes/Dermageddon WG.thm +++ /dev/null @@ -1,57 +0,0 @@ -BasicLandPercentage=20 - -[Group MaxCnt=3 Percentage=15] -Savannah -Windswept Heath -Darksteel Citadel -[/Group] - -[Group MaxCnt=3 Percentage=10] -Birds of Paradise -Llanowar Elves -Noble Hierarch -[/Group] - -[Group MaxCnt=3 Percentage=10] -Armageddon -Ravages of War -[/Group] - -[Group MaxCnt=4 Percentage=15] -Blastoderm -Knight of the Reliquary -Tarmogoyf -Vengevine -[/Group] - -[Group MaxCnt=3 Percentage=15] -Swords to Plowshares -Oust -Oblivion Ring -[/Group] - -[Group MaxCnt=2 Percentage=5] -Wall of Blossoms -Crucible of Worlds -[/Group] - -[Group MaxCnt=1 Percentage=10] -Rancor -Earthcraft -Eternal Witness -Yavimaya Elder -Master of the Wild Hunt -Serra Avenger -Behemoth Sledge -Land Tax -Kor Firewalker -Ghostly Prison -Aura of Silence -Worship -Ranger of Eos -Harmonize -Garruk Wildspeaker -Elspeth, Knight-Errant -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Domain.thm b/res/quest/themes/Domain.thm deleted file mode 100644 index d50f19f1546..00000000000 --- a/res/quest/themes/Domain.thm +++ /dev/null @@ -1,71 +0,0 @@ -BasicLandPercentage=0 - -[Group MaxCnt=2 Percentage=20] -Underground Sea -Plateau -Taiga -Tropical Island -Scrubland -Bayou -Tundra -Savannah -Badlands -Volcanic Island -[/Group] - -[Group MaxCnt=2 Percentage=20] -Arid Mesa -Bloodstained Mire -Flooded Strand -Marsh Flats -Misty Rainforest -Polluted Delta -Scalding Tarn -Verdant Catacombs -Windswept Heath -Wooded Foothills -[/Group] - -[Group MaxCnt=4 Percentage=32] -Aven Trailblazer -Drag Down -Tribal Flames -Tribal Flames -Allied Strategies -Matca Rioters -Matca Rioters -Tek -Exotic Curse -Exotic Curse -Kavu Scout -[/Group] - -[Group MaxCnt=4 Percentage=19] -Manaforce Mace -Collective Restraint -Voices from the Void -Ordered Migration -Might of Alara -Tromp the Domains -Gaea's Might -Global Ruin -Exotic Disease -Stratadon -Spore Burst -Strength of Unity -Wayfaring Giant -[/Group] - -[Group MaxCnt=2 Percentage=9] -Wandering Goblins -Wandering Stream -Power Armor -Wild Nacatl -Sedge Troll -Loam Lion -Kird Ape -Hedge Troll -Sejiri Merfolk -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Double Strike WR.thm b/res/quest/themes/Double Strike WR.thm deleted file mode 100644 index 650794b4672..00000000000 --- a/res/quest/themes/Double Strike WR.thm +++ /dev/null @@ -1,59 +0,0 @@ -BasicLandPercentage=14 - -[Group MaxCnt=4 Percentage=21] -Plateau -Sacred Foundry -Jungle Shrine -Arid Mesa -[/Group] - -[Group MaxCnt=4 Percentage=16] -Boros Swiftblade -Boros Swiftblade -Viashino Slaughtermaster -Warren Instigator -[/Group] - -[Group MaxCnt=4 Percentage=16] -Hearthfire Hobgoblin -Mirran Crusader -Skyhunter Skirmisher -[/Group] - -[Group MaxCnt=4 Percentage=6] -Kinsbaile Cavalier -Ridgetop Raptor -[/Group] - -[Group MaxCnt=4 Percentage=9] -Bone Saw -Bonesplitter -Dust Corona -Hyena Umbra -Shuko -Taste for Mayhem -[/Group] - -[Group MaxCnt=4 Percentage=9] -Darksteel Axe -Goblin War Paint -Gorgon Flail -Kitesail -Squee's Embrace -Trusty Machete -Volcanic Strength -Vulshok Morningstar -[/Group] - -[Group MaxCnt=2 Percentage=9] -Loxodon Warhammer -Strider Harness -Sword of Body and Mind -Sword of Feast and Famine -Sword of Fire and Ice -Sword of Light and Shadow -Sword of Vengeance -Vulshok Battlegear -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Elves G.thm b/res/quest/themes/Elves G.thm deleted file mode 100644 index d4bb55272c7..00000000000 --- a/res/quest/themes/Elves G.thm +++ /dev/null @@ -1,123 +0,0 @@ -BasicLandPercentage=31 - -[Group MaxCnt=4 Percentage=2] -Wirewood Lodge -Khalni Garden -Sapseep Forest -Pendelhaven -[/Group] - -[Group MaxCnt=4 Percentage=14] -Elvish Champion -Imperious Perfect -Sylvan Messenger -[/Group] - -[Group MaxCnt=4 Percentage=14] -Elvish Vanguard -Immaculate Magistrate -Jagged-Scar Archers -Lys Alana Huntmaster -Wellwisher -Heedless One -Timberwatch Elf -Wirewood Hivemaster -Wolf-Skull Shaman -[/Group] - -[Group MaxCnt=1 Percentage=4] -Eladamri, Lord of Leaves -Ezuri, Renegade Leader -Nissa Revane -Rhys the Exiled -Rhys the Redeemed -[/Group] - -[Group MaxCnt=4 Percentage=10] -Boreal Druid -Defiant Elf -Elvish Handservant -Elvish Herder -Elvish Hexhunter -Elvish Lookout -Elvish Lyrist -Elvish Scrapper -Elvish Skysweeper -Essence Warden -Fyndhorn Elves -Llanowar Elves -Llanowar Mentor -Nettle Sentinel -Norwood Ranger -Skyshroud Elite -Treetop Scout -Twinblade Slasher -Weatherseed Elf -Willow Elf -[/Group] - -[Group MaxCnt=4 Percentage=10] -Carapace Forger -Cylian Elf -Druid of the Anima -Elvish Archers -Elvish Farmer -Elvish Visionary -Elvish Warrior -Leaf Gilder -Multani's Acolyte -Nissa's Chosen -Safehold Elite -Silhana Ledgewalker -Stonewood Invoker -Sylvan Ranger -Tel-Jilad Chosen -Thornweald Archer -Urborg Elf -Viridian Emissary -Viridian Zealot -Warren-Scourge Elf -Wirewood Elf -[/Group] - -[Group MaxCnt=4 Percentage=8] -Caller of the Claw -Civic Wayfinder -Darkwatch Elves -Elvish Harbinger -Elvish Ranger -Titania's Chosen -Treetop Rangers -Viridian Shaman -Wilt-Leaf Cavaliers -Winnower Patrol -Wirewood Savage -Wood Elves -Yavimaya Granger -Elf Replica -[/Group] - -[Group MaxCnt=3 Percentage=5] -Drove of Elves -Ezuri's Brigade -Masked Admirers -Norwood Archers -Oracle of Mul Daya -Skyshroud Troopers -Symbiotic Elf -Tel-Jilad Fallen -Tel-Jilad Outrider -Wildheart Invoker -Wildslayer Elves -Wilt-Leaf Liege -Wilt-Leaf Liege -[/Group] - -[Group MaxCnt=1 Percentage=2] -Elven Riders -Gilt-Leaf Archdruid -Kaysa -Tel-Jilad Archers -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Enchantments WG.thm b/res/quest/themes/Enchantments WG.thm deleted file mode 100644 index 384cffad171..00000000000 --- a/res/quest/themes/Enchantments WG.thm +++ /dev/null @@ -1,63 +0,0 @@ -BasicLandPercentage=13 - -[Group MaxCnt=4 Percentage=20] -Savannah -Graypelt Refuge -Windswept Heath -Razorverge Thicket -Sunpetal Grove -[/Group] - -[Group MaxCnt=4 Percentage=20] -Argothian Enchantress -Enchantress's Presence -Sigil of the Empty Throne -[/Group] - -[Group MaxCnt=4 Percentage=20] -Mesa Enchantress -Verduran Enchantress -Yavimaya Enchantress -Exploration -[/Group] - -[Group MaxCnt=4 Percentage=13] -Ancestral Mask -Greater Auramancy -Seal of Cleansing -Seal of Primordium -Ajani's Mantra -Ghostly Prison -Hoofprints of the Stag -Khalni Heart Expedition -Spidersilk Armor -[/Group] - -[Group MaxCnt=3 Percentage=10] -Bound in Silence -Cessation -Crystallization -Curse of Chains -Journey to Nowhere -Muzzle -Oblivion Ring -Pacifism -Recumbent Bliss -[/Group] - -[Group MaxCnt=2 Percentage=4] -Academy Rector -Auramancer -Cantivore -Femeref Enchantress -Fountain Watch -Lost Auramancers -Mana Matrix -Monk Idealist -Scrapheap -Tethered Griffin -Lucent Liminid -Celestial Ancient -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Equipment W.thm b/res/quest/themes/Equipment W.thm deleted file mode 100644 index 57809a06d19..00000000000 --- a/res/quest/themes/Equipment W.thm +++ /dev/null @@ -1,72 +0,0 @@ -BasicLandPercentage=37 - -[Group MaxCnt=4 Percentage=20] -Auriok Glaivemaster -Kitesail Apprentice -Kor Duelist -Leonin Den-Guard -Sunspear Shikari -Stoneforge Mystic -[/Group] - -[Group MaxCnt=2 Percentage=16] -Kemba, Kha Regent -Loxodon Punisher -Myr Adapter -Skyhunter Cub -Steelshaper Apprentice -Raksha Golden Cub -[/Group] - -[Group MaxCnt=4 Percentage=8] -Adventuring Gear -Bone Saw -Bonesplitter -Leonin Scimitar -Shuko -Sylvok Lifestaff -[/Group] - -[Group MaxCnt=4 Percentage=9] -Basilisk Collar -Bladed Pinions -Blight Sickle -Darksteel Axe -Gorgon Flail -Kitesail -Neurok Hoversail -Runed Stalactite -Specter's Shroud -Spidersilk Net -Sword of the Meek -Trailblazer's Boots -Trusty Machete -Viridian Claw -Vorrac Battlehorns -Vulshok Morningstar -[/Group] - -[Group MaxCnt=4 Percentage=8] -Accorder's Shield -Darksteel Plate -Fireshrieker -Loxodon Warhammer -No-Dachi -Quietus Spike -Slagwurm Armor -Strider Harness -Sword of Body and Mind -Sword of Feast and Famine -Sword of Fire and Ice -Sword of Light and Shadow -Sword of Vengeance -Vulshok Battlegear -[/Group] - -[Group MaxCnt=1 Percentage=2] -Argentum Armor -Ogre's Cleaver -Warlord's Axe -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Exalted WUG.thm b/res/quest/themes/Exalted WUG.thm deleted file mode 100644 index 300ce9bad62..00000000000 --- a/res/quest/themes/Exalted WUG.thm +++ /dev/null @@ -1,58 +0,0 @@ -BasicLandPercentage=8 - -[Group MaxCnt=4 Percentage=28] -Tundra -Savannah -Tropical Island -Flooded Strand -Windswept Heath -Misty Rainforest -Seaside Citadel -[/Group] - -[Group MaxCnt=4 Percentage=10] -Akrasan Squire -Noble Hierarch -[/Group] - -[Group MaxCnt=2 Percentage=12] -Aven Squire -Ethercaste Knight -Qasali Pridemage -Sigiled Paladin -[/Group] - -[Group MaxCnt=4 Percentage=12] -Ardent Plea -Court Archers -Giltspire Avenger -Guardians of Akrasa -[/Group] - -[Group MaxCnt=4 Percentage=14] -Angelic Benediction -Angelic Benediction -Outrider of Jhess -Rafiq of the Many -Rafiq of the Many -Rhox Charger -Stoic Angel -Stoic Angel -Silent Arbiter -[/Group] - -[Group MaxCnt=4 Percentage=12] -Battlegrace Angel -Battlegrace Angel -Finest Hour -Finest Hour -Rhox Bodyguard -Waveskimmer Aven -[/Group] - -[Group MaxCnt=1 Percentage=2] -Sovereigns of Lost Alara -Sigiled Behemoth -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Flying W.thm b/res/quest/themes/Flying W.thm deleted file mode 100644 index 11040a46698..00000000000 --- a/res/quest/themes/Flying W.thm +++ /dev/null @@ -1,140 +0,0 @@ -BasicLandPercentage=36 - -[Group MaxCnt=4 Percentage=24] -Soulcatcher -Moat -Radiant, Archangel -Serra Aviary -Archon of Redemption -[/Group] - -[Group MaxCnt=4 Percentage=3] -Goldenglow Moth -Lantern Kami -Suntail Hawk -[/Group] - -[Group MaxCnt=3 Percentage=9] -Hoofprints of the Stag -Angelic Curator -Araba Mothrider -Armored Pegasus -Aven Squire -Courier Hawk -Duskrider Falcon -Freewind Falcon -Leonin Skyhunter -Mistral Charger -Mourning Thrull -Mystic Familiar -Royal Falcon -Serra Avenger -Skyshroud Falcon -Squadron Hawk -Squall Drifter -Stormfront Pegasus -Arcbound Stinger -[/Group] - -[Group MaxCnt=4 Percentage=10] -Spectral Procession -Aven Riftwatcher -Avian Changeling -Diving Griffin -Griffin Sentinel -Haunted Angel -Hobgoblin Dragoon -Kemba's Skyguard -Moonwing Moth -Nightwind Glider -Pegasus Charger -Skyhunter Prowler -Skyhunter Skirmisher -Slith Ascendant -Thermal Glider -Thunder Spirit -Wild Griffin -Aesthir Glider -Pilgrim's Eye -[/Group] - -[Group MaxCnt=3 Percentage=10] -Armored Griffin -Assault Griffin -Battlewise Aven -Cloud Crusader -Commander Eesha -Daraja Griffin -Dawn Elemental -Ekundu Griffin -Emeria Angel -Herald of Serra -Hunted Lammasu -Indomitable Archangel -Linvala, Keeper of Silence -Makindi Griffin -Malach of the Dawn -Mothrider Samurai -Razorfoot Griffin -Sanctum Gargoyle -Skyhunter Patrol -Spotted Griffin -Tormented Angel -Voice of Duty -Voice of Grace -Voice of Law -Voice of Reason -Voice of Truth -Windborn Muse -Drill-Skimmer -[/Group] - -[Group MaxCnt=1 Percentage=6] -Abbey Gargoyles -Angel of Light -Angel of Mercy -Archon of Justice -Baneslayer Angel -Battlegrace Angel -Castle Raptors -Divinity of Pride -Dragonstalker -Karmic Guide -Lucent Liminid -Melesse Spirit -Nobilis of War -Plover Knights -Reveillark -Serra Angel -Shepherd of the Lost -Starlit Angel -Zuberi, Golden Feather -Dancing Scimitar -[/Group] - -[Group MaxCnt=1 Percentage=2] -Storm Herd -Akroma, Angel of Wrath -Angel of Retribution -Archangel -Aven Brigadier -Blazing Archon -Deathless Angel -Exalted Angel -Harrier Griffin -Iona, Shield of Emeria -Kjeldoran Gargoyle -Luminous Angel -Pearl Dragon -Pristine Angel -Reya Dawnbringer -Silver Seraph -Warrior Angel -Windbrisk Raptor -Darksteel Gargoyle -Lotus Guardian -Platinum Angel -Teeka's Dragon -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Flying WR.thm b/res/quest/themes/Flying WR.thm deleted file mode 100644 index 78383f74b3c..00000000000 --- a/res/quest/themes/Flying WR.thm +++ /dev/null @@ -1,169 +0,0 @@ -BasicLandPercentage=36 - -[Group MaxCnt=4 Percentage=21] -Plateau -Sacred Foundry -Jungle Shrine -Arid Mesa -[/Group] - -[Group MaxCnt=4 Percentage=19] -Soulcatcher -Moat -Radiant, Archangel -Serra Aviary -Archon of Redemption -Ryusei, the Falling Star -Thunder Dragon -[/Group] - -[Group MaxCnt=4 Percentage=10] -Earthquake -Fault Line -Flamebreak -Seismic Shudder -Tremor -Volcanic Spray -[/Group] - - -[Group MaxCnt=4 Percentage=3] -Goldenglow Moth -Lantern Kami -Suntail Hawk -[/Group] - -[Group MaxCnt=3 Percentage=8] -Hoofprints of the Stag -Angelic Curator -Araba Mothrider -Armored Pegasus -Aven Squire -Courier Hawk -Duskrider Falcon -Freewind Falcon -Leonin Skyhunter -Mistral Charger -Mourning Thrull -Mystic Familiar -Royal Falcon -Serra Avenger -Skyshroud Falcon -Squadron Hawk -Squall Drifter -Stormfront Pegasus -Arcbound Stinger -Goblin Glider -Kyren Glider -Utvara Scalper -[/Group] - -[Group MaxCnt=4 Percentage=8] -Spectral Procession -Aven Riftwatcher -Avian Changeling -Diving Griffin -Griffin Sentinel -Haunted Angel -Hobgoblin Dragoon -Kemba's Skyguard -Moonwing Moth -Nightwind Glider -Pegasus Charger -Skyhunter Prowler -Skyhunter Skirmisher -Slith Ascendant -Thermal Glider -Thunder Spirit -Wild Griffin -Aesthir Glider -Pilgrim's Eye -Bird Maiden -Goblin Sky Raider -Granite Gargoyle -Hobgoblin Dragoon -[/Group] - -[Group MaxCnt=3 Percentage=8] -Armored Griffin -Assault Griffin -Battlewise Aven -Cloud Crusader -Commander Eesha -Daraja Griffin -Ekundu Griffin -Emeria Angel -Herald of Serra -Hunted Lammasu -Indomitable Archangel -Linvala, Keeper of Silence -Makindi Griffin -Malach of the Dawn -Mothrider Samurai -Razorfoot Griffin -Sanctum Gargoyle -Skyhunter Patrol -Spotted Griffin -Tormented Angel -Voice of Duty -Voice of Grace -Voice of Law -Voice of Reason -Voice of Truth -Windborn Muse -Drill-Skimmer -Desert Drake -Furnace Whelp -Roc of Kher Ridges -[/Group] - -[Group MaxCnt=1 Percentage=5] -Abbey Gargoyles -Angel of Light -Angel of Mercy -Archon of Justice -Baneslayer Angel -Battlegrace Angel -Castle Raptors -Dragonstalker -Karmic Guide -Lucent Liminid -Melesse Spirit -Nobilis of War -Plover Knights -Reveillark -Serra Angel -Shepherd of the Lost -Starlit Angel -Dancing Scimitar -Hunted Dragon -Kulrath Knight -Sabertooth Wyvern -[/Group] - -[Group MaxCnt=1 Percentage=2] -Storm Herd -Angel of Retribution -Archangel -Blazing Archon -Exalted Angel -Harrier Griffin -Kjeldoran Gargoyle -Pearl Dragon -Pristine Angel -Warrior Angel -Windbrisk Raptor -Darksteel Gargoyle -Lotus Guardian -Platinum Angel -Teeka's Dragon -Bogardan Hellkite -Brimstone Dragon -Rorix Bladewing -Scourge of Kher Ridges -Shivan Dragon -Shivan Phoenix -Volcanic Dragon -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Flying WU.thm b/res/quest/themes/Flying WU.thm deleted file mode 100644 index a32e4ee9e16..00000000000 --- a/res/quest/themes/Flying WU.thm +++ /dev/null @@ -1,228 +0,0 @@ -BasicLandPercentage=14 - -[Group MaxCnt=4 Percentage=22] -Tundra -Jwar Isle Refuge -Flooded Strand -Seachrome Coast -Glacial Fortress -[/Group] - -[Group MaxCnt=4 Percentage=25] -Soulcatcher -Moat -Radiant, Archangel -Serra Aviary -Archon of Redemption -Gravitational Shift -Pride of the Clouds -Pride of the Clouds -[/Group] - -[Group MaxCnt=4 Percentage=3] -Goldenglow Moth -Lantern Kami -Suntail Hawk -Aven Envoy -Cloud Pirates -Cloud Sprite -Flying Men -Spindrift Drake -Zephyr Sprite -[/Group] - -[Group MaxCnt=3 Percentage=8] -Hoofprints of the Stag -Angelic Curator -Araba Mothrider -Armored Pegasus -Aven Squire -Courier Hawk -Duskrider Falcon -Freewind Falcon -Leonin Skyhunter -Mistral Charger -Mourning Thrull -Mystic Familiar -Royal Falcon -Serra Avenger -Skyshroud Falcon -Squadron Hawk -Squall Drifter -Stormfront Pegasus -Arcbound Stinger -Bay Falcon -Briarberry Cohort -Cloud of Faeries -Coast Watcher -Gossamer Phantasm -Sapphire Leech -Sea Eagle -Sea Sprite -Storm Crow -Stormscape Familiar -Surveilling Sprite -Talas Scout -Welkin Tern -Zephyr Falcon -Azorius First-Wing -[/Group] - -[Group MaxCnt=4 Percentage=10] -Spectral Procession -Aven Riftwatcher -Avian Changeling -Diving Griffin -Griffin Sentinel -Haunted Angel -Hobgoblin Dragoon -Kemba's Skyguard -Moonwing Moth -Nightwind Glider -Pegasus Charger -Skyhunter Prowler -Skyhunter Skirmisher -Slith Ascendant -Thermal Glider -Thunder Spirit -Wild Griffin -Aesthir Glider -Pilgrim's Eye -Cloud Elemental -Cloud Spirit -Coastal Drake -Horizon Drake -Illusionary Servant -Kathari Screecher -Rishadan Airship -Serendib Efreet -Silkbind Faerie -Thornwind Faeries -Tower Drake -Umara Raptor -Weatherseed Faeries -Wind Drake -Sky Spirit -Talon Trooper -Tempest Drake -[/Group] - -[Group MaxCnt=3 Percentage=10] -Armored Griffin -Assault Griffin -Battlewise Aven -Cloud Crusader -Commander Eesha -Daraja Griffin -Ekundu Griffin -Emeria Angel -Herald of Serra -Hunted Lammasu -Indomitable Archangel -Linvala, Keeper of Silence -Makindi Griffin -Malach of the Dawn -Mothrider Samurai -Razorfoot Griffin -Sanctum Gargoyle -Skyhunter Patrol -Spotted Griffin -Tormented Angel -Voice of Duty -Voice of Grace -Voice of Law -Voice of Reason -Voice of Truth -Windborn Muse -Drill-Skimmer -Aven Fisher -Aven Fogbringer -Aven Smokeweaver -Azure Drake -Darkslick Drake -Ethereal Whiskergill -Fighting Drake -Fledgling Mawcor -Ghost Ship -Hoverguard Observer -Kingfisher -Messenger Falcons -Mirozel -Phantasmal Forces -Phantom Monster -Silver Erne -Snapping Drake -Sower of Temptation -Stronghold Zeppelin -Talas Air Ship -Thieving Magpie -Treetop Sentinel -Tradewind Rider -Esper Cormorants -Hazerider Drake -[/Group] - -[Group MaxCnt=1 Percentage=6] -Angel of Light -Angel of Mercy -Archon of Justice -Baneslayer Angel -Battlegrace Angel -Castle Raptors -Dragonstalker -Karmic Guide -Lucent Liminid -Melesse Spirit -Plover Knights -Reveillark -Serra Angel -Shepherd of the Lost -Starlit Angel -Dancing Scimitar -Air Elemental -Cerulean Wyvern -Cloudheath Drake -Ethersworn Adjudicator -Hunting Drake -Mawcor -Meloku the Clouded Mirror -Mulldrifter -Serra Sphinx -Sky Ruin Drake -Stratozeppelid -Vigilant Drake -Whip-Spine Drake -[/Group] - -[Group MaxCnt=1 Percentage=2] -Storm Herd -Angel of Retribution -Archangel -Blazing Archon -Consecrated Sphinx -Exalted Angel -Harrier Griffin -Kjeldoran Gargoyle -Pearl Dragon -Pristine Angel -Warrior Angel -Windbrisk Raptor -Darksteel Gargoyle -Lotus Guardian -Platinum Angel -Teeka's Dragon -Avatar of Will -Blizzard Elemental -Cloud Djinn -Cloud Dragon -Djinn of the Lamp -Goliath Sphinx -Keiga, the Tide Star -Mahamoti Djinn -Sibilant Spirit -Sphinx of Magosi -Zephid -Iridescent Angel -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Fungi and Saprolings WG.thm b/res/quest/themes/Fungi and Saprolings WG.thm deleted file mode 100644 index 51c85f489cc..00000000000 --- a/res/quest/themes/Fungi and Saprolings WG.thm +++ /dev/null @@ -1,59 +0,0 @@ -BasicLandPercentage=12 - -[Group MaxCnt=4 Percentage=23] -Savannah -Graypelt Refuge -Windswept Heath -Razorverge Thicket -Sunpetal Grove -[/Group] - -[Group MaxCnt=4 Percentage=9] -Thallid -Tukatongue Thallid -Utopia Mycon -[/Group] - -[Group MaxCnt=4 Percentage=18] -Elvish Farmer -Fists of Ironwood -Fungal Bloom -Mycologist -Selesnya Guildmage -Spore Flower -Thallid Shell-Dweller -Vitaspore Thallid -[/Group] - -[Group MaxCnt=4 Percentage=10] -Psychotrope Thallid -Thallid Devourer -Thallid Germinator -Thorn Thallid -[/Group] - -[Group MaxCnt=3 Percentage=14] -Leyline of the Meek -Pallid Mycoderm -Sporesower Thallid -Sporesower Thallid -Spontaneous Generation -Thelonite Hermit -Thelonite Hermit -[/Group] - -[Group MaxCnt=3 Percentage=12] -Doubling Season -Doubling Season -Parallel Evolution -Savage Thallid -Sporoloth Ancient -Sporoloth Ancient -[/Group] - -[Group MaxCnt=1 Percentage=2] -Feral Thallid -Nemata, Grove Guardian -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Giants R.thm b/res/quest/themes/Giants R.thm deleted file mode 100644 index 18251910195..00000000000 --- a/res/quest/themes/Giants R.thm +++ /dev/null @@ -1,43 +0,0 @@ -BasicLandPercentage=39 - -[Group MaxCnt=4 Percentage=13] -Stinkdrinker Daredevil -Sunrise Sovereign -[/Group] - -[Group MaxCnt=4 Percentage=13] -Blind-Spot Giant -Borderland Behemoth -Giant Harbinger -[/Group] - -[Group MaxCnt=4 Percentage=15] -Craven Giant -Hammerheim Deadeye -Highland Giant -Hill Giant -Lowland Giant -Shatterskull Giant -Slinking Giant -Tor Giant -[/Group] - -[Group MaxCnt=4 Percentage=10] -Fomori Nomad -Kuldotha Ringleader -Obsidian Giant -Thundering Giant -[/Group] - -[Group MaxCnt=2 Percentage=10] -Akoum Boulderfoot -Axegrinder Giant -Frost Giant -Hamletback Goliath -Hammerfist Giant -Inferno Titan -Loamdragger Giant -Magma Giant -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Giants WR.thm b/res/quest/themes/Giants WR.thm deleted file mode 100644 index 5f78a2b1261..00000000000 --- a/res/quest/themes/Giants WR.thm +++ /dev/null @@ -1,57 +0,0 @@ -BasicLandPercentage=15 - -[Group MaxCnt=4 Percentage=23] -Plateau -Sacred Foundry -Jungle Shrine -Arid Mesa -Ancient Amphitheater -[/Group] - -[Group MaxCnt=4 Percentage=13] -Stinkdrinker Daredevil -Sunrise Sovereign -[/Group] - -[Group MaxCnt=4 Percentage=16] -Blind-Spot Giant -Borderland Behemoth -Giant Harbinger -Wandering Graybeard -Kithkin Greatheart -[/Group] - -[Group MaxCnt=4 Percentage=13] -Craven Giant -Hammerheim Deadeye -Highland Giant -Hill Giant -Lowland Giant -Shatterskull Giant -Slinking Giant -Tor Giant -Hillcomber Giant -[/Group] - -[Group MaxCnt=4 Percentage=10] -Fomori Nomad -Frost Giant -Obsidian Giant -Thundering Giant -Battle Hurda -Caravan Hurda -[/Group] - -[Group MaxCnt=2 Percentage=10] -Akoum Boulderfoot -Axegrinder Giant -Hammerfist Giant -Inferno Titan -Magma Giant -Feudkiller's Verdict -Ivory Guardians -Oathsworn Giant -Sun Titan -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Goblins BR.thm b/res/quest/themes/Goblins BR.thm deleted file mode 100644 index 0763dfdea2a..00000000000 --- a/res/quest/themes/Goblins BR.thm +++ /dev/null @@ -1,162 +0,0 @@ -BasicLandPercentage=23 - -[Group MaxCnt=4 Percentage=13] -Badlands -Blood Crypt -Bloodstained Mire -Auntie's Hovel -[/Group] - -[Group MaxCnt=4 Percentage=30] -Goblin Ringleader -Goblin King -Goblin Matron -Goblin Lackey -Goblin Piledriver -Goblin Warchief -Goblin Chieftain -Mad Auntie -Frogtosser Banneret -Wort, Boggart Auntie -[/Group] - -[Group MaxCnt=2 Percentage=10] -Goblin General -Goblin Marshal -Goblin Matron -Knucklebone Witch -Knucklebone Witch -Mogg War Marshal -Mudbutton Clanger -Reckless One -Reckless One -Sensation Gorger -Siege-Gang Commander -[/Group] - -[Group MaxCnt=4 Percentage=6] -Boggart Birth Rite -Boggart Shenanigans -Goblin Grenade -Goblin Grenade -Fodder Launch -Fodder Launch -Patriarch's Bidding -Tarfire -Tarfire -[/Group] - -[Group MaxCnt=4 Percentage=5] -Crazed Goblin -Boros Recruit -Festering Goblin -Goblin Arsonist -Goblin Arsonist -Goblin Balloon Brigade -Goblin Digging Team -Goblin Firestarter -Goblin Gaveleer -Goblin Guide -Goblin Mountaineer -Goblin Patrol -Mogg Fanatic -Mogg Sentry -Mons's Goblin Raiders -Prickly Boggart -Prickly Boggart -Raging Goblin -Scuzzback Scrapper -Spikeshot Elder -Stream Hopper -Tattermunge Maniac -[/Group] - -[Group MaxCnt=4 Percentage=4] -Adder-Staff Boggart -Akki Blizzard-Herder -Akki Raider -Akki Underling -Bloodmark Mentor -Exiled Boggart -Goatnapper -Goblin Brigand -Goblin Bully -Goblin Deathraiders -Goblin Deathraiders -Goblin Elite Infantry -Goblin Firebug -Goblin Glider -Dragon Fodder -Goblin Outlander -Goblin Outlander -Goblin Piker -Goblin Raider -Goblin Shortcutter -Goblin Striker -Goblin War Buggy -Hulking Goblin -Jund Hackblade -Kyren Glider -Marsh Goblins -Mogg Jailer -Mogg Maniac -Mudbrawler Cohort -Nath's Buffoon -Rustrazor Butcher -Slavering Nulls -Utvara Scalper -[/Group] - -[Group MaxCnt=4 Percentage=4] -Arms Dealer -Blisterstick Shaman -Boggart Arsonists -Boggart Loggers -Enslaved Scout -Flamewave Invoker -Goblin Cavaliers -Goblin Chariot -Goblin Hero -Goblin Medics -Goblin Roughrider -Goblin Sharpshooter -Goblin Sky Raider -Goblin Spelunkers -Hobgoblin Dragoon -Kyren Sniper -Lavafume Invoker -Mudbutton Torchrunner -Slingshot Goblin -Spiderwig Boggart -Spikeshot Goblin -Squeaking Pie Grubfellows -Squee, Goblin Nabob -Tattermunge Duo -Tuktuk the Explorer -[/Group] - -[Group MaxCnt=4 Percentage=4] -Akki Underminer -Battle-Rattle Shaman -Blackcleave Goblin -Boggart Mob -Goblin Berserker -Goblin Settler -Hornet Harasser -Lightning Crafter -Murderous Redcap -Murderous Redcap -Murderous Redcap -Quill-Slinger Boggart -Tar Pitcher -[/Group] - -[Group MaxCnt=1 Percentage=2] -Battle Squadron -Bog Hoodlums -Goblin Commando -Scuzzback Marauders -Tuktuk Grunts -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Goblins R.thm b/res/quest/themes/Goblins R.thm deleted file mode 100644 index 30d687c8795..00000000000 --- a/res/quest/themes/Goblins R.thm +++ /dev/null @@ -1,131 +0,0 @@ -BasicLandPercentage=35 - -[Group MaxCnt=4 Percentage=30] -Goblin Ringleader -Goblin General -Goblin King -Goblin Piledriver -Goblin Warchief -Goblin Lackey -Goblin Chieftain -Warren Instigator -[/Group] - -[Group MaxCnt=1 Percentage=16] -Boggart Shenanigans -Goblin Matron -Sensation Gorger -Goblin Grenade -Tarfire -Reckless One -Mogg War Marshal -Siege-Gang Commander -Mudbutton Clanger -Goblin Marshal -[/Group] - -[Group MaxCnt=4 Percentage=5] -Crazed Goblin -Boros Recruit -Goblin Arsonist -Goblin Arsonist -Goblin Balloon Brigade -Goblin Digging Team -Goblin Firestarter -Goblin Gaveleer -Goblin Guide -Goblin Masons -Goblin Mountaineer -Goblin Patrol -Mogg Fanatic -Mogg Sentry -Mons's Goblin Raiders -Raging Goblin -Scuzzback Scrapper -Spikeshot Elder -Stream Hopper -Tattermunge Maniac -[/Group] - -[Group MaxCnt=4 Percentage=4] -Adder-Staff Boggart -Akki Blizzard-Herder -Akki Raider -Akki Underling -Bloodmark Mentor -Bloodmark Mentor -Ember Hauler -Goblin Brigand -Goblin Bully -Goblin Elite Infantry -Goblin Firebug -Goblin Glider -Dragon Fodder -Goblin Piker -Goblin Raider -Goblin Shortcutter -Goblin Striker -Goblin War Buggy -Goblin Wardriver -Hulking Goblin -Kyren Glider -Mogg Jailer -Mogg Maniac -Mudbrawler Cohort -Mudbrawler Cohort -Rustrazor Butcher -Utvara Scalper -[/Group] - -[Group MaxCnt=4 Percentage=4] -Arms Dealer -Blisterstick Shaman -Boggart Arsonists -Boggart Ram-Gang -Enslaved Scout -Flamewave Invoker -Goatnapper -Goblin Artillery -Goblin Cavaliers -Goblin Chariot -Goblin Hero -Goblin Medics -Goblin Roughrider -Goblin Sharpshooter -Goblin Sky Raider -Goblin Spelunkers -Hearthfire Hobgoblin -Hobgoblin Dragoon -Kyren Sniper -Lavafume Invoker -Mudbutton Torchrunner -Skirk Shaman -Slingshot Goblin -Spikeshot Goblin -Squee, Goblin Nabob -Tattermunge Duo -Tuktuk the Explorer -[/Group] - -[Group MaxCnt=4 Percentage=4] -Akki Underminer -Battle-Rattle Shaman -Boartusk Liege -Goblin Berserker -Goblin Gardener -Goblin Settler -Lightning Crafter -Murderous Redcap -Tar Pitcher -[/Group] - -[Group MaxCnt=1 Percentage=2] -Battle Squadron -Goblin Commando -Kiki-Jiki, Mirror Breaker -Outrage Shaman -Scuzzback Marauders -Tuktuk Grunts -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Indestructibility WB.thm b/res/quest/themes/Indestructibility WB.thm deleted file mode 100644 index 590786a289e..00000000000 --- a/res/quest/themes/Indestructibility WB.thm +++ /dev/null @@ -1,37 +0,0 @@ -BasicLandPercentage=20 - -[Group MaxCnt=4 Percentage=19] -Scrubland -Arcane Sanctum -Darksteel Citadel -[/Group] - -[Group MaxCnt=4 Percentage=33] -Darksteel Ingot -Darksteel Gargoyle -Stuffy Doll -Phylactery Lich -Darksteel Axe -Darksteel Myr -Darksteel Sentinel -[/Group] - -[Group MaxCnt=1 Percentage=5] -Myr Matrix -Darksteel Colossus -Darksteel Juggernaut -Sapling of Colfenor -Ulamog, the Infinite Gyre -Konda, Lord of Eiganjo -[/Group] - -[Group MaxCnt=4 Percentage=23] -Wrath of God -Damnation -Day of Judgment -Planar Cleansing -Akroma's Vengeance -Winds of Rath -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Islandwalk U.thm b/res/quest/themes/Islandwalk U.thm deleted file mode 100644 index f90cc0e060e..00000000000 --- a/res/quest/themes/Islandwalk U.thm +++ /dev/null @@ -1,62 +0,0 @@ -BasicLandPercentage=36 - -[Group MaxCnt=4 Percentage=18] -Lingering Mirage -Sea's Claim -Spreading Seas -Spreading Seas -[/Group] - -[Group MaxCnt=4 Percentage=3] -Grayscaled Gharial -Merchant Ship -Water Wurm -[/Group] - -[Group MaxCnt=4 Percentage=10] -Stonybrook Banneret -Dandan -Hammerhead Shark -[/Group] - -[Group MaxCnt=4 Percentage=10] -Cold-Eyed Selkie -Devouring Deep -Rootwater Commando -Manta Ray -Steam Frigate -Wu Warship -Spire Golem -[/Group] - -[Group MaxCnt=3 Percentage=7] -Ethereal Whiskergill -Merrow Harbinger -Merfolk Seastalkers -[/Group] - -[Group MaxCnt=3 Percentage=8] -Segovian Leviathan -Armored Galleon -Inkfathom Divers -Pirate Ship -Red Cliffs Armada -Serpent of the Endless Sea -[/Group] - -[Group MaxCnt=2 Percentage=6] -Harbor Serpent -Deep-Sea Serpent -Sea Monster -Sea Serpent -[/Group] - -[Group MaxCnt=1 Percentage=2] -Benthic Behemoth -Inkwell Leviathan -Slipstream Eel -Slipstream Serpent -Zhou Yu, Chief Commander -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Kithkin W.thm b/res/quest/themes/Kithkin W.thm deleted file mode 100644 index 3f8e2ec9186..00000000000 --- a/res/quest/themes/Kithkin W.thm +++ /dev/null @@ -1,56 +0,0 @@ -BasicLandPercentage=33 - -[Group MaxCnt=4 Percentage=2] -Emeria, the Sky Ruin -Kabira Crossroads -Karakas -Flagstones of Trokair -[/Group] - -[Group MaxCnt=4 Percentage=15] -Ballyrush Banneret -Kinsbaile Borderguard -Wizened Cenn -[/Group] - -[Group MaxCnt=4 Percentage=12] -Figure of Destiny -Apothecary Initiate -Goldmeadow Dodger -Goldmeadow Harrier -Mosquito Guard -[/Group] - -[Group MaxCnt=4 Percentage=12] -Patrol Signaler -Amrou Kithkin -Amrou Scout -Knight of Meadowgrain -Mistmeadow Skulk -Order of the Golden Cricket -Somnomancer -[/Group] - -[Group MaxCnt=4 Percentage=14] -Kithkin Harbinger -Amrou Seekers -Ballynock Cohort -Ballynock Cohort -Burrenton Bombardier -Preeminent Captain -Kithkin Zephyrnaut -Kithkin Zephyrnaut -[/Group] - -[Group MaxCnt=3 Percentage=12] -Ballynock Trapper -Barrenton Cragtreads -Kinsbaile Cavalier -Kithkin Rabble -Kithkin Rabble -Plover Knights -Springjack Shepherd -Thistledown Liege -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Landfall brG.thm b/res/quest/themes/Landfall brG.thm deleted file mode 100644 index fa2c753581c..00000000000 --- a/res/quest/themes/Landfall brG.thm +++ /dev/null @@ -1,70 +0,0 @@ -BasicLandPercentage=10 - -[Group MaxCnt=4 Percentage=22] -Bayou -Taiga -Bloodstained Mire -Verdant Catacombs -Wooded Foothills -[/Group] - -[Group MaxCnt=4 Percentage=8] -Darigaaz's Caldera -Undiscovered Paradise -Undiscovered Paradise -Undiscovered Paradise -Undiscovered Paradise -Undiscovered Paradise -[/Group] - -[Group MaxCnt=4 Percentage=12] -Exploration -Exploration -Exploration -Exploration -Farseek -Spoils of Victory -Storm Cauldron -[/Group] - -[Group MaxCnt=4 Percentage=17] -Adventuring Gear -Bloodghast -Hedron Scrabbler -Khalni Heart Expedition -Plated Geopede -Soul Stair Expedition -Surrakar Marauder -Vinelasher Kudzu -Zektar Shrine Expedition -[/Group] - -[Group MaxCnt=4 Percentage=10] -Grazing Gladehart -Horn of Greed -Lifegift -Snapping Creeper -[/Group] - -[Group MaxCnt=4 Percentage=10] -Cosi's Ravager -Hagra Crocodile -Hedron Rover -Seed the Land -Seer's Sundial -[/Group] - -[Group MaxCnt=4 Percentage=8] -Caustic Crawler -Geyser Glider -Ob Nixilis, the Fallen -Territorial Baloth -[/Group] - -[Group MaxCnt=4 Percentage=3] -Avenger of Zendikar -Baloth Woodcrasher -Rampaging Baloths -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Lands WRG.thm b/res/quest/themes/Lands WRG.thm deleted file mode 100644 index 07600a6cbc2..00000000000 --- a/res/quest/themes/Lands WRG.thm +++ /dev/null @@ -1,62 +0,0 @@ -BasicLandPercentage=2 - -[Group MaxCnt=4 Percentage=48] -Blinkmoth Nexus -Dread Statuary -Forbidding Watchtower -Ghitu Encampment -Mishra's Factory -Mutavault -Raging Ravine -Stirring Wildwood -Karakas -The Tabernacle at Pendrell Vale -Treetop Village -Dryad Arbor -[/Group] - -[Group MaxCnt=2 Percentage=5] -Kabira Crossroads -Karakas -The Tabernacle at Pendrell Vale -The Tabernacle at Pendrell Vale -The Tabernacle at Pendrell Vale -The Tabernacle at Pendrell Vale -[/Group] - -[Group MaxCnt=4 Percentage=10] -Jungle Shrine -Plateau -Taiga -Savannah -[/Group] - -[Group MaxCnt=4 Percentage=5] -Arid Mesa -Windswept Heath -Wooded Foothills -[/Group] - -[Group MaxCnt=4 Percentage=8] -Earth Surge -Terra Eternal -[/Group] - -[Group MaxCnt=4 Percentage=12] -Burgeoning -Crucible of Worlds -Exploration -[/Group] - -[Group MaxCnt=4 Percentage=10] -Wrath of God -Damnation -Day of Judgment -Final Judgment -Hallowed Burial -Planar Cleansing -Akroma's Vengeance -Winds of Rath -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Legends WG.thm b/res/quest/themes/Legends WG.thm deleted file mode 100644 index f88d1fa758e..00000000000 --- a/res/quest/themes/Legends WG.thm +++ /dev/null @@ -1,84 +0,0 @@ -BasicLandPercentage=14 - -[Group MaxCnt=4 Percentage=23] -Savannah -Graypelt Refuge -Windswept Heath -Razorverge Thicket -Sunpetal Grove -[/Group] - -[Group MaxCnt=2 Percentage=14] -Captain Sisay -Day of Destiny -Loyal Retainers -Reki, the History of Kamigawa -Sword of the Chosen -Tenza, Godo's Maul -Yomiji, Who Bars the Way -[/Group] - -[Group MaxCnt=2 Percentage=8] -Gaddock Teeg -Isamaru, Hound of Konda -Kataki, War's Wage -Rhys the Redeemed -[/Group] - -[Group MaxCnt=2 Percentage=8] -Azusa, Lost but Seeking -Isao, Enlightened Bushi -Masako the Humorless -Mirri, Cat Warrior -Tivadar of Thorn -Zuo Ci, the Mocking Sage -[/Group] - -[Group MaxCnt=2 Percentage=8] -Cho-Manno, Revolutionary -Commander Eesha -Huang Zhong, Shu General -Iwamori of the Open Fist -Kongming, "Sleeping Dragon" -Linvala, Keeper of Silence -Sosuke, Son of Seshiro -Thrun, the Last Troll -[/Group] - -[Group MaxCnt=1 Percentage=11] -Ayumi, the Last Visitor -Guan Yu, Sainted Warrior -Jasmine Boreal -Kaysa -Kodama of the North Tree -Lady Zhurong, Warrior Queen -Liu Bei, Lord of Shu -Meng Huo, Barbarian King -Radiant, Archangel -Sapling of Colfenor -Zhao Zilong, Tiger General -[/Group] - -[Group MaxCnt=1 Percentage=10] -Darien, King of Kjeldor -Jedit Ojanen of Efrava -Jugan, the Rising Star -Lord Magnus -Nemata, Grove Guardian -Silvos, Rogue Elemental -Sir Shandlar of Eberyn -Tolsimir Wolfblood -Torsten Von Ursus -Yosei, the Morning Star -Zhang Fei, Fierce Warrior -[/Group] - -[Group MaxCnt=1 Percentage=4] -Akroma, Angel of Wrath -Iona, Shield of Emeria -Konda, Lord of Eiganjo -Reya Dawnbringer -Thriss, Nantuko Primus -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Leyline of Singularity WUBRG.thm b/res/quest/themes/Leyline of Singularity WUBRG.thm deleted file mode 100644 index 2c0260e2248..00000000000 --- a/res/quest/themes/Leyline of Singularity WUBRG.thm +++ /dev/null @@ -1,99 +0,0 @@ -BasicLandPercentage=5 - -[Group MaxCnt=4 Percentage=12] -Forbidden Orchard -Forbidden Orchard -Forbidden Orchard -Karakas -Karakas -Undiscovered Paradise -Tendo Ice Bridge -[/Group] - -[Group MaxCnt=1 Percentage=9] -Underground Sea -Plateau -Taiga -Tropical Island -Scrubland -Bayou -Tundra -Savannah -Badlands -Volcanic Island -[/Group] - -[Group MaxCnt=1 Percentage=9] -Arid Mesa -Bloodstained Mire -Flooded Strand -Marsh Flats -Misty Rainforest -Polluted Delta -Scalding Tarn -Verdant Catacombs -Windswept Heath -Wooded Foothills -[/Group] - -[Group MaxCnt=4 Percentage=8] -Leyline of Singularity -[/Group] - -[Group MaxCnt=3 Percentage=10] -Idyllic Tutor -Time of Need -[/Group] - -[Group MaxCnt=1 Percentage=9] -Captain Sisay -Empress Galina -Tsabo Tavoc -Willow Satyr -Day of Destiny -[/Group] - -[Group MaxCnt=1 Percentage=5] -Darksteel Ingot -Birds of Paradise -Joiner Adept -Utopia Tree -[/Group] - -[Group MaxCnt=1 Percentage=5] -Hunted Dragon -Hunted Horror -Hunted Phantasm -Hunted Troll -[/Group] - -[Group MaxCnt=4 Percentage=10] -Hero's Demise -Gerrard's Verdict -Heroes' Reunion -Lightning Helix -Terminate -[/Group] - -[Group MaxCnt=4 Percentage=13] -Absorb -Blightning -Maelstrom Pulse -Mortify -Putrefy -Recoil -Temporal Spring -Undermine -Unmake -Vindicate -[/Group] - -[Group MaxCnt=4 Percentage=5] -Captured Sunlight -Drain the Well -Poison the Well -Punish Ignorance -Wreak Havoc -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Lifegain WBG.thm b/res/quest/themes/Lifegain WBG.thm deleted file mode 100644 index 2a7a3dfbca4..00000000000 --- a/res/quest/themes/Lifegain WBG.thm +++ /dev/null @@ -1,164 +0,0 @@ -BasicLandPercentage=15 - -[Group MaxCnt=4 Percentage=20] -Bayou -Savannah -Scrubland -Marsh Flats -Verdant Catacombs -Windswept Heath -Graypelt Refuge -Kabira Crossroads -[/Group] - -[Group MaxCnt=4 Percentage=12] -Serra Ascendant -Ajani's Pridemate -[/Group] - -[Group MaxCnt=4 Percentage=14] -Ageless Entity -Cradle of Vitality -Divinity of Pride -Felidar Sovereign -Sanguine Bond -[/Group] - -[Group MaxCnt=1 Percentage=4] -Feudkiller's Verdict -Test of Endurance -Serra Avatar -Storm Herd -[/Group] - -[Group MaxCnt=3 Percentage=5] -Apothecary Initiate -Deathgreeter -Devout Monk -Essence Warden -Shadowfeed -Soul Warden -Soul's Attendant -[/Group] - -[Group MaxCnt=3 Percentage=6] -Ajani's Mantra -Auriok Champion -Blessed Wine -Child of Night -Divine Offering -Gerrard's Verdict -Heroes' Reunion -Knight of Meadowgrain -Lone Missionary -Mourning Thrull -Nourish -Sacred Nectar -Soothing Balm -Sun's Bounty -Temple Acolyte -Vicious Hunger -Whitesun's Passage -[/Group] - -[Group MaxCnt=3 Percentage=7] -Armadillo Cloak -Aven Riftwatcher -Bargain -Contemplation -Douse in Gloom -Grazing Gladehart -Kemba's Skyguard -Kitchen Finks -Last Caress -Last Kiss -Lifegift -Marble Chalice -Recumbent Bliss -Renewed Faith -Reviving Dose -Shu Grain Caravan -Solemn Offering -Terashi's Grasp -Touch of Death -Vampire Nighthawk -Vampiric Touch -Venerable Monk -[/Group] - -[Group MaxCnt=3 Percentage=6] -Ajani Goldmane -Ajani Goldmane -Ajani Goldmane -Angel's Mercy -Blood Tithe -Captured Sunlight -Captured Sunlight -Congregate -Dakmor Ghoul -Drain the Well -Essence Sliver -Exalted Angel -Gerrard's Wisdom -Highway Robber -Honden of Cleansing Fire -Horned Cheetah -Joyous Respite -Leyline of Vitality -Loxodon Hierarch -Obstinate Baloth -Presence of the Wise -Radiant's Dragoons -Teroh's Faithful -Wall of Reverence -Zebra Unicorn -[/Group] - -[Group MaxCnt=3 Percentage=5] -Agent of Masks -Angel of Mercy -Angelic Chorus -Archon of Redemption -Baneslayer Angel -Boon Reflection -Bountiful Harvest -Creakwood Ghoul -Dosan's Oldest Chant -Essence Drain -Natural Spring -Noble Purpose -Rhox Bodyguard -Sever Soul -Shu Soldier-Farmers -Soul Feast -Soul Shred -Spiritual Guardian -Spring of Eternal Peace -Staunch Defenders -Subversion -Tireless Missionaries -[/Group] - -[Group MaxCnt=1 Percentage=4] -Arctic Nishoba -Dark Offering -Jedit's Dragoons -Kiss of Death -Kjeldoran Gargoyle -Kokusho, the Evening Star -Poison Arrow -Purity -Righteous Fury -Stolen Grain -Warrior Angel -[/Group] - -[Group MaxCnt=1 Percentage=2] -Ancestor's Chosen -Ancestral Tribute -Pelakka Wurm -Phantom Nishoba -Vampiric Feast -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Lorescale Coatl Urg.thm b/res/quest/themes/Lorescale Coatl Urg.thm deleted file mode 100644 index 0ed68209453..00000000000 --- a/res/quest/themes/Lorescale Coatl Urg.thm +++ /dev/null @@ -1,75 +0,0 @@ -BasicLandPercentage=13 - -[Group MaxCnt=4 Percentage=22] -Tropical Island -Tropical Island -Volcanic Island -Misty Rainforest -Misty Rainforest -Scalding Tarn -[/Group] - -[Group MaxCnt=4 Percentage=13] -Jace's Erasure -Lorescale Coatl -Lorescale Coatl -Lorescale Coatl -Psychosis Crawler -[/Group] - -[Group MaxCnt=1 Percentage=8] -Ancestral Recall -Kami of the Crescent Moon -Jace Beleren -Timetwister -Wheel of Fortune -Windfall -[/Group] - -[Group MaxCnt=4 Percentage=10] -Brainstorm -Burning Inquiry -Winds of Change -[/Group] - -[Group MaxCnt=4 Percentage=9] -Control of the Court -Courier's Capsule -Goblin Lore -Howling Mine -See Beyond -Words of Wisdom -[/Group] - -[Group MaxCnt=1 Percentage=9] -Compulsive Research -Counsel of the Soratami -Divination -Thirst for Knowledge -Temple Bell -[/Group] - -[Group MaxCnt=4 Percentage=8] -Careful Consideration -Concentrate -Harmonize -Jungle Barrier -Sift -[/Group] - -[Group MaxCnt=4 Percentage=8] -Allied Strategies -Brilliant Plan -Mulldrifter -Overbeing of Myth -Tidings -Time Reversal -[/Group] - -[Group MaxCnt=1 Percentage=2] -Niv-Mizzet, the Firemind -Niv-Mizzet, the Firemind -Opportunity -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Megrim UBR.thm b/res/quest/themes/Megrim UBR.thm deleted file mode 100644 index 0620bd3b0bb..00000000000 --- a/res/quest/themes/Megrim UBR.thm +++ /dev/null @@ -1,74 +0,0 @@ -BasicLandPercentage=16 - -[Group MaxCnt=4 Percentage=21] -Underground Sea -Badlands -Volcanic Island -Crumbling Necropolis -Bloodstained Mire -Polluted Delta -[/Group] - -[Group MaxCnt=4 Percentage=18] -Abyssal Nocturnus -Megrim -Megrim -Megrim -Liliana's Caress -Liliana's Caress -Liliana's Caress -Geth's Grimoire -Sangromancer -[/Group] - -[Group MaxCnt=4 Percentage=28] -Recoil -Recoil -Burning Inquiry -Burning Inquiry -Wheel of Fortune -Windfall -Wheel and Deal -Hymn to Tourach -Blightning -Urza's Guilt -[/Group] - -[Group MaxCnt=4 Percentage=1] -Corrupt Court Official -Ravenous Rats -[/Group] - -[Group MaxCnt=4 Percentage=7] -Alley Grifters -Chilling Apparition -Cunning Lethemancer -Dimir Cutpurse -Hypnotic Specter -Sedraxis Specter -Liliana's Specter -Stupor -[/Group] - -[Group MaxCnt=1 Percentage=6] -Abyssal Nightstalker -Abyssal Specter -Blazing Specter -Cackling Fiend -Hellhole Rats -Order of Yawgmoth -Wei Night Raiders -[/Group] - -[Group MaxCnt=1 Percentage=3] -Liliana Vess -Abyssal Horror -Shrieking Specter -Silent Specter -Brutal Nightstalker -Cruel Ultimatum -Ebon Dragon -Zhang Liao, Hero of Hefei -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Merfolk U.thm b/res/quest/themes/Merfolk U.thm deleted file mode 100644 index cffc286ba0f..00000000000 --- a/res/quest/themes/Merfolk U.thm +++ /dev/null @@ -1,62 +0,0 @@ -BasicLandPercentage=35 - -[Group MaxCnt=4 Percentage=20] -Coralhelm Commander -Lord of Atlantis -Merfolk Sovereign -Stonybrook Banneret -Tidal Courier -[/Group] - -[Group MaxCnt=4 Percentage=5] -Manta Riders -Merfolk of the Pearl Trident -Sandbar Merfolk -Skywatcher Adept -[/Group] - -[Group MaxCnt=4 Percentage=13] -Coral Merfolk -Deeptread Merrow -Halimar Wavewatch -Inkfathom Infiltrator -Maritime Guard -Merfolk Assassin -Merrow Commerce -Riptide Pilferer -River Merfolk -Saprazzan Heir -Vodalian Soldiers -[/Group] - -[Group MaxCnt=4 Percentage=13] -Ambassador Laquatus -Cold-Eyed Selkie -Enclave Elite -Merfolk Seer -Rootwater Commando -Rootwater Hunter -Scroll Thief -Seasinger -Shoreline Raider -Wake Thrasher -Wistful Selkie -[/Group] - -[Group MaxCnt=3 Percentage=9] -Seahunter -Fallowsage -Merfolk Seastalkers -Merrow Harbinger -Merrow Levitator -Wanderbrine Rootcutters -[/Group] - -[Group MaxCnt=2 Percentage=5] -Deepchannel Mentor -Empress Galina -Frostwind Invoker -Gravelgill Axeshark -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Milling UB.thm b/res/quest/themes/Milling UB.thm deleted file mode 100644 index ff82e9cdcab..00000000000 --- a/res/quest/themes/Milling UB.thm +++ /dev/null @@ -1,63 +0,0 @@ -BasicLandPercentage=22 - -[Group MaxCnt=4 Percentage=13] -Underground Sea -Polluted Delta -[/Group] - -[Group MaxCnt=4 Percentage=28] -Duskmantle, House of Shadow -Cathartic Adept -Grindstone -Hedron Crab -Hedron Crab -Horrifying Revelation -Ray of Erasure -Shriekhorn -Shriekhorn -Tome Scour -Tome Scour -Merrow Witsniper -[/Group] - -[Group MaxCnt=4 Percentage=15] -Brain Freeze -Glimpse the Unthinkable -Glimpse the Unthinkable -Grindclock -Jace's Erasure -Mesmeric Orb -Millstone -Millstone -[/Group] - -[Group MaxCnt=2 Percentage=10] -Ambassador Laquatus -Dreamborn Muse -Jace Beleren -Memory Erosion -Mind Funeral -Drowner of Secrets -Sanity Grinding -Whetstone -[/Group] - -[Group MaxCnt=3 Percentage=8] -Lich Lord of Unx -Nemesis of Reason -Nemesis of Reason -Psychic Drain -Soratami Mindsweeper -Vedalken Entrancer -Traumatize -Traumatize -[/Group] - -[Group MaxCnt=1 Percentage=4] -Geth, Lord of the Vault -Keening Stone -Szadek, Lord of Secrets -Tower of Murmurs -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Mono Black.thm b/res/quest/themes/Mono Black.thm deleted file mode 100644 index 18c906b8327..00000000000 --- a/res/quest/themes/Mono Black.thm +++ /dev/null @@ -1,69 +0,0 @@ -BasicLandPercentage=36 - -[Group MaxCnt=3 Percentage=13] -Ascendant Evincar -Bad Moon -Bad Moon -Corrosive Mentor -[/Group] - -[Group MaxCnt=4 Percentage=22] -Ashenmoor Cohort -Crowd of Cinders -Hellfire -Korlash, Heir to Blackblade -Nocturnal Raid -Umbra Stalker -Vampire Nocturnus -Corrupt -Mind Sludge -Nightmare -Tendrils of Corruption -Quag Sickness -Kaervek's Hex -[/Group] - -[Group MaxCnt=4 Percentage=21] -Black Knight -Dauthi Slayer -Bloodghast -Death Stroke -Devour in Shadow -Dunerider Outlaw -Enfeeblement -Fear -Fevered Convulsions -Fog of Gnats -Foul Imp -Gatekeeper of Malakir -Grasp of Darkness -Hand of Cruelty -Hymn to Tourach -Knight of Stromgald -Nantuko Shade -Nether Traitor -Order of the Ebon Hand -Sign in Blood -Sinkhole -Slith Bloodletter -Stromgald Crusader -Vampire Hexmage -Vicious Hunger -Wrench Mind -[/Group] - -[Group MaxCnt=1 Percentage=8] -Dread -Cosmic Horror -Halo Hunter -Helldozer -Ihsan's Shade -Intimidation -Midnight Banshee -Midnight Banshee -Pestilence Demon -Underworld Dreams -Visara the Dreadful -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Mono Green.thm b/res/quest/themes/Mono Green.thm deleted file mode 100644 index 617f18f81ab..00000000000 --- a/res/quest/themes/Mono Green.thm +++ /dev/null @@ -1,81 +0,0 @@ -BasicLandPercentage=36 - -[Group MaxCnt=4 Percentage=14] -Elvish Warrior -Garruk's Companion -Juvenile Gloomwidow -Multani's Acolyte -Nettle Sentinel -Nissa's Chosen -Nourish -People of the Woods -Primal Bellow -Traproot Kami -Whirling Dervish -[/Group] - -[Group MaxCnt=4 Percentage=15] -An-Havva Constable -An-Havva Inn -Titania's Chosen -Blanchwood Armor -Coiling Woodworm -Treefolk Seedlings -Boggart Ram-Gang -Groundbreaker -Leatherback Baloth -Wilt-Leaf Cavaliers -[/Group] - -[Group MaxCnt=4 Percentage=15] -Beacon of Creation -Boartusk Liege -Creakwood Liege -Drove of Elves -Natural Order -Norwood Priestess -Wilt-Leaf Liege -Dauntless Dourbark -Timbermaw Larva -[/Group] - -[Group MaxCnt=4 Percentage=15] -Baru, Fist of Krosa -Baru, Fist of Krosa -Beast Attack -Bellowing Tanglewurm -Crabapple Cohort -Deity of Scars -Fracturing Gust -Kaysa -Kaysa -Meng Huo, Barbarian King -Meng Huo, Barbarian King -Reach of Branches -Timber Protector -Kodama of the North Tree -Overrun -Oversoul of Dusk -Rushwood Elemental -Weatherseed Treefolk -[/Group] - -[Group MaxCnt=1 Percentage=5] -Howl of the Night Pack -Khalni Hydra -Khalni Hydra -Primalcrux -Primalcrux -Roughshod Mentor -Child of Gaea -Cloudthresher -Craw Giant -Jedit Ojanen of Efrava -Jugan, the Rising Star -Pelakka Wurm -Plated Slagwurm -Silvos, Rogue Elemental -Terra Stomper -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Mono White.thm b/res/quest/themes/Mono White.thm deleted file mode 100644 index de0f932726b..00000000000 --- a/res/quest/themes/Mono White.thm +++ /dev/null @@ -1,81 +0,0 @@ -BasicLandPercentage=36 - -[Group MaxCnt=2 Percentage=13] -Angelic Voices -Celestial Crusader -Crovax, Ascendant Hero -Crusade -Divine Sacrament -Honor of the Pure -[/Group] - -[Group MaxCnt=4 Percentage=22] -Apothecary Initiate -Gaze of Justice -Angel's Feather -Ivory Cup -Pearl Medallion -Alaborn Grenadier -Amrou Kithkin -Auriok Champion -Exorcist -Hand of Honor -Kazandu Blademaster -Knight of Meadowgrain -Knight of the White Orchid -Kor Firewalker -Leonin Skyhunter -Longbow Archer -Order of Leitbur -Order of the White Shield -Serra Avenger -Sigiled Paladin -Silver Knight -Soltari Monk -Soltari Priest -Steadfast Guard -Veteran Armorsmith -Veteran Cavalier -White Knight -White Shield Crusader -[/Group] - -[Group MaxCnt=4 Percentage=12] -Ballynock Cohort -Blinding Light -Crackdown -Holy Light -Spectral Procession -Valorous Charge -Razor Golem -Devout Lightcaster -Unmake -Wilt-Leaf Cavaliers -[/Group] - -[Group MaxCnt=4 Percentage=7] -Ballynock Trapper -Kithkin Rabble -Springjack Shepherd -Dawn Elemental -[/Group] - -[Group MaxCnt=4 Percentage=7] -Landbind Ritual -Abbey Gargoyles -Divinity of Pride -Oversoul of Dusk -Resplendent Mentor -[/Group] - -[Group MaxCnt=1 Percentage=3] -Hand of Justice -Mass Calcify -Akroma, Angel of Wrath -Blazing Archon -Luminous Angel -Purity -True Conviction -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Multicolor BG.thm b/res/quest/themes/Multicolor BG.thm deleted file mode 100644 index 60d1a2c8399..00000000000 --- a/res/quest/themes/Multicolor BG.thm +++ /dev/null @@ -1,46 +0,0 @@ -BasicLandPercentage=16 - -[Group MaxCnt=4 Percentage=21] -Bayou -Overgrown Tomb -Savage Lands -Verdant Catacombs -[/Group] - -[Group MaxCnt=4 Percentage=24] -Creakwood Liege -Creakwood Liege -Noxious Hatchling -Woodlurker Mimic -Woodlurker Mimic -Gift of the Deity -[/Group] - -[Group MaxCnt=4 Percentage=12] -Odious Trow -Llanowar Dead -Putrid Leech -[/Group] - -[Group MaxCnt=4 Percentage=26] -Glissa, the Traitor -Ebony Treefolk -Maelstrom Pulse -Putrefy -Rendclaw Trow -Stalker Hag -[/Group] - -[Group MaxCnt=1 Percentage=11] -Drain the Well -Lord of Extinction -Nath of the Gilt-Leaf -Grave-Shell Scarab -Sapling of Colfenor -Spiritmonger -Death Mutation -Golgari Rotwurm -Woodwraith Strangler -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Multicolor BR.thm b/res/quest/themes/Multicolor BR.thm deleted file mode 100644 index d19bd1d840f..00000000000 --- a/res/quest/themes/Multicolor BR.thm +++ /dev/null @@ -1,86 +0,0 @@ -BasicLandPercentage=16 - -[Group MaxCnt=4 Percentage=21] -Akoum Refuge -Auntie's Hovel -Badlands -Blackcleave Cliffs -Blood Crypt -Bloodstained Mire -Dragonskull Summit -[/Group] - -[Group MaxCnt=4 Percentage=15] -Ashenmoor Liege -Defiler of Souls -Fists of the Demigod -[/Group] - -[Group MaxCnt=4 Percentage=13] -Emberstrike Duo -Jund Hackblade -Grixis Grimblade -Nightscape Familiar -Thunderscape Familiar -[/Group] - -[Group MaxCnt=4 Percentage=9] -Gobhobbler Rats -Goblin Deathraiders -Goblin Outlander -Marsh Goblins -Scar -Shivan Zombie -Terminate -Terminate -[/Group] - -[Group MaxCnt=4 Percentage=9] -Ashenmoor Gouger -Blightning -Blightning -Blood Cultist -Kathari Bomber -Pyre Zombie -Rakdos Ickspitter -Sanity Gnawers -Shambling Remains -Shauku's Minion -Vicious Kavu -[/Group] - -[Group MaxCnt=1 Percentage=9] -Blazing Specter -Hellhole Rats -Murderous Redcap -Poison the Well -Sootwalkers -Spiteful Visions -Wrecking Ball -[/Group] - -[Group MaxCnt=1 Percentage=6] -Boris Devilboon -Breath of Malfegor -Cultbrand Cinder -Demigod of Revenge -Demigod of Revenge -Kaervek the Merciless -Kulrath Knight -Lightning Reaver -[/Group] - -[Group MaxCnt=1 Percentage=2] -Axelrod Gunnarson -Barktooth Warbeard -Bituminous Blast -Deathbringer Thoctar -Lady Orca -Pavel Maliki -Plague Spores -Tsabo Tavoc -Vampiric Dragon -Rattleblaze Scarecrow -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Multicolor RG.thm b/res/quest/themes/Multicolor RG.thm deleted file mode 100644 index 043fbffadf0..00000000000 --- a/res/quest/themes/Multicolor RG.thm +++ /dev/null @@ -1,88 +0,0 @@ -BasicLandPercentage=14 - -[Group MaxCnt=4 Percentage=21] -Copperline Gorge -Kazandu Refuge -Raging Ravine -Rootbound Crag -Stomping Ground -Taiga -Wooded Foothills -[/Group] - -[Group MaxCnt=4 Percentage=13] -Boartusk Liege -Runes of the Deus -[/Group] - -[Group MaxCnt=4 Percentage=13] -Jund Hackblade -Naya Hushblade -Tattermunge Duo -Thornscape Familiar -Thunderscape Familiar -[/Group] - -[Group MaxCnt=4 Percentage=10] -Artifact Mutation -Colossal Might -Nacatl Outlander -Rip-Clan Crasher -Scarwood Goblins -Scuzzback Scrapper -Tattermunge Maniac -Yavimaya Barbarian -[/Group] - -[Group MaxCnt=4 Percentage=9] -Boggart Ram-Gang -Centaur Archer -Fires of Yavimaya -Jungle Troll -Mage Slayer -Raging Kavu -Violent Outburst -Vithian Renegades -Wilderness Elemental -Windreaper Falcon -[/Group] - -[Group MaxCnt=2 Percentage=11] -Bloodbraid Elf -Giant Solifuge -Mudbrawler Raiders -Rhox Brute -Rumbling Slum -Sarkhan Vol -Spellbreaker Behemoth -Tuknir Deathlock -Voracious Cobra -Wreak Havoc -Yavimaya Kavu -[/Group] - -[Group MaxCnt=1 Percentage=6] -Blazethorn Scarecrow -Blitz Hellion -Deus of Calamity -Frenzied Tilling -Gorger Wurm -Scuzzback Marauders -Stonebrow, Krosan Hero -Streetbreaker Wurm -[/Group] - -[Group MaxCnt=1 Percentage=4] -Borborygmos -Dragon Broodmother -Jerrard of the Closed Fist -Livonya Silone -Loamdragger Giant -Marhault Elsdragon -Rock Basilisk -Sangrite Surge -The Lady of the Mountain -Viashivan Dragon -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Multicolor UB.thm b/res/quest/themes/Multicolor UB.thm deleted file mode 100644 index 2ad8d196ab7..00000000000 --- a/res/quest/themes/Multicolor UB.thm +++ /dev/null @@ -1,84 +0,0 @@ -BasicLandPercentage=15 - -[Group MaxCnt=4 Percentage=21] -Creeping Tar Pit -Darkslick Shores -Drowned Catacomb -Jwar Isle Refuge -Polluted Delta -Secluded Glen -Underground Sea -Watery Grave -[/Group] - -[Group MaxCnt=4 Percentage=28] -Dire Undercurrents -Esper Stormblade -Glen Elendra Liege -Glen Elendra Liege -Glen Elendra Liege -Glen Elendra Liege -Gravelgill Duo -Grixis Grimblade -Nightscape Familiar -Stormscape Familiar -[/Group] - -[Group MaxCnt=4 Percentage=8] -Countersquall -Dimir Infiltrator -Glimpse the Unthinkable -Inkfathom Infiltrator -Mask of Riddles -Oona's Gatewarden -Sleeper's Robe -Tidehollow Strix -Vedalken Ghoul -Vodalian Zombie -Zombie Outlander -[/Group] - -[Group MaxCnt=4 Percentage=10] -Lich Lord of Unx -Mind Funeral -Psychatog -Recoil -Shadowmage Infiltrator -Stalking Assassin -Undermine -Urborg Drake -Wasp Lancer -[/Group] - -[Group MaxCnt=1 Percentage=9] -Benthic Djinn -Brainbite -Clutch of the Undercity -Kathari Remnant -Moroii -Slinking Serpent -Wanderbrine Rootcutters -Wydwen, the Biting Gale -[/Group] - -[Group MaxCnt=1 Percentage=7] -Deny Reality -Etherium Abomination -Ghastlord of Fugue -Gravelgill Axeshark -Nemesis of Reason -Skeleton Ship -Sphinx Summoner -[/Group] - -[Group MaxCnt=1 Percentage=2] -Princess Lucrezia -Ramirez DePietro -Ramses Overdark -Riven Turnbull -Sivitri Scarzam -Szadek, Lord of Secrets -Ur-Drago -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Multicolor UG.thm b/res/quest/themes/Multicolor UG.thm deleted file mode 100644 index a3b657b2f71..00000000000 --- a/res/quest/themes/Multicolor UG.thm +++ /dev/null @@ -1,46 +0,0 @@ -BasicLandPercentage=15 - -[Group MaxCnt=4 Percentage=21] -Tropical Island -Breeding Pool -Seaside Citadel -Misty Rainforest -[/Group] - -[Group MaxCnt=4 Percentage=24] -Murkfiend Liege -Sturdy Hatchling -Shorecrasher Mimic -Fable of Wolf and Owl -Favor of the Overbeing -[/Group] - -[Group MaxCnt=4 Percentage=14] -Gaea's Skyfolk -Jhessian Infiltrator -Slippery Bogle -Vedalken Heretic -[/Group] - -[Group MaxCnt=4 Percentage=17] -Cold-Eyed Selkie -Lorescale Coatl -Shielding Plax -Temporal Spring -Voidslime -Winged Coatl -Wistful Selkie -[/Group] - -[Group MaxCnt=1 Percentage=9] -Assault Zeppelid -AEther Mutation -Jungle Barrier -Leafdrake Roost -Overbeing of Myth -Simic Sky Swallower -Trapjaw Kelpie -Yavimaya's Embrace -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Multicolor UR.thm b/res/quest/themes/Multicolor UR.thm deleted file mode 100644 index 83b1acf8323..00000000000 --- a/res/quest/themes/Multicolor UR.thm +++ /dev/null @@ -1,47 +0,0 @@ -BasicLandPercentage=15 - -[Group MaxCnt=4 Percentage=21] -Volcanic Island -Steam Vents -Crumbling Necropolis -Scalding Tarn -[/Group] - -[Group MaxCnt=4 Percentage=22] -Clout of the Dominus -Mindwrack Liege -Mindwrack Liege -Noggle Hedge-Mage -Riverfall Mimic -Riverfall Mimic -[/Group] - -[Group MaxCnt=4 Percentage=12] -Magefire Wings -Razorfin Hunter -Razorfin Hunter -Stream Hopper -[/Group] - -[Group MaxCnt=4 Percentage=19] -Crag Puca -Electrolyze -Gelectrode -Noggle Bridgebreaker -Noggle Bandit -Noggle Ransacker -Stitch in Time -Wee Dragonauts -[/Group] - -[Group MaxCnt=1 Percentage=11] -Call the Skybreaker -Dominus of Fealty -Firestorm Hellkite -Izzet Chronarch -Minotaur Illusionist -Niv-Mizzet, the Firemind -Nucklavee -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Multicolor WB.thm b/res/quest/themes/Multicolor WB.thm deleted file mode 100644 index 9178b16b517..00000000000 --- a/res/quest/themes/Multicolor WB.thm +++ /dev/null @@ -1,51 +0,0 @@ -BasicLandPercentage=15 - -[Group MaxCnt=4 Percentage=20] -Scrubland -Godless Shrine -Arcane Sanctum -Marsh Flats -[/Group] - -[Group MaxCnt=1 Percentage=2] -Orzhova, the Church of Deals -[/Group] - -[Group MaxCnt=4 Percentage=20] -Edge of the Divinity -Nightsky Mimic -Voracious Hatchling -[/Group] - -[Group MaxCnt=4 Percentage=10] -Beckon Apparition -Nip Gwyllion -Gerrard's Verdict -Gerrard's Verdict -Mourning Thrull -[/Group] - -[Group MaxCnt=4 Percentage=20] -Bloodied Ghost -Mortify -Pillory of the Sleepless -Restless Apparition -Stillmoon Cavalier -Unmake -Vindicate -[/Group] - -[Group MaxCnt=4 Percentage=9] -Harvest Gwyllion -Agent of Masks -Culling Sun -Divinity of Pride -[/Group] - -[Group MaxCnt=1 Percentage=4] -Angel of Despair -Debtors' Knell -Identity Crisis -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Multicolor WR.thm b/res/quest/themes/Multicolor WR.thm deleted file mode 100644 index 6053b214463..00000000000 --- a/res/quest/themes/Multicolor WR.thm +++ /dev/null @@ -1,43 +0,0 @@ -BasicLandPercentage=15 - -[Group MaxCnt=4 Percentage=21] -Plateau -Sacred Foundry -Jungle Shrine -Arid Mesa -[/Group] - -[Group MaxCnt=4 Percentage=20] -Balefire Liege -Battlegate Mimic -Belligerent Hatchling -[/Group] - -[Group MaxCnt=4 Percentage=22] -Boros Guildmage -Boros Recruit -Boros Swiftblade -Cerodon Yearling -Double Cleave -Figure of Destiny -Lightning Helix -Squee's Embrace -Stun Sniper -[/Group] - -[Group MaxCnt=4 Percentage=12] -Duergar Hedge-Mage -Hearthfire Hobgoblin -Hobgoblin Dragoon -Skyknight Legionnaire -[/Group] - -[Group MaxCnt=2 Percentage=10] -Ajani Vengeant -Brion Stoutarm -Bull Cerodon -Nobilis of War -Sunhome Enforcer -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Naya WRG.thm b/res/quest/themes/Naya WRG.thm deleted file mode 100644 index 8ca8d5d6716..00000000000 --- a/res/quest/themes/Naya WRG.thm +++ /dev/null @@ -1,170 +0,0 @@ -BasicLandPercentage=10 - -[Group MaxCnt=4 Percentage=27] -Jungle Shrine -Plateau -Savannah -Taiga -Arid Mesa -Wooded Foothills -Windswept Heath -[/Group] - -[Group MaxCnt=4 Percentage=12] -Druid of the Anima -Drumhunter -Exuberant Firestoker -Exuberant Firestoker -Kavu Lair -Mayael the Anima -Mighty Emergence -Sunseed Nurturer -Sunseed Nurturer -[/Group] - -[Group MaxCnt=4 Percentage=10] -Paleoloth -Paleoloth -Where Ancients Tread -Mycoid Shepherd -Mycoid Shepherd -Vagrant Plowbeasts -[/Group] - -[Group MaxCnt=2 Percentage=7] -Blistering Barrier -Rage Nimbus -Woolly Thoctar -Woolly Thoctar -Woolly Thoctar -[/Group] - -[Group MaxCnt=2 Percentage=12] -Balduvian Horde -Blastoderm -Calciderm -Citanul Centaurs -Cliffrunner Behemoth -Cliffrunner Behemoth -Cliffrunner Behemoth -Darba -Flamecore Elemental -Hungry Mist -Hunted Lammasu -Hunted Troll -Incurable Ogre -Jade Leech -Lumbering Satyr -Mungha Wurm -Pillaging Horde -Rumbling Slum -Sunweb -Vengeful Firebrand -Wild Leotau -[/Group] - -[Group MaxCnt=1 Percentage=11] -Ant Queen -Ayumi, the Last Visitor -Baneslayer Angel -Beacon Behemoth -Deadly Insect -Eron the Relentless -Fangren Marauder -Fire Elemental -Frost Ogre -Gorger Wurm -Hulking Cyclops -Hunted Dragon -Molder Beast -Mosstodon -Panther Warriors -Rakeclaw Gargantuan -Savage Thallid -Scoria Elemental -Scuzzback Marauders -Silverback Ape -Spectral Force -Spined Wurm -Stomper Cub -Streetbreaker Wurm -Uril, the Miststalker -Winding Wurm -[/Group] - -[Group MaxCnt=1 Percentage=8] -Alpha Tyrranax -Arctic Nishoba -Axegrinder Giant -Barbtooth Wurm -Bull Cerodon -Carnassid -Cavern Thoctar -Deathless Angel -Durkwood Baloth -Enlisted Wurm -Fangren Marauder -Flameborn Hellion -Frenetic Raptor -Giant Warthog -Inferno Titan -Iron-Barb Hellion -Jerrard of the Closed Fist -Kamahl, Pit Fighter -Meglonoth -Moss Kami -Nightsoil Kami -Primeval Titan -Rampaging Baloths -Roughshod Mentor -Ryusei, the Falling Star -Sabertooth Nishoba -Shivan Dragon -Sigiled Behemoth -Sun Titan -Sunrise Sovereign -The Lady of the Mountain -Thundermare -Torsten Von Ursus -Vastwood Gorger -Yavimaya Wurm -Yosei, the Morning Star -[/Group] - -[Group MaxCnt=1 Percentage=3] -Angel of Retribution -Archangel -Ashen Firebeast -Ashen Monstrosity -Avatar of Fury -Avatar of Might -Avenger of Zendikar -Blazing Archon -Body of Jukai -Bogardan Hellkite -Brimstone Dragon -Crash of Rhinos -Craw Wurm -Duskdale Wurm -Enormous Baloth -Gaea's Revenge -Godsire -Goliath Spider -Havenwood Wurm -Jungle Weaver -Kalonian Behemoth -Krosan Colossus -Living Hive -Loamdragger Giant -Oakgnarl Warrior -Pelakka Wurm -Penumbra Wurm -Rootbreaker Wurm -Scaled Wurm -Shivan Hellkite -Spearbreaker Behemoth -Whiptail Wurm -Windbrisk Raptor -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Oath of Druids WG.thm b/res/quest/themes/Oath of Druids WG.thm deleted file mode 100644 index f8d7a1d5757..00000000000 --- a/res/quest/themes/Oath of Druids WG.thm +++ /dev/null @@ -1,74 +0,0 @@ -BasicLandPercentage=10 - -[Group MaxCnt=4 Percentage=19] -Savannah -Graypelt Refuge -Windswept Heath -Razorverge Thicket -Sunpetal Grove -[/Group] - -[Group MaxCnt=4 Percentage=7] -Oath of Druids -[/Group] - -[Group MaxCnt=4 Percentage=7] -Forbidden Orchard -[/Group] - -[Group MaxCnt=4 Percentage=10] -Enlightened Tutor -Idyllic Tutor -[/Group] - -[Group MaxCnt=4 Percentage=11] -Afterlife -Crib Swap -[/Group] - -[Group MaxCnt=4 Percentage=6] -Deglamer -Disenchant -Naturalize -Nature's Claim -Revoke Existence -Slice in Twain -Solemn Offering -[/Group] - -[Group MaxCnt=4 Percentage=7] -Harmonize -Harmonize -Harmonize -Ice Storm -Fallow Earth -Winter's Grasp -[/Group] - -[Group MaxCnt=3 Percentage=7] -Captured Sunlight -Heroes' Reunion -Nourish -Soothing Balm -Whitesun's Passage -[/Group] - -[Group MaxCnt=1 Percentage=6] -Akroma, Angel of Wrath -Angel of Despair -Blazing Archon -Blightsteel Colossus -Bogardan Hellkite -Darksteel Colossus -Emrakul, the Aeons Torn -Hellkite Overlord -Inkwell Leviathan -Iona, Shield of Emeria -Platinum Angel -Progenitus -Sphinx of the Steel Wind -Ulamog, the Infinite Gyre -Woodfall Primus -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Pingers UR.thm b/res/quest/themes/Pingers UR.thm deleted file mode 100644 index 54a6d24ab0f..00000000000 --- a/res/quest/themes/Pingers UR.thm +++ /dev/null @@ -1,63 +0,0 @@ -BasicLandPercentage=15 - -[Group MaxCnt=4 Percentage=21] -Volcanic Island -Steam Vents -Crumbling Necropolis -Scalding Tarn -[/Group] - -[Group MaxCnt=4 Percentage=16] -Basilisk Collar -Basilisk Collar -Curiosity -Gorgon Flail -Quietus Spike -[/Group] - -[Group MaxCnt=4 Percentage=10] -Fireslinger -Flamekin Spitfire -Razorfin Hunter -Razorfin Hunter -Spikeshot Elder -[/Group] - -[Group MaxCnt=4 Percentage=24] -Apprentice Sorcerer -Capricious Sorcerer -Cunning Sparkmage -Gelectrode -Ghost-Lit Raider -Goblin Sharpshooter -Prodigal Pyromancer -Prodigal Sorcerer -Rootwater Hunter -Spikeshot Goblin -Suq'Ata Firewalker -Thornwind Faeries -Vithian Stinger -Vulshok Sorcerer -Wu Longbowman -Zuran Spellcaster -[/Group] - -[Group MaxCnt=2 Percentage=10] -Anaba Shaman -Fledgling Mawcor -Jeska, Warrior Adept -Reveka, Wizard Savant -Stinging Barrier -Vent Sentinel -Viashino Fangtail -[/Group] - -[Group MaxCnt=1 Percentage=4] -Kamahl, Pit Fighter -Mawcor -Niv-Mizzet, the Firemind -Pirate Ship -Shivan Hellkite -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Rats B.thm b/res/quest/themes/Rats B.thm deleted file mode 100644 index 2e4a4c06258..00000000000 --- a/res/quest/themes/Rats B.thm +++ /dev/null @@ -1,37 +0,0 @@ -BasicLandPercentage=35 - -[Group MaxCnt=3 Percentage=7] -Ratcatcher -Marrow-Gnawer -[/Group] - -[Group MaxCnt=4 Percentage=20] -Swarm of Rats -Relentless Rats -Pestilence Rats -[/Group] - -[Group MaxCnt=4 Percentage=15] -Bog Rats -Gnat Miser -Muck Rats -Nezumi Shadow-Watcher -Zodiac Rat -[/Group] - -[Group MaxCnt=4 Percentage=12] -Kuro's Taken -Nezumi Cutthroat -Ravenous Rats -[/Group] - -[Group MaxCnt=4 Percentage=12] -Chittering Rats -Disease Carriers -Deathmask Nezumi -Nezumi Ronin -Razortooth Rats -Locust Miser -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Reanimator B.thm b/res/quest/themes/Reanimator B.thm deleted file mode 100644 index 55a6769e9cb..00000000000 --- a/res/quest/themes/Reanimator B.thm +++ /dev/null @@ -1,116 +0,0 @@ -BasicLandPercentage=35 - -[Group MaxCnt=4 Percentage=13] -Entomb -Buried Alive -[/Group] - -[Group MaxCnt=4 Percentage=18] -Animate Dead -Animate Dead -Beacon of Unrest -Zombify -Zombify -Living Death -Exhume -Exhume -[/Group] - -[Group MaxCnt=4 Percentage=5] -Night's Whisper -Sign in Blood -[/Group] - -[Group MaxCnt=2 Percentage=19] -Hymn to Tourach -Sinkhole -Infest -Annihilate -Assassinate -Befoul -Chill to the Bone -Dark Banishing -Dark Offering -Death Stroke -Doom Blade -Eyeblight's Ending -Ghostly Visit -Grasp of Darkness -Hand of Death -Hideous End -Poison Arrow -Rend Flesh -Sever Soul -Smother -Stream of Acid -Terror -Vicious Hunger -Violet Pall -[/Group] - -[Group MaxCnt=1 Percentage=10] -Akroma, Angel of Wrath -Angel of Despair -Angel of Retribution -Archangel -Ashen Monstrosity -Benthic Behemoth -Blazing Archon -Blood Tyrant -Bogardan Hellkite -Brimstone Dragon -Crash of Rhinos -Craw Giant -Darksteel Gargoyle -Demon of Death's Gate -Djinn of the Lamp -Duskdale Wurm -Ebon Dragon -Fungal Shambler -Gaea's Revenge -Godsire -Goliath Spider -Goliath Sphinx -Hand of Emrakul -Hellkite Overlord -Inkwell Leviathan -Iona, Shield of Emeria -Iridescent Angel -Isleback Spawn -It That Betrays -Kalonian Behemoth -Khalni Hydra -Konda, Lord of Eiganjo -Luminous Angel -Oakgnarl Warrior -Pelakka Wurm -Penumbra Wurm -Pestilence Demon -Plated Slagwurm -Platinum Angel -Platinum Emperion -Reya Dawnbringer -Reya Dawnbringer -Scaled Wurm -Silver Seraph -Simic Sky Swallower -Skeletal Wurm -Spearbreaker Behemoth -Sphinx of the Steel Wind -Sphinx Sovereign -Spirit of the Night -Symbiotic Wurm -Szadek, Lord of Secrets -Teeka's Dragon -The Unspeakable -Thraximundar -Tidal Kraken -Titanic Bulvox -Tsabo Tavoc -Ulamog's Crusher -Verdant Force -Windbrisk Raptor -Woodfall Primus -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Sacrifice uBr.thm b/res/quest/themes/Sacrifice uBr.thm deleted file mode 100644 index 788b6885fa0..00000000000 --- a/res/quest/themes/Sacrifice uBr.thm +++ /dev/null @@ -1,46 +0,0 @@ -BasicLandPercentage=14 - -[Group MaxCnt=4 Percentage=22] -Underground Sea -Badlands -Crumbling Necropolis -Bloodstained Mire -Polluted Delta -[/Group] - -[Group MaxCnt=4 Percentage=11] -Mortician Beetle -Mortician Beetle -Mortician Beetle -Thraximundar -[/Group] - -[Group MaxCnt=4 Percentage=25] -Chainer's Edict -Cruel Edict -Diabolic Edict -Gatekeeper of Malakir -Hellspark Elemental -Spark Elemental -[/Group] - -[Group MaxCnt=4 Percentage=11] -Arc Runner -Ball Lightning -Hell's Thunder -[/Group] - -[Group MaxCnt=4 Percentage=15] -Blistering Firecat -Grave Pact -Predatory Nightstalker -Slave of Bolas -[/Group] - -[Group MaxCnt=1 Percentage=2] -Cruel Ultimatum -Eldrazi Conscription -Ulamog's Crusher -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Snakes G.thm b/res/quest/themes/Snakes G.thm deleted file mode 100644 index c3ab3c95d2d..00000000000 --- a/res/quest/themes/Snakes G.thm +++ /dev/null @@ -1,46 +0,0 @@ -BasicLandPercentage=35 - -[Group MaxCnt=4 Percentage=19] -Sosuke, Son of Seshiro -Seshiro the Anointed -Sosuke's Summons -[/Group] - -[Group MaxCnt=4 Percentage=6] -Marsh Boa -Mold Adder -[/Group] - -[Group MaxCnt=4 Percentage=17] -Blight Mamba -Mire Boa -Mire Boa -Orochi Ranger -Orochi Ranger -Orochi Sustainer -River Boa -River Boa -Tangle Asp -Tangle Asp -[/Group] - -[Group MaxCnt=4 Percentage=17] -Coiled Tinviper -Hornet Cobra -Kashi-Tribe Elite -Kashi-Tribe Elite -Kashi-Tribe Elite -Ohran Viper -Ohran Viper -Ohran Viper -[/Group] - -[Group MaxCnt=3 Percentage=5] -Anaconda -Kashi-Tribe Reaver -Kashi-Tribe Warriors -Marsh Viper -Serpent Generator -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Snow UBRG.thm b/res/quest/themes/Snow UBRG.thm deleted file mode 100644 index 1aad8d8550f..00000000000 --- a/res/quest/themes/Snow UBRG.thm +++ /dev/null @@ -1,56 +0,0 @@ -BasicLandPercentage=0 - -[Group MaxCnt=4 Percentage=7] -Snow-Covered Forest -[/Group] - -[Group MaxCnt=3 Percentage=4] -Snow-Covered Island -[/Group] - -[Group MaxCnt=1 Percentage=4] -Snow-Covered Mountain -Snow-Covered Swamp -[/Group] - -[Group MaxCnt=4 Percentage=20] -Frost Marsh -Highland Weald -Tresserhorn Sinks -[/Group] - -[Group MaxCnt=4 Percentage=15] -Skred -Skred -Skred -Boreal Druid -Karplusan Wolverine -[/Group] - -[Group MaxCnt=4 Percentage=15] -Snow Devil -Into the North -Into the North -Boreal Centaur -[/Group] - -[Group MaxCnt=4 Percentage=15] -Woolly Mammoths -Frostweb Spider -Ohran Viper -[/Group] - -[Group MaxCnt=4 Percentage=10] -Temporal Spring -Putrefy -Chill to the Bone -Slave of Bolas -[/Group] - -[Group MaxCnt=3 Percentage=10] -Drift of the Dead -Centaur Omenreader -Heidar, Rimewind Master -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Soldiers W.thm b/res/quest/themes/Soldiers W.thm deleted file mode 100644 index dffac00f06a..00000000000 --- a/res/quest/themes/Soldiers W.thm +++ /dev/null @@ -1,133 +0,0 @@ -BasicLandPercentage=33 - -[Group MaxCnt=4 Percentage=2] -Emeria, the Sky Ruin -Kabira Crossroads -Karakas -Flagstones of Trokair -[/Group] - -[Group MaxCnt=4 Percentage=20] -Ballyrush Banneret -Field Marshal -Mobilization -Preeminent Captain -Veteran Armorsmith -Veteran Swordsmith -[/Group] - -[Group MaxCnt=4 Percentage=10] -Aven Brigadier -Captain of the Watch -Captain of the Watch -Daru Warchief -Daru Warchief -Enlistment Officer -Enlistment Officer -[/Group] - -[Group MaxCnt=4 Percentage=5] -Akrasan Squire -Boros Recruit -Devoted Hero -Eager Cadet -Elite Vanguard -Hada Freeblade -Icatian Javelineers -Mosquito Guard -Serra Zealot -Soltari Foot Soldier -Volunteer Militia -[/Group] - -[Group MaxCnt=4 Percentage=8] -Advance Scout -Ajani's Pridemate -Alaborn Grenadier -Alaborn Musketeer -Auriok Edgewright -Aven Squire -Glory Seeker -Icatian Lieutenant -Kazandu Blademaster -Kor Firewalker -Longbow Archer -Raise the Alarm -Soltari Trooper -Soulcatcher -Squire -Veteran Armorer -Order of the Golden Cricket -Somnomancer -[/Group] - -[Group MaxCnt=4 Percentage=8] -Alaborn Trooper -Alert Shu Infantry -Aven Riftwatcher -Ballynock Cohort -Border Guard -Burrenton Bombardier -Etched Champion -Hearthfire Hobgoblin -Intrepid Hero -Kithkin Zephyrnaut -Nightguard Patrol -Shu Cavalry -Shu Foot Soldiers -Shu Grain Caravan -Soltari Champion -Standing Troops -Surging Sentinels -Yotian Soldier -[/Group] - -[Group MaxCnt=2 Percentage=7] -Aven Cloudchaser -Aysen Crusader -Battlewise Aven -Commander Eesha -Elspeth, Knight-Errant -Flanking Troops -Foot Soldiers -Huang Zhong, Shu General -Join the Ranks -Knight-Captain of Eos -Loxodon Gatekeeper -Radiant's Dragoons -Ranger of Eos -Ranger of Eos -Rhox Pikemaster -Rhox Pikemaster -Seasoned Marshal -Shu Elite Infantry -Shu General -[/Group] - -[Group MaxCnt=1 Percentage=5] -Adarkar Sentinel -Ardent Militia -Catapult Master -Conqueror's Pledge -Dragonstalker -Elspeth Tirel -Guan Yu, Sainted Warrior -Loxodon Partisan -Phantom Flock -Righteous Avengers -Shu Elite Companions -Shu Soldier-Farmers -Staunch Defenders -Steam Catapult -Zhao Zilong, Tiger General -[/Group] - -[Group MaxCnt=1 Percentage=2] -Darien, King of Kjeldor -Jedit's Dragoons -Noble Templar -Oathsworn Giant -Zhang Fei, Fierce Warrior -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Swampwalk BG.thm b/res/quest/themes/Swampwalk BG.thm deleted file mode 100644 index ce96e073ac9..00000000000 --- a/res/quest/themes/Swampwalk BG.thm +++ /dev/null @@ -1,55 +0,0 @@ -BasicLandPercentage=16 - -[Group MaxCnt=4 Percentage=21] -Bayou -Overgrown Tomb -Savage Lands -Verdant Catacombs -[/Group] - -[Group MaxCnt=4 Percentage=14] -Tainted Well -Evil Presence -[/Group] - -[Group MaxCnt=4 Percentage=7] -Marsh Boa -Quag Vampires -Plague Beetle -Zodiac Rat -[/Group] - -[Group MaxCnt=4 Percentage=8] -Bayou Dragonfly -Mire Boa -[/Group] - -[Group MaxCnt=4 Percentage=13] -Bog Raiders -Bog Smugglers -Lost Soul -Pygmy Allosaurus -Raiding Nightstalker -Stalker Hag -Warthog -Zodiac Snake -[/Group] - -[Group MaxCnt=4 Percentage=12] -Anaconda -Bog Wraith -Bog-Strider Ash -Moor Fiend -Wild Ox -Zodiac Ox -Zodiac Pig -[/Group] - -[Group MaxCnt=3 Percentage=8] -Bog Tatters -Street Wraith -Anurid Murkdiver -Cateran Slaver -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Tap and Destroy WB.thm b/res/quest/themes/Tap and Destroy WB.thm deleted file mode 100644 index a729de92d03..00000000000 --- a/res/quest/themes/Tap and Destroy WB.thm +++ /dev/null @@ -1,52 +0,0 @@ -BasicLandPercentage=15 - -[Group MaxCnt=4 Percentage=20] -Scrubland -Godless Shrine -Arcane Sanctum -Marsh Flats -[/Group] - -[Group MaxCnt=4 Percentage=20] -King's Assassin -King's Assassin -Royal Assassin -Royal Assassin -Steam Catapult -Stone Catapult -[/Group] - -[Group MaxCnt=4 Percentage=20] -Aysen Bureaucrats -Benalish Trapper -Blinding Mage -Errant Doomsayers -Goldmeadow Harrier -Kor Line-Slinger -Master Decoy -Rathi Trapper -Squall Drifter -Whipcorder -[/Group] - -[Group MaxCnt=4 Percentage=5] -Minister of Impediments -Silkbind Faerie -[/Group] - -[Group MaxCnt=4 Percentage=16] -Abyssal Hunter -Ballynock Trapper -Kismet -Kismet -Loxodon Gatekeeper -Ostiary Thrull -[/Group] - -[Group MaxCnt=1 Percentage=4] -Harrier Griffin -Kitsune Dawnblade -Loxodon Mystic -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/The Rack B.thm b/res/quest/themes/The Rack B.thm deleted file mode 100644 index 1b0fd3c75c7..00000000000 --- a/res/quest/themes/The Rack B.thm +++ /dev/null @@ -1,66 +0,0 @@ -BasicLandPercentage=35 - -[Group MaxCnt=4 Percentage=20] -Guul Draz Specter -Lavaborn Muse -Paupers' Cage -Quest for the Nihil Stone -Rackling -The Rack -The Rack -Wheel of Torture -[/Group] - -[Group MaxCnt=4 Percentage=12] -Corrupt Court Official -Headhunter -Hymn to Tourach -Ravenous Rats -Wrench Mind -[/Group] - -[Group MaxCnt=4 Percentage=12] -Alley Grifters -Chilling Apparition -Deception -Hypnotic Specter -Hypnotic Specter -Liliana's Specter -Liliana's Specter -Mind Rot -Mind Twist -Nyxathid -Unburden -Waking Nightmare -Chittering Rats -[/Group] - -[Group MaxCnt=3 Percentage=12] -Abyssal Nightstalker -Abyssal Specter -Cackling Fiend -Honden of Night's Reach -Order of Yawgmoth -Wei Night Raiders -[/Group] - -[Group MaxCnt=3 Percentage=7] -Brutal Nightstalker -Cao Cao, Lord of Wei -Fugue -Kemuri-Onna -Liliana Vess -Mind Sludge -Silent Specter -Ghastlord of Fugue -[/Group] - -[Group MaxCnt=1 Percentage=2] -Abyssal Horror -Ebon Dragon -Haunting Hymn -Shrieking Specter -Zhang Liao, Hero of Hefei -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Treefolk WBG.thm b/res/quest/themes/Treefolk WBG.thm deleted file mode 100644 index d4daee83ca2..00000000000 --- a/res/quest/themes/Treefolk WBG.thm +++ /dev/null @@ -1,77 +0,0 @@ -BasicLandPercentage=0 - -[Group MaxCnt=20 Percentage=20] -Forest -Snow-Covered Forest -[/Group] - -[Group MaxCnt=4 Percentage=17] -Bayou -Savannah -Windswept Heath -Verdant Catacombs -[/Group] - -[Group MaxCnt=4 Percentage=24] -Bosk Banneret -Doran, the Siege Tower -Leaf-Crowned Elder -Orchard Warden -Timber Protector -[/Group] - -[Group MaxCnt=3 Percentage=19] -Battlewand Oak -Dauntless Dourbark -Lignify -Reach of Branches -Sapling of Colfenor -Treefolk Harbinger -[/Group] - -[Group MaxCnt=4 Percentage=6] -Black Poplar Shaman -Cradle Guard -Cradle Guard -Ebony Treefolk -Ebony Treefolk -Gaea's Avenger -Tilling Treefolk -Treefolk Seedlings -[/Group] - -[Group MaxCnt=4 Percentage=6] -Ambassador Oak -Bog-Strider Ash -Cloudcrown Oak -Heartwood Treefolk -Indomitable Ancients -Indomitable Ancients -Rowan Treefolk -Scarwood Treefolk -Wickerbough Elder -[/Group] - -[Group MaxCnt=2 Percentage=5] -Argothian Treefolk -Blanchwood Treefolk -Crabapple Cohort -Everbark Shaman -Ironroot Treefolk -Magnigoth Treefolk -Old Ghastbark -Redwood Treefolk -Weed-Pruner Poplar -Yavimaya Ancients -Yavimaya Scion -[/Group] - -[Group MaxCnt=1 Percentage=3] -Foxfire Oak -Guardian of Cloverdell -Oakgnarl Warrior -Woodfall Primus -Nemata, Grove Guardian -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Underworld Dreams BUR.thm b/res/quest/themes/Underworld Dreams BUR.thm deleted file mode 100644 index 261d02f136b..00000000000 --- a/res/quest/themes/Underworld Dreams BUR.thm +++ /dev/null @@ -1,59 +0,0 @@ -BasicLandPercentage=14 - -[Group MaxCnt=4 Percentage=21] -Underground Sea -Badlands -Crumbling Necropolis -Bloodstained Mire -Polluted Delta -Mikokoro, Center of the Sea -[/Group] - -[Group MaxCnt=4 Percentage=12] -Underworld Dreams -Underworld Dreams -Underworld Dreams -Mind's Eye -[/Group] - -[Group MaxCnt=4 Percentage=10] -Burning Inquiry -Burning Inquiry -Winds of Change -[/Group] - -[Group MaxCnt=4 Percentage=17] -Anvil of Bogardan -Kami of the Crescent Moon -Howling Mine -Lore Broker -Runed Servitor -Vision Skeins -Vision Skeins -Words of Wisdom -[/Group] - -[Group MaxCnt=1 Percentage=10] -Dream Fracture -Jace Beleren -Molten Psyche -Temple Bell -Timetwister -Wheel of Fortune -Windfall -[/Group] - -[Group MaxCnt=4 Percentage=12] -Wheel and Deal -Font of Mythos -Spiteful Visions -Swans of Bryn Argoll -[/Group] - -[Group MaxCnt=4 Percentage=4] -Time Reversal -Seizan, Perverter of Truth -Forced Fruition -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Vampires B.thm b/res/quest/themes/Vampires B.thm deleted file mode 100644 index c4d91a9bf7a..00000000000 --- a/res/quest/themes/Vampires B.thm +++ /dev/null @@ -1,58 +0,0 @@ -BasicLandPercentage=35 - -[Group MaxCnt=4 Percentage=17] -Anowon, the Ruin Sage -Kalastria Highborn -Malakir Bloodwitch -Vampire Nocturnus -[/Group] - -[Group MaxCnt=4 Percentage=7] -Blade of the Bloodchief -Guul Draz Vampire -Pulse Tracker -Quag Vampires -Vampire Lacerator -[/Group] - -[Group MaxCnt=4 Percentage=20] -Blood Seeker -Bloodghast -Child of Night -Feast of Blood -Feast of Blood -Feast of Blood -Gatekeeper of Malakir -Ruthless Cullblade -Vampire Hexmage -[/Group] - -[Group MaxCnt=3 Percentage=8] -Barony Vampire -Bloodrite Invoker -Nirkana Cutthroat -Vampire Nighthawk -Vampire Nighthawk -[/Group] - -[Group MaxCnt=1 Percentage=2] -Irini Sengir -Mirri the Cursed -Sangromancer -[/Group] - -[Group MaxCnt=2 Percentage=7] -Arrogant Vampire -Drana, Kalastria Bloodchief -Sengir Vampire -[/Group] - -[Group MaxCnt=2 Percentage=4] -Ascendant Evincar -Ascendant Evincar -Baron Sengir -Butcher of Malakir -Butcher of Malakir -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Vigilance Meekstone W.thm b/res/quest/themes/Vigilance Meekstone W.thm deleted file mode 100644 index 16792779798..00000000000 --- a/res/quest/themes/Vigilance Meekstone W.thm +++ /dev/null @@ -1,92 +0,0 @@ -BasicLandPercentage=34 - -[Group MaxCnt=4 Percentage=2] -Emeria, the Sky Ruin -Kabira Crossroads -Karakas -Flagstones of Trokair -[/Group] - -[Group MaxCnt=4 Percentage=15] -Juntu Stakes -Marble Titan -Marble Titan -Meekstone -Meekstone -Meekstone -[/Group] - -[Group MaxCnt=2 Percentage=9] -Blinding Light -Blinding Light -Castle -Castle -Guan Yu's 1,000-Li March -Kismet -Kismet -Righteous Fury -[/Group] - -[Group MaxCnt=4 Percentage=2] -Lionheart Maverick -Mystic Penitent -[/Group] - -[Group MaxCnt=4 Percentage=10] -Alaborn Grenadier -Courier Hawk -Kazandu Blademaster -Serra Avenger -Skyshroud Falcon -Steadfast Guard -Veteran Cavalier -[/Group] - -[Group MaxCnt=4 Percentage=10] -Alert Shu Infantry -Diving Griffin -Griffin Sentinel -Nightguard Patrol -Priests of Norn -Skyhunter Prowler -Standing Troops -Wilt-Leaf Cavaliers -Razor Golem -Yotian Soldier -[/Group] - -[Group MaxCnt=4 Percentage=8] -Armored Griffin -Changeling Sentinel -Herald of Serra -Kithkin Rabble -Shu General -[/Group] - -[Group MaxCnt=1 Percentage=6] -Angel of Light -Ardent Militia -Border Patrol -Loxodon Stalwart -Radiant, Archangel -Serra Angel -Shepherd of the Lost -[/Group] - -[Group MaxCnt=1 Percentage=4] -Akroma, Angel of Wrath -Archangel -Captain of the Watch -Darksteel Sentinel -Felidar Sovereign -Jedit's Dragoons -Jhovall Queen -Konda, Lord of Eiganjo -Oathsworn Giant -Sun Titan -Sunblast Angel -Zhang Fei, Fierce Warrior -Darksteel Sentinel -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/White.thm b/res/quest/themes/White.thm deleted file mode 100644 index 3e9658775e5..00000000000 --- a/res/quest/themes/White.thm +++ /dev/null @@ -1,30 +0,0 @@ -BasicLandPercentage=34 - -[Group MaxCnt=3 Percentage=10] -Blasted Landscape -Darksteel Citadel -Drifting Meadow -[/Group] - -[Group MaxCnt=4 Percentage=30] -Glorious Anthem -Isamaru, Hound of Konda -Savannah Lions -Silvercoat Lion -Skyhunter Prowler -Stand Firm -Sunlance -[/Group] - -[Group MaxCnt=3 Percentage=25] -Standing Troops -Staunch Defenders -Steadfast Guard -Steadfastness -Steppe Lynx -Swords to Plowshares -Unmake -Valorous Charge -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Wolves WG.thm b/res/quest/themes/Wolves WG.thm deleted file mode 100644 index 2b693157b38..00000000000 --- a/res/quest/themes/Wolves WG.thm +++ /dev/null @@ -1,46 +0,0 @@ -BasicLandPercentage=14 - -[Group MaxCnt=4 Percentage=23] -Savannah -Graypelt Refuge -Windswept Heath -Razorverge Thicket -Sunpetal Grove -[/Group] - -[Group MaxCnt=3 Percentage=15] -Master of the Wild Hunt -Tolsimir Wolfblood -Wren's Run Packmaster -[/Group] - -[Group MaxCnt=4 Percentage=14] -Tundra Wolves -Watchwolf -Watchwolf -Wolf-Skull Shaman -Woodland Changeling -Wyluli Wolf -[/Group] - -[Group MaxCnt=4 Percentage=13] -Avian Changeling -Chameleon Colossus -Sacred Wolf -Sacred Wolf -Sword of Body and Mind -[/Group] - -[Group MaxCnt=4 Percentage=13] -Howling Wolf -Sound the Call -[/Group] - -[Group MaxCnt=2 Percentage=8] -Arctic Wolves -Game-Trail Changeling -Howl of the Night Pack -Turntimber Ranger -[/Group] - -End \ No newline at end of file diff --git a/res/quest/themes/Zombies B.thm b/res/quest/themes/Zombies B.thm deleted file mode 100644 index b6b55b7855f..00000000000 --- a/res/quest/themes/Zombies B.thm +++ /dev/null @@ -1,90 +0,0 @@ -BasicLandPercentage=35 - -[Group MaxCnt=4 Percentage=20] -Cemetery Reaper -Death Baron -Grave Defiler -Lord of the Undead -Undead Warchief -Zombie Master -[/Group] - -[Group MaxCnt=1 Percentage=2] -Festering Goblin -Quest for the Gravelord -[/Group] - -[Group MaxCnt=4 Percentage=11] -Boneknitter -Dauthi Ghoul -Deathspore Thallid -Dregscape Zombie -Null Champion -Spineless Thug -Stromgald Crusader -Walking Dead -[/Group] - -[Group MaxCnt=3 Percentage=10] -Bog Raiders -Cadaverous Knight -Dross Prowler -Feeding Frenzy -Headless Horseman -Infectious Host -Lim-Dul's Cohort -Organ Grinder -Phyrexian Crusader -Rotlung Reanimator -Sanguine Guard -Scathe Zombies -Severed Legion -Smokespew Invoker -Stillmoon Cavalier -Warpath Ghoul -[/Group] - -[Group MaxCnt=1 Percentage=9] -Cackling Fiend -Dakmor Ghoul -Dross Crocodile -Eastern Paladin -Gravedigger -Infectious Horror -Marauding Knight -Order of Yawgmoth -Shadow Rider -Skinrender -Vengeful Dead -Vengeful Dead -Viscera Dragger -Waning Wurm -Western Paladin -[/Group] - -[Group MaxCnt=2 Percentage=9] -Cruel Revival -Dreg Reaver -Fallen Cleric -Gluttonous Zombie -Gristle Grinner -Grotesque Hybrid -Mass of Ghouls -Nested Ghoul -Rotting Legion -Woebearer -Zombie Goliath -[/Group] - -[Group MaxCnt=1 Percentage=4] -Anurid Murkdiver -Dripping Dead -Geth, Lord of the Vault -Grixis Slavedriver -Helldozer -Lim-Dul the Necromancer -Tresserhorn Skyknight -Twisted Abomination -[/Group] - -End \ No newline at end of file diff --git a/res/quest/veryhard.txt b/res/quest/veryhard.txt deleted file mode 100644 index 1e723a65916..00000000000 --- a/res/quest/veryhard.txt +++ /dev/null @@ -1,9 +0,0 @@ -Boromir 4 -Darrin Stephens 4 -Dino 4 -Gold Finger 4 -Hobbes 4 -Ned Flanders 4 -Radioactive Man 4 -Riddler 4 -Samantha Stephens 4 \ No newline at end of file diff --git a/res/reprintSetInfo.py b/res/reprintSetInfo.py deleted file mode 100755 index e0e291e73c7..00000000000 --- a/res/reprintSetInfo.py +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env python - -# This script grabs the list of all cards in a set and clears out the setInfo -# After running this script, re-run setInfoScript to fill in the slots -# Run this Script with a command line argument, as below - -# $ python reprintSetInfo.py -# $ python reprintSetInfo.py M12 - -from httplib import HTTP -from urlparse import urlparse -from urllib import urlopen -import sys -import os - -class SetInfo: - def __init__(self, set, rarity, image): - self.set = set - self.rarity = rarity - self.image = image - -class Card: - def __init__(self, name, cleanName): - self.name = name - self.cleanName = cleanName - self.hasSet = False - self.sets = {} - -def clean(name): - return name.replace(' ','_').replace('\'','').replace('-','_').replace('"','').replace(',','').lower() - -def getCardsInSet(): - html = urlopen('http://magiccards.info/query?q=e:'+setAbbr+'&v=olist').read() - - start = html.find('Card name') - end = html.find('', start) - block = html[start:end] - - while True: - nameIndex = block.find('.html">') - - if nameIndex == -1: - break - - nameEnd = block.find('<',nameIndex) - - name = block[nameIndex+7:nameEnd] - - # Add name to array - nameList.append(clean(name)+'.txt') - - block = block[nameEnd:] - - return - -folder = "cardsfolder" -err = open('reprintSetInfo.log','w') - -# THIS NEEDS TO BE UPDATED TO THE SET YOU WANT TO UPDATE -# SOME ARE THREE LETTER ABBR. BUT SOME ARE JUST TWO. CHECK BEFORE YOU RUN! -print "Using Set: " + sys.argv[1] -setAbbr = sys.argv[1] - -cardDict = {} -setStr = 'SetInfo:' -nameList = [] -getCardsInSet() - -for fileName in nameList: - # Join new folder convention cardsfolder// - filePath = os.path.join(folder, fileName[0].lower(), fileName) - print filePath - - # if file doesn't exist continue - if not os.path.isfile(filePath): - continue - - file = open(filePath) - cleanName = fileName.replace('.txt', '') - - line = file.readline().strip() - # Handle name and creation - name = line.replace('Name:','') - - card = Card(name, cleanName) - cardDict[cleanName] = card - card.lines = line + '\n' - - # Start parsing the rest of the data file - line = file.readline().strip() - - while line != 'End': - # Skip empty lines - if line == '': - line = file.readline().strip() - continue - - # We really shouldn - if line == 'End': - break - - # Skip SetInfo lines - if line.find(setStr) == -1: - card.lines += line +'\n' - - line = file.readline().strip() - - file = open(filePath, 'w') - file.write(card.lines) - - file.write('End') - file.close() - err.write(card.name + '... Updated\n') - -err.close() diff --git a/res/setInfoScript.py b/res/setInfoScript.py deleted file mode 100755 index bab923fd783..00000000000 --- a/res/setInfoScript.py +++ /dev/null @@ -1,264 +0,0 @@ -#!/usr/bin/env python - -# This python script is designed to handle the following: individual cards located in /res/cardsfolder -# Insert of SetInfo data into data files from magiccards.info - -from httplib import HTTP -from urlparse import urlparse -from urllib import urlopen -import os,fnmatch - -def getURL(url): - return urlopen(url).read() - -class SetInfo: - def __init__(self, set, rarity, image): - self.set = set - self.rarity = rarity - self.image = image - -class Card: - def __init__(self, name, cleanName): - self.name = name - self.cleanName = cleanName - self.hasSet = False - self.sets = {} - -def initSets(): - # Base Sets - allSets['Limited Edition Alpha'] = 'LEA' - allSets['Limited Edition Beta'] = 'LEB' - allSets['Unlimited Edition'] = '2ED' - allSets['Revised Edition'] = '3ED' - allSets['Fourth Edition'] = '4ED' - allSets['Fifth Edition'] = '5ED' - allSets['Classic Sixth Edition'] = '6ED' - allSets['Seventh Edition'] = '7ED' - allSets['Eighth Edition'] = '8ED' - allSets['Ninth Edition'] = '9ED' - allSets['Tenth Edition'] = '10E' - allSets['Magic 2010'] = 'M10' - allSets['Magic 2011'] = 'M11' - allSets['Magic 2012'] = 'M12' - - # Multiplayer Sets - allSets['Commander'] = 'COM' - - # Portal - allSets['Portal'] = 'POR' - allSets['Portal Second Age'] = 'PO2' - allSets['Portal Three Kingdoms'] = 'PTK' - - # Starter - allSets['Starter 1999'] = 'S99' - allSets['Starter 2000'] = 'S00' - - # Early Sets - allSets['Arabian Nights'] = 'ARN' - allSets['Antiquities'] = 'ATQ' - allSets['Legends'] = 'LEG' - allSets['The Dark'] = 'DRK' - allSets['Fallen Empires'] = 'FEM' - allSets['Homelands'] = 'HML' - - # Ice Age - allSets['Ice Age'] = 'ICE' - allSets['Alliances'] = 'ALL' - allSets['Coldsnap'] = 'CSP' - - # Mirage - allSets['Mirage'] = 'MIR' - allSets['Visions'] = 'VIS' - allSets['Weatherlight'] = 'WTH' - - # Rath Cycle - allSets['Tempest'] = 'TMP' - allSets['Stronghold'] = 'STH' - allSets['Exodus'] = 'EXO' - - # Artifacts Cycle - allSets['Urza\'s Saga'] = 'USG' - allSets['Urza\'s Legacy'] = 'ULG' - allSets['Urza\'s Destiny'] = 'UDS' - - # Masques - allSets['Mercadian Masques'] = 'MMQ' - allSets['Nemesis'] = 'NMS' - allSets['Prophecy'] = 'PCY' - - # Invasion - allSets['Invasion'] = 'INV' - allSets['Planeshift'] = 'PLS' - allSets['Apocalypse'] = 'APC' - - # Odyssey - allSets['Odyssey'] = 'ODY' - allSets['Torment'] = 'TOR' - allSets['Judgment'] = 'JUD' - - # Onslaught - allSets['Onslaught'] = 'ONS' - allSets['Legions'] = 'LGN' - allSets['Scourge'] = 'SCG' - - # Mirrodin - allSets['Mirrodin'] = 'MRD' - allSets['Darksteel'] = 'DST' - allSets['Fifth Dawn'] = '5DN' - - # Kamigawa - allSets['Champions of Kamigawa'] = 'CHK' - allSets['Betrayers of Kamigawa'] = 'BOK' - allSets['Saviors of Kamigawa'] = 'SOK' - - # Ravnica - allSets['Ravnica: City of Guilds'] = 'RAV' - allSets['Guildpact'] = 'GPT' - allSets['Dissension'] = 'DIS' - - # Time Spiral - allSets['Time Spiral'] = 'TSP' - allSets['Time Spiral "Timeshifted"'] = 'TSB' - allSets['Planar Chaos'] = 'PLC' - allSets['Future Sight'] = 'FUT' - - # Lorwyn - allSets['Lorwyn'] = 'LRW' - allSets['Morningtide'] = 'MOR' - - # Shadowmoor - allSets['Shadowmoor'] = 'SHM' - allSets['Eventide'] = 'EVE' - - # Alara - allSets['Shards of Alara'] = 'ALA' - allSets['Conflux'] = 'CFX' - allSets['Alara Reborn'] = 'ARB' - - # Zendikar - allSets['Zendikar'] = 'ZEN' - allSets['Worldwake'] = 'WWK' - allSets['Rise of the Eldrazi'] = 'ROE' - - # Scars of Mirrodin - allSets['Scars of Mirrodin'] = 'SOM' - allSets['Mirrodin Besieged'] = 'MBS' - allSets['New Phyrexia'] = 'NPH' - -def addSets(card): - html = getURL('http://magiccards.info/query?q=!'+card.name) - start = html.find('
Editions:
') - end = html.find('
Languages:
', start) - block = html[start:end] - - print card.name - - for edition in allSets.keys(): - edIndex = block.find('>'+edition+'<') # Portal/Mirrodin issue - - if edIndex == -1: - edIndex = block.find('>'+edition+' (') # Single set issue - if edIndex == -1: - continue - - # Scrape rarity - rarityIndex = block.find('(',edIndex) - rarity = block[rarityIndex+1:block.find(')',rarityIndex)] - raritySpace = rarity.find(' ') - if raritySpace != -1: - rarity = rarity[0:raritySpace] # For older cards - - # What to do with TimeShifted cards? - if rarity == 'Special' and edition != 'Time Spiral "Timeshifted"': - continue - - # Get setAbbreviation and setNumber - dataIndex = block.rfind('"/',0,edIndex) - data = block[dataIndex+2:edIndex-1] # 1 instead of 2 because of Portal/Mirrodin Issue - - splitData = data.split('/') - setAbbr = splitData[0] - setNum = splitData[2].replace('.html', '') - - if len(setNum) > 4: - # Setnum not available here for most recent set. Switch to the .jpg used on page - jpgIndex = html.find('.jpg') - data = html[html.rfind('scans/en/', 0, jpgIndex):jpgIndex] - - # data = scans/en/[set]/[num] - splitData = data.split('/') - setAbbr = splitData[2] - setNum = splitData[3] - - image = 'http://magiccards.info/scans/en/' + setAbbr + '/' + setNum + '.jpg' - - card.sets[allSets[edition]] = SetInfo(allSets[edition], rarity, image) - - return - - -#get master card list and drop into a dictionary -folder = "cardsfolder" -err = open('setInfoScript.log','w') -allSets = {} -initSets() -cardDict = {} -setStr = 'SetInfo:' - -for root, dirnames, filenames in os.walk(folder): - for fileName in fnmatch.filter(filenames, '*.txt'): - if fileName.startswith('.'): - continue - - # parse cardsfolder for Card Lines and Rarity/Picture SVars. Filling in any gaps - file = open(os.path.join(root, fileName)) - cleanName = fileName.replace('.txt', '') - - line = file.readline().strip() - # Handle name and creation - name = line.replace('Name:','') - - card = Card(name.replace(' ','+'), cleanName) #This makes it work on Mac OS X. Will test Windows and FreeBSD when I can. - cardDict[cleanName] = card - card.lines = line + '\n' - - # Start parsing the rest of the data file - line = file.readline().strip() - - while line != 'End': - # Skip empty lines - if line == '': - line = file.readline().strip() - continue - - # We really shouldn't - if line == 'End': - break - - if line.find(setStr) != -1: - info = line.replace('SetInfo:','') - parts = info.split('|') - - card.hasSet = True - card.sets[parts[0]] = SetInfo(parts[0], parts[1], parts[2]) - else: - card.lines += line +'\n' - - line = file.readline().strip() - - if not card.hasSet: - addSets(card) - card.hasSet = True - - file = open(os.path.join(root, fileName), 'w') - file.write(card.lines) - if card.hasSet: - for s in card.sets.values(): - file.write('SetInfo:'+ s.set + '|' + s.rarity + '|' + s.image + '\n') - - file.write('End') - - err.write(card.name + '... Updated\n') - - file.close() -err.close() diff --git a/res/sound/tap.mp3 b/res/sound/tap.mp3 deleted file mode 100644 index 806612a6aa3..00000000000 Binary files a/res/sound/tap.mp3 and /dev/null differ diff --git a/src/arcane/ui/CardArea.java b/src/arcane/ui/CardArea.java deleted file mode 100644 index d89a9ca65ed..00000000000 --- a/src/arcane/ui/CardArea.java +++ /dev/null @@ -1,332 +0,0 @@ -package arcane.ui; - -import arcane.ui.util.Animation; -import arcane.ui.util.CardPanelMouseListener; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.MouseEvent; - -/** - *

CardArea class.

- * - * @author Forge - * @version $Id$ - */ -public class CardArea extends CardPanelContainer - implements CardPanelMouseListener { - /** - * - */ - private static final long serialVersionUID = -5836122075999621592L; - /** - * Constant GUTTER_Y=5 - */ - public static final int GUTTER_Y = 5; - /** - * Constant GUTTER_X=5 - */ - public static final int GUTTER_X = 5; - /** - * - */ - private static final float HORIZ_CARD_SPACING_X = 0.04f; - /** - * - */ - private static final float HORIZ_CARD_SPACING_Y = 0.06f; - /** - * - */ - private static final float VERT_CARD_SPACING_X = 0.06f; - /** - * - */ - private static final float VERT_CARD_SPACING_Y = 0.10f; - - private float maxCoverage = 0.5f; - private int maxRows = 0; - - // Computed in layout. - private float cardSpacingX; - private int actualCardsPerRow; - private int mouseDragStartX; - private int mouseDragStartY; - private boolean isVertical; - private boolean hasScrollbars; - - /** - *

Constructor for CardArea.

- * - * @param scrollPane a {@link javax.swing.JScrollPane} object. - */ - public CardArea(JScrollPane scrollPane) { - super(scrollPane); - setBackground(Color.white); - } - - /** {@inheritDoc} */ - public CardPanel getCardPanel(int x, int y) { - if (isVertical) { - for (int i = cardPanels.size() - 1; i >= 0; i--) { - CardPanel panel = cardPanels.get(i); - int panelX = panel == mouseDragPanel ? mouseDragStartX : panel.getCardX(); - int panelY = panel == mouseDragPanel ? mouseDragStartY : panel.getCardY(); - int panelWidth = panel.getCardWidth(); - int panelHeight = panel.getCardHeight(); - if (x > panelX && x < panelX + panelWidth) { - if (y > panelY && y < panelY + panelHeight) { - if (!panel.isDisplayEnabled()) return null; - return panel; - } - } - } - } else { - for (int i = 0, n = cardPanels.size(); i < n; i++) { - CardPanel panel = cardPanels.get(i); - int panelX = panel == mouseDragPanel ? mouseDragStartX : panel.getCardX(); - int panelY = panel == mouseDragPanel ? mouseDragStartY : panel.getCardY(); - int panelWidth = panel.getCardWidth(); - int panelHeight = panel.getCardHeight(); - if (x > panelX && x < panelX + panelWidth) { - if (y > panelY && y < panelY + panelHeight) { - if (!panel.isDisplayEnabled()) return null; - return panel; - } - } - } - } - return null; - } - - /** - *

doLayout.

- * - * @since 1.0.15 - */ - public void doLayout() { - if (cardPanels.isEmpty()) return; - - Rectangle rect = scrollPane.getVisibleRect(); - Insets insets = scrollPane.getInsets(); - rect.width -= insets.left; - rect.height -= insets.top; - rect.width -= insets.right; - rect.height -= insets.bottom; - - int cardAreaWidth = rect.width; - int cardAreaHeight = rect.height; - int cardWidth = cardWidthMax; - int cardHeight; - int cardSpacingY; - - int maxWidth = 0, maxHeight = 0; - if (isVertical) { - while (true) { - cardHeight = Math.round(cardWidth * CardPanel.ASPECT_RATIO); - cardSpacingX = Math.round(cardWidth * VERT_CARD_SPACING_X); - cardSpacingY = cardHeight + Math.round(cardWidth * VERT_CARD_SPACING_Y); - int maxRows = (int) Math.floor((cardAreaWidth - GUTTER_X * 2 + cardSpacingX) / (cardWidth + cardSpacingX)); - if (this.maxRows > 0) maxRows = Math.min(this.maxRows, maxRows); - int availableRowHeight = cardAreaHeight - GUTTER_Y * 2; - int availableCardsPerRow = (int) Math.floor((availableRowHeight - (cardHeight - cardSpacingY)) / (double) cardSpacingY); - actualCardsPerRow = Math.max(availableCardsPerRow, (int) Math.ceil(cardPanels.size() / (float) maxRows)); - int actualRowHeight = (int) Math.floor((actualCardsPerRow - 1) * cardSpacingY + cardHeight); - float overflow = actualRowHeight - availableRowHeight; - if (overflow > 0) { - float offsetY = overflow / (actualCardsPerRow - 1); - offsetY = Math.min(offsetY, cardHeight * maxCoverage); - cardSpacingY -= offsetY; - } - actualRowHeight = (int) Math.floor((actualCardsPerRow - 1) * cardSpacingY + cardHeight); - if (actualRowHeight >= 0 && actualRowHeight <= availableRowHeight) break; - cardWidth--; - if (cardWidth == cardWidthMin) break; - } - - float x = GUTTER_X; - int y = GUTTER_Y; - int zOrder = cardPanels.size() - 1, rowCount = 0; - for (CardPanel panel : cardPanels) { - if (panel != mouseDragPanel) panel.setCardBounds((int) Math.floor(x), y, cardWidth, cardHeight); - y += cardSpacingY; - maxWidth = Math.round(x) + cardWidth + GUTTER_X; - maxHeight = Math.max(maxHeight, (y + (cardHeight - cardSpacingY) + GUTTER_Y)); - setComponentZOrder(panel, zOrder); - zOrder--; - rowCount++; - if (rowCount == actualCardsPerRow) { - rowCount = 0; - x += cardWidth + cardSpacingX; - y = GUTTER_Y; - } - } - } else { - while (true) { - cardHeight = Math.round(cardWidth * CardPanel.ASPECT_RATIO); - int extraCardSpacingX = Math.round(cardWidth * HORIZ_CARD_SPACING_X); - cardSpacingY = Math.round(cardHeight * HORIZ_CARD_SPACING_Y); - cardSpacingX = cardWidth + extraCardSpacingX; - int maxRows = (int) Math.floor((cardAreaHeight - GUTTER_Y * 2 + cardSpacingY) / (double) (cardHeight + cardSpacingY)); - if (this.maxRows > 0) maxRows = Math.min(this.maxRows, maxRows); - int availableRowWidth = cardAreaWidth - GUTTER_X * 2; - int availableCardsPerRow = (int) Math.floor((availableRowWidth - (cardWidth - cardSpacingX)) / cardSpacingX); - actualCardsPerRow = Math.max(availableCardsPerRow, (int) Math.ceil(cardPanels.size() / (float) maxRows)); - int actualRowWidth = (int) Math.floor((actualCardsPerRow - 1) * cardSpacingX + cardWidth); - float overflow = actualRowWidth - availableRowWidth; - if (overflow > 0) { - float offsetX = overflow / (actualCardsPerRow - 1); - offsetX = Math.min(offsetX, cardWidth * maxCoverage); - cardSpacingX -= offsetX; - } - actualRowWidth = (int) Math.floor((actualCardsPerRow - 1) * cardSpacingX + cardWidth); - if (actualRowWidth <= availableRowWidth) break; - cardWidth--; - if (cardWidth == cardWidthMin) break; - } - - float x = GUTTER_X; - int y = GUTTER_Y; - int zOrder = 0, rowCount = 0; - for (CardPanel panel : cardPanels) { - if (panel != mouseDragPanel) panel.setCardBounds((int) Math.floor(x), y, cardWidth, cardHeight); - x += cardSpacingX; - maxWidth = Math.max(maxWidth, Math.round(x + (cardWidth - cardSpacingX) + GUTTER_X) - 1); - maxHeight = Math.max(maxHeight, y + (cardHeight - cardSpacingY) + GUTTER_Y); - setComponentZOrder(panel, zOrder); - zOrder++; - rowCount++; - if (rowCount == actualCardsPerRow) { - rowCount = 0; - x = GUTTER_X; - y += cardHeight + cardSpacingY; - } - } - } - - Dimension oldPreferredSize = getPreferredSize(); - setPreferredSize(new Dimension(maxWidth, maxHeight)); - if (oldPreferredSize.width != maxWidth || oldPreferredSize.height != maxHeight) { - getParent().invalidate(); - getParent().validate(); - } - } - - /** {@inheritDoc} */ - public void paint(Graphics g) { - boolean hasScrollbars = scrollPane.getVerticalScrollBar().isVisible(); - if (hasScrollbars != this.hasScrollbars) revalidate(); - this.hasScrollbars = hasScrollbars; - - super.paint(g); - } - - /** {@inheritDoc} */ - public void mouseDragStart(CardPanel dragPanel, MouseEvent evt) { - super.mouseDragStart(dragPanel, evt); - - mouseDragStartX = dragPanel.getCardX(); - mouseDragStartY = dragPanel.getCardY(); - dragPanel.setDisplayEnabled(false); - - CardPanel.dragAnimationPanel = new CardPanel(dragPanel.gameCard); - CardPanel.dragAnimationPanel.setImage(dragPanel); - JFrame frame = (JFrame) SwingUtilities.windowForComponent(this); - final JLayeredPane layeredPane = frame.getLayeredPane(); - layeredPane.add(CardPanel.dragAnimationPanel); - layeredPane.moveToFront(CardPanel.dragAnimationPanel); - Point p = SwingUtilities.convertPoint(this, mouseDragStartX, mouseDragStartY, layeredPane); - CardPanel.dragAnimationPanel.setCardBounds(p.x, p.y, dragPanel.getCardWidth(), dragPanel.getCardHeight()); - } - - /** {@inheritDoc} */ - public void mouseDragged(CardPanel dragPanel, int dragOffsetX, int dragOffsetY, MouseEvent evt) { - super.mouseDragged(dragPanel, dragOffsetX, dragOffsetY, evt); - - int mouseX = evt.getX(); - int mouseY = evt.getY(); - int dragPanelX = mouseX + dragOffsetX; - int dragPanelY = mouseY + dragOffsetY; - Point p = SwingUtilities.convertPoint(this, dragPanelX, dragPanelY, CardPanel.dragAnimationPanel.getParent()); - CardPanel.dragAnimationPanel.setLocation(p.x, p.y); - - CardPanel panel = getCardPanel(mouseX, mouseY); - if (panel == null || panel == dragPanel) return; - int index = cardPanels.size(); - while (--index >= 0) - if (cardPanels.get(index) == panel) break; - cardPanels.remove(dragPanel); - cardPanels.add(index, dragPanel); - mouseDragStartX = panel.getCardX(); - mouseDragStartY = panel.getCardY(); - revalidate(); - } - - /** {@inheritDoc} */ - public void mouseDragEnd(CardPanel dragPanel, MouseEvent evt) { - super.mouseDragEnd(dragPanel, evt); - doLayout(); - JLayeredPane layeredPane = SwingUtilities.getRootPane(CardPanel.dragAnimationPanel).getLayeredPane(); - int startX = CardPanel.dragAnimationPanel.getCardX(); - int startY = CardPanel.dragAnimationPanel.getCardY(); - int startWidth = CardPanel.dragAnimationPanel.getCardWidth(); - Point endPos = SwingUtilities.convertPoint(this, dragPanel.getCardLocation(), layeredPane); - int endWidth = dragPanel.getCardWidth(); - Animation.moveCard(startX, startY, startWidth, endPos.x, endPos.y, endWidth, CardPanel.dragAnimationPanel, dragPanel, - layeredPane, 200); - } - - /** - *

Getter for the field maxCoverage.

- * - * @return a float. - */ - public float getMaxCoverage() { - return maxCoverage; - } - - /** - *

Setter for the field maxCoverage.

- * - * @param maxCoverage a float. - */ - public void setMaxCoverage(float maxCoverage) { - this.maxCoverage = maxCoverage; - } - - /** - *

Setter for the field maxRows.

- * - * @param maxRows a int. - */ - public void setMaxRows(int maxRows) { - this.maxRows = maxRows; - } - - /** - *

Getter for the field maxRows.

- * - * @return a int. - */ - public int getMaxRows() { - return maxRows; - } - - /** - *

setVertical.

- * - * @param isVertical a boolean. - */ - public void setVertical(boolean isVertical) { - this.isVertical = isVertical; - } - - /** - *

isVertical.

- * - * @return a boolean. - */ - public boolean isVertical() { - return isVertical; - } -} diff --git a/src/arcane/ui/CardPanel.java b/src/arcane/ui/CardPanel.java deleted file mode 100644 index ac2081fc120..00000000000 --- a/src/arcane/ui/CardPanel.java +++ /dev/null @@ -1,492 +0,0 @@ -package arcane.ui; - -import arcane.ui.ScaledImagePanel.MultipassType; -import arcane.ui.ScaledImagePanel.ScalingType; -import arcane.ui.util.GlowText; -import arcane.ui.util.ManaSymbols; -import forge.*; - -import javax.swing.*; -import java.awt.Color; -import java.awt.*; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; -import java.util.ArrayList; -import java.util.List; - -/** - *

CardPanel class.

- * - * @author Forge - * @version $Id$ - */ -public class CardPanel extends JPanel implements CardContainer { - /** Constant serialVersionUID=2361907095724263295L */ - private static final long serialVersionUID = 2361907095724263295L; - /** - * Constant TAPPED_ANGLE=Math.PI / 2 - */ - public static final double TAPPED_ANGLE = Math.PI / 2; - /** - * Constant ASPECT_RATIO=3.5f / 2.5f - */ - public static final float ASPECT_RATIO = 3.5f / 2.5f; - - /** - * Constant dragAnimationPanel - */ - public static CardPanel dragAnimationPanel; - - /** Constant ROUNDED_CORNER_SIZE=0.1f */ - private static final float ROUNDED_CORNER_SIZE = 0.1f; - /** Constant SELECTED_BORDER_SIZE=0.01f */ - private static final float SELECTED_BORDER_SIZE = 0.01f; - /** Constant BLACK_BORDER_SIZE=0.03f */ - private static final float BLACK_BORDER_SIZE = 0.03f; - /** Constant TEXT_GLOW_SIZE=6 */ - private static final int TEXT_GLOW_SIZE = 6; - /** Constant TEXT_GLOW_INTENSITY=3f */ - private static final float TEXT_GLOW_INTENSITY = 3f; - /** Constant rotCenterToTopCorner=1.0295630140987000315797369464196f */ - private static final float rotCenterToTopCorner = 1.0295630140987000315797369464196f; - /** Constant rotCenterToBottomCorner=0.7071067811865475244008443621048f */ - private static final float rotCenterToBottomCorner = 0.7071067811865475244008443621048f; - - /** Constant beenHere=false */ - private static boolean beenHere = false; - - public Card gameCard; - public CardPanel attachedToPanel; - public List attachedPanels = new ArrayList(); - public boolean tapped; - public double tappedAngle = 0; - public ScaledImagePanel imagePanel; - - private GlowText titleText; - private GlowText ptText; - private List imageLoadListeners = new ArrayList(2); - private boolean displayEnabled = true; - private boolean isAnimationPanel; - private int cardXOffset, cardYOffset, cardWidth, cardHeight; - private boolean isSelected; - private boolean showCastingCost; - - /** - *

Constructor for CardPanel.

- * - * @param newGameCard a {@link forge.Card} object. - */ - public CardPanel(Card newGameCard) { - this.gameCard = newGameCard; - - setBackground(Color.black); - setOpaque(false); - - titleText = new GlowText(); - titleText.setFont(getFont().deriveFont(Font.BOLD, 13f)); - titleText.setForeground(Color.white); - titleText.setGlow(Color.black, TEXT_GLOW_SIZE, TEXT_GLOW_INTENSITY); - titleText.setWrap(true); - add(titleText); - - ptText = new GlowText(); - ptText.setFont(getFont().deriveFont(Font.BOLD, 13f)); - ptText.setForeground(Color.white); - ptText.setGlow(Color.black, TEXT_GLOW_SIZE, TEXT_GLOW_INTENSITY); - add(ptText); - - imagePanel = new ScaledImagePanel(); - add(imagePanel); - imagePanel.setScaleLarger(true); - imagePanel.setScalingType(ScalingType.nearestNeighbor); - imagePanel.setScalingBlur(true); - imagePanel.setScalingMultiPassType(MultipassType.none); - - addComponentListener(new ComponentAdapter() { - @Override - public void componentShown(ComponentEvent e) { - setCard(gameCard); - } - - @Override - public void componentResized(ComponentEvent e) { - setCard(gameCard); - } - }); - - setCard(newGameCard); - } - - /** - *

setImage.

- * - * @param srcImage a {@link java.awt.Image} object. - * @param srcImageBlurred a {@link java.awt.Image} object. - * @param srcImageBlurred a {@link java.awt.Image} object. - */ - private void setImage(Image srcImage, Image srcImageBlurred) { - synchronized (imagePanel) { - imagePanel.setImage(srcImage, srcImageBlurred); - repaint(); - for (CardPanel cardPanel : imageLoadListeners) { - cardPanel.setImage(srcImage, srcImageBlurred); - cardPanel.repaint(); - } - imageLoadListeners.clear(); - } - doLayout(); - } - - /** - *

setImage.

- * - * @param panel a {@link arcane.ui.CardPanel} object. - */ - public void setImage(final CardPanel panel) { - synchronized (panel.imagePanel) { - if (panel.imagePanel.hasImage()) - setImage(panel.imagePanel.srcImage, panel.imagePanel.srcImageBlurred); - else - panel.imageLoadListeners.add(this); - } - } - - /** - *

setScalingType.

- * - * @param scalingType a {@link arcane.ui.ScaledImagePanel.ScalingType} object. - */ - public void setScalingType(ScalingType scalingType) { - imagePanel.setScalingType(scalingType); - } - - /** - *

Setter for the field displayEnabled.

- * - * @param displayEnabled a boolean. - */ - public void setDisplayEnabled(boolean displayEnabled) { - this.displayEnabled = displayEnabled; - } - - /** - *

isDisplayEnabled.

- * - * @return a boolean. - */ - public boolean isDisplayEnabled() { - return displayEnabled; - } - - /** - *

setAnimationPanel.

- * - * @param isAnimationPanel a boolean. - */ - public void setAnimationPanel(boolean isAnimationPanel) { - this.isAnimationPanel = isAnimationPanel; - } - - /** - *

setSelected.

- * - * @param isSelected a boolean. - */ - public void setSelected(boolean isSelected) { - this.isSelected = isSelected; - repaint(); - } - - /** - *

Setter for the field showCastingCost.

- * - * @param showCastingCost a boolean. - */ - public void setShowCastingCost(boolean showCastingCost) { - this.showCastingCost = showCastingCost; - } - - /** {@inheritDoc} */ - public void paint(Graphics g) { - if (!displayEnabled) return; - if (!isValid()) super.validate(); - Graphics2D g2d = (Graphics2D) g; - if (tappedAngle > 0) { - g2d = (Graphics2D) g2d.create(); - float edgeOffset = cardWidth / 2f; - g2d.rotate(tappedAngle, cardXOffset + edgeOffset, cardYOffset + cardHeight - edgeOffset); - } - super.paint(g2d); - } - - /** {@inheritDoc} */ - protected void paintComponent(Graphics g) { - Graphics2D g2d = (Graphics2D) g; - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - - // + White borders for Core sets Unlimited - 9th + - int cornerSize = Math.max(4, Math.round(cardWidth * ROUNDED_CORNER_SIZE)); - - if (this.gameCard != null) { - if ((!this.gameCard.getImageFilename().equals("none")) && (!this.gameCard.getName().equals("Morph"))) { - if ((this.gameCard.getCurSetCode().equals("2ED")) || - (this.gameCard.getCurSetCode().equals("3ED")) || - (this.gameCard.getCurSetCode().equals("4ED")) || - (this.gameCard.getCurSetCode().equals("5ED")) || - (this.gameCard.getCurSetCode().equals("6ED")) || - (this.gameCard.getCurSetCode().equals("7ED")) || - (this.gameCard.getCurSetCode().equals("8ED")) || - (this.gameCard.getCurSetCode().equals("9ED")) || - (this.gameCard.getCurSetCode().equals("CHR")) || - (this.gameCard.getCurSetCode().equals("S99")) || - (this.gameCard.getCurSetCode().equals("PTK")) || - (this.gameCard.getCurSetCode().equals("S00"))) { - if (!isSelected) { - g2d.setColor(Color.black); - int offset = tapped ? 1 : 0; - for (int i = 1, n = Math.max(1, Math.round(cardWidth * SELECTED_BORDER_SIZE)); i <= n; i++) - g2d.drawRoundRect(cardXOffset - i, cardYOffset - i + offset, cardWidth + i * 2 - 1, cardHeight + i * 2 - 1, - cornerSize, cornerSize); - } - g2d.setColor(Color.white); - } else { - g2d.setColor(Color.black); - } - } - } - // - White borders for Core sets Unlimited - 9th - - - g2d.fillRoundRect(cardXOffset, cardYOffset, cardWidth, cardHeight, cornerSize, cornerSize); - if (isSelected) { - g2d.setColor(Color.green); - int offset = tapped ? 1 : 0; - for (int i = 1, n = Math.max(1, Math.round(cardWidth * SELECTED_BORDER_SIZE)); i <= n; i++) - g2d.drawRoundRect(cardXOffset - i, cardYOffset - i + offset, cardWidth + i * 2 - 1, cardHeight + i * 2 - 1, - cornerSize, cornerSize); - } - } - - /** {@inheritDoc} */ - protected void paintChildren(Graphics g) { - super.paintChildren(g); - - if (showCastingCost && !isAnimationPanel && cardWidth < 200) { - int width = ManaSymbols.getWidth(gameCard.getManaCost()); - ManaSymbols.draw(g, gameCard.getManaCost(), cardXOffset + cardWidth / 2 - width / 2, cardYOffset + cardHeight / 2); - beenHere = true; - } - - //int yOff = (cardHeight/4) + 2; - if (showCastingCost && !isAnimationPanel && cardWidth < 200 && getCard().isAttacking()) - ManaSymbols.drawSymbol("attack", g, cardXOffset + cardWidth / 4 - 16, cardYOffset + cardHeight - (cardHeight / 8) - 16); - else if (showCastingCost && !isAnimationPanel && cardWidth < 200 && getCard().isBlocking()) - ManaSymbols.drawSymbol("defend", g, cardXOffset + cardWidth / 4 - 16, cardYOffset + cardHeight - (cardHeight / 8) - 16); - - if (showCastingCost && !isAnimationPanel && cardWidth < 200 && getCard().isCreature() && getCard().hasSickness() && AllZoneUtil.isCardInPlay(getCard())) - ManaSymbols.drawSymbol("summonsick", g, cardXOffset + cardWidth / 2 - 16, cardYOffset + cardHeight - (cardHeight / 8) - 16); - - if (beenHere && getCard() != null) { - if (this.gameCard.getFoil() > 0) { - String fl = String.format("foil%02d", getCard().getFoil()); - int z = Math.round(cardWidth * BLACK_BORDER_SIZE); - ManaSymbols.draw(g, fl, cardXOffset + z, cardYOffset + z, cardWidth - (2*z), cardHeight - (2*z)); - } - - if (getCard().getName().equals("Mana Pool") && !isAnimationPanel) { - - if (AllZone.getManaPool() != null) { - String s = AllZone.getManaPool().getManaList(); - if (!s.equals("|||||||||||")) { - - String mList[] = s.split("\\|", 12); - - int n = 0; - for (int i = 0; i < 2; i++) { - for (int j = 0; j < 6; j++) { - if (!mList[n].equals("")) { - int width = ManaSymbols.getWidth(mList[n]); - ManaSymbols.draw(g, mList[n], cardXOffset + ((i + 1) * (cardWidth / 3)) - width / 2, cardYOffset + ((j + 1) * (cardHeight / 7))); - } - - n++; - } - } - } - } - } - } - } - - /** - *

doLayout.

- * - * @since 1.0.15 - */ - public void doLayout() { - int borderSize = Math.round(cardWidth * BLACK_BORDER_SIZE); - imagePanel.setLocation(cardXOffset + borderSize, cardYOffset + borderSize); - imagePanel.setSize(cardWidth - borderSize * 2, cardHeight - borderSize * 2); - - int fontHeight = Math.round(cardHeight * (27f / 680)); - boolean showText = !imagePanel.hasImage() || (!isAnimationPanel && fontHeight < 12); - titleText.setVisible(showText); - ptText.setVisible(showText); - - int titleX = Math.round(cardWidth * (20f / 480)); - int titleY = Math.round(cardHeight * (9f / 680)); - titleText.setBounds(cardXOffset + titleX, cardYOffset + titleY, cardWidth - titleX, cardHeight); - - Dimension ptSize = ptText.getPreferredSize(); - ptText.setSize(ptSize.width, ptSize.height); - int ptX = Math.round(cardWidth * (420f / 480)) - ptSize.width / 2; - int ptY = Math.round(cardHeight * (675f / 680)) - ptSize.height; - ptText.setLocation(cardXOffset + ptX - TEXT_GLOW_SIZE / 2, cardYOffset + ptY - TEXT_GLOW_SIZE / 2); - - if (isAnimationPanel || cardWidth < 200) - imagePanel.setScalingType(ScalingType.nearestNeighbor); - else - imagePanel.setScalingType(ScalingType.bilinear); - } - - /** - *

toString.

- * - * @return a {@link java.lang.String} object. - */ - public String toString() { - return gameCard.getName(); - } - - /** - *

setCardBounds.

- * - * @param x a int. - * @param y a int. - * @param width a int. - * @param height a int. - */ - public void setCardBounds(int x, int y, int width, int height) { - cardWidth = width; - cardHeight = height; - int rotCenterX = Math.round(width / 2f); - int rotCenterY = height - rotCenterX; - int rotCenterToTopCorner = Math.round(width * CardPanel.rotCenterToTopCorner); - int rotCenterToBottomCorner = Math.round(width * CardPanel.rotCenterToBottomCorner); - int xOffset = rotCenterX - rotCenterToBottomCorner; - int yOffset = rotCenterY - rotCenterToTopCorner; - cardXOffset = -xOffset; - cardYOffset = -yOffset; - width = -xOffset + rotCenterX + rotCenterToTopCorner; - height = -yOffset + rotCenterY + rotCenterToBottomCorner; - setBounds(x + xOffset, y + yOffset, width, height); - } - - /** - *

repaint.

- */ - public void repaint() { - Rectangle b = getBounds(); - JRootPane rootPane = SwingUtilities.getRootPane(this); - if (rootPane == null) return; - Point p = SwingUtilities.convertPoint(getParent(), b.x, b.y, rootPane); - rootPane.repaint(p.x, p.y, b.width, b.height); - } - - /** - *

getCardX.

- * - * @return a int. - */ - public int getCardX() { - return getX() + cardXOffset; - } - - /** - *

getCardY.

- * - * @return a int. - */ - public int getCardY() { - return getY() + cardYOffset; - } - - /** - *

Getter for the field cardWidth.

- * - * @return a int. - */ - public int getCardWidth() { - return cardWidth; - } - - /** - *

Getter for the field cardHeight.

- * - * @return a int. - */ - public int getCardHeight() { - return cardHeight; - } - - /** - *

getCardLocation.

- * - * @return a {@link java.awt.Point} object. - */ - public Point getCardLocation() { - Point p = getLocation(); - p.x += cardXOffset; - p.y += cardYOffset; - return p; - } - - /** - *

setText.

- * - * @param card a {@link forge.Card} object. - */ - public void setText(Card card) { - if (card == null || !Gui_NewGame.cardOverlay.isSelected()) return; - if (card.isFaceDown()) { - titleText.setText(""); - showCastingCost = false; - } else { - titleText.setText(card.getName()); - showCastingCost = true; - } - - if (card.isCreature() && card.isPlaneswalker()) { - ptText.setText(card.getNetAttack() + "/" + card.getNetDefense() + " (" + String.valueOf(card.getCounters(Counters.LOYALTY)) + ")"); - } else if (card.isCreature()) { - ptText.setText(card.getNetAttack() + "/" + card.getNetDefense()); - } else if (card.isPlaneswalker()) { - ptText.setText(String.valueOf(card.getCounters(Counters.LOYALTY))); - } else { - ptText.setText(""); - } - } - - /** - *

getCard.

- * - * @return a {@link forge.Card} object. - */ - public Card getCard() { - return gameCard; - } - - /** {@inheritDoc} */ - public void setCard(Card card) { - if (gameCard != null && gameCard.equals(card) && isAnimationPanel && imagePanel.hasImage()) return; - this.gameCard = card; - if (!isShowing()) return; - Insets i = getInsets(); - Image image = card == null ? null : ImageCache.getImage(card, getWidth() - i.left - i.right, getHeight() - - i.top - i.bottom); - if (gameCard != null && Gui_NewGame.cardOverlay.isSelected()) { - setText(gameCard); - } - - setImage(image, image); - } -} diff --git a/src/arcane/ui/CardPanelContainer.java b/src/arcane/ui/CardPanelContainer.java deleted file mode 100644 index 1627e00cc60..00000000000 --- a/src/arcane/ui/CardPanelContainer.java +++ /dev/null @@ -1,430 +0,0 @@ -package arcane.ui; - -import arcane.ui.util.CardPanelMouseListener; -import arcane.ui.util.UI; -import forge.Card; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseMotionListener; -import java.util.ArrayList; -import java.util.List; - -/** - * Manages mouse events and common funcitonality for CardPanel containing components. - * - * @author Forge - * @version $Id$ - */ -abstract public class CardPanelContainer extends JPanel { - /** Constant serialVersionUID=-6400018234895548306L */ - private static final long serialVersionUID = -6400018234895548306L; - - /** Constant DRAG_SMUDGE=10 */ - private final static int DRAG_SMUDGE = 10; - - public List cardPanels = new ArrayList(); - protected JScrollPane scrollPane; - protected int cardWidthMin = 50, cardWidthMax = 300; - protected CardPanel mouseOverPanel, mouseDownPanel, mouseDragPanel; - - private List listeners = new ArrayList(2); - private int mouseDragOffsetX, mouseDragOffsetY; - private int intialMouseDragX = -1, intialMouseDragY; - private boolean dragEnabled; - private int zoneID; - - /** - *

Constructor for CardPanelContainer.

- * - * @param scrollPane a {@link javax.swing.JScrollPane} object. - */ - public CardPanelContainer(JScrollPane scrollPane) { - this.scrollPane = scrollPane; - - setOpaque(true); - - addMouseMotionListener(new MouseMotionListener() { - public void mouseDragged(MouseEvent evt) { - if (!dragEnabled) { - mouseOutPanel(evt); - return; - } - if (mouseDragPanel != null) { - CardPanelContainer.this.mouseDragged(mouseDragPanel, mouseDragOffsetX, mouseDragOffsetY, evt); - return; - } - int x = evt.getX(); - int y = evt.getY(); - CardPanel panel = getCardPanel(x, y); - if (panel == null) return; - if (panel != mouseDownPanel) return; - if (intialMouseDragX == -1) { - intialMouseDragX = x; - intialMouseDragY = y; - return; - } - if (Math.abs(x - intialMouseDragX) < DRAG_SMUDGE && Math.abs(y - intialMouseDragY) < DRAG_SMUDGE) - return; - mouseDownPanel = null; - mouseDragPanel = panel; - mouseDragOffsetX = panel.getX() - intialMouseDragX; - mouseDragOffsetY = panel.getY() - intialMouseDragY; - CardPanelContainer.this.mouseDragStart(mouseDragPanel, evt); - } - - public void mouseMoved(MouseEvent evt) { - CardPanel panel = getCardPanel(evt.getX(), evt.getY()); - if (mouseOverPanel != null && mouseOverPanel != panel) CardPanelContainer.this.mouseOutPanel(evt); - if (panel == null) return; - mouseOverPanel = panel; - mouseOverPanel.setSelected(true); - CardPanelContainer.this.mouseOver(panel, evt); - } - }); - - addMouseListener(new MouseAdapter() { - private boolean[] buttonsDown = new boolean[4]; - - public void mousePressed(MouseEvent evt) { - int button = evt.getButton(); - if (button < 1 || button > 3) return; - buttonsDown[button] = true; - mouseDownPanel = getCardPanel(evt.getX(), evt.getY()); - } - - public void mouseReleased(MouseEvent evt) { - int button = evt.getButton(); - if (button < 1 || button > 3) return; - - if (dragEnabled) { - intialMouseDragX = -1; - if (mouseDragPanel != null) { - CardPanel panel = mouseDragPanel; - mouseDragPanel = null; - CardPanelContainer.this.mouseDragEnd(panel, evt); - } - } - - if (!buttonsDown[button]) return; - buttonsDown[button] = false; - - CardPanel panel = getCardPanel(evt.getX(), evt.getY()); - if (panel != null && mouseDownPanel == panel) { - int downCount = 0; - for (int i = 1; i < buttonsDown.length; i++) { - if (buttonsDown[i]) { - buttonsDown[i] = false; - downCount++; - } - } - if (downCount > 0) { - CardPanelContainer.this.mouseMiddleClicked(panel, evt); - } else if (SwingUtilities.isLeftMouseButton(evt)) { - CardPanelContainer.this.mouseLeftClicked(panel, evt); - } else if (SwingUtilities.isRightMouseButton(evt)) { - CardPanelContainer.this.mouseRightClicked(panel, evt); - } else if (SwingUtilities.isMiddleMouseButton(evt)) { - CardPanelContainer.this.mouseMiddleClicked(panel, evt); - } - } - } - - public void mouseExited(MouseEvent evt) { - mouseOutPanel(evt); - } - - public void mouseEntered(MouseEvent e) { - } - }); - } - - /** - *

mouseOutPanel.

- * - * @param evt a {@link java.awt.event.MouseEvent} object. - */ - private void mouseOutPanel(MouseEvent evt) { - if (mouseOverPanel == null) return; - mouseOverPanel.setSelected(false); - mouseOut(mouseOverPanel, evt); - mouseOverPanel = null; - } - - /*public void resetDrag(){ - mouseDragPanel = null; - invalidate(); - };*/ - /** - *

getCardPanel.

- * - * @param x a int. - * @param y a int. - * @return a {@link arcane.ui.CardPanel} object. - */ - abstract protected CardPanel getCardPanel(int x, int y); - - /** - * Must call from the Swing event thread. - * - * @param card a {@link forge.Card} object. - * @return a {@link arcane.ui.CardPanel} object. - */ - public CardPanel addCard(Card card) { - final CardPanel placeholder = new CardPanel(card); - placeholder.setDisplayEnabled(false); - cardPanels.add(placeholder); - add(placeholder); - doLayout(); - // int y = Math.min(placeholder.getHeight(), scrollPane.getVisibleRect().height); - scrollRectToVisible(new Rectangle(placeholder.getCardX(), placeholder.getCardY(), placeholder.getCardWidth(), placeholder - .getCardHeight())); - return placeholder; - } - - /** - *

getCardPanel.

- * - * @param gameCardID a int. - * @return a {@link arcane.ui.CardPanel} object. - */ - public CardPanel getCardPanel(int gameCardID) { - for (CardPanel panel : cardPanels) - if (panel.gameCard.getUniqueNumber() == gameCardID) return panel; - return null; - } - - /** - *

removeCardPanel.

- * - * @param fromPanel a {@link arcane.ui.CardPanel} object. - */ - public void removeCardPanel(final CardPanel fromPanel) { - UI.invokeAndWait(new Runnable() { - public void run() { - if (mouseDragPanel != null) { - CardPanel.dragAnimationPanel.setVisible(false); - CardPanel.dragAnimationPanel.repaint(); - cardPanels.remove(CardPanel.dragAnimationPanel); - remove(CardPanel.dragAnimationPanel); - mouseDragPanel = null; - } - mouseOverPanel = null; - cardPanels.remove(fromPanel); - remove(fromPanel); - invalidate(); - repaint(); - } - }); - } - - /** - *

clear.

- */ - public void clear() { - UI.invokeAndWait(new Runnable() { - public void run() { - cardPanels.clear(); - removeAll(); - setPreferredSize(new Dimension(0, 0)); - invalidate(); - getParent().validate(); - repaint(); - } - }); - } - - /** - *

Getter for the field scrollPane.

- * - * @return a {@link javax.swing.JScrollPane} object. - */ - public JScrollPane getScrollPane() { - return scrollPane; - } - - /** - *

Getter for the field cardWidthMin.

- * - * @return a int. - */ - public int getCardWidthMin() { - return cardWidthMin; - } - - /** - *

Setter for the field cardWidthMin.

- * - * @param cardWidthMin a int. - */ - public void setCardWidthMin(int cardWidthMin) { - this.cardWidthMin = cardWidthMin; - } - - /** - *

Getter for the field cardWidthMax.

- * - * @return a int. - */ - public int getCardWidthMax() { - return cardWidthMax; - } - - /** - *

Setter for the field cardWidthMax.

- * - * @param cardWidthMax a int. - */ - public void setCardWidthMax(int cardWidthMax) { - this.cardWidthMax = cardWidthMax; - } - - /** - *

isDragEnabled.

- * - * @return a boolean. - */ - public boolean isDragEnabled() { - return dragEnabled; - } - - /** - *

Setter for the field dragEnabled.

- * - * @param dragEnabled a boolean. - */ - public void setDragEnabled(boolean dragEnabled) { - this.dragEnabled = dragEnabled; - } - - /** - *

addCardPanelMouseListener.

- * - * @param listener a {@link arcane.ui.util.CardPanelMouseListener} object. - */ - public void addCardPanelMouseListener(CardPanelMouseListener listener) { - listeners.add(listener); - } - - /** - *

mouseLeftClicked.

- * - * @param panel a {@link arcane.ui.CardPanel} object. - * @param evt a {@link java.awt.event.MouseEvent} object. - */ - public void mouseLeftClicked(CardPanel panel, MouseEvent evt) { - for (CardPanelMouseListener listener : listeners) - listener.mouseLeftClicked(panel, evt); - } - - /** - *

mouseRightClicked.

- * - * @param panel a {@link arcane.ui.CardPanel} object. - * @param evt a {@link java.awt.event.MouseEvent} object. - */ - public void mouseRightClicked(CardPanel panel, MouseEvent evt) { - for (CardPanelMouseListener listener : listeners) - listener.mouseRightClicked(panel, evt); - } - - /** - *

mouseMiddleClicked.

- * - * @param panel a {@link arcane.ui.CardPanel} object. - * @param evt a {@link java.awt.event.MouseEvent} object. - */ - public void mouseMiddleClicked(CardPanel panel, MouseEvent evt) { - for (CardPanelMouseListener listener : listeners) - listener.mouseMiddleClicked(panel, evt); - } - - /** - *

mouseDragEnd.

- * - * @param dragPanel a {@link arcane.ui.CardPanel} object. - * @param evt a {@link java.awt.event.MouseEvent} object. - */ - public void mouseDragEnd(CardPanel dragPanel, MouseEvent evt) { - for (CardPanelMouseListener listener : listeners) - listener.mouseDragEnd(dragPanel, evt); - } - - /** - *

mouseDragged.

- * - * @param dragPanel a {@link arcane.ui.CardPanel} object. - * @param dragOffsetX a int. - * @param dragOffsetY a int. - * @param evt a {@link java.awt.event.MouseEvent} object. - */ - public void mouseDragged(CardPanel dragPanel, int dragOffsetX, int dragOffsetY, MouseEvent evt) { - for (CardPanelMouseListener listener : listeners) - listener.mouseDragged(mouseDragPanel, mouseDragOffsetX, mouseDragOffsetY, evt); - } - - /** - *

mouseDragStart.

- * - * @param dragPanel a {@link arcane.ui.CardPanel} object. - * @param evt a {@link java.awt.event.MouseEvent} object. - */ - public void mouseDragStart(CardPanel dragPanel, MouseEvent evt) { - for (CardPanelMouseListener listener : listeners) - listener.mouseDragStart(mouseDragPanel, evt); - } - - /** - *

mouseOut.

- * - * @param panel a {@link arcane.ui.CardPanel} object. - * @param evt a {@link java.awt.event.MouseEvent} object. - */ - public void mouseOut(CardPanel panel, MouseEvent evt) { - for (CardPanelMouseListener listener : listeners) - listener.mouseOut(mouseOverPanel, evt); - } - - /** - *

mouseOver.

- * - * @param panel a {@link arcane.ui.CardPanel} object. - * @param evt a {@link java.awt.event.MouseEvent} object. - */ - public void mouseOver(CardPanel panel, MouseEvent evt) { - for (CardPanelMouseListener listener : listeners) - listener.mouseOver(panel, evt); - } - - /** - *

getCardFromMouseOverPanel.

- * - * @return a {@link forge.Card} object. - */ - public Card getCardFromMouseOverPanel() { - if (mouseOverPanel != null) - return mouseOverPanel.gameCard; - else - return null; - } - - /** - *

Getter for the field zoneID.

- * - * @return a int. - */ - public int getZoneID() { - return zoneID; - } - - /** - *

Setter for the field zoneID.

- * - * @param zoneID a int. - */ - public void setZoneID(int zoneID) { - this.zoneID = zoneID; - } -} diff --git a/src/arcane/ui/HandArea.java b/src/arcane/ui/HandArea.java deleted file mode 100644 index 1977031ac83..00000000000 --- a/src/arcane/ui/HandArea.java +++ /dev/null @@ -1,58 +0,0 @@ -package arcane.ui; - -import arcane.ui.util.CardPanelMouseListener; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.MouseEvent; - -/** - *

HandArea class.

- * - * @author Forge - * @version $Id$ - */ -public class HandArea extends CardArea { - /** Constant serialVersionUID=7488132628637407745L */ - private static final long serialVersionUID = 7488132628637407745L; - - /** - *

Constructor for HandArea.

- * - * @param scrollPane a {@link javax.swing.JScrollPane} object. - * @param frame a {@link java.awt.Frame} object. - */ - public HandArea(JScrollPane scrollPane, final Frame frame) { - super(scrollPane); - - setDragEnabled(true); - setVertical(true); - - addCardPanelMouseListener(new CardPanelMouseListener() { - public void mouseRightClicked(CardPanel panel, MouseEvent evt) { - } - - public void mouseOver(CardPanel panel, MouseEvent evt) { - } - - public void mouseOut(CardPanel panel, MouseEvent evt) { - } - - public void mouseMiddleClicked(CardPanel panel, MouseEvent evt) { - } - - public void mouseLeftClicked(CardPanel panel, MouseEvent evt) { - - } - - public void mouseDragged(CardPanel dragPanel, int dragOffsetX, int dragOffsetY, MouseEvent evt) { - } - - public void mouseDragStart(CardPanel dragPanel, MouseEvent evt) { - } - - public void mouseDragEnd(CardPanel dragPanel, MouseEvent evt) { - } - }); - } -} diff --git a/src/arcane/ui/PlayArea.java b/src/arcane/ui/PlayArea.java deleted file mode 100644 index ae7508e1865..00000000000 --- a/src/arcane/ui/PlayArea.java +++ /dev/null @@ -1,469 +0,0 @@ -package arcane.ui; - -import arcane.ui.util.CardPanelMouseListener; -import forge.Card; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.MouseEvent; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -/** - *

PlayArea class.

- * - * @author Forge - * @version $Id$ - */ -public class PlayArea extends CardPanelContainer implements CardPanelMouseListener { - /** Constant serialVersionUID=8333013579724492513L */ - private static final long serialVersionUID = 8333013579724492513L; - /** Constant GUTTER_Y=5 */ - static private final int GUTTER_Y = 5; - /** Constant GUTTER_X=5 */ - static private final int GUTTER_X = 5; - /** Constant EXTRA_CARD_SPACING_X=0.04f */ - static final float EXTRA_CARD_SPACING_X = 0.04f; - /** Constant CARD_SPACING_Y=0.06f */ - static private final float CARD_SPACING_Y = 0.06f; - /** Constant STACK_SPACING_X=0.07f */ - static private final float STACK_SPACING_X = 0.07f; - /** Constant STACK_SPACING_Y=0.07f */ - static private final float STACK_SPACING_Y = 0.07f; - - private int landStackMax = 5; - - private boolean stackVertical; - private boolean mirror; - - // Computed in layout. - private List rows = new ArrayList(); - private int cardWidth, cardHeight; - private int playAreaWidth, playAreaHeight; - private int extraCardSpacingX, cardSpacingX, cardSpacingY; - private int stackSpacingX, stackSpacingY; - - /** - *

Constructor for PlayArea.

- * - * @param scrollPane a {@link javax.swing.JScrollPane} object. - * @param mirror a boolean. - */ - public PlayArea(JScrollPane scrollPane, boolean mirror) { - super(scrollPane); - setBackground(Color.white); - this.mirror = mirror; - } - - /** - *

doLayout.

- * - * @since 1.0.15 - */ - public void doLayout() { - int tokenStackMax = 5; - // Collect lands. - Row allLands = new Row(); - outerLoop: - // - for (CardPanel panel : cardPanels) { - if (!panel.gameCard.isLand()) continue; - - int insertIndex = -1; - - // Find lands with the same name. - for (int i = 0, n = allLands.size(); i < n; i++) { - Stack stack = allLands.get(i); - CardPanel firstPanel = stack.get(0); - if (firstPanel.gameCard.getName().equals(panel.gameCard.getName()) && !panel.gameCard.isCreature()) { - if (!firstPanel.attachedPanels.isEmpty() || firstPanel.gameCard.isEnchanted()) { - // Put this land to the left of lands with the same name and attachments. - insertIndex = i; - break; - } - if (!panel.attachedPanels.isEmpty() || firstPanel.gameCard.isEnchanted() || stack.size() == landStackMax) { - // If this land has attachments or the stack is full, put it to the right. - insertIndex = i + 1; - continue; - } - // Add to stack. - stack.add(0, panel); - continue outerLoop; - } - if (insertIndex != -1) break; - } - - Stack stack = new Stack(); - stack.add(panel); - allLands.add(insertIndex == -1 ? allLands.size() : insertIndex, stack); - } - - // Collect tokens. - Row allTokens = new Row(); - outerLoop: - // - for (CardPanel panel : cardPanels) { - if (!panel.gameCard.isToken()) continue; - - int insertIndex = -1; - - // Find tokens with the same name. - for (int i = 0, n = allTokens.size(); i < n; i++) { - Stack stack = allTokens.get(i); - CardPanel firstPanel = stack.get(0); - if (firstPanel.gameCard.getName().equals(panel.gameCard.getName())) { - if (!firstPanel.attachedPanels.isEmpty()) { - // Put this token to the left of tokens with the same name and attachments. - insertIndex = i; - break; - } - if (!panel.attachedPanels.isEmpty() || stack.size() == tokenStackMax) { - // If this token has attachments or the stack is full, put it to the right. - insertIndex = i + 1; - continue; - } - // Add to stack. - stack.add(0, panel); - continue outerLoop; - } - if (insertIndex != -1) break; - } - - Stack stack = new Stack(); - stack.add(panel); - allTokens.add(insertIndex == -1 ? allTokens.size() : insertIndex, stack); - } - - Row allCreatures = new Row(cardPanels, RowType.creatureNonToken); - Row allOthers = new Row(cardPanels, RowType.other); - - cardWidth = cardWidthMax; - Rectangle rect = scrollPane.getVisibleRect(); - playAreaWidth = rect.width; - playAreaHeight = rect.height; - while (true) { - rows.clear(); - cardHeight = Math.round(cardWidth * CardPanel.ASPECT_RATIO); - extraCardSpacingX = Math.round(cardWidth * EXTRA_CARD_SPACING_X); - cardSpacingX = cardHeight - cardWidth + extraCardSpacingX; - cardSpacingY = Math.round(cardHeight * CARD_SPACING_Y); - stackSpacingX = stackVertical ? 0 : (int) Math.round(cardWidth * STACK_SPACING_X); - stackSpacingY = Math.round(cardHeight * STACK_SPACING_Y); - Row creatures = (Row) allCreatures.clone(); - Row tokens = (Row) allTokens.clone(); - Row lands = (Row) allLands.clone(); - Row others = (Row) allOthers.clone(); - int afterFirstRow; - if (mirror) { - // Wrap all creatures and lands. - wrap(lands, rows, -1); - afterFirstRow = rows.size(); - wrap(tokens, rows, afterFirstRow); - wrap(creatures, rows, rows.size()); - } else { - // Wrap all creatures and lands. - wrap(creatures, rows, -1); - afterFirstRow = rows.size(); - wrap(tokens, rows, afterFirstRow); - wrap(lands, rows, rows.size()); - } - // Store the current rows and others. - List storedRows = new ArrayList(rows.size()); - for (Row row : rows) - storedRows.add((Row) row.clone()); - Row storedOthers = (Row) others.clone(); - // Fill in all rows with others. - for (Row row : rows) - fillRow(others, rows, row); - // Stop if everything fits, otherwise revert back to the stored values. - if (creatures.isEmpty() && tokens.isEmpty() && lands.isEmpty() && others.isEmpty()) break; - rows = storedRows; - others = storedOthers; - // Try to put others on their own row(s) and fill in the rest. - wrap(others, rows, afterFirstRow); - for (Row row : rows) - fillRow(others, rows, row); - // If that still doesn't fit, scale down. - if (creatures.isEmpty() && tokens.isEmpty() && lands.isEmpty() && others.isEmpty()) break; - cardWidth--; - } - - // Get size of all the rows. - int x, y = GUTTER_Y; - int maxRowWidth = 0; - for (Row row : rows) { - int rowBottom = 0; - x = GUTTER_X; - for (int stackIndex = 0, stackCount = row.size(); stackIndex < stackCount; stackIndex++) { - Stack stack = row.get(stackIndex); - rowBottom = Math.max(rowBottom, y + stack.getHeight()); - x += stack.getWidth(); - } - y = rowBottom; - maxRowWidth = Math.max(maxRowWidth, x); - } - setPreferredSize(new Dimension(maxRowWidth - cardSpacingX, y - cardSpacingY)); - revalidate(); - - // Position all card panels. - x = 0; - y = GUTTER_Y; - for (Row row : rows) { - int rowBottom = 0; - x = GUTTER_X; - for (int stackIndex = 0, stackCount = row.size(); stackIndex < stackCount; stackIndex++) { - Stack stack = row.get(stackIndex); - // Align others to the right. - if (RowType.other.isType(stack.get(0).gameCard)) { - x = playAreaWidth - GUTTER_X + extraCardSpacingX; - for (int i = stackIndex, n = row.size(); i < n; i++) - x -= row.get(i).getWidth(); - } - for (int panelIndex = 0, panelCount = stack.size(); panelIndex < panelCount; panelIndex++) { - CardPanel panel = stack.get(panelIndex); - int stackPosition = panelCount - panelIndex - 1; - setComponentZOrder(panel, panelIndex); - int panelX = x + (stackPosition * stackSpacingX); - int panelY = y + (stackPosition * stackSpacingY); - panel.setCardBounds(panelX, panelY, cardWidth, cardHeight); - } - rowBottom = Math.max(rowBottom, y + stack.getHeight()); - x += stack.getWidth(); - } - y = rowBottom; - } - } - - /** - *

wrap.

- * - * @param sourceRow a {@link arcane.ui.PlayArea.Row} object. - * @param rows a {@link java.util.List} object. - * @param insertIndex a int. - * @return a int. - */ - private int wrap(Row sourceRow, List rows, int insertIndex) { - // The cards are sure to fit (with vertical scrolling) at the minimum card width. - boolean allowHeightOverflow = cardWidth == cardWidthMin; - - Row currentRow = new Row(); - for (int i = 0, n = sourceRow.size() - 1; i <= n; i++) { - Stack stack = sourceRow.get(i); - // If the row is not empty and this stack doesn't fit, add the row. - int rowWidth = currentRow.getWidth(); - if (!currentRow.isEmpty() && rowWidth + stack.getWidth() > playAreaWidth) { - // Stop processing if the row is too wide or tall. - if (!allowHeightOverflow && rowWidth > playAreaWidth) break; - if (!allowHeightOverflow && getRowsHeight(rows) + sourceRow.getHeight() > playAreaHeight) break; - rows.add(insertIndex == -1 ? rows.size() : insertIndex, currentRow); - currentRow = new Row(); - } - currentRow.add(stack); - } - // Add the last row if it is not empty and it fits. - if (!currentRow.isEmpty()) { - int rowWidth = currentRow.getWidth(); - if (allowHeightOverflow || rowWidth <= playAreaWidth) { - if (allowHeightOverflow || getRowsHeight(rows) + sourceRow.getHeight() <= playAreaHeight) { - rows.add(insertIndex == -1 ? rows.size() : insertIndex, currentRow); - } - } - } - // Remove the wrapped stacks from the source row. - for (Row row : rows) - for (Stack stack : row) - sourceRow.remove(stack); - return insertIndex; - } - - /** - *

fillRow.

- * - * @param sourceRow a {@link arcane.ui.PlayArea.Row} object. - * @param rows a {@link java.util.List} object. - * @param rows a {@link java.util.List} object. - * @param row a {@link arcane.ui.PlayArea.Row} object. - */ - private void fillRow(Row sourceRow, List rows, Row row) { - int rowWidth = row.getWidth(); - while (!sourceRow.isEmpty()) { - Stack stack = sourceRow.get(0); - rowWidth += stack.getWidth(); - if (rowWidth > playAreaWidth) break; - if (stack.getHeight() > row.getHeight()) { - if (getRowsHeight(rows) - row.getHeight() + stack.getHeight() > playAreaHeight) break; - } - row.add(sourceRow.remove(0)); - } - } - - /** - *

getRowsHeight.

- * - * @param rows a {@link java.util.List} object. - * @return a int. - */ - private int getRowsHeight(List rows) { - int height = 0; - for (Row row : rows) - height += row.getHeight(); - return height - cardSpacingY + GUTTER_Y * 2; - } - - /** {@inheritDoc} */ - public CardPanel getCardPanel(int x, int y) { - for (Row row : rows) { - for (Stack stack : row) { - for (CardPanel panel : stack) { - int panelX = panel.getCardX(); - int panelY = panel.getCardY(); - int panelWidth, panelHeight; - if (panel.tapped) { - panelWidth = panel.getCardHeight(); - panelHeight = panel.getCardWidth(); - panelY += panelWidth - panelHeight; - } else { - panelWidth = panel.getCardWidth(); - panelHeight = panel.getCardHeight(); - } - if (x > panelX && x < panelX + panelWidth) { - if (y > panelY && y < panelY + panelHeight) { - if (!panel.isDisplayEnabled()) return null; - return panel; - } - } - } - } - } - return null; - } - - /** {@inheritDoc} */ - public void mouseLeftClicked(CardPanel panel, MouseEvent evt) { - if (panel.tappedAngle != 0 && panel.tappedAngle != CardPanel.TAPPED_ANGLE) return; - super.mouseLeftClicked(panel, evt); - } - - /** - *

Getter for the field landStackMax.

- * - * @return a int. - */ - public int getLandStackMax() { - return landStackMax; - } - - /** - *

Setter for the field landStackMax.

- * - * @param landStackMax a int. - */ - public void setLandStackMax(int landStackMax) { - this.landStackMax = landStackMax; - } - - /** - *

Getter for the field stackVertical.

- * - * @return a boolean. - */ - public boolean getStackVertical() { - return stackVertical; - } - - /** - *

Setter for the field stackVertical.

- * - * @param stackVertical a boolean. - */ - public void setStackVertical(boolean stackVertical) { - this.stackVertical = stackVertical; - } - - static private enum RowType { - land, creature, creatureNonToken, other; - - public boolean isType(Card card) { - switch (this) { - case land: - return card.isLand(); - case creature: - return card.isCreature(); - case creatureNonToken: - return card.isCreature() && !card.isToken(); - case other: - return !card.isLand() && !card.isCreature(); - default: - throw new RuntimeException("Unhandled type: " + this); - } - } - } - - private class Row extends ArrayList { - private static final long serialVersionUID = 716489891951011846L; - - public Row() { - super(16); - } - - public Row(List cardPanels, RowType type) { - this(); - addAll(cardPanels, type); - } - - private void addAll(List cardPanels, RowType type) { - for (CardPanel panel : cardPanels) { - if (!type.isType(panel.gameCard) || panel.attachedToPanel != null) continue; - Stack stack = new Stack(); - stack.add(panel); - add(stack); - } - } - - public boolean addAll(Collection c) { - boolean changed = super.addAll(c); - c.clear(); - return changed; - } - - private int getWidth() { - if (isEmpty()) return 0; - int width = 0; - for (Stack stack : this) - width += stack.getWidth(); - return width + GUTTER_X * 2 - extraCardSpacingX; - } - - private int getHeight() { - if (isEmpty()) return 0; - int height = 0; - for (Stack stack : this) - height = Math.max(height, stack.getHeight()); - return height; - } - } - - private class Stack extends ArrayList { - private static final long serialVersionUID = 3863135156832080368L; - - public Stack() { - super(8); - } - - public boolean add(CardPanel panel) { - boolean appended = super.add(panel); - for (CardPanel attachedPanel : panel.attachedPanels) - add(attachedPanel); - return appended; - } - - private int getWidth() { - return cardWidth + (size() - 1) * stackSpacingX + cardSpacingX; - } - - private int getHeight() { - return cardHeight + (size() - 1) * stackSpacingY + cardSpacingY; - } - } -} diff --git a/src/arcane/ui/ScaledImagePanel.java b/src/arcane/ui/ScaledImagePanel.java deleted file mode 100644 index e1dddf7fdba..00000000000 --- a/src/arcane/ui/ScaledImagePanel.java +++ /dev/null @@ -1,261 +0,0 @@ -package arcane.ui; - -import javax.swing.*; -import java.awt.*; -import java.awt.image.BufferedImage; - -/** - *

ScaledImagePanel class.

- * - * @author Forge - * @version $Id: $ - */ -public class ScaledImagePanel extends JPanel { - - /** Constant serialVersionUID=-5691107238620895385L */ - private static final long serialVersionUID = -5691107238620895385L; - public volatile Image srcImage; - public volatile Image srcImageBlurred; - - private ScalingType scalingType = ScalingType.bilinear; - private boolean scaleLarger; - private MultipassType multiPassType = MultipassType.bilinear; - private boolean blur; - - /** - *

Constructor for ScaledImagePanel.

- */ - public ScaledImagePanel() { - super(false); - setOpaque(false); - } - - /** - *

setImage.

- * - * @param srcImage a {@link java.awt.Image} object. - * @param srcImageBlurred a {@link java.awt.Image} object. - * - */ - public void setImage(Image srcImage, Image srcImageBlurred) { - this.srcImage = srcImage; - this.srcImageBlurred = srcImageBlurred; - } - - /** - *

clearImage.

- */ - public void clearImage() { - srcImage = null; - srcImageBlurred = null; - repaint(); - } - - /** - *

setScalingMultiPassType.

- * - * @param multiPassType a {@link arcane.ui.ScaledImagePanel.MultipassType} object. - */ - public void setScalingMultiPassType(MultipassType multiPassType) { - this.multiPassType = multiPassType; - } - - /** - *

Setter for the field scalingType.

- * - * @param scalingType a {@link arcane.ui.ScaledImagePanel.ScalingType} object. - */ - public void setScalingType(ScalingType scalingType) { - this.scalingType = scalingType; - } - - /** - *

setScalingBlur.

- * - * @param blur a boolean. - */ - public void setScalingBlur(boolean blur) { - this.blur = blur; - } - - /** - *

Setter for the field scaleLarger.

- * - * @param scaleLarger a boolean. - */ - public void setScaleLarger(boolean scaleLarger) { - this.scaleLarger = scaleLarger; - } - - /** - *

hasImage.

- * - * @return a boolean. - */ - public boolean hasImage() { - return srcImage != null; - } - - /** - *

getScalingInfo.

- * - * @return a {@link arcane.ui.ScaledImagePanel.ScalingInfo} object. - */ - private ScalingInfo getScalingInfo() { - int panelWidth = getWidth(); - int panelHeight = getHeight(); - int srcWidth = srcImage.getWidth(null); - int srcHeight = srcImage.getHeight(null); - int targetWidth = srcWidth; - int targetHeight = srcHeight; - if (scaleLarger || srcWidth > panelWidth || srcHeight > panelHeight) { - targetWidth = Math.round(panelHeight * (srcWidth / (float) srcHeight)); - if (targetWidth > panelWidth) { - targetHeight = Math.round(panelWidth * (srcHeight / (float) srcWidth)); - targetWidth = panelWidth; - } else - targetHeight = panelHeight; - } - ScalingInfo info = new ScalingInfo(); - info.targetWidth = targetWidth; - info.targetHeight = targetHeight; - info.srcWidth = srcWidth; - info.srcHeight = srcHeight; - info.x = panelWidth / 2 - targetWidth / 2; - info.y = panelHeight / 2 - targetHeight / 2; - return info; - } - - /** {@inheritDoc} */ - public void paint(Graphics g) { - if (srcImage == null) return; - - Graphics2D g2 = (Graphics2D) g.create(); - ScalingInfo info = getScalingInfo(); - - switch (scalingType) { - case nearestNeighbor: - scaleWithDrawImage(g2, info, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR); - break; - case bilinear: - scaleWithDrawImage(g2, info, RenderingHints.VALUE_INTERPOLATION_BILINEAR); - break; - case bicubic: - scaleWithDrawImage(g2, info, RenderingHints.VALUE_INTERPOLATION_BICUBIC); - break; - case areaAveraging: - scaleWithGetScaledInstance(g2, info, Image.SCALE_AREA_AVERAGING); - break; - case replicate: - scaleWithGetScaledInstance(g2, info, Image.SCALE_REPLICATE); - break; - } - } - - /** - *

scaleWithGetScaledInstance.

- * - * @param g2 a {@link java.awt.Graphics2D} object. - * @param info a {@link arcane.ui.ScaledImagePanel.ScalingInfo} object. - * @param hints a int. - */ - private void scaleWithGetScaledInstance(Graphics2D g2, ScalingInfo info, int hints) { - Image srcImage = getSourceImage(info); - Image scaledImage = srcImage.getScaledInstance(info.targetWidth, info.targetHeight, hints); - g2.drawImage(scaledImage, info.x, info.y, null); - } - - /** - *

scaleWithDrawImage.

- * - * @param g2 a {@link java.awt.Graphics2D} object. - * @param info a {@link arcane.ui.ScaledImagePanel.ScalingInfo} object. - * @param hint a {@link java.lang.Object} object. - */ - private void scaleWithDrawImage(Graphics2D g2, ScalingInfo info, Object hint) { - g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint); - - int tempDestWidth = info.srcWidth / 2, tempDestHeight = info.srcHeight / 2; - if (tempDestWidth < info.targetWidth) tempDestWidth = info.targetWidth; - if (tempDestHeight < info.targetHeight) tempDestHeight = info.targetHeight; - - Image srcImage = getSourceImage(info); - - // If not doing multipass or multipass only needs a single pass, just scale it once directly to the panel surface. - if (multiPassType == MultipassType.none || (tempDestWidth == info.targetWidth && tempDestHeight == info.targetHeight)) { - g2.drawImage(srcImage, info.x, info.y, info.targetWidth, info.targetHeight, null); - return; - } - - BufferedImage tempImage = new BufferedImage(tempDestWidth, tempDestHeight, BufferedImage.TYPE_INT_RGB); - Graphics2D g2temp = tempImage.createGraphics(); - switch (multiPassType) { - case nearestNeighbor: - g2temp.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR); - break; - case bilinear: - g2temp.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); - break; - case bicubic: - g2temp.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); - break; - } - // Render first pass from image to temp. - g2temp.drawImage(srcImage, 0, 0, tempDestWidth, tempDestHeight, null); - // Render passes between the first and last pass. - int tempSrcWidth = tempDestWidth; - int tempSrcHeight = tempDestHeight; - while (true) { - if (tempDestWidth > info.targetWidth) { - tempDestWidth = tempDestWidth / 2; - if (tempDestWidth < info.targetWidth) tempDestWidth = info.targetWidth; - } - - if (tempDestHeight > info.targetHeight) { - tempDestHeight = tempDestHeight / 2; - if (tempDestHeight < info.targetHeight) tempDestHeight = info.targetHeight; - } - - if (tempDestWidth == info.targetWidth && tempDestHeight == info.targetHeight) break; - - g2temp.drawImage(tempImage, 0, 0, tempDestWidth, tempDestHeight, 0, 0, tempSrcWidth, tempSrcHeight, null); - - tempSrcWidth = tempDestWidth; - tempSrcHeight = tempDestHeight; - } - g2temp.dispose(); - // Render last pass from temp to panel surface. - g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint); - g2.drawImage(tempImage, info.x, info.y, info.x + info.targetWidth, info.y + info.targetHeight, 0, 0, tempSrcWidth, - tempSrcHeight, null); - } - - /** - *

getSourceImage.

- * - * @param info a {@link arcane.ui.ScaledImagePanel.ScalingInfo} object. - * @return a {@link java.awt.Image} object. - */ - private Image getSourceImage(ScalingInfo info) { - if (!blur || srcImageBlurred == null) return srcImage; - if (info.srcWidth / 2 < info.targetWidth || info.srcHeight / 2 < info.targetHeight) return srcImage; - return srcImageBlurred; - } - - static private class ScalingInfo { - public int targetWidth; - public int targetHeight; - public int srcWidth; - public int srcHeight; - public int x; - public int y; - } - - static public enum MultipassType { - none, nearestNeighbor, bilinear, bicubic - } - - static public enum ScalingType { - nearestNeighbor, replicate, bilinear, bicubic, areaAveraging - } -} diff --git a/src/arcane/ui/ViewPanel.java b/src/arcane/ui/ViewPanel.java deleted file mode 100644 index d9b032bde90..00000000000 --- a/src/arcane/ui/ViewPanel.java +++ /dev/null @@ -1,53 +0,0 @@ -package arcane.ui; - -import javax.swing.*; -import java.awt.*; - -/** - *

ViewPanel class.

- * - * @author Forge - * @version $Id$ - */ -public class ViewPanel extends JPanel { - /** Constant serialVersionUID=7016597023142963068L */ - private static final long serialVersionUID = 7016597023142963068L; - - /** - *

doLayout.

- * - * @since 1.0.15 - */ - public void doLayout() { - if (getComponentCount() == 0) return; - CardPanel panel = (CardPanel) getComponent(0); - int viewWidth = getWidth(); - int viewHeight = getHeight(); - int srcWidth = viewWidth; - int srcHeight = Math.round(viewWidth * CardPanel.ASPECT_RATIO); - int targetWidth = Math.round(viewHeight * (srcWidth / (float) srcHeight)); - int targetHeight; - if (targetWidth > viewWidth) { - targetHeight = Math.round(viewWidth * (srcHeight / (float) srcWidth)); - targetWidth = viewWidth; - } else - targetHeight = viewHeight; - int x = viewWidth / 2 - targetWidth / 2; - int y = viewHeight / 2 - targetHeight / 2; - panel.setCardBounds(x, y, targetWidth, targetHeight); - } - - /** - *

setCardPanel.

- * - * @param panel a {@link arcane.ui.CardPanel} object. - */ - public void setCardPanel(CardPanel panel) { - //CardPanel newPanel = new CardPanel(panel.gameCard); - //newPanel.setImage(panel); - removeAll(); - add(panel, BorderLayout.CENTER); - panel.revalidate(); - panel.repaint(); - } -} diff --git a/src/arcane/ui/util/Animation.java b/src/arcane/ui/util/Animation.java deleted file mode 100644 index caac66316d4..00000000000 --- a/src/arcane/ui/util/Animation.java +++ /dev/null @@ -1,477 +0,0 @@ -package arcane.ui.util; - -import arcane.ui.CardPanel; -import arcane.util.Util; - -import javax.swing.*; -import java.awt.*; -import java.util.Timer; -import java.util.TimerTask; - -/** - *

Abstract Animation class.

- * - * @author Forge - * @version $Id$ - */ -abstract public class Animation { - /** Constant TARGET_MILLIS_PER_FRAME=30 */ - static private final long TARGET_MILLIS_PER_FRAME = 30; - - /** Constant timer */ - static private Timer timer = new Timer("Animation", true); - - /** Constant delayedCardPanel */ - static private CardPanel delayedCardPanel; - /** Constant delayedTime= */ - static private long delayedTime; - /** Constant enlargedCardPanel */ - static private CardPanel enlargedCardPanel; - /** Constant enlargedAnimationPanel */ - static private CardPanel enlargedAnimationPanel; - /** Constant enlargeLock */ - static private Object enlargeLock = new Object(); - - private TimerTask timerTask; - private FrameTimer frameTimer; - private long elapsed; - - /** - *

Constructor for Animation.

- * - * @param duration a long. - */ - public Animation(final long duration) { - this(duration, 0); - } - - /** - *

Constructor for Animation.

- * - * @param duration a long. - * @param delay a long. - */ - public Animation(final long duration, long delay) { - timerTask = new TimerTask() { - public void run() { - if (frameTimer == null) { - start(); - frameTimer = new FrameTimer(); - } - elapsed += frameTimer.getTimeSinceLastFrame(); - if (elapsed >= duration) { - cancel(); - elapsed = duration; - } - update(elapsed / (float) duration); - if (elapsed == duration) end(); - } - }; - timer.scheduleAtFixedRate(timerTask, delay, TARGET_MILLIS_PER_FRAME); - } - - /** - *

update.

- * - * @param percentage a float. - */ - abstract protected void update(float percentage); - - /** - *

cancel.

- */ - protected void cancel() { - timerTask.cancel(); - end(); - } - - /** - *

start.

- */ - protected void start() { - } - - /** - *

end.

- */ - protected void end() { - } - - /** - * Uses averaging of the time between the past few frames to provide smooth animation. - */ - private class FrameTimer { - static private final int SAMPLES = 6; - static private final long MAX_FRAME = 100; // Max time for one frame, to weed out spikes. - - private long samples[] = new long[SAMPLES]; - private int sampleIndex; - - public FrameTimer() { - long currentTime = System.currentTimeMillis(); - for (int i = SAMPLES - 1; i >= 0; i--) - samples[i] = currentTime - (SAMPLES - i) * TARGET_MILLIS_PER_FRAME; - } - - public long getTimeSinceLastFrame() { - long currentTime = System.currentTimeMillis(); - - int id = sampleIndex - 1; - if (id < 0) id += SAMPLES; - - long timeSinceLastSample = currentTime - samples[id]; - - // If the slice was too big, advance all the previous times by the diff. - if (timeSinceLastSample > MAX_FRAME) { - long diff = timeSinceLastSample - MAX_FRAME; - for (int i = 0; i < SAMPLES; i++) - samples[i] += diff; - } - - long timeSinceOldestSample = currentTime - samples[sampleIndex]; - samples[sampleIndex] = currentTime; - sampleIndex = (sampleIndex + 1) % SAMPLES; - - return timeSinceOldestSample / SAMPLES; - } - } - - /** - *

tapCardToggle.

- * - * @param panel a {@link arcane.ui.CardPanel} object. - */ - static public void tapCardToggle(final CardPanel panel) { - new Animation(200) { - protected void start() { - panel.tapped = !panel.tapped; - } - - protected void update(float percentage) { - panel.tappedAngle = CardPanel.TAPPED_ANGLE * percentage; - if (!panel.tapped) panel.tappedAngle = CardPanel.TAPPED_ANGLE - panel.tappedAngle; - panel.repaint(); - } - - protected void end() { - panel.tappedAngle = panel.tapped ? CardPanel.TAPPED_ANGLE : 0; - } - }; - } - - // static public void moveCardToPlay (Component source, final CardPanel dest, final CardPanel animationPanel) { - /** - *

moveCardToPlay.

- * - * @param startX a int. - * @param startY a int. - * @param startWidth a int. - * @param endX a int. - * @param endY a int. - * @param endWidth a int. - * @param animationPanel a {@link arcane.ui.CardPanel} object. - * @param placeholder a {@link arcane.ui.CardPanel} object. - * @param layeredPane a {@link javax.swing.JLayeredPane} object. - * @param speed a int. - */ - static public void moveCardToPlay(final int startX, final int startY, final int startWidth, final int endX, final int endY, - final int endWidth, final CardPanel animationPanel, final CardPanel placeholder, final JLayeredPane layeredPane, - final int speed) { - UI.invokeLater(new Runnable() { - public void run() { - final int startHeight = Math.round(startWidth * CardPanel.ASPECT_RATIO); - final int endHeight = Math.round(endWidth * CardPanel.ASPECT_RATIO); - final float a = 2f; - final float sqrta = (float) Math.sqrt(1 / a); - - animationPanel.setCardBounds(startX, startY, startWidth, startHeight); - animationPanel.setAnimationPanel(true); - Container parent = animationPanel.getParent(); - if (parent != layeredPane) { - layeredPane.add(animationPanel); - layeredPane.setLayer(animationPanel, JLayeredPane.MODAL_LAYER); - } - - new Animation(700) { - protected void update(float percentage) { - if (placeholder != null && !placeholder.isShowing()) { - cancel(); - return; - } - int currentX = startX + Math.round((endX - startX + endWidth / 2f) * percentage); - int currentY = startY + Math.round((endY - startY + endHeight / 2f) * percentage); - int currentWidth, currentHeight; - int midWidth = Math.max(200, endWidth * 2); - int midHeight = Math.round(midWidth * CardPanel.ASPECT_RATIO); - if (percentage <= 0.5f) { - percentage = percentage * 2; - float pp = sqrta * (1 - percentage); - percentage = 1 - a * pp * pp; - currentWidth = startWidth + Math.round((midWidth - startWidth) * percentage); - currentHeight = startHeight + Math.round((midHeight - startHeight) * percentage); - } else { - percentage = (percentage - 0.5f) * 2; - float pp = sqrta * percentage; - percentage = a * pp * pp; - currentWidth = midWidth + Math.round((endWidth - midWidth) * percentage); - currentHeight = midHeight + Math.round((endHeight - midHeight) * percentage); - } - currentX -= Math.round(currentWidth / 2.0); - currentY -= Math.round(currentHeight / 2.0); - animationPanel.setCardBounds(currentX, currentY, currentWidth, currentHeight); - } - - protected void end() { - EventQueue.invokeLater(new Runnable() { - public void run() { - if (placeholder != null) { - placeholder.setDisplayEnabled(true); - placeholder.setImage(animationPanel); - } - animationPanel.setVisible(false); - animationPanel.repaint(); - layeredPane.remove(animationPanel); - } - }); - } - }; - } - }); - } - - /** - *

moveCard.

- * - * @param startX a int. - * @param startY a int. - * @param startWidth a int. - * @param endX a int. - * @param endY a int. - * @param endWidth a int. - * @param animationPanel a {@link arcane.ui.CardPanel} object. - * @param placeholder a {@link arcane.ui.CardPanel} object. - * @param layeredPane a {@link javax.swing.JLayeredPane} object. - * @param speed a int. - */ - static public void moveCard(final int startX, final int startY, final int startWidth, final int endX, final int endY, - final int endWidth, final CardPanel animationPanel, final CardPanel placeholder, final JLayeredPane layeredPane, - final int speed) { - UI.invokeLater(new Runnable() { - public void run() { - final int startHeight = Math.round(startWidth * CardPanel.ASPECT_RATIO); - final int endHeight = Math.round(endWidth * CardPanel.ASPECT_RATIO); - - animationPanel.setCardBounds(startX, startY, startWidth, startHeight); - animationPanel.setAnimationPanel(true); - Container parent = animationPanel.getParent(); - if (parent != layeredPane) { - layeredPane.add(animationPanel); - layeredPane.setLayer(animationPanel, JLayeredPane.MODAL_LAYER); - } - - new Animation(speed) { - protected void update(float percentage) { - int currentX = startX + Math.round((endX - startX) * percentage); - int currentY = startY + Math.round((endY - startY) * percentage); - int currentWidth = startWidth + Math.round((endWidth - startWidth) * percentage); - int currentHeight = startHeight + Math.round((endHeight - startHeight) * percentage); - animationPanel.setCardBounds(currentX, currentY, currentWidth, currentHeight); - } - - protected void end() { - EventQueue.invokeLater(new Runnable() { - public void run() { - if (placeholder != null) { - placeholder.setDisplayEnabled(true); - //placeholder.setImage(animationPanel); - placeholder.setCard(placeholder.gameCard); - } - animationPanel.setVisible(false); - animationPanel.repaint(); - layeredPane.remove(animationPanel); - } - }); - } - }; - } - }); - } - - /** - *

moveCard.

- * - * @param placeholder a {@link arcane.ui.CardPanel} object. - */ - static public void moveCard(final CardPanel placeholder) { - UI.invokeLater(new Runnable() { - public void run() { - EventQueue.invokeLater(new Runnable() { - public void run() { - if (placeholder != null) { - placeholder.setDisplayEnabled(true); - //placeholder.setImage(imagePanel); - placeholder.setCard(placeholder.gameCard); - } - } - }); - } - }); - } - - /** - *

shrinkCard.

- */ - static public void shrinkCard() { - CardPanel enlargedCardPanel, enlargedAnimationPanel; - synchronized (enlargeLock) { - delayedCardPanel = null; - delayedTime = 0; - enlargedCardPanel = Animation.enlargedCardPanel; - enlargedAnimationPanel = Animation.enlargedAnimationPanel; - if (enlargedAnimationPanel == null) return; - Animation.enlargedCardPanel = null; - Animation.enlargedAnimationPanel = null; - } - - final CardPanel overPanel = enlargedCardPanel, animationPanel = enlargedAnimationPanel; - - animationPanel.setAnimationPanel(true); - final JLayeredPane layeredPane = SwingUtilities.getRootPane(overPanel).getLayeredPane(); - layeredPane.setLayer(animationPanel, JLayeredPane.MODAL_LAYER); - - final int startWidth = animationPanel.getCardWidth(); - final int startHeight = Math.round(startWidth * CardPanel.ASPECT_RATIO); - final int endWidth = overPanel.getCardWidth(); - final int endHeight = Math.round(endWidth * CardPanel.ASPECT_RATIO); - - new Animation(200) { - protected void update(float percentage) { - int currentWidth = startWidth + Math.round((endWidth - startWidth) * percentage); - int currentHeight = startHeight + Math.round((endHeight - startHeight) * percentage); - Point startPos = SwingUtilities.convertPoint(overPanel.getParent(), overPanel.getCardLocation(), layeredPane); - int centerX = startPos.x + Math.round(endWidth / 2f); - int centerY = startPos.y + Math.round(endHeight / 2f); - int currentX = Math.max(0, centerX - Math.round(currentWidth / 2f)); - currentX = Math.min(currentX, layeredPane.getWidth() - currentWidth); - int currentY = Math.max(0, centerY - Math.round(currentHeight / 2f)); - currentY = Math.min(currentY, layeredPane.getHeight() - currentHeight); - animationPanel.tappedAngle = overPanel.tappedAngle * percentage; - animationPanel.setCardBounds(currentX, currentY, currentWidth, currentHeight); - } - - protected void end() { - animationPanel.setVisible(false); - animationPanel.repaint(); - EventQueue.invokeLater(new Runnable() { - public void run() { - layeredPane.remove(animationPanel); - } - }); - } - }; - } - - /** - *

enlargeCard.

- * - * @param overPanel a {@link arcane.ui.CardPanel} object. - * @param clientFrame a {@link java.awt.Frame} object. - * @param delay a long. - */ - static public void enlargeCard(final CardPanel overPanel, final Frame clientFrame, long delay) { - if (SwingUtilities.getRootPane(overPanel) == null) { - synchronized (enlargeLock) { - delayedCardPanel = null; - delayedTime = 0; - if (Animation.enlargedCardPanel != null) { - Animation.enlargedCardPanel = null; - } - if (enlargedAnimationPanel == null) return; - - Animation.enlargedAnimationPanel.setVisible(false); - Animation.enlargedAnimationPanel.repaint(); - Animation.enlargedAnimationPanel = null; - return; - } - } - final JLayeredPane layeredPane = SwingUtilities.getRootPane(overPanel).getLayeredPane(); - - final int startWidth = overPanel.getCardWidth(); - final int startHeight = Math.round(startWidth * CardPanel.ASPECT_RATIO); - final int endWidth = 300; - final int endHeight = Math.round(endWidth * CardPanel.ASPECT_RATIO); - if (startWidth >= endWidth) return; - - long delayedTime; - synchronized (enlargeLock) { - if (enlargedCardPanel == overPanel) return; // Already showing this card enlarged. - if (delay > 0 && delayedCardPanel == overPanel) return; // Already delayed this card. - delayedCardPanel = overPanel; - Animation.delayedTime = System.currentTimeMillis(); - delayedTime = Animation.delayedTime; - } - final long thisDelayedTime = delayedTime; - - final CardPanel animationPanel = new CardPanel(overPanel.gameCard); - animationPanel.setImage(overPanel); - - new Animation(200, delay) { - protected void start() { - synchronized (enlargeLock) { - // Cancel if the panel is no longer delayed or already shown. - if (delayedCardPanel != overPanel || thisDelayedTime != Animation.delayedTime || enlargedCardPanel == overPanel) { - cancel(); - return; - } - shrinkCard(); - enlargedAnimationPanel = animationPanel; - enlargedCardPanel = overPanel; - Point startPos = overPanel.getCardLocation(); - animationPanel.setCardBounds(startPos.x, startPos.y, startWidth, startHeight); - } - //clientFrame.clearArrows(); - animationPanel.tappedAngle = overPanel.tappedAngle; - try { - Util.invokeAndWait(new Runnable() { - public void run() { - layeredPane.add(animationPanel); - layeredPane.setLayer(animationPanel, JLayeredPane.DRAG_LAYER); - } - }); - } catch (Exception e) { - } - } - - protected void update(float percentage) { - synchronized (enlargeLock) { - if (enlargedAnimationPanel != animationPanel) { - cancel(); - return; - } - } - int currentWidth = startWidth + Math.round((endWidth - startWidth) * percentage); - int currentHeight = startHeight + Math.round((endHeight - startHeight) * percentage); - Point startPos = SwingUtilities.convertPoint(overPanel.getParent(), overPanel.getCardLocation(), layeredPane); - int centerX = startPos.x + Math.round(startWidth / 2f); - int centerY = startPos.y + Math.round(startHeight / 2f); - int currentX = Math.max(0, centerX - Math.round(currentWidth / 2f)); - currentX = Math.min(currentX, layeredPane.getWidth() - currentWidth); - int currentY = Math.max(0, centerY - Math.round(currentHeight / 2f)); - currentY = Math.min(currentY, layeredPane.getHeight() - currentHeight); - animationPanel.tappedAngle = overPanel.tappedAngle * (1 - percentage); - animationPanel.setCardBounds(currentX, currentY, currentWidth, currentHeight); - } - }; - } - - /** - *

isShowingEnlargedCard.

- * - * @return a boolean. - */ - static public boolean isShowingEnlargedCard() { - synchronized (enlargeLock) { - return enlargedAnimationPanel != null; - } - } -} diff --git a/src/arcane/ui/util/CardPanelMouseListener.java b/src/arcane/ui/util/CardPanelMouseListener.java deleted file mode 100644 index eba7364dff3..00000000000 --- a/src/arcane/ui/util/CardPanelMouseListener.java +++ /dev/null @@ -1,79 +0,0 @@ -package arcane.ui.util; - -import arcane.ui.CardPanel; - -import java.awt.event.MouseEvent; - -/** - *

CardPanelMouseListener interface.

- * - * @author Forge - * @version $Id$ - */ -public interface CardPanelMouseListener { - /** - *

mouseOver.

- * - * @param panel a {@link arcane.ui.CardPanel} object. - * @param evt a {@link java.awt.event.MouseEvent} object. - */ - public void mouseOver(CardPanel panel, MouseEvent evt); - - /** - *

mouseOut.

- * - * @param panel a {@link arcane.ui.CardPanel} object. - * @param evt a {@link java.awt.event.MouseEvent} object. - */ - public void mouseOut(CardPanel panel, MouseEvent evt); - - /** - *

mouseLeftClicked.

- * - * @param panel a {@link arcane.ui.CardPanel} object. - * @param evt a {@link java.awt.event.MouseEvent} object. - */ - public void mouseLeftClicked(CardPanel panel, MouseEvent evt); - - /** - *

mouseMiddleClicked.

- * - * @param panel a {@link arcane.ui.CardPanel} object. - * @param evt a {@link java.awt.event.MouseEvent} object. - */ - public void mouseMiddleClicked(CardPanel panel, MouseEvent evt); - - /** - *

mouseRightClicked.

- * - * @param panel a {@link arcane.ui.CardPanel} object. - * @param evt a {@link java.awt.event.MouseEvent} object. - */ - public void mouseRightClicked(CardPanel panel, MouseEvent evt); - - /** - *

mouseDragStart.

- * - * @param dragPanel a {@link arcane.ui.CardPanel} object. - * @param evt a {@link java.awt.event.MouseEvent} object. - */ - public void mouseDragStart(CardPanel dragPanel, MouseEvent evt); - - /** - *

mouseDragged.

- * - * @param dragPanel a {@link arcane.ui.CardPanel} object. - * @param dragOffsetX a int. - * @param dragOffsetY a int. - * @param evt a {@link java.awt.event.MouseEvent} object. - */ - public void mouseDragged(CardPanel dragPanel, int dragOffsetX, int dragOffsetY, MouseEvent evt); - - /** - *

mouseDragEnd.

- * - * @param dragPanel a {@link arcane.ui.CardPanel} object. - * @param evt a {@link java.awt.event.MouseEvent} object. - */ - public void mouseDragEnd(CardPanel dragPanel, MouseEvent evt); -} diff --git a/src/arcane/ui/util/GlowText.java b/src/arcane/ui/util/GlowText.java deleted file mode 100644 index c1ab86876a9..00000000000 --- a/src/arcane/ui/util/GlowText.java +++ /dev/null @@ -1,114 +0,0 @@ -package arcane.ui.util; - -import javax.swing.*; -import java.awt.*; -import java.awt.font.FontRenderContext; -import java.awt.font.LineBreakMeasurer; -import java.awt.font.TextAttribute; -import java.awt.font.TextLayout; -import java.text.AttributedCharacterIterator; -import java.text.AttributedString; -import java.text.BreakIterator; -import java.util.Locale; - -/** - *

GlowText class.

- * - * @author Forge - * @version $Id$ - */ -public class GlowText extends JLabel { - /** Constant serialVersionUID=-2868833097364223352L */ - private static final long serialVersionUID = -2868833097364223352L; - private int glowSize; - private Color glowColor; - private boolean wrap; - - /** - *

setGlow.

- * - * @param glowColor a {@link java.awt.Color} object. - * @param size a int. - * @param intensity a float. - */ - public void setGlow(Color glowColor, int size, float intensity) { - this.glowColor = glowColor; - this.glowSize = size; - } - - /** - *

Setter for the field wrap.

- * - * @param wrap a boolean. - */ - public void setWrap(boolean wrap) { - this.wrap = wrap; - } - - /** - *

getPreferredSize.

- * - * @return a {@link java.awt.Dimension} object. - */ - public Dimension getPreferredSize() { - Dimension size = super.getPreferredSize(); - size.width += glowSize; - size.height += glowSize / 2; - return size; - } - - /** {@inheritDoc} */ - public void setText(String text) { - super.setText(text); - } - - /** {@inheritDoc} */ - public void paint(Graphics g) { - if (getText().length() == 0) return; - - Graphics2D g2d = (Graphics2D) g; - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); - - Dimension size = getSize(); - int textX = 0, textY = 0; - int wrapWidth = Math.max(0, wrap ? size.width - glowSize : Integer.MAX_VALUE); - - AttributedString attributedString = new AttributedString(getText()); - attributedString.addAttribute(TextAttribute.FONT, getFont()); - AttributedCharacterIterator charIterator = attributedString.getIterator(); - FontRenderContext fontContext = g2d.getFontRenderContext(); - - LineBreakMeasurer measurer = new LineBreakMeasurer(charIterator, BreakIterator.getWordInstance(Locale.ENGLISH), fontContext); - int lineCount = 0; - while (measurer.getPosition() < charIterator.getEndIndex()) { - measurer.nextLayout(wrapWidth); - lineCount++; - if (lineCount > 2) break; - } - charIterator.first(); - // Use char wrap if word wrap would cause more than two lines of text. - if (lineCount > 2) - measurer = new LineBreakMeasurer(charIterator, BreakIterator.getCharacterInstance(Locale.ENGLISH), fontContext); - else - measurer.setPosition(0); - while (measurer.getPosition() < charIterator.getEndIndex()) { - TextLayout textLayout = measurer.nextLayout(wrapWidth); - float ascent = textLayout.getAscent(); - textY += ascent; // Move down to baseline. - - g2d.setColor(glowColor); - g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8f)); - textLayout.draw(g2d, textX + glowSize / 2 + 1, textY + glowSize / 2 - 1); - textLayout.draw(g2d, textX + glowSize / 2 + 1, textY + glowSize / 2 + 1); - textLayout.draw(g2d, textX + glowSize / 2 - 1, textY + glowSize / 2 - 1); - textLayout.draw(g2d, textX + glowSize / 2 - 1, textY + glowSize / 2 + 1); - - g2d.setColor(getForeground()); - g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f)); - textLayout.draw(g2d, textX + glowSize / 2, textY + glowSize / 2); - - textY += textLayout.getDescent() + textLayout.getLeading(); // Move down to top of next line. - } - } -} diff --git a/src/arcane/ui/util/ImageUtil.java b/src/arcane/ui/util/ImageUtil.java deleted file mode 100644 index 4c11d8aa164..00000000000 --- a/src/arcane/ui/util/ImageUtil.java +++ /dev/null @@ -1,67 +0,0 @@ -package arcane.ui.util; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.awt.image.ConvolveOp; -import java.awt.image.Kernel; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; - -/** - *

ImageUtil class.

- * - * @author Forge - * @version $Id: $ - */ -public class ImageUtil { - /** - *

getImage.

- * - * @param stream a {@link java.io.InputStream} object. - * @return a {@link java.awt.image.BufferedImage} object. - * @throws java.io.IOException if any. - */ - static public BufferedImage getImage(InputStream stream) throws IOException { - Image tempImage = ImageIO.read(stream); - BufferedImage image = new BufferedImage(tempImage.getWidth(null), tempImage.getHeight(null), BufferedImage.TYPE_INT_ARGB); - Graphics2D g2 = image.createGraphics(); - g2.drawImage(tempImage, 0, 0, null); - g2.dispose(); - return image; - } - - /** - *

getImage.

- * - * @param file a {@link java.io.File} object. - * @return a {@link java.awt.image.BufferedImage} object. - * @throws java.io.IOException if any. - */ - static public BufferedImage getImage(File file) throws IOException { - Image tempImage = ImageIO.read(file); - BufferedImage image = new BufferedImage(tempImage.getWidth(null), tempImage.getHeight(null), BufferedImage.TYPE_INT_ARGB); - Graphics2D g2 = image.createGraphics(); - g2.drawImage(tempImage, 0, 0, null); - g2.dispose(); - return image; - } - - /** - *

getBlurredImage.

- * - * @param image a {@link java.awt.image.BufferedImage} object. - * @param radius a int. - * @param intensity a float. - * @return a {@link java.awt.image.BufferedImage} object. - */ - static public BufferedImage getBlurredImage(BufferedImage image, int radius, float intensity) { - float weight = intensity / (radius * radius); - float[] elements = new float[radius * radius]; - for (int i = 0, n = radius * radius; i < n; i++) - elements[i] = weight; - ConvolveOp blurOp = new ConvolveOp(new Kernel(radius, radius, elements)); - return blurOp.filter(image, null); - } -} diff --git a/src/arcane/ui/util/ManaSymbols.java b/src/arcane/ui/util/ManaSymbols.java deleted file mode 100644 index 53b97e98d7f..00000000000 --- a/src/arcane/ui/util/ManaSymbols.java +++ /dev/null @@ -1,136 +0,0 @@ -package arcane.ui.util; - -import com.esotericsoftware.minlog.Log; - -import java.awt.*; -import java.util.HashMap; -import java.util.Map; -import java.util.StringTokenizer; -import java.util.regex.Pattern; - - -/** - *

ManaSymbols class.

- * - * @author Forge - * @version $Id$ - */ -public class ManaSymbols { - /** Constant manaImages */ - static private final Map manaImages = new HashMap(); - /** Constant replaceSymbolsPattern */ - static private Pattern replaceSymbolsPattern = Pattern.compile("\\{([^}/]*)/?([^}]*)\\}"); - - /** - *

loadImages.

- */ - static public void loadImages() { - String[] symbols = new String[]{"0", "1", "10", "11", "12", "15", "16", "2", "20", "2W", "2U", "2R", "2G", "2B", "3", - "4", "5", "6", "7", "8", "9", "B", "BG", "BR", "G", "GU", "GW", "R", "RG", "RW", "S", "T", "U", "UB", - "UR", "W", "WB", "WU", "PW", "PU", "PB", "PR", "PG", "X", "Y", "Z", "slash", "attack", "defend", "summonsick", - "foil01","foil02","foil03","foil04","foil05","foil06","foil07","foil08","foil09","foil10"}; - for (String symbol : symbols) - manaImages.put(symbol, UI.getImageIcon("res/images/symbols-13/" + symbol + ".png").getImage()); - } - - /** - *

draw.

- * - * @param g a {@link java.awt.Graphics} object. - * @param manaCost a {@link java.lang.String} object. - * @param x a int. - * @param y a int. - */ - static public void draw(Graphics g, String manaCost, int x, int y) { - if (manaCost.length() == 0) return; - manaCost = UI.getDisplayManaCost(manaCost); - StringTokenizer tok = new StringTokenizer(manaCost, " "); - while (tok.hasMoreTokens()) { - String symbol = tok.nextToken(); - Image image = manaImages.get(symbol); - if (image == null) { - Log.info("Symbol not recognized \"" + symbol + "\" in mana cost: " + manaCost); - continue; - } - g.drawImage(image, x, y, null); - x += symbol.length() > 2 ? 10 : 14; // slash.png is only 10 pixels wide. - } - } - - static public void draw(Graphics g, String s, int x, int y, int w, int h) { - if (s.length() == 0) return; - s = UI.getDisplayManaCost(s); - StringTokenizer tok = new StringTokenizer(s, " "); - while (tok.hasMoreTokens()) { - String symbol = tok.nextToken(); - Image image = manaImages.get(symbol); - if (image == null) { - Log.info("Symbol not recognized \"" + symbol + "\" in string: " + s); - continue; - } - //g.drawImage(image, x, y, null); - g.drawImage(image, x, y, w, h, null); - x += symbol.length() > 2 ? 10 : 14; // slash.png is only 10 pixels wide. - } - } - - /** - *

drawAttack.

- * - * @param g a {@link java.awt.Graphics} object. - * @param x a int. - * @param y a int. - */ - static public void drawAttack(Graphics g, int x, int y) { - Image image = manaImages.get("attack"); - g.drawImage(image, x, y, null); - } - - - /** - *

drawSymbol.

- * - * @param imageName a {@link java.lang.String} object. - * @param g a {@link java.awt.Graphics} object. - * @param x a int. - * @param y a int. - */ - static public void drawSymbol(String imageName, Graphics g, int x, int y) { - Image image = manaImages.get(imageName); - g.drawImage(image, x, y, null); - } - - /** - *

getWidth.

- * - * @param manaCost a {@link java.lang.String} object. - * @return a int. - */ - static public int getWidth(String manaCost) { - int width = 0; - StringTokenizer tok = new StringTokenizer(manaCost, " "); - while (tok.hasMoreTokens()) { - String symbol = tok.nextToken(); - width += symbol.length() > 2 ? 10 : 14; // slash.png is only 10 pixels wide. - } - return width; - } - - /** - *

replaceSymbolsWithHTML.

- * - * @param value a {@link java.lang.String} object. - * @param small a boolean. - * @return a {@link java.lang.String} object. - */ - static public synchronized String replaceSymbolsWithHTML(String value, boolean small) { - if (small) { - value = value.replace("{C}", ""); - return replaceSymbolsPattern.matcher(value).replaceAll(""); - } else { - value = value.replace("{slash}", ""); - value = value.replace("{C}", ""); - return replaceSymbolsPattern.matcher(value).replaceAll(""); - } - } -} diff --git a/src/arcane/ui/util/UI.java b/src/arcane/ui/util/UI.java deleted file mode 100644 index 83ecddee9ac..00000000000 --- a/src/arcane/ui/util/UI.java +++ /dev/null @@ -1,243 +0,0 @@ -package arcane.ui.util; - -import com.google.common.collect.MapMaker; - -import javax.swing.*; -import javax.swing.border.Border; -import javax.swing.border.TitledBorder; -import javax.swing.text.Element; -import javax.swing.text.StyleConstants; -import javax.swing.text.View; -import javax.swing.text.ViewFactory; -import javax.swing.text.html.HTML; -import javax.swing.text.html.HTMLEditorKit; -import javax.swing.text.html.ImageView; -import java.awt.*; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.InvocationTargetException; -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.util.Collections; -import java.util.concurrent.ConcurrentMap; - -/** - * UI utility functions. - * - * @author Forge - * @version $Id$ - */ -public class UI { - /** Constant imageCache */ - static private ConcurrentMap imageCache = new MapMaker().softValues().makeMap(); - - /** - *

getToggleButton.

- * - * @return a {@link javax.swing.JToggleButton} object. - */ - static public JToggleButton getToggleButton() { - JToggleButton button = new JToggleButton(); - button.setMargin(new Insets(2, 4, 2, 4)); - return button; - } - - /** - *

getButton.

- * - * @return a {@link javax.swing.JButton} object. - */ - static public JButton getButton() { - JButton button = new JButton(); - button.setMargin(new Insets(2, 4, 2, 4)); - return button; - } - - /** - *

setTitle.

- * - * @param panel a {@link javax.swing.JPanel} object. - * @param title a {@link java.lang.String} object. - */ - static public void setTitle(JPanel panel, String title) { - Border border = panel.getBorder(); - if (border instanceof TitledBorder) { - ((TitledBorder) panel.getBorder()).setTitle(title); - panel.repaint(); - } else - panel.setBorder(BorderFactory.createTitledBorder(title)); - } - - /** - *

getFileURL.

- * - * @param path a {@link java.lang.String} object. - * @return a {@link java.net.URL} object. - */ - static public URL getFileURL(String path) { - File file = new File(path); - if (file.exists()) { - try { - return file.toURI().toURL(); - } catch (MalformedURLException ignored) { - } - } - return UI.class.getResource(path); - } - - /** - *

getImageIcon.

- * - * @param path a {@link java.lang.String} object. - * @return a {@link javax.swing.ImageIcon} object. - */ - static public ImageIcon getImageIcon(String path) { - InputStream stream = null; - try { - try { - stream = UI.class.getResourceAsStream(path); - if (stream == null && new File(path).exists()) stream = new FileInputStream(path); - if (stream == null) throw new RuntimeException("Image not found: " + path); - byte[] data = new byte[stream.available()]; - stream.read(data); - return new ImageIcon(data); - } finally { - if (stream != null) - stream.close(); - } - } catch (IOException ex) { - throw new RuntimeException("Error reading image: " + path); - } - } - - /** - *

setHTMLEditorKit.

- * - * @param editorPane a {@link javax.swing.JEditorPane} object. - */ - static public void setHTMLEditorKit(JEditorPane editorPane) { - editorPane.getDocument().putProperty("imageCache", imageCache); // Read internally by ImageView, but never written. - // Extend all this shit to cache images. - editorPane.setEditorKit(new HTMLEditorKit() { - private static final long serialVersionUID = -562969765076450440L; - - public ViewFactory getViewFactory() { - return new HTMLFactory() { - public View create(Element elem) { - Object o = elem.getAttributes().getAttribute(StyleConstants.NameAttribute); - if (o instanceof HTML.Tag) { - HTML.Tag kind = (HTML.Tag) o; - if (kind == HTML.Tag.IMG) return new ImageView(elem) { - public URL getImageURL() { - URL url = super.getImageURL(); - // Put an image into the cache to be read by other ImageView methods. - if (url != null && imageCache.get(url) == null) - try { - imageCache.put(url.toURI(), Toolkit.getDefaultToolkit().createImage(url)); - } catch (URISyntaxException e) { - } - return url; - } - }; - } - return super.create(elem); - } - }; - } - }); - } - - /** - *

setVerticalScrollingView.

- * - * @param scrollPane a {@link javax.swing.JScrollPane} object. - * @param view a {@link java.awt.Component} object. - */ - static public void setVerticalScrollingView(JScrollPane scrollPane, final Component view) { - final JViewport viewport = new JViewport(); - viewport.setLayout(new ViewportLayout() { - private static final long serialVersionUID = -4436977380450713628L; - - public void layoutContainer(Container parent) { - viewport.setViewPosition(new Point(0, 0)); - Dimension viewportSize = viewport.getSize(); - int width = viewportSize.width; - int height = Math.max(view.getPreferredSize().height, viewportSize.height); - viewport.setViewSize(new Dimension(width, height)); - } - }); - viewport.setView(view); - scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - scrollPane.setViewport(viewport); - } - - /** - *

getDisplayManaCost.

- * - * @param manaCost a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - static public String getDisplayManaCost(String manaCost) { - manaCost = manaCost.replace("/", ""); - manaCost = manaCost.replace("X 0", "X"); - // A pipe in the cost means "process left of the pipe as the card color, but display right of the pipe as the cost". - int pipePosition = manaCost.indexOf("{|}"); - if (pipePosition != -1) manaCost = manaCost.substring(pipePosition + 3); - return manaCost; - } - - /** - *

invokeLater.

- * - * @param runnable a {@link java.lang.Runnable} object. - */ - static public void invokeLater(Runnable runnable) { - EventQueue.invokeLater(runnable); - } - - /** - *

invokeAndWait.

- * - * @param runnable a {@link java.lang.Runnable} object. - */ - static public void invokeAndWait(Runnable runnable) { - if (EventQueue.isDispatchThread()) { - runnable.run(); - return; - } - try { - EventQueue.invokeAndWait(runnable); - } catch (InterruptedException ex) { - } catch (InvocationTargetException ex) { - throw new RuntimeException(ex); - } - } - - /** - *

setSystemLookAndFeel.

- */ - static public void setSystemLookAndFeel() { - try { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (Exception ex) { - System.err.println("Error setting look and feel:"); - ex.printStackTrace(); - } - } - - /** - *

setDefaultFont.

- * - * @param font a {@link java.awt.Font} object. - */ - static public void setDefaultFont(Font font) { - for (Object key : Collections.list(UIManager.getDefaults().keys())) { - Object value = UIManager.get(key); - if (value instanceof javax.swing.plaf.FontUIResource) UIManager.put(key, font); - } - } -} diff --git a/src/arcane/util/MultiplexOutputStream.java b/src/arcane/util/MultiplexOutputStream.java deleted file mode 100644 index b1db49efc47..00000000000 --- a/src/arcane/util/MultiplexOutputStream.java +++ /dev/null @@ -1,37 +0,0 @@ -package arcane.util; - -import java.io.IOException; -import java.io.OutputStream; - -/** - * An OutputStream that writes to multiple other OutputStreams. - * - * @author Forge - * @version $Id$ - */ -public class MultiplexOutputStream extends OutputStream { - private final OutputStream[] streams; - - /** - *

Constructor for MultiplexOutputStream.

- * - * @param streams a {@link java.io.OutputStream} object. - */ - public MultiplexOutputStream(OutputStream... streams) { - super(); - if (streams == null) throw new IllegalArgumentException("streams cannot be null."); - this.streams = streams; - } - - /** {@inheritDoc} */ - public void write(int b) throws IOException { - for (int i = 0; i < streams.length; i++) - streams[i].write(b); - } - - /** {@inheritDoc} */ - public void write(byte[] b, int off, int len) throws IOException { - for (int i = 0; i < streams.length; i++) - streams[i].write(b, off, len); - } -} diff --git a/src/arcane/util/Util.java b/src/arcane/util/Util.java deleted file mode 100644 index 23b34cb5fce..00000000000 --- a/src/arcane/util/Util.java +++ /dev/null @@ -1,95 +0,0 @@ -package arcane.util; - -import javax.swing.*; -import java.io.IOException; -import java.net.DatagramPacket; -import java.net.DatagramSocket; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.util.Collections; -import java.util.Enumeration; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - *

Util class.

- * - * @author Forge - * @version $Id$ - */ -public class Util { - /** Constant isMac=System.getProperty("os.name").toLowerCase().indexOf("mac") != -1 */ - static public final boolean isMac = System.getProperty("os.name").toLowerCase().indexOf("mac") != -1; - /** Constant isWindows=System.getProperty("os.name").toLowerCase().indexOf("windows") == -1 */ - static public final boolean isWindows = System.getProperty("os.name").toLowerCase().indexOf("windows") == -1; - - /** Constant threadPool */ - static public ThreadPoolExecutor threadPool; - /** Constant threadCount */ - static private int threadCount; - - static { - threadPool = new ThreadPoolExecutor(4, 4, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(), new ThreadFactory() { - public Thread newThread(Runnable runnable) { - threadCount++; - Thread thread = new Thread(runnable, "Util" + threadCount); - thread.setDaemon(true); - return thread; - } - }); - threadPool.prestartAllCoreThreads(); - } - - /** - *

broadcast.

- * - * @param data an array of byte. - * @param port a int. - * @throws java.io.IOException if any. - */ - public static void broadcast(byte[] data, int port) throws IOException { - DatagramSocket socket = new DatagramSocket(); - broadcast(socket, data, port, NetworkInterface.getNetworkInterfaces()); - socket.close(); - } - - /** - *

broadcast.

- * - * @param socket a {@link java.net.DatagramSocket} object. - * @param data an array of byte. - * @param port a int. - * @param ifaces a {@link java.util.Enumeration} object. - * @throws java.io.IOException if any. - */ - private static void broadcast(DatagramSocket socket, byte[] data, int port, Enumeration ifaces) - throws IOException { - for (NetworkInterface iface : Collections.list(ifaces)) { - for (InetAddress address : Collections.list(iface.getInetAddresses())) { - if (!address.isSiteLocalAddress()) continue; - // Java 1.5 doesn't support getting the subnet mask, so try the two most common. - byte[] ip = address.getAddress(); - ip[3] = -1; // 255.255.255.0 - socket.send(new DatagramPacket(data, data.length, InetAddress.getByAddress(ip), port)); - ip[2] = -1; // 255.255.0.0 - socket.send(new DatagramPacket(data, data.length, InetAddress.getByAddress(ip), port)); - } - } - } - - /** - *

invokeAndWait.

- * - * @param runnable a {@link java.lang.Runnable} object. - * @throws java.lang.Exception if any. - */ - public static void invokeAndWait(Runnable runnable) throws Exception { - try { - SwingUtilities.invokeAndWait(runnable); - } catch (Exception ex) { - throw new Exception("Error invoking runnable in UI thread.", ex); - } - } -} diff --git a/src/forge/AIPlayer.java b/src/forge/AIPlayer.java deleted file mode 100644 index b9ae1836802..00000000000 --- a/src/forge/AIPlayer.java +++ /dev/null @@ -1,290 +0,0 @@ -package forge; - -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.SpellAbility; - -import java.util.Random; - - -/** - *

AIPlayer class.

- * - * @author Forge - * @version $Id: $ - */ -public class AIPlayer extends Player { - - /** - *

Constructor for AIPlayer.

- * - * @param myName a {@link java.lang.String} object. - */ - public AIPlayer(String myName) { - this(myName, 20, 0); - } - - /** - *

Constructor for AIPlayer.

- * - * @param myName a {@link java.lang.String} object. - * @param myLife a int. - * @param myPoisonCounters a int. - */ - public AIPlayer(String myName, int myLife, int myPoisonCounters) { - super(myName, myLife, myPoisonCounters); - } - - /** - *

getOpponent.

- * - * @return a {@link forge.Player} object. - */ - public Player getOpponent() { - return AllZone.getHumanPlayer(); - } - - //////////////// - /// - /// Methods to ease transition to Abstract Player class - /// - /////////////// - - /** - *

isHuman.

- * - * @return a boolean. - */ - public boolean isHuman() { - return false; - } - - /** - *

isComputer.

- * - * @return a boolean. - */ - public boolean isComputer() { - return true; - } - - /** {@inheritDoc} */ - public boolean isPlayer(Player p1) { - return p1.getName().equals(this.name); - } - - /////////////// - /// - /// End transition methods - /// - /////////////// - - //////////////////////////////// - /// - /// replaces AllZone.getGameAction().draw* methods - /// - //////////////////////////////// - - /** {@inheritDoc} */ - public CardList mayDrawCard() { - return mayDrawCards(1); - } - - /** {@inheritDoc} */ - public CardList mayDrawCards(int n) { - if (AllZone.getComputerLibrary().size() > n) { - return drawCards(n); - } - else return new CardList(); - } - - /** - *

dredge.

- * - * @return a boolean. - */ - public boolean dredge() { - CardList dredgers = getDredge(); - Random random = MyRandom.random; - - //use dredge if there are more than one of them in your graveyard - if (dredgers.size() > 1 || (dredgers.size() == 1 && random.nextBoolean())) { - dredgers.shuffle(); - Card c = dredgers.get(0); - //rule 702.49a - if (getDredgeNumber(c) <= AllZone.getComputerLibrary().size()) { - //dredge library, put card in hand - AllZone.getGameAction().moveToHand(c); - //put dredge number in graveyard - for (int i = 0; i < getDredgeNumber(c); i++) { - Card c2 = AllZone.getComputerLibrary().get(0); - AllZone.getGameAction().moveToGraveyard(c2); - } - return true; - } - } - return false; - } - - //////////////////////////////// - /// - /// replaces AllZone.getGameAction().discard* methods - /// - //////////////////////////////// - - /** {@inheritDoc} */ - public CardList discard(final int num, final SpellAbility sa, boolean duringResolution) { - int max = AllZoneUtil.getPlayerHand(this).size(); - max = Math.min(max, num); - CardList discarded = new CardList(); - for (int i = 0; i < max; i++) { - CardList hand = AllZoneUtil.getPlayerHand(this); - - if (hand.size() > 0) { - CardList basicLandsInPlay = AllZoneUtil.getPlayerTypeInPlay(this, "Basic"); - if (basicLandsInPlay.size() > 5) { - CardList basicLandsInHand = hand.getType("Basic"); - if (basicLandsInHand.size() > 0) { - discarded.add(hand.get(0)); - doDiscard(basicLandsInHand.get(CardUtil.getRandomIndex(basicLandsInHand)), sa); - } else { - CardListUtil.sortAttackLowFirst(hand); - CardListUtil.sortNonFlyingFirst(hand); - discarded.add(hand.get(0)); - doDiscard(hand.get(0), sa); - } - } else { - CardListUtil.sortCMC(hand); - discarded.add(hand.get(0)); - doDiscard(hand.get(0), sa); - } - } - } - return discarded; - }//end discard - - /** {@inheritDoc} */ - public void discardUnless(int num, String uType, SpellAbility sa) { - CardList hand = AllZoneUtil.getPlayerHand(this); - CardList tHand = hand.getType(uType); - - if (tHand.size() > 0) { - CardListUtil.sortCMC(tHand); - tHand.reverse(); - tHand.get(0).getController().discard(tHand.get(0), sa); //this got changed to doDiscard basically - return; - } - AllZone.getComputerPlayer().discard(num, sa, false); - } - - /** {@inheritDoc} */ - public void handToLibrary(final int numToLibrary, final String libPosIn) { - String libPos = libPosIn; - - for (int i = 0; i < numToLibrary; i++) { - int position; - if (libPos.equalsIgnoreCase("Top")) - position = 0; - else if (libPos.equalsIgnoreCase("Bottom")) - position = -1; - else { - Random r = MyRandom.random; - if (r.nextBoolean()) - position = 0; - else - position = -1; - } - CardList hand = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); - - CardList blIP = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - - blIP = blIP.getType("Basic"); - if (blIP.size() > 5) { - CardList blIH = hand.getType("Basic"); - if (blIH.size() > 0) { - Card card = blIH.get(CardUtil.getRandomIndex(blIH)); - - AllZone.getGameAction().moveToLibrary(card, position); - } else { - CardListUtil.sortAttackLowFirst(hand); - CardListUtil.sortNonFlyingFirst(hand); - - AllZone.getGameAction().moveToLibrary(hand.get(0), position); - } - } else { - CardListUtil.sortCMC(hand); - - AllZone.getGameAction().moveToLibrary(hand.get(0), position); - } - } - } - - - /////////////////////////// - - /** {@inheritDoc} */ - protected void doScry(final CardList topN, final int N) { - int num = N; - for (int i = 0; i < num; i++) { - boolean bottom = false; - if (topN.get(i).isBasicLand()) { - CardList bl = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - bl = bl.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (c.isBasicLand()) return true; - - return false; - } - }); - - bottom = bl.size() > 5; // if control more than 5 Basic land, probably don't need more - } else if (topN.get(i).isCreature()) { - CardList cl = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - cl = cl.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (c.isCreature()) return true; - - return false; - } - }); - - bottom = cl.size() > 5; // if control more than 5 Creatures, probably don't need more - } - if (bottom) { - Card c = topN.get(i); - AllZone.getGameAction().moveToBottomOfLibrary(c); - //topN.remove(c); - } - } - num = topN.size(); - for (int i = 0; i < num; i++) // put the rest on top in random order - { - Random rndm = MyRandom.random; - int r = rndm.nextInt(topN.size()); - Card c = topN.get(r); - AllZone.getGameAction().moveToLibrary(c); - topN.remove(r); - } - } - - /** {@inheritDoc} */ - public void sacrificePermanent(String prompt, CardList choices) { - if (choices.size() > 0) { - //TODO - this could probably use better AI - Card c = CardFactoryUtil.AI_getWorstPermanent(choices, false, false, false, false); - AllZone.getGameAction().sacrificeDestroy(c); - } - } - - /** {@inheritDoc} */ - protected void clashMoveToTopOrBottom(Card c) { - //computer just puts the card back until such time it can make a smarter decision - AllZone.getGameAction().moveToLibrary(c); - } - - @Override - protected void discard_Chains_of_Mephistopheles() { - discard(null); - drawCard(); - } - -}//end AIPlayer class diff --git a/src/forge/AllZone.java b/src/forge/AllZone.java deleted file mode 100644 index 8d6e0f8dbde..00000000000 --- a/src/forge/AllZone.java +++ /dev/null @@ -1,609 +0,0 @@ -package forge; - - -import forge.card.cardFactory.CardFactoryInterface; -import forge.card.cardFactory.PreloadingCardFactory; -import forge.card.mana.ManaPool; -import forge.card.trigger.TriggerHandler; -import forge.deck.DeckManager; -import forge.gui.input.InputControl; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import net.slightlymagic.braids.util.UtilFunctions; - - -/** - * Please use public getters and setters instead of direct field access. - *

- * If you need a setter, by all means, add it. - * - * @author Forge - * @version $Id: $ - */ -public class AllZone implements NewConstants { - //only for testing, should read decks from local directory -// public static final IO IO = new IO("all-decks"); - - /** Constant HumanPlayer */ - private static final Player HumanPlayer = new HumanPlayer("Human"); - /** Constant ComputerPlayer */ - private static final Player ComputerPlayer = new AIPlayer("Computer"); - - /** Constant QuestData */ - private static forge.quest.data.QuestData QuestData = null; - /** Constant QuestAssignment */ - private static Quest_Assignment QuestAssignment = null; - /** Constant NameChanger */ - private static final NameChanger NameChanger = new NameChanger(); - - /** Constant EndOfTurn */ - private static EndOfTurn EndOfTurn = new EndOfTurn(); - /** Constant EndOfCombat */ - private static EndOfCombat EndOfCombat = new EndOfCombat(); - private static Upkeep Upkeep = new Upkeep(); - - /** Constant Phase */ - private static final Phase Phase = new Phase(); - - // Phase is now a prerequisite for CardFactory - /** Constant CardFactory */ - private static CardFactoryInterface cardFactory = null; - - /** Constant Stack */ - private static final MagicStack Stack = new MagicStack(); - /** Constant InputControl */ - private static final InputControl InputControl = new InputControl(); - /** Constant GameAction */ - private static final GameAction GameAction = new GameAction(); - /** Constant StaticEffects */ - private static final StaticEffects StaticEffects = new StaticEffects(); - /** Constant GameInfo */ - private static final GameInfo GameInfo = new GameInfo(); - - /** Constant TriggerHandler */ - private static final TriggerHandler TriggerHandler = new TriggerHandler(); - - //initialized at Runtime since it has to be the last object constructed - - /** Constant Computer */ - private static ComputerAI_Input Computer; - - //shared between Input_Attack, Input_Block, Input_CombatDamage , InputState_Computer - - /** Constant Combat */ - private static Combat Combat = new Combat(); - - //Human_Play, Computer_Play is different because Card.comesIntoPlay() is called when a card is added by PlayerZone.add(Card) - /** Constant Human_Battlefield */ - private final static PlayerZone Human_Battlefield = new PlayerZone_ComesIntoPlay(Constant.Zone.Battlefield, AllZone.getHumanPlayer()); - /** Constant Human_Hand */ - private final static PlayerZone Human_Hand = new DefaultPlayerZone(Constant.Zone.Hand, AllZone.getHumanPlayer()); - /** Constant Human_Graveyard */ - private final static PlayerZone Human_Graveyard = new DefaultPlayerZone(Constant.Zone.Graveyard, AllZone.getHumanPlayer()); - /** Constant Human_Library */ - private final static PlayerZone Human_Library = new DefaultPlayerZone(Constant.Zone.Library, AllZone.getHumanPlayer()); - /** Constant Human_Exile */ - private final static PlayerZone Human_Exile = new DefaultPlayerZone(Constant.Zone.Exile, AllZone.getHumanPlayer()); - /** Constant Human_Command */ - private final static PlayerZone Human_Command = new DefaultPlayerZone(Constant.Zone.Command, AllZone.getHumanPlayer()); - - /** Constant Computer_Battlefield */ - private final static PlayerZone Computer_Battlefield = new PlayerZone_ComesIntoPlay(Constant.Zone.Battlefield, AllZone.getComputerPlayer()); - /** Constant Computer_Hand */ - private final static PlayerZone Computer_Hand = new DefaultPlayerZone(Constant.Zone.Hand, AllZone.getComputerPlayer()); - /** Constant Computer_Graveyard */ - private final static PlayerZone Computer_Graveyard = new DefaultPlayerZone(Constant.Zone.Graveyard, AllZone.getComputerPlayer()); - /** Constant Computer_Library */ - private final static PlayerZone Computer_Library = new DefaultPlayerZone(Constant.Zone.Library, AllZone.getComputerPlayer()); - /** Constant Computer_Exile */ - private final static PlayerZone Computer_Exile = new DefaultPlayerZone(Constant.Zone.Exile, AllZone.getComputerPlayer()); - /** Constant Computer_Command */ - private final static PlayerZone Computer_Command = new DefaultPlayerZone(Constant.Zone.Command, AllZone.getComputerPlayer()); - - /** Constant Stack_Zone */ - private final static PlayerZone Stack_Zone = new DefaultPlayerZone(Constant.Zone.Stack, null); - - /** Constant Display */ - private static Display Display; - - /** Constant map */ - private final static Map map = new HashMap(); - - static { - map.put(Constant.Zone.Graveyard + AllZone.getHumanPlayer(), Human_Graveyard); - map.put(Constant.Zone.Hand + AllZone.getHumanPlayer(), Human_Hand); - map.put(Constant.Zone.Library + AllZone.getHumanPlayer(), Human_Library); - map.put(Constant.Zone.Battlefield + AllZone.getHumanPlayer(), Human_Battlefield); - map.put(Constant.Zone.Exile + AllZone.getHumanPlayer(), Human_Exile); - map.put(Constant.Zone.Command + AllZone.getHumanPlayer(), Human_Command); - - map.put(Constant.Zone.Graveyard + AllZone.getComputerPlayer(), Computer_Graveyard); - map.put(Constant.Zone.Hand + AllZone.getComputerPlayer(), Computer_Hand); - map.put(Constant.Zone.Library + AllZone.getComputerPlayer(), Computer_Library); - map.put(Constant.Zone.Battlefield + AllZone.getComputerPlayer(), Computer_Battlefield); - map.put(Constant.Zone.Exile + AllZone.getComputerPlayer(), Computer_Exile); - map.put(Constant.Zone.Command + AllZone.getComputerPlayer(), Computer_Command); - - map.put(Constant.Zone.Stack + null, Stack_Zone); - } - - private static long timestamp = 0; - - /** Constant DeckManager */ - private final static DeckManager dMgr = new DeckManager(ForgeProps.getFile(NEW_DECKS)); - - /** - *

getHumanPlayer.

- * - * @return a {@link forge.Player} object. - * @since 1.0.15 - */ - public static Player getHumanPlayer() { - return HumanPlayer; - } - - /** - *

getComputerPlayer.

- * - * @return a {@link forge.Player} object. - * @since 1.0.15 - */ - public static Player getComputerPlayer() { - return ComputerPlayer; - } - - /** - *

getQuestData.

- * - * @return a {@link forge.quest.data.QuestData} object. - * @since 1.0.15 - */ - public static forge.quest.data.QuestData getQuestData() { - return QuestData; - } - - /** - *

setQuestData.

- * - * @param questData a {@link forge.quest.data.QuestData} object. - * @since 1.0.15 - */ - public static void setQuestData(forge.quest.data.QuestData questData) { - QuestData = questData; - } - - /** - *

getQuestAssignment.

- * - * @return a {@link forge.Quest_Assignment} object. - * @since 1.0.15 - */ - public static Quest_Assignment getQuestAssignment() { - return QuestAssignment; - } - - /** - *

setQuestAssignment.

- * - * @param assignment a {@link forge.Quest_Assignment} object. - * @since 1.0.15 - */ - public static void setQuestAssignment(Quest_Assignment assignment) { - QuestAssignment = assignment; - } - - /** - *

getNameChanger.

- * - * @return a {@link forge.NameChanger} object. - * @since 1.0.15 - */ - public static NameChanger getNameChanger() { - return NameChanger; - } - - /** - *

getEndOfTurn.

- * - * @return a {@link forge.EndOfTurn} object. - * @since 1.0.15 - */ - public static EndOfTurn getEndOfTurn() { - return EndOfTurn; - } - - /** - *

getEndOfCombat.

- * - * @return a {@link forge.EndOfCombat} object. - * @since 1.0.15 - */ - public static forge.EndOfCombat getEndOfCombat() { - return EndOfCombat; - } - - /** - *

getUpkeep.

- * - * @return a {@link forge.EndOfCombat} object. - * @since 1.0.16 - */ - public static forge.Upkeep getUpkeep() { - return Upkeep; - } - - /** - *

getPhase.

- * - * @return a {@link forge.Phase} object. - * @since 1.0.15 - */ - public static Phase getPhase() { - return Phase; - } - - /** - *

getCardFactory.

- * - * @return a {@link forge.card.cardFactory.CardFactoryInterface} object. - * @since 1.0.15 - */ - public static CardFactoryInterface getCardFactory() { - if (cardFactory == null) { - setCardFactory(new PreloadingCardFactory(ForgeProps.getFile(CARDSFOLDER))); - } - return cardFactory; - } - - public static void setCardFactory(CardFactoryInterface factory) { - UtilFunctions.checkNotNull("factory", factory); - cardFactory = factory; - } - - /** - *

getStack.

- * - * @return a {@link forge.MagicStack} object. - * @since 1.0.15 - */ - public static MagicStack getStack() { - return Stack; - } - - /** - *

getInputControl.

- * - * @return a {@link forge.gui.input.InputControl} object. - * @since 1.0.15 - */ - public static InputControl getInputControl() { - return InputControl; - } - - /** - *

getGameAction.

- * - * @return a {@link forge.GameAction} object. - * @since 1.0.15 - */ - public static GameAction getGameAction() { - return GameAction; - } - - /** - *

getStaticEffects.

- * - * @return a {@link forge.StaticEffects} object. - * @since 1.0.15 - */ - public static StaticEffects getStaticEffects() { - return StaticEffects; - } - - /** - *

getGameInfo.

- * - * @return a {@link forge.GameInfo} object. - * @since 1.0.15 - */ - public static GameInfo getGameInfo() { - return GameInfo; - } - - /** - *

getTriggerHandler.

- * - * @return a {@link forge.card.trigger.TriggerHandler} object. - * @since 1.0.15 - */ - public static TriggerHandler getTriggerHandler() { - return TriggerHandler; - } - - /** - *

getComputer.

- * - * @return a {@link forge.ComputerAI_Input} object. - * @since 1.0.15 - */ - public static ComputerAI_Input getComputer() { - return Computer; - } - - /** - *

setComputer.

- * - * @param input a {@link forge.ComputerAI_Input} object. - * @since 1.0.15 - */ - public static void setComputer(ComputerAI_Input input) { - Computer = input; - } - - /** - *

getCombat.

- * - * @return a {@link forge.Combat} object. - * @since 1.0.15 - */ - public static Combat getCombat() { - return Combat; - } - - /** - *

setCombat.

- * - * @param attackers a {@link forge.Combat} object. - * @since 1.0.15 - */ - public static void setCombat(Combat attackers) { - Combat = attackers; - } - - //Human_Play, Computer_Play is different because Card.comesIntoPlay() is called when a card is added by PlayerZone.add(Card) - /** - *

getHumanBattlefield.

- * - * @return a {@link forge.PlayerZone} object. - * @since 1.0.15 - */ - public static PlayerZone getHumanBattlefield() { - return Human_Battlefield; - } - - /** - *

getHumanHand.

- * - * @return a {@link forge.PlayerZone} object. - * @since 1.0.15 - */ - public static PlayerZone getHumanHand() { - return Human_Hand; - } - - /** - *

getHumanGraveyard.

- * - * @return a {@link forge.PlayerZone} object. - * @since 1.0.15 - */ - public static PlayerZone getHumanGraveyard() { - return Human_Graveyard; - } - - /** - *

getHumanLibrary.

- * - * @return a {@link forge.PlayerZone} object. - * @since 1.0.15 - */ - public static PlayerZone getHumanLibrary() { - return Human_Library; - } - - /** - *

getHumanExile.

- * - * @return a {@link forge.PlayerZone} object. - * @since 1.0.15 - */ - public static PlayerZone getHumanExile() { - return Human_Exile; - } - - /** - *

getHumanCommand.

- * - * @return a {@link forge.PlayerZone} object. - * @since 1.0.15 - */ - public static PlayerZone getHumanCommand() { - return Human_Command; - } - - /** - *

getComputerBattlefield.

- * - * @return a {@link forge.PlayerZone} object. - * @since 1.0.15 - */ - public static PlayerZone getComputerBattlefield() { - return Computer_Battlefield; - } - - /** - *

getComputerHand.

- * - * @return a {@link forge.PlayerZone} object. - * @since 1.0.15 - */ - public static PlayerZone getComputerHand() { - return Computer_Hand; - } - - /** - *

getComputerGraveyard.

- * - * @return a {@link forge.PlayerZone} object. - * @since 1.0.15 - */ - public static PlayerZone getComputerGraveyard() { - return Computer_Graveyard; - } - - /** - *

getComputerLibrary.

- * - * @return a {@link forge.PlayerZone} object. - * @since 1.0.15 - */ - public static PlayerZone getComputerLibrary() { - return Computer_Library; - } - - /** - *

getComputerExile.

- * - * @return a {@link forge.PlayerZone} object. - * @since 1.0.15 - */ - public static PlayerZone getComputerExile() { - return Computer_Exile; - } - - /** - *

getComputerCommand.

- * - * @return a {@link forge.PlayerZone} object. - * @since 1.0.15 - */ - public static PlayerZone getComputerCommand() { - return Computer_Command; - } - - /** - *

getStackZone.

- * - * @return a {@link forge.PlayerZone} object. - * @since 1.0.15 - */ - public static PlayerZone getStackZone() { - return Stack_Zone; - } - - /** - *

getManaPool.

- * - * @return a {@link forge.card.mana.ManaPool} object. - * @since 1.0.15 - */ - public static ManaPool getManaPool() { - return AllZone.getHumanPlayer().getManaPool(); - } - - /** - *

getComputerManaPool.

- * - * @return a {@link forge.card.mana.ManaPool} object. - * @since 1.0.15 - */ - public static ManaPool getComputerManaPool() { - return AllZone.getComputerPlayer().getManaPool(); - } - - /** - *

getDisplay.

- * - * @return a {@link forge.Display} object. - * @since 1.0.15 - */ - public static Display getDisplay() { - return Display; - } - - /** - *

setDisplay.

- * - * @param display a {@link forge.Display} object. - * @since 1.0.15 - */ - public static void setDisplay(Display display) { - Display = display; - } - - /** - *

Getter for the field map.

- * - * @return a {@link java.util.Map} object. - */ - private static Map getMap() { - return map; - } - - /** - *

getZone.

- * - * @param c a {@link forge.Card} object. - * @return a {@link forge.PlayerZone} object. - */ - public static PlayerZone getZone(Card c) { - Iterator it = getMap().values().iterator(); - PlayerZone p; - while (it.hasNext()) { - p = (PlayerZone) it.next(); - - if (AllZoneUtil.isCardInZone(p, c)) - return p; - } - return null; - } - - /** - *

getZone.

- * - * @param zone a {@link java.lang.String} object. - * @param player a {@link forge.Player} object. - * @return a {@link forge.PlayerZone} object. - */ - public static PlayerZone getZone(String zone, Player player) { - if (zone.equals("Stack")) player = null; - Object o = getMap().get(zone + player); - if (o == null) - throw new RuntimeException("AllZone : getZone() invalid parameters " + zone + " " + player); - - return (PlayerZone) o; - } - - /** - *

resetZoneMoveTracking.

- */ - public static void resetZoneMoveTracking() { - ((DefaultPlayerZone) getHumanCommand()).resetCardsAddedThisTurn(); - ((DefaultPlayerZone) getHumanLibrary()).resetCardsAddedThisTurn(); - ((DefaultPlayerZone) getHumanHand()).resetCardsAddedThisTurn(); - ((DefaultPlayerZone) getHumanBattlefield()).resetCardsAddedThisTurn(); - ((DefaultPlayerZone) getHumanGraveyard()).resetCardsAddedThisTurn(); - ((DefaultPlayerZone) getComputerCommand()).resetCardsAddedThisTurn(); - ((DefaultPlayerZone) getComputerLibrary()).resetCardsAddedThisTurn(); - ((DefaultPlayerZone) getComputerHand()).resetCardsAddedThisTurn(); - ((DefaultPlayerZone) getComputerBattlefield()).resetCardsAddedThisTurn(); - ((DefaultPlayerZone) getComputerGraveyard()).resetCardsAddedThisTurn(); - } - - /** - *

getDeckManager.

- */ - public static DeckManager getDeckManager() { - return dMgr; - } - - public static long getNextTimestamp() { - timestamp++; - return timestamp; - } -}//AllZone diff --git a/src/forge/AllZoneUtil.java b/src/forge/AllZoneUtil.java deleted file mode 100644 index 32c66886743..00000000000 --- a/src/forge/AllZoneUtil.java +++ /dev/null @@ -1,953 +0,0 @@ -package forge; - - -import forge.card.cardFactory.CardFactoryUtil; - -import java.util.ArrayList; - -/** - * AllZoneUtil contains static functions used to get CardLists of various - * cards in various zones. - * - * @author dennis.r.friedrichsen (slapshot5 on slightlymagic.net) - * @version $Id: $ - */ -public class AllZoneUtil { - - //////////// Creatures - - /** - * use to get a list of creatures in play for a given player - * - * @param player the player to get creatures for - * @return a CardList containing all creatures a given player has in play - */ - public static CardList getCreaturesInPlay(final Player player) { - CardList creatures = AllZoneUtil.getPlayerCardsInPlay(player); - return creatures.filter(AllZoneUtil.creatures); - } - - /** - * use to get a list of creatures in play with a given keyword - * - * @param keyword the keyword to get creatures for - * @return a CardList containing all creatures in play with a given keyword - */ - public static CardList getCreaturesInPlayWithKeyword(final String keyword) { - CardList list = getCreaturesInPlay(); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.hasKeyword(keyword); - } - }); - return list; - } - - /** - * use to get a CardList of all creatures on the battlefield for both players - * - * @return a CardList of all creatures on the battlefield on both sides - */ - public static CardList getCreaturesInPlay() { - CardList creatures = getCardsInPlay(); - return creatures.filter(AllZoneUtil.creatures); - } - - ///////////////// Lands - - /** - * use to get a list of all lands a given player has on the battlefield - * - * @param player the player whose lands we want to get - * @return a CardList containing all lands the given player has in play - */ - public static CardList getPlayerLandsInPlay(final Player player) { - CardList cards = getPlayerCardsInPlay(player); - return cards.filter(lands); - } - - /** - * gets a list of all lands in play - * - * @return a CardList of all lands on the battlefield - */ - public static CardList getLandsInPlay() { - CardList lands = new CardList(); - lands.addAll(getPlayerLandsInPlay(AllZone.getHumanPlayer())); - lands.addAll(getPlayerLandsInPlay(AllZone.getComputerPlayer())); - return lands; - } - - //============================================================================= - // - // These functions handle getting all cards for a given player - // and all cards with a given name for either or both players - // - //============================================================================= - - /** - * gets a list of all cards in play on both sides - * - * @return a CardList of all cards in play on both sides - */ - public static CardList getCardsInPlay() { - CardList cards = new CardList(); - cards.addAll(getCardsInPlay(null)); - return cards; - } - - /** - * gets a list of all cards in play with a given card name - * - * @param cardName the name of the card to search for - * @return a CardList with all cards in play of the given name - */ - public static CardList getCardsInPlay(final String cardName) { - CardList cards = new CardList(); - cards.addAll(getPlayerCardsInPlay(AllZone.getHumanPlayer())); - cards.addAll(getPlayerCardsInPlay(AllZone.getComputerPlayer())); - if (cardName != null && !"".equals(cardName)) { - cards = cards.getName(cardName); - } - return cards; - } - - /** - * gets a list of all cards that a given Player has in play - * - * @param player the player's cards to get - * @return a CardList with all cards in the Play zone for the given player - */ - public static CardList getPlayerCardsInPlay(final Player player) { - CardList cards = new CardList(); - if (player.isHuman() || player.isComputer()) { - PlayerZone play = AllZone.getZone(Constant.Zone.Battlefield, player); - cards.addAll(play.getCards()); - } - return cards; - } - - /** - * gets a list of all cards with a given name a given player has in play - * - * @param player the player whose cards in play you want to get - * @param cardName the card name to look for in that zone - * @return a CardList with all cards of a given name the player has in play - */ - public static CardList getPlayerCardsInPlay(final Player player, final String cardName) { - CardList cards = new CardList(); - - PlayerZone play = AllZone.getZone(Constant.Zone.Battlefield, player); - cards.addAll(play.getCards()); - - if (cardName != null && !"".equals(cardName)) { - cards = cards.getName(cardName); - } - return cards; - } - - //////////GRAVEYARD - - - /** - * gets a list of all cards owned by both players that have are currently in the graveyard - * - * @return a CardList with all cards currently in a graveyard - */ - public static CardList getCardsInGraveyard() { - CardList cards = new CardList(); - cards.addAll(getPlayerGraveyard(AllZone.getHumanPlayer())); - cards.addAll(getPlayerGraveyard(AllZone.getComputerPlayer())); - return cards; - } - - - /** - * gets all cards in given player's graveyard - * - * @param player the player whose graveyard we want to get - * @return a CardList containing all cards in that player's graveyard - */ - public static CardList getPlayerGraveyard(final Player player) { - CardList cards = new CardList(); - if (player.isHuman() || player.isComputer()) { - PlayerZone grave = AllZone.getZone(Constant.Zone.Graveyard, player); - cards.addAll(grave.getCards()); - } - return cards; - } - - /** - * gets a list of all cards with a given name in a certain player's graveyard - * - * @param player the player whose graveyard we want to get - * @param cardName the card name to find in the graveyard - * @return a CardList containing all cards with that name in the target graveyard - */ - public static CardList getPlayerGraveyard(final Player player, final String cardName) { - CardList cards = getPlayerGraveyard(player); - cards = cards.getName(cardName); - return cards; - } - - // Get a Cards in All Graveyards with a certain name - - /** - * gets a CardList of all cards with a given name in all graveyards - * - * @param cardName the card name to look for - * @return a CardList of all cards with the given name in all graveyards - */ - public static CardList getCardsInGraveyard(final String cardName) { - CardList cards = new CardList(); - cards.addAll(getPlayerGraveyard(AllZone.getHumanPlayer())); - cards.addAll(getPlayerGraveyard(AllZone.getComputerPlayer())); - cards = cards.getName(cardName); - return cards; - } - - /** - * answers the question "is a certain, specific card in this player's graveyard?" - * - * @param player the player's hand to check - * @param card the specific card to look for - * @return true if the card is present in this player's hand; false otherwise - */ - public static boolean isCardInPlayerGraveyard(Player player, Card card) { - return isCardInZone(AllZone.getZone(Constant.Zone.Graveyard, player), card); - } - - //////// HAND - - /** - * gets a list of all cards in a given player's hand - * - * @param player the player's hand to target - * @return a CardList containing all cards in target player's hand - */ - public static CardList getPlayerHand(final Player player) { - CardList cards = new CardList(); - if (player.isHuman() || player.isComputer()) { - PlayerZone hand = AllZone.getZone(Constant.Zone.Hand, player); - cards.addAll(hand.getCards()); - } - return cards; - } - - /** - * answers the question "is a certain, specific card in this player's hand?" - * - * @param player the player's hand to check - * @param card the specific card to look for - * @return true if the card is present in this player's hand; false otherwise - */ - public static boolean isCardInPlayerHand(Player player, Card card) { - return isCardInZone(AllZone.getZone(Constant.Zone.Hand, player), card); - } - - /** - * answers the question "is a specific card in this player's library?" - * - * @param player the player's library to check - * @param card the specific card to look for - * @return true if the card is present in this player's library; false otherwise - */ - public static boolean isCardInPlayerLibrary(Player player, Card card) { - return isCardInZone(AllZone.getZone(Constant.Zone.Library, player), card); - } - - /** - * answers the question "is a specific card in the specified zone?" - * - * @param pz the PlayerZone to check - * @param card the specific card to look for - * @return true if the card is present in this zone; false otherwise - */ - public static boolean isCardInZone(PlayerZone pz, Card card) { - if (card == null) - return false; - - CardList cl = getCardsInZone(pz); - - for (int i = 0; i < cl.size(); i++) - if (cl.get(i).equals(card)) - return true; - - return false; - } - - ////////////// EXILE - - /** - * gets a list of all cards owned by both players that are in Exile - * - * @return a CardList with all cards in Exile - */ - public static CardList getCardsInExile() { - CardList cards = new CardList(); - cards.addAll(getPlayerCardsInExile(AllZone.getComputerPlayer())); - cards.addAll(getPlayerCardsInExile(AllZone.getHumanPlayer())); - return cards; - } - - /** - * gets a list of all cards in Exile for a given player - * - * @param player the player whose cards we want that are in Exile - * @return a CardList with all cards in Exile for a given player - */ - public static CardList getPlayerCardsInExile(final Player player) { - CardList cards = new CardList(); - if (player.isHuman() || player.isComputer()) { - PlayerZone removed = AllZone.getZone(Constant.Zone.Exile, player); - cards.addAll(removed.getCards()); - } - return cards; - } - - /** - * gets a list of all cards with a given name in a certain player's exile - * - * @param player the player whose exile we want to get - * @param cardName the card name to find in the exile - * @return a CardList containing all cards with that name in the target exile - */ - public static CardList getPlayerCardsInExile(final Player player, final String cardName) { - CardList cards = getPlayerCardsInExile(player); - cards = cards.getName(cardName); - return cards; - } - - //////////////////////// LIBRARY - - /** - * gets a list of all cards in a given player's library - * - * @return a CardList with all the cards currently in that player's library - * @param player a {@link forge.Player} object. - */ - public static CardList getPlayerCardsInLibrary(final Player player) { - CardList cards = new CardList(); - if (player.isHuman() || player.isComputer()) { - PlayerZone lib = AllZone.getZone(Constant.Zone.Library, player); - cards.addAll(lib.getCards()); - } - return cards; - } - - /** - * gets a list of all cards with a certain name in a given player's library - * - * @param player the player's library one is interested in - * @param cardName the card's name that one is interested in - * @return a CardList of all cards of the given name in the given player's library - */ - public static CardList getPlayerCardsInLibrary(final Player player, final String cardName) { - CardList cards = getPlayerCardsInLibrary(player); - return cards.getName(cardName); - } - - /** - * gets a list of a given number of cards from the top of given player's library - * - * @param player the player's library one is interested in - * @param numCards the number of cards to get from the top - * @return a CardList of the top number of cards in the given player's library - */ - public static CardList getPlayerCardsInLibrary(final Player player, int numCards) { - CardList cards = new CardList(); - if (player.isHuman() || player.isComputer()) { - PlayerZone lib = AllZone.getZone(Constant.Zone.Library, player); - - if (lib.size() <= numCards) - cards.addAll(lib.getCards()); - else { - for (int i = 0; i < numCards; i++) - cards.add(lib.get(i)); - } - } - return cards; - } - - /** - * answers the question "is the given card in any exile zone?" - * - * @param c the card to look for in Exile - * @return true is the card is in Human or Computer's Exile zone - */ - public static boolean isCardExiled(Card c) { - return getCardsInExile().contains(c); - } - - /** - *

isCardInGrave.

- * - * @param c a {@link forge.Card} object. - * @return a boolean. - */ - public static boolean isCardInGrave(Card c) { - return getCardsInGraveyard().contains(c); - } - - ///Check if a certain card is in play - - /** - *

isCardInPlay.

- * - * @param card a {@link forge.Card} object. - * @return a boolean. - */ - public static boolean isCardInPlay(Card card) { - return getCardsInPlay().contains(card); - } - - /** - * Answers the question: "Is in play?" - * - * @param cardName the name of the card to look for - * @return true is the card is in play, false otherwise - */ - public static boolean isCardInPlay(final String cardName) { - return getCardsInPlay(cardName).size() > 0; - } - - /** - * Answers the question: "Does have in play?" - * - * @param cardName the name of the card to look for - * @param player the player whose battlefield we want to check - * @return true if that player has that card in play, false otherwise - */ - public static boolean isCardInPlay(final String cardName, final Player player) { - return getPlayerCardsInPlay(player, cardName).size() > 0; - } - - /** - * Answers the question: "Does have in play?" - * - * @param card the card to look for - * @param player the player whose battlefield we want to check - * @return true if that player has that card in play, false otherwise - * @since 1.0.15 - */ - public static boolean isCardInPlay(final Card card, final Player player) { - return getPlayerCardsInPlay(player).contains(card); - } - - ///get a list of certain types are in play (like Mountain, Elf, etc...) - - /** - * gets a list of all cards with a certain type (Mountain, Elf, etc...) in play - * - * @param cardType the type to find in play - * @return a CardList with all cards of the given type in play - */ - public static CardList getTypeInPlay(final String cardType) { - CardList cards = getCardsInPlay(); - cards = cards.getType(cardType); - return cards; - } - - /** - * gets a list of all cards of a certain type that a given player has in play - * - * @param player the player to check for cards in play - * @param cardType the card type to check for - * @return a CardList with all cards of a certain type the player has in play - */ - public static CardList getPlayerTypeInPlay(final Player player, final String cardType) { - CardList cards = getPlayerCardsInPlay(player); - cards = cards.getType(cardType); - return cards; - } - - /** - * gets a list of all cards of a certain type that a given player has in his library - * - * @param player the player to check for cards in play - * @param cardType the card type to check for - * @return a CardList with all cards of a certain type the player has in his library - */ - public static CardList getPlayerTypeInLibrary(final Player player, final String cardType) { - CardList cards = getPlayerCardsInLibrary(player); - cards = cards.getType(cardType); - return cards; - } - - /** - * gets a list of all cards of a certain type that a given player has in graveyard - * - * @param player the player to check for cards in play - * @param cardType the card type to check for - * @return a CardList with all cards of a certain type the player has in graveyard - */ - public static CardList getPlayerTypeInGraveyard(final Player player, final String cardType) { - CardList cards = getPlayerGraveyard(player); - cards = cards.getType(cardType); - return cards; - } - - //////////////// getting all cards of a given color - - /** - * gets a list of all Cards of a given color on the battlefield - * - * @param color the color of cards to get - * @return a CardList of all cards in play of a given color - */ - public static CardList getColorInPlay(final String color) { - CardList cards = getPlayerColorInPlay(AllZone.getComputerPlayer(), color); - cards.addAll(getPlayerColorInPlay(AllZone.getHumanPlayer(), color)); - return cards; - } - - /** - * gets a list of all Cards of a given color a given player has on the battlefield - * - * @param player the player's cards to get - * @param color the color of cards to get - * @return a CardList of all cards in play of a given color - */ - public static CardList getPlayerColorInPlay(final Player player, final String color) { - CardList cards = getPlayerCardsInPlay(player); - cards = cards.filter(new CardListFilter() { - public boolean addCard(Card c) { - ArrayList colorList = CardUtil.getColors(c); - return colorList.contains(color); - } - }); - return cards; - } - - /** - *

getCardState.

- * - * @param card a {@link forge.Card} object. - * @return a {@link forge.Card} object. - */ - public static Card getCardState(Card card) { - PlayerZone zone = AllZone.getZone(card); - if (zone == null) // for tokens - return null; - - CardList list = getCardsInZone(zone.getZoneName()); - for (Card c : list) { - if (card.equals(c)) - return c; - } - - return card; - } - - /** - *

getCardsInZone.

- * - * @param zone a {@link java.lang.String} object. - * @return a {@link forge.CardList} object. - */ - public static CardList getCardsInZone(String zone) { - return getCardsInZone(zone, null); - } - - /** - *

getCardsInZone.

- * - * @param zone a {@link forge.PlayerZone} object. - * @return a {@link forge.CardList} object. - */ - public static CardList getCardsInZone(PlayerZone zone) { - return new CardList(zone.getCards()); - } - - /** - *

getCardsInZone.

- * - * @param zone a {@link java.lang.String} object. - * @param player a {@link forge.Player} object. - * @return a {@link forge.CardList} object. - */ - public static CardList getCardsInZone(String zone, Player player) { - CardList all = new CardList(); - - if (zone.contains(Constant.Zone.Graveyard)) { - if (player == null || player.isHuman()) - all.addAll(AllZone.getHumanGraveyard().getCards()); - if (player == null || player.isComputer()) - all.addAll(AllZone.getComputerGraveyard().getCards()); - } - if (zone.contains(Constant.Zone.Hand)) { - if (player == null || player.isHuman()) - all.addAll(AllZone.getHumanHand().getCards()); - if (player == null || player.isComputer()) - all.addAll(AllZone.getComputerHand().getCards()); - } - if (zone.contains(Constant.Zone.Battlefield)) { - if (player == null || player.isHuman()) - all.addAll(AllZone.getHumanBattlefield().getCards()); - if (player == null || player.isComputer()) - all.addAll(AllZone.getComputerBattlefield().getCards()); - } - if (zone.contains(Constant.Zone.Exile)) { - if (player == null || player.isHuman()) - all.addAll(AllZone.getHumanExile().getCards()); - if (player == null || player.isComputer()) - all.addAll(AllZone.getComputerExile().getCards()); - } - if (zone.contains(Constant.Zone.Library)) { - if (player == null || player.isHuman()) - all.addAll(AllZone.getHumanLibrary().getCards()); - if (player == null || player.isComputer()) - all.addAll(AllZone.getComputerLibrary().getCards()); - } - - return all; - } - - /** - *

compareTypeAmountInPlay.

- * - * @param player a {@link forge.Player} object. - * @param type a {@link java.lang.String} object. - * @return a int. - */ - public static int compareTypeAmountInPlay(final Player player, String type) { - // returns the difference between player's - Player opponent = player.getOpponent(); - CardList playerList = getPlayerTypeInPlay(player, type); - CardList opponentList = getPlayerTypeInPlay(opponent, type); - return (playerList.size() - opponentList.size()); - } - - /** - *

compareTypeAmountInGraveyard.

- * - * @param player a {@link forge.Player} object. - * @param type a {@link java.lang.String} object. - * @return a int. - */ - public static int compareTypeAmountInGraveyard(final Player player, String type) { - // returns the difference between player's - Player opponent = player.getOpponent(); - CardList playerList = getPlayerTypeInGraveyard(player, type); - CardList opponentList = getPlayerTypeInGraveyard(opponent, type); - return (playerList.size() - opponentList.size()); - } - - - /** - * a CardListFilter to get all cards that are tapped - */ - public static final CardListFilter tapped = new CardListFilter() { - public boolean addCard(Card c) { - return c.isTapped(); - } - }; - - /** - * a CardListFilter to get all cards that are untapped - */ - public static final CardListFilter untapped = new CardListFilter() { - public boolean addCard(Card c) { - return c.isUntapped(); - } - }; - - /** - * a CardListFilter to get all creatures - */ - public static final CardListFilter creatures = new CardListFilter() { - public boolean addCard(Card c) { - return c.isCreature(); - } - }; - - /** - * a CardListFilter to get all enchantments - */ - public static final CardListFilter enchantments = new CardListFilter() { - public boolean addCard(Card c) { - return c.isEnchantment(); - } - }; - - /** - * a CardListFilter to get all equipment - */ - public static final CardListFilter equipment = new CardListFilter() { - public boolean addCard(Card c) { - return c.isEquipment(); - } - }; - - /** - * a CardListFilter to get all unenchanted cards in a list - */ - public static final CardListFilter unenchanted = new CardListFilter() { - public boolean addCard(Card c) { - return !c.isEnchanted(); - } - }; - - /** - * a CardListFilter to get all enchanted cards in a list - */ - public static final CardListFilter enchanted = new CardListFilter() { - public boolean addCard(Card c) { - return c.isEnchanted(); - } - }; - - /** - * a CardListFilter to get all nontoken cards - */ - public static final CardListFilter nonToken = new CardListFilter() { - public boolean addCard(Card c) { - return !c.isToken(); - } - }; - - /** - * a CardListFilter to get all token cards - */ - public static final CardListFilter token = new CardListFilter() { - public boolean addCard(Card c) { - return c.isToken(); - } - }; - - /** - * a CardListFilter to get all nonbasic lands - */ - public static final CardListFilter nonBasicLand = new CardListFilter() { - public boolean addCard(Card c) { - return !c.isBasicLand(); - } - }; - - /** - * a CardListFilter to get all basicLands - */ - public static final CardListFilter basicLands = new CardListFilter() { - public boolean addCard(Card c) { - //the isBasicLand() check here may be sufficient... - return c.isLand() && c.isBasicLand(); - } - }; - - /** - * a CardListFilter to get all artifacts - */ - public static final CardListFilter artifacts = new CardListFilter() { - public boolean addCard(Card c) { - return c.isArtifact(); - } - }; - - /** - * a CardListFilter to get all nonartifacts - */ - public static final CardListFilter nonartifacts = new CardListFilter() { - public boolean addCard(Card c) { - return !c.isArtifact(); - } - }; - - /** - * a CardListFilter to get all lands - */ - public static final CardListFilter lands = new CardListFilter() { - public boolean addCard(Card c) { - return c.isLand(); - } - }; - - /** - * a CardListFilter to get all nonlands - */ - public static final CardListFilter nonlands = new CardListFilter() { - public boolean addCard(Card c) { - return !c.isLand(); - } - }; - - /** - * get a CardListFilter to filter in only cards that can be targeted - * - * @param source - the card to be the source for the target - * @return a CardListFilter to only add cards that can be targeted - */ - public static CardListFilter getCanTargetFilter(final Card source) { - CardListFilter canTarget = new CardListFilter() { - public boolean addCard(Card c) { - return CardFactoryUtil.canTarget(source, c); - } - }; - return canTarget; - } - - /** - * get a CardListFilter to filter a CardList for a given keyword - * - * @param keyword - the keyword to look for - * @return a CardListFilter to only add cards with the given keyword - */ - public static CardListFilter getKeywordFilter(final String keyword) { - CardListFilter filter = new CardListFilter() { - public boolean addCard(Card c) { - return c.hasKeyword(keyword); - } - }; - return filter; - } - - /** - * get a CardListFilter to filter a CardList for a given type - * - * @param type - the type to check for - * @return a CardListFilter to only add cards of the given type - */ - public static CardListFilter getTypeFilter(final String type) { - CardListFilter filter = new CardListFilter() { - public boolean addCard(Card c) { - return c.isType(type); - } - }; - return filter; - } - - /** - * a CardListFilter to get all cards that are black - */ - public static final CardListFilter black = new CardListFilter() { - public boolean addCard(Card c) { - return c.isBlack(); - } - }; - - /** - * a CardListFilter to get all cards that are blue - */ - public static final CardListFilter blue = new CardListFilter() { - public boolean addCard(Card c) { - return c.isBlue(); - } - }; - - /** - * a CardListFilter to get all cards that are green - */ - public static final CardListFilter green = new CardListFilter() { - public boolean addCard(Card c) { - return c.isGreen(); - } - }; - - /** - * a CardListFilter to get all cards that are red - */ - public static final CardListFilter red = new CardListFilter() { - public boolean addCard(Card c) { - return c.isRed(); - } - }; - - /** - * a CardListFilter to get all cards that are white - */ - public static final CardListFilter white = new CardListFilter() { - public boolean addCard(Card c) { - return c.isWhite(); - } - }; - - /** - * a CardListFilter to get all cards that are a part of this game - * - * @return a {@link forge.CardList} with all cards in all Battlefields, Hands, Graveyards, Libraries, and Exiles. - */ - public static CardList getCardsInGame() { - CardList all = new CardList(); - all.addAll(AllZone.getHumanGraveyard().getCards()); - all.addAll(AllZone.getHumanHand().getCards()); - all.addAll(AllZone.getHumanLibrary().getCards()); - all.addAll(AllZone.getHumanBattlefield().getCards()); - all.addAll(AllZone.getHumanExile().getCards()); - //should this include Human_Command ? - //all.addAll(AllZone.getHumanSideboard().getCards()); - - all.addAll(AllZone.getComputerGraveyard().getCards()); - all.addAll(AllZone.getComputerHand().getCards()); - all.addAll(AllZone.getComputerLibrary().getCards()); - all.addAll(AllZone.getComputerBattlefield().getCards()); - all.addAll(AllZone.getComputerExile().getCards()); - //should this include Computer_Command ? - //all.addAll(AllZone.getComputerSideboard().getCards()); - - return all; - } - - /** - *

getDoublingSeasonMagnitude.

- * - * @param player the {@link forge.Player} player to determine if is affected by Doubling Season - * @return a int. - */ - public static int getDoublingSeasonMagnitude(Player player) { - int multiplier = 1; - int doublingSeasons = getPlayerCardsInPlay(player, "Doubling Season").size(); - if (doublingSeasons > 0) multiplier = (int) Math.pow(2, doublingSeasons); - return multiplier; - } - - /** - * get a list of all players participating in this game - * - * @return a list of all player participating in this game - */ - public static ArrayList getPlayersInGame() { - ArrayList list = new ArrayList(); - list.add(AllZone.getHumanPlayer()); - list.add(AllZone.getComputerPlayer()); - return list; - } - - /** - * gets a list of all opponents of a given player - * - * @param p the player whose opponents to get - * @return a list of all opponents - */ - public static ArrayList getOpponents(Player p) { - ArrayList list = new ArrayList(); - list.add(p.getOpponent()); - return list; - } - - /** - *

compare.

- * - * @param leftSide a int. - * @param comp a {@link java.lang.String} object. - * @param rightSide a int. - * @return a boolean. - * @since 1.0.15 - */ - public static boolean compare(int leftSide, String comp, int rightSide) { - // should this function be somewhere else? - // leftSide COMPARED to rightSide: - if (comp.contains("LT")) return leftSide < rightSide; - - else if (comp.contains("LE")) return leftSide <= rightSide; - - else if (comp.contains("EQ")) return leftSide == rightSide; - - else if (comp.contains("GE")) return leftSide >= rightSide; - - else if (comp.contains("GT")) return leftSide > rightSide; - - else if (comp.contains("NE")) return leftSide != rightSide; // not equals - - return false; - } - -}//end class AllZoneUtil diff --git a/src/forge/Base64Coder.java b/src/forge/Base64Coder.java deleted file mode 100644 index 61e1a8367ef..00000000000 --- a/src/forge/Base64Coder.java +++ /dev/null @@ -1,286 +0,0 @@ -// Copyright 2003-2010 Christian d'Heureuse, Inventec Informatik AG, Zurich, Switzerland -// www.source-code.biz, www.inventec.ch/chdh -// -// This module is multi-licensed and may be used under the terms -// of any of the following licenses: -// -// EPL, Eclipse Public License, V1.0 or later, http://www.eclipse.org/legal -// LGPL, GNU Lesser General Public License, V2.1 or later, http://www.gnu.org/licenses/lgpl.html -// GPL, GNU General Public License, V2 or later, http://www.gnu.org/licenses/gpl.html -// AL, Apache License, V2.0 or later, http://www.apache.org/licenses -// BSD, BSD License, http://www.opensource.org/licenses/bsd-license.php -// -// Please contact the author if you need another license. -// This module is provided "as is", without warranties of any kind. - -package forge; - -/** - * A Base64 encoder/decoder. - *

- *

- * This class is used to encode and decode data in Base64 format as described in RFC 1521. - *

- *

- * Project home page: www.source-code.biz/base64coder/java
- * Author: Christian d'Heureuse, Inventec Informatik AG, Zurich, Switzerland
- * Multi-licensed: EPL / LGPL / GPL / AL / BSD. - * - * @author Forge - * @version $Id: $ - */ -public class Base64Coder { - - // The line separator string of the operating system. - /** Constant systemLineSeparator="System.getProperty(line.separator)" */ - private static final String systemLineSeparator = System.getProperty("line.separator"); - - // Mapping table from 6-bit nibbles to Base64 characters. - /** Constant map1=new char[64] */ - private static char[] map1 = new char[64]; - - static { - int i = 0; - for (char c = 'A'; c <= 'Z'; c++) map1[i++] = c; - for (char c = 'a'; c <= 'z'; c++) map1[i++] = c; - for (char c = '0'; c <= '9'; c++) map1[i++] = c; - map1[i++] = '+'; - map1[i++] = '/'; - } - - // Mapping table from Base64 characters to 6-bit nibbles. - /** Constant map2=new byte[128] */ - private static byte[] map2 = new byte[128]; - - static { - for (int i = 0; i < map2.length; i++) map2[i] = -1; - for (int i = 0; i < 64; i++) map2[map1[i]] = (byte) i; - } - - /** - * Encodes a string into Base64 format. - * No blanks or line breaks are inserted. - * - * @param s A String to be encoded. - * @return A String containing the Base64 encoded data. - */ - public static String encodeString(String s) { - return new String(encode(s.getBytes())); - } - - /** - *

encodeString.

- * - * @param s a {@link java.lang.String} object. - * @param noPad a boolean. - * @return a {@link java.lang.String} object. - */ - public static String encodeString(String s, boolean noPad) { - String t = new String(encode(s.getBytes())); - - if (noPad) - t = t.replace("=", ""); - - return t; - } - - /** - * Encodes a byte array into Base 64 format and breaks the output into lines of 76 characters. - * This method is compatible with sun.misc.BASE64Encoder.encodeBuffer(byte[]). - * - * @param in An array containing the data bytes to be encoded. - * @return A String containing the Base64 encoded data, broken into lines. - */ - public static String encodeLines(byte[] in) { - return encodeLines(in, 0, in.length, 76, systemLineSeparator); - } - - /** - * Encodes a byte array into Base 64 format and breaks the output into lines. - * - * @param in An array containing the data bytes to be encoded. - * @param iOff Offset of the first byte in in to be processed. - * @param iLen Number of bytes to be processed in in, starting at iOff. - * @param lineLen Line length for the output data. Should be a multiple of 4. - * @param lineSeparator The line separator to be used to separate the output lines. - * @return A String containing the Base64 encoded data, broken into lines. - */ - public static String encodeLines(byte[] in, int iOff, int iLen, int lineLen, String lineSeparator) { - int blockLen = (lineLen * 3) / 4; - if (blockLen <= 0) throw new IllegalArgumentException(); - int lines = (iLen + blockLen - 1) / blockLen; - int bufLen = ((iLen + 2) / 3) * 4 + lines * lineSeparator.length(); - StringBuilder buf = new StringBuilder(bufLen); - int ip = 0; - while (ip < iLen) { - int l = Math.min(iLen - ip, blockLen); - buf.append(encode(in, iOff + ip, l)); - buf.append(lineSeparator); - ip += l; - } - return buf.toString(); - } - - /** - * Encodes a byte array into Base64 format. - * No blanks or line breaks are inserted in the output. - * - * @param in An array containing the data bytes to be encoded. - * @return A character array containing the Base64 encoded data. - */ - public static char[] encode(byte[] in) { - return encode(in, 0, in.length); - } - - /** - * Encodes a byte array into Base64 format. - * No blanks or line breaks are inserted in the output. - * - * @param in An array containing the data bytes to be encoded. - * @param iLen Number of bytes to process in in. - * @return A character array containing the Base64 encoded data. - */ - public static char[] encode(byte[] in, int iLen) { - return encode(in, 0, iLen); - } - - /** - * Encodes a byte array into Base64 format. - * No blanks or line breaks are inserted in the output. - * - * @param in An array containing the data bytes to be encoded. - * @param iOff Offset of the first byte in in to be processed. - * @param iLen Number of bytes to process in in, starting at iOff. - * @return A character array containing the Base64 encoded data. - */ - public static char[] encode(byte[] in, int iOff, int iLen) { - int oDataLen = (iLen * 4 + 2) / 3; // output length without padding - int oLen = ((iLen + 2) / 3) * 4; // output length including padding - char[] out = new char[oLen]; - int ip = iOff; - int iEnd = iOff + iLen; - int op = 0; - while (ip < iEnd) { - int i0 = in[ip++] & 0xff; - int i1 = ip < iEnd ? in[ip++] & 0xff : 0; - int i2 = ip < iEnd ? in[ip++] & 0xff : 0; - int o0 = i0 >>> 2; - int o1 = ((i0 & 3) << 4) | (i1 >>> 4); - int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6); - int o3 = i2 & 0x3F; - out[op++] = map1[o0]; - out[op++] = map1[o1]; - out[op] = op < oDataLen ? map1[o2] : '='; - op++; - out[op] = op < oDataLen ? map1[o3] : '='; - op++; - } - return out; - } - - /** - * Decodes a string from Base64 format. - * No blanks or line breaks are allowed within the Base64 encoded input data. - * - * @param s A Base64 String to be decoded. - * @return A String containing the decoded data. - * @throws java.lang.IllegalArgumentException If the input is not valid Base64 encoded data. - */ - public static String decodeString(String s) { - return new String(decode(s)); - } - - /** - * Decodes a byte array from Base64 format and ignores line separators, tabs and blanks. - * CR, LF, Tab and Space characters are ignored in the input data. - * This method is compatible with sun.misc.BASE64Decoder.decodeBuffer(String). - * - * @param s A Base64 String to be decoded. - * @return An array containing the decoded data bytes. - * @throws java.lang.IllegalArgumentException If the input is not valid Base64 encoded data. - */ - public static byte[] decodeLines(String s) { - char[] buf = new char[s.length()]; - int p = 0; - for (int ip = 0; ip < s.length(); ip++) { - char c = s.charAt(ip); - if (c != ' ' && c != '\r' && c != '\n' && c != '\t') - buf[p++] = c; - } - return decode(buf, 0, p); - } - - /** - * Decodes a byte array from Base64 format. - * No blanks or line breaks are allowed within the Base64 encoded input data. - * - * @param s A Base64 String to be decoded. - * @return An array containing the decoded data bytes. - * @throws java.lang.IllegalArgumentException If the input is not valid Base64 encoded data. - */ - public static byte[] decode(String s) { - return decode(s.toCharArray()); - } - - /** - * Decodes a byte array from Base64 format. - * No blanks or line breaks are allowed within the Base64 encoded input data. - * - * @param in A character array containing the Base64 encoded data. - * @return An array containing the decoded data bytes. - * @throws java.lang.IllegalArgumentException If the input is not valid Base64 encoded data. - */ - public static byte[] decode(char[] in) { - return decode(in, 0, in.length); - } - - /** - * Decodes a byte array from Base64 format. - * No blanks or line breaks are allowed within the Base64 encoded input data. - * - * @param in A character array containing the Base64 encoded data. - * @param iOff Offset of the first character in in to be processed. - * @param iLen Number of characters to process in in, starting at iOff. - * @return An array containing the decoded data bytes. - * @throws java.lang.IllegalArgumentException If the input is not valid Base64 encoded data. - */ - public static byte[] decode(char[] in, int iOff, int iLen) { - if (iLen % 4 != 0) - throw new IllegalArgumentException("Length of Base64 encoded input string is not a multiple of 4."); - while (iLen > 0 && in[iOff + iLen - 1] == '=') iLen--; - int oLen = (iLen * 3) / 4; - byte[] out = new byte[oLen]; - int ip = iOff; - int iEnd = iOff + iLen; - int op = 0; - while (ip < iEnd) { - int i0 = in[ip++]; - int i1 = in[ip++]; - int i2 = ip < iEnd ? in[ip++] : 'A'; - int i3 = ip < iEnd ? in[ip++] : 'A'; - if (i0 > 127 || i1 > 127 || i2 > 127 || i3 > 127) - throw new IllegalArgumentException("Illegal character in Base64 encoded data."); - int b0 = map2[i0]; - int b1 = map2[i1]; - int b2 = map2[i2]; - int b3 = map2[i3]; - if (b0 < 0 || b1 < 0 || b2 < 0 || b3 < 0) - throw new IllegalArgumentException("Illegal character in Base64 encoded data."); - int o0 = (b0 << 2) | (b1 >>> 4); - int o1 = ((b1 & 0xf) << 4) | (b2 >>> 2); - int o2 = ((b2 & 3) << 6) | b3; - out[op++] = (byte) o0; - if (op < oLen) out[op++] = (byte) o1; - if (op < oLen) out[op++] = (byte) o2; - } - return out; - } - - // Dummy constructor. - /** - *

Constructor for Base64Coder.

- */ - private Base64Coder() { - } - -} // end class Base64Coder diff --git a/src/forge/BoosterDraft.java b/src/forge/BoosterDraft.java deleted file mode 100644 index 04bb96fa071..00000000000 --- a/src/forge/BoosterDraft.java +++ /dev/null @@ -1,56 +0,0 @@ -package forge; - -import forge.deck.Deck; -import java.util.Map; -import java.util.TreeMap; - -/** - *

BoosterDraft interface.

- * - * @author Forge - * @version $Id: $ - */ -public interface BoosterDraft { - /** - *

nextChoice.

- * - * @return a {@link forge.CardList} object. - */ - public CardList nextChoice(); - - /** - *

setChoice.

- * - * @param c a {@link forge.Card} object. - */ - public void setChoice(Card c); - - /** - *

hasNextChoice.

- * - * @return a boolean. - */ - public boolean hasNextChoice(); - - /** - *

getDecks.

- * - * @return an array of {@link forge.deck.Deck} objects. - */ - public Deck[] getDecks(); //size 7, all the computers decks - - /** Constant LandSetCode="{}" */ - public String LandSetCode[] = {""}; - - /** Constant draftFormat="{}" */ - public String draftFormat[] = {""}; - - /** Constant draftPicks="{}" */ - public Map draftPicks = new TreeMap(); -} - - - - - - diff --git a/src/forge/BoosterDraftAI.java b/src/forge/BoosterDraftAI.java deleted file mode 100644 index 10eb98cded0..00000000000 --- a/src/forge/BoosterDraftAI.java +++ /dev/null @@ -1,677 +0,0 @@ -package forge; - -import forge.card.spellability.Ability_Mana; -import forge.deck.Deck; - -import java.util.*; - -/** - *

BoosterDraftAI class.

- * - * @author Forge - * @version $Id: $ - */ -public class BoosterDraftAI { - public BoosterDraft bd = null; - //once a deck has this number of creatures the computer randomly - //picks a card, so the final computer deck has 12-20 creatures - //minimum of creatures per deck - //private static final int nCreatures = 16; - /** - * Constant nDecks=7 - */ - private static final int nDecks = 7; - - //holds all the cards for each of the computer's decks - private CardList[] deck = new CardList[nDecks]; - private String[][] deckColor = new String[nDecks][]; - - /** - * Constant colorToLand - */ - private static Map colorToLand = new TreeMap(); - - //picks one Card from in_choose, removes that card, and returns the list - //returns the cards not picked - - /** - *

choose.

- * - * @param in_choose a {@link forge.CardList} object. - * @param player a int. - * @return a {@link forge.CardList} object. - */ - public CardList choose(final CardList in_choose, int player) { - //in_choose should ONLY be on the RIGHT side of any equal sign - //only 1 card should be removed from in_choose - - if (Constant.Runtime.DevMode[0]) - System.out.println("Player[" + player + "] pack: " + in_choose.toString()); - - CardList list = new CardList(); - boolean hasPicked = false; - Card pickedCard = new Card(); - - CardList AIPlayables = in_choose.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (c.getSVar("RemAIDeck").equals("True") || c.getSVar("RemRandomDeck").equals("True")) - return false; - return true; - } - }); - - if (playerColors.get(player).Color1.equals("none") && playerColors.get(player).Color2.equals("none")) { - // - CardList creatures = AIPlayables.getType("Creature").getColored(); - creatures.sort(bestCreature); - //for (int i=0; i 0) { - pickedCard = creatures.get(creatures.size() - 1); - playerColors.get(player).Color1 = pickedCard.getColor().get(0).toStringArray().get(0); - if (Constant.Runtime.DevMode[0]) - System.out.println("Player[" + player + "] Color1: " + playerColors.get(player).Color1); - - playerColors.get(player).Mana1 = playerColors.get(player).ColorToMana(playerColors.get(player).Color1); - - //if the first pick has more than one color add the second as second color to draft - if (pickedCard.getColor().get(0).toStringArray().size() > 1) { - playerColors.get(player).Color2 = pickedCard.getColor().get(0).toStringArray().get(1); - if (Constant.Runtime.DevMode[0]) - System.out.println("Player[" + player + "] Color2: " + playerColors.get(player).Color2); - - playerColors.get(player).Mana2 = playerColors.get(player).ColorToMana(playerColors.get(player).Color2); - } - - hasPicked = true; - } - } else if (!playerColors.get(player).Color1.equals("none") && playerColors.get(player).Color2.equals("none")) { - CardList creatures = AIPlayables.getType("Creature").getColored(); - creatures.sort(bestCreature); - //for (int i=0; i 0) { - pickedCard = creatures.get(creatures.size() - 1); - playerColors.get(player).Color2 = pickedCard.getColor().get(0).toStringArray().get(0); - if (Constant.Runtime.DevMode[0]) - System.out.println("Player[" + player + "] Color2: " + playerColors.get(player).Color2); - - playerColors.get(player).Mana2 = playerColors.get(player).ColorToMana(playerColors.get(player).Color2); - hasPicked = true; - } - } else { - CardList typeList; - CardList colorList; - - colorList = AIPlayables.getOnly2Colors(playerColors.get(player).Color1, playerColors.get(player).Color2); - - if (colorList.size() > 0) { - typeList = colorList.getType("Creature"); - if (typeList.size() > 0) { - typeList.sort(bestCreature); - typeList.reverse(); - list.add(typeList.get(0)); - if (typeList.size() > 1) - list.add(typeList.get(1)); - } - - typeList = colorList.getType("Instant"); - typeList.addAll(colorList.getType("Sorcery")); - if (typeList.size() > 0) { - CardListUtil.sortCMC(typeList); - list.add(typeList.get(typeList.size() / 2)); - } - - typeList = colorList.getType("Enchantment"); - if (typeList.size() > 0) { - CardListUtil.sortCMC(typeList); - list.add(typeList.get(0)); - } - - typeList = colorList.getType("Planeswalker"); - if (typeList.size() > 0) - list.add(typeList.get(0)); - - typeList = colorList.getType("Artifact"); - if (typeList.size() > 0) { - CardListUtil.sortCMC(typeList); - list.add(typeList.get(0)); - } - - } else { -/* if (!playerColors.get(player).Splash.equals("none")) { - // pick randomly from splash color - colorList = AIPlayables.getColor(playerColors.get(player).Splash); - if (colorList.size() > 0) { - Random r = new Random(); - list.add(colorList.get(r.nextInt(colorList.size()))); - } - } - else { - // pick splash color - ArrayList otherColors = new ArrayList(); - for (int i=0; i<5; i++) - otherColors.add(Constant.Color.onlyColors[i]); - otherColors.remove(playerColors.get(player).Color1); - otherColors.remove(playerColors.get(player).Color2); - - colorList = new CardList(); - for (int i=0; i 0) { - Random r = new Random(); - pickedCard = colorList.get(r.nextInt(colorList.size())); - playerColors.get(player).Splash = pickedCard.getColor().get(0).toStringArray().get(0); - System.out.println("Player["+player+"] Splash: "+playerColors.get(player).Splash); - playerColors.get(player).ManaS = playerColors.get(player).ColorToMana(playerColors.get(player).Splash); - hasPicked = true; - } - } -*/ - typeList = AIPlayables.getType("Land"); - if (typeList.size() > 0) { - for (int i = 0; i < typeList.size(); i++) { - ArrayList maList = typeList.get(i).getManaAbility(); - for (int j = 0; j < maList.size(); j++) { - if (maList.get(j).canProduce(playerColors.get(player).Mana1) || maList.get(j).canProduce(playerColors.get(player).Mana2)) //|| maList.get(j).canProduce(playerColors.get(player).ManaS)) - list.add(typeList.get(i)); - } - } - } - } - - - } - if (!hasPicked) { - Random r = new Random(); - - if (list.size() > 0) { - list.shuffle(); - pickedCard = list.get(r.nextInt(list.size())); - hasPicked = true; - } else { - in_choose.shuffle(); - pickedCard = in_choose.get(r.nextInt(in_choose.size())); - hasPicked = true; - } - - } - - if (hasPicked) { - in_choose.remove(pickedCard); - deck[player].add(pickedCard); - - if (Constant.Runtime.DevMode[0]) - System.out.println("Player[" + player + "] picked " + pickedCard.getName() + " (" + pickedCard.getManaCost() + ") " + pickedCard.getType().toString() + "\n"); - } - - return in_choose; - }//choose() - -/* - I get some wierd error when I have this method, I don't know whats wrong - - private void checkDeckList(CardList[] deck) - { - if(deck.length != nDecks) - throw new RuntimeException("BoosterDraftAI : checkDeckList() error, deck list size is not 7 - " +deck.length); - - for(int i = 0; i < nDecks; i++) - { - if(deck[i].size() != 22) - { - throw new RuntimeException("BoosterDraftAI : checkDeckList() error, deck list size is not 22 - " +deck[i].size() +" - " +deck.toString()); - } - if(countCreatures(deck[i]) < nCreatures) - throw new RuntimeException("BoosterDraftAI : checkDeckList() error, deck needs more creatures - " +countCreatures(deck[i])); - - for(int inner = 0; inner < 22; inner++) - if(! CardUtil.getColors(deck[i].getCard(inner)).contains(deckColor[i][0]) && - ! CardUtil.getColors(deck[i].getCard(inner)).contains(deckColor[i][1])) - throw new RuntimeException("BoosterDraftAI : checkDeckList() error, deck has different card colors"); - }//for - }//checkDeckList() -*/ - - //private int countCreatures(CardList list) {return list.getType("Creature").size();} - - /** - *

testColors.

- * - * @param n an array of int. - */ - private void testColors(int[] n) { - if (n.length != nDecks) - throw new RuntimeException("BoosterDraftAI : testColors error, numbers array length does not equal 7"); - - Set set = new TreeSet(); - for (int i = 0; i < nDecks; i++) - set.add(Integer.valueOf(n[i])); - - if (set.size() != nDecks) - throw new RuntimeException("BoosterDraftAI : testColors error, numbers not unique"); - - for (int i = 0; i < nDecks; i++) - if (n[i] < 0 || deckColorChoices.length <= n[i]) - throw new RuntimeException("BoosterDraftAI : testColors error, index out of range - " + n[i]); - }//testColors() - - /** - *

getDecks.

- * - * @return an array of {@link forge.deck.Deck} objects. - */ - public Deck[] getDecks() { - //check CardList[] deck for errors - //checkDeckList(deck); - - Deck[] out = new Deck[deck.length]; - - for (int i = 0; i < deck.length; i++) { - //addLand(deck[i], deckColor[i]); - //out[i] = getDeck(deck[i]); - if (Constant.Runtime.DevMode[0]) - System.out.println("Deck[" + i + "]"); - - out[i] = buildDeck(deck[i], playerColors.get(i)); - } - return out; - }//getDecks() - - /** - *

buildDeck.

- * - * @param dList a {@link forge.CardList} object. - * @param pClrs a {@link forge.DeckColors} object. - * @return a {@link forge.deck.Deck} object. - */ - private Deck buildDeck(CardList dList, DeckColors pClrs) { - Deck out = new Deck(Constant.GameType.Draft); - CardList outList = new CardList(); - int cardsNeeded = 22; - int landsNeeded = 18; - - CardList AIPlayables = dList.filter(new CardListFilter() { - public boolean addCard(Card c) { - return !(c.getSVar("RemAIDeck").equals("True")); - } - }); - for (int i = 0; i < AIPlayables.size(); i++) - dList.remove(AIPlayables.get(i)); - - CardList creatures = AIPlayables.getType("Creature").getOnly2Colors(pClrs.Color1, pClrs.Color2); - - int nCreatures = 15; - - creatures.sort(bestCreature); - creatures.reverse(); - - int i = 0; - while (nCreatures > 0 && i < creatures.size()) { - Card c = creatures.get(i); - - outList.add(c); - cardsNeeded--; - nCreatures--; - AIPlayables.remove(c); - - if (Constant.Runtime.DevMode[0]) - System.out.println("Creature[" + i + "]:" + c.getName() + " (" + c.getManaCost() + ")"); - - i++; - } - - CardList otherCreatures = AIPlayables.getType("Creature"); - while (nCreatures > 1 && otherCreatures.size() > 1) { - Card c = otherCreatures.get(MyRandom.random.nextInt(otherCreatures.size() - 1)); - outList.add(c); - cardsNeeded--; - nCreatures--; - AIPlayables.remove(c); - - otherCreatures = AIPlayables.getType("Creature"); - - if (Constant.Runtime.DevMode[0]) - System.out.println("AddCreature: " + c.getName() + " (" + c.getManaCost() + ")"); - } - - CardList others = AIPlayables.getNotType("Creature").getNotType("Land").getOnly2Colors(pClrs.Color1, pClrs.Color2); - - int ii = 0; - while (cardsNeeded > 0 && others.size() > 1) { - Card c = others.get(MyRandom.random.nextInt(others.size() - 1)); - - //out.addMain(c.getName()); - outList.add(c); - cardsNeeded--; - AIPlayables.remove(c); - - others = AIPlayables.getNotType("Creature").getNotType("Land").getOnly2Colors(pClrs.Color1, pClrs.Color2); - - if (Constant.Runtime.DevMode[0]) - System.out.println("Others[" + ii++ + "]:" + c.getName() + " (" + c.getManaCost() + ")"); - } - - ii = 0; - CardList z = AIPlayables.getNotType("Land"); - while (cardsNeeded > 0 && z.size() > 1) { - - //if (z.size() < 1) - // throw new RuntimeException("BoosterDraftAI : buildDeck() error, deck does not have enough non-lands"); - Card c = z.get(MyRandom.random.nextInt(z.size() - 1)); - - //out.addMain(c.getName()); - outList.add(c); - cardsNeeded--; - AIPlayables.remove(c); - - z = AIPlayables.getNotType("Land"); - - if (Constant.Runtime.DevMode[0]) - System.out.println("NonLands[" + ii++ + "]:" + c.getName() + "(" + c.getManaCost() + ")"); - } - - CardList lands = AIPlayables.getType("Land"); - while (landsNeeded > 0 && lands.size() > 0) { - Card c = lands.get(0); - - outList.add(c); - landsNeeded--; - AIPlayables.remove(c); - - lands = AIPlayables.getType("Land"); - - if (Constant.Runtime.DevMode[0]) - System.out.println("Land:" + c.getName()); - } - - if (landsNeeded > 0) // attempt to optimize basic land counts according to color representation - { - CCnt ClrCnts[] = {new CCnt("Plains", 0), - new CCnt("Island", 0), - new CCnt("Swamp", 0), - new CCnt("Mountain", 0), - new CCnt("Forest", 0)}; - - // count each card color using mana costs - // TODO: count hybrid mana differently? - for (i = 0; i < outList.size(); i++) { - String mc = outList.get(i).getManaCost(); - - // count each mana symbol in the mana cost - for (int j = 0; j < mc.length(); j++) { - char c = mc.charAt(j); - - if (c == 'W') - ClrCnts[0].Count++; - else if (c == 'U') - ClrCnts[1].Count++; - else if (c == 'B') - ClrCnts[2].Count++; - else if (c == 'R') - ClrCnts[3].Count++; - else if (c == 'G') - ClrCnts[4].Count++; - } - } - - // total of all ClrCnts - int totalColor = 0; - for (i = 0; i < 5; i++) { - totalColor += ClrCnts[i].Count; - //tmpDeck += ClrCnts[i].Color + ":" + ClrCnts[i].Count + "\n"; - } - - //tmpDeck += "totalColor:" + totalColor + "\n"; - - for (i = 0; i < 5; i++) { - if (ClrCnts[i].Count > 0) { // calculate number of lands for each color - float p = (float) ClrCnts[i].Count / (float) totalColor; - int nLand = (int) ((float) landsNeeded * p) + 1; - //tmpDeck += "nLand-" + ClrCnts[i].Color + ":" + nLand + "\n"; - if (Constant.Runtime.DevMode[0]) - System.out.println("Basics[" + ClrCnts[i].Color + "]:" + nLand); - - // just to prevent a null exception by the deck size fixing code - //CardCounts.put(ClrCnts[i].Color, nLand); - - for (int j = 0; j <= nLand; j++) { - Card c = AllZone.getCardFactory().getCard(ClrCnts[i].Color, AllZone.getComputerPlayer()); - c.setCurSetCode(BoosterDraft.LandSetCode[0]); - outList.add(c); - landsNeeded--; - } - } - } - int n = 0; - while (landsNeeded > 0) { - if (ClrCnts[n].Count > 0) { - Card c = AllZone.getCardFactory().getCard(ClrCnts[n].Color, AllZone.getComputerPlayer()); - c.setCurSetCode(BoosterDraft.LandSetCode[0]); - outList.add(c); - landsNeeded--; - - if (Constant.Runtime.DevMode[0]) - System.out.println("AddBasics: " + c.getName()); - } - if (++n > 4) - n = 0; - } - } - - while (outList.size() > 40) { - Card c = outList.get(MyRandom.random.nextInt(outList.size() - 1)); - outList.remove(c); - AIPlayables.add(c); - } - - while (outList.size() < 40) { - Card c = AIPlayables.get(MyRandom.random.nextInt(AIPlayables.size() - 1)); - outList.add(c); - AIPlayables.remove(c); - } - if (outList.size() == 40) { - for (i = 0; i < outList.size(); i++) - out.addMain(outList.get(i).getName() + "|" + outList.get(i).getCurSetCode()); - - for (i = 0; i < AIPlayables.size(); i++) - out.addSideboard(AIPlayables.get(i).getName() + "|" + AIPlayables.get(i).getCurSetCode()); - - for (i = 0; i < dList.size(); i++) - out.addSideboard(dList.get(i).getName() + "|" + dList.get(i).getCurSetCode()); - } else - throw new RuntimeException("BoosterDraftAI : buildDeck() error, decksize not 40"); - - return out; - } - -/* private Deck getDeck(CardList list) - { - Deck out = new Deck(Constant.GameType.Draft); - for(int i = 0; i < list.size(); i++) - out.addMain(list.get(i).getName()); - - return out; - }//getDeck() - - //add Land to list argument - private void addLand(CardList list, String[] color) - { - Card land; - for(int i = 0; i < 9; i++) - { - land = AllZone.getCardFactory().getCard(colorToLand.get(color[0]).toString(), AllZone.getComputerPlayer()); - - land.setCurSetCode(land.getMostRecentSet()); - land.setImageFilename(CardUtil.buildFilename(land)); - - list.add(land); - - land = AllZone.getCardFactory().getCard(colorToLand.get(color[1]).toString(), AllZone.getComputerPlayer()); - - land.setCurSetCode(land.getMostRecentSet()); - land.setImageFilename(CardUtil.buildFilename(land)); - - list.add(land); - } - - //if(list.getType("Land").size() != 18) - //throw new RuntimeException("BoosterDraftAI : addLand() error, deck does not have 18 lands - " +list.getType("Land").size()); - - //if(list.size() != 40) - //throw new RuntimeException("BoosterDraftAI : addLand() error, deck is not 40 cards - " +list.size()); - }//addLand() -*/ - - //returns 7 different ints, within the range of 0-9 - - /** - *

getDeckColors.

- * - * @return an array of int. - */ - private int[] getDeckColors() { - int[] out = new int[nDecks]; - int start = MyRandom.random.nextInt(10); - - for (int i = 0; i < out.length; i++) { - //% to get an index between 0 and deckColorChoices.length - out[i] = start % deckColorChoices.length; - start++; - } - testColors(out); - - return out; - }//getDeckColors() - - /** - *

Constructor for BoosterDraftAI.

- */ - public BoosterDraftAI() { - //choose colors for decks - int[] n = getDeckColors(); - for (int i = 0; i < n.length; i++) - deckColor[i] = deckColorChoices[n[i]]; - - //initilize color map - colorToLand.put(Constant.Color.Black, "Swamp"); - colorToLand.put(Constant.Color.Blue, "Island"); - colorToLand.put(Constant.Color.Green, "Forest"); - colorToLand.put(Constant.Color.Red, "Mountain"); - colorToLand.put(Constant.Color.White, "Plains"); - - //initilize deck array and playerColors list - for (int i = 0; i < deck.length; i++) { - deck[i] = new CardList(); - playerColors.add(new DeckColors()); - } - - }//BoosterDraftAI() - - - private ArrayList playerColors = new ArrayList(); - - //all 10 two color combinations - private String[][] deckColorChoices = - { - {Constant.Color.Black, Constant.Color.Blue}, - {Constant.Color.Black, Constant.Color.Green}, - {Constant.Color.Black, Constant.Color.Red}, - {Constant.Color.Black, Constant.Color.White}, - - {Constant.Color.Blue, Constant.Color.Green}, - {Constant.Color.Blue, Constant.Color.Red}, - {Constant.Color.Blue, Constant.Color.White}, - - {Constant.Color.Green, Constant.Color.Red}, - {Constant.Color.Green, Constant.Color.White}, - - {Constant.Color.Red, Constant.Color.White} - }; - - private Comparator bestCreature = new Comparator() { - public int compare(Card a, Card b) { - int cmcA = a.getCMC(); - if (cmcA == 0) - cmcA = 1; - cmcA *= 10; - - int cmcB = b.getCMC(); - if (cmcB == 0) - cmcB = 1; - cmcB *= 10; - - int attA = a.getBaseAttack() * 10; - int attB = b.getBaseAttack() * 10; - - int defA = a.getBaseDefense() * 10; - int defB = b.getBaseDefense() * 10; - - int keyA = a.getKeyword().size() * 10; - int keyB = b.getKeyword().size() * 10; - - int abA = a.getSpellAbility().length * 10; - int abB = b.getSpellAbility().length * 10; - - int trgA = a.getTriggers().size() * 10; - int trgB = b.getTriggers().size() * 10; - - int rarA = 0; - int rarB = 0; - - if (a.getCurSetRarity().equals("Common")) - rarA = 1; - else if (a.getCurSetRarity().equals("Uncommon")) - rarA = 2; - else if (a.getCurSetRarity().equals("Rare")) - rarA = 4; - else if (a.getCurSetRarity().equals("Mythic")) - rarA = 8; - - if (b.getCurSetRarity().equals("Common")) - rarB = 1; - else if (b.getCurSetRarity().equals("Uncommon")) - rarB = 2; - else if (b.getCurSetRarity().equals("Rare")) - rarB = 4; - else if (b.getCurSetRarity().equals("Mythic")) - rarB = 8; - -/** - *

Constructor for deckColors.

- * - * @param c1 a {@link java.lang.String} object. - * @param c2 a {@link java.lang.String} object. - * @param sp a {@link java.lang.String} object. - */ - - int scoreA = ((attA + defA) / cmcA) + keyA + abA + trgA + rarA; - int scoreB = ((attB + defB) / cmcB) + keyB + abB + trgB + rarB; - - if (scoreA == scoreB) - return 0; - /** - *

Constructor for deckColors.

- */ - else if (scoreA > scoreB) - return 1; - else if (scoreB > scoreA) - return -1; -/** - *

ColorToMana.

- * - * @param color a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - - return 0; - } - }; -}//BoosterDraftAI() - - - - diff --git a/src/forge/BoosterGenerator.java b/src/forge/BoosterGenerator.java deleted file mode 100644 index 89baea5e79d..00000000000 --- a/src/forge/BoosterGenerator.java +++ /dev/null @@ -1,320 +0,0 @@ -package forge; - -import forge.deck.Deck; -import forge.deck.DeckManager; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -/** - *

BoosterGenerator class.

- * - * @author Forge - * @version $Id: $ - */ -public class BoosterGenerator { - private CardList commons = new CardList(); - private CardList uncommons = new CardList(); - private CardList rares = new CardList(); - private CardList mythics = new CardList(); - private CardList specials = new CardList(); - - private int iCommons = 0; - private int iUncommons = 0; - private int iRares = 0; - private int iMythics = 0; - private int iSpecials = 0; - - private int numCommons = 0; - private int numUncommons = 0; - private int numRares = 0; - private int numMythics = 0; - private int numSpecials = 0; - - //private Random r = new Random(); - - /** - *

Constructor for BoosterGenerator.

- */ - public BoosterGenerator() { - numCommons = 11; - numUncommons = 3; - numRares = 1; - numMythics = 0; - numSpecials = 0; - - for (Card c : AllZone.getCardFactory()) { - SetInfo si = SetInfoUtil.getSetInfo_Code(c.getSets(), SetInfoUtil.getMostRecentSet(c.getSets())); - - addToRarity(c, si); - } - - shuffleAll(); - -/* //reduce cardpool to approximate the size of a small set (175) for better drafting in full mode - tList.clear(); - for (int i=0; i<100; i++) // 8 x 11 x 3 commons = 264 cards with each card showing up about once per round - tList.add(commons.get(i)); - commons.clear(); - commons.addAll(tList); - - tList.clear(); - for (int i=0; i<50; i++) // 8 x 3 x 3 uncommons = 72 cards with some cards showing up twice - tList.add(uncommons.get(i)); - uncommons.clear(); - uncommons.addAll(tList); - - tList.clear(); - for (int i=0; i<25; i++) // 8 x 1 x 3 rares = 24 cards with no cards - tList.add(rares.get(i)); - rares.clear(); - rares.addAll(tList); - - // don't worry about reducing the mythics -*/ } - - /** - *

Constructor for BoosterGenerator.

- * - * @param DeckFile a {@link java.lang.String} object. - * @param nCommons a int. - * @param nUncommons a int. - * @param nRares a int. - * @param nMythics a int. - * @param nSpecials a int. - * @param ignoreRarity a boolean. - */ - public BoosterGenerator(String DeckFile, int nCommons, int nUncommons, int nRares, int nMythics, int nSpecials, boolean ignoreRarity) { - numCommons = nCommons; - numUncommons = nUncommons; - numRares = nRares; - numMythics = nMythics; - numSpecials = nSpecials; - - //DeckManager dio = new DeckManager(ForgeProps.getFile(NewConstants.NEW_DECKS)); - DeckManager dio = AllZone.getDeckManager(); - Deck dPool = dio.getDeck(DeckFile); - if (dPool == null) - throw new RuntimeException("BoosterGenerator : deck not found - " + DeckFile); - - CardList cList = new CardList(); - List tList = dPool.getMain(); - - for (int i = 0; i < tList.size(); i++) { - String cardName = tList.get(i); - String setCode = ""; - if (cardName.contains("|")) { - String s[] = cardName.split("\\|", 2); - cardName = s[0]; - setCode = s[1]; - } - - Card c = AllZone.getCardFactory().getCard(cardName, AllZone.getHumanPlayer()); - - if (!setCode.equals("")) - c.setCurSetCode(setCode); - else if ((c.getSets().size() > 0)) // && card.getCurSetCode().equals("")) - c.setRandomSetCode(); - - cList.add(c); - } - - - for (int i = 0; i < cList.size(); i++) { - Card c = cList.get(i); - SetInfo si = null; - if (c.getCurSetCode().equals("")) - si = SetInfoUtil.getSetInfo_Code(c.getSets(), SetInfoUtil.getMostRecentSet(c.getSets())); - else - si = SetInfoUtil.getSetInfo_Code(c.getSets(), c.getCurSetCode()); - - if (ignoreRarity) - commons.add(c); - else - addToRarity(c, si); - } - - shuffleAll(); - } - - /** - *

Constructor for BoosterGenerator.

- * - * @param SetCode a {@link java.lang.String} object. - */ - public BoosterGenerator(final String SetCode) { - numCommons = 0; - numUncommons = 0; - numRares = 0; - numMythics = 0; - numSpecials = 0; - - for (Card c : AllZone.getCardFactory()) { - SetInfo si = SetInfoUtil.getSetInfo_Code(c.getSets(), SetCode); - - if (si != null) { - c.setCurSetCode(SetCode); - - Random r = new Random(); - int n = si.PicCount; - if (n > 1) - c.setRandomPicture(r.nextInt(n - 1) + 1); - - addToRarity(c, si); - } - } - - shuffleAll(); - - ArrayList bpData = FileUtil.readFile("res/boosterdata/" + SetCode + ".pack"); - - for (String line : bpData) { - if (line.startsWith("Commons:")) { - numCommons = Integer.parseInt(line.substring(8)); - } else if (line.startsWith("Uncommons:")) { - numUncommons = Integer.parseInt(line.substring(10)); - } else if (line.startsWith("Rares:")) { - numRares = Integer.parseInt(line.substring(6)); - } else if (line.startsWith("Mythics:")) { - numMythics = Integer.parseInt(line.substring(8)); - } else if (line.startsWith("Specials:")) { - numSpecials = Integer.parseInt(line.substring(9)); - } - - } - - if (Constant.Runtime.DevMode[0]) { - System.out.println("numCommons: " + numCommons); - System.out.println("numUncommons: " + numUncommons); - System.out.println("numRares: " + numRares); - System.out.println("numMythics: " + numMythics); - System.out.println("numSpecials: " + numSpecials); - } - - } - - /** - *

addToRarity.

- * - * @param c a {@link forge.Card} object. - * @param si a {@link forge.SetInfo} object. - */ - private void addToRarity(Card c, SetInfo si) { - if (si != null) { - if (si.Rarity.equals("Common")) - commons.add(c); - else if (si.Rarity.equals("Uncommon")) - uncommons.add(c); - else if (si.Rarity.equals("Rare")) - rares.add(c); - else if (si.Rarity.equals("Mythic")) - mythics.add(c); - else if (si.Rarity.equals("Special")) - specials.add(c); - } - } - - /** - *

shuffleAll.

- */ - private void shuffleAll() { - - if (commons.size() > 0) - commons.shuffle(); - - if (uncommons.size() > 0) - uncommons.shuffle(); - - if (rares.size() > 0) - rares.shuffle(); - - if (mythics.size() > 0) - mythics.shuffle(); - - if (specials.size() > 0) - specials.shuffle(); - - if (Constant.Runtime.DevMode[0]) { - System.out.println("commons.size: " + commons.size()); - System.out.println("uncommons.size: " + uncommons.size()); - System.out.println("rares.size: " + rares.size()); - System.out.println("mythics.size: " + mythics.size()); - System.out.println("specials.size: " + specials.size()); - } - } - - /** - *

getBoosterPack.

- * - * @return a {@link forge.CardList} object. - */ - public CardList getBoosterPack() { - CardList temp = new CardList(); - - int i = 0; - - if (commons.size() > numCommons) { - for (i = 0; i < numCommons; i++) { - if (iCommons >= commons.size()) - iCommons = 0; - - temp.add(commons.get(iCommons++)); - } - } - - if (uncommons.size() > numUncommons) { - for (i = 0; i < numUncommons; i++) { - if (iUncommons >= uncommons.size()) - iUncommons = 0; - - temp.add(uncommons.get(iUncommons++)); - } - } - - for (i = 0; i < numRares; i++) { - if (numMythics > 0) { - if (mythics.size() > numMythics) { - if (MyRandom.random.nextInt(8) <= 1) { - if (iMythics >= mythics.size()) - iMythics = 0; - - temp.add(mythics.get(iMythics++)); - } else { - if (iRares >= rares.size()) - iRares = 0; - - temp.add(rares.get(iRares++)); - } - } - } else { - if (rares.size() > numRares) { - if (iRares >= rares.size()) - iRares = 0; - - temp.add(rares.get(iRares++)); - } - } - } - - if (specials.size() > numSpecials) { - for (i = 0; i < numSpecials; i++) { - if (iSpecials >= specials.size()) - iSpecials = 0; - - temp.add(specials.get(iSpecials++)); - } - } - - return temp; - } - - /** - *

getBoosterPackSize.

- * - * @return a int. - */ - public int getBoosterPackSize() { - return numCommons + numUncommons + numRares + numSpecials; - } -} diff --git a/src/forge/ButtonUtil.java b/src/forge/ButtonUtil.java deleted file mode 100644 index dfc17021629..00000000000 --- a/src/forge/ButtonUtil.java +++ /dev/null @@ -1,84 +0,0 @@ -package forge; - -/** - *

ButtonUtil class.

- * - * @author Forge - * @version $Id: $ - */ -public class ButtonUtil { - /** - *

reset.

- */ - public static void reset() { - getOK().setText("OK"); - getCancel().setText("Cancel"); - - getOK().setSelectable(false); - getCancel().setSelectable(false); - } - - /** - *

enableOnlyOK.

- */ - public static void enableOnlyOK() { - getOK().setSelectable(true); - getCancel().setSelectable(false); - } - - /** - *

enableOnlyCancel.

- */ - public static void enableOnlyCancel() { - getOK().setSelectable(false); - getCancel().setSelectable(true); - } - - /** - *

disableAll.

- */ - public static void disableAll() { - getOK().setSelectable(false); - getCancel().setSelectable(false); - } - - /** - *

enableAll.

- */ - public static void enableAll() { - getOK().setSelectable(true); - getCancel().setSelectable(true); - } - - /** - *

disableOK.

- */ - public static void disableOK() { - getOK().setSelectable(false); - } - - /** - *

disableCancel.

- */ - public static void disableCancel() { - getCancel().setSelectable(false); - } - - /** - *

getOK.

- * - * @return a {@link forge.MyButton} object. - */ - private static MyButton getOK() { - return AllZone.getDisplay().getButtonOK(); - } - - /** - *

getCancel.

- * - * @return a {@link forge.MyButton} object. - */ - private static MyButton getCancel() { - return AllZone.getDisplay().getButtonCancel(); - } -} diff --git a/src/forge/Card.java b/src/forge/Card.java deleted file mode 100644 index c486d641237..00000000000 --- a/src/forge/Card.java +++ /dev/null @@ -1,5800 +0,0 @@ -package forge; - - -import com.esotericsoftware.minlog.Log; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.mana.ManaCost; -import forge.card.spellability.Ability_Mana; -import forge.card.spellability.Ability_Triggered; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.Spell_Permanent; -import forge.card.staticAbility.StaticAbility; -import forge.card.trigger.Trigger; - -import java.util.*; -import java.util.Map.Entry; - -/** - *

Card class.

- * - * Can now be used as keys in Tree data structures. The comparison is based - * entirely on getUniqueNumber(). - * - * @author Forge - * @version $Id: $ - */ -public class Card extends MyObservable implements Comparable { - private static int nextUniqueNumber = 1; - private int uniqueNumber = nextUniqueNumber++; - - private long value; - - private Map triggeringObjects = new TreeMap(); - private ArrayList triggers = new ArrayList(); - private ArrayList intrinsicAbility = new ArrayList(); - private ArrayList staticAbilityStrings = new ArrayList(); - private ArrayList intrinsicKeyword = new ArrayList(); - private ArrayList extrinsicKeyword = new ArrayList(); - private ArrayList HiddenExtrinsicKeyword = new ArrayList(); //Hidden keywords won't be displayed on the card - private ArrayList prevIntrinsicKeyword = new ArrayList(); - private ArrayList attached = new ArrayList(); - private ArrayList equippedBy = new ArrayList(); //which equipment cards are equipping this card? - //equipping size will always be 0 or 1 - private ArrayList equipping = new ArrayList(); //if this card is of the type equipment, what card is it currently equipping? - private ArrayList enchantedBy = new ArrayList(); //which auras enchanted this card? - //enchanting size will always be 0 or 1 - private ArrayList enchanting = new ArrayList(); //if this card is an Aura, what card is it enchanting? - private ArrayList type = new ArrayList(); - private ArrayList prevType = new ArrayList(); - private ArrayList ChoicesMade = new ArrayList(); - private ArrayList Targets_for_Choices = new ArrayList(); - private ArrayList spellAbility = new ArrayList(); - private ArrayList manaAbility = new ArrayList(); - private ArrayList cardColor = new ArrayList(); - private ArrayList changedCardTypes = new ArrayList(); //changes by AF animate and continuous static effects - private ArrayList staticAbilities = new ArrayList(); - - private ArrayList rememberedObjects = new ArrayList(); - private ArrayList imprintedCards = new ArrayList(); - private Card championedCard = null; - private CardList devouredCards = new CardList(); - - private Map receivedDamageFromThisTurn = new TreeMap(); - private Map dealtDamageToThisTurn = new TreeMap(); - private Map assignedDamageMap = new TreeMap(); - - private boolean unCastable; - private boolean drawnThisTurn = false; - private boolean tapped; - private boolean sickness = true; //summoning sickness - private boolean token = false; - private boolean copiedToken = false; - private boolean copiedSpell = false; - private boolean SpellwithChoices = false; - private boolean SpellCopyingCard = false; - private boolean creatureAttackedThisTurn = false; - private boolean creatureAttackedThisCombat = false; - private boolean creatureBlockedThisCombat = false; - private boolean creatureGotBlockedThisCombat = false; - private boolean dealtDmgToHumanThisTurn = false; - private boolean dealtDmgToComputerThisTurn = false; - private boolean sirenAttackOrDestroy = false; - - private boolean faceDown = false; - private boolean kicked = false; - private boolean evoked = false; - - private boolean levelUp = false; - private boolean bounceAtUntap = false; - private boolean finishedEnteringBF = false; - - private boolean flashback = false; - private boolean unearth = false; - private boolean unearthed; - - private boolean madness = false; - private boolean suspendCast = false; - private boolean suspend = false; - - //for Vanguard / Manapool / Emblems etc. - private boolean isImmutable = false; - - private long timestamp = -1; // permanents on the battlefield - - private int baseAttack = 0; - private int baseDefense = 0; - private ArrayList newPT = new ArrayList(); // stack of set power/toughness - private int baseLoyalty = 0; - private String baseAttackString = null; - private String baseDefenseString = null; - - private int damage; - - private int nShield; // regeneration - private int preventNextDamage = 0; - - private int turnInZone; - - private int tempAttackBoost = 0; - private int tempDefenseBoost = 0; - - private int semiPermanentAttackBoost = 0; - private int semiPermanentDefenseBoost = 0; - - private int randomPicture = 0; - - private int xManaCostPaid = 0; - - private int xLifePaid = 0; - - private int multiKickerMagnitude = 0; - private int replicateMagnitude = 0; - - private int sunburstValue = 0; - private String colorsPaid = ""; - - private Player owner = null; - private Player controller = null; - private String name = ""; - private String imageName = ""; - private String rarity = ""; - private String text = ""; - private String manaCost = ""; - private String echoCost = ""; - private String madnessCost = ""; - private String chosenType = ""; - private String chosenColor = ""; - private String namedCard = ""; - - private Card cloneOrigin = null; - private ArrayList clones = new ArrayList(); - private Card currentlyCloningCard = null; - private Command cloneLeavesPlayCommand = null; - private ArrayList gainControlTargets = new ArrayList(); - private ArrayList gainControlReleaseCommands = new ArrayList(); - - private ArrayList zcTriggers = new ArrayList(); - private ArrayList turnFaceUpCommandList = new ArrayList(); - private ArrayList equipCommandList = new ArrayList(); - private ArrayList unEquipCommandList = new ArrayList(); - private ArrayList enchantCommandList = new ArrayList(); - private ArrayList unEnchantCommandList = new ArrayList(); - private ArrayList untapCommandList = new ArrayList(); - private ArrayList changeControllerCommandList = new ArrayList(); - private ArrayList replaceMoveToGraveyardCommandList = new ArrayList(); - private ArrayList cycleCommandList = new ArrayList(); - - private Map counters = new TreeMap(); - private Map SVars = new TreeMap(); - - //hacky code below, used to limit the number of times an ability - //can be used per turn like Vampire Bats - //should be put in SpellAbility, but it is put here for convienance - //this is make public just to make things easy - //this code presumes that each card only has one ability that can be - //used a limited number of times per turn - //CardFactory.SSP_canPlay(Card) uses these variables - - // Only used with Replicate - private int abilityUsed; - - public static void resetUniqueNumber(){ - nextUniqueNumber = 1; - } - - public void addDevoured(Card c) - { - devouredCards.add(c); - } - - public void clearDevoured() - { - devouredCards.clear(); - } - - public CardList getDevoured() - { - return devouredCards; - } - - /** - *

addRemembered.

- * - * @param o a {@link java.lang.Object} object. - */ - public void addRemembered(Object o) { - rememberedObjects.add(o); - } - - /** - *

getRemembered.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getRemembered() { - return rememberedObjects; - } - - /** - *

clearRemembered.

- */ - public void clearRemembered() { - rememberedObjects.clear(); - } - - /** - *

addImprinted.

- * - * @param c a {@link forge.Card} object. - */ - public void addImprinted(Card c) { - imprintedCards.add(c); - } - - /** - *

addImprinted.

- * - * @param list a {@link java.util.ArrayList} object. - */ - public void addImprinted(ArrayList list) { - imprintedCards.addAll(list); - } - - /** - *

getImprinted.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getImprinted() { - return imprintedCards; - } - - /** - *

clearImprinted.

- */ - public void clearImprinted() { - imprintedCards.clear(); - } - - /** - *

Setter for the field championedCard.

- * - * @param c a {@link forge.Card} object. - * @since 1.0.15 - */ - public void setChampionedCard(Card c) { - championedCard = c; - } - - /** - *

Getter for the field championedCard.

- * - * @return a {@link forge.Card} object. - * @since 1.0.15 - */ - public Card getChampionedCard() { - return championedCard; - } - - /** - *

addTrigger.

- * - * @param t a {@link forge.card.trigger.Trigger} object. - * @return a {@link forge.card.trigger.Trigger} object. - */ - public Trigger addTrigger(Trigger t) { - Trigger newtrig = t.getCopy(); - newtrig.setHostCard(this); - triggers.add(newtrig); - return newtrig; - } - - /** - *

removeTrigger.

- * - * @param t a {@link forge.card.trigger.Trigger} object. - */ - public void removeTrigger(Trigger t) { - triggers.remove(t); - } - - /** - *

Getter for the field triggers.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getTriggers() { - return triggers; - } - - /** - *

getNamedTrigger.

- * - * @param name a {@link java.lang.String} object. - * @return a {@link forge.card.trigger.Trigger} object. - */ - public Trigger getNamedTrigger(String name) { - for (Trigger t : triggers) { - if (t.getName() != null && t.getName().equals(name)) { - return t; - } - } - - return null; - } - - /** - *

Setter for the field triggers.

- * - * @param trigs a {@link java.util.ArrayList} object. - */ - public void setTriggers(ArrayList trigs) { - for (Trigger t : trigs) { - Trigger newtrig = t.getCopy(); - newtrig.setHostCard(this); - triggers.add(newtrig); - } - } - - /** - *

clearTriggersNew.

- */ - public void clearTriggersNew() { - triggers.clear(); - } - - /** - *

getTriggeringObject.

- * - * @param type a {@link java.lang.String} object. - * @return a {@link java.lang.Object} object. - */ - public Object getTriggeringObject(String type) { - return triggeringObjects.get(type); - } - - /** - field abilityUsed.

- * - * @param i a int. - */ - public void setAbilityUsed(int i) { - abilityUsed = i; - } - - - /** - *

Getter for the field abilityUsed.

- * - * @return a int. - */ - public int getAbilityUsed() { - return abilityUsed; - } - - /** - *

Getter for the field sunburstValue.

- * - * @return a int. - */ - public int getSunburstValue() { - return sunburstValue; - } - - /** - *

Setter for the field colorsPaid.

- * - * @param s a String - */ - public void setColorsPaid(String s) { - colorsPaid = s; - } - - /** - *

Getter for the field colorsPaid.

- * - * @return a String. - */ - public String getColorsPaid() { - return colorsPaid; - } - - /** - *

Setter for the field sunburstValue.

- * - * @param value a int. - */ - public void setSunburstValue(int value) { - sunburstValue = value; - } - - /** - *

addXManaCostPaid.

- * - * @param n a int. - */ - public void addXManaCostPaid(int n) { - xManaCostPaid += n; - } - - /** - *

Setter for the field xManaCostPaid.

- * - * @param n a int. - */ - public void setXManaCostPaid(int n) { - xManaCostPaid = n; - } - - /** - *

Getter for the field xManaCostPaid.

- * - * @return a int. - */ - public int getXManaCostPaid() { - return xManaCostPaid; - } - - /** - *

Setter for the field xLifePaid.

- * - * @param n a int. - */ - public void setXLifePaid(int n) { - xLifePaid = n; - } - - /** - *

Getter for the field xLifePaid.

- * - * @return a int. - */ - public int getXLifePaid() { - return xLifePaid; - } - - //used to see if an attacking creature with a triggering attack ability triggered this phase: - /** - *

Setter for the field creatureAttackedThisCombat.

- * - * @param b a boolean. - */ - public void setCreatureAttackedThisCombat(boolean b) { - creatureAttackedThisCombat = b; - if (true == b) { - setCreatureAttackedThisTurn(true); - } - } - - /** - *

Getter for the field creatureAttackedThisCombat.

- * - * @return a boolean. - */ - public boolean getCreatureAttackedThisCombat() { - return creatureAttackedThisCombat; - } - - /** - *

Setter for the field creatureAttackedThisTurn.

- * - * @param b a boolean. - */ - public void setCreatureAttackedThisTurn(boolean b) { - creatureAttackedThisTurn = b; - } - - /** - *

Getter for the field creatureAttackedThisTurn.

- * - * @return a boolean. - */ - public boolean getCreatureAttackedThisTurn() { - return creatureAttackedThisTurn; - } - - /** - *

Setter for the field creatureBlockedThisCombat.

- * - * @param b a boolean. - */ - public void setCreatureBlockedThisCombat(boolean b) { - creatureBlockedThisCombat = b; - } - - /** - *

Getter for the field creatureBlockedThisCombat.

- * - * @return a boolean. - */ - public boolean getCreatureBlockedThisCombat() { - return creatureBlockedThisCombat; - } - - /** - *

Setter for the field creatureGotBlockedThisCombat.

- * - * @param b a boolean. - */ - public void setCreatureGotBlockedThisCombat(boolean b) { - creatureGotBlockedThisCombat = b; - } - - /** - *

Getter for the field creatureGotBlockedThisCombat.

- * - * @return a boolean. - */ - public boolean getCreatureGotBlockedThisCombat() { - return creatureGotBlockedThisCombat; - } - /* - public void setDealtCombatDmgToOppThisTurn(boolean b) { - dealtCombatDmgToOppThisTurn = b; - } - - public boolean getDealtCombatDmgToOppThisTurn() { - return dealtCombatDmgToOppThisTurn; - }*/ - - /** - *

canAnyPlayerActivate.

- * - * @return a boolean. - */ - public boolean canAnyPlayerActivate() { - for (SpellAbility s : spellAbility) { - if (s.getRestrictions().getAnyPlayer()) - return true; - } - return false; - } - - /** - *

Setter for the field dealtDmgToHumanThisTurn.

- * - * @param b a boolean. - */ - public void setDealtDmgToHumanThisTurn(boolean b) { - dealtDmgToHumanThisTurn = b; - } - - /** - *

Getter for the field dealtDmgToHumanThisTurn.

- * - * @return a boolean. - */ - public boolean getDealtDmgToHumanThisTurn() { - return dealtDmgToHumanThisTurn; - } - - /** - *

Setter for the field dealtDmgToComputerThisTurn.

- * - * @param b a boolean. - */ - public void setDealtDmgToComputerThisTurn(boolean b) { - dealtDmgToComputerThisTurn = b; - } - - /** - *

Getter for the field dealtDmgToComputerThisTurn.

- * - * @return a boolean. - */ - public boolean getDealtDmgToComputerThisTurn() { - return dealtDmgToComputerThisTurn; - } - - /** - *

Setter for the field sirenAttackOrDestroy.

- * - * @param b a boolean. - */ - public void setSirenAttackOrDestroy(boolean b) { - sirenAttackOrDestroy = b; - } - - /** - *

Getter for the field sirenAttackOrDestroy.

- * - * @return a boolean. - */ - public boolean getSirenAttackOrDestroy() { - return sirenAttackOrDestroy; - } - - /** - *

Getter for the field clones.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getClones() { - return clones; - } - - /** - *

Setter for the field clones.

- * - * @param c a {@link java.util.ArrayList} object. - */ - public void setClones(ArrayList c) { - clones.clear(); - clones.addAll(c); - } - - /** - *

addClone.

- * - * @param c a {@link forge.Card} object. - */ - public void addClone(Card c) { - clones.add(c); - } - - /** - *

addClones.

- * - * @param c a {@link java.util.ArrayList} object. - */ - public void addClones(ArrayList c) { - clones.addAll(c); - } - - /** - *

clearClones.

- */ - public void clearClones() { - clones.clear(); - } - - /** - *

Getter for the field cloneOrigin.

- * - * @return a {@link forge.Card} object. - */ - public Card getCloneOrigin() { - return cloneOrigin; - } - - /** - *

Setter for the field cloneOrigin.

- * - * @param name a {@link forge.Card} object. - */ - public void setCloneOrigin(Card name) { - cloneOrigin = name; - } - - /** - *

Getter for the field cloneLeavesPlayCommand.

- * - * @return a {@link forge.Command} object. - */ - public Command getCloneLeavesPlayCommand() { - return cloneLeavesPlayCommand; - } - - /** - *

Setter for the field cloneLeavesPlayCommand.

- * - * @param com a {@link forge.Command} object. - */ - public void setCloneLeavesPlayCommand(Command com) { - cloneLeavesPlayCommand = com; - } - - /** - *

Getter for the field currentlyCloningCard.

- * - * @return a {@link forge.Card} object. - */ - public Card getCurrentlyCloningCard() { - return currentlyCloningCard; - } - - /** - *

Setter for the field currentlyCloningCard.

- * - * @param c a {@link forge.Card} object. - */ - public void setCurrentlyCloningCard(Card c) { - currentlyCloningCard = c; - } - - /** - *

Getter for the field sacrificeAtEOT.

- * - * @return a boolean. - */ - public boolean getSacrificeAtEOT() { - return hasKeyword("At the beginning of the end step, sacrifice CARDNAME."); - } - - /** - *

Getter for the field bounceAtUntap.

- * - * @return a boolean. - */ - public boolean getBounceAtUntap() { - return bounceAtUntap; - } - - /** - *

Setter for the field bounceAtUntap.

- * - * @param bounce a boolean. - */ - public void setBounceAtUntap(boolean bounce) { - this.bounceAtUntap = bounce; - } - - /** - *

Getter for the field finishedEnteringBF.

- * - * @return a boolean. - */ - public boolean getFinishedEnteringBF() { - return finishedEnteringBF; - } - - /** - *

Setter for the field finishedEnteringBF.

- * - * @param b a boolean. - */ - public void setFinishedEnteringBF(boolean b) { - this.finishedEnteringBF = b; - } - - /** - *

hasFirstStrike.

- * - * @return a boolean. - */ - public boolean hasFirstStrike() { - return hasKeyword("First Strike"); - } - - /** - *

hasDoubleStrike.

- * - * @return a boolean. - */ - public boolean hasDoubleStrike() { - return hasKeyword("Double Strike"); - } - - /** - *

hasSecondStrike.

- * - * @return a boolean. - */ - public boolean hasSecondStrike() { - return hasDoubleStrike() || !hasFirstStrike(); - } - - //for costs (like Planeswalker abilities) Doubling Season gets ignored. - /** - *

addCounterFromNonEffect.

- * - * @param counterName a {@link forge.Counters} object. - * @param n a int. - */ - public void addCounterFromNonEffect(Counters counterName, int n) { - if (this.hasKeyword("CARDNAME can't have counters placed on it.")) - return; - if (counters.containsKey(counterName)) { - Integer aux = counters.get(counterName) + n; - counters.put(counterName, aux); - } else { - counters.put(counterName, Integer.valueOf(n)); - } - - if (counterName.equals(Counters.P1P1) || counterName.equals(Counters.M1M1)) { - // +1/+1 counters should erase -1/-1 counters - int plusOneCounters = 0; - int minusOneCounters = 0; - - Counters p1Counter = Counters.P1P1; - Counters m1Counter = Counters.M1M1; - if (counters.containsKey(p1Counter)) - plusOneCounters = counters.get(p1Counter); - if (counters.containsKey(m1Counter)) - minusOneCounters = counters.get(m1Counter); - - if (plusOneCounters == minusOneCounters) { - counters.remove(m1Counter); - counters.remove(p1Counter); - } - if (plusOneCounters > minusOneCounters) { - counters.remove(m1Counter); - counters.put(p1Counter, (Integer) (plusOneCounters - minusOneCounters)); - } else { - counters.put(m1Counter, (Integer) (minusOneCounters - plusOneCounters)); - counters.remove(p1Counter); - } - } - - ///////////////// - // - // Not sure if we want to fire triggers on addCounterFromNonEffect - // I don't think so since reverting cost payments uses this. - - /* - //Run triggers - HashMap runParams = new HashMap(); - runParams.put("Card", this); - runParams.put("CounterType", counterName); - AllZone.getTriggerHandler().runTrigger("CounterAdded", runParams); - */ - - this.updateObservers(); - } - - /** - *

addCounter.

- * - * @param counterName a {@link forge.Counters} object. - * @param n a int. - */ - public void addCounter(Counters counterName, int n) { - if (this.hasKeyword("CARDNAME can't have counters placed on it.")) - return; - int multiplier = AllZoneUtil.getDoublingSeasonMagnitude(this.getController()); - if (counters.containsKey(counterName)) { - Integer aux = counters.get(counterName) + (multiplier * n); - counters.put(counterName, aux); - } else { - counters.put(counterName, Integer.valueOf(multiplier * n)); - } - - //Run triggers - Map runParams = new TreeMap(); - runParams.put("Card", this); - runParams.put("CounterType", counterName); - for (int i = 0; i < (multiplier * n); i++) { - AllZone.getTriggerHandler().runTrigger("CounterAdded", runParams); - } - - if (counterName.equals(Counters.P1P1) || counterName.equals(Counters.M1M1)) { - // +1/+1 counters should erase -1/-1 counters - int plusOneCounters = 0; - int minusOneCounters = 0; - - Counters p1Counter = Counters.P1P1; - Counters m1Counter = Counters.M1M1; - if (counters.containsKey(p1Counter)) - plusOneCounters = counters.get(p1Counter); - if (counters.containsKey(m1Counter)) - minusOneCounters = counters.get(m1Counter); - - if (plusOneCounters == minusOneCounters) { - counters.remove(m1Counter); - counters.remove(p1Counter); - } - if (plusOneCounters > minusOneCounters) { - counters.remove(m1Counter); - counters.put(p1Counter, (Integer) (plusOneCounters - minusOneCounters)); - } else { - counters.put(m1Counter, (Integer) (minusOneCounters - plusOneCounters)); - counters.remove(p1Counter); - } - } - - AllZone.getGameAction().checkStateEffects(); - - this.updateObservers(); - } - - /** - *

subtractCounter.

- * - * @param counterName a {@link forge.Counters} object. - * @param n a int. - */ - public void subtractCounter(Counters counterName, int n) { - if (counters.containsKey(counterName)) { - Integer aux = counters.get(counterName) - n; - if (aux < 0) - aux = 0; - counters.put(counterName, aux); - if (counterName.equals(Counters.TIME) && aux == 0) { - boolean hasVanish = CardFactoryUtil.hasKeyword(this, "Vanishing") != -1; - - if (hasVanish && AllZoneUtil.isCardInPlay(this)) - AllZone.getGameAction().sacrifice(this); - - if (hasSuspend() && AllZoneUtil.isCardExiled(this)) { - final Card c = this; - - c.setSuspendCast(true); - // set activating player for base spell ability - c.getSpellAbility()[0].setActivatingPlayer(c.getOwner()); - // Any trigger should cause the phase not to skip - AllZone.getPhase().setSkipPhase(false); - AllZone.getGameAction().playCardNoCost(c); - } - } - - AllZone.getGameAction().checkStateEffects(); - - this.updateObservers(); - } - } - - /** - *

Getter for the field counters.

- * - * @param counterName a {@link forge.Counters} object. - * @return a int. - */ - public int getCounters(Counters counterName) { - if (counters.containsKey(counterName)) { - return counters.get(counterName); - } else return 0; - } - - //get all counters from a card - /** - *

Getter for the field counters.

- * - * @return a Map object. - * @since 1.0.15 - */ - public Map getCounters() { - return counters; - } - - /** - *

hasCounters.

- * - * @return a boolean. - */ - public boolean hasCounters() { - return counters.size() > 0; - } - - /** - *

setCounter.

- * - * @param counterName a {@link forge.Counters} object. - * @param n a int. - * @param bSetValue a boolean. - */ - public void setCounter(Counters counterName, int n, boolean bSetValue) { - if (this.hasKeyword("CARDNAME can't have counters placed on it.")) - return; - if (bSetValue) // sometimes you just need to set the value without being affected by DoublingSeason - counters.put(counterName, Integer.valueOf(n)); - else { - int num = getCounters(counterName); - if (num < n) // if counters on card is less than the setting value, addCounters - addCounter(counterName, n - num); - else - subtractCounter(counterName, num - n); - } - this.updateObservers(); - } - - //get all counters from a card - /** - *

Setter for the field counters.

- * - * @param allCounters a Map object. - * @since 1.0.15 - */ - public void setCounters(Map allCounters) { - counters = allCounters; - } - - //get all counters from a card - /** - *

clearCounters.

- * - * @since 1.0.15 - */ - public void clearCounters() { - counters = new TreeMap(); - } - - /** - * hasLevelUp() - checks to see if a creature has the "Level up" ability introduced in Rise of the Eldrazi - * - * @return true if this creature can "Level up", false otherwise - */ - public boolean hasLevelUp() { - return levelUp; - } - - /** - *

Setter for the field levelUp.

- * - * @param b a boolean. - */ - public void setLevelUp(boolean b) { - levelUp = b; - } - - /** - *

getSVar.

- * - * @param Var a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public String getSVar(String Var) { - if (SVars.containsKey(Var)) return SVars.get(Var); - else return ""; - } - - /** - *

setSVar.

- * - * @param Var a {@link java.lang.String} object. - * @param str a {@link java.lang.String} object. - */ - public void setSVar(String Var, String str) { - if (SVars.containsKey(Var)) SVars.remove(Var); - - SVars.put(Var, str); - } - - /** - *

getSVars.

- * - * @return a Map object. - */ - public Map getSVars() { - return SVars; - } - - /** - *

setSVars.

- * - * @param newSVars a Map object. - */ - public void setSVars(Map newSVars) { - SVars = newSVars; - } - - /** - *

sumAllCounters.

- * - * @return a int. - */ - public int sumAllCounters() { - Object[] values = counters.values().toArray(); - int count = 0; - int num = 0; - for (int i = 0; i < values.length; i++) { - num = (Integer) values[i]; - count += num; - } - return count; - } - - /** - *

getNetPTCounters.

- * - * @return a int. - */ - public int getNetPTCounters() { - return getCounters(Counters.P1P1) - getCounters(Counters.M1M1); - } - - /** - *

Getter for the field turnInZone.

- * - * @return a int. - */ - public int getTurnInZone() { - return turnInZone; - } - - /** - *

Setter for the field turnInZone.

- * - * @param turn a int. - */ - public void setTurnInZone(int turn) { - turnInZone = turn; - } - - /** - *

Setter for the field echoCost.

- * - * @param s a {@link java.lang.String} object. - */ - public void setEchoCost(String s) { - echoCost = s; - } - - /** - *

Getter for the field echoCost.

- * - * @return a {@link java.lang.String} object. - */ - public String getEchoCost() { - return echoCost; - } - - /** - *

Setter for the field manaCost.

- * - * @param s a {@link java.lang.String} object. - */ - public void setManaCost(String s) { - manaCost = s; - } - - /** - *

Getter for the field manaCost.

- * - * @return a {@link java.lang.String} object. - */ - public String getManaCost() { - return manaCost; - } - - /** - *

addColor.

- * - * @param s a {@link java.lang.String} object. - */ - public void addColor(String s) { - if (s.equals("")) - s = "0"; - cardColor.add(new Card_Color(new ManaCost(s), this, false, true)); - } - - /** - *

addColor.

- * - * @param s a {@link java.lang.String} object. - * @param c a {@link forge.Card} object. - * @param addToColors a boolean. - * @param bIncrease a boolean. - * @return a long. - */ - public long addColor(String s, Card c, boolean addToColors, boolean bIncrease) { - if (bIncrease) - Card_Color.increaseTimestamp(); - cardColor.add(new Card_Color(new ManaCost(s), c, addToColors, false)); - return Card_Color.getTimestamp(); - } - - /** - *

removeColor.

- * - * @param s a {@link java.lang.String} object. - * @param c a {@link forge.Card} object. - * @param addTo a boolean. - * @param timestamp a long. - */ - public void removeColor(String s, Card c, boolean addTo, long timestamp) { - Card_Color removeCol = null; - for (Card_Color cc : cardColor) - if (cc.equals(s, c, addTo, timestamp)) - removeCol = cc; - - if (removeCol != null) - cardColor.remove(removeCol); - } - - /** - *

determineColor.

- * - * @return a {@link forge.Card_Color} object. - */ - public Card_Color determineColor() { - if (this.isImmutable()) { - return new Card_Color(this); - } - Card_Color colors = null; - ArrayList globalChanges = AllZone.getGameInfo().getColorChanges(); - colors = determineColor(globalChanges); - colors.fixColorless(); - return colors; - } - - /** - *

setColor.

- * - * @param colors a {@link java.util.ArrayList} object. - */ - public void setColor(ArrayList colors) { - cardColor = colors; - } - - /** - *

getColor.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getColor() { - return cardColor; - } - - Card_Color determineColor(ArrayList globalChanges) { - Card_Color colors = new Card_Color(this); - int i = cardColor.size() - 1; - int j = globalChanges.size() - 1; - // if both have changes, see which one is most recent - while (i >= 0 && j >= 0) { - Card_Color cc = null; - if (cardColor.get(i).getStamp() > globalChanges.get(j).getStamp()) { - // Card has a more recent color stamp - cc = cardColor.get(i); - i--; - } else { - // Global effect has a more recent color stamp - cc = globalChanges.get(j); - j--; - } - - for (String s : cc.toStringArray()) - colors.addToCardColor(s); - if (!cc.getAdditional()) - return colors; - } - while (i >= 0) { - Card_Color cc = cardColor.get(i); - i--; - for (String s : cc.toStringArray()) - colors.addToCardColor(s); - if (!cc.getAdditional()) - return colors; - } - while (j >= 0) { - Card_Color cc = globalChanges.get(j); - j--; - for (String s : cc.toStringArray()) - colors.addToCardColor(s); - if (!cc.getAdditional()) - return colors; - } - - return colors; - } - - /** - *

getCMC.

- * - * @return a int. - */ - public int getCMC() { - return CardUtil.getConvertedManaCost(manaCost); - } - - //used for cards like Belbe's Portal, Conspiracy, Cover of Darkness, etc. - /** - *

Getter for the field chosenType.

- * - * @return a {@link java.lang.String} object. - */ - public String getChosenType() { - return chosenType; - } - - /** - *

Setter for the field chosenType.

- * - * @param s a {@link java.lang.String} object. - */ - public void setChosenType(String s) { - chosenType = s; - } - - /** - *

Getter for the field chosenColor.

- * - * @return a {@link java.lang.String} object. - */ - public String getChosenColor() { - return chosenColor; - } - - /** - *

Setter for the field chosenColor.

- * - * @param s a {@link java.lang.String} object. - */ - public void setChosenColor(String s) { - chosenColor = s; - } - - //used for cards like Meddling Mage... - /** - *

Getter for the field namedCard.

- * - * @return a {@link java.lang.String} object. - */ - public String getNamedCard() { - return namedCard; - } - - /** - *

Setter for the field namedCard.

- * - * @param s a {@link java.lang.String} object. - */ - public void setNamedCard(String s) { - namedCard = s; - } - - /** - *

Setter for the field drawnThisTurn.

- * - * @param b a boolean. - */ - public void setDrawnThisTurn(boolean b) { - drawnThisTurn = b; - } - - /** - *

Getter for the field drawnThisTurn.

- * - * @return a boolean. - */ - public boolean getDrawnThisTurn() { - return drawnThisTurn; - } - - /** - * get a list of Cards this card has gained control of - *

- * used primarily with AbilityFactory_GainControl - * - * @return a list of cards this card has gained control of - */ - public ArrayList getGainControlTargets() { - return gainControlTargets; - } - - /** - * add a Card to the list of Cards this card has gained control of - *

- * used primarily with AbilityFactory_GainControl - * - * @param c a {@link forge.Card} object. - */ - public void addGainControlTarget(Card c) { - gainControlTargets.add(c); - } - - /** - * clear the list of Cards this card has gained control of - *

- * used primarily with AbilityFactory_GainControl - */ - public void clearGainControlTargets() { - gainControlTargets.clear(); - } - - /** - * get the commands to be executed to lose control of Cards this - * card has gained control of - *

- * used primarily with AbilityFactory_GainControl (Old Man of the Sea specifically) - * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getGainControlReleaseCommands() { - return gainControlReleaseCommands; - } - - /** - * set a command to be executed to lose control of Cards this - * card has gained control of - *

- * used primarily with AbilityFactory_GainControl (Old Man of the Sea specifically) - * - * @param c the Command to be executed - */ - public void addGainControlReleaseCommand(Command c) { - gainControlReleaseCommands.add(c); - } - - /** - *

clearGainControlReleaseCommands.

- */ - public void clearGainControlReleaseCommands() { - gainControlReleaseCommands.clear(); - } - - /** - *

getSpellText.

- * - * @return a {@link java.lang.String} object. - */ - public String getSpellText() { - return text; - } - - /** - *

Setter for the field text.

- * - * @param t a {@link java.lang.String} object. - */ - public void setText(String t) { - text = t; - } - - // get the text that should be displayed - /** - *

Getter for the field text.

- * - * @return a {@link java.lang.String} object. - */ - public String getText() { - StringBuilder sb = new StringBuilder(); - sb.append(this.getAbilityText()); - String NonAbilityText = getNonAbilityText(); - if (NonAbilityText.length() > 0) { - sb.append("\r\n \r\nNon ability features: \r\n"); - sb.append(NonAbilityText.replaceAll("CARDNAME", getName())); - } - - return sb.toString(); - } - - // get the text that does not belong to a cards abilities (and is not really there rules-wise) - /** - *

getNonAbilityText.

- * - * @return a {@link java.lang.String} object. - */ - public String getNonAbilityText() { - StringBuilder sb = new StringBuilder(); - ArrayList keyword = getHiddenExtrinsicKeyword(); - - sb.append(keywordsToText(keyword)); - - return sb.toString(); - } - - // convert a keyword list to the String that should be displayed ingame - /** - *

keywordsToText.

- * - * @param keyword a {@link java.util.ArrayList} object. - * @return a {@link java.lang.String} object. - */ - public String keywordsToText(ArrayList keyword) { - StringBuilder sb = new StringBuilder(); - StringBuilder sbLong = new StringBuilder(); - StringBuilder sbMana = new StringBuilder(); - - for (int i = 0; i < keyword.size(); i++) { - if (!keyword.get(i).toString().contains("CostChange") - && - !keyword.get(i).toString().contains("Permanents don't untap during their controllers' untap steps") - && - !keyword.get(i).toString().contains("PreventAllDamageBy") - && - !keyword.get(i).toString().contains("CantBlock") - && - !keyword.get(i).toString().contains("CantBeBlockedBy")) { - if (keyword.get(i).toString().contains("StaticEffect")) { - String k[] = keyword.get(i).split(":"); - sbLong.append(k[5]).append("\r\n"); - } else if (keyword.get(i).toString().contains("stAnimate")) { - String k[] = keyword.get(i).split(":", 8); - if (!k[7].contains("no text")) sbLong.append(k[7]).append("\r\n"); - } else if (keyword.get(i).toString().contains("Protection:")) { - String k[] = keyword.get(i).split(":"); - sbLong.append(k[2]).append("\r\n"); - } else if (keyword.get(i).toString().contains("stPreventDamage:")) { - String k[] = keyword.get(i).split(":"); - if (!k[4].equals("no text")) - sbLong.append(k[4]).append("\r\n"); - } else if (keyword.get(i).toString().contains("Creatures can't attack unless their controller pays")) { - String k[] = keyword.get(i).split(":"); - if (!k[3].equals("no text")) - sbLong.append(k[3]).append("\r\n"); - } else if (keyword.get(i).startsWith("Enchant")) { - String k = keyword.get(i); - k = k.replace("Curse", ""); - sbLong.append(k).append("\r\n"); - } else if (keyword.get(i).startsWith("Soulshift") || keyword.get(i).startsWith("Cumulative upkeep") - || keyword.get(i).startsWith("Echo") || keyword.get(i).startsWith("Fading") - || keyword.get(i).startsWith("Ripple") || keyword.get(i).startsWith("Unearth") - || keyword.get(i).startsWith("Vanishing") || keyword.get(i).startsWith("Madness") - || keyword.get(i).startsWith("Devour")) { - String k = keyword.get(i); - k = k.replace(":", " "); - sbLong.append(k).append("\r\n"); - } else if (keyword.get(i).startsWith("Champion")) { - String k = getKeyword().get(i); - String kk[] = k.split(":"); - String types = kk[1]; - if (kk.length > 2) types = kk[2]; - if (kk[1].equals("Creature")) kk[1] = kk[1].toLowerCase(); - sbLong.append("Champion a"); - if (kk[1].toLowerCase().startsWith("a") - || kk[1].toLowerCase().startsWith("e") - || kk[1].toLowerCase().startsWith("i") - || kk[1].toLowerCase().startsWith("o") - || kk[1].toLowerCase().startsWith("u")) { - sbLong.append("n"); - } - sbLong.append(" ").append(types); - sbLong.append(" (When this enters the battlefield, sacrifice it unless you exile another ").append(types); - sbLong.append(" you control. When this leaves the battlefield, that card returns to the battlefield.)\r\n"); - } else if (keyword.get(i).endsWith(".")) { - sbLong.append(keyword.get(i).toString()).append("\r\n"); - } else if (keyword.get(i).contains("At the beginning of your upkeep, ") - && keyword.get(i).contains(" unless you pay")) { - sbLong.append(keyword.get(i).toString()).append("\r\n"); - } else if (keyword.get(i).toString().contains("tap: add ")) { - sbMana.append(keyword.get(i).toString()).append("\r\n"); - } else if (keyword.get(i).contains("Bloodthirst")) { - String k = keyword.get(i); - String kk[] = k.split(" "); - sbLong.append(keyword.get(i)).append(" (If an opponent was dealt damage this turn, this creature enters the battlefield with "); - sbLong.append(kk[1]).append(" +1/+1 counter"); - if (Integer.parseInt(kk[1]) > 1) { - sbLong.append("s"); - } - sbLong.append(" on it.)").append("\r\n"); - } else if (keyword.get(i).startsWith("Modular")) { - String numCounters = keyword.get(i).split(" ")[1]; - sbLong.append(keyword.get(i)); - sbLong.append(" (This enters the battlefield with "); - sbLong.append(numCounters); - sbLong.append(" +1/+1 counters on it. When it's put into a graveyard, you may put its +1/+1 counters on target artifact creature.)"); - } else { - if (i != 0 && sb.length() != 0) sb.append(", "); - sb.append(keyword.get(i).toString()); - } - } - } - if (sb.length() > 0) sb.append("\r\n\r\n"); - if (sbLong.length() > 0) sbLong.append("\r\n"); - sb.append(sbLong); - sb.append(sbMana); - return sb.toString(); - } - - //get the text of the abilities of a card - /** - *

getAbilityText.

- * - * @return a {@link java.lang.String} object. - */ - public String getAbilityText() { - if (isInstant() || isSorcery()) { - String s = getSpellText(); - StringBuilder sb = new StringBuilder(); - - // Give spellText line breaks for easier reading - sb.append(s.replaceAll("\\\\r\\\\n", "\r\n")); - - - // NOTE: - if (sb.toString().contains(" (NOTE: ")) { - sb.insert(sb.indexOf("(NOTE: "), "\r\n"); - } - if (sb.toString().contains("(NOTE: ") && sb.toString().endsWith(".)") && !sb.toString().endsWith("\r\n")) { - sb.append("\r\n"); - } - - // Add SpellAbilities - SpellAbility[] sa = getSpellAbility(); - for (int i = 0; i < sa.length; i++) { - sb.append(sa[i].toString() + "\r\n"); - } - - // Add Keywords - ArrayList kw = getKeyword(); - - // Triggered abilities - for (Trigger trig : triggers) { - if (!trig.isSecondary()) { - sb.append(trig.toString() + "\r\n"); - } - } - - // static abilities - for (StaticAbility stAb : staticAbilities) { - String stAbD = stAb.toString(); - if (!stAbD.equals("")) - sb.append(stAbD + "\r\n"); - } - - // Ripple + Dredge + Madness + CARDNAME is {color} + Recover. - for (int i = 0; i < kw.size(); i++) { - if ((kw.get(i).startsWith("Ripple") && !sb.toString().contains("Ripple")) - || (kw.get(i).startsWith("Dredge") && !sb.toString().contains("Dredge")) - || (kw.get(i).startsWith("Madness") && !sb.toString().contains("Madness")) - || (kw.get(i).startsWith("CARDNAME is ") && !sb.toString().contains("CARDNAME is ")) - || (kw.get(i).startsWith("Recover") && !sb.toString().contains("Recover"))) { - sb.append(kw.get(i).replace(":", " ")).append("\r\n"); - } - } - - // Changeling + CARDNAME can't be countered. + Cascade + Multikicker - for (int i = 0; i < kw.size(); i++) { - if ((kw.get(i).contains("Changeling") && !sb.toString().contains("Changeling")) - || (kw.get(i).contains("CARDNAME can't be countered.") && !sb.toString().contains("CARDNAME can't be countered.")) - || (kw.get(i).contains("Cascade") && !sb.toString().contains("Cascade")) - || (kw.get(i).contains("Multikicker") && !sb.toString().contains("Multikicker"))) { - sb.append(kw.get(i)).append("\r\n"); - } - } - - // Storm - if (hasKeyword("Storm") && !sb.toString().contains("Storm (When you ")) { - if (sb.toString().endsWith("\r\n\r\n")) { - sb.delete(sb.lastIndexOf("\r\n"), sb.lastIndexOf("\r\n") + 3); - } - sb.append("Storm (When you cast this spell, copy it for each spell cast before it this turn."); - if (sb.toString().contains("Target") || sb.toString().contains("target")) { - sb.append(" You may choose new targets for the copies."); - } - sb.append(")\r\n"); - } - - //Replicate - for (String keyw : kw) { - if (keyw.contains("Replicate") && !sb.toString().contains("you paid its replicate cost.")) { - if (sb.toString().endsWith("\r\n\r\n")) { - sb.delete(sb.lastIndexOf("\r\n"), sb.lastIndexOf("\r\n") + 3); - } - sb.append(keyw); - sb.append(" (When you cast this spell, copy it for each time you paid its replicate cost."); - if (sb.toString().contains("Target") || sb.toString().contains("target")) { - sb.append(" You may choose new targets for the copies."); - } - sb.append(")\r\n"); - } - } - - while (sb.toString().endsWith("\r\n")) { - sb.delete(sb.lastIndexOf("\r\n"), sb.lastIndexOf("\r\n") + 3); - } - - return sb.toString().replaceAll("CARDNAME", getName()); - } - - StringBuilder sb = new StringBuilder(); - ArrayList keyword = getUnhiddenKeyword(); - - sb.append(keywordsToText(keyword)); - - // Give spellText line breaks for easier reading - sb.append("\r\n"); - sb.append(text.replaceAll("\\\\r\\\\n", "\r\n")); - sb.append("\r\n"); - - /* - * if(isAura()) { - // Give spellText line breaks for easier reading - sb.append(getSpellText().replaceAll("\\\\r\\\\n", "\r\n")).append("\r\n"); - } - */ - - // Triggered abilities - for (Trigger trig : triggers) { - if (!trig.isSecondary()) { - sb.append(trig.toString() + "\r\n"); - } - } - - // static abilities - for (StaticAbility stAb : staticAbilities) { - sb.append(stAb.toString() + "\r\n"); - } - - ArrayList addedManaStrings = new ArrayList(); - SpellAbility[] abilities = getSpellAbility(); - boolean primaryCost = true; - for (SpellAbility sa : abilities) { - // only add abilities not Spell portions of cards - if (!isPermanent()) - continue; - - if (sa instanceof Spell_Permanent && primaryCost && !isAura()) { - // For Alt costs, make sure to display the cost! - primaryCost = false; - continue; - } - - String sAbility = sa.toString(); - - if (sa instanceof Ability_Mana) { - if (addedManaStrings.contains(sAbility)) - continue; - addedManaStrings.add(sAbility); - } - - if (sa instanceof Spell_Permanent && !isAura()) { - sb.insert(0, "\r\n"); - sb.insert(0, sAbility); - } else if (!sAbility.endsWith(getName())) { - sb.append(sAbility); - sb.append("\r\n"); - // The test above appears to prevent the card name from showing and therefore it no longer needs to be deleted from the stringbuilder - //if (sb.toString().endsWith("CARDNAME")) - // sb.replace(sb.toString().lastIndexOf("CARDNAME"), sb.toString().lastIndexOf("CARDNAME") + name.length() - 1, ""); - } - } - - // NOTE: - if (sb.toString().contains(" (NOTE: ")) { - sb.insert(sb.indexOf("(NOTE: "), "\r\n"); - } - if (sb.toString().contains("(NOTE: ") && sb.toString().contains(".) ")) { - sb.insert(sb.indexOf(".) ") + 3, "\r\n"); - } - - // replace tripple line feeds with double line feeds - int start; - String s = "\r\n\r\n\r\n"; - while (sb.toString().contains(s)) { - start = sb.lastIndexOf(s); - if (start < 0 || start >= sb.length()) - break; - sb.replace(start, start + 4, "\r\n"); - } - - //Remembered cards - if (rememberedObjects.size() > 0) { - sb.append("\r\nRemembered: \r\n"); - for (Object o : rememberedObjects) { - if (o instanceof Card) { - Card c = (Card) o; - sb.append(c.getName()); - sb.append("("); - sb.append(c.getUniqueNumber()); - sb.append(")"); - } else - sb.append(o.toString()); - sb.append("\r\n"); - } - } - - return sb.toString().replaceAll("CARDNAME", getName()).trim(); - }//getText() - - /** - *

Getter for the field manaAbility.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getManaAbility() { - return new ArrayList(manaAbility); - } - - // Returns basic mana abilities plus "reflected mana" abilities - /** - *

getAIPlayableMana.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getAIPlayableMana() { - ArrayList res = new ArrayList(); - for (Ability_Mana am : getManaAbility()) - if (am.isBasic() && !res.contains(am)) { - res.add(am); - } else if (am.isReflectedMana() && !res.contains(am)) { - res.add(am); - } - - return res; - - } - - /** - *

getBasicMana.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getBasicMana() { - ArrayList res = new ArrayList(); - for (Ability_Mana am : getManaAbility()) - if (am.isBasic() && !res.contains(am)) res.add(am); - return res; - } - - /** - *

clearFirstSpellAbility.

- */ - public void clearFirstSpell() { - for(int i = 0; i < spellAbility.size(); i++){ - if (spellAbility.get(i).isSpell()){ - spellAbility.remove(i); - return; - } - } - } - - /** - *

clearAllButFirstSpellAbility.

- */ - public void clearAllButFirstSpellAbility() { - if (!spellAbility.isEmpty()) { - SpellAbility first = spellAbility.get(0); - spellAbility.clear(); - spellAbility.add(first); - } - manaAbility.clear(); - } - - /** - *

getAllButFirstSpellAbility.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getAllButFirstSpellAbility() { - ArrayList sas = new ArrayList(); - sas.addAll(spellAbility); - if (!sas.isEmpty()) { - SpellAbility first = spellAbility.get(0); - sas.remove(first); - } - sas.addAll(manaAbility); - - return sas; - } - - /** - *

clearSpellAbility.

- */ - public void clearSpellAbility() { - spellAbility.clear(); - manaAbility.clear(); - } - - /** - *

getSpellPermanent.

- * - * @return a {@link forge.card.spellability.Spell_Permanent} object. - */ - public Spell_Permanent getSpellPermanent() { - for (SpellAbility sa : spellAbility) { - if (sa instanceof Spell_Permanent) return (Spell_Permanent) sa; - } - return null; - } - - /** - *

clearSpellKeepManaAbility.

- */ - public void clearSpellKeepManaAbility() { - spellAbility.clear(); - } - - /** - *

clearManaAbility.

- */ - public void clearManaAbility() { - manaAbility.clear(); - } - - - /** - *

addFirstSpellAbility.

- * - * @param a a {@link forge.card.spellability.SpellAbility} object. - */ - public void addFirstSpellAbility(SpellAbility a) { - a.setSourceCard(this); - if (a instanceof Ability_Mana) manaAbility.add(0, (Ability_Mana) a); - else spellAbility.add(0, a); - } - - /** - *

addSpellAbility.

- * - * @param a a {@link forge.card.spellability.SpellAbility} object. - */ - public void addSpellAbility(SpellAbility a) { - a.setSourceCard(this); - if (a instanceof Ability_Mana) manaAbility.add((Ability_Mana) a); - else spellAbility.add(a); - } - - /** - *

removeSpellAbility.

- * - * @param a a {@link forge.card.spellability.SpellAbility} object. - */ - public void removeSpellAbility(SpellAbility a) { - if (a instanceof Ability_Mana) - //if (a.isExtrinsic()) //never remove intrinsic mana abilities, is this the way to go?? - manaAbility.remove(a); - else spellAbility.remove(a); - } - - - /** - *

removeAllExtrinsicManaAbilities.

- */ - public void removeAllExtrinsicManaAbilities() { - //temp ArrayList, otherwise ConcurrentModificationExceptions occur: - ArrayList saList = new ArrayList(); - - for (SpellAbility var : manaAbility) { - if (var.isExtrinsic()) saList.add(var); - } - for (SpellAbility sa : saList) { - removeSpellAbility(sa); - } - } - - /** - *

getIntrinsicManaAbilitiesDescriptions.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getIntrinsicManaAbilitiesDescriptions() { - ArrayList list = new ArrayList(); - for (SpellAbility var : manaAbility) { - if (var.isIntrinsic()) list.add(var.toString()); - } - return list; - } - - /** - *

Getter for the field spellAbility.

- * - * @return an array of {@link forge.card.spellability.SpellAbility} objects. - */ - public SpellAbility[] getSpellAbility() { - ArrayList res = new ArrayList(spellAbility); - res.addAll(getManaAbility()); - SpellAbility[] s = new SpellAbility[res.size()]; - res.toArray(s); - return s; - } - - /** - *

getSpellAbilities.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getSpellAbilities() { - ArrayList res = new ArrayList(spellAbility); - res.addAll(getManaAbility()); - return res; - } - - /** - *

getSpells.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getSpells() { - ArrayList s = new ArrayList(spellAbility); - ArrayList res = new ArrayList(); - - for (SpellAbility sa : s) { - if (sa.isSpell()) res.add(sa); - } - return res; - } - - /** - *

getBasicSpells.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getBasicSpells() { - ArrayList s = new ArrayList(spellAbility); - ArrayList res = new ArrayList(); - - for (SpellAbility sa : s) { - if (sa.isSpell() && !sa.isFlashBackAbility() && !sa.isBuyBackAbility()) res.add(sa); - } - return res; - } - - /** - *

getAdditionalCostSpells.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getAdditionalCostSpells() { - ArrayList s = new ArrayList(spellAbility); - ArrayList res = new ArrayList(); - - for (SpellAbility sa : s) { - if (sa.isSpell() && !sa.getAdditionalManaCost().equals("")) res.add(sa); - } - return res; - } - - - //PreventNextDamage - /** - *

Setter for the field preventNextDamage.

- * - * @param n a int. - */ - public void setpreventNextDamage(int n) { - preventNextDamage = n; - } - - /** - *

Getter for the field preventNextDamage.

- * - * @return a int. - */ - public int getPreventNextDamage() { - return preventNextDamage; - } - - /** - *

addPreventNextDamage.

- * - * @param n a int. - */ - public void addPreventNextDamage(int n) { - preventNextDamage += n; - } - - /** - *

subtractPreventNextDamage.

- * - * @param n a int. - */ - public void subtractPreventNextDamage(int n) { - preventNextDamage -= n; - } - - /** - *

resetPreventNextDamage.

- */ - public void resetPreventNextDamage() { - preventNextDamage = 0; - } - - //shield = regeneration - /** - *

setShield.

- * - * @param n a int. - */ - public void setShield(int n) { - nShield = n; - } - - /** - *

getShield.

- * - * @return a int. - */ - public int getShield() { - return nShield; - } - - /** - *

addShield.

- */ - public void addShield() { - nShield++; - } - - /** - *

subtractShield.

- */ - public void subtractShield() { - nShield--; - } - - /** - *

resetShield.

- */ - public void resetShield() { - nShield = 0; - } - - /** - *

canBeShielded.

- * - * @return a boolean. - */ - public boolean canBeShielded() { - return !hasKeyword("CARDNAME can't be regenerated."); - } - - //is this "Card" supposed to be a token? - /** - *

Setter for the field token.

- * - * @param b a boolean. - */ - public void setToken(boolean b) { - token = b; - } - - /** - *

isToken.

- * - * @return a boolean. - */ - public boolean isToken() { - return token; - } - - /** - *

Setter for the field copiedToken.

- * - * @param b a boolean. - */ - public void setCopiedToken(boolean b) { - copiedToken = b; - } - - /** - *

isCopiedToken.

- * - * @return a boolean. - */ - public boolean isCopiedToken() { - return copiedToken; - } - - /** - *

Setter for the field copiedSpell.

- * - * @param b a boolean. - */ - public void setCopiedSpell(boolean b) { - copiedSpell = b; - } - - /** - *

isCopiedSpell.

- * - * @return a boolean. - */ - public boolean isCopiedSpell() { - return copiedSpell; - } - - /** - *

addSpellChoice.

- * - * @param string a {@link java.lang.String} object. - */ - public void addSpellChoice(String string) { - ChoicesMade.add(string); - } - - /** - *

getChoices.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getChoices() { - return ChoicesMade; - } - - /** - *

getChoice.

- * - * @param i a int. - * @return a {@link java.lang.String} object. - */ - public String getChoice(int i) { - return ChoicesMade.get(i); - } - - /** - *

setSpellChoiceTarget.

- * - * @param string a {@link java.lang.String} object. - */ - public void setSpellChoiceTarget(String string) { - Targets_for_Choices.add(string); - } - - /** - *

getChoiceTargets.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getChoiceTargets() { - return Targets_for_Choices; - } - - /** - *

getChoiceTarget.

- * - * @param i a int. - * @return a {@link java.lang.String} object. - */ - public String getChoiceTarget(int i) { - return Targets_for_Choices.get(i); - } - - /** - *

setSpellWithChoices.

- * - * @param b a boolean. - */ - public void setSpellWithChoices(boolean b) { - SpellwithChoices = b; - } - - /** - *

hasChoices.

- * - * @return a boolean. - */ - public boolean hasChoices() { - return SpellwithChoices; - } - - /** - *

setCopiesSpells.

- * - * @param b a boolean. - */ - public void setCopiesSpells(boolean b) { - SpellCopyingCard = b; - } - - /** - *

copiesSpells.

- * - * @return a boolean. - */ - public boolean copiesSpells() { - return SpellCopyingCard; - } - - /** - *

setIsFaceDown.

- * - * @param b a boolean. - */ - public void setIsFaceDown(boolean b) { - faceDown = b; - } - - /** - *

isFaceDown.

- * - * @return a boolean. - */ - public boolean isFaceDown() { - return faceDown; - } - - /** - *

addTrigger.

- * - * @param c a {@link forge.Command} object. - * @param type a {@link forge.ZCTrigger} object. - */ - public void addTrigger(Command c, ZCTrigger type) { - zcTriggers.add(new Ability_Triggered(this, c, type)); - } - - /** - *

removeTrigger.

- * - * @param c a {@link forge.Command} object. - * @param type a {@link forge.ZCTrigger} object. - */ - public void removeTrigger(Command c, ZCTrigger type) { - zcTriggers.remove(new Ability_Triggered(this, c, type)); - } - - /** - *

executeTrigger.

- * - * @param type a {@link forge.ZCTrigger} object. - */ - public void executeTrigger(ZCTrigger type) { - for (Ability_Triggered t : zcTriggers) - if (t.trigger.equals(type) && t.isBasic()) t.execute();//AllZone.getStack().addSimultaneousStackEntry(t); - } - - /** - *

clearTriggers.

- */ - public void clearTriggers() { - zcTriggers.clear(); - } - - /** - *

addComesIntoPlayCommand.

- * - * @param c a {@link forge.Command} object. - */ - public void addComesIntoPlayCommand(Command c) { - addTrigger(c, ZCTrigger.ENTERFIELD); - } - - /** - *

removeComesIntoPlayCommand.

- * - * @param c a {@link forge.Command} object. - */ - public void removeComesIntoPlayCommand(Command c) { - removeTrigger(c, ZCTrigger.ENTERFIELD); - } - - /** - *

comesIntoPlay.

- */ - public void comesIntoPlay() { - executeTrigger(ZCTrigger.ENTERFIELD); - } - - /** - *

addTurnFaceUpCommand.

- * - * @param c a {@link forge.Command} object. - */ - public void addTurnFaceUpCommand(Command c) { - turnFaceUpCommandList.add(c); - } - - /** - *

removeTurnFaceUpCommand.

- * - * @param c a {@link forge.Command} object. - */ - public void removeTurnFaceUpCommand(Command c) { - turnFaceUpCommandList.remove(c); - } - - /** - *

turnFaceUp.

- */ - public void turnFaceUp() { - for (Command var : turnFaceUpCommandList) - var.execute(); - - //Run triggers - Map runParams = new TreeMap(); - runParams.put("Card", this); - AllZone.getTriggerHandler().runTrigger("TurnFaceUp", runParams); - } - - /** - *

addDestroyCommand.

- * - * @param c a {@link forge.Command} object. - */ - public void addDestroyCommand(Command c) { - addTrigger(c, ZCTrigger.DESTROY); - } - - /** - *

removeDestroyCommand.

- * - * @param c a {@link forge.Command} object. - */ - public void removeDestroyCommand(Command c) { - removeTrigger(c, ZCTrigger.DESTROY); - } - - /** - *

destroy.

- */ - public void destroy() { - executeTrigger(ZCTrigger.DESTROY); - } - - /** - *

addLeavesPlayCommand.

- * - * @param c a {@link forge.Command} object. - */ - public void addLeavesPlayCommand(Command c) { - addTrigger(c, ZCTrigger.LEAVEFIELD); - } - - /** - *

removeLeavesPlayCommand.

- * - * @param c a {@link forge.Command} object. - */ - public void removeLeavesPlayCommand(Command c) { - removeTrigger(c, ZCTrigger.LEAVEFIELD); - } - - /** - *

leavesPlay.

- */ - public void leavesPlay() { - executeTrigger(ZCTrigger.LEAVEFIELD); - } - - /** - *

addEquipCommand.

- * - * @param c a {@link forge.Command} object. - */ - public void addEquipCommand(Command c) { - equipCommandList.add(c); - } - - /** - *

removeEquipCommand.

- * - * @param c a {@link forge.Command} object. - */ - public void removeEquipCommand(Command c) { - equipCommandList.remove(c); - } - - /** - *

equip.

- */ - public void equip() { - for (Command var : equipCommandList) - var.execute(); - } - - /** - *

addUnEquipCommand.

- * - * @param c a {@link forge.Command} object. - */ - public void addUnEquipCommand(Command c) { - unEquipCommandList.add(c); - } - - /** - *

removeUnEquipCommand.

- * - * @param c a {@link forge.Command} object. - */ - public void removeUnEquipCommand(Command c) { - unEquipCommandList.remove(c); - } - - /** - *

unEquip.

- */ - public void unEquip() { - for (Command var : unEquipCommandList) - var.execute(); - } - - /** - *

addEnchantCommand.

- * - * @param c a {@link forge.Command} object. - */ - public void addEnchantCommand(Command c) { - enchantCommandList.add(c); - } - - /** - *

clearEnchantCommand.

- */ - public void clearEnchantCommand() { - enchantCommandList.clear(); - } - - /** - *

enchant.

- */ - public void enchant() { - for (Command var : enchantCommandList) - var.execute(); - } - - /** - *

addUnEnchantCommand.

- * - * @param c a {@link forge.Command} object. - */ - public void addUnEnchantCommand(Command c) { - unEnchantCommandList.add(c); - } - - /** - *

clearUnEnchantCommand.

- */ - public void clearUnEnchantCommand() { - unEnchantCommandList.clear(); - } - - /** - *

unEnchant.

- */ - public void unEnchant() { - for (Command var : unEnchantCommandList) - var.execute(); - } - - /** - *

addUntapCommand.

- * - * @param c a {@link forge.Command} object. - */ - public void addUntapCommand(Command c) { - untapCommandList.add(c); - } - - /** - *

addChangeControllerCommand.

- * - * @param c a {@link forge.Command} object. - */ - public void addChangeControllerCommand(Command c) { - changeControllerCommandList.add(c); - } - - /** - *

getReplaceMoveToGraveyard.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getReplaceMoveToGraveyard() { - return replaceMoveToGraveyardCommandList; - } - - /** - *

addReplaceMoveToGraveyardCommand.

- * - * @param c a {@link forge.Command} object. - */ - public void addReplaceMoveToGraveyardCommand(Command c) { - replaceMoveToGraveyardCommandList.add(c); - } - - /** - *

clearReplaceMoveToGraveyardCommandList.

- */ - public void clearReplaceMoveToGraveyardCommandList() { - replaceMoveToGraveyardCommandList.clear(); - } - - /** - *

replaceMoveToGraveyard.

- */ - public void replaceMoveToGraveyard() { - for (Command var : replaceMoveToGraveyardCommandList) - var.execute(); - } - - /** - *

addCycleCommand.

- * - * @param c a {@link forge.Command} object. - */ - public void addCycleCommand(Command c) { - cycleCommandList.add(c); - } - - /** - *

cycle.

- */ - public void cycle() { - for (Command var : cycleCommandList) - var.execute(); - } - - /** - *

Setter for the field sickness.

- * - * @param b a boolean. - */ - public void setSickness(boolean b) { - sickness = b; - } - - /** - *

hasSickness.

- * - * @return a boolean. - */ - public boolean hasSickness() { - if (hasKeyword("Haste")) return false; - - return sickness; - } - - /** - *

isSick.

- * - * @return a boolean. - */ - public boolean isSick() { - if (hasKeyword("Haste")) return false; - - return sickness && isCreature(); - } - - /** - *

Setter for the field rarity.

- * - * @param s a {@link java.lang.String} object. - */ - public void setRarity(String s) { - rarity = s; - } - - /** - *

Getter for the field rarity.

- * - * @return a {@link java.lang.String} object. - */ - public String getRarity() { - return rarity; - } - - /** - *

Setter for the field imageName.

- * - * @param s a {@link java.lang.String} object. - */ - public void setImageName(String s) { - imageName = s; - } - - /** - *

Getter for the field imageName.

- * - * @return a {@link java.lang.String} object. - */ - public String getImageName() { - if (!imageName.equals("")) return imageName; - return name; - } - - /** - *

Getter for the field name.

- * - * @return a {@link java.lang.String} object. - */ - public String getName() { - return name; - } - - /** - *

Getter for the field owner.

- * - * @return a {@link forge.Player} object. - */ - public Player getOwner() { - return owner; - } - - /** - *

Getter for the field controller.

- * - * @return a {@link forge.Player} object. - */ - public Player getController() { - return controller; - } - - /** - *

Setter for the field name.

- * - * @param s a {@link java.lang.String} object. - */ - public void setName(String s) { - name = s; - this.updateObservers(); - } - - /** - *

Setter for the field owner.

- * - * @param player a {@link forge.Player} object. - */ - public void setOwner(Player player) { - owner = player; - this.updateObservers(); - } - - /** - *

Setter for the field controller.

- * - * @param player a {@link forge.Player} object. - */ - public void setController(Player player) { - boolean sameController = controller == null ? false : controller.isPlayer(player); - controller = player; - if (null != controller && !sameController) { - for (Command var : changeControllerCommandList) - var.execute(); - } - this.updateObservers(); - } - - /** - *

Getter for the field equippedBy.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getEquippedBy() { - return equippedBy; - } - - /** - *

Setter for the field equippedBy.

- * - * @param list a {@link java.util.ArrayList} object. - */ - public void setEquippedBy(ArrayList list) { - equippedBy = list; - } - - /** - *

Getter for the field equipping.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getEquipping() { - return equipping; - } - - /** - *

getEquippingCard.

- * - * @return a {@link forge.Card} object. - */ - public Card getEquippingCard() { - if (equipping.size() == 0) - return null; - return equipping.get(0); - } - - /** - *

Setter for the field equipping.

- * - * @param list a {@link java.util.ArrayList} object. - */ - public void setEquipping(ArrayList list) { - equipping = list; - } - - /** - *

isEquipped.

- * - * @return a boolean. - */ - public boolean isEquipped() { - return equippedBy.size() != 0; - } - - /** - *

isEquipping.

- * - * @return a boolean. - */ - public boolean isEquipping() { - return equipping.size() != 0; - } - - /** - *

addEquippedBy.

- * - * @param c a {@link forge.Card} object. - */ - public void addEquippedBy(Card c) { - equippedBy.add(c); - this.updateObservers(); - } - - /** - *

removeEquippedBy.

- * - * @param c a {@link forge.Card} object. - */ - public void removeEquippedBy(Card c) { - equippedBy.remove(c); - this.updateObservers(); - } - - /** - *

addEquipping.

- * - * @param c a {@link forge.Card} object. - */ - public void addEquipping(Card c) { - equipping.add(c); - setTimestamp(AllZone.getNextTimestamp()); - this.updateObservers(); - } - - /** - *

removeEquipping.

- * - * @param c a {@link forge.Card} object. - */ - public void removeEquipping(Card c) { - equipping.remove(c); - this.updateObservers(); - } - - /** - *

equipCard.

- * - * @param c a {@link forge.Card} object. - */ - public void equipCard(Card c) //equipment.equipCard(cardToBeEquipped); - { - addEquipping(c); - c.addEquippedBy(this); - this.equip(); - } - - /** - *

unEquipCard.

- * - * @param c a {@link forge.Card} object. - */ - public void unEquipCard(Card c) //equipment.unEquipCard(equippedCard); - { - this.unEquip(); - equipping.remove(c); - c.removeEquippedBy(this); - - //Run triggers - Map runParams = new TreeMap(); - runParams.put("Equipment", this); - runParams.put("Card", c); - AllZone.getTriggerHandler().runTrigger("Unequip", runParams); - } - - /** - *

unEquipAllCards.

- */ - public void unEquipAllCards() { - while (equippedBy.size() > 0) { // while there exists equipment, unequip the first one - equippedBy.get(0).unEquipCard(this); - } - } - - /** - *

Getter for the field enchantedBy.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getEnchantedBy() { - return enchantedBy; - } - - /** - *

Setter for the field enchantedBy.

- * - * @param list a {@link java.util.ArrayList} object. - */ - public void setEnchantedBy(ArrayList list) { - enchantedBy = list; - } - - /** - *

Getter for the field enchanting.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getEnchanting() { - return enchanting; - } - - /** - *

getEnchantingCard.

- * - * @return a {@link forge.Card} object. - */ - public Card getEnchantingCard() { - if (enchanting.size() == 0) - return null; - return enchanting.get(0); - } - - /** - *

Setter for the field enchanting.

- * - * @param list a {@link java.util.ArrayList} object. - */ - public void setEnchanting(ArrayList list) { - enchanting = list; - } - - /** - *

isEnchanted.

- * - * @return a boolean. - */ - public boolean isEnchanted() { - return enchantedBy.size() != 0; - } - - /** - *

isEnchanting.

- * - * @return a boolean. - */ - public boolean isEnchanting() { - return enchanting.size() != 0; - } - - /** - *

addEnchantedBy.

- * - * @param c a {@link forge.Card} object. - */ - public void addEnchantedBy(Card c) { - enchantedBy.add(c); - this.updateObservers(); - } - - /** - *

removeEnchantedBy.

- * - * @param c a {@link forge.Card} object. - */ - public void removeEnchantedBy(Card c) { - enchantedBy.remove(c); - this.updateObservers(); - } - - /** - * checks to see if this card is enchanted by an aura with a given name - * - * @param cardName the name of the aura - * @return true if this card is enchanted by an aura with the given name, false otherwise - */ - public boolean isEnchantedBy(String cardName) { - ArrayList allAuras = this.getEnchantedBy(); - for (Card aura : allAuras) { - if (aura.getName().equals(cardName)) return true; - } - return false; - } - - /** - *

addEnchanting.

- * - * @param c a {@link forge.Card} object. - */ - public void addEnchanting(Card c) { - enchanting.add(c); - setTimestamp(AllZone.getNextTimestamp()); - this.updateObservers(); - } - - /** - *

removeEnchanting.

- * - * @param c a {@link forge.Card} object. - */ - public void removeEnchanting(Card c) { - enchanting.remove(c); - this.updateObservers(); - } - - /** - *

enchantCard.

- * - * @param c a {@link forge.Card} object. - */ - public void enchantCard(Card c) { - addEnchanting(c); - c.addEnchantedBy(this); - this.enchant(); - } - - /** - *

unEnchantCard.

- * - * @param c a {@link forge.Card} object. - */ - public void unEnchantCard(Card c) { - this.unEnchant(); - enchanting.remove(c); - c.removeEnchantedBy(this); - } - - /** - *

unEnchantAllCards.

- */ - public void unEnchantAllCards() { - for (int i = 0; i < enchantedBy.size(); i++) { - enchantedBy.get(i).unEnchantCard(this); - } - } - - //array size might equal 0, will NEVER be null - /** - *

getAttachedCards.

- * - * @return an array of {@link forge.Card} objects. - */ - public Card[] getAttachedCards() { - Card c[] = new Card[attached.size()]; - attached.toArray(c); - return c; - } - - /** - *

hasAttachedCards.

- * - * @return a boolean. - */ - public boolean hasAttachedCards() { - return getAttachedCards().length != 0; - } - - /** - *

attachCard.

- * - * @param c a {@link forge.Card} object. - */ - public void attachCard(Card c) { - attached.add(c); - this.updateObservers(); - } - - /** - *

unattachCard.

- * - * @param c a {@link forge.Card} object. - */ - public void unattachCard(Card c) { - attached.remove(c); - this.updateObservers(); - } - - /** - *

Setter for the field type.

- * - * @param a a {@link java.util.ArrayList} object. - */ - public void setType(ArrayList a) { - type = new ArrayList(a); - } - - /** - *

addType.

- * - * @param a a {@link java.lang.String} object. - */ - public void addType(String a) { - type.add(a); - } - - /** - *

removeType.

- * - * @param a a {@link java.lang.String} object. - */ - public void removeType(String a) { - type.remove(a); - } - - /** - *

Getter for the field type.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getType() { - - // see if type chages are in effect - if (!changedCardTypes.isEmpty()) { - - ArrayList newType = new ArrayList(type); - ArrayList types = sortByTimestamp(changedCardTypes); - - for (Card_Type ct : types) { - ArrayList removeTypes = new ArrayList(); - //remove old types - for (int i = 0; i < newType.size(); i++) { - String t = newType.get(i); - if (ct.isRemoveSuperTypes() && CardUtil.isASuperType(t)) - removeTypes.add(t); - if (ct.isRemoveCardTypes() && CardUtil.isACardType(t)) - removeTypes.add(t); - if (ct.isRemoveSubTypes() && CardUtil.isASubType(t)) - removeTypes.add(t); - if (ct.isRemoveCreatureTypes() && CardUtil.isACreatureType(t)) - removeTypes.add(t); - } - newType.removeAll(removeTypes); - //add new types - newType.addAll(ct.getType()); - - } - - return newType; - } - - //nothing changed - return new ArrayList(type); - } - - private ArrayList sortByTimestamp(ArrayList cardTypes) { - ArrayList remainingCardTypes = cardTypes; - ArrayList types = new ArrayList(); - for(int i = 0; i < cardTypes.size(); i++) { - Card_Type nextCT = remainingCardTypes.get(i); - long nextLowest = nextCT.getTimestamp(); - for(Card_Type ct : remainingCardTypes) { - if (nextLowest > ct.getTimestamp()) - nextCT = ct; - } - types.add(nextCT); - } - return types; - } - - public void addChangedCardTypes(ArrayList types, boolean removeSuperTypes, boolean removeCardTypes, - boolean removeSubTypes, boolean removeCreatureTypes, long timestamp) { - - changedCardTypes.add(new Card_Type(types, removeSuperTypes, removeCardTypes, removeSubTypes, removeCreatureTypes, timestamp)); - } - - public void addChangedCardTypes(String[] types, boolean removeSuperTypes, boolean removeCardTypes, - boolean removeSubTypes, boolean removeCreatureTypes, long timestamp) { - ArrayList typeList = new ArrayList(Arrays.asList(types)); - addChangedCardTypes(typeList, removeSuperTypes, removeCardTypes, removeSubTypes, removeCreatureTypes, timestamp); - } - - public void removeChangedCardTypes(long timestamp) { - for (int i = 0; i < changedCardTypes.size(); i++) { - Card_Type cardT = changedCardTypes.get(i); - if (cardT.getTimestamp() == timestamp) - changedCardTypes.remove(cardT); - } - } - - /** - *

clearAllTypes.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList clearAllTypes() { - ArrayList originalTypes = new ArrayList(); - originalTypes.addAll(type); - type.clear(); - return originalTypes; - } - - /** - *

Setter for the field prevType.

- * - * @param a a {@link java.util.ArrayList} object. - */ - public void setPrevType(ArrayList a) { - prevType = new ArrayList(a); - } - - /** - *

addPrevType.

- * - * @param a a {@link java.lang.String} object. - */ - public void addPrevType(String a) { - prevType.add(a); - } - - /** - *

removePrevType.

- * - * @param a a {@link java.lang.String} object. - */ - public void removePrevType(String a) { - prevType.remove(a); - } - - /** - *

Getter for the field prevType.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getPrevType() { - return new ArrayList(prevType); - } - - //values that are printed on card - /** - *

Getter for the field baseLoyalty.

- * - * @return a int. - */ - public int getBaseLoyalty() { - return baseLoyalty; - } - - //values that are printed on card - /** - *

Setter for the field baseLoyalty.

- * - * @param n a int. - */ - public void setBaseLoyalty(int n) { - baseLoyalty = n; - } - - //values that are printed on card - /** - *

Getter for the field baseAttack.

- * - * @return a int. - */ - public int getBaseAttack() { - return baseAttack; - } - - /** - *

Getter for the field baseDefense.

- * - * @return a int. - */ - public int getBaseDefense() { - return baseDefense; - } - - //values that are printed on card - /** - *

Setter for the field baseAttack.

- * - * @param n a int. - */ - public void setBaseAttack(int n) { - baseAttack = n; - } - - /** - *

Setter for the field baseDefense.

- * - * @param n a int. - */ - public void setBaseDefense(int n) { - baseDefense = n; - } - - //values that are printed on card - /** - *

Getter for the field baseAttackString.

- * - * @return a {@link java.lang.String} object. - */ - public String getBaseAttackString() { - return (null == baseAttackString) ? "" + getBaseAttack() : baseAttackString; - } - - /** - *

Getter for the field baseDefenseString.

- * - * @return a {@link java.lang.String} object. - */ - public String getBaseDefenseString() { - return (null == baseDefenseString) ? "" + getBaseDefense() : baseDefenseString; - } - - //values that are printed on card - /** - *

Setter for the field baseAttackString.

- * - * @param s a {@link java.lang.String} object. - */ - public void setBaseAttackString(String s) { - baseAttackString = s; - } - - /** - *

Setter for the field baseDefenseString.

- * - * @param s a {@link java.lang.String} object. - */ - public void setBaseDefenseString(String s) { - baseDefenseString = s; - } - - public int getSetPower() { - if (newPT.isEmpty()) - return -1; - - Card_PT latestPT = getLatestPT(); - - return latestPT.getPower(); - } - - public int getSetToughness() { - if (newPT.isEmpty()) - return -1; - - Card_PT latestPT = getLatestPT(); - - return latestPT.getToughness(); - } - - public Card_PT getLatestPT() { - Card_PT latestPT = new Card_PT(-1,-1,0); - long max = 0; - - for (Card_PT pt : newPT) { - if (pt.getTimestamp() >= max) { - max = pt.getTimestamp(); - latestPT = pt; - } - } - - return latestPT; - } - - public void addNewPT(int power, int toughness, long timestamp) { - newPT.add(new Card_PT(power, toughness, timestamp)); - } - - public void removeNewPT(long timestamp) { - for (int i = 0; i < newPT.size(); i++) { - Card_PT cardPT = newPT.get(i); - if (cardPT.getTimestamp() == timestamp) - newPT.remove(cardPT); - } - } - - public int getCurrentPower() { - int total = getBaseAttack(); - int setPower = getSetPower(); - if(setPower != -1) - total = setPower; - - return total; - } - - /** - *

getUnswitchedAttack.

- * - * @return a int. - */ - public int getUnswitchedAttack() { - int total = getCurrentPower(); - - total += getTempAttackBoost() + getSemiPermanentAttackBoost() - + getCounters(Counters.P1P1) + getCounters(Counters.P1P2) - + getCounters(Counters.P1P0) - getCounters(Counters.M1M1) - + (2 * getCounters(Counters.P2P2) - (2 * getCounters(Counters.M2M1)) - - (2 * getCounters(Counters.M2M2)) - getCounters(Counters.M1M0)); - return total; - } - - /** - *

getNetAttack.

- * - * @return a int. - */ - public int getNetAttack() { - if (this.getAmountOfKeyword("CARDNAME's power and toughness are switched") % 2 != 0) - return getUnswitchedDefense(); - else return getUnswitchedAttack(); - } - - public int getCurrentToughness() { - int total = getBaseDefense(); - - int setToughness = getSetToughness(); - if(setToughness != -1) - total = setToughness; - - return total; - } - - /** - *

getUnswitchedDefense.

- * - * @return a int. - */ - public int getUnswitchedDefense() { - int total = getCurrentToughness(); - - total += getTempDefenseBoost() + getSemiPermanentDefenseBoost() - + getCounters(Counters.P1P1) + (2 * getCounters(Counters.P1P2)) - - getCounters(Counters.M1M1) + getCounters(Counters.P0P1) - - (2 * getCounters(Counters.M0M2)) - + (2 * getCounters(Counters.P2P2)) - getCounters(Counters.M0M1) - - getCounters(Counters.M2M1) - (2 * getCounters(Counters.M2M2)); - return total; - } - - /** - *

getNetDefense.

- * - * @return a int. - */ - public int getNetDefense() { - if (this.getAmountOfKeyword("CARDNAME's power and toughness are switched") % 2 != 0) - return getUnswitchedAttack(); - else return getUnswitchedDefense(); - } - - //How much combat damage does the card deal - /** - *

getNetCombatDamage.

- * - * @return a int. - */ - public int getNetCombatDamage() { - if (AllZoneUtil.isCardInPlay("Doran, the Siege Tower")) return getNetDefense(); - return getNetAttack(); - } - - /** - *

Setter for the field randomPicture.

- * - * @param n a int. - */ - public void setRandomPicture(int n) { - randomPicture = n; - } - - /** - *

Getter for the field randomPicture.

- * - * @return a int. - */ - public int getRandomPicture() { - return randomPicture; - } - - /** - *

addMultiKickerMagnitude.

- * - * @param n a int. - */ - public void addMultiKickerMagnitude(int n) { - multiKickerMagnitude += n; - } - - /** - *

Setter for the field multiKickerMagnitude.

- * - * @param n a int. - */ - public void setMultiKickerMagnitude(int n) { - multiKickerMagnitude = n; - } - - /** - *

Getter for the field multiKickerMagnitude.

- * - * @return a int. - */ - public int getMultiKickerMagnitude() { - return multiKickerMagnitude; - } - - /** - *

addReplicateMagnitude.

- * - * @param n a int. - */ - public void addReplicateMagnitude(int n) { - replicateMagnitude += n; - } - - /** - *

Setter for the field replicateMagnitude.

- * - * @param n a int. - */ - public void setReplicateMagnitude(int n) { - replicateMagnitude = n; - } - - /** - *

Getter for the field replicateMagnitude.

- * - * @return a int. - */ - public int getReplicateMagnitude() { - return replicateMagnitude; - } - - //for cards like Giant Growth, etc. - /** - *

Getter for the field tempAttackBoost.

- * - * @return a int. - */ - public int getTempAttackBoost() { - return tempAttackBoost; - } - - /** - *

Getter for the field tempDefenseBoost.

- * - * @return a int. - */ - public int getTempDefenseBoost() { - return tempDefenseBoost; - } - - /** - *

addTempAttackBoost.

- * - * @param n a int. - */ - public void addTempAttackBoost(int n) { - tempAttackBoost += n; - } - - /** - *

addTempDefenseBoost.

- * - * @param n a int. - */ - public void addTempDefenseBoost(int n) { - tempDefenseBoost += n; - } - - /** - *

Setter for the field tempAttackBoost.

- * - * @param n a int. - */ - public void setTempAttackBoost(int n) { - tempAttackBoost = n; - } - - /** - *

Setter for the field tempDefenseBoost.

- * - * @param n a int. - */ - public void setTempDefenseBoost(int n) { - tempDefenseBoost = n; - } - - //for cards like Glorious Anthem, etc. - /** - *

Getter for the field semiPermanentAttackBoost.

- * - * @return a int. - */ - public int getSemiPermanentAttackBoost() { - return semiPermanentAttackBoost; - } - - /** - *

Getter for the field semiPermanentDefenseBoost.

- * - * @return a int. - */ - public int getSemiPermanentDefenseBoost() { - return semiPermanentDefenseBoost; - } - - /** - *

addSemiPermanentAttackBoost.

- * - * @param n a int. - */ - public void addSemiPermanentAttackBoost(int n) { - semiPermanentAttackBoost += n; - } - - /** - *

addSemiPermanentDefenseBoost.

- * - * @param n a int. - */ - public void addSemiPermanentDefenseBoost(int n) { - semiPermanentDefenseBoost += n; - } - - /** - *

Setter for the field semiPermanentAttackBoost.

- * - * @param n a int. - */ - public void setSemiPermanentAttackBoost(int n) { - semiPermanentAttackBoost = n; - } - - /** - *

Setter for the field semiPermanentDefenseBoost.

- * - * @param n a int. - */ - public void setSemiPermanentDefenseBoost(int n) { - semiPermanentDefenseBoost = n; - } - - /** - *

isUntapped.

- * - * @return a boolean. - */ - public boolean isUntapped() { - return !tapped; - } - - /** - *

isTapped.

- * - * @return a boolean. - */ - public boolean isTapped() { - return tapped; - } - - /** - *

Setter for the field tapped.

- * - * @param b a boolean. - */ - public void setTapped(boolean b) { - tapped = b; - updateObservers(); - } - - /** - *

tap.

- */ - public void tap() { - if (isUntapped()) { - //Run triggers - Map runParams = new TreeMap(); - runParams.put("Card", this); - AllZone.getTriggerHandler().runTrigger("Taps", runParams); - } - setTapped(true); - } - - /** - *

untap.

- */ - public void untap() { - if (isTapped()) { - //Run triggers - Map runParams = new TreeMap(); - runParams.put("Card", this); - AllZone.getTriggerHandler().runTrigger("Untaps", runParams); - - } - - for (Command var : untapCommandList) { - var.execute(); - } - - setTapped(false); - } - - /** - *

isUnCastable.

- * - * @return a boolean. - */ - public boolean isUnCastable() { - return unCastable; - } - - /** - *

Setter for the field unCastable.

- * - * @param b a boolean. - */ - public void setUnCastable(boolean b) { - unCastable = b; - updateObservers(); - } - - //keywords are like flying, fear, first strike, etc... - /** - *

getKeyword.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getKeyword() { - ArrayList a1 = new ArrayList(getIntrinsicKeyword()); - ArrayList a2 = new ArrayList(getExtrinsicKeyword()); - ArrayList a4 = new ArrayList(getHiddenExtrinsicKeyword()); - a1.addAll(a2); - a1.addAll(a4); - - // SOL Changes for Mana - //for(Ability_Mana sa:getManaAbility()) - // if(sa.isBasic()) a1.add((sa).orig); - - return a1; - } - - //keywords are like flying, fear, first strike, etc... - // Hidden keywords will be left out - /** - *

getUnhiddenKeyword.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getUnhiddenKeyword() { - ArrayList a1 = new ArrayList(getIntrinsicKeyword()); - ArrayList a2 = new ArrayList(getExtrinsicKeyword()); - a1.addAll(a2); - - // SOL Changes for Mana - //for(Ability_Mana sa:getManaAbility()) - // if(sa.isBasic()) a1.add((sa).orig); - - return a1; - } - - /** - *

getIntrinsicAbilities.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getIntrinsicAbilities() { - return intrinsicAbility; - } - - /** - *

Getter for the field intrinsicKeyword.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getIntrinsicKeyword() { - return new ArrayList(intrinsicKeyword); - } - - /** - *

clearIntrinsicKeyword.

- */ - public void clearIntrinsicKeyword() { - intrinsicKeyword.clear(); - } - - /** - *

Setter for the field intrinsicKeyword.

- * - * @param a a {@link java.util.ArrayList} object. - */ - public void setIntrinsicKeyword(ArrayList a) { - intrinsicKeyword = new ArrayList(a); - } - - /** - *

clearAllKeywords.

- */ - public void clearAllKeywords() { - intrinsicKeyword.clear(); - extrinsicKeyword.clear(); - HiddenExtrinsicKeyword.clear(); //Hidden keywords won't be displayed on the card - } - - /** - *

setIntrinsicAbilities.

- * - * @param a a {@link java.util.ArrayList} object. - */ - public void setIntrinsicAbilities(ArrayList a) { - intrinsicAbility = new ArrayList(a); - } - - /** - *

addIntrinsicKeyword.

- * - * @param s a {@link java.lang.String} object. - */ - public void addIntrinsicKeyword(String s) { - if (s.trim().length() != 0) - intrinsicKeyword.add(s); - //intrinsicKeyword.add((getName().trim().length()== 0 ? s :s.replaceAll(getName(), "CARDNAME"))); - } - - /** - *

addIntrinsicAbility.

- * - * @param s a {@link java.lang.String} object. - */ - public void addIntrinsicAbility(String s) { - if (s.trim().length() != 0) - intrinsicAbility.add(s); - } - - /** - *

addNonStackingIntrinsicKeyword.

- * - * @param s a {@link java.lang.String} object. - */ - public void addNonStackingIntrinsicKeyword(String s) { - if (!getIntrinsicKeyword().contains(s) && s.trim().length() != 0) { - intrinsicKeyword.add((getName().trim().length() == 0 ? s : s.replaceAll(getName(), "CARDNAME"))); - } - } - - /** - *

removeIntrinsicKeyword.

- * - * @param s a {@link java.lang.String} object. - */ - public void removeIntrinsicKeyword(String s) { - intrinsicKeyword.remove(s); - } - - /** - *

getIntrinsicKeywordSize.

- * - * @return a int. - */ - public int getIntrinsicKeywordSize() { - return intrinsicKeyword.size(); - } - - /** - *

Getter for the field extrinsicKeyword.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getExtrinsicKeyword() { - return new ArrayList(extrinsicKeyword); - } - - /** - *

Setter for the field extrinsicKeyword.

- * - * @param a a {@link java.util.ArrayList} object. - */ - public void setExtrinsicKeyword(ArrayList a) { - extrinsicKeyword = new ArrayList(a); - } - - /** - *

addExtrinsicKeyword.

- * - * @param s a {@link java.lang.String} object. - */ - public void addExtrinsicKeyword(String s) { - //if(!hasKeyword(s)){ - if (s.startsWith("HIDDEN")) addHiddenExtrinsicKeyword(s); - else - extrinsicKeyword.add(s); - //extrinsicKeyword.add((getName().trim().length()==0 ? s :s.replaceAll(getName(), "CARDNAME"))); - //} - } - - /** - *

addStackingExtrinsicKeyword.

- * - * @param s a {@link java.lang.String} object. - */ - public void addStackingExtrinsicKeyword(String s) { - if (s.startsWith("HIDDEN")) addHiddenExtrinsicKeyword(s); - else extrinsicKeyword.add(s); - } - - /** - *

removeExtrinsicKeyword.

- * - * @param s a {@link java.lang.String} object. - */ - public void removeExtrinsicKeyword(String s) { - if (s.startsWith("HIDDEN")) removeHiddenExtrinsicKeyword(s); - else extrinsicKeyword.remove(s); - } - - /** - *

getExtrinsicKeywordSize.

- * - * @return a int. - */ - public int getExtrinsicKeywordSize() { - return extrinsicKeyword.size(); - } - - /** - *

Getter for the field prevIntrinsicKeyword.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getPrevIntrinsicKeyword() { - return new ArrayList(prevIntrinsicKeyword); - } - - /** - *

Setter for the field prevIntrinsicKeyword.

- * - * @param a a {@link java.util.ArrayList} object. - */ - public void setPrevIntrinsicKeyword(ArrayList a) { - prevIntrinsicKeyword = new ArrayList(a); - this.updateObservers(); - } - - /** - *

addPrevIntrinsicKeyword.

- * - * @param s a {@link java.lang.String} object. - */ - public void addPrevIntrinsicKeyword(String s) { - prevIntrinsicKeyword.add(s); - } - - /** - *

removePrevIntrinsicKeyword.

- * - * @param s a {@link java.lang.String} object. - */ - public void removePrevIntrinsicKeyword(String s) { - prevIntrinsicKeyword.remove(s); - this.updateObservers(); - } - - /** - *

getPrevIntrinsicKeywordSize.

- * - * @return a int. - */ - public int getPrevIntrinsicKeywordSize() { - return prevIntrinsicKeyword.size(); - } - - // Hidden Keywords will be returned without the indicator HIDDEN - /** - *

getHiddenExtrinsicKeyword.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getHiddenExtrinsicKeyword() { - ArrayList keywords = new ArrayList(); - for (int i = 0; i < HiddenExtrinsicKeyword.size(); i++) { - String keyword = HiddenExtrinsicKeyword.get(i); - keywords.add(keyword.substring(7)); - } - return keywords; - } - - /** - *

addHiddenExtrinsicKeyword.

- * - * @param s a {@link java.lang.String} object. - */ - public void addHiddenExtrinsicKeyword(String s) { - HiddenExtrinsicKeyword.add(s); - } - - /** - *

removeHiddenExtrinsicKeyword.

- * - * @param s a {@link java.lang.String} object. - */ - public void removeHiddenExtrinsicKeyword(String s) { - HiddenExtrinsicKeyword.remove(s); - //this.updateObservers(); - } - - /** - *

setStaticAbilityStrings.

- * - * @param a a {@link java.util.ArrayList} object. - */ - public void setStaticAbilityStrings(ArrayList a) { - staticAbilityStrings = new ArrayList(a); - } - - public ArrayList getStaticAbilityStrings() { - return staticAbilityStrings; - } - - /** - *

addStaticAbilityStrings.

- * - * @param s a {@link java.lang.String} object. - */ - public void addStaticAbilityString(String s) { - if (s.trim().length() != 0) - staticAbilityStrings.add(s); - } - - public void setStaticAbilities(ArrayList a) { - staticAbilities = new ArrayList(a); - } - - public ArrayList getStaticAbilities() { - return new ArrayList(staticAbilities); - } - - public void addStaticAbility(String s) { - - if (s.trim().length() != 0) { - StaticAbility stAb = new StaticAbility(s,this); - staticAbilities.add(stAb); - } - } - - /** - *

isPermanent.

- * - * @return a boolean. - */ - public boolean isPermanent() { - return !(isInstant() || isSorcery() || isImmutable()); - } - - /** - *

isSpell.

- * - * @return a boolean. - */ - public boolean isSpell() { - return (isInstant() || isSorcery() || (isAura() && !AllZoneUtil.getCardsInPlay().contains(this))); - } - - /** - *

isCreature.

- * - * @return a boolean. - */ - public boolean isCreature() { - return typeContains("Creature"); - } - - /** - *

isWall.

- * - * @return a boolean. - */ - public boolean isWall() { - return typeContains("Wall"); - } - - /** - *

isBasicLand.

- * - * @return a boolean. - */ - public boolean isBasicLand() { - return typeContains("Basic"); - } - - /** - *

isLand.

- * - * @return a boolean. - */ - public boolean isLand() { - return typeContains("Land"); - } - - /** - *

isSorcery.

- * - * @return a boolean. - */ - public boolean isSorcery() { - return typeContains("Sorcery"); - } - - /** - *

isInstant.

- * - * @return a boolean. - */ - public boolean isInstant() { - return typeContains("Instant"); - } - - /** - *

isArtifact.

- * - * @return a boolean. - */ - public boolean isArtifact() { - return typeContains("Artifact"); - } - - /** - *

isEquipment.

- * - * @return a boolean. - */ - public boolean isEquipment() { - return typeContains("Equipment"); - } - - /** - *

isPlaneswalker.

- * - * @return a boolean. - */ - public boolean isPlaneswalker() { - return typeContains("Planeswalker"); - } - - /** - *

isEmblem.

- * - * @return a boolean. - */ - public boolean isEmblem() { - return typeContains("Emblem"); - } - - /** - *

isTribal.

- * - * @return a boolean. - */ - public boolean isTribal() { - return typeContains("Tribal"); - } - - /** - *

isSnow.

- * - * @return a boolean. - */ - public boolean isSnow() { - return typeContains("Snow"); - } - - //global and local enchantments - /** - *

isEnchantment.

- * - * @return a boolean. - */ - public boolean isEnchantment() { - return typeContains("Enchantment"); - } - - /** - *

isAura.

- * - * @return a boolean. - */ - public boolean isAura() { - return typeContains("Aura"); - } - - /** - *

isGlobalEnchantment.

- * - * @return a boolean. - */ - public boolean isGlobalEnchantment() { - return typeContains("Enchantment") && (!isAura()); - } - - private boolean typeContains(String s) { - Iterator it = this.getType().iterator(); - while (it.hasNext()) - if (it.next().toString().startsWith(s)) return true; - - return false; - } - - /** - *

Setter for the field uniqueNumber.

- * - * @param n a int. - */ - public void setUniqueNumber(int n) { - uniqueNumber = n; - this.updateObservers(); - } - - /** - *

Getter for the field uniqueNumber.

- * - * @return a int. - */ - public int getUniqueNumber() { - return uniqueNumber; - } - - /** - *

Setter for the field value.

- * - * @param n a long. - */ - public void setValue(long n) { - value = n; - } - - /** - *

Getter for the field value.

- * - * @return a long. - */ - public long getValue() { - return value; - } - - /** {@inheritDoc} */ - @Override - public int compareTo(Card that) { - /* - * Return a negative integer of this < that, - * a positive integer if this > that, - * and zero otherwise. - */ - - if (that == null) { - /* - * "Here we can arbitrarily decide that all non-null Cards are - * `greater than' null Cards. It doesn't really matter what we - * return in this case, as long as it is consistent. I rather think - * of null as being lowly." --Braids - */ - return +1; - } - else if (getUniqueNumber() > that.getUniqueNumber()) { - return +1; - } - else if (getUniqueNumber() < that.getUniqueNumber()) { - return -1; - } - else { - return 0; - } - } - - /** {@inheritDoc} */ - @Override - public boolean equals(Object o) { - if (o instanceof Card) { - Card c = (Card) o; - int a = getUniqueNumber(); - int b = c.getUniqueNumber(); - return (a == b); - } - return false; - } - - /** {@inheritDoc} */ - @Override - public int hashCode() { - return getUniqueNumber(); - } - - /** {@inheritDoc} */ - @Override - public String toString() { - return this.getName() + " (" + this.getUniqueNumber() + ")"; - } - - /** - *

hasFlashback.

- * - * @return a boolean. - */ - public boolean hasFlashback() { - return flashback; - } - - /** - *

Setter for the field flashback.

- * - * @param b a boolean. - */ - public void setFlashback(boolean b) { - flashback = b; - } - - /** - *

hasUnearth.

- * - * @return a boolean. - */ - public boolean hasUnearth() { - return unearth; - } - - /** - *

Setter for the field unearth.

- * - * @param b a boolean. - */ - public void setUnearth(boolean b) { - unearth = b; - } - - /** - *

isUnearthed.

- * - * @return a boolean. - */ - public boolean isUnearthed() { - return unearthed; - } - - /** - *

Setter for the field unearthed.

- * - * @param b a boolean. - */ - public void setUnearthed(boolean b) { - unearthed = b; - } - - /** - *

hasMadness.

- * - * @return a boolean. - */ - public boolean hasMadness() { - return madness; - } - - /** - *

Setter for the field madness.

- * - * @param b a boolean. - */ - public void setMadness(boolean b) { - madness = b; - } - - /** - *

Getter for the field madnessCost.

- * - * @return a {@link java.lang.String} object. - */ - public String getMadnessCost() { - return madnessCost; - } - - /** - *

Setter for the field madnessCost.

- * - * @param cost a {@link java.lang.String} object. - */ - public void setMadnessCost(String cost) { - madnessCost = cost; - } - - /** - *

hasSuspend.

- * - * @return a boolean. - */ - public boolean hasSuspend() { - return suspend; - } - - /** - *

Setter for the field suspend.

- * - * @param b a boolean. - */ - public void setSuspend(boolean b) { - suspend = b; - } - - /** - *

wasSuspendCast.

- * - * @return a boolean. - */ - public boolean wasSuspendCast() { - return suspendCast; - } - - /** - *

Setter for the field suspendCast.

- * - * @param b a boolean. - */ - public void setSuspendCast(boolean b) { - suspendCast = b; - } - - /** - *

Setter for the field kicked.

- * - * @param b a boolean. - */ - public void setKicked(boolean b) { - kicked = b; - } - - /** - *

isKicked.

- * - * @return a boolean. - */ - public boolean isKicked() { - return kicked; - } - - /** - *

isReflectedLand.

- * - * @return a boolean. - */ - public boolean isReflectedLand() { - for(Ability_Mana am : manaAbility) - if (am.isReflectedMana()) - return true; - - return false; - } - - /** - *

hasKeyword.

- * - * @param keyword a {@link java.lang.String} object. - * @return a boolean. - */ - public boolean hasKeyword(String keyword) { - return getKeyword().contains(keyword); - } - - /** - *

hasStartOfKeyword.

- * - * @param keyword a {@link java.lang.String} object. - * @return a boolean. - */ - public boolean hasStartOfKeyword(String keyword) { - ArrayList a = getKeyword(); - for (int i = 0; i < a.size(); i++) - if (a.get(i).toString().startsWith(keyword)) return true; - return false; - } - - /** - *

hasStartOfKeyword.

- * - * @param keyword a {@link java.lang.String} object. - * @return a boolean. - */ - public boolean hasStartOfUnHiddenKeyword(String keyword) { - ArrayList a = this.getUnhiddenKeyword(); - for (int i = 0; i < a.size(); i++) - if (a.get(i).toString().startsWith(keyword)) return true; - return false; - } - - /** - *

getKeywordPosition.

- * - * @param k a {@link java.lang.String} object. - * @return a int. - */ - public int getKeywordPosition(String k) { - ArrayList a = getKeyword(); - for (int i = 0; i < a.size(); i++) - if (a.get(i).toString().startsWith(k)) return i; - return -1; - } - - /** - *

keywordsContain.

- * - * @param keyword a {@link java.lang.String} object. - * @return a boolean. - */ - public boolean keywordsContain(String keyword) { - ArrayList a = getKeyword(); - for (int i = 0; i < a.size(); i++) - if (a.get(i).toString().contains(keyword)) return true; - return false; - } - - - /** - *

hasAnyKeyword.

- * - * @param keywords an array of {@link java.lang.String} objects. - * @return a boolean. - */ - public boolean hasAnyKeyword(String keywords[]) { - for (int i = 0; i < keywords.length; i++) - if (hasKeyword(keywords[i])) - return true; - - return false; - } - - /** - *

hasAnyKeyword.

- * - * @param keywords a {@link java.util.ArrayList} object. - * @return a boolean. - */ - public boolean hasAnyKeyword(ArrayList keywords) { - for (int i = 0; i < keywords.size(); i++) - if (hasKeyword(keywords.get(i))) - return true; - - return false; - } - - //This counts the number of instances of a keyword a card has - /** - *

getAmountOfKeyword.

- * - * @param k a {@link java.lang.String} object. - * @return a int. - */ - public int getAmountOfKeyword(String k) { - int count = 0; - ArrayList keywords = getKeyword(); - for (int j = 0; j < keywords.size(); j++) { - if (keywords.get(j).equals(k)) count++; - } - - return count; - } - - // This is for keywords with a number like Bushido, Annihilator and Rampage. It returns the total. - /** - *

getKeywordMagnitude.

- * - * @param k a {@link java.lang.String} object. - * @return a int. - */ - public int getKeywordMagnitude(String k) { - int count = 0; - ArrayList keywords = getKeyword(); - for (String kw : keywords) { - if (kw.startsWith(k)) { - String[] parse = kw.split(" "); - String s = parse[1]; - count += Integer.parseInt(s); - } - } - return count; - } - - private String toMixedCase(String s) { - if (s.equals("")) return s; - StringBuilder sb = new StringBuilder(); - // to handle hyphenated Types - String[] types = s.split("-"); - for (int i = 0; i < types.length; i++) { - if (i != 0) - sb.append("-"); - sb.append(types[i].substring(0, 1).toUpperCase()); - sb.append(types[i].substring(1).toLowerCase()); - } - - return sb.toString(); - } - - //usable to check for changelings - /** - *

isType.

- * - * @param cardType a {@link java.lang.String} object. - * @return a boolean. - */ - public boolean isType(String cardType) { - cardType = toMixedCase(cardType); - - if (typeContains(cardType) - || ((isCreature() || isTribal()) - && CardUtil.isACreatureType(cardType) && hasKeyword("Changeling"))) return true; - return false; - } - - - /** - *

isValidCard.

- * Takes an array of arguments like Permanent.Blue+withFlying, only one of them has to be true - * - * @param Restrictions an array of {@link java.lang.String} objects. - * @param sourceController a {@link forge.Player} object. - * @param source a {@link forge.Card} object. - * @return a boolean. - */ - public boolean isValidCard(final String Restrictions[], final Player sourceController, final Card source) { - - if (getName().equals("Mana Pool") || isImmutable()) return false; - - for (int i = 0; i < Restrictions.length; i++) { - if (isValid(Restrictions[i], sourceController, source)) return true; - } - return false; - - }//isValidCard - - - // Takes one argument like Permanent.Blue+withFlying - /** - *

isValid.

- * - * @param Restriction a {@link java.lang.String} object. - * @param sourceController a {@link forge.Player} object. - * @param source a {@link forge.Card} object. - * @return a boolean. - */ - public boolean isValid(final String Restriction, final Player sourceController, final Card source) { - - if (getName().equals("Mana Pool") || isImmutable()) return false; - if (Restriction.equals("False")) return false; - - String incR[] = Restriction.split("\\."); // Inclusive restrictions are Card types - - if (incR[0].equals("Spell") && !isSpell()) - return false; - if (incR[0].equals("Permanent") && (isInstant() || isSorcery())) - return false; - if (!incR[0].equals("card") - && !incR[0].equals("Card") - && !incR[0].equals("Spell") - && !incR[0].equals("Permanent") - && !(isType(incR[0]))) - return false; //Check for wrong type - - if (incR.length > 1) { - final String excR = incR[1]; - String exR[] = excR.split("\\+"); // Exclusive Restrictions are ... - for (int j = 0; j < exR.length; j++) - if (hasProperty(exR[j], sourceController, source) == false) return false; - } - return true; - }//isValidCard(String Restriction) - - // Takes arguments like Blue or withFlying - /** - *

hasProperty.

- * - * @param Property a {@link java.lang.String} object. - * @param sourceController a {@link forge.Player} object. - * @param source a {@link forge.Card} object. - * @return a boolean. - */ - public boolean hasProperty(String Property, final Player sourceController, final Card source) { - //by name can also have color names, so needs to happen before colors. - if (Property.startsWith("named")) { - if (!getName().equals(Property.substring(5))) return false; - } else if (Property.startsWith("notnamed")) { - if (getName().equals(Property.substring(8))) return false; - } else if (Property.startsWith("sameName")) { - if (!getName().equals(source.getName())) return false; - } - // ... Card colors - else if (Property.contains("White") - || Property.contains("Blue") - || Property.contains("Black") - || Property.contains("Red") - || Property.contains("Green") - || Property.contains("Colorless")) { - if (Property.startsWith("non")) { - if (CardUtil.getColors(this).contains(Property.substring(3).toLowerCase())) return false; - } else if (!CardUtil.getColors(this).contains(Property.toLowerCase())) return false; - } else if (Property.contains("MultiColor")) // ... Card is multicolored - { - if (Property.startsWith("non") && (CardUtil.getColors(this).size() > 1)) return false; - if (!Property.startsWith("non") && (CardUtil.getColors(this).size() <= 1)) return false; - } else if (Property.contains("MonoColor")) // ... Card is monocolored - { - if (Property.startsWith("non") && (CardUtil.getColors(this).size() == 1 && !isColorless())) return false; - if (!Property.startsWith("non") && (CardUtil.getColors(this).size() > 1 || isColorless())) return false; - } else if (Property.startsWith("YouCtrl")) { - if (!getController().isPlayer(sourceController)) return false; - } else if (Property.startsWith("YouDontCtrl")) { - if (getController().isPlayer(sourceController)) return false; - } else if (Property.startsWith("YouOwn")) { - if (!getOwner().isPlayer(sourceController)) return false; - } else if (Property.startsWith("YouDontOwn")) { - if (getOwner().isPlayer(sourceController)) return false; - } else if (Property.startsWith("ControllerControls")) { - String type = Property.substring(18); - CardList list = AllZoneUtil.getPlayerCardsInPlay(getController()); - if (list.getType(type).isEmpty()) return false; - } else if (Property.startsWith("Other")) { - if (this.equals(source)) return false; - } else if (Property.startsWith("Self")) { - if (!this.equals(source)) return false; - } else if (Property.startsWith("AttachedBy")) { - if (!equippedBy.contains(source) && !enchantedBy.contains(source)) return false; - } else if (Property.startsWith("Attached")) { - if (!equipping.contains(source) && !enchanting.contains(source)) return false; - } else if (Property.startsWith("EnchantedBy")) { - if (!enchantedBy.contains(source)) return false; - } else if (Property.startsWith("Enchanted")) { - if (!enchanting.contains(source)) return false; - } else if (Property.startsWith("EquippedBy")) { - if (!equippedBy.contains(source)) return false; - } else if (Property.startsWith("Equipped")) { - if (!equipping.contains(source)) return false; - } else if (Property.startsWith("Above")){ // "Are Above" Source - CardList list = AllZoneUtil.getPlayerGraveyard(this.getOwner()); - if (!list.getAbove(source, this)) - return false; - }else if (Property.startsWith("DirectlyAbove")){ // "Are Directly Above" Source - CardList list = AllZoneUtil.getPlayerGraveyard(this.getOwner()); - if (!list.getDirectlyAbove(source, this)) - return false; - } else if (Property.startsWith("Cloned")) { - if (cloneOrigin == null || !cloneOrigin.equals(source)) return false; - } else if (Property.startsWith("DamagedBy")) { - if (!receivedDamageFromThisTurn.containsKey(source)) return false; - } else if (Property.startsWith("Damaged")) { - if (!dealtDamageToThisTurn.containsKey(source)) return false; - } else if (Property.startsWith("SharesColorWith")) { - if (!sharesColorWith(source)) return false; - } else if (Property.startsWith("with")) // ... Card keywords - { - if (Property.startsWith("without") && hasStartOfUnHiddenKeyword(Property.substring(7))) return false; - if (!Property.startsWith("without") && !hasStartOfUnHiddenKeyword(Property.substring(4))) return false; - } else if (Property.startsWith("tapped")) { - if (!isTapped()) return false; - } else if (Property.startsWith("untapped")) { - if (!isUntapped()) return false; - } else if (Property.startsWith("faceDown")) { - if (!isFaceDown()) return false; - } else if (Property.startsWith("hasLevelUp")) { - if (!hasLevelUp()) return false; - } else if (Property.startsWith("enteredBattlefieldThisTurn")) { - if (!(getTurnInZone() == AllZone.getPhase().getTurn())) return false; - } else if (Property.startsWith("dealtDamageToYouThisTurn")) { - if (!(dealtDmgToHumanThisTurn && getController().isPlayer(AllZone.getComputerPlayer())) - && !(dealtDmgToComputerThisTurn && getController().isPlayer(AllZone.getHumanPlayer()))) - return false; - } else if (Property.startsWith("wasDealtDamageThisTurn")) { - if ((getReceivedDamageFromThisTurn().keySet()).isEmpty()) return false; - } else if (Property.startsWith("enchanted")) { - if (!isEnchanted()) return false; - } else if (Property.startsWith("unenchanted")) { - if (isEnchanted()) return false; - } else if (Property.startsWith("enchanting")) { - if (!isEnchanting()) return false; - } else if (Property.startsWith("equipped")) { - if (!isEquipped()) return false; - } else if (Property.startsWith("unequipped")) { - if (isEquipped()) return false; - } else if (Property.startsWith("equipping")) { - if (!isEquipping()) return false; - } else if (Property.startsWith("token")) { - if (!isToken()) return false; - } else if (Property.startsWith("nonToken")) { - if (isToken()) return false; - } else if (Property.startsWith("power") || // 8/10 - Property.startsWith("toughness") || - Property.startsWith("cmc")) { - int x = 0; - int y = 0; - int z = 0; - - if (Property.startsWith("power")) { - z = 7; - y = getNetAttack(); - } else if (Property.startsWith("toughness")) { - z = 11; - y = getNetDefense(); - } else if (Property.startsWith("cmc")) { - z = 5; - y = getCMC(); - } - - if (Property.substring(z).equals("X")) { - x = CardFactoryUtil.xCount(source, source.getSVar("X")); - } else if (Property.substring(z).equals("Y")) { - x = CardFactoryUtil.xCount(source, source.getSVar("Y")); - } else - x = Integer.parseInt(Property.substring(z)); - - if (!AllZoneUtil.compare(y, Property, x)) - return false; - } - - // syntax example: countersGE9 P1P1 or countersLT12TIME (greater number than 99 not supported) - /* - * slapshot5 - fair warning, you cannot use numbers with 2 digits (greater number than 9 not supported - * you can use X and the SVar:X:Number$12 to get two digits. This will need a better fix, and I have the - * beginnings of a regex below - */ - else if (Property.startsWith("counters")) { - /* - Pattern p = Pattern.compile("[a-z]*[A-Z][A-Z][X0-9]+.*$"); - String[] parse = ??? - System.out.println("Parsing completed of: "+Property); - for(int i = 0; i < parse.length; i++) { - System.out.println("parse["+i+"]: "+parse[i]); - }*/ - - // TODO: get a working regex out of this pattern so the amount of digits doesn't matter - int number = 0; - if (Property.substring(10, 11).equals("X")) - number = CardFactoryUtil.xCount(source, getSVar("X")); - else if (Property.substring(10, 11).equals("Y")) - number = CardFactoryUtil.xCount(source, getSVar("Y")); - else - number = Integer.parseInt(Property.substring(10, 11)); - - String type = Property.substring(11); - String comparator = Property.substring(8, 10); // comparator = EQ, LE, GE etc. - int actualnumber = getCounters(Counters.getType(type)); - - if (!AllZoneUtil.compare(actualnumber, comparator, number)) - return false; - } else if (Property.startsWith("attacking")) { - if (!isAttacking()) return false; - } else if (Property.startsWith("notattacking")) { - if (isAttacking()) return false; - } else if (Property.equals("blocking")) { - if (!isBlocking()) return false; - } else if (Property.startsWith("blockingSource")) { - if (!isBlocking(source)) return false; - } else if (Property.startsWith("notblocking")) { - if (isBlocking()) return false; - } else if (Property.startsWith("blocked")) { - if (!AllZone.getCombat().isBlocked(this)) return false; - } else if (Property.startsWith("blockedBySource")) { - if (!isBlockedBy(source)) return false; - } else if (Property.startsWith("unblocked")) { - if (!AllZone.getCombat().isUnblocked(this)) return false; - } else if (Property.startsWith("kicked")) { - if (!isKicked()) return false; - } else if (Property.startsWith("notkicked")) { - if (isKicked()) return false; - } else if (Property.startsWith("evoked")) { - if (!isEvoked()) return false; - } else if (Property.equals("HasDevoured")) { - if(devouredCards.size() == 0) return false; - } else if (Property.equals("HasNotDevoured")) { - if(devouredCards.size() != 0) return false; - } else if (Property.startsWith("non")) // ... Other Card types - { - if (isType(Property.substring(3))) return false; - } else if (Property.equals("CostsPhyrexianMana")) { - if (!manaCost.contains("P")) return false; - } else if (Property.equals("IsRemembered")) { - if(!source.getRemembered().contains(this)) return false; - } else { - if (Property.equals("ChosenType")) { - if (!isType(source.getChosenType())) return false; - } else { - if (!isType(Property)) return false; - } - } - return true; - }//hasProperty - - /** - *

setImmutable.

- * - * @param isImmutable a boolean. - */ - public void setImmutable(boolean isImmutable) { - this.isImmutable = isImmutable; - } - - /** - *

isImmutable.

- * - * @return a boolean. - */ - public boolean isImmutable() { - return isImmutable; - } - - /* - * there are easy checkers for Color. The CardUtil functions should - * be made part of the Card class, so calling out is not necessary - */ - - /** - *

isColor.

- * - * @param col a {@link java.lang.String} object. - * @return a boolean. - */ - public boolean isColor(String col) { - return CardUtil.getColors(this).contains(col); - } - - /** - *

isBlack.

- * - * @return a boolean. - */ - public boolean isBlack() { - return CardUtil.getColors(this).contains(Constant.Color.Black); - } - - /** - *

isBlue.

- * - * @return a boolean. - */ - public boolean isBlue() { - return CardUtil.getColors(this).contains(Constant.Color.Blue); - } - - /** - *

isRed.

- * - * @return a boolean. - */ - public boolean isRed() { - return CardUtil.getColors(this).contains(Constant.Color.Red); - } - - /** - *

isGreen.

- * - * @return a boolean. - */ - public boolean isGreen() { - return CardUtil.getColors(this).contains(Constant.Color.Green); - } - - /** - *

isWhite.

- * - * @return a boolean. - */ - public boolean isWhite() { - return CardUtil.getColors(this).contains(Constant.Color.White); - } - - /** - *

isColorless.

- * - * @return a boolean. - */ - public boolean isColorless() { - return CardUtil.getColors(this).contains(Constant.Color.Colorless); - } - - /** - *

sharesColorWith.

- * - * @param c1 a {@link forge.Card} object. - * @return a boolean. - */ - public boolean sharesColorWith(final Card c1) { - boolean shares = false; - shares |= (isBlack() && c1.isBlack()); - shares |= (isBlue() && c1.isBlue()); - shares |= (isGreen() && c1.isGreen()); - shares |= (isRed() && c1.isRed()); - shares |= (isWhite() && c1.isWhite()); - return shares; - } - - /** - *

isAttacking.

- * - * @return a boolean. - */ - public boolean isAttacking() { - return AllZone.getCombat().isAttacking(this); - } - - /** - *

isBlocking.

- * - * @return a boolean. - */ - public boolean isBlocking() { - CardList blockers = AllZone.getCombat().getAllBlockers(); - return blockers.contains(this); - } - - /** - *

isBlocking.

- * - * @param attacker a {@link forge.Card} object. - * @return a boolean. - */ - public boolean isBlocking(Card attacker) { - return attacker.equals(AllZone.getCombat().getAttackerBlockedBy(this)); - } - - /** - *

isBlockedBy.

- * - * @param blocker a {@link forge.Card} object. - * @return a boolean. - */ - public boolean isBlockedBy(Card blocker) { - return this.equals(AllZone.getCombat().getAttackerBlockedBy(blocker)); - } - - /////////////////////////// - // - // Damage code - // - ////////////////////////// - - //all damage to cards is now handled in Card.java, no longer AllZone.getGameAction()... - /** - *

addReceivedDamageFromThisTurn.

- * - * @param c a {@link forge.Card} object. - * @param damage a int. - */ - public void addReceivedDamageFromThisTurn(Card c, int damage) { - receivedDamageFromThisTurn.put(c, damage); - } - - /** - *

Setter for the field receivedDamageFromThisTurn.

- * - * @param receivedDamageList a Map object. - */ - public void setReceivedDamageFromThisTurn(Map receivedDamageList) { - receivedDamageFromThisTurn = receivedDamageList; - } - - /** - *

Getter for the field receivedDamageFromThisTurn.

- * - * @return a Map object. - */ - public Map getReceivedDamageFromThisTurn() { - return receivedDamageFromThisTurn; - } - - /** - *

resetReceivedDamageFromThisTurn.

- */ - public void resetReceivedDamageFromThisTurn() { - receivedDamageFromThisTurn.clear(); - } - - /** - *

addDealtDamageToThisTurn.

- * - * @param c a {@link forge.Card} object. - * @param damage a int. - */ - public void addDealtDamageToThisTurn(Card c, int damage) { - dealtDamageToThisTurn.put(c, damage); - } - - /** - *

Setter for the field dealtDamageToThisTurn.

- * - * @param dealtDamageList a {@link java.util.Map} object. - */ - public void setDealtDamageToThisTurn(Map dealtDamageList) { - dealtDamageToThisTurn = dealtDamageList; - } - - /** - *

Getter for the field dealtDamageToThisTurn.

- * - * @return a {@link java.util.Map} object. - */ - public Map getDealtDamageToThisTurn() { - return dealtDamageToThisTurn; - } - - /** - *

resetDealtDamageToThisTurn.

- */ - public void resetDealtDamageToThisTurn() { - dealtDamageToThisTurn.clear(); - } - - //how much damage is enough to kill the creature (for AI) - /** - *

getEnoughDamageToKill.

- * - * @param maxDamage a int. - * @param source a {@link forge.Card} object. - * @param isCombat a boolean. - * @return a int. - */ - public int getEnoughDamageToKill(int maxDamage, Card source, boolean isCombat) { - return getEnoughDamageToKill(maxDamage, source, isCombat, false); - } - - /** - *

getEnoughDamageToKill.

- * - * @param maxDamage a int. - * @param source a {@link forge.Card} object. - * @param isCombat a boolean. - * @param noPrevention a boolean. - * @return a int. - */ - public int getEnoughDamageToKill(int maxDamage, Card source, boolean isCombat, boolean noPrevention) { - int killDamage = getKillDamage(); - - if (hasKeyword("Indestructible") || getShield() > 0) { - if (!(source.hasKeyword("Wither") || source.hasKeyword("Infect"))) - return maxDamage + 1; - } else if (source.hasKeyword("Deathtouch")) { - for (int i = 1; i <= maxDamage; i++) { - if (noPrevention) { - if (staticReplaceDamage(i, source, isCombat) > 0) - return i; - } else if (predictDamage(i, source, isCombat) > 0) - return i; - } - } - - for (int i = 1; i <= maxDamage; i++) { - if (noPrevention) { - if (staticReplaceDamage(i, source, isCombat) >= killDamage) - return i; - } else { - if (predictDamage(i, source, isCombat) >= killDamage) - return i; - } - } - - return maxDamage + 1; - } - - //the amount of damage needed to kill the creature (for AI) - /** - *

getKillDamage.

- * - * @return a int. - */ - public int getKillDamage() { - int killDamage = getLethalDamage() + preventNextDamage; - if (killDamage > preventNextDamage && hasStartOfKeyword("When CARDNAME is dealt damage, destroy it.")) - killDamage = 1 + preventNextDamage; - - return killDamage; - } - - //this is the minimal damage a trampling creature has to assign to a blocker - /** - *

getLethalDamage.

- * - * @return a int. - */ - public int getLethalDamage() { - int lethalDamage = getNetDefense() - getDamage() - getTotalAssignedDamage(); - - return lethalDamage; - } - - /** - *

Setter for the field damage.

- * - * @param n a int. - */ - public void setDamage(int n) { - //if (this.hasKeyword("Prevent all damage that would be dealt to CARDNAME.")) n = 0; - damage = n; - } - - /** - *

Getter for the field damage.

- * - * @return a int. - */ - public int getDamage() { - return damage; - } - - /** - *

addAssignedDamage.

- * - * @param damage a int. - * @param sourceCard a {@link forge.Card} object. - */ - public void addAssignedDamage(int damage, Card sourceCard) { - if (damage < 0) damage = 0; - - int assignedDamage = damage; - - Log.debug(this + " - was assigned " + assignedDamage + " damage, by " + sourceCard); - if (!assignedDamageMap.containsKey(sourceCard)) assignedDamageMap.put(sourceCard, assignedDamage); - else { - assignedDamageMap.put(sourceCard, assignedDamageMap.get(sourceCard) + assignedDamage); - } - - Log.debug("***"); - /* - if(sourceCards.size() > 1) - System.out.println("(MULTIPLE blockers):"); - System.out.println("Assigned " + damage + " damage to " + card); - for (int i=0;iclearAssignedDamage.

- */ - public void clearAssignedDamage() { - assignedDamageMap.clear(); - } - - /** - *

getTotalAssignedDamage.

- * - * @return a int. - */ - public int getTotalAssignedDamage() { - int total = 0; - - Collection c = assignedDamageMap.values(); - - Iterator itr = c.iterator(); - while (itr.hasNext()) - total += itr.next(); - - return total; - } - - /** - *

Getter for the field assignedDamageMap.

- * - * @return a {@link java.util.Map} object. - */ - public Map getAssignedDamageMap() { - return assignedDamageMap; - } - - /** - *

addCombatDamage.

- * - * @param map a {@link java.util.Map} object. - */ - public void addCombatDamage(Map map) { - CardList list = new CardList(); - - for (Entry entry : map.entrySet()) { - Card source = entry.getKey(); - list.add(source); - int damageToAdd = entry.getValue(); - - damageToAdd = replaceDamage(damageToAdd, source, true); - damageToAdd = preventDamage(damageToAdd, source, true); - - if (damageToAdd > 0 && isCreature()) { - GameActionUtil.executeCombatDamageToCreatureEffects(source, this, damageToAdd); - } - map.put(source, damageToAdd); - } - - if (AllZoneUtil.isCardInPlay(this)) { - addDamage(map); - } - } - - //This function helps the AI calculate the actual amount of damage an effect would deal - /** - *

predictDamage.

- * - * @param damage a int. - * @param possiblePrevention a int. - * @param source a {@link forge.Card} object. - * @param isCombat a boolean. - * @return a int. - */ - public int predictDamage(final int damage, final int possiblePrevention, final Card source, final boolean isCombat) { - - int restDamage = damage; - - restDamage = staticReplaceDamage(restDamage, source, isCombat); - - restDamage = staticDamagePrevention(restDamage, possiblePrevention, source, isCombat); - - return restDamage; - } - - //This function helps the AI calculate the actual amount of damage an effect would deal - /** - *

predictDamage.

- * - * @param damage a int. - * @param source a {@link forge.Card} object. - * @param isCombat a boolean. - * @return a int. - */ - public int predictDamage(final int damage, final Card source, final boolean isCombat) { - - int restDamage = damage; - - restDamage = staticReplaceDamage(restDamage, source, isCombat); - - restDamage = staticDamagePrevention(restDamage, source, isCombat); - - return restDamage; - } - - //This should be also usable by the AI to forecast an effect (so it must not change the game state) - /** - *

staticDamagePrevention.

- * - * @param damage a int. - * @param possiblePrvenetion a int. - * @param source a {@link forge.Card} object. - * @param isCombat a boolean. - * @return a int. - */ - public int staticDamagePrevention(final int damage, final int possiblePrvenetion, final Card source, final boolean isCombat) { - - if (AllZoneUtil.isCardInPlay("Leyline of Punishment")) return damage; - - int restDamage = damage - possiblePrvenetion; - - restDamage = staticDamagePrevention(restDamage, source, isCombat); - - return restDamage; - } - - //This should be also usable by the AI to forecast an effect (so it must not change the game state) - /** - *

staticDamagePrevention.

- * - * @param damage a int. - * @param source a {@link forge.Card} object. - * @param isCombat a boolean. - * @return a int. - */ - public int staticDamagePrevention(final int damage, final Card source, final boolean isCombat) { - - if (AllZoneUtil.isCardInPlay("Leyline of Punishment")) return damage; - - int restDamage = damage; - Player player = getController(); - - if (CardFactoryUtil.hasProtectionFrom(source, this)) return 0; - - if (isCombat) { - if (hasKeyword("Prevent all combat damage that would be dealt to and dealt by CARDNAME.")) return 0; - if (hasKeyword("Prevent all combat damage that would be dealt to CARDNAME.")) return 0; - if (source.hasKeyword("Prevent all combat damage that would be dealt to and dealt by CARDNAME.")) return 0; - if (source.hasKeyword("Prevent all combat damage that would be dealt by CARDNAME.")) return 0; - } - if (hasKeyword("Prevent all damage that would be dealt to CARDNAME.")) return 0; - if (hasKeyword("Prevent all damage that would be dealt to and dealt by CARDNAME.")) return 0; - if (source.hasKeyword("Prevent all damage that would be dealt to and dealt by CARDNAME.")) return 0; - if (source.hasKeyword("Prevent all damage that would be dealt by CARDNAME.")) return 0; - - if (hasStartOfKeyword("Absorb")) { - int absorbed = this.getKeywordMagnitude("Absorb"); - if (restDamage > absorbed) restDamage = restDamage - absorbed; - else return 0; - } - - if (hasStartOfKeyword("PreventAllDamageBy")) { - String valid = getKeyword().get(getKeywordPosition("PreventAllDamageBy")); - valid = valid.split(" ", 2)[1]; - if (source.isValid(valid, this.getController(), this)) - return 0; - } - - //stPreventDamage - CardList allp = AllZoneUtil.getCardsInPlay(); - for (Card ca : allp) { - if (ca.hasStartOfKeyword("stPreventDamage")) { - //syntax stPreventDamage:[Who is protected(You/Player/ValidCards)]:[ValidSource]:[Amount/All] - int KeywordPosition = ca.getKeywordPosition("stPreventDamage"); - String parse = ca.getKeyword().get(KeywordPosition).toString(); - String k[] = parse.split(":"); - - final String restrictions1[] = k[1].split(","); - final String restrictions2[] = k[2].split(","); - final Card card = ca; - if (this.isValidCard(restrictions1, card.getController(), card) - && source.isValidCard(restrictions2, card.getController(), card)) { - if (k[3].equals("All")) return 0; - restDamage = restDamage - Integer.valueOf(k[3]); - } - } - } //stPreventDamage - - // specific Cards - if (isCreature()) { //and not a planeswalker - if (getName().equals("Swans of Bryn Argoll")) return 0; - - if ((source.isCreature() && AllZoneUtil.isCardInPlay("Well-Laid Plans") && source.sharesColorWith(this))) - return 0; - - if ((!isCombat && AllZoneUtil.isCardInPlay("Mark of Asylum", player))) return 0; - - if (getName().equals("Callous Giant") && restDamage <= 3) return 0; - } //Creature end - - if (restDamage > 0) - return restDamage; - else return 0; - } - - /** - *

preventDamage.

- * - * @param damage a int. - * @param source a {@link forge.Card} object. - * @param isCombat a boolean. - * @return a int. - */ - public int preventDamage(final int damage, Card source, boolean isCombat) { - - if (AllZoneUtil.isCardInPlay("Leyline of Punishment")) return damage; - - int restDamage = damage; - - if (getName().equals("Swans of Bryn Argoll")) { - source.getController().drawCards(restDamage); - return 0; - } - - restDamage = staticDamagePrevention(restDamage, source, isCombat); - - if (restDamage == 0) return 0; - - if (this.hasKeyword("If damage would be dealt to CARDNAME, prevent that damage. Remove a +1/+1 counter from CARDNAME.")) { - restDamage = 0; - this.subtractCounter(Counters.P1P1, 1); - } - - if (restDamage >= preventNextDamage) { - restDamage = restDamage - preventNextDamage; - preventNextDamage = 0; - } else { - restDamage = 0; - preventNextDamage = preventNextDamage - restDamage; - } - - if (getName().equals("Phyrexian Hydra")) { - addCounter(Counters.M1M1, restDamage); - return 0; - } - - return restDamage; - } - - //This should be also usable by the AI to forecast an effect (so it must not change the game state) - /** - *

staticReplaceDamage.

- * - * @param damage a int. - * @param source a {@link forge.Card} object. - * @param isCombat a boolean. - * @return a int. - */ - public int staticReplaceDamage(final int damage, Card source, boolean isCombat) { - - int restDamage = damage; - - if (AllZoneUtil.isCardInPlay("Sulfuric Vapors") && source.isSpell() && source.isRed()) { - int amount = AllZoneUtil.getCardsInPlay("Sulfuric Vapors").size(); - for (int i = 0; i < amount; i++) - restDamage += 1; - } - - if (AllZoneUtil.isCardInPlay("Pyromancer's Swath", source.getController()) && (source.isInstant() || source.isSorcery()) - && isCreature()) { - int amount = AllZoneUtil.getPlayerCardsInPlay(source.getController(), "Pyromancer's Swath").size(); - for (int i = 0; i < amount; i++) - restDamage += 2; - } - - if (AllZoneUtil.isCardInPlay("Furnace of Rath") && isCreature()) { - int amount = AllZoneUtil.getCardsInPlay("Furnace of Rath").size(); - for (int i = 0; i < amount; i++) - restDamage += restDamage; - } - - if (AllZoneUtil.isCardInPlay("Gratuitous Violence", source.getController()) && source.isCreature() && isCreature()) { - int amount = AllZoneUtil.getPlayerCardsInPlay(source.getController(), "Gratuitous Violence").size(); - for (int i = 0; i < amount; i++) - restDamage += restDamage; - } - - if (AllZoneUtil.isCardInPlay("Fire Servant", source.getController()) && source.isRed() - && (source.isInstant() || source.isSorcery())) { - int amount = AllZoneUtil.getPlayerCardsInPlay(source.getController(), "Fire Servant").size(); - for (int i = 0; i < amount; i++) - restDamage += restDamage; - } - - if (AllZoneUtil.isCardInPlay("Benevolent Unicorn") && source.isSpell() && isCreature()) { - int amount = AllZoneUtil.getCardsInPlay("Benevolent Unicorn").size(); - for (int i = 0; i < amount; i++) - if (restDamage > 0) - restDamage -= 1; - } - - if (AllZoneUtil.isCardInPlay("Lashknife Barrier", getController()) && isCreature()) { - int amount = AllZoneUtil.getPlayerCardsInPlay(getController(), "Lashknife Barrier").size(); - for (int i = 0; i < amount; i++) - if (restDamage > 0) - restDamage -= 1; - } - - if (AllZoneUtil.isCardInPlay("Divine Presence") && isCreature() && restDamage > 3) { - - restDamage = 3; - } - - if (getName().equals("Phytohydra")) { - return 0; - } - - return restDamage; - } - - /** - *

replaceDamage.

- * - * @param damage a int. - * @param source a {@link forge.Card} object. - * @param isCombat a boolean. - * @return a int. - */ - public int replaceDamage(final int damage, Card source, boolean isCombat) { - - int restDamage = damage; - CardList auras = new CardList(getEnchantedBy().toArray()); - - if (getName().equals("Phytohydra")) { - addCounter(Counters.P1P1, restDamage); - return 0; - } - - if (auras.containsName("Treacherous Link")) { - getController().addDamage(restDamage, source); - return 0; - } - - restDamage = staticReplaceDamage(restDamage, source, isCombat); - - if (getName().equals("Lichenthrope")) { - addCounter(Counters.M1M1, restDamage); - return 0; - } - - return restDamage; - } - - /** - *

addDamage.

- * - * @param sourcesMap a {@link java.util.Map} object. - */ - public void addDamage(Map sourcesMap) { - for (Entry entry : sourcesMap.entrySet()) { - addDamageAfterPrevention(entry.getValue(), entry.getKey(), true); // damage prevention is already checked! - } - } - - //This is for noncombat damage - /** - *

addDamage.

- * - * @param damageIn a int. - * @param source a {@link forge.Card} object. - */ - public void addDamage(final int damageIn, final Card source) { - int damageToAdd = damageIn; - - damageToAdd = replaceDamage(damageToAdd, source, false); - damageToAdd = preventDamage(damageToAdd, source, false); - - addDamageAfterPrevention(damageToAdd, source, false); - - } - - /** - *

addDamageWithoutPrevention.

- * - * @param damageIn a int. - * @param source a {@link forge.Card} object. - */ - public void addDamageWithoutPrevention(final int damageIn, final Card source) { - int damageToAdd = damageIn; - - damageToAdd = replaceDamage(damageToAdd, source, false); - - addDamageAfterPrevention(damageToAdd, source, false); - } - - //This function handles damage after replacement and prevention effects are applied - /** - *

addDamageAfterPrevention.

- * - * @param damageIn a int. - * @param source a {@link forge.Card} object. - * @param isCombat a boolean. - */ - public void addDamageAfterPrevention(final int damageIn, final Card source, final boolean isCombat) { - int damageToAdd = damageIn; - boolean wither = false; - - if (damageToAdd == 0) return; //Rule 119.8 - - System.out.println("Adding " + damageToAdd + " damage to " + getName()); - Log.debug("Adding " + damageToAdd + " damage to " + getName()); - - addReceivedDamageFromThisTurn(source, damageToAdd); - source.addDealtDamageToThisTurn(this, damageToAdd); - - GameActionUtil.executeDamageDealingEffects(source, damageToAdd); - - //Run triggers - Map runParams = new TreeMap(); - runParams.put("DamageSource", source); - runParams.put("DamageTarget", this); - runParams.put("DamageAmount", damageToAdd); - runParams.put("IsCombatDamage", isCombat); - AllZone.getTriggerHandler().runTrigger("DamageDone", runParams); - - if (this.isPlaneswalker()) { - this.subtractCounter(Counters.LOYALTY, damageToAdd); - return; - } - - if ((source.hasKeyword("Wither") || source.hasKeyword("Infect"))) - wither = true; - - GameActionUtil.executeDamageToCreatureEffects(source, this, damageToAdd); - - if (AllZoneUtil.isCardInPlay(this) && wither) addCounter(Counters.M1M1, damageToAdd); - if (AllZoneUtil.isCardInPlay(this) && !wither) damage += damageToAdd; - - } - - private ArrayList Sets = new ArrayList(); - private String curSetCode = ""; - - /** - *

addSet.

- * - * @param sInfo a {@link forge.SetInfo} object. - */ - public void addSet(SetInfo sInfo) { - Sets.add(sInfo); - } - - /** - *

getSets.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getSets() { - return Sets; - } - - /** - *

setSets.

- * - * @param siList a {@link java.util.ArrayList} object. - */ - public void setSets(ArrayList siList) { - Sets = siList; - } - - /** - *

Setter for the field curSetCode.

- * - * @param setCode a {@link java.lang.String} object. - */ - public void setCurSetCode(String setCode) { - curSetCode = setCode; - } - - /** - *

Getter for the field curSetCode.

- * - * @return a {@link java.lang.String} object. - */ - public String getCurSetCode() { - return curSetCode; - } - - /** - *

setRandomSetCode.

- */ - public void setRandomSetCode() { - if (Sets.size() < 1) - return; - - Random r = MyRandom.random; - SetInfo si = Sets.get(r.nextInt(Sets.size())); - - curSetCode = si.Code; - } - - /** - *

getSetImageName.

- * - * @param setCode a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public String getSetImageName(String setCode) { - return "/" + setCode + "/" + getImageName(); - } - - /** - *

getCurSetImage.

- * - * @return a {@link java.lang.String} object. - */ - public String getCurSetImage() { - return getSetImageName(curSetCode); - } - - /** - *

getCurSetRarity.

- * - * @return a {@link java.lang.String} object. - */ - public String getCurSetRarity() { - for (int i = 0; i < Sets.size(); i++) - if (Sets.get(i).Code.equals(curSetCode)) - return Sets.get(i).Rarity; - - return ""; - } - - /** - *

getCurSetURL.

- * - * @return a {@link java.lang.String} object. - */ - public String getCurSetURL() { - for (int i = 0; i < Sets.size(); i++) - if (Sets.get(i).Code.equals(curSetCode)) - return Sets.get(i).URL; - - return ""; - } - - /** - *

getMostRecentSet.

- * - * @return a {@link java.lang.String} object. - */ - public String getMostRecentSet() { - return SetInfoUtil.getMostRecentSet(Sets); - } - - private String ImageFilename = ""; - - /** - *

setImageFilename.

- * - * @param iFN a {@link java.lang.String} object. - */ - public void setImageFilename(String iFN) { - ImageFilename = iFN; - } - - /** - *

getImageFilename.

- * - * @return a {@link java.lang.String} object. - */ - public String getImageFilename() { - return ImageFilename; - } - - /** - *

Setter for the field evoked.

- * - * @param evoked a boolean. - */ - public void setEvoked(boolean evoked) { - this.evoked = evoked; - } - - /** - *

isEvoked.

- * - * @return a boolean. - */ - public boolean isEvoked() { - return evoked; - } - - public void setTimestamp(long t) { - timestamp = t; - } - - public long getTimestamp() { - return timestamp; - } - - //private int foil = 0; - - public int getFoil() { - if (SVars.containsKey("Foil")) { - return Integer.parseInt(SVars.get("Foil")); - } - return 0; - } - - public void setFoil(int f) { - SVars.put("Foil", Integer.toString(f)); - } -}//end Card class diff --git a/src/forge/CardContainer.java b/src/forge/CardContainer.java deleted file mode 100644 index 5f013a03ade..00000000000 --- a/src/forge/CardContainer.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * CardContainer.java - * - * Created on 17.02.2010 - */ - -package forge; - - -/** - * The class CardContainer. A card container is an object that references a card. - * - * @author Clemens Koza - * @version V0.0 17.02.2010 - */ -public interface CardContainer { - /** - *

setCard.

- * - * @param card a {@link forge.Card} object. - */ - public void setCard(Card card); - - /** - *

getCard.

- * - * @return a {@link forge.Card} object. - */ - public Card getCard(); -} diff --git a/src/forge/CardFilter.java b/src/forge/CardFilter.java deleted file mode 100644 index da9e5b7a41a..00000000000 --- a/src/forge/CardFilter.java +++ /dev/null @@ -1,374 +0,0 @@ -package forge; - -import java.util.ArrayList; - -import net.slightlymagic.braids.util.UtilFunctions; -import net.slightlymagic.braids.util.generator.GeneratorFunctions; -import net.slightlymagic.braids.util.lambda.Lambda1; - -import com.google.code.jyield.Generator; - -/** - *

CardFilter class.

- * - * @author Forge - * @version $Id: $ - */ -public class CardFilter { - - - /** - * Filter a sequence (iterable) of cards to a list of equal or smaller size - * whose names contain the given substring. - * - * We perform the substring search without sensitivity to case. - * - * @param toBeFiltered an {@link java.lang.Iterable} of Card instances - * @param substring a {@link java.lang.String} object. - * @return a {@link forge.CardList} object. - */ - public CardList cardListNameFilter(Iterable toBeFiltered, String substring) - { - String s; - - CardList listFilter = new CardList(); - for (Card card : toBeFiltered) { - s = card.getName().toLowerCase(); - - if (s.indexOf(substring.toLowerCase()) >= 0) { - listFilter.add(card); - - } - - } - - return listFilter; - } - - /** - *

CardListTextFilter.

- * - * TODO: style: rename this method so it starts with a lowercase letter - * - * @param all a {@link forge.CardList} object. - * @param name a {@link java.lang.String} object. - * @return a {@link forge.CardList} object. - */ - public CardList CardListTextFilter(CardList all, String name) { - Card CardName; - String s; - s = ""; - CardList listFilter = new CardList(); - for (int i = 0; i < all.size(); i++) { - CardName = all.getCard(i); - s = CardName.getText().toLowerCase(); - - if (s.indexOf(name.toLowerCase()) >= 0) { - listFilter.add(CardName); - - } - - } - - return listFilter; - } - - - /** - *

CardListColorFilter.

- * - * TODO: style: rename this method so it starts with a lowercase letter - * - * @param all a {@link forge.CardList} object. - * @param name a {@link java.lang.String} object. - * @return a {@link forge.CardList} object. - */ - public CardList CardListColorFilter(CardList all, String name) { - Card CardName = new Card(); - CardList listFilter = new CardList(); - - if (name == "black") { - for (int i = 0; i < all.size(); i++) { - CardName = all.getCard(i); - if (CardUtil.getColors(CardName).contains(Constant.Color.Black) == false) { - listFilter.add(CardName); - } - - } - } - - if (name == "blue") { - for (int i = 0; i < all.size(); i++) { - CardName = all.getCard(i); - if (CardUtil.getColors(CardName).contains(Constant.Color.Blue) == false) { - listFilter.add(CardName); - } - - } - } - - if (name == "green") { - for (int i = 0; i < all.size(); i++) { - CardName = all.getCard(i); - if (CardUtil.getColors(CardName).contains(Constant.Color.Green) == false) { - listFilter.add(CardName); - } - - } - } - - if (name == "red") { - for (int i = 0; i < all.size(); i++) { - CardName = all.getCard(i); - if (CardUtil.getColors(CardName).contains(Constant.Color.Red) == false) { - listFilter.add(CardName); - } - - } - } - - if (name == "white") { - for (int i = 0; i < all.size(); i++) { - CardName = all.getCard(i); - if (CardUtil.getColors(CardName).contains(Constant.Color.White) == false) { - listFilter.add(CardName); - } - - } - } - - if (name.equals("colorless")) { - for (int i = 0; i < all.size(); i++) { - CardName = all.getCard(i); - if (CardUtil.getColors(CardName).contains(Constant.Color.Colorless) == false) { - listFilter.add(CardName); - } - - } - } - - return listFilter; - } - - /** - *

CardListTypeFilter.

- * - * TODO: style: rename this method so it starts with a lowercase letter - * - * @param all a {@link forge.CardList} object. - * @param name a {@link java.lang.String} object. - * @return a {@link forge.CardList} object. - */ - public CardList CardListTypeFilter(CardList all, String name) { - Card CardName = new Card(); - CardList listFilter = new CardList(); - - if (name == "artifact") { - for (int i = 0; i < all.size(); i++) { - CardName = all.getCard(i); - if (CardName.isArtifact() == false) { - listFilter.add(CardName); - } - - } - } - - if (name == "creature") { - for (int i = 0; i < all.size(); i++) { - CardName = all.getCard(i); - if (CardName.isCreature() == false) { - listFilter.add(CardName); - } - - } - } - - if (name == "enchantment") { - for (int i = 0; i < all.size(); i++) { - CardName = all.getCard(i); - if (CardName.isEnchantment() == false) { - listFilter.add(CardName); - } - - } - } - - if (name == "instant") { - for (int i = 0; i < all.size(); i++) { - CardName = all.getCard(i); - if (CardName.isInstant() == false) { - listFilter.add(CardName); - } - - } - } - - if (name == "land") { - for (int i = 0; i < all.size(); i++) { - CardName = all.getCard(i); - if (CardName.isLand() == false) { - listFilter.add(CardName); - } - - } - } - - if (name == "planeswalker") { - for (int i = 0; i < all.size(); i++) { - CardName = all.getCard(i); - if (CardName.isPlaneswalker() == false) { - listFilter.add(CardName); - } - - } - } - - if (name.equals("sorcery")) { - for (int i = 0; i < all.size(); i++) { - CardName = all.getCard(i); - if (CardName.isSorcery() == false) { - listFilter.add(CardName); - } - - } - } - - return listFilter; - } - - /** - * Filter a sequence Generator of cards by rarity. - * - * @param inputGenerator the sequence to filter (at a later time); must - * not be null - * - * @param rarity a valid value for Card.getSVar("Rarity"); must not be - * null. If equal to Constant.Rarity.Rare, the result will also contain - * mythic cards. - * - * @return a sequence Generator whose cards only have the given rarity - */ - public static Generator getRarity(Generator inputGenerator, final String rarity) { - UtilFunctions.checkNotNull("inputGenerator", inputGenerator); - UtilFunctions.checkNotNull("rarity", rarity); - - Lambda1 predicate = new Lambda1() { - public Boolean apply(Card c) { - if (c == null) { - return false; - } - - // TODO spin off Mythic from Rare when the time comes - String r = c.getSVar("Rarity"); - return (r != null && - (r.equals(rarity) || - rarity.equals(Constant.Rarity.Rare) && r.equals(Constant.Rarity.Mythic))); - } - }; - - return GeneratorFunctions.filterGenerator(predicate, inputGenerator); - } - - /** - * Filter an iterable sequence of Cards; note this is a static method - * that is very similar to the non-static one. - * - * @param iterable the sequence of cards to examine - * - * @param filt determines which cards are present in the resulting list - * - * @return a list of Cards that meet the filtering criteria; may be empty, - * but never null - */ - public static CardList filter(Iterable iterable, CardListFilter filt) { - CardList result = new CardList(); - for (Card card : iterable) - if (filt.addCard(card)) { - result.add(card); - } - - return result; - } - - /** - * Filter a Generator of Cards based on their colors; this does not cause - * the generator to be evaluated, but rather defers the filtering to when - * the result's generate method is called (e.g., by YieldUtils.toIterable). - * - * @param inputGenerator the sequence to filter; must not be null - * - * @param cardColor - * a {@link java.lang.String} object; "Multicolor" is also - * accepted. Must not be null. - * - * @return a new Generator containing cards only of the desired color or - * multicolored cards. - */ - public static Generator getColor(Generator inputGenerator, final String cardColor) - { - UtilFunctions.checkNotNull("inputGenerator", inputGenerator); - UtilFunctions.checkNotNull("cardColor", cardColor); - - final boolean weWantMulticolor = cardColor.equals("Multicolor"); - - Lambda1 predicate = new Lambda1() { - public Boolean apply(Card c) { - if (c == null) { - return false; - } - - if (weWantMulticolor && c.getColor() != null && c.getColor().size() > 1) { - return true; - } - else if (c.isColor(cardColor) && c.getColor() != null && c.getColor().size() == 1) { - return true; - } - - return false; - } - }; - - return GeneratorFunctions.filterGenerator(predicate, inputGenerator); - }//getColor() - - /** - * Filter a Generator of cards so that it contains only the ones that - * exist in certain sets. - * - * @param inputGenerator a sequence Generator of Card instances; must - * not be null. - * - * @param sets an ArrayList of Strings identifying the valid sets; - * must not be null. - * - * @return a {@link forge.CardList} object. - */ - public static Generator getSets(Generator inputGenerator, - final ArrayList sets) - { - UtilFunctions.checkNotNull("inputGenerator", inputGenerator); - UtilFunctions.checkNotNull("sets", sets); - - - Lambda1 predicate = new Lambda1() { - public Boolean apply(Card c) { - if (c == null) { - return false; - } - - for (SetInfo set : c.getSets()) { - if (set != null && sets.contains(set.toString())) { - return true; - } - } - - return false; - } - }; - - return GeneratorFunctions.filterGenerator(predicate, inputGenerator); - - }//getSets(Generator,ArrayList) - - -} diff --git a/src/forge/CardList.java b/src/forge/CardList.java deleted file mode 100644 index 2b7b5c35f0e..00000000000 --- a/src/forge/CardList.java +++ /dev/null @@ -1,762 +0,0 @@ -package forge; - - -import forge.card.cardFactory.CardFactoryUtil; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.Iterator; - -import com.google.code.jyield.Generator; -import com.google.code.jyield.Yieldable; - - -/** - *

CardList class.

- * - * @author Forge - * @version $Id: $ - */ -public class CardList implements Iterable { - - /** - *

iterator.

- * - * @return a {@link java.util.Iterator} object. - */ - public Iterator iterator() { - return list.iterator(); - } - - private ArrayList list = new ArrayList(); - - /** - *

Constructor for CardList.

- */ - public CardList() { - } - - /** - *

Constructor for CardList.

- * - * @param c a {@link forge.Card} object. - */ - public CardList(Card... c) { - addAll(c); - } - - /** - *

Constructor for CardList.

- * - * @param al a {@link java.util.ArrayList} object. - */ - public CardList(ArrayList al) { - addAll(al.toArray()); - } - - /** - * Make a shallow copy of an Iterable's contents; this could be another - * CardList. - * - * @param iterable we traverse this and copy its contents into a local - * field. - */ - public CardList(Iterable iterable) { - for (Card card : iterable) { - add(card); - } - } - - /** - *

Constructor for CardList.

- * - * @param c an array of {@link java.lang.Object} objects. - */ - public CardList(Object[] c) { - addAll(c); - } - - /** - * Create a CardList from a finite generator of Card instances. - * - * We ignore null values produced by the generator. - * - * @param generator a non-infinite generator of Card instances. - */ - public CardList(Generator generator) { - // Generators yield their contents to a Yieldable. Here, - // we create a quick Yieldable that adds the information it - // receives to this CardList's list field. - - Yieldable valueReceiver = new Yieldable() { - @Override - public void yield(Card card) { - if (card != null) { - list.add(card); - } - } - }; - - generator.generate(valueReceiver); - } - - /** - * Create a cardlist with an initial estimate of its maximum size. - * - * @param size an initialize estimate of its maximum size - */ - public CardList(int size) { - list = new ArrayList(size); - } - - /** - *

Get any cards that exist in the passed in sets list.

- * - * @param sets a {@link java.util.ArrayList} object. - * @return a {@link forge.CardList} object. - */ - public CardList getSets(ArrayList sets) { - CardList list = new CardList(); - for (Card c : this) { - for (SetInfo set : c.getSets()) - if (sets.contains(set.toString())) { - list.add(c); - break; - } - } - - return list; - }//getSets() - - - /** - *

getColor.

- * - * @param cardColor a {@link java.lang.String} object. - * @return a {@link forge.CardList} object. - */ - public CardList getColor(String cardColor) { - CardList list = new CardList(); - for (Card c : this) { - if (cardColor.equals("Multicolor") && c.getColor().size() > 1) - list.add(c); - else if (c.isColor(cardColor) && c.getColor().size() == 1) - list.add(c); - } - - return list; - }//getColor() - - /** - *

getOnly2Colors.

- * - * @param clr1 a {@link java.lang.String} object. - * @param clr2 a {@link java.lang.String} object. - * @return a {@link forge.CardList} object. - */ - public CardList getOnly2Colors(final String clr1, final String clr2) { - CardList list = new CardList(); - list.addAll(this); - - CardListFilter clrF = new CardListFilter() { - public boolean addCard(Card c) { - ArrayList cClrs = c.getColor(); - for (int i = 0; i < cClrs.size(); i++) { - if (!cClrs.get(i).toStringArray().get(0).equals(clr1) && !cClrs.get(i).toStringArray().get(0).equals(clr2)) - return false; - } - return true; - } - }; - - return list.filter(clrF); - } - - /** - *

reverse.

- */ - public void reverse() { - Collections.reverse(list); - } - - /** {@inheritDoc} */ - public boolean equals(Object a) { - if (a instanceof CardList) { - CardList b = (CardList) a; - if (list.size() != b.size()) return false; - - for (int i = 0; i < list.size(); i++) - if (!list.get(i).equals(b.get(i))) return false; - - return true; - } else return false; - } - - //removes one copy of that card - /** - *

remove.

- * - * @param cardName a {@link java.lang.String} object. - */ - public void remove(final String cardName) { - CardList find = this.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getName().equals(cardName); - } - }); - - if (0 < find.size()) this.remove(find.get(0)); - else throw new RuntimeException("CardList : remove(String cardname), error - card name not found: " - + cardName + " - contents of Arraylist:" + list); - - }//remove(String cardName) - - /** - *

size.

- * - * @return a int. - */ - public int size() { - return list.size(); - } - - /** - *

add.

- * - * @param c a {@link forge.Card} object. - */ - public void add(Card c) { - list.add(c); - } - - /** - *

add.

- * - * @param n a int. - * @param c a {@link forge.Card} object. - */ - public void add(int n, Card c) { - list.add(n, c); - } - - /** - * addAll(CardList) - lets you add one CardList to another directly - * - * @param in - CardList to add to the current CardList - */ - public void addAll(CardList in) { - addAll(in.toArray()); - } - - /** - *

contains.

- * - * @param c a {@link forge.Card} object. - * @return a boolean. - */ - public boolean contains(Card c) { - return list.contains(c); - } - - //probably remove getCard() in the future - /** - *

getCard.

- * - * @param index a int. - * @return a {@link forge.Card} object. - */ - public Card getCard(int index) { - return list.get(index); - } - - /** - *

get.

- * - * @param i a int. - * @return a {@link forge.Card} object. - */ - public Card get(int i) { - return getCard(i); - } - - /** - *

addAll.

- * - * @param c an array of {@link java.lang.Object} objects. - */ - public void addAll(Object c[]) { - for (int i = 0; i < c.length; i++) - list.add((Card) c[i]); - } - - /** - *

containsName.

- * - * @param c a {@link forge.Card} object. - * @return a boolean. - */ - public boolean containsName(Card c) { - return containsName(c.getName()); - } - - /** - *

containsName.

- * - * @param name a {@link java.lang.String} object. - * @return a boolean. - */ - public boolean containsName(String name) { - for (int i = 0; i < size(); i++) - if (getCard(i).getName().equals(name)) return true; - - return false; - } - - //returns new subset of all the cards with the same name - /** - *

getName.

- * - * @param name a {@link java.lang.String} object. - * @return a {@link forge.CardList} object. - */ - public CardList getName(String name) { - CardList c = new CardList(); - - for (int i = 0; i < size(); i++) - if (getCard(i).getName().equals(name)) c.add(getCard(i)); - - return c; - } - - //returns new subset of all the cards that have a different name - /** - *

getNotName.

- * - * @param name a {@link java.lang.String} object. - * @return a {@link forge.CardList} object. - */ - public CardList getNotName(String name) { - CardList c = new CardList(); - - for (int i = 0; i < size(); i++) - if (!getCard(i).getName().equals(name)) c.add(getCard(i)); - - return c; - } - - /** - *

getImageName.

- * - * @param name a {@link java.lang.String} object. - * @return a {@link forge.CardList} object. - */ - public CardList getImageName(String name) { - CardList c = new CardList(); - - for (int i = 0; i < size(); i++) - if (getCard(i).getImageName().equals(name)) c.add(getCard(i)); - - return c; - } - - /** - *

getController.

- * - * @param player a {@link forge.Player} object. - * @return a {@link forge.CardList} object. - */ - public CardList getController(final Player player) { - return this.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getController().isPlayer(player); - } - }); - } - - /** - *

getOwner.

- * - * @param player a {@link forge.Player} object. - * @return a {@link forge.CardList} object. - */ - public CardList getOwner(final Player player) { - return this.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getOwner().isPlayer(player); - } - }); - } - - /** - *

getRarity.

- * - * @param rarity a {@link java.lang.String} object. - * @return a {@link forge.CardList} object. - */ - public CardList getRarity(final String rarity) { - return this.filter(new CardListFilter() { - public boolean addCard(Card c) { - // TODO spin off Mythic from Rare when the time comes - String r = c.getSVar("Rarity"); - return r.equals(rarity) || - rarity.equals(Constant.Rarity.Rare) && r.equals(Constant.Rarity.Mythic); - } - }); - } - - //cardType is like "Land" or "Goblin", returns a new CardList that is a subset of current CardList - /** - *

getType.

- * - * @param cardType a {@link java.lang.String} object. - * @return a {@link forge.CardList} object. - */ - public CardList getType(final String cardType) { - return this.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isType(cardType); - } - }); - } - - //cardType is like "Land" or "Goblin", returns a new CardList with cards that do not have this type - /** - *

getNotType.

- * - * @param cardType a {@link java.lang.String} object. - * @return a {@link forge.CardList} object. - */ - public CardList getNotType(final String cardType) { - return this.filter(new CardListFilter() { - public boolean addCard(Card c) { - return !c.isType(cardType); - } - }); - } - - /** - *

getPermanents.

- * - * @return a {@link forge.CardList} object. - */ - public CardList getPermanents() { - return this.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isPermanent(); - } - }); - } - - /** - *

getKeyword.

- * - * @param keyword a {@link java.lang.String} object. - * @return a {@link forge.CardList} object. - */ - public CardList getKeyword(final String keyword) { - return this.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.hasKeyword(keyword); - } - }); - } - - /** - *

getNotKeyword.

- * - * @param keyword a {@link java.lang.String} object. - * @return a {@link forge.CardList} object. - */ - public CardList getNotKeyword(final String keyword) { - return this.filter(new CardListFilter() { - public boolean addCard(Card c) { - return !c.hasKeyword(keyword); - } - }); - } - - //get all cards that have this string in their keywords - /** - *

getKeywordsContain.

- * - * @param keyword a {@link java.lang.String} object. - * @return a {@link forge.CardList} object. - */ - public CardList getKeywordsContain(final String keyword) { - return this.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.keywordsContain(keyword); - } - }); - } - - //get all cards that don't have this string in their keywords - /** - *

getKeywordsDontContain.

- * - * @param keyword a {@link java.lang.String} object. - * @return a {@link forge.CardList} object. - */ - public CardList getKeywordsDontContain(final String keyword) { - return this.filter(new CardListFilter() { - public boolean addCard(Card c) { - return !c.keywordsContain(keyword); - } - }); - } - - /** - *

getTokens.

- * - * @return a {@link forge.CardList} object. - */ - public CardList getTokens() { - return this.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isToken(); - } - }); - } - - /** - * Create a new list of cards by applying a filter to this one. - * - * @param filt determines which cards are present in the resulting list - * - * @return a subset of this CardList whose items meet the filtering - * criteria; may be empty, but never null. - */ - public CardList filter(CardListFilter filt) { - return CardFilter.filter(this, filt); - } - - /** - *

toArray.

- * - * @return an array of {@link forge.Card} objects. - */ - public final Card[] toArray() { - Card[] c = new Card[list.size()]; - list.toArray(c); - return c; - } - - /** {@inheritDoc} */ - @Override - public String toString() { - return list.toString(); - } - - /** - *

isEmpty.

- * - * @return a boolean. - */ - public boolean isEmpty() { - return list.isEmpty(); - } - - /** - *

remove.

- * - * @param i a int. - * @return a {@link forge.Card} object. - */ - public Card remove(int i) { - return list.remove(i); - } - - /** - *

remove.

- * - * @param c a {@link forge.Card} object. - */ - public void remove(Card c) { - list.remove(c); - } - - /** - *

clear.

- */ - public void clear() { - list.clear(); - } - - /** - *

shuffle.

- */ - public void shuffle() { - // reseed Random each time we want to Shuffle - //MyRandom.random = MyRandom.random; - Collections.shuffle(list, MyRandom.random); - Collections.shuffle(list, MyRandom.random); - Collections.shuffle(list, MyRandom.random); - } - - /** - *

sort.

- * - * @param c a {@link java.util.Comparator} object. - */ - public void sort(Comparator c) { - Collections.sort(list, c); - } - - /** - *

getTargetableCards.

- * - * @param Source a {@link forge.Card} object. - * @return a {@link forge.CardList} object. - */ - public CardList getTargetableCards(final Card Source) { - return this.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CardFactoryUtil.canTarget(Source, c); - } - }); - } - - /** - *

getUnprotectedCards.

- * - * @param Source a {@link forge.Card} object. - * @return a {@link forge.CardList} object. - */ - public CardList getUnprotectedCards(final Card source) { - return this.filter(new CardListFilter() { - public boolean addCard(Card c) { - return !CardFactoryUtil.hasProtectionFrom(source, c); - } - }); - } - - /** - *

getValidCards.

- * - * @param Restrictions a {@link java.lang.String} object. - * @param sourceController a {@link forge.Player} object. - * @param source a {@link forge.Card} object. - * @return a {@link forge.CardList} object. - */ - public CardList getValidCards(String Restrictions, final Player sourceController, final Card source) { - return getValidCards(Restrictions.split(","), sourceController, source); - } - - /** - *

getValidCards.

- * - * @param Restrictions a {@link java.lang.String} object. - * @param sourceController a {@link forge.Player} object. - * @param source a {@link forge.Card} object. - * @return a {@link forge.CardList} object. - */ - public CardList getValidCards(final String Restrictions[], final Player sourceController, final Card source) { - return this.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c != null && c.isValidCard(Restrictions, sourceController, source); - } - }); - } - - /** - *

getEquipMagnets.

- * - * @return a {@link forge.CardList} object. - */ - public CardList getEquipMagnets() { - return this.filter(new CardListFilter() { - public boolean addCard(Card c) { - return (c.isCreature() && (c.getSVar("EquipMe").equals("Multiple") - || (c.getSVar("EquipMe").equals("Once") && !c.isEquipped()))); - } - }); - } - - /** - *

getEnchantMagnets.

- * - * @return a {@link forge.CardList} object. - */ - public CardList getEnchantMagnets() { - return this.filter(new CardListFilter() { - public boolean addCard(Card c) { - return (c.isCreature() && (c.getSVar("EnchantMe").equals("Multiple") - || (c.getSVar("EnchantMe").equals("Once") && !c.isEnchanted()))); - } - }); - } - - /** - *

getTotalConvertedManaCost.

- * - * @return a int. - */ - public int getTotalConvertedManaCost() { - int total = 0; - for (int i = 0; i < size(); i++) { - total += get(i).getCMC(); - } - return total; - } - - /** - *

getHighestConvertedManaCost.

- * - * @return a int. - * @since 1.0.15 - */ - public int getHighestConvertedManaCost() { - int total = 0; - for (int i = 0; i < size(); i++) { - total = Math.max(total, get(i).getCMC()); - } - return total; - } - - /** - *

getColored.

- * - * @return a {@link forge.CardList} object. - */ - public CardList getColored() { - return this.filter(new CardListFilter() { - public boolean addCard(Card c) { - return (!c.isColorless()); - } - }); - } - - public boolean getAbove(Card source, Card compared){ - if (source.equals(compared)) - return false; - - for(Card itr : this){ - if (itr.equals(source)) - return true; - else if (itr.equals(compared)) - return false; - } - return false; - } - - public boolean getDirectlyAbove(Card source, Card compared){ - if (source.equals(compared)) - return false; - - boolean checkNext = false; - for(Card itr : this){ - if (checkNext){ - if (itr.equals(compared)) - return true; - return false; - } - else if (itr.equals(source)) - checkNext = true; - else if (itr.equals(compared)) - return false; - } - return false; - } - -}//end class CardList diff --git a/src/forge/CardListFilter.java b/src/forge/CardListFilter.java deleted file mode 100644 index 5ec2a1831e9..00000000000 --- a/src/forge/CardListFilter.java +++ /dev/null @@ -1,17 +0,0 @@ -package forge; - -/** - *

CardListFilter interface.

- * - * @author Forge - * @version $Id: $ - */ -public interface CardListFilter { - /** - *

addCard.

- * - * @param c a {@link forge.Card} object. - * @return a boolean. - */ - public boolean addCard(Card c); -} diff --git a/src/forge/CardListUtil.java b/src/forge/CardListUtil.java deleted file mode 100644 index 8e498b1c4c3..00000000000 --- a/src/forge/CardListUtil.java +++ /dev/null @@ -1,454 +0,0 @@ -package forge; - -import com.esotericsoftware.minlog.Log; -import forge.card.cardFactory.CardFactoryUtil; - -import java.util.ArrayList; -import java.util.Comparator; - -/** - *

CardListUtil class.

- * - * @author Forge - * @version $Id: $ - */ -public class CardListUtil { - /** - *

filterToughness.

- * - * @param in a {@link forge.CardList} object. - * @param atLeastToughness a int. - * @return a {@link forge.CardList} object. - */ - public static CardList filterToughness(CardList in, int atLeastToughness) { - CardList out = new CardList(); - for (int i = 0; i < in.size(); i++) - if (in.get(i).getNetDefense() <= atLeastToughness) - out.add(in.get(i)); - - return out; - } - - //the higher the defense the better - - /** - *

sortDefense.

- * - * @param list a {@link forge.CardList} object. - */ - public static void sortDefense(CardList list) { - Comparator com = new Comparator() { - public int compare(Card a, Card b) { - return b.getNetDefense() - a.getNetDefense(); - } - }; - list.sort(com); - }//sortDefense() - - //the higher the attack the better - /** - *

sortAttack.

- * - * @param list a {@link forge.CardList} object. - */ - public static void sortAttack(CardList list) { - Comparator com = new Comparator() { - public int compare(Card a, Card b) { - - if (CombatUtil.isDoranInPlay()) - return b.getNetDefense() - a.getNetDefense(); - else - return b.getNetAttack() - a.getNetAttack(); - } - }; - list.sort(com); - }//sortAttack() - - // sort by "best" using the EvaluateCreature function - // the best creatures will be first in the list - /** - *

sortByEvaluateCreature.

- * - * @param list a {@link forge.CardList} object. - */ - public static void sortByEvaluateCreature(CardList list) { - Comparator com = new Comparator() { - public int compare(Card a, Card b) { - return CardFactoryUtil.evaluateCreature(b) - CardFactoryUtil.evaluateCreature(a); - } - }; - list.sort(com); - }//sortByEvaluateCreature() - - // sort by "best" using the EvaluateCreature function - // the best creatures will be first in the list - /** - *

sortByMostExpensive.

- * - * @param list a {@link forge.CardList} object. - */ - public static void sortByMostExpensive(CardList list) { - Comparator com = new Comparator() { - public int compare(Card a, Card b) { - return b.getCMC() - a.getCMC(); - } - }; - list.sort(com); - }//sortByEvaluateCreature() - - //the lower the attack the better - /** - *

sortAttackLowFirst.

- * - * @param list a {@link forge.CardList} object. - */ - public static void sortAttackLowFirst(CardList list) { - Comparator com = new Comparator() { - public int compare(Card a, Card b) { - if (CombatUtil.isDoranInPlay()) - return a.getNetDefense() - b.getNetDefense(); - else - return a.getNetAttack() - b.getNetAttack(); - } - }; - list.sort(com); - }//sortAttackLowFirst() - - /** - *

sortNonFlyingFirst.

- * - * @param list a {@link forge.CardList} object. - */ - public static void sortNonFlyingFirst(CardList list) { - sortFlying(list); - list.reverse(); - }//sortNonFlyingFirst - - //the creature with flying are better - /** - *

sortFlying.

- * - * @param list a {@link forge.CardList} object. - */ - public static void sortFlying(CardList list) { - Comparator com = new Comparator() { - public int compare(Card a, Card b) { - if (a.hasKeyword("Flying") && b.hasKeyword("Flying")) - return 0; - else if (a.hasKeyword("Flying")) - return -1; - else if (b.hasKeyword("Flying")) - return 1; - - return 0; - } - }; - list.sort(com); - }//sortFlying() - - //sort by keyword - /** - *

sortByKeyword.

- * - * @param list a {@link forge.CardList} object. - * @param kw a {@link java.lang.String} object. - */ - public static void sortByKeyword(CardList list, String kw) { - final String keyword = kw; - Comparator com = new Comparator() { - public int compare(Card a, Card b) { - if (a.hasKeyword(keyword) && b.hasKeyword(keyword)) - return 0; - else if (a.hasKeyword(keyword)) - return -1; - else if (b.hasKeyword(keyword)) - return 1; - - return 0; - } - }; - list.sort(com); - }//sortByKeyword() - - /** - *

sortByDestroyEffect.

- * - * @param list a {@link forge.CardList} object. - */ - public static void sortByDestroyEffect(CardList list) { - Comparator com = new Comparator() { - public int compare(Card a, Card b) { - ArrayList aKeywords = a.getKeyword(); - ArrayList bKeywords = b.getKeyword(); - - boolean aContains = false; - boolean bContains = false; - - for (String kw : aKeywords) { - if (kw.startsWith("Whenever") && kw.contains("into a graveyard from the battlefield,")) { - aContains = true; - break; - } - } - - for (String kw : bKeywords) { - if (kw.startsWith("Whenever") && kw.contains("into a graveyard from the battlefield,")) { - bContains = true; - break; - } - } - if (aContains && bContains) - return 0; - else if (aContains) - return 1; - else if (bContains) - return -1; - - return 0; - } - }; - list.sort(com); - } - - /** - *

sortByIndestructible.

- * - * @param list a {@link forge.CardList} object. - */ - public static void sortByIndestructible(CardList list) { - final ArrayList arrList = new ArrayList(); - arrList.add("Timber Protector"); - arrList.add("Eldrazi Monument"); - - Comparator com = new Comparator() { - public int compare(Card a, Card b) { - if (arrList.contains(a.getName()) && arrList.contains(b.getName())) - return 0; - else if (arrList.contains(a.getName())) - return 1; - else if (arrList.contains(b.getName())) - return -1; - - return 0; - } - }; - list.sort(com); - } - - /** - *

sortByTapped.

- * - * @param list a {@link forge.CardList} object. - */ - public static void sortByTapped(CardList list) { - Comparator com = new Comparator() { - public int compare(Card a, Card b) { - - if (a.isTapped() && b.isTapped()) - return 0; - else if (a.isTapped()) - return 1; - else if (b.isTapped()) - return -1; - - return 0; - } - }; - list.sort(com); - } - - /** - *

sortByName.

- * - * @param list a {@link forge.CardList} object. - */ - public static void sortByName(CardList list) { - Comparator com = new Comparator() { - public int compare(Card a, Card b) { - String aName = a.getName(); - String bName = b.getName(); - - return aName.compareTo(bName); - } - - }; - list.sort(com); - } - - /** - *

sortBySelectable.

- * - * @param list a {@link forge.CardList} object. - * @param type a {@link java.lang.String} object. - */ - public static void sortBySelectable(CardList list, String type) { - final String t = type; - Comparator com = new Comparator() { - public int compare(Card a, Card b) { - if (a.isType(t) - && b.isType(t)) - return 0; - else if (a.hasKeyword(t)) - return 1; - else if (b.hasKeyword(t)) - return -1; - - return 0; - } - }; - list.sort(com); - } - - /** - *

sortByTextLen.

- * - * @param list a {@link forge.CardList} object. - */ - public static void sortByTextLen(CardList list) { - Comparator com = new Comparator() { - public int compare(Card a, Card b) { - int aLen = a.getText().length(); - int bLen = b.getText().length(); - - if (aLen == bLen) - return 0; - else if (aLen > bLen) - return 1; - else if (bLen > aLen) - return -1; - - return 0; - } - }; - list.sort(com); - } - - //Sorts from high to low - /** - *

sortCMC.

- * - * @param list a {@link forge.CardList} object. - */ - public static void sortCMC(CardList list) { - Comparator com = new Comparator() { - public int compare(Card a, Card b) { - int cmcA = CardUtil.getConvertedManaCost(a.getManaCost()); - int cmcB = CardUtil.getConvertedManaCost(b.getManaCost()); - - if (cmcA == cmcB) - return 0; - if (cmcA > cmcB) - return -1; - if (cmcB > cmcA) - return 1; - - return 0; - } - }; - list.sort(com); - }//sortCMC - - - /** - *

getColor.

- * - * @param list a {@link forge.CardList} object. - * @param color a {@link java.lang.String} object. - * @return a {@link forge.CardList} object. - */ - public static CardList getColor(CardList list, final String color) { - return list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CardUtil.getColors(c).contains(color); - } - }); - }//getColor() - - /** - *

getGoldCards.

- * - * @param list a {@link forge.CardList} object. - * @return a {@link forge.CardList} object. - */ - public static CardList getGoldCards(CardList list) { - return list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CardUtil.getColors(c).size() >= 2; - } - }); - } - - /** - *

sumAttack.

- * - * @param c a {@link forge.CardList} object. - * @return a int. - */ - public static int sumAttack(CardList c) { - int attack = 0; - - for (int i = 0; i < c.size(); i++) { - //if(c.get(i).isCreature() && c.get(i).hasSecondStrike()) { - if (c.get(i).isCreature() && (!c.get(i).hasFirstStrike() || (c.get(i).hasDoubleStrike() && c.get(i).hasFirstStrike()))) { - attack += c.get(i).getNetCombatDamage(); - } - } - //System.out.println("Total attack: " +attack); - return attack; - }//sumAttack() - - /** - *

sumDefense.

- * - * @param c a {@link forge.CardList} object. - * @return a int. - */ - public static int sumDefense(CardList c) { - int defense = 0; - - for (int i = 0; i < c.size(); i++) { - //if(c.get(i).isCreature() && c.get(i).hasSecondStrike()) { - if (c.get(i).isCreature()) - defense += c.get(i).getNetDefense(); - } - //System.out.println("Total attack: " +attack); - return defense; - }//sumAttack() - - /** - *

sumFirstStrikeAttack.

- * - * @param c a {@link forge.CardList} object. - * @return a int. - */ - public static int sumFirstStrikeAttack(CardList c) { - int attack = 0; - - for (int i = 0; i < c.size(); i++) { - if (c.get(i).isCreature() && (c.get(i).hasFirstStrike() || c.get(i).hasDoubleStrike())) { - attack += c.get(i).getNetCombatDamage(); - } - } - Log.debug("Total First Strike attack: " + attack); - return attack; - }//sumFirstStrikeAttack() - - //Get the total converted mana cost of a card list - /** - *

sumCMC.

- * - * @param c a {@link forge.CardList} object. - * @return a int. - */ - public static int sumCMC(CardList c) { - int cmc = 0; - - for (int i = 0; i < c.size(); i++) { - cmc += CardUtil.getConvertedManaCost(c.get(i).getManaCost()); - } - //System.out.println("Total CMC: " +cmc); - - return cmc; - - }//sumCMC -} diff --git a/src/forge/CardShopTableModel.java b/src/forge/CardShopTableModel.java deleted file mode 100644 index 959380fe532..00000000000 --- a/src/forge/CardShopTableModel.java +++ /dev/null @@ -1,408 +0,0 @@ -package forge; - - -import javax.swing.*; -import javax.swing.table.AbstractTableModel; -import javax.swing.table.TableColumn; -import javax.swing.table.TableColumnModel; -import java.awt.event.*; -import java.util.Arrays; - - -/** - *

CardShopTableModel class.

- * - * @author Forge - * @version $Id: $ - */ -class CardShopTableModel extends AbstractTableModel { - - /** Constant serialVersionUID=1L */ - 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; - - /** - *

Constructor for CardShopTableModel.

- * - * @param cd a {@link forge.CardContainer} object. - */ - public CardShopTableModel(CardContainer cd) { - this(new CardList(), cd); - } - - /** - *

Constructor for CardShopTableModel.

- * - * @param inData a {@link forge.CardList} object. - * @param in_cardDetail a {@link forge.CardContainer} object. - */ - public CardShopTableModel(CardList inData, CardContainer in_cardDetail) { - cardDetail = in_cardDetail; - //intialize dataNoCopies and dataCopies - addCard(inData); - } - - - /** - *

resizeCols.

- * - * @param table a {@link javax.swing.JTable} object. - */ - 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()); - }*/ - } - - /** - *

clear.

- */ - public void clear() { - dataNoCopies.clear(); - dataCopies.clear(); - //fireTableDataChanged(); - } - - /** - *

getCards.

- * - * @return a {@link forge.CardList} object. - */ - public CardList getCards() { - CardList all = new CardList(); - all.addAll(dataCopies); - all.addAll(dataNoCopies); - - return all; - } - - /** - *

removeCard.

- * - * @param c a {@link forge.Card} object. - */ - 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(); - } - - /** - *

findCardName.

- * - * @param name a {@link java.lang.String} object. - * @param list a {@link forge.CardList} object. - * @return a int. - */ - 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; - } - - /** - *

addCard.

- * - * @param c a {@link forge.Card} object. - */ - public void addCard(Card c) { - if (0 == countQuantity(c, dataNoCopies)) dataNoCopies.add(c); - else dataCopies.add(c); - } - - /** - *

addCard.

- * - * @param c a {@link forge.CardList} object. - */ - public void addCard(CardList c) { - for (int i = 0; i < c.size(); i++) - addCard(c.get(i)); - - fireTableDataChanged(); - } - - /** - *

rowToCard.

- * - * @param row a int. - * @return a {@link forge.Card} object. - */ - public Card rowToCard(int row) { - return dataNoCopies.get(row); - } - - /** - *

countQuantity.

- * - * @param c a {@link forge.Card} object. - * @return a int. - */ - private int countQuantity(Card c) { - return countQuantity(c, dataNoCopies) + countQuantity(c, dataCopies); - } - - //CardList data is either class members "dataNoCopies" or "dataCopies" - /** - *

countQuantity.

- * - * @param c a {@link forge.Card} object. - * @param data a {@link forge.CardList} object. - * @return a int. - */ - 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; - } - - /** - *

getRowCount.

- * - * @return a int. - */ - public int getRowCount() { - return dataNoCopies.size(); - } - - /** - *

getColumnCount.

- * - * @return a int. - */ - public int getColumnCount() { - return column.length; - } - - /** {@inheritDoc} */ - @Override - public String getColumnName(int n) { - return column[n]; - } - - /** {@inheritDoc} */ - public Object getValueAt(int row, int column) { - return getColumn(dataNoCopies.get(row), column); - } - - /** - *

Getter for the field column.

- * - * @param c a {@link forge.Card} object. - * @param column a int. - * @param column a int. - * @return a {@link java.lang.Object} object. - */ - 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"; - } - } - - /** - *

addListeners.

- * - * @param table a {@link javax.swing.JTable} object. - */ - 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 - /** - *

resort.

- */ - public void resort() { - sort(recentSortedColumn, recentAscending); - //this.fireTableDataChanged(); - } - - //returns true if any data changed positions - // @SuppressWarnings("unchecked") - // Arrays.sort - /** - *

sort.

- * - * @param column a int. - * @param ascending a boolean. - * @return a boolean. - */ - 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); - all.addAll(dataCopies); - - 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/CardUtil.java b/src/forge/CardUtil.java deleted file mode 100644 index a5c285a7e15..00000000000 --- a/src/forge/CardUtil.java +++ /dev/null @@ -1,586 +0,0 @@ -package forge; - -import forge.card.mana.ManaCost; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.SpellAbilityList; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - -import java.io.File; -import java.util.*; - - -/** - *

CardUtil class.

- * - * @author Forge - * @version $Id: $ - */ -public class CardUtil { - /** Constant r */ - public final static Random r = MyRandom.random; - - - /** - *

getRandomIndex.

- * - * @param o an array of {@link java.lang.Object} objects. - * @return a int. - */ - public static int getRandomIndex(Object[] o) { - if (o == null || o.length == 0) throw new RuntimeException( - "CardUtil : getRandomIndex() argument is null or length is 0"); - - return r.nextInt(o.length); - } - - /** - *

getRandom.

- * - * @param o an array of {@link forge.Card} objects. - * @return a {@link forge.Card} object. - */ - public static Card getRandom(Card[] o) { - return o[getRandomIndex(o)]; - } - - /** - *

getRandomIndex.

- * - * @param list a {@link forge.card.spellability.SpellAbilityList} object. - * @return a int. - */ - public static int getRandomIndex(SpellAbilityList list) { - if (list == null || list.size() == 0) throw new RuntimeException( - "CardUtil : getRandomIndex(SpellAbilityList) argument is null or length is 0"); - - return r.nextInt(list.size()); - } - - /** - *

getRandomIndex.

- * - * @param c a {@link forge.CardList} object. - * @return a int. - */ - public static int getRandomIndex(CardList c) { - return r.nextInt(c.size()); - } - - //returns Card Name (unique number) attack/defense - //example: Big Elf (12) 2/3 - /** - *

toText.

- * - * @param c a {@link forge.Card} object. - * @return a {@link java.lang.String} object. - */ - public static String toText(Card c) { - return c.getName() + " (" + c.getUniqueNumber() + ") " + c.getNetAttack() + "/" + c.getNetDefense(); - } - - /** - *

toCard.

- * - * @param col a {@link java.util.Collection} object. - * @return an array of {@link forge.Card} objects. - */ - public static Card[] toCard(Collection col) { - Object o[] = col.toArray(); - Card c[] = new Card[o.length]; - - for (int i = 0; i < c.length; i++) { - Object swap = o[i]; - if (swap instanceof Card) c[i] = (Card) o[i]; - else throw new RuntimeException("CardUtil : toCard() invalid class, should be Card - " - + o[i].getClass() + " - toString() - " + o[i].toString()); - } - - return c; - } - - /** - *

toCard.

- * - * @param list a {@link java.util.ArrayList} object. - * @return an array of {@link forge.Card} objects. - */ - public static Card[] toCard(ArrayList list) { - Card[] c = new Card[list.size()]; - list.toArray(c); - return c; - } - - /** - *

toList.

- * - * @param c an array of {@link forge.Card} objects. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList toList(Card c[]) { - ArrayList a = new ArrayList(); - for (int i = 0; i < c.length; i++) - a.add(c[i]); - return a; - } - - //returns "G", longColor is Constant.Color.Green and the like - /** - *

getShortColor.

- * - * @param longColor a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public static String getShortColor(String longColor) { - Map map = new HashMap(); - map.put(Constant.Color.Black, "B"); - map.put(Constant.Color.Blue, "U"); - map.put(Constant.Color.Green, "G"); - map.put(Constant.Color.Red, "R"); - map.put(Constant.Color.White, "W"); - - Object o = map.get(longColor); - if (o == null) throw new RuntimeException("CardUtil : getShortColor() invalid argument - " + longColor); - - return (String) o; - } - - /** - *

isColor.

- * - * @param c a {@link forge.Card} object. - * @param col a {@link java.lang.String} object. - * @return a boolean. - */ - public static boolean isColor(Card c, String col) { - ArrayList list = getColors(c); - return list.contains(col); - } - - /** - *

getColors.

- * - * @param c a {@link forge.Card} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getColors(Card c) { - return c.determineColor().toStringArray(); - } - - /** - *

getOnlyColors.

- * - * @param c a {@link forge.Card} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getOnlyColors(Card c) { - String m = c.getManaCost(); - Set colors = new HashSet(); - - for (int i = 0; i < m.length(); i++) { - switch (m.charAt(i)) { - case ' ': - break; - case 'G': - colors.add(Constant.Color.Green); - break; - case 'W': - colors.add(Constant.Color.White); - break; - case 'B': - colors.add(Constant.Color.Black); - break; - case 'U': - colors.add(Constant.Color.Blue); - break; - case 'R': - colors.add(Constant.Color.Red); - break; - } - } - for (String kw : c.getKeyword()) - if (kw.startsWith(c.getName() + " is ") || kw.startsWith("CARDNAME is ")) - for (String color : Constant.Color.Colors) - if (kw.endsWith(color + ".")) - colors.add(color); - return new ArrayList(colors); - } - - - /** - *

hasCardName.

- * - * @param cardName a {@link java.lang.String} object. - * @param list a {@link java.util.ArrayList} object. - * @return a boolean. - */ - public static boolean hasCardName(String cardName, ArrayList list) { - Card c; - boolean b = false; - - for (int i = 0; i < list.size(); i++) { - c = list.get(i); - if (c.getName().equals(cardName)) { - b = true; - break; - } - } - return b; - }//hasCardName() - - //probably should put this somewhere else, but not sure where - /** - *

getConvertedManaCost.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a int. - */ - static public int getConvertedManaCost(SpellAbility sa) { - return getConvertedManaCost(sa.getManaCost()); - } - - /** - *

getConvertedManaCost.

- * - * @param c a {@link forge.Card} object. - * @return a int. - */ - static public int getConvertedManaCost(Card c) { - if (c.isToken() && !c.isCopiedToken()) - return 0; - return getConvertedManaCost(c.getManaCost()); - } - - /** - *

getConvertedManaCost.

- * - * @param manaCost a {@link java.lang.String} object. - * @return a int. - */ - static public int getConvertedManaCost(String manaCost) { - if (manaCost.equals("")) return 0; - - ManaCost cost = new ManaCost(manaCost); - return cost.getConvertedManaCost(); - } - - /** - *

addManaCosts.

- * - * @param mc1 a {@link java.lang.String} object. - * @param mc2 a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - static public String addManaCosts(String mc1, String mc2) { - String tMC = ""; - - Integer cl1, cl2, tCL; - String c1, c2, cc1, cc2; - - c1 = mc1.replaceAll("[WUBRGSX]", "").trim(); - c2 = mc2.replaceAll("[WUBRGSX]", "").trim(); - - if (c1.length() > 0) - cl1 = Integer.valueOf(c1); - else - cl1 = 0; - - if (c2.length() > 0) - cl2 = Integer.valueOf(c2); - else - cl2 = 0; - - tCL = cl1 + cl2; - - cc1 = mc1.replaceAll("[0-9]", "").trim(); - cc2 = mc2.replaceAll("[0-9]", "").trim(); - - tMC = tCL.toString() + " " + cc1 + " " + cc2; - - //System.out.println("TMC:" + tMC); - return tMC.trim(); - } - - /** - *

getRelative.

- * - * @param c a {@link forge.Card} object. - * @param relation a {@link java.lang.String} object. - * @return a {@link forge.Card} object. - */ - static public Card getRelative(Card c, String relation) { - if (relation.equals("CARDNAME")) return c; - else if (relation.startsWith("enchanted ")) return c.getEnchanting().get(0); - else if (relation.startsWith("equipped ")) return c.getEquipping().get(0); - //else if(relation.startsWith("target ")) return c.getTargetCard(); - else - throw new IllegalArgumentException("Error at CardUtil.getRelative: " + relation + "is not a valid relation"); - } - - /** - *

isACardType.

- * - * @param cardType a {@link java.lang.String} object. - * @return a boolean. - */ - public static boolean isACardType(String cardType) { - return getAllCardTypes().contains(cardType); - } - - /** - *

getAllCardTypes.

- * - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getAllCardTypes() { - ArrayList types = new ArrayList(); - - //types.addAll(getCardTypes()); - types.addAll(Constant.CardTypes.cardTypes[0].list); - - //not currently used by Forge - types.add("Plane"); - types.add("Scheme"); - types.add("Vanguard"); - - return types; - } - - /** - *

getCardTypes.

- * - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getCardTypes() { - ArrayList types = new ArrayList(); - -// types.add("Artifact"); -// types.add("Creature"); -// types.add("Enchantment"); -// types.add("Instant"); -// types.add("Land"); -// types.add("Planeswalker"); -// types.add("Sorcery"); -// types.add("Tribal"); - - types.addAll(Constant.CardTypes.cardTypes[0].list); - - return types; - } - - - - /** - *

isASuperType.

- * - * @param cardType a {@link java.lang.String} object. - * @return a boolean. - */ - - public static boolean isASuperType(String cardType) { -// return ( cardType.equals("Basic") || cardType.equals("Legendary") -// || cardType.equals("Snow") || cardType.equals("World")); - return (Constant.CardTypes.superTypes[0].list.contains(cardType)); - } - - /** - *

isASubType.

- * - * @param cardType a {@link java.lang.String} object. - * @return a boolean. - */ - public static boolean isASubType(String cardType) { - return (!isASuperType(cardType) && !isACardType(cardType)); - } - - // Check if a Type is a Creature Type (by excluding all other types) - /** - *

isACreatureType.

- * - * @param cardType a {@link java.lang.String} object. - * @return a boolean. - */ - public static boolean isACreatureType(String cardType) { - -// return (!isACardType(cardType) && !isASuperType(cardType) && !isALandType(cardType) -// && !cardType.equals("Arcane") && !cardType.equals("Trap") -// && !cardType.equals("Aura") && !cardType.equals("Shrine") -// && !cardType.equals("Equipment") && !cardType.equals("Fortification")); - return (Constant.CardTypes.creatureTypes[0].list.contains(cardType)); - } - - /** - *

isALandType.

- * - * @param cardType a {@link java.lang.String} object. - * @return a boolean. - */ - public static boolean isALandType(String cardType) { -// return (isABasicLandType(cardType) -// || cardType.equals("Locus") || cardType.equals("Lair") -// || cardType.equals("Mine") || cardType.equals("Power-Plant") -// || cardType.equals("Tower") || cardType.equals("Urza's") -// || cardType.equals("Desert")); - return (Constant.CardTypes.landTypes[0].list.contains(cardType)); - } - - /** - *

isABasicLandType.

- * - * @param cardType a {@link java.lang.String} object. - * @return a boolean. - */ - public static boolean isABasicLandType(String cardType) { -// return (cardType.equals("Plains") -// || cardType.equals("Island") || cardType.equals("Swamp") -// || cardType.equals("Mountain") || cardType.equals("Forest")); - return (Constant.CardTypes.basicTypes[0].list.contains(cardType)); - } - - //this function checks, if duplicates of a keyword are not necessary (like flying, trample, etc.) - /** - *

isNonStackingKeyword.

- * - * @param keyword a {@link java.lang.String} object. - * @return a boolean. - */ - public static boolean isNonStackingKeyword(String keyword) { -/* return ( - keyword.equals("Deathtouch") || keyword.equals("Defender") - || keyword.equals("Double Strike") || keyword.equals("First Strike") - || keyword.equals("Flash") || keyword.equals("Flying") - || keyword.equals("Haste") || keyword.equals("Intimidate") - || keyword.equals("Lifelink") || keyword.equals("Reach") - || keyword.equals("Shroud") || keyword.equals("Trample") - || keyword.equals("Vigilance") || keyword.equals("Horsemanship") - || keyword.equals("Fear") || keyword.equals("Changeling") - || keyword.equals("Wither") || keyword.equals("Infect"));*/ - return Constant.Keywords.NonStackingList[0].list.contains(keyword); - } - - /** - *

isStackingKeyword.

- * - * @param keyword a {@link java.lang.String} object. - * @return a boolean. - */ - public static boolean isStackingKeyword(String keyword) { - return !isNonStackingKeyword(keyword); - } - - /** - *

buildFilename.

- * - * @param card a {@link forge.Card} object. - * @return a {@link java.lang.String} object. - */ - public static String buildFilename(Card card) { - File path = null; - if (card.isToken() && !card.isCopiedToken()) - path = ForgeProps.getFile(NewConstants.IMAGE_TOKEN); - else - path = ForgeProps.getFile(NewConstants.IMAGE_BASE); - - StringBuilder sbKey = new StringBuilder(); - - File f = null; - if (!card.getCurSetCode().equals("")) { - String nn = ""; - if (card.getRandomPicture() > 0) - nn = Integer.toString(card.getRandomPicture()); - - //First try 3 letter set code with MWS filename format - sbKey.append(card.getCurSetCode() + "/"); - sbKey.append(GuiDisplayUtil.cleanStringMWS(card.getName()) + nn + ".full"); - - f = new File(path, sbKey.toString() + ".jpg"); - if (f.exists()) - return sbKey.toString(); - - sbKey = new StringBuilder(); - - //Second, try 2 letter set code with MWS filename format - sbKey.append(SetInfoUtil.getSetCode2_SetCode3(card.getCurSetCode()) + "/"); - sbKey.append(GuiDisplayUtil.cleanStringMWS(card.getName()) + nn + ".full"); - - f = new File(path, sbKey.toString() + ".jpg"); - if (f.exists()) - return sbKey.toString(); - - sbKey = new StringBuilder(); - - //Third, try 3 letter set code with Forge filename format - sbKey.append(card.getCurSetCode() + "/"); - sbKey.append(GuiDisplayUtil.cleanString(card.getName()) + nn); - - f = new File(path, sbKey.toString() + ".jpg"); - if (f.exists()) - return sbKey.toString(); - - sbKey = new StringBuilder(); - - } - - //Last, give up with set images, go with the old picture type - sbKey.append(GuiDisplayUtil.cleanString(card.getImageName())); - if (card.getRandomPicture() > 1) - sbKey.append(card.getRandomPicture()); - - f = new File(path, sbKey.toString() + ".jpg"); - if (f.exists()) - return sbKey.toString(); - - sbKey = new StringBuilder(); - - //Really last-ditch effort, forget the picture number - sbKey.append(GuiDisplayUtil.cleanString(card.getImageName())); - - f = new File(path, sbKey.toString() + ".jpg"); - if (f.exists()) - return sbKey.toString(); - - //if still no file, download if option enabled? - - return "none"; - } - - /** - *

getWeightedManaCost.

- * - * @param manaCost a {@link java.lang.String} object. - * @return a double. - */ - public static double getWeightedManaCost(String manaCost) { - if (manaCost.equals("")) return 0; - - ManaCost cost = new ManaCost(manaCost); - return cost.getWeightedManaCost(); - } - - /** - *

getShortColorsString.

- * - * @param colors a {@link java.util.ArrayList} object. - * @return a {@link java.lang.String} object. - */ - public static String getShortColorsString(ArrayList colors) { - String colorDesc = ""; - for (String col : colors) { - if (col.equalsIgnoreCase("White")) { - colorDesc += "W"; - } else if (col.equalsIgnoreCase("Blue")) { - colorDesc += "U"; - } else if (col.equalsIgnoreCase("Black")) { - colorDesc += "B"; - } else if (col.equalsIgnoreCase("Red")) { - colorDesc += "R"; - } else if (col.equalsIgnoreCase("Green")) { - colorDesc += "G"; - } else if (col.equalsIgnoreCase("Colorless")) { - colorDesc = "C"; - } - } - return colorDesc; - } - -} diff --git a/src/forge/Card_Color.java b/src/forge/Card_Color.java deleted file mode 100644 index fc334ec290d..00000000000 --- a/src/forge/Card_Color.java +++ /dev/null @@ -1,138 +0,0 @@ -package forge; - -import forge.card.mana.ManaCost; - -import java.util.ArrayList; -import java.util.EnumSet; - -/** - *

Card_Color class.

- * - * @author Forge - * @version $Id: $ - */ -public class Card_Color { - // takes care of individual card color, for global color change effects use AllZone.getGameInfo().getColorChanges() - private EnumSet col; - private boolean additional; - - /** - *

Getter for the field additional.

- * - * @return a boolean. - */ - public boolean getAdditional() { - return additional; - } - - private Card effectingCard = null; - private long stamp = 0; - - /** - *

Getter for the field stamp.

- * - * @return a long. - */ - public long getStamp() { - return stamp; - } - - /** - * Constant timeStamp=0 - */ - private static long timeStamp = 0; - - /** - *

getTimestamp.

- * - * @return a long. - */ - public static long getTimestamp() { - return timeStamp; - } - - /** - *

Constructor for Card_Color.

- * - * @param mc a {@link forge.card.mana.ManaCost} object. - * @param c a {@link forge.Card} object. - * @param addToColors a boolean. - * @param baseColor a boolean. - */ - Card_Color(ManaCost mc, Card c, boolean addToColors, boolean baseColor) { - additional = addToColors; - col = Color.ConvertManaCostToColor(mc); - effectingCard = c; - if (baseColor) - stamp = 0; - else - stamp = timeStamp; - } - - /** - *

Constructor for Card_Color.

- * - * @param c a {@link forge.Card} object. - */ - public Card_Color(Card c) { - col = Color.Colorless(); - additional = false; - stamp = 0; - effectingCard = c; - } - - /** - *

addToCardColor.

- * - * @param s a {@link java.lang.String} object. - * @return a boolean. - */ - boolean addToCardColor(String s) { - Color c = Color.ConvertFromString(s); - if (!col.contains(c)) { - col.add(c); - return true; - } - return false; - } - - /** - *

fixColorless.

- */ - void fixColorless() { - if (col.size() > 1 && col.contains(Color.Colorless)) - col.remove(Color.Colorless); - } - - /** - *

increaseTimestamp.

- */ - static void increaseTimestamp() { - timeStamp++; - } - - /** - *

equals.

- * - * @param cost a {@link java.lang.String} object. - * @param c a {@link forge.Card} object. - * @param addToColors a boolean. - * @param time a long. - * @return a boolean. - */ - public boolean equals(String cost, Card c, boolean addToColors, long time) { - return effectingCard == c && addToColors == additional && stamp == time; - } - - /** - *

toStringArray.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList toStringArray() { - ArrayList list = new ArrayList(); - for (Color c : col) - list.add(c.toString()); - return list; - } -} diff --git a/src/forge/Color.java b/src/forge/Color.java deleted file mode 100644 index 825f8965b64..00000000000 --- a/src/forge/Color.java +++ /dev/null @@ -1,130 +0,0 @@ -package forge; - -import forge.card.mana.ManaCost; - -import java.util.EnumSet; - -/** - *

Color class.

- * - * @author Forge - * @version $Id: $ - */ -public enum Color { - Colorless(0), - White(1), - Green(2), - Red(4), - Black(8), - Blue(16); - - @SuppressWarnings("unused") - private int flag = 0; - - /** - *

Constructor for Color.

- * - * @param c a int. - */ - Color(int c) { - flag = c; - } - - /** - *

Colorless.

- * - * @return a {@link java.util.EnumSet} object. - */ - public static EnumSet Colorless() { - EnumSet colors = EnumSet.of(Color.Colorless); - return colors; - } - - /** - *

ConvertStringsToColor.

- * - * @param s an array of {@link java.lang.String} objects. - * @return a {@link java.util.EnumSet} object. - */ - public static EnumSet ConvertStringsToColor(String[] s) { - EnumSet colors = EnumSet.of(Color.Colorless); - - for (int i = 0; i < s.length; i++) { - colors.add(ConvertFromString(s[i])); - } - - if (colors.size() > 1) - colors.remove(Color.Colorless); - - return colors; - } - - /** - *

ConvertFromString.

- * - * @param s a {@link java.lang.String} object. - * @return a {@link forge.Color} object. - */ - public static Color ConvertFromString(String s) { - { - if (s.equals(Constant.Color.White)) - return Color.White; - else if (s.equals(Constant.Color.Green)) - return Color.Green; - else if (s.equals(Constant.Color.Red)) - return Color.Red; - else if (s.equals(Constant.Color.Black)) - return Color.Black; - else if (s.equals(Constant.Color.Blue)) - return Color.Blue; - - return Color.Colorless; - } - } - - /** - *

ConvertManaCostToColor.

- * - * @param m a {@link forge.card.mana.ManaCost} object. - * @return a {@link java.util.EnumSet} object. - */ - public static EnumSet ConvertManaCostToColor(ManaCost m) { - EnumSet colors = EnumSet.of(Color.Colorless); - - if (m.isColor("W")) - colors.add(Color.White); - if (m.isColor("G")) - colors.add(Color.Green); - if (m.isColor("R")) - colors.add(Color.Red); - if (m.isColor("B")) - colors.add(Color.Black); - if (m.isColor("U")) - colors.add(Color.Blue); - - if (colors.size() > 1) - colors.remove(Color.Colorless); - - return colors; - } - - /** - *

toString.

- * - * @return a {@link java.lang.String} object. - */ - public String toString() { - if (this.equals(Color.White)) - return Constant.Color.White; - else if (this.equals(Color.Green)) - return Constant.Color.Green; - else if (this.equals(Color.Red)) - return Constant.Color.Red; - else if (this.equals(Color.Black)) - return Constant.Color.Black; - else if (this.equals(Color.Blue)) - return Constant.Color.Blue; - else - return Constant.Color.Colorless; - } -} diff --git a/src/forge/Combat.java b/src/forge/Combat.java deleted file mode 100644 index 78ea99cb15b..00000000000 --- a/src/forge/Combat.java +++ /dev/null @@ -1,808 +0,0 @@ -package forge; - -import java.util.*; -import java.util.Map.Entry; - -/** - *

Combat class.

- * - * @author Forge - * @version $Id: $ - */ -public class Combat { - // key is attacker Card - // value is CardList of blockers - private Map map = new TreeMap(); - private Set blocked = new HashSet(); - - private HashMap unblockedMap = new HashMap(); - private HashMap defendingDamageMap = new HashMap(); - - // Defenders are the Defending Player + Each Planeswalker that player controls - private ArrayList defenders = new ArrayList(); - private int currentDefender = 0; - private int nextDefender = 0; - - // This Hash keeps track of - private HashMap attackerToDefender = new HashMap(); - - private int attackingDamage; - - private Player attackingPlayer = null; - private Player defendingPlayer = null; - - private CardList attackersWithLure = new CardList(); - private CardList canBlockAttackerWithLure = new CardList(); - - /** - *

Constructor for Combat.

- */ - public Combat() { - // Let the Begin Turn/Untap Phase Reset Combat properly - } - - /** - *

reset.

- */ - public void reset() { - resetAttackers(); - blocked.clear(); - - unblockedMap.clear(); - - attackingDamage = 0; - defendingDamageMap.clear(); - - attackingPlayer = null; - defendingPlayer = null; - - attackersWithLure.clear(); - canBlockAttackerWithLure.clear(); - - defenders.clear(); - currentDefender = 0; - nextDefender = 0; - - initiatePossibleDefenders(AllZone.getPhase().getPlayerTurn().getOpponent()); - } - - /** - *

initiatePossibleDefenders.

- * - * @param defender a {@link forge.Player} object. - */ - public void initiatePossibleDefenders(Player defender) { - defenders.add(defender); - CardList planeswalkers = AllZoneUtil.getPlayerCardsInPlay(defender); - planeswalkers = planeswalkers.getType("Planeswalker"); - for (Card pw : planeswalkers) - defenders.add(pw); - } - - /** - *

nextDefender.

- * - * @return a {@link java.lang.Object} object. - */ - public Object nextDefender() { - if (nextDefender >= defenders.size()) - return null; - - currentDefender = nextDefender; - nextDefender++; - - return defenders.get(currentDefender); - } - - /** - *

Setter for the field currentDefender.

- * - * @param def a int. - */ - public void setCurrentDefender(int def) { - currentDefender = def; - } - - /** - *

getRemainingDefenders.

- * - * @return a int. - */ - public int getRemainingDefenders() { - return defenders.size() - nextDefender; - } - - /** - *

Getter for the field defenders.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getDefenders() { - return defenders; - } - - /** - *

Setter for the field defenders.

- * - * @param newDef a {@link java.util.ArrayList} object. - */ - public void setDefenders(ArrayList newDef) { - defenders = newDef; - } - - /** - *

getDefendingPlaneswalkers.

- * - * @return an array of {@link forge.Card} objects. - */ - public Card[] getDefendingPlaneswalkers() { - Card[] pwDefending = new Card[defenders.size() - 1]; - - int i = 0; - - for (Object o : defenders) { - if (o instanceof Card) { - pwDefending[i] = (Card) o; - i++; - } - } - - return pwDefending; - } - - /** - *

getDeclaredAttackers.

- * - * @return a int. - */ - public int getDeclaredAttackers() { - return attackerToDefender.size(); - } - - /** - *

Setter for the field attackingPlayer.

- * - * @param player a {@link forge.Player} object. - */ - public void setAttackingPlayer(Player player) { - attackingPlayer = player; - } - - /** - *

Setter for the field defendingPlayer.

- * - * @param player a {@link forge.Player} object. - */ - public void setDefendingPlayer(Player player) { - defendingPlayer = player; - } - - /** - *

Getter for the field attackingPlayer.

- * - * @return a {@link forge.Player} object. - */ - public Player getAttackingPlayer() { - return attackingPlayer; - } - - /** - *

Getter for the field defendingPlayer.

- * - * @return a {@link forge.Player} object. - */ - public Player getDefendingPlayer() { - return defendingPlayer; - } - - /** - *

Getter for the field defendingDamageMap.

- * - * @return a {@link java.util.HashMap} object. - */ - public HashMap getDefendingDamageMap() { - return defendingDamageMap; - } - - /** - *

getTotalDefendingDamage.

- * - * @return a int. - */ - public int getTotalDefendingDamage() { - int total = 0; - - Collection c = defendingDamageMap.values(); - - Iterator itr = c.iterator(); - while (itr.hasNext()) - total += itr.next(); - - return total; - } - - /** - *

setDefendingDamage.

- */ - public void setDefendingDamage() { - defendingDamageMap.clear(); - CardList att = new CardList(getAttackers()); - // sum unblocked attackers' power - for (int i = 0; i < att.size(); i++) { - if (!isBlocked(att.get(i)) - || (getBlockers(att.get(i)).size() == 0 && att.get(i).hasKeyword("Trample"))) { - - int damageDealt = att.get(i).getNetCombatDamage(); - - if (damageDealt > 0) { - //if the creature has first strike do not do damage in the normal combat phase - if (!att.get(i).hasFirstStrike() || att.get(i).hasDoubleStrike()) - addDefendingDamage(damageDealt, att.get(i)); - } - } // ! isBlocked... - }// for - } - - - /** - *

setDefendingFirstStrikeDamage.

- * - * @return a boolean. - */ - public boolean setDefendingFirstStrikeDamage() { - boolean needsFirstStrike = false; - defendingDamageMap.clear(); - CardList att = new CardList(getAttackers()); - // sum unblocked attackers' power - for (int i = 0; i < att.size(); i++) { - if (!isBlocked(att.get(i))) { - - int damageDealt = att.get(i).getNetCombatDamage(); - - if (damageDealt > 0) { - // if the creature has first strike or double strike do damage in the first strike combat phase - if (att.get(i).hasFirstStrike() || att.get(i).hasDoubleStrike()) { - addDefendingDamage(damageDealt, att.get(i)); - needsFirstStrike = true; - } - } - } - } // for - - return needsFirstStrike; - } - - - /** - *

addDefendingDamage.

- * - * @param n a int. - * @param source a {@link forge.Card} object. - */ - public void addDefendingDamage(int n, Card source) { - String slot = getDefenderByAttacker(source).toString(); - Object o = defenders.get(Integer.parseInt(slot)); - - if (o instanceof Card) { - Card pw = (Card) o; - pw.addAssignedDamage(n, source); - - return; - } - - if (!defendingDamageMap.containsKey(source)) - defendingDamageMap.put(source, n); - else { - defendingDamageMap.put(source, defendingDamageMap.get(source) + n); - } - } - - /** - *

addAttackingDamage.

- * - * @param n a int. - */ - public void addAttackingDamage(int n) { - attackingDamage += n; - } - - /** - *

Getter for the field attackingDamage.

- * - * @return a int. - */ - public int getAttackingDamage() { - return attackingDamage; - } - - /** - *

sortAttackerByDefender.

- * - * @return an array of {@link forge.CardList} objects. - */ - public CardList[] sortAttackerByDefender() { - CardList attackers[] = new CardList[defenders.size()]; - for (int i = 0; i < attackers.length; i++) - attackers[i] = new CardList(); - - for (Card atk : attackerToDefender.keySet()) { - Object o = attackerToDefender.get(atk); - int i = Integer.parseInt(o.toString()); - attackers[i].add(atk); - } - - return attackers; - } - - /** - *

isAttacking.

- * - * @param c a {@link forge.Card} object. - * @return a boolean. - */ - public boolean isAttacking(Card c) { - return map.get(c) != null; - } - - /** - *

addAttacker.

- * - * @param c a {@link forge.Card} object. - */ - public void addAttacker(Card c) { - map.put(c, new CardList()); - attackerToDefender.put(c, currentDefender); - } - - /** - *

getDefenderByAttacker.

- * - * @param c a {@link forge.Card} object. - * @return a {@link java.lang.Object} object. - */ - public Object getDefenderByAttacker(Card c) { - return attackerToDefender.get(c); - } - - /** - *

resetAttackers.

- */ - public void resetAttackers() { - map.clear(); - attackerToDefender.clear(); - } - - /** - *

getAttackers.

- * - * @return an array of {@link forge.Card} objects. - */ - public Card[] getAttackers() { - CardList out = new CardList(); - Iterator it = map.keySet().iterator(); - - while (it.hasNext()) { - out.add((Card) it.next()); - } - - return out.toArray(); - }// getAttackers() - - /** - *

isBlocked.

- * - * @param attacker a {@link forge.Card} object. - * @return a boolean. - */ - public boolean isBlocked(Card attacker) { - return blocked.contains(attacker); - } - - /** - *

addBlocker.

- * - * @param attacker a {@link forge.Card} object. - * @param blocker a {@link forge.Card} object. - */ - public void addBlocker(Card attacker, Card blocker) { - blocked.add(attacker); - getList(attacker).add(blocker); - } - - /** - *

resetBlockers.

- */ - public void resetBlockers() { - reset(); - - CardList att = new CardList(getAttackers()); - for (int i = 0; i < att.size(); i++) - addAttacker(att.get(i)); - } - - /** - *

getAllBlockers.

- * - * @return a {@link forge.CardList} object. - */ - public CardList getAllBlockers() { - CardList att = new CardList(getAttackers()); - CardList block = new CardList(); - - for (int i = 0; i < att.size(); i++) - block.addAll(getBlockers(att.get(i))); - - return block; - }// getAllBlockers() - - /** - *

getBlockers.

- * - * @param attacker a {@link forge.Card} object. - * @return a {@link forge.CardList} object. - */ - public CardList getBlockers(Card attacker) { - if (getList(attacker) == null) - return new CardList(); - else - return new CardList(getList(attacker)); - } - - /** - *

getAttackerBlockedBy.

- * - * @param blocker a {@link forge.Card} object. - * @return a {@link forge.Card} object. - */ - public Card getAttackerBlockedBy(Card blocker) { - CardList att = new CardList(getAttackers()); - - for (int i = 0; i < att.size(); i++) { - if (getBlockers(att.get(i)).contains(blocker)) return att.get(i); - } // for - - return null; - } - - /** - *

getList.

- * - * @param attacker a {@link forge.Card} object. - * @return a {@link forge.CardList} object. - */ - private CardList getList(Card attacker) { - return (CardList) map.get(attacker); - } - - /** - *

removeFromCombat.

- * - * @param c a {@link forge.Card} object. - */ - public void removeFromCombat(Card c) { - // is card an attacker? - CardList att = new CardList(getAttackers()); - if (att.contains(c)) { - map.remove(c); - attackerToDefender.remove(c); - } else// card is a blocker - { - for (Card a : att) - if (getBlockers(a).contains(c)) { - getList(a).remove(c); - // TODO if Declare Blockers and Declare Blockers (Abilities) merge this logic needs to be tweaked - if (getBlockers(a).size() == 0 && AllZone.getPhase().is(Constant.Phase.Combat_Declare_Blockers)) - blocked.remove(a); - } - } - // update combat - CombatUtil.showCombat(); - }// removeFromCombat() - - /** - *

verifyCreaturesInPlay.

- */ - public void verifyCreaturesInPlay() { - CardList all = new CardList(); - all.addAll(getAttackers()); - all.addAll(getAllBlockers()); - - for (int i = 0; i < all.size(); i++) - if (!AllZoneUtil.isCardInPlay(all.get(i))) - removeFromCombat(all.get(i)); - }// verifyCreaturesInPlay() - - /** - *

setUnblocked.

- */ - public void setUnblocked() { - CardList attacking = new CardList(getAttackers()); - - for (Card attacker : attacking) { - CardList block = getBlockers(attacker); - - if (block.size() == 0) { - // this damage is assigned to a player by setPlayerDamage() - addUnblockedAttacker(attacker); - - //Run Unblocked Trigger - HashMap runParams = new HashMap(); - runParams.put("Attacker", attacker); - AllZone.getTriggerHandler().runTrigger("AttackerUnblocked", runParams); - - } - } - } - - // set Card.setAssignedDamage() for all creatures in combat - // also assigns player damage by setPlayerDamage() - /** - *

setAssignedFirstStrikeDamage.

- * - * @return a boolean. - */ - public boolean setAssignedFirstStrikeDamage() { - - boolean needFirstStrike = setDefendingFirstStrikeDamage(); - - CardList block; - CardList attacking = new CardList(getAttackers()); - - for (int i = 0; i < attacking.size(); i++) { - - Card attacker = attacking.get(i); - block = getBlockers(attacker); - - int damageDealt = attacker.getNetCombatDamage(); - - // attacker always gets all blockers' attack - - for (Card b : block) { - if (b.hasFirstStrike() || b.hasDoubleStrike()) { - needFirstStrike = true; - int attack = b.getNetCombatDamage(); - attacker.addAssignedDamage(attack, b); - } - } - - if (block.size() == 0) { - // this damage is assigned to a player by setDefendingFirstStrikeDamage() - } else if (attacker.hasFirstStrike() || attacker.hasDoubleStrike()) { - needFirstStrike = true; - if (getAttackingPlayer().isHuman()) {// human attacks - if (attacker.hasKeyword("Trample") || block.size() > 1) - AllZone.getDisplay().assignDamage(attacker, block, damageDealt); - else block.get(0).addAssignedDamage(damageDealt, attacking.get(i)); - } else {// computer attacks - distributeAIDamage(attacker, block, damageDealt); - } - }// if(hasFirstStrike || doubleStrike) - }// for - return needFirstStrike; - }// setAssignedFirstStrikeDamage() - - // set Card.setAssignedDamage() for all creatures in combat - // also assigns player damage by setPlayerDamage() - /** - *

setAssignedDamage.

- */ - public void setAssignedDamage() { - setDefendingDamage(); - - CardList block; - CardList attacking = new CardList(getAttackers()); - for (int i = 0; i < attacking.size(); i++) { - - Card attacker = attacking.get(i); - block = getBlockers(attacker); - - int damageDealt = attacker.getNetCombatDamage(); - - // attacker always gets all blockers' attack - for (Card b : block) { - if (!b.hasFirstStrike() || b.hasDoubleStrike()) { - int attack = b.getNetCombatDamage(); - attacker.addAssignedDamage(attack, b); - } - } - - if (block.size() == 0) { - // this damage is assigned to a player by setDefendingDamage() - } else if (!attacker.hasFirstStrike() || attacker.hasDoubleStrike()) { - - if (getAttackingPlayer().isHuman()) {// human attacks - - if (attacker.hasKeyword("Trample") || block.size() > 1) - AllZone.getDisplay().assignDamage(attacker, block, damageDealt); - else block.get(0).addAssignedDamage(damageDealt, attacking.get(i)); - } else {// computer attacks - distributeAIDamage(attacker, block, damageDealt); - } - }// if !hasFirstStrike ... - }// for - - // should first strike affect the following? - - }// assignDamage() - - /** - *

distributeAIDamage.

- * - * @param attacker a {@link forge.Card} object. - * @param block a {@link forge.CardList} object. - * @param damage a int. - */ - private void distributeAIDamage(Card attacker, CardList block, int damage) { - Card c = attacker; - - if (block.size() == 1) { - - Card blocker = block.get(0); - - // trample - if (attacker.hasKeyword("Trample")) { - - int damageNeeded = 0; - - //TODO: if the human can be killed distribute only the minimum of damage to the blocker - - damageNeeded = blocker.getEnoughDamageToKill(damage, attacker, true); - - if (damageNeeded > damage) - damageNeeded = Math.min(blocker.getLethalDamage(), damage); - else - damageNeeded = Math.max(blocker.getLethalDamage(), damageNeeded); - - int trample = damage - damageNeeded; - - if (0 < trample) // If Extra trample damage, assign to defending player/planeswalker - this.addDefendingDamage(trample, attacker); - - blocker.addAssignedDamage(damageNeeded, attacker); - } else blocker.addAssignedDamage(damage, attacker); - }// 1 blocker - else { - boolean killsAllBlockers = true;//Does the attacker deal lethal damage to all blockers - for (Card b : block) { - int enoughDamageToKill = b.getEnoughDamageToKill(damage, attacker, true); - if (enoughDamageToKill <= damage) { - damage -= enoughDamageToKill; - CardList cl = new CardList(); - cl.add(attacker); - - b.addAssignedDamage(enoughDamageToKill, c); - } else killsAllBlockers = false; - }// for - - // if attacker has no trample, and there's damage left, assign the rest - // to a random blocker - if (damage > 0 - && !(c.hasKeyword("Trample") - && killsAllBlockers == true)) { - int index = CardUtil.getRandomIndex(block); - block.get(index).addAssignedDamage(damage, c); - damage = 0; - } else if (c.hasKeyword("Trample") - && killsAllBlockers == true) { - this.addDefendingDamage(damage, c); - } - } - }// setAssignedDamage() - - /** - *

dealAssignedDamage.

- */ - public static void dealAssignedDamage() { - // This function handles both Regular and First Strike combat assignment - Player player = AllZone.getCombat().getDefendingPlayer(); - - boolean bFirstStrike = AllZone.getPhase().is(Constant.Phase.Combat_FirstStrikeDamage); - - HashMap defMap = AllZone.getCombat().getDefendingDamageMap(); - - for (Entry entry : defMap.entrySet()) { - player.addCombatDamage(entry.getValue(), entry.getKey()); - } - - CardList unblocked = new CardList(bFirstStrike ? AllZone.getCombat().getUnblockedAttackers() : - AllZone.getCombat().getUnblockedFirstStrikeAttackers()); - - for (int j = 0; j < unblocked.size(); j++) { - if (bFirstStrike) - CombatUtil.checkUnblockedAttackers(unblocked.get(j)); - else { - if (!unblocked.getCard(j).hasFirstStrike() && !unblocked.getCard(j).hasDoubleStrike()) - CombatUtil.checkUnblockedAttackers(unblocked.get(j)); - } - } - - // this can be much better below here... - - CardList combatants = new CardList(); - combatants.addAll(AllZone.getCombat().getAttackers()); - combatants.addAll(AllZone.getCombat().getAllBlockers()); - combatants.addAll(AllZone.getCombat().getDefendingPlaneswalkers()); - - Card c; - for (int i = 0; i < combatants.size(); i++) { - c = combatants.get(i); - - // if no assigned damage to resolve, move to next - if (c.getTotalAssignedDamage() == 0) - continue; - - Map assignedDamageMap = c.getAssignedDamageMap(); - HashMap damageMap = new HashMap(); - - for (Entry entry : assignedDamageMap.entrySet()) { - Card crd = entry.getKey(); - damageMap.put(crd, entry.getValue()); - } - c.addCombatDamage(damageMap); - - damageMap.clear(); - c.clearAssignedDamage(); - } - - //This was deeper before, but that resulted in the stack entry acting like before. - - } - - /** - *

isUnblocked.

- * - * @param att a {@link forge.Card} object. - * @return a boolean. - */ - public boolean isUnblocked(Card att) { - return unblockedMap.containsKey(att); - } - - /** - *

getUnblockedAttackers.

- * - * @return an array of {@link forge.Card} objects. - */ - public Card[] getUnblockedAttackers() { - CardList out = new CardList(); - Iterator it = unblockedMap.keySet().iterator(); - while (it.hasNext()) { // only add creatures without firstStrike to this - // list. - Card c = (Card) it.next(); - if (!c.hasFirstStrike()) { - out.add(c); - } - } - - return out.toArray(); - }// getUnblockedAttackers() - - /** - *

getUnblockedFirstStrikeAttackers.

- * - * @return an array of {@link forge.Card} objects. - */ - public Card[] getUnblockedFirstStrikeAttackers() { - CardList out = new CardList(); - Iterator it = unblockedMap.keySet().iterator(); - while (it.hasNext()) { // only add creatures without firstStrike to this - // list. - Card c = (Card) it.next(); - if (c.hasFirstStrike() || c.hasDoubleStrike()) { - out.add(c); - } - } - - return out.toArray(); - }// getUnblockedAttackers() - - /** - *

addUnblockedAttacker.

- * - * @param c a {@link forge.Card} object. - */ - public void addUnblockedAttacker(Card c) { - unblockedMap.put(c, new CardList()); - } - -}// Class Combat diff --git a/src/forge/CombatUtil.java b/src/forge/CombatUtil.java deleted file mode 100644 index 563fcbcaa24..00000000000 --- a/src/forge/CombatUtil.java +++ /dev/null @@ -1,2132 +0,0 @@ -package forge; - - -import com.esotericsoftware.minlog.Log; -import forge.card.abilityFactory.AbilityFactory; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.Ability; -import forge.card.trigger.Trigger; -import forge.gui.GuiUtils; -import forge.gui.input.Input_PayManaCost_Ability; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - - -/** - *

CombatUtil class.

- * - * @author Forge - * @version $Id: $ - */ -public class CombatUtil { - - //can the creature block given the combat state? - /** - *

canBlock.

- * - * @param blocker a {@link forge.Card} object. - * @param combat a {@link forge.Combat} object. - * @return a boolean. - */ - public static boolean canBlock(Card blocker, Combat combat) { - - if (blocker == null) return false; - - if (combat.getAllBlockers().size() > 1 && AllZoneUtil.isCardInPlay("Caverns of Despair")) - return false; - - if (combat.getAllBlockers().size() > 0 && AllZoneUtil.isCardInPlay("Silent Arbiter")) - return false; - - if (combat.getAllBlockers().size() > 0 && AllZoneUtil.isCardInPlay("Dueling Grounds")) - return false; - - - return canBlock(blocker); - } - - - //can the creature block at all? - /** - *

canBlock.

- * - * @param blocker a {@link forge.Card} object. - * @return a boolean. - */ - public static boolean canBlock(Card blocker) { - - if (blocker == null) return false; - - if (blocker.isTapped() && !AllZoneUtil.isCardInPlay("Masako the Humorless", blocker.getController())) - return false; - - if (blocker.hasKeyword("CARDNAME can't block.") || blocker.hasKeyword("CARDNAME can't attack or block.")) - return false; - - CardList kulrath = AllZoneUtil.getCardsInPlay("Kulrath Knight"); - if (kulrath.size() > 0) { - for (int i = 0; i < kulrath.size(); i++) { - Card cKK = kulrath.get(i); - Player oppKK = cKK.getController().getOpponent(); - - if (blocker.getController().equals(oppKK) && blocker.hasCounters()) - return false; - } - } - - return true; - } - - //can the attacker be blocked at all? - /** - *

canBeBlocked.

- * - * @param attacker a {@link forge.Card} object. - * @param combat a {@link forge.Combat} object. - * @return a boolean. - */ - public static boolean canBeBlocked(Card attacker, Combat combat) { - - if (attacker == null) return true; - - if (attacker.hasKeyword("CARDNAME can't be blocked by more than one creature.") - && combat.getBlockers(attacker).size() > 0) return false; - - return canBeBlocked(attacker); - } - - //can the attacker be blocked at all? - /** - *

canBeBlocked.

- * - * @param attacker a {@link forge.Card} object. - * @return a boolean. - */ - public static boolean canBeBlocked(Card attacker) { - - if (attacker == null) return true; - - if (attacker.hasKeyword("Unblockable")) return false; - - //Landwalk - if (!AllZoneUtil.isCardInPlay("Staff of the Ages")) { //"Creatures with landwalk abilities can be blocked as though they didn't have those abilities." - CardList blkCL = AllZoneUtil.getPlayerCardsInPlay(attacker.getController().getOpponent()); - CardList temp = new CardList(); - - if (attacker.hasKeyword("Plainswalk")) { - temp = blkCL.getType("Plains"); - if (!AllZoneUtil.isCardInPlay("Lord Magnus") - && !AllZoneUtil.isCardInPlay("Great Wall") - && !temp.isEmpty()) return false; - } - - if (attacker.hasKeyword("Islandwalk")) { - temp = blkCL.getType("Island"); - if (!AllZoneUtil.isCardInPlay("Undertow") - && !AllZoneUtil.isCardInPlay("Gosta Dirk") - && !temp.isEmpty()) return false; - } - - if (attacker.hasKeyword("Swampwalk")) { - temp = blkCL.getType("Swamp"); - if (!AllZoneUtil.isCardInPlay("Ur-drago") - && !AllZoneUtil.isCardInPlay("Quagmire") - && !temp.isEmpty()) return false; - } - - if (attacker.hasKeyword("Mountainwalk")) { - temp = blkCL.getType("Mountain"); - if (!AllZoneUtil.isCardInPlay("Crevasse") - && !temp.isEmpty()) return false; - } - - if (attacker.hasKeyword("Forestwalk")) { - temp = blkCL.getType("Forest"); - if (!AllZoneUtil.isCardInPlay("Lord Magnus") - && !AllZoneUtil.isCardInPlay("Deadfall") - && !temp.isEmpty()) return false; - } - - if (attacker.hasKeyword("Legendary landwalk")) { - temp = blkCL.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isLand() - && c.isType("Legendary"); - } - }); - if (!temp.isEmpty()) return false; - } - - if (attacker.hasKeyword("Snow swampwalk")) { - temp = blkCL.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isType("Swamp") && c.isSnow(); - } - }); - if (!temp.isEmpty()) return false; - } - - if (attacker.hasKeyword("Snow forestwalk")) { - temp = blkCL.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isType("Forest") && c.isSnow(); - } - }); - if (!temp.isEmpty()) return false; - } - - if (attacker.hasKeyword("Snow islandwalk")) { - temp = blkCL.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isType("Island") && c.isSnow(); - } - }); - if (!temp.isEmpty()) return false; - } - - if (attacker.hasKeyword("Snow plainswalk")) { - temp = blkCL.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isType("Plains") && c.isSnow(); - } - }); - if (!temp.isEmpty()) return false; - } - - if (attacker.hasKeyword("Snow mountainwalk")) { - temp = blkCL.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isType("Mountain") && c.isSnow(); - } - }); - if (!temp.isEmpty()) return false; - } - - if (attacker.hasKeyword("Snow landwalk")) { - temp = blkCL.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isLand() && c.isSnow(); - } - }); - if (!temp.isEmpty()) return false; - } - - if (attacker.hasKeyword("Desertwalk")) { - temp = blkCL.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isLand() - && c.isType("Desert"); - } - }); - if (!temp.isEmpty()) return false; - } - - if (attacker.hasKeyword("Nonbasic landwalk")) { - temp = blkCL.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isLand() && !c.isBasicLand(); - } - }); - if (!temp.isEmpty()) return false; - } - } - return true; - } - - // Has the player chosen all mandatory blocks? - /** - *

finishedMandatotyBlocks.

- * - * @param combat a {@link forge.Combat} object. - * @return a boolean. - */ - public static boolean finishedMandatotyBlocks(Combat combat) { - - CardList blockers = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer()); - CardList attackers = new CardList(combat.getAttackers()); - - //if a creature does not block but should, return false - for (Card blocker : blockers) { - //lure effects - if (!combat.getAllBlockers().contains(blocker) && canBlockAnAttackerWithLure(blocker, combat)) - return false; - - //"CARDNAME blocks each turn if able." - if (!combat.getAllBlockers().contains(blocker) - && blocker.hasKeyword("CARDNAME blocks each turn if able.")) - for (Card attacker : attackers) - if (canBlock(attacker, blocker, combat)) - return false; - } - - return true; - } - - // can the blocker block an attacker with a lure effect? - /** - *

canBlockAnAttackerWithLure.

- * - * @param blocker a {@link forge.Card} object. - * @param combat a {@link forge.Combat} object. - * @return a boolean. - */ - public static boolean canBlockAnAttackerWithLure(Card blocker, Combat combat) { - - if (blocker == null) return false; - - if (canBlock(blocker, combat) == false) return false; - - CardList attackersWithLure = new CardList(combat.getAttackers()); - attackersWithLure = attackersWithLure.getKeyword("All creatures able to block CARDNAME do so."); - - for (Card attacker : attackersWithLure) { - if (canBlock(blocker, combat) && canBlock(attacker, blocker)) return true; - } - - return false; - } - - // can the blocker block the attacker given the combat state? - /** - *

canBlock.

- * - * @param attacker a {@link forge.Card} object. - * @param blocker a {@link forge.Card} object. - * @param combat a {@link forge.Combat} object. - * @return a boolean. - */ - public static boolean canBlock(Card attacker, Card blocker, Combat combat) { - - if (attacker == null || blocker == null) return false; - - if (canBlock(blocker, combat) == false) return false; - if (canBeBlocked(attacker, combat) == false) return false; - - //if the attacker has no lure effect, but the blocker can block another attacker with lure, the blocker can't block the former - if (!attacker.hasKeyword("All creatures able to block CARDNAME do so.") - && canBlockAnAttackerWithLure(blocker, combat)) return false; - - if (blocker.hasStartOfKeyword("CARDNAME can't block ")) { - for (String kw : blocker.getKeyword()) { - if (kw.startsWith("CARDNAME can't block ")) { - String unblockableCard = kw.substring(21); - int ID = Integer.parseInt(unblockableCard.substring(unblockableCard.lastIndexOf("(") + 1, unblockableCard.length() - 1)); - if (attacker.getUniqueNumber() == ID) { - return false; - } - } - } - } - - return canBlock(attacker, blocker); - } - - - // can the blocker block the attacker? - /** - *

canBlock.

- * - * @param attacker a {@link forge.Card} object. - * @param blocker a {@link forge.Card} object. - * @return a boolean. - */ - public static boolean canBlock(Card attacker, Card blocker) { - - if (attacker == null || blocker == null) return false; - - if (canBlock(blocker) == false) return false; - if (canBeBlocked(attacker) == false) return false; - - if (CardFactoryUtil.hasProtectionFrom(blocker, attacker)) return false; - - //rare case: - if (blocker.hasKeyword("Shadow") - && blocker.hasKeyword( - "CARDNAME can block creatures with shadow as though they didn't have shadow.")) return false; - - if (attacker.hasKeyword("Shadow") - && !blocker.hasKeyword("Shadow") - && !blocker.hasKeyword( - "CARDNAME can block creatures with shadow as though they didn't have shadow.")) return false; - - if (!attacker.hasKeyword("Shadow") - && blocker.hasKeyword("Shadow")) return false; - - if (blocker.hasKeyword("CARDNAME can't block white creatures with power 2 or greater.")) { - if (attacker.isWhite() && attacker.getNetAttack() >= 2) return false; - } - - if (blocker.hasKeyword("CARDNAME can't block black creatures.")) { - if (attacker.isBlack()) return false; - } - - if (attacker.hasKeyword("Creatures with power less than CARDNAME's power can't block it.") - && attacker.getNetAttack() > blocker.getNetAttack()) - return false; - if (blocker.getNetAttack() > attacker.getNetAttack() - && blocker.hasKeyword("CARDNAME can't be blocked by creatures with power greater than CARDNAME's power.")) - return false; - if (blocker.getNetAttack() >= attacker.getNetDefense() - && blocker.hasKeyword("CARDNAME can't be blocked by creatures with power equal to or greater than CARDNAME's toughness.")) - return false; - - if (attacker.hasStartOfKeyword("CantBeBlockedBy")) { - int KeywordPosition = attacker.getKeywordPosition("CantBeBlockedBy"); - String parse = attacker.getKeyword().get(KeywordPosition).toString(); - String k[] = parse.split(" ", 2); - final String restrictions[] = k[1].split(","); - if (blocker.isValidCard(restrictions, attacker.getController(), attacker)) - return false; - } - - if (blocker.hasStartOfKeyword("CantBlock")) { - int KeywordPosition = blocker.getKeywordPosition("CantBlock"); - String parse = blocker.getKeyword().get(KeywordPosition).toString(); - String k[] = parse.split(" ", 2); - final String restrictions[] = k[1].split(","); - if (attacker.isValidCard(restrictions, blocker.getController(), blocker)) - return false; - } - - if (attacker.hasKeyword("CARDNAME can't be blocked by black creatures.") && blocker.isBlack()) return false; - if (attacker.hasKeyword("CARDNAME can't be blocked by blue creatures.") && blocker.isBlue()) return false; - if (attacker.hasKeyword("CARDNAME can't be blocked by green creatures.") && blocker.isGreen()) return false; - if (attacker.hasKeyword("CARDNAME can't be blocked by red creatures.") && blocker.isRed()) return false; - if (attacker.hasKeyword("CARDNAME can't be blocked by white creatures.") && blocker.isWhite()) return false; - - if (blocker.hasKeyword("CARDNAME can block only creatures with flying.") - && !attacker.hasKeyword("Flying")) return false; - - if (attacker.hasKeyword("Flying") - || attacker.hasKeyword("CARDNAME can't be blocked except by creatures with flying or reach.")) { - if (!blocker.hasKeyword("Flying") - && !blocker.hasKeyword("Reach")) return false; - } - - if (attacker.hasKeyword("Horsemanship")) { - if (!blocker.hasKeyword("Horsemanship")) return false; - } - - if (attacker.hasKeyword("Fear")) { - if (!blocker.isArtifact() && !blocker.isBlack()) - return false; - } - - if (attacker.hasKeyword("Intimidate")) { - if (!blocker.isArtifact() && !blocker.sharesColorWith(attacker)) - return false; - } - - if (attacker.hasKeyword("CARDNAME can't be blocked by Walls.") - && blocker.isWall()) return false; - - if (attacker.hasKeyword("CARDNAME can't be blocked except by Walls.") - && !blocker.isWall()) return false; - - if (attacker.hasKeyword("CARDNAME can't be blocked except by black creatures.") - && !blocker.isBlack()) return false; - - if (AllZoneUtil.isCardInPlay("Shifting Sliver")) { - if (attacker.isType("Sliver") && !blocker.isType("Sliver")) return false; - } - - return true; - }//canBlock() - - //can a creature attack given the combat state - /** - *

canAttack.

- * - * @param c a {@link forge.Card} object. - * @param combat a {@link forge.Combat} object. - * @return a boolean. - */ - public static boolean canAttack(Card c, Combat combat) { - - if (combat.getAttackers().length > 1 && AllZoneUtil.isCardInPlay("Crawlspace", c.getController().getOpponent())) - return false; - - if (combat.getAttackers().length > 1 && AllZoneUtil.isCardInPlay("Caverns of Despair")) - return false; - - if (combat.getAttackers().length > 0 && AllZoneUtil.isCardInPlay("Silent Arbiter")) - return false; - - if (combat.getAttackers().length > 0 && AllZoneUtil.isCardInPlay("Dueling Grounds")) - return false; - - return canAttack(c); - } - - //can a creature attack at the moment? - /** - *

canAttack.

- * - * @param c a {@link forge.Card} object. - * @return a boolean. - */ - public static boolean canAttack(Card c) { - if (c.isTapped() || (c.isSick() && !c.isEnchantedBy("Instill Energy"))) return false; - - return canAttackNextTurn(c); - } - - //can a creature attack if untapped and without summoning sickness? - /** - *

canAttackNextTurn.

- * - * @param c a {@link forge.Card} object. - * @return a boolean. - */ - public static boolean canAttackNextTurn(Card c) { - if (!c.isCreature()) return false; - - if (AllZoneUtil.isCardInPlay("Peacekeeper")) return false; - - // CARDNAME can't attack if defending player controls an untapped creature with power ... - final int powerLimit[] = {0}; - int keywordPosition = 0; - boolean hasKeyword = false; - - ArrayList attackerKeywords = c.getKeyword(); - for (int i = 0; i < attackerKeywords.size(); i++) { - if (attackerKeywords.get(i).toString().startsWith("CARDNAME can't attack if defending player controls an untapped creature with power")) { - hasKeyword = true; - keywordPosition = i; - } - } - - // The keyword "CARDNAME can't attack if defending player controls an untapped creature with power" ... is present - if (hasKeyword) { - String tmpString = c.getKeyword().get(keywordPosition).toString(); - final String asSeparateWords[] = tmpString.trim().split(" "); - - if (asSeparateWords.length >= 15) { - if (asSeparateWords[12].matches("[0-9][0-9]?")) { - powerLimit[0] = Integer.parseInt((asSeparateWords[12]).trim()); - - CardList list = AllZoneUtil.getCreaturesInPlay(c.getController().getOpponent()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card ct) { - return ((ct.isUntapped() && ct.getNetAttack() >= powerLimit[0] && asSeparateWords[14].contains("greater")) || - (ct.isUntapped() && ct.getNetAttack() <= powerLimit[0] && asSeparateWords[14].contains("less"))); - } - }); - if (!list.isEmpty()) return false; - } - } - } // hasKeyword = CARDNAME can't attack if defending player controls an untapped creature with power ... - - CardList list = AllZoneUtil.getPlayerCardsInPlay(c.getController().getOpponent()); - CardList temp; - - if (c.hasKeyword("CARDNAME can't attack unless defending player controls an Island.")) { - temp = list.getType("Island"); - if (temp.isEmpty()) return false; - } - - if (c.hasKeyword("CARDNAME can't attack unless defending player controls a Forest.")) { - temp = list.getType("Forest"); - if (temp.isEmpty()) return false; - } - - if (c.hasKeyword("CARDNAME can't attack unless defending player controls a Swamp.")) { - temp = list.getType("Swamp"); - if (temp.isEmpty()) return false; - } - if (c.hasKeyword("CARDNAME can't attack unless defending player controls a Mountain.")) { - temp = list.getType("Montain"); - if (temp.isEmpty()) return false; - } - if (c.hasKeyword("CARDNAME can't attack unless defending player controls a snow land.")) { - temp = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isLand() - && c.isSnow(); - } - }); - if (temp.isEmpty()) return false; - } - - if (c.hasKeyword("CARDNAME can't attack unless defending player controls a blue permanent.")) { - temp = list.getColor(Constant.Color.Blue); - if (temp.isEmpty()) return false; - } - - - if (c.getName().equals("Harbor Serpent")) { - CardList allislands = AllZoneUtil.getTypeInPlay("Island"); - if (allislands.size() < 5) return false; - } - - //The creature won't untap next turn - if (c.isTapped() && !PhaseUtil.canUntap(c)) return false; - - if (AllZoneUtil.isCardInPlay("Blazing Archon", c.getController().getOpponent()) - || c.hasKeyword("CARDNAME can't attack.") - || c.hasKeyword("CARDNAME can't attack or block.") - || (AllZoneUtil.isCardInPlay("Reverence", c.getController().getOpponent()) && c.getNetAttack() < 3)) - return false; - - if (c.hasKeyword("Defender") - && !c.hasKeyword("CARDNAME can attack as though it didn't have defender.")) { - return false; - } - - if (AllZoneUtil.isCardInPlay("Ensnaring Bridge")) { - int limit = Integer.MAX_VALUE; - CardList Human = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - if (Human.getName("Ensnaring Bridge").size() > 0) { - CardList Hand = AllZoneUtil.getPlayerHand(AllZone.getHumanPlayer()); - limit = Hand.size(); - } - CardList Compi = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - if (Compi.getName("Ensnaring Bridge").size() > 0) { - CardList Hand = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); - if (Hand.size() < limit) limit = Hand.size(); - } - if (c.getNetAttack() > limit) return false; - } - - if (AllZoneUtil.isCardInPlay("Kulrath Knight")) { - CardList all = AllZoneUtil.getCardsInPlay("Kulrath Knight"); - for (int i = 0; i < all.size(); i++) { - Card cKK = all.get(i); - Player oppKK = cKK.getController().getOpponent(); - - if (c.getController().equals(oppKK) && c.hasCounters()) - return false; - } - } - - return true; - }//canAttack() - - - /** - *

getTotalFirstStrikeBlockPower.

- * - * @param attacker a {@link forge.Card} object. - * @param player a {@link forge.Player} object. - * @return a int. - */ - public static int getTotalFirstStrikeBlockPower(Card attacker, Player player) { - final Card att = attacker; - - CardList list = AllZoneUtil.getCreaturesInPlay(player); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return canBlock(att, c) && (c.hasFirstStrike() || c.hasDoubleStrike()); - } - }); - - return totalDamageOfBlockers(attacker, list); - - } - - //This function takes Doran and Double Strike into account - /** - *

getAttack.

- * - * @param c a {@link forge.Card} object. - * @return a int. - */ - public static int getAttack(Card c) { - int n = c.getNetCombatDamage(); - - if (c.hasDoubleStrike()) - n *= 2; - - return n; - } - - //Returns the damage an unblocked attacker would deal - /** - *

damageIfUnblocked.

- * - * @param attacker a {@link forge.Card} object. - * @param attacked a {@link forge.Player} object. - * @param combat a {@link forge.Combat} object. - * @return a int. - */ - public static int damageIfUnblocked(Card attacker, Player attacked, Combat combat) { - int damage = attacker.getNetCombatDamage(); - int sum = 0; - damage += predictPowerBonusOfAttacker(attacker, null, combat); - if (!attacker.hasKeyword("Infect")) { - sum = attacked.predictDamage(damage, attacker, true); - if (attacker.hasKeyword("Double Strike")) sum += attacked.predictDamage(damage, attacker, true); - } - return sum; - } - - //Returns the poison an unblocked attacker would deal - /** - *

poisonIfUnblocked.

- * - * @param attacker a {@link forge.Card} object. - * @param attacked a {@link forge.Player} object. - * @param combat a {@link forge.Combat} object. - * @return a int. - */ - public static int poisonIfUnblocked(Card attacker, Player attacked, Combat combat) { - int damage = attacker.getNetCombatDamage(); - int poison = 0; - damage += predictPowerBonusOfAttacker(attacker, null, null); - if (attacker.hasKeyword("Infect")) { - poison += attacked.predictDamage(damage, attacker, true); - if (attacker.hasKeyword("Double Strike")) poison += attacked.predictDamage(damage, attacker, true); - } - if (attacker.hasKeyword("Poisonous") && damage > 0) poison += attacker.getKeywordMagnitude("Poisonous"); - return poison; - } - - //Returns the damage unblocked attackers would deal - /** - *

sumDamageIfUnblocked.

- * - * @param attackers a {@link forge.CardList} object. - * @param attacked a {@link forge.Player} object. - * @return a int. - */ - private static int sumDamageIfUnblocked(CardList attackers, Player attacked) { - int sum = 0; - for (Card attacker : attackers) { - sum += damageIfUnblocked(attacker, attacked, null); - } - return sum; - } - - //Returns the number of poison counters unblocked attackers would deal - /** - *

sumPoisonIfUnblocked.

- * - * @param attackers a {@link forge.CardList} object. - * @param attacked a {@link forge.Player} object. - * @return a int. - */ - private static int sumPoisonIfUnblocked(CardList attackers, Player attacked) { - int sum = 0; - for (Card attacker : attackers) { - sum += poisonIfUnblocked(attacker, attacked, null); - } - return sum; - } - - //calculates the amount of life that will remain after the attack - /** - *

lifeThatWouldRemain.

- * - * @param combat a {@link forge.Combat} object. - * @return a int. - */ - public static int lifeThatWouldRemain(Combat combat) { - - int damage = 0; - - CardList attackers = combat.sortAttackerByDefender()[0]; - CardList unblocked = new CardList(); - - for (Card attacker : attackers) { - - CardList blockers = combat.getBlockers(attacker); - - if (blockers.size() == 0) unblocked.add(attacker); - else if (attacker.hasKeyword("Trample") && getAttack(attacker) > CombatUtil.totalShieldDamage(attacker, blockers)) { - if (!attacker.hasKeyword("Infect")) - damage += getAttack(attacker) - CombatUtil.totalShieldDamage(attacker, blockers); - } - } - - damage += sumDamageIfUnblocked(unblocked, AllZone.getComputerPlayer()); - - if (!AllZone.getComputerPlayer().canLoseLife()) damage = 0; - - return AllZone.getComputerPlayer().getLife() - damage; - } - - //calculates the amount of poison counters after the attack - /** - *

resultingPoison.

- * - * @param combat a {@link forge.Combat} object. - * @return a int. - */ - public static int resultingPoison(Combat combat) { - - int poison = 0; - - CardList attackers = combat.sortAttackerByDefender()[0]; - CardList unblocked = new CardList(); - - for (Card attacker : attackers) { - - CardList blockers = combat.getBlockers(attacker); - - if (blockers.size() == 0) unblocked.add(attacker); - else if (attacker.hasKeyword("Trample") && getAttack(attacker) > CombatUtil.totalShieldDamage(attacker, blockers)) { - if (attacker.hasKeyword("Infect")) - poison += getAttack(attacker) - CombatUtil.totalShieldDamage(attacker, blockers); - if (attacker.hasKeyword("Poisonous")) - poison += attacker.getKeywordMagnitude("Poisonous"); - } - } - - poison += sumPoisonIfUnblocked(unblocked, AllZone.getComputerPlayer()); - - return AllZone.getComputerPlayer().getPoisonCounters() + poison; - } - - //Checks if the life of the attacked Player/Planeswalker is in danger - /** - *

lifeInDanger.

- * - * @param combat a {@link forge.Combat} object. - * @return a boolean. - */ - public static boolean lifeInDanger(Combat combat) { - // life in danger only cares about the player's life. Not about a Planeswalkers life - if (AllZone.getComputerPlayer().cantLose()) - return false; - - if (lifeThatWouldRemain(combat) < Math.min(4, AllZone.getComputerPlayer().getLife()) - && !AllZone.getComputerPlayer().cantLoseForZeroOrLessLife()) - return true; - - return (resultingPoison(combat) > Math.max(7, AllZone.getComputerPlayer().getPoisonCounters())); - } - - //Checks if the life of the attacked Player would be reduced - /** - *

wouldLoseLife.

- * - * @param combat a {@link forge.Combat} object. - * @return a boolean. - */ - public static boolean wouldLoseLife(Combat combat) { - - return (lifeThatWouldRemain(combat) < AllZone.getComputerPlayer().getLife()); - } - - //Checks if the life of the attacked Player/Planeswalker is in danger - /** - *

lifeInSeriousDanger.

- * - * @param combat a {@link forge.Combat} object. - * @return a boolean. - */ - public static boolean lifeInSeriousDanger(Combat combat) { - // life in danger only cares about the player's life. Not about a Planeswalkers life - if (AllZone.getComputerPlayer().cantLose()) - return false; - - if (lifeThatWouldRemain(combat) < 1 && !AllZone.getComputerPlayer().cantLoseForZeroOrLessLife()) - return true; - - return (resultingPoison(combat) > 9); - } - - // This calculates the amount of damage a blockgang can deal to the attacker (first strike not supported) - /** - *

totalDamageOfBlockers.

- * - * @param attacker a {@link forge.Card} object. - * @param defenders a {@link forge.CardList} object. - * @return a int. - */ - public static int totalDamageOfBlockers(Card attacker, CardList defenders) { - int damage = 0; - - for (Card defender : defenders) damage += dealsDamageAsBlocker(attacker, defender); - - return damage; - } - - - // This calculates the amount of damage a blocker in a blockgang can deal to the attacker - /** - *

dealsDamageAsBlocker.

- * - * @param attacker a {@link forge.Card} object. - * @param defender a {@link forge.Card} object. - * @return a int. - */ - public static int dealsDamageAsBlocker(Card attacker, Card defender) { - - if (attacker.getName().equals("Sylvan Basilisk") - && !defender.hasKeyword("Indestructible")) - return 0; - - int flankingMagnitude = 0; - if (attacker.hasKeyword("Flanking") - && !defender.hasKeyword("Flanking")) { - - flankingMagnitude = attacker.getAmountOfKeyword("Flanking"); - - if (flankingMagnitude >= defender.getNetDefense()) return 0; - if (flankingMagnitude >= defender.getNetDefense() - defender.getDamage() - && !defender.hasKeyword("Indestructible")) - return 0; - - }//flanking - if (attacker.hasKeyword("Indestructible") - && !(defender.hasKeyword("Wither") || defender.hasKeyword("Infect"))) return 0; - - int defBushidoMagnitude = defender.getKeywordMagnitude("Bushido"); - - int defenderDamage = defender.getNetCombatDamage() - flankingMagnitude + defBushidoMagnitude; - - // consider static Damage Prevention - defenderDamage = attacker.predictDamage(defenderDamage, defender, true); - - if (defender.hasKeyword("Double Strike")) - defenderDamage += attacker.predictDamage(defenderDamage, defender, true); - - return defenderDamage; - } - - // This calculates the amount of damage a blocker in a blockgang can take from the attacker (for trampling attackers) - /** - *

totalShieldDamage.

- * - * @param attacker a {@link forge.Card} object. - * @param defenders a {@link forge.CardList} object. - * @return a int. - */ - public static int totalShieldDamage(Card attacker, CardList defenders) { - - int defenderDefense = 0; - - for (Card defender : defenders) defenderDefense += shieldDamage(attacker, defender); - - return defenderDefense; - } - - // This calculates the amount of damage a blocker in a blockgang can take from the attacker (for trampling attackers) - /** - *

shieldDamage.

- * - * @param attacker a {@link forge.Card} object. - * @param defender a {@link forge.Card} object. - * @return a int. - */ - public static int shieldDamage(Card attacker, Card defender) { - - if (!canDestroyBlocker(defender, attacker, null, false)) return 100; - - int flankingMagnitude = 0; - if (attacker.hasKeyword("Flanking") - && !defender.hasKeyword("Flanking")) { - - flankingMagnitude = attacker.getAmountOfKeyword("Flanking"); - - if (flankingMagnitude >= defender.getNetDefense()) - return 0; - if (flankingMagnitude >= defender.getNetDefense() - defender.getDamage() - && !defender.hasKeyword("Indestructible")) - return 0; - - }//flanking - - int defBushidoMagnitude = defender.getKeywordMagnitude("Bushido"); - - int defenderDefense = defender.getNetDefense() - flankingMagnitude + defBushidoMagnitude; - - return defenderDefense; - }//shieldDamage - - //For AI safety measures like Regeneration - /** - *

combatantWouldBeDestroyed.

- * - * @param combatant a {@link forge.Card} object. - * @return a boolean. - */ - public static boolean combatantWouldBeDestroyed(Card combatant) { - - if (combatant.isAttacking()) - return attackerWouldBeDestroyed(combatant); - if (combatant.isBlocking()) - return blockerWouldBeDestroyed(combatant); - return false; - } - - //For AI safety measures like Regeneration - /** - *

attackerWouldBeDestroyed.

- * - * @param attacker a {@link forge.Card} object. - * @return a boolean. - */ - public static boolean attackerWouldBeDestroyed(Card attacker) { - CardList blockers = AllZone.getCombat().getBlockers(attacker); - - for (Card defender : blockers) { - if (CombatUtil.canDestroyAttacker(attacker, defender, AllZone.getCombat(), true) - && !(defender.hasKeyword("Wither") || defender.hasKeyword("Infect"))) - return true; - } - - return totalDamageOfBlockers(attacker, blockers) >= attacker.getKillDamage(); - } - - //Will this trigger trigger? - /** - *

combatTriggerWillTrigger.

- * - * @param attacker a {@link forge.Card} object. - * @param defender a {@link forge.Card} object. - * @param trigger a {@link forge.card.trigger.Trigger} object. - * @param combat a {@link forge.Combat} object. - * @return a boolean. - */ - public static boolean combatTriggerWillTrigger(Card attacker, Card defender, Trigger trigger, Combat combat) { - HashMap trigParams = trigger.getMapParams(); - boolean willTrigger = false; - Card source = trigger.getHostCard(); - if (combat == null) combat = AllZone.getCombat(); - - if (!trigger.zonesCheck()) return false; - if (!trigger.requirementsCheck()) return false; - - if (trigParams.get("Mode").equals("Attacks")) { - willTrigger = true; - if (attacker.isAttacking()) return false; //The trigger should have triggered already - if (trigParams.containsKey("ValidCard")) { - if (!trigger.matchesValid(attacker, trigParams.get("ValidCard").split(","), source) - && !(combat.isAttacking(source) && - trigger.matchesValid(source, trigParams.get("ValidCard").split(","), source))) - return false; - } - } - - // defender == null means unblocked - if (defender == null && trigParams.get("Mode").equals("AttackerUnblocked")) { - willTrigger = true; - if (trigParams.containsKey("ValidCard")) - if (!trigger.matchesValid(attacker, trigParams.get("ValidCard").split(","), source)) - return false; - } - - if (defender == null) return willTrigger; - - if (trigParams.get("Mode").equals("Blocks")) { - willTrigger = true; - if (trigParams.containsKey("ValidBlocked")) - if (!trigger.matchesValid(attacker, trigParams.get("ValidBlocked").split(","), source)) - return false; - if (trigParams.containsKey("ValidCard")) - if (!trigger.matchesValid(defender, trigParams.get("ValidCard").split(","), source)) - return false; - } else if (trigParams.get("Mode").equals("AttackerBlocked")) { - willTrigger = true; - if (trigParams.containsKey("ValidBlocker")) - if (!trigger.matchesValid(defender, trigParams.get("ValidBlocker").split(","), source)) - return false; - if (trigParams.containsKey("ValidCard")) - if (!trigger.matchesValid(attacker, trigParams.get("ValidCard").split(","), source)) - return false; - } - - return willTrigger; - } - - //Predict the Power bonus of the blocker if blocking the attacker (Flanking, Bushido and other triggered abilities) - /** - *

predictPowerBonusOfBlocker.

- * - * @param attacker a {@link forge.Card} object. - * @param defender a {@link forge.Card} object. - * @return a int. - */ - public static int predictPowerBonusOfBlocker(Card attacker, Card defender) { - int power = 0; - - if (attacker.hasKeyword("Flanking") - && !defender.hasKeyword("Flanking")) - power -= attacker.getAmountOfKeyword("Flanking"); - - //if the attacker has first strike and wither the blocker will deal less damage than expected - if ((attacker.hasKeyword("First Strike") || attacker.hasKeyword("Double Strike")) - && (attacker.hasKeyword("Wither") || attacker.hasKeyword("Infect")) - && !(defender.hasKeyword("First Strike") || defender.hasKeyword("Double Strike") - || defender.hasKeyword("CARDNAME can't have counters placed on it."))) - power -= attacker.getNetCombatDamage(); - - power += defender.getKeywordMagnitude("Bushido"); - - ArrayList registeredTriggers = AllZone.getTriggerHandler().getRegisteredTriggers(); - for (Trigger trigger : registeredTriggers) { - HashMap trigParams = trigger.getMapParams(); - Card source = trigger.getHostCard(); - - if (!combatTriggerWillTrigger(attacker, defender, trigger, null) || !trigParams.containsKey("Execute")) - continue; - String ability = source.getSVar(trigParams.get("Execute")); - AbilityFactory AF = new AbilityFactory(); - HashMap abilityParams = AF.getMapParams(ability, source); - if (abilityParams.containsKey("AB") && !abilityParams.get("AB").equals("Pump")) - continue; - if (abilityParams.containsKey("DB") && !abilityParams.get("DB").equals("Pump")) - continue; - if (abilityParams.containsKey("ValidTgts") || abilityParams.containsKey("Tgt")) - continue; //targeted pumping not supported - ArrayList list = AbilityFactory.getDefinedCards(source, abilityParams.get("Defined"), null); - if (abilityParams.containsKey("Defined") && abilityParams.get("Defined").equals("TriggeredBlocker")) - list.add(defender); - if (list.isEmpty()) continue; - if (!list.contains(defender)) continue; - if (!abilityParams.containsKey("NumAtt")) continue; - - String att = abilityParams.get("NumAtt"); - if (att.startsWith("+")) - att = att.substring(1); - try { - power += Integer.parseInt(att); - } catch (NumberFormatException nfe) { - //can't parse the number (X for example) - power += 0; - } - } - return power; - } - - //Predict the Toughness bonus of the blocker if blocking the attacker (Flanking, Bushido and other triggered abilities) - /** - *

predictToughnessBonusOfBlocker.

- * - * @param attacker a {@link forge.Card} object. - * @param defender a {@link forge.Card} object. - * @return a int. - */ - public static int predictToughnessBonusOfBlocker(Card attacker, Card defender) { - int toughness = 0; - - if (attacker.hasKeyword("Flanking") - && !defender.hasKeyword("Flanking")) - toughness -= attacker.getAmountOfKeyword("Flanking"); - - toughness += defender.getKeywordMagnitude("Bushido"); - - ArrayList registeredTriggers = AllZone.getTriggerHandler().getRegisteredTriggers(); - for (Trigger trigger : registeredTriggers) { - HashMap trigParams = trigger.getMapParams(); - Card source = trigger.getHostCard(); - - if (!combatTriggerWillTrigger(attacker, defender, trigger, null) || !trigParams.containsKey("Execute")) - continue; - String ability = source.getSVar(trigParams.get("Execute")); - AbilityFactory AF = new AbilityFactory(); - HashMap abilityParams = AF.getMapParams(ability, source); - if (abilityParams.containsKey("AB") && !abilityParams.get("AB").equals("Pump")) - continue; - if (abilityParams.containsKey("DB") && !abilityParams.get("DB").equals("Pump")) - continue; - if (abilityParams.containsKey("ValidTgts") || abilityParams.containsKey("Tgt")) - continue; //targeted pumping not supported - ArrayList list = AbilityFactory.getDefinedCards(source, abilityParams.get("Defined"), null); - if (abilityParams.containsKey("Defined") && abilityParams.get("Defined").equals("TriggeredBlocker")) - list.add(defender); - if (list.isEmpty()) continue; - if (!list.contains(defender)) continue; - if (!abilityParams.containsKey("NumDef")) continue; - - String def = abilityParams.get("NumDef"); - if (def.startsWith("+")) - def = def.substring(1); - try { - toughness += Integer.parseInt(def); - } catch (NumberFormatException nfe) { - //can't parse the number (X for example) - toughness += 0; - } - } - return toughness; - } - - //Predict the Power bonus of the blocker if blocking the attacker (Flanking, Bushido and other triggered abilities) - /** - *

predictPowerBonusOfAttacker.

- * - * @param attacker a {@link forge.Card} object. - * @param defender a {@link forge.Card} object. - * @param combat a {@link forge.Combat} object. - * @return a int. - */ - public static int predictPowerBonusOfAttacker(Card attacker, Card defender, Combat combat) { - int power = 0; - - power += attacker.getKeywordMagnitude("Bushido"); - - //if the defender has first strike and wither the attacker will deal less damage than expected - if (null != defender) { - if ((defender.hasKeyword("First Strike") || defender.hasKeyword("Double Strike")) - && (defender.hasKeyword("Wither") || defender.hasKeyword("Infect")) - && !(attacker.hasKeyword("First Strike") || attacker.hasKeyword("Double Strike") - || attacker.hasKeyword("CARDNAME can't have counters placed on it."))) - power -= defender.getNetCombatDamage(); - } - - ArrayList registeredTriggers = AllZone.getTriggerHandler().getRegisteredTriggers(); - for (Trigger trigger : registeredTriggers) { - HashMap trigParams = trigger.getMapParams(); - Card source = trigger.getHostCard(); - - if (!combatTriggerWillTrigger(attacker, defender, trigger, null) || !trigParams.containsKey("Execute")) - continue; - String ability = source.getSVar(trigParams.get("Execute")); - AbilityFactory AF = new AbilityFactory(); - HashMap abilityParams = AF.getMapParams(ability, source); - if (abilityParams.containsKey("ValidTgts") || abilityParams.containsKey("Tgt")) - continue; //targeted pumping not supported - if (abilityParams.containsKey("AB") && !abilityParams.get("AB").equals("Pump") && !abilityParams.get("AB").equals("PumpAll")) - continue; - if (abilityParams.containsKey("DB") && !abilityParams.get("DB").equals("Pump") && !abilityParams.get("DB").equals("PumpAll")) - continue; - ArrayList list = new ArrayList(); - if (!abilityParams.containsKey("ValidCards")) //no pumpAll - list = AbilityFactory.getDefinedCards(source, abilityParams.get("Defined"), null); - if (abilityParams.containsKey("Defined") && abilityParams.get("Defined").equals("TriggeredAttacker")) - list.add(attacker); - if (abilityParams.containsKey("ValidCards")) - if (attacker.isValidCard(abilityParams.get("ValidCards").split(","), source.getController(), source) - || attacker.isValidCard(abilityParams.get("ValidCards").replace("attacking+", "").split(",") - , source.getController(), source)) - list.add(attacker); - if (list.isEmpty()) continue; - if (!list.contains(attacker)) continue; - if (!abilityParams.containsKey("NumAtt")) continue; - - String att = abilityParams.get("NumAtt"); - if (att.startsWith("+")) - att = att.substring(1); - try { - power += Integer.parseInt(att); - } catch (NumberFormatException nfe) { - //can't parse the number (X for example) - power += 0; - } - } - return power; - } - - //Predict the Toughness bonus of the blocker if blocking the attacker (Flanking, Bushido and other triggered abilities) - /** - *

predictToughnessBonusOfAttacker.

- * - * @param attacker a {@link forge.Card} object. - * @param defender a {@link forge.Card} object. - * @param combat a {@link forge.Combat} object. - * @return a int. - */ - public static int predictToughnessBonusOfAttacker(Card attacker, Card defender, Combat combat) { - int toughness = 0; - - toughness += attacker.getKeywordMagnitude("Bushido"); - - ArrayList registeredTriggers = AllZone.getTriggerHandler().getRegisteredTriggers(); - for (Trigger trigger : registeredTriggers) { - HashMap trigParams = trigger.getMapParams(); - Card source = trigger.getHostCard(); - - if (!combatTriggerWillTrigger(attacker, defender, trigger, null) || !trigParams.containsKey("Execute")) - continue; - String ability = source.getSVar(trigParams.get("Execute")); - AbilityFactory AF = new AbilityFactory(); - HashMap abilityParams = AF.getMapParams(ability, source); - if (abilityParams.containsKey("ValidTgts") || abilityParams.containsKey("Tgt")) - continue; //targeted pumping not supported - if (abilityParams.containsKey("AB") && !abilityParams.get("AB").equals("Pump") && !abilityParams.get("AB").equals("PumpAll")) - continue; - if (abilityParams.containsKey("DB") && !abilityParams.get("DB").equals("Pump") && !abilityParams.get("DB").equals("PumpAll")) - continue; - ArrayList list = new ArrayList(); - if (!abilityParams.containsKey("ValidCards")) //no pumpAll - list = AbilityFactory.getDefinedCards(source, abilityParams.get("Defined"), null); - if (abilityParams.containsKey("Defined") && abilityParams.get("Defined").equals("TriggeredAttacker")) - list.add(attacker); - if (abilityParams.containsKey("ValidCards")) - if (attacker.isValidCard(abilityParams.get("ValidCards").split(","), source.getController(), source) - || attacker.isValidCard(abilityParams.get("ValidCards").replace("attacking+", "").split(",") - , source.getController(), source)) - list.add(attacker); - if (list.isEmpty()) continue; - if (!list.contains(attacker)) continue; - if (!abilityParams.containsKey("NumDef")) continue; - - String def = abilityParams.get("NumDef"); - if (def.startsWith("+")) - def = def.substring(1); - try { - toughness += Integer.parseInt(def); - } catch (NumberFormatException nfe) { - //can't parse the number (X for example) - toughness += 0; - } - } - return toughness; - } - - //can the blocker destroy the attacker? - /** - *

canDestroyAttacker.

- * - * @param attacker a {@link forge.Card} object. - * @param defender a {@link forge.Card} object. - * @param combat a {@link forge.Combat} object. - * @param withoutAbilities a boolean. - * @return a boolean. - */ - public static boolean canDestroyAttacker(Card attacker, Card defender, Combat combat, boolean withoutAbilities) { - - if (attacker.getName().equals("Sylvan Basilisk") && !defender.hasKeyword("Indestructible")) return false; - - int flankingMagnitude = 0; - if (attacker.hasKeyword("Flanking") && !defender.hasKeyword("Flanking")) { - - flankingMagnitude = attacker.getAmountOfKeyword("Flanking"); - - if (flankingMagnitude >= defender.getNetDefense()) return false; - if (flankingMagnitude >= defender.getNetDefense() - defender.getDamage() && !defender.hasKeyword("Indestructible")) - return false; - }//flanking - - if ((attacker.hasKeyword("Indestructible") || (ComputerUtil.canRegenerate(attacker) && !withoutAbilities)) && - !(defender.hasKeyword("Wither") || defender.hasKeyword("Infect"))) return false; - - int defenderDamage = defender.getNetAttack() + predictPowerBonusOfBlocker(attacker, defender); - int attackerDamage = attacker.getNetAttack() + predictPowerBonusOfAttacker(attacker, defender, combat); - if (AllZoneUtil.isCardInPlay("Doran, the Siege Tower")) { - defenderDamage = defender.getNetDefense() + predictToughnessBonusOfBlocker(attacker, defender); - attackerDamage = attacker.getNetDefense() + predictToughnessBonusOfAttacker(attacker, defender, combat); - } - - int possibleDefenderPrevention = 0; - int possibleAttackerPrevention = 0; - if (!withoutAbilities) { - possibleDefenderPrevention = ComputerUtil.possibleDamagePrevention(defender); - possibleAttackerPrevention = ComputerUtil.possibleDamagePrevention(attacker); - } - - // consider Damage Prevention/Replacement - defenderDamage = attacker.predictDamage(defenderDamage, possibleAttackerPrevention, defender, true); - attackerDamage = defender.predictDamage(attackerDamage, possibleDefenderPrevention, attacker, true); - - int defenderLife = defender.getKillDamage() + predictToughnessBonusOfBlocker(attacker, defender); - int attackerLife = attacker.getKillDamage() + predictToughnessBonusOfAttacker(attacker, defender, combat); - - if (defender.hasKeyword("Double Strike")) { - if (defender.hasKeyword("Deathtouch") && defenderDamage > 0) return true; - if (defenderDamage >= attackerLife) return true; - - //Attacker may kill the blocker before he can deal normal (secondary) damage - if ((attacker.hasKeyword("Double Strike") || attacker.hasKeyword("First Strike")) - && !defender.hasKeyword("Indestructible")) { - if (attackerDamage >= defenderLife) return false; - if (attackerDamage > 0 && attacker.hasKeyword("Deathtouch")) return false; - } - if (attackerLife <= 2 * defenderDamage) return true; - }//defender double strike - - else //no double strike for defender - { - //Attacker may kill the blocker before he can deal any damage - if (attacker.hasKeyword("Double Strike") || attacker.hasKeyword("First Strike") - && !defender.hasKeyword("Indestructible") && !defender.hasKeyword("First Strike")) { - - if (attackerDamage >= defenderLife) return false; - if (attackerDamage > 0 && attacker.hasKeyword("Deathtouch")) return false; - } - - if (defender.hasKeyword("Deathtouch") && defenderDamage > 0) return true; - - return defenderDamage >= attackerLife; - - }//defender no double strike - return false; //should never arrive here - } //canDestroyAttacker - - - //For AI safety measures like Regeneration - /** - *

blockerWouldBeDestroyed.

- * - * @param blocker a {@link forge.Card} object. - * @return a boolean. - */ - public static boolean blockerWouldBeDestroyed(Card blocker) { - Card attacker = AllZone.getCombat().getAttackerBlockedBy(blocker); - - if (canDestroyBlocker(blocker, attacker, AllZone.getCombat(), true) && - !(attacker.hasKeyword("Wither") || attacker.hasKeyword("Infect"))) - return true; - return false; - } - - //can the attacker destroy this blocker? - /** - *

canDestroyBlocker.

- * - * @param defender a {@link forge.Card} object. - * @param attacker a {@link forge.Card} object. - * @param combat a {@link forge.Combat} object. - * @param withoutAbilities a boolean. - * @return a boolean. - */ - public static boolean canDestroyBlocker(Card defender, Card attacker, Combat combat, boolean withoutAbilities) { - - int flankingMagnitude = 0; - if (attacker.hasKeyword("Flanking") && !defender.hasKeyword("Flanking")) { - - flankingMagnitude = attacker.getAmountOfKeyword("Flanking"); - - if (flankingMagnitude >= defender.getNetDefense()) return true; - if ((flankingMagnitude >= defender.getKillDamage()) && !defender.hasKeyword("Indestructible")) return true; - }//flanking - - if ((defender.hasKeyword("Indestructible") || (ComputerUtil.canRegenerate(defender) && !withoutAbilities)) && - !(attacker.hasKeyword("Wither") || attacker.hasKeyword("Infect"))) return false; - - if (attacker.getName().equals("Sylvan Basilisk") && !defender.hasKeyword("Indestructible")) return true; - - int defenderDamage = defender.getNetAttack() + predictPowerBonusOfBlocker(attacker, defender); - int attackerDamage = attacker.getNetAttack() + predictPowerBonusOfAttacker(attacker, defender, combat); - if (AllZoneUtil.isCardInPlay("Doran, the Siege Tower")) { - defenderDamage = defender.getNetDefense() + predictToughnessBonusOfBlocker(attacker, defender); - attackerDamage = attacker.getNetDefense() + predictToughnessBonusOfAttacker(attacker, defender, combat); - } - - int possibleDefenderPrevention = 0; - int possibleAttackerPrevention = 0; - if (!withoutAbilities) { - possibleDefenderPrevention = ComputerUtil.possibleDamagePrevention(defender); - possibleAttackerPrevention = ComputerUtil.possibleDamagePrevention(attacker); - } - - // consider Damage Prevention/Replacement - defenderDamage = attacker.predictDamage(defenderDamage, possibleAttackerPrevention, defender, true); - attackerDamage = defender.predictDamage(attackerDamage, possibleDefenderPrevention, attacker, true); - - int defenderLife = defender.getKillDamage() + predictToughnessBonusOfBlocker(attacker, defender); - int attackerLife = attacker.getKillDamage() + predictToughnessBonusOfAttacker(attacker, defender, combat); - - if (attacker.hasKeyword("Double Strike")) { - if (attacker.hasKeyword("Deathtouch") && attackerDamage > 0) return true; - if (attackerDamage >= defenderLife) return true; - - //Attacker may kill the blocker before he can deal normal (secondary) damage - if ((defender.hasKeyword("Double Strike") || defender.hasKeyword("First Strike")) - && !attacker.hasKeyword("Indestructible")) { - if (defenderDamage >= attackerLife) return false; - if (defenderDamage > 0 && defender.hasKeyword("Deathtouch")) return false; - } - if (defenderLife <= 2 * attackerDamage) return true; - }//attacker double strike - - else //no double strike for attacker - { - //Defender may kill the attacker before he can deal any damage - if (defender.hasKeyword("Double Strike") || defender.hasKeyword("First Strike") - && !attacker.hasKeyword("Indestructible") && !attacker.hasKeyword("First Strike")) { - - if (defenderDamage >= attackerLife) return false; - if (defenderDamage > 0 && defender.hasKeyword("Deathtouch")) return false; - } - - if (attacker.hasKeyword("Deathtouch") && attackerDamage > 0) return true; - - return attackerDamage >= defenderLife; - - }//attacker no double strike - return false; //should never arrive here - }//canDestroyBlocker - - /** - *

removeAllDamage.

- */ - public static void removeAllDamage() { - CardList cl = AllZoneUtil.getCardsInPlay(); - for (Card c : cl) { - c.setDamage(0); - } - } - - /** - *

showCombat.

- */ - public static void showCombat() { - AllZone.getDisplay().showCombat(""); - - Card defend[] = null; - StringBuilder display = new StringBuilder(); - - // Loop through Defenders - // Append Defending Player/Planeswalker - ArrayList defenders = AllZone.getCombat().getDefenders(); - CardList attackers[] = AllZone.getCombat().sortAttackerByDefender(); - - // Not a big fan of the triple nested loop here - for (int def = 0; def < defenders.size(); def++) { - if (attackers[def] == null || attackers[def].size() == 0) - continue; - - if (def > 0) - display.append("\n"); - - display.append("Defender - "); - display.append(defenders.get(def).toString()); - display.append("\n"); - - CardList list = attackers[def]; - - for (Card c : list) { - //loop through attackers - display.append("-> "); - display.append(combatantToString(c)).append("\n"); - - defend = AllZone.getCombat().getBlockers(c).toArray(); - - //loop through blockers - for (int inner = 0; inner < defend.length; inner++) { - display.append(" [ "); - display.append(combatantToString(defend[inner])).append("\n"); - } - }//loop through attackers - } - AllZone.getDisplay().showCombat(display.toString().trim()); - - }//showBlockers() - - /** - *

combatantToString.

- * - * @param c a {@link forge.Card} object. - * @return a {@link java.lang.String} object. - */ - private static String combatantToString(Card c) { - StringBuilder sb = new StringBuilder(); - - String name = (c.isFaceDown()) ? "Morph" : c.getName(); - - sb.append(name); - sb.append(" (").append(c.getUniqueNumber()).append(") "); - sb.append(c.getNetAttack()).append("/").append(c.getNetDefense()); - - return sb.toString(); - } - - /** - *

isDoranInPlay.

- * - * @return a boolean. - */ - public static boolean isDoranInPlay() { - return AllZoneUtil.isCardInPlay("Doran, the Siege Tower"); - } - - /** - *

checkPropagandaEffects.

- * - * @param c a {@link forge.Card} object. - * @param bLast a boolean. - */ - public static void checkPropagandaEffects(Card c, final boolean bLast) { - String cost = CardFactoryUtil.getPropagandaCost(c); - if (cost.equals("0")) { - if (!c.hasKeyword("Vigilance")) - c.tap(); - - if (bLast) - PhaseUtil.handleAttackingTriggers(); - return; - } - - final Card crd = c; - - String phase = AllZone.getPhase().getPhase(); - - if (phase.equals(Constant.Phase.Combat_Declare_Attackers) || phase.equals(Constant.Phase.Combat_Declare_Attackers_InstantAbility)) { - if (!cost.equals("0")) { - final Ability ability = new Ability(c, cost) { - @Override - public void resolve() { - - } - }; - - final Command unpaidCommand = new Command() { - - private static final long serialVersionUID = -6483405139208343935L; - - public void execute() { - AllZone.getCombat().removeFromCombat(crd); - - if (bLast) - PhaseUtil.handleAttackingTriggers(); - } - }; - - final Command paidCommand = new Command() { - private static final long serialVersionUID = -8303368287601871955L; - - public void execute() { - // if Propaganda is paid, tap this card - if (!crd.hasKeyword("Vigilance")) - crd.tap(); - - if (bLast) - PhaseUtil.handleAttackingTriggers(); - } - }; - - if (c.getController().isHuman()) { - AllZone.getInputControl().setInput(new Input_PayManaCost_Ability(c + " - Pay to Attack\r\n", - ability.getManaCost(), paidCommand, unpaidCommand)); - } else { //computer - if (ComputerUtil.canPayCost(ability)) { - ComputerUtil.playNoStack(ability); - if (!crd.hasKeyword("Vigilance")) - crd.tap(); - } else { - // TODO: remove the below line after Propaganda occurs during Declare_Attackers - AllZone.getCombat().removeFromCombat(crd); - } - } - } - } - } - - /** - *

checkDeclareAttackers.

- * - * @param c a {@link forge.Card} object. - */ - public static void checkDeclareAttackers(Card c) //this method checks triggered effects of attacking creatures, right before defending player declares blockers - { - //Run triggers - HashMap runParams = new HashMap(); - runParams.put("Attacker", c); - CardList otherAttackers = new CardList(AllZone.getCombat().getAttackers()); - otherAttackers.remove(c); - runParams.put("OtherAttackers", otherAttackers); - AllZone.getTriggerHandler().runTrigger("Attacks", runParams); - - //Annihilator: - if (!c.getCreatureAttackedThisCombat()) { - ArrayList kws = c.getKeyword(); - Pattern p = Pattern.compile("Annihilator [0-9]+"); - Matcher m; - for (String key : kws) { - m = p.matcher(key); - if (m.find()) { - String k[] = key.split(" "); - final int a = Integer.valueOf(k[1]); - final Card crd = c; - - final Ability ability = new Ability(c, "0") { - public void resolve() { - if (crd.getController().isHuman()) { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - ComputerUtil.sacrificePermanents(a, list); - } else { - AllZone.getInputControl().setInput(PlayerUtil.input_sacrificePermanents(a)); - } - - } - }; - StringBuilder sb = new StringBuilder(); - sb.append("Annihilator - Defending player sacrifices ").append(a).append(" permanents."); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().add(ability); - } //find - } //for - }//creatureAttacked - //Annihilator - - //Mijae Djinn - if (c.getName().equals("Mijae Djinn")) { - if (!GameActionUtil.flipACoin(c.getController(), c)) { - AllZone.getCombat().removeFromCombat(c); - c.tap(); - } - }//Mijae Djinn - - if (c.getName().equals("Zur the Enchanter") && !c.getCreatureAttackedThisCombat()) { - //hack, to make sure this doesn't break grabbing an oblivion ring: - c.setCreatureAttackedThisCombat(true); - - CardList enchantments = AllZoneUtil.getPlayerCardsInLibrary(c.getController()); - enchantments = enchantments.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (c.isEnchantment() && c.getCMC() <= 3) return true; - else return false; - } - }); - - if (enchantments.size() > 0) { - if (c.getController().isHuman()) { - Object o = GuiUtils.getChoiceOptional("Pick an enchantment to put onto the battlefield", - enchantments.toArray()); - if (o != null) { - Card crd = (Card) o; - AllZone.getGameAction().moveToPlay(crd); - - if (crd.isAura()) { - Object obj = null; - if (crd.hasKeyword("Enchant creature")) { - CardList creats = AllZoneUtil.getCreaturesInPlay(); - obj = GuiUtils.getChoiceOptional("Pick a creature to attach " - + crd.getName() + " to", creats.toArray()); - } else if (crd.hasKeyword("Enchant land") - || crd.hasKeyword("Enchant land you control")) { - CardList lands = AllZoneUtil.getLandsInPlay(); - if (lands.size() > 0) obj = GuiUtils.getChoiceOptional( - "Pick a land to attach " + crd.getName() + " to", lands.toArray()); - } - if (obj != null) { - Card target = (Card) obj; - if (AllZoneUtil.isCardInPlay(target)) { - crd.enchantCard(target); - } - } - } - c.getController().shuffle(); - //we have to have cards like glorious anthem take effect immediately: - for (String effect : AllZone.getStaticEffects().getStateBasedMap().keySet()) { - Command com = GameActionUtil.commands.get(effect); - com.execute(); - } - - } - } else if (c.getController().isComputer()) { - enchantments = enchantments.filter(new CardListFilter() { - public boolean addCard(Card c) { - return !c.isAura(); - } - }); - if (enchantments.size() > 0) { - Card card = CardFactoryUtil.AI_getBestEnchantment(enchantments, c, false); - AllZone.getGameAction().moveToPlay(card); - c.getController().shuffle(); - } - } - } //enchantments.size > 0 - }//Zur the enchanter - - else if (c.getName().equals("Spectral Bears")) { - Player opp = c.getController().getOpponent(); - CardList list = AllZoneUtil.getPlayerCardsInPlay(opp); - list = list.filter(new CardListFilter() { - public boolean addCard(Card crd) { - return crd.isBlack() && !crd.isToken(); - } - }); - if (list.size() == 0) { - c.addExtrinsicKeyword("This card doesn't untap during your next untap step."); - } - } else if (c.getName().equals("Spectral Force")) { - Player opp = c.getController().getOpponent(); - CardList list = AllZoneUtil.getPlayerCardsInPlay(opp); - list = list.filter(AllZoneUtil.black); - if (list.size() == 0) { - c.addExtrinsicKeyword("This card doesn't untap during your next untap step."); - } - } else if (c.getName().equals("Witch-Maw Nephilim") && !c.getCreatureAttackedThisCombat() - && c.getNetAttack() >= 10) { - final Card charger = c; - Ability ability2 = new Ability(c, "0") { - @Override - public void resolve() { - - final Command untilEOT = new Command() { - private static final long serialVersionUID = -1703473800920781454L; - - public void execute() { - if (AllZoneUtil.isCardInPlay(charger)) { - charger.removeIntrinsicKeyword("Trample"); - } - } - };//Command - - if (AllZoneUtil.isCardInPlay(charger)) { - charger.addIntrinsicKeyword("Trample"); - - AllZone.getEndOfTurn().addUntil(untilEOT); - } - }//resolve - };//ability - - StringBuilder sb2 = new StringBuilder(); - sb2.append(c.getName()).append(" - gains trample until end of turn if its power is 10 or greater."); - ability2.setStackDescription(sb2.toString()); - - AllZone.getStack().add(ability2); - - }//Witch-Maw Nephilim - - else if (c.getName().equals("Preeminent Captain") && !c.getCreatureAttackedThisCombat()) { - System.out.println("Preeminent Captain Attacks"); - - CardList soldiers = AllZoneUtil.getPlayerHand(c.getController()); - soldiers = soldiers.getType("Soldier"); - - if (soldiers.size() > 0) { - if (c.getController().isHuman()) { - Object o = GuiUtils.getChoiceOptional("Pick a soldier to put onto the battlefield", - soldiers.toArray()); - if (o != null) { - Card card = (Card) o; - AllZone.getGameAction().moveToPlay(card); - - card.tap(); - AllZone.getCombat().addAttacker(card); - - card.setCreatureAttackedThisCombat(true); - } - } else if (c.getController().isComputer()) { - Card card = CardFactoryUtil.AI_getBestCreature(soldiers); - if (card != null) { - AllZone.getGameAction().moveToPlay(card); - - card.tap(); - AllZone.getCombat().addAttacker(card); - card.setCreatureAttackedThisCombat(true); - } - } - - } //if (creatures.size() > 0) - }//Preeminent Captain - - else if (c.getName().equals("Sapling of Colfenor") - && !c.getCreatureAttackedThisCombat()) { - Player player = c.getController(); - - PlayerZone lib = AllZone.getZone(Constant.Zone.Library, player); - - if (lib.size() > 0) { - CardList cl = new CardList(); - cl.add(lib.get(0)); - GuiUtils.getChoiceOptional("Top card", cl.toArray()); - Card top = lib.get(0); - if (top.isCreature()) { - player.gainLife(top.getBaseDefense(), c); - player.loseLife(top.getBaseAttack(), c); - - AllZone.getGameAction().moveToHand(top); - } - } - }//Sapling of Colfenor - - c.setCreatureAttackedThisCombat(true); - }//checkDeclareAttackers - - /** - *

checkUnblockedAttackers.

- * - * @param c a {@link forge.Card} object. - */ - public static void checkUnblockedAttackers(Card c) { - - //Run triggers - HashMap runParams = new HashMap(); - runParams.put("Card", c); - AllZone.getTriggerHandler().runTrigger("AttackerUnblocked", runParams); - } - - /** - *

checkDeclareBlockers.

- * - * @param cl a {@link forge.CardList} object. - */ - public static void checkDeclareBlockers(CardList cl) { - for (Card c : cl) { - if (!c.getCreatureBlockedThisCombat()) { - for (Ability ab : CardFactoryUtil.getBushidoEffects(c)) { - AllZone.getStack().add(ab); - } - } - - c.setCreatureBlockedThisCombat(true); - }//for - - }//checkDeclareBlockers - - /** - *

checkBlockedAttackers.

- * - * @param a a {@link forge.Card} object. - * @param b a {@link forge.Card} object. - */ - public static void checkBlockedAttackers(final Card a, Card b) { - //System.out.println(a.getName() + " got blocked by " + b.getName()); - - //Run triggers - HashMap runParams = new HashMap(); - runParams.put("Attacker", a); - runParams.put("Blocker", b); - AllZone.getTriggerHandler().runTrigger("Blocks", runParams); - - if (!a.getCreatureGotBlockedThisCombat()) { - final int blockers = AllZone.getCombat().getBlockers(a).size(); - runParams.put("NumBlockers", blockers); - AllZone.getTriggerHandler().runTrigger("AttackerBlocked", runParams); - - //Bushido - for (Ability ab : CardFactoryUtil.getBushidoEffects(a)) - AllZone.getStack().add(ab); - - //Rampage - ArrayList keywords = a.getKeyword(); - Pattern p = Pattern.compile("Rampage [0-9]+"); - Matcher m; - for (String keyword : keywords) { - m = p.matcher(keyword); - if (m.find()) { - String k[] = keyword.split(" "); - final int magnitude = Integer.valueOf(k[1]); - final int numBlockers = AllZone.getCombat().getBlockers(a).size(); - if (numBlockers > 1) { - executeRampageAbility(a, magnitude, numBlockers); - } - } //find - }//end Rampage - } - - if (a.hasKeyword("Flanking") && !b.hasKeyword("Flanking")) { - int flankingMagnitude = 0; - String kw = ""; - ArrayList list = a.getKeyword(); - - for (int i = 0; i < list.size(); i++) { - kw = list.get(i); - if (kw.equals("Flanking")) flankingMagnitude++; - } - final int mag = flankingMagnitude; - final Card blocker = b; - Ability ability2 = new Ability(b, "0") { - @Override - public void resolve() { - - final Command untilEOT = new Command() { - - private static final long serialVersionUID = 7662543891117427727L; - - public void execute() { - if (AllZoneUtil.isCardInPlay(blocker)) { - blocker.addTempAttackBoost(mag); - blocker.addTempDefenseBoost(mag); - } - } - };//Command - - - if (AllZoneUtil.isCardInPlay(blocker)) { - blocker.addTempAttackBoost(-mag); - blocker.addTempDefenseBoost(-mag); - - AllZone.getEndOfTurn().addUntil(untilEOT); - System.out.println("Flanking!"); - } - }//resolve - - };//ability - - StringBuilder sb2 = new StringBuilder(); - sb2.append(b.getName()).append(" - gets -").append(mag).append("/-").append(mag).append(" until EOT."); - ability2.setStackDescription(sb2.toString()); - - AllZone.getStack().add(ability2); - Log.debug("Adding Flanking!"); - - }//flanking - - - if (a.getName().equals("Robber Fly") && !a.getCreatureGotBlockedThisCombat()) { - Player opp = b.getController(); - CardList list = AllZoneUtil.getPlayerHand(opp); - int handSize = list.size(); - - // opponent discards their hand, - opp.discardRandom(handSize, a.getSpellAbility()[0]); - opp.drawCards(handSize); - } - - a.setCreatureGotBlockedThisCombat(true); - - } - - /** - *

executeExaltedAbility.

- * - * @param c a {@link forge.Card} object. - * @param magnitude a int. - */ - public static void executeExaltedAbility(Card c, int magnitude) { - final Card crd = c; - Ability ability; - - for (int i = 0; i < magnitude; i++) { - ability = new Ability(c, "0") { - @Override - public void resolve() { - final Command untilEOT = new Command() { - private static final long serialVersionUID = 1497565871061029469L; - - public void execute() { - if (AllZoneUtil.isCardInPlay(crd)) { - crd.addTempAttackBoost(-1); - crd.addTempDefenseBoost(-1); - } - } - };//Command - - if (AllZoneUtil.isCardInPlay(crd)) { - crd.addTempAttackBoost(1); - crd.addTempDefenseBoost(1); - - AllZone.getEndOfTurn().addUntil(untilEOT); - } - }//resolve - - };//ability - - StringBuilder sb = new StringBuilder(); - sb.append(c).append(" - (Exalted) gets +1/+1 until EOT."); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability); - } - - Player phasingPlayer = c.getController(); - // Finest Hour untaps the creature on the first combat phase - if ((AllZoneUtil.getPlayerCardsInPlay(phasingPlayer, "Finest Hour").size() > 0) && - AllZone.getPhase().isFirstCombat()) { - // Untap the attacking creature - Ability fhUntap = new Ability(c, "0") { - public void resolve() { - crd.untap(); - } - }; - - StringBuilder sbUntap = new StringBuilder(); - sbUntap.append(c).append(" - (Exalted) untap."); - fhUntap.setStackDescription(sbUntap.toString()); - - AllZone.getStack().addSimultaneousStackEntry(fhUntap); - - // If any Finest Hours, queue up a new combat phase - for (int ix = 0; ix < AllZoneUtil.getPlayerCardsInPlay(phasingPlayer, "Finest Hour").size(); ix++) { - Ability fhAddCombat = new Ability(c, "0") { - public void resolve() { - AllZone.getPhase().addExtraCombat(); - } - }; - - StringBuilder sbACom = new StringBuilder(); - sbACom.append(c).append(" - (Exalted) ").append(phasingPlayer).append(" gets Extra Combat Phase."); - fhAddCombat.setStackDescription(sbACom.toString()); - - AllZone.getStack().addSimultaneousStackEntry(fhAddCombat); - } - } - - if (AllZoneUtil.getPlayerCardsInPlay(phasingPlayer, "Sovereigns of Lost Alara").size() > 0) { - for (int i = 0; i < AllZoneUtil.getPlayerCardsInPlay(phasingPlayer, "Sovereigns of Lost Alara").size(); i++) { - final Card attacker = c; - Ability ability4 = new Ability(c, "0") { - @Override - public void resolve() { - CardList enchantments = AllZoneUtil.getPlayerCardsInLibrary(attacker.getController()); - enchantments = enchantments.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (attacker.hasKeyword("Protection from enchantments") - || (attacker.hasKeyword("Protection from everything"))) return false; - return (c.isEnchantment() - && c.hasKeyword("Enchant creature") - && !CardFactoryUtil.hasProtectionFrom(c, attacker)); - } - }); - Player player = attacker.getController(); - Card Enchantment = null; - if (player.isHuman()) { - Card[] Target = new Card[enchantments.size()]; - for (int j = 0; j < enchantments.size(); j++) { - Card crd = enchantments.get(j); - Target[j] = crd; - } - Object check = GuiUtils.getChoiceOptional("Select enchantment to enchant exalted creature", Target); - if (check != null) { - Enchantment = ((Card) check); - } - } else { - Enchantment = CardFactoryUtil.AI_getBestEnchantment(enchantments, attacker, false); - } - if (Enchantment != null && AllZoneUtil.isCardInPlay(attacker)) { - AllZone.getGameAction().moveToPlay(Enchantment); - Enchantment.enchantCard(attacker); - } - attacker.getController().shuffle(); - }//resolve - };// ability4 - - StringBuilder sb4 = new StringBuilder(); - sb4.append(c).append(" - (Exalted) searches library for an Aura card that could enchant that creature, "); - sb4.append("put it onto the battlefield attached to that creature, then shuffles library."); - ability4.setStackDescription(sb4.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability4); - } // For - } - } - - /** - * executes Rampage abilities for a given card - * - * @param c the card to add rampage bonus to - * @param magnitude the magnitude of rampage (ie Rampage 2 means magnitude should be 2) - * @param numBlockers - the number of creatures blocking this rampaging creature - */ - private static void executeRampageAbility(Card c, int magnitude, int numBlockers) { - final Card crd = c; - final int pump = magnitude; - Ability ability; - - //numBlockers -1 since it is for every creature beyond the first - for (int i = 0; i < numBlockers - 1; i++) { - ability = new Ability(c, "0") { - @Override - public void resolve() { - final Command untilEOT = new Command() { - private static final long serialVersionUID = -3215615538474963181L; - - public void execute() { - if (AllZoneUtil.isCardInPlay(crd)) { - crd.addTempAttackBoost(-pump); - crd.addTempDefenseBoost(-pump); - } - } - };//Command - - if (AllZoneUtil.isCardInPlay(crd)) { - crd.addTempAttackBoost(pump); - crd.addTempDefenseBoost(pump); - - AllZone.getEndOfTurn().addUntil(untilEOT); - } - }//resolve - - };//ability - - StringBuilder sb = new StringBuilder(); - sb.append(c).append(" - (Rampage) gets +").append(pump).append("/+").append(pump).append(" until EOT."); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().add(ability); - } - } - -}//end class CombatUtil diff --git a/src/forge/Command.java b/src/forge/Command.java deleted file mode 100644 index a08dd902f04..00000000000 --- a/src/forge/Command.java +++ /dev/null @@ -1,23 +0,0 @@ -package forge; - -/** - *

Command interface.

- * - * @author Forge - * @version $Id: $ - */ -public interface Command extends java.io.Serializable { - /** Constant Blank */ - public static Command Blank = new Command() { - - private static final long serialVersionUID = 2689172297036001710L; - - public void execute() { - } - }; - - /** - *

execute.

- */ - public void execute(); -} diff --git a/src/forge/CommandArgs.java b/src/forge/CommandArgs.java deleted file mode 100644 index 3e2d3aa927f..00000000000 --- a/src/forge/CommandArgs.java +++ /dev/null @@ -1,16 +0,0 @@ -package forge; - -/** - *

CommandArgs interface.

- * - * @author Forge - * @version $Id: $ - */ -public interface CommandArgs extends java.io.Serializable { - /** - *

execute.

- * - * @param o a {@link java.lang.Object} object. - */ - public void execute(Object o); -} diff --git a/src/forge/CommandList.java b/src/forge/CommandList.java deleted file mode 100644 index 031a0f23db1..00000000000 --- a/src/forge/CommandList.java +++ /dev/null @@ -1,92 +0,0 @@ -package forge; - -import java.util.ArrayList; -import java.util.Iterator; - -/** - *

CommandList class.

- * - * @author Forge - * @version $Id: $ - */ -public class CommandList implements java.io.Serializable, Command, Iterable { - /** Constant serialVersionUID=-1532687201812613302L */ - private static final long serialVersionUID = -1532687201812613302L; - - private ArrayList a = new ArrayList(); - - public CommandList() { - ; - } - - public CommandList(Command c) { - a.add(c); - } - - /** - *

iterator.

- * - * @return a {@link java.util.Iterator} object. - */ - public Iterator iterator() { - return a.iterator(); - } - - //bug fix, when token is pumped up like with Giant Growth - //and Sorceress Queen targets token, the effects need to be done - //in this order, weird I know, DO NOT CHANGE THIS - /** - *

add.

- * - * @param c a {@link forge.Command} object. - */ - public void add(Command c) { - a.add(0, c); - } - - - /** - *

get.

- * - * @param i a int. - * @return a {@link forge.Command} object. - */ - public Command get(int i) { - return (Command) a.get(i); - } - - /** - *

remove.

- * - * @param i a int. - * @return a {@link forge.Command} object. - */ - public Command remove(int i) { - return (Command) a.remove(i); - } - - /** - *

size.

- * - * @return a int. - */ - public int size() { - return a.size(); - } - - /** - *

clear.

- */ - public void clear() { - a.clear(); - } - - /** - *

execute.

- */ - public void execute() { - for (int i = 0; i < size(); i++) - get(i).execute(); - } - -} diff --git a/src/forge/CommandReturn.java b/src/forge/CommandReturn.java deleted file mode 100644 index 6641ea327d8..00000000000 --- a/src/forge/CommandReturn.java +++ /dev/null @@ -1,16 +0,0 @@ -package forge; - -/** - *

CommandReturn interface.

- * - * @author Forge - * @version $Id: $ - */ -public interface CommandReturn { - /** - *

execute.

- * - * @return a {@link java.lang.Object} object. - */ - public Object execute(); -} diff --git a/src/forge/Computer.java b/src/forge/Computer.java deleted file mode 100644 index 8f7790ee1f2..00000000000 --- a/src/forge/Computer.java +++ /dev/null @@ -1,60 +0,0 @@ -package forge; - -/** - *

Computer interface.

- * - * @author Forge - * @version $Id: $ - */ -public interface Computer { - /** - *

main1.

- */ - public void main1(); - - /** - *

begin_combat.

- */ - public void begin_combat(); - - /** - *

declare_attackers.

- */ - public void declare_attackers(); - - /** - *

declare_attackers_after.

- */ - public void declare_attackers_after(); //can play Instants and Abilities - - /** - *

declare_blockers.

- */ - public void declare_blockers();//this is called after when the Human or Computer blocks - - /** - *

declare_blockers_after.

- */ - public void declare_blockers_after();//can play Instants and Abilities - - /** - *

end_of_combat.

- */ - public void end_of_combat(); - - /** - *

main2.

- */ - public void main2(); - - /** - *

end_of_turn.

- */ - public void end_of_turn();//end of Human's turn - - /** - *

stack_not_empty.

- */ - public void stack_not_empty(); - -} diff --git a/src/forge/ComputerAI_General.java b/src/forge/ComputerAI_General.java deleted file mode 100644 index db55a389401..00000000000 --- a/src/forge/ComputerAI_General.java +++ /dev/null @@ -1,444 +0,0 @@ -package forge; - -import com.esotericsoftware.minlog.Log; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.Spell_Permanent; - -import java.util.ArrayList; - -import static forge.error.ErrorViewer.showError; - - -/** - *

ComputerAI_General class.

- * - * @author Forge - * @version $Id: $ - */ -public class ComputerAI_General implements Computer { - - /** - *

Constructor for ComputerAI_General.

- */ - public ComputerAI_General() { - - } - - /** - *

main1.

- */ - public void main1() { - ComputerUtil.chooseLandsToPlay(); - - if (AllZone.getStack().size() == 0) - playCards(Constant.Phase.Main1); - else - stackResponse(); - }//main1() - - /** - *

main2.

- */ - public void main2() { - ComputerUtil.chooseLandsToPlay(); - - if (AllZone.getStack().size() == 0) - playCards(Constant.Phase.Main2); - else - stackResponse(); - } - - /** - *

playCards.

- * - * @param phase a {@link java.lang.String} object. - */ - private void playCards(final String phase) { - SpellAbility[] sp = phase.equals(Constant.Phase.Main1) ? getMain1() : getMain2(); - - boolean nextPhase = ComputerUtil.playCards(sp); - - if (nextPhase) { - AllZone.getPhase().passPriority(); - } - }//playCards() - - /** - *

getMain1.

- * - * @return an array of {@link forge.card.spellability.SpellAbility} objects. - */ - private SpellAbility[] getMain1() { - //Card list of all cards to consider - CardList hand = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); - - if (AllZone.getComputerManaPool().isEmpty()) - hand = hand.filter(new CardListFilter() { - public boolean addCard(Card c) { - - if (c.getSVar("PlayMain1").equals("TRUE")) - return true; - - if (c.isSorcery() || c.isAura()) //timing should be handled by the AF's - return true; - - if (c.isCreature() - && (c.hasKeyword("Haste")) || c.hasKeyword("Exalted")) return true; - - CardList buffed = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); //get all cards the computer controls with BuffedBy - for (int j = 0; j < buffed.size(); j++) { - Card buffedcard = buffed.get(j); - if (buffedcard.getSVar("BuffedBy").length() > 0) { - String buffedby = buffedcard.getSVar("BuffedBy"); - String bffdby[] = buffedby.split(","); - if (c.isValidCard(bffdby, c.getController(), c)) return true; - } - }//BuffedBy - - CardList antibuffed = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); //get all cards the human controls with AntiBuffedBy - for (int k = 0; k < antibuffed.size(); k++) { - Card buffedcard = antibuffed.get(k); - if (buffedcard.getSVar("AntiBuffedBy").length() > 0) { - String buffedby = buffedcard.getSVar("AntiBuffedBy"); - String bffdby[] = buffedby.split(","); - if (c.isValidCard(bffdby, c.getController(), c)) return true; - } - }//AntiBuffedBy - - if (c.isLand()) return false; - - CardList vengevines = AllZoneUtil.getPlayerGraveyard(AllZone.getComputerPlayer(), "Vengevine"); - if (vengevines.size() > 0) { - CardList creatures = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); - CardList creatures2 = new CardList(); - for (int i = 0; i < creatures.size(); i++) { - if (creatures.get(i).isCreature() - && CardUtil.getConvertedManaCost(creatures.get(i).getManaCost()) <= 3) { - creatures2.add(creatures.get(i)); - } - } - if (creatures2.size() + Phase.getComputerCreatureSpellCount() > 1 - && c.isCreature() - && CardUtil.getConvertedManaCost(c.getManaCost()) <= 3) return true; - } // AI Improvement for Vengevine - // Beached As End - return false; - } - }); - CardList all = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - all.addAll(hand); - - CardList humanPlayable = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - humanPlayable = humanPlayable.filter(new CardListFilter() { - public boolean addCard(Card c) { - return (c.canAnyPlayerActivate()); - } - }); - - all.addAll(humanPlayable); - - return getPlayable(all); - }//getMain1() - - - /** - *

getMain2.

- * - * @return an array of {@link forge.card.spellability.SpellAbility} objects. - */ - private SpellAbility[] getMain2() { - //Card list of all cards to consider - CardList all = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); - //Don't play permanents with Flash before humans declare attackers step - all = all.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (c.isPermanent() - && c.hasKeyword("Flash") - && (AllZone.getPhase().isPlayerTurn(AllZone.getComputerPlayer()) - || AllZone.getPhase().isBefore(Constant.Phase.Combat_Declare_Attackers_InstantAbility))) - return false; - return true; - } - }); - all.addAll(AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer())); - all.addAll(CardFactoryUtil.getExternalZoneActivationCards(AllZone.getComputerPlayer())); - - // Prevent the computer from summoning Ball Lightning type creatures during main phase 2 - all = all.getNotKeyword("At the beginning of the end step, sacrifice CARDNAME."); - - all = all.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (c.isLand()) return false; - return true; - } - }); - - CardList humanPlayable = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - humanPlayable = humanPlayable.filter(new CardListFilter() { - public boolean addCard(Card c) { - return (c.canAnyPlayerActivate()); - } - }); - all.addAll(humanPlayable); - - return getPlayable(all); - }//getMain2() - - /** - *

getAvailableSpellAbilities.

- * - * @return a {@link forge.CardList} object. - */ - private CardList getAvailableSpellAbilities() { - CardList all = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); - //Don't play permanents with Flash before humans declare attackers step - all = all.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (c.isPermanent() - && c.hasKeyword("Flash") - && (AllZone.getPhase().isPlayerTurn(AllZone.getComputerPlayer()) - || AllZone.getPhase().isBefore(Constant.Phase.Combat_Declare_Attackers_InstantAbility))) - return false; - return true; - } - }); - all.addAll(AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer())); - all.addAll(CardFactoryUtil.getExternalZoneActivationCards(AllZone.getComputerPlayer())); - - - CardList humanPlayable = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - humanPlayable = humanPlayable.filter(new CardListFilter() { - public boolean addCard(Card c) { - return (c.canAnyPlayerActivate()); - } - }); - all.addAll(humanPlayable); - return all; - } - - /** - *

getOtherPhases.

- * - * @return an array of {@link forge.card.spellability.SpellAbility} objects. - */ - private SpellAbility[] getOtherPhases() { - return getPlayable(getAvailableSpellAbilities()); - } - - /** - *

getPossibleCounters.

- * - * @return a {@link java.util.ArrayList} object. - */ - private ArrayList getPossibleCounters() { - return getPlayableCounters(getAvailableSpellAbilities()); - } - - /** - *

getPossibleETBCounters.

- * - * @return a {@link java.util.ArrayList} object. - */ - private ArrayList getPossibleETBCounters() { - return getETBCounters(getAvailableSpellAbilities()); - } - - /** - * Returns the spellAbilities from the card list that the computer is able to play - * - * @param l a {@link forge.CardList} object. - * @return an array of {@link forge.card.spellability.SpellAbility} objects. - */ - private SpellAbility[] getPlayable(CardList l) { - ArrayList spellAbility = new ArrayList(); - for (Card c : l) - for (SpellAbility sa : c.getSpellAbility()) - // if SA is from AF_Counter don't add to getPlayable - //This try/catch should fix the "computer is thinking" bug - try { - sa.setActivatingPlayer(AllZone.getComputerPlayer()); - if (ComputerUtil.canBePlayedAndPayedByAI(sa)) { - spellAbility.add(sa); - } - } catch (Exception ex) { - showError(ex, "There is an error in the card code for %s:%n", c.getName(), ex.getMessage()); - } - return spellAbility.toArray(new SpellAbility[spellAbility.size()]); - } - - /** - *

getPlayableCounters.

- * - * @param l a {@link forge.CardList} object. - * @return a {@link java.util.ArrayList} object. - */ - private ArrayList getPlayableCounters(CardList l) { - ArrayList spellAbility = new ArrayList(); - for (Card c : l) { - for (SpellAbility sa : c.getSpellAbility()) { - // Check if this AF is a Counterpsell - if (sa.getAbilityFactory() != null && sa.getAbilityFactory().getAPI().equals("Counter")) - spellAbility.add(sa); - } - } - - return spellAbility; - } - - /** - *

getETBCounters.

- * - * @param l a {@link forge.CardList} object. - * @return a {@link java.util.ArrayList} object. - */ - private ArrayList getETBCounters(CardList l) { - ArrayList spellAbility = new ArrayList(); - for (Card c : l) { - for (SpellAbility sa : c.getSpellAbility()) { - // Or if this Permanent has an ETB ability with Counter - if (sa instanceof Spell_Permanent) { - if (Spell_Permanent.checkETBEffects(c, sa, "Counter")) - spellAbility.add(sa); - } - } - } - - return spellAbility; - } - - /** - *

begin_combat.

- */ - public void begin_combat() { - stackResponse(); - } - - /** - *

declare_attackers.

- */ - public void declare_attackers() { - // 12/2/10(sol) the decision making here has moved to getAttackers() - - AllZone.setCombat(ComputerUtil.getAttackers()); - - Card[] att = AllZone.getCombat().getAttackers(); - if (att.length > 0) - AllZone.getPhase().setCombat(true); - - for (int i = 0; i < att.length; i++) { - // tapping of attackers happens after Propaganda is paid for - //if (!att[i].hasKeyword("Vigilance")) att[i].tap(); - Log.debug("Computer just assigned " + att[i].getName() + " as an attacker."); - } - - AllZone.getComputerBattlefield().updateObservers(); - CombatUtil.showCombat(); - - AllZone.getPhase().setNeedToNextPhase(true); - } - - /** - *

declare_attackers_after.

- */ - public void declare_attackers_after() { - stackResponse(); - } - - /** - *

declare_blockers.

- */ - public void declare_blockers() { - CardList blockers = AllZoneUtil.getCreaturesInPlay(AllZone.getComputerPlayer()); - - AllZone.setCombat(ComputerUtil_Block2.getBlockers(AllZone.getCombat(), blockers)); - - CombatUtil.showCombat(); - - AllZone.getPhase().setNeedToNextPhase(true); - } - - /** - *

declare_blockers_after.

- */ - public void declare_blockers_after() { - stackResponse(); - } - - /** - *

end_of_combat.

- */ - public void end_of_combat() { - stackResponse(); - } - - //end of Human's turn - /** - *

end_of_turn.

- */ - public void end_of_turn() { - stackResponse(); - } - - /** - *

stack_not_empty.

- */ - public void stack_not_empty() { - stackResponse(); - } - - /** - *

stackResponse.

- */ - public void stackResponse() { - // if top of stack is empty - SpellAbility[] sas = null; - if (AllZone.getStack().size() == 0) { - sas = getOtherPhases(); - - boolean pass = (sas.length == 0) || AllZone.getPhase().is(Constant.Phase.Upkeep, AllZone.getComputerPlayer()) || - AllZone.getPhase().is(Constant.Phase.Draw, AllZone.getComputerPlayer()) || - AllZone.getPhase().is(Constant.Phase.End_Of_Turn, AllZone.getComputerPlayer()); - if (!pass) { // Each AF should check the phase individually - pass = ComputerUtil.playCards(sas); - } - - if (pass) - AllZone.getPhase().passPriority(); - return; - } - - // if top of stack is owned by me - if (AllZone.getStack().peekInstance().getActivatingPlayer().isComputer()) { - // probably should let my stuff resolve to force Human to respond to it - AllZone.getPhase().passPriority(); - return; - } - - // top of stack is owned by human, - ArrayList possibleCounters = getPossibleCounters(); - - if (possibleCounters.size() > 0 && ComputerUtil.playCounterSpell(possibleCounters)) { - // Responding CounterSpell is on the Stack trying to Counter the Spell - // If playCounterSpell returns true, a Spell is hitting the Stack - return; - } - - possibleCounters.clear(); - possibleCounters = getPossibleETBCounters(); - if (possibleCounters.size() > 0 && !ComputerUtil.playCards(possibleCounters)) { - // Responding Permanent w/ ETB Counter is on the Stack - // AllZone.getPhase().passPriority(); - return; - } - - sas = getOtherPhases(); - if (sas.length > 0) { - // Spell not Countered - if (!ComputerUtil.playCards(sas)) - return; - } - // if this hasn't been covered above, just PassPriority() - AllZone.getPhase().passPriority(); - } -} diff --git a/src/forge/ComputerAI_Input.java b/src/forge/ComputerAI_Input.java deleted file mode 100644 index e99d55dace3..00000000000 --- a/src/forge/ComputerAI_Input.java +++ /dev/null @@ -1,88 +0,0 @@ -package forge; - -import com.esotericsoftware.minlog.Log; -import forge.gui.input.Input; - - -/** - *

ComputerAI_Input class.

- * - * @author Forge - * @version $Id: $ - */ -public class ComputerAI_Input extends Input { - /** Constant serialVersionUID=-3091338639571662216L */ - private static final long serialVersionUID = -3091338639571662216L; - - private final Computer computer; - - /** - *

Constructor for ComputerAI_Input.

- * - * @param i_computer a {@link forge.Computer} object. - */ - public ComputerAI_Input(Computer i_computer) { - computer = i_computer; - } - - //wrapper method that ComputerAI_StackNotEmpty class calls - //ad-hoc way for ComptuerAI_StackNotEmpty to get to the Computer class - /** - *

stackNotEmpty.

- */ - public void stackNotEmpty() { - computer.stack_not_empty(); - } - - /** {@inheritDoc} */ - @Override - public void showMessage() { - /* - * //put this back in - ButtonUtil.disableAll(); - AllZone.getDisplay().showMessage("Phase: " - + AllZone.getPhase().getPhase() - + "\nAn error may have occurred. Please send the \"Stack Report\" and the \"Detailed Error Trace\" to the Forge forum."); - */ - think(); - }//getMessage(); - - /** - *

Getter for the field computer.

- * - * @return a {@link forge.Computer} object. - */ - public Computer getComputer() { - return computer; - } - - /** - *

think.

- */ - private void think() { - //TODO: instead of setNextPhase, pass priority - final String phase = AllZone.getPhase().getPhase(); - - if (AllZone.getStack().size() > 0) - computer.stack_not_empty(); - else if (phase.equals(Constant.Phase.Main1)) { - Log.debug("Computer main1"); - computer.main1(); - } else if (phase.equals(Constant.Phase.Combat_Begin)) { - computer.begin_combat(); - } else if (phase.equals(Constant.Phase.Combat_Declare_Attackers)) { - computer.declare_attackers(); - } else if (phase.equals(Constant.Phase.Combat_Declare_Attackers_InstantAbility)) { - computer.declare_attackers_after(); - } else if (phase.equals(Constant.Phase.Combat_Declare_Blockers_InstantAbility)) { - computer.declare_blockers_after(); - } else if (phase.equals(Constant.Phase.Combat_End)) { - computer.end_of_combat(); - } else if (phase.equals(Constant.Phase.Main2)) { - Log.debug("Computer main2"); - computer.main2(); - } else - computer.stack_not_empty(); - - }//think -} diff --git a/src/forge/ComputerUtil.java b/src/forge/ComputerUtil.java deleted file mode 100644 index 92188dfe26e..00000000000 --- a/src/forge/ComputerUtil.java +++ /dev/null @@ -1,1372 +0,0 @@ -package forge; - -import forge.card.abilityFactory.AbilityFactory; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.mana.ManaCost; -import forge.card.mana.ManaPool; -import forge.card.spellability.*; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; - -import static forge.error.ErrorViewer.showError; - - -/** - *

ComputerUtil class.

- * - * @author Forge - * @version $Id: $ - */ -public class ComputerUtil { - - //if return true, go to next phase - /** - *

playCards.

- * - * @return a boolean. - */ - static public boolean playCards() { - return playCards(getSpellAbility()); - } - - //if return true, go to next phase - /** - *

playCards.

- * - * @param all an array of {@link forge.card.spellability.SpellAbility} objects. - * @return a boolean. - */ - static public boolean playCards(SpellAbility[] all) { - //not sure "playing biggest spell" matters? - sortSpellAbilityByCost(all); - // MyRandom.shuffle(all); - - for (SpellAbility sa : all) { - // Don't add Counterspells to the "normal" playcard lookupss - AbilityFactory af = sa.getAbilityFactory(); - if (af != null && af.getAPI().equals("Counter")) - continue; - - sa.setActivatingPlayer(AllZone.getComputerPlayer()); - if (canBePlayedAndPayedByAI(sa)) //checks everything nescessary - { - handlePlayingSpellAbility(sa); - - return false; - } - } - return true; - }//playCards() - - /** - *

playCards.

- * - * @param all a {@link java.util.ArrayList} object. - * @return a boolean. - */ - static public boolean playCards(ArrayList all) { - SpellAbility[] sas = new SpellAbility[all.size()]; - for (int i = 0; i < sas.length; i++) { - sas[i] = all.get(i); - } - return playCards(sas); - }//playCards() - - /** - *

handlePlayingSpellAbility.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - static public void handlePlayingSpellAbility(SpellAbility sa) { - AllZone.getStack().freezeStack(); - Card source = sa.getSourceCard(); - - if (sa.isSpell() && !source.isCopiedSpell()) - AllZone.getGameAction().moveToStack(source); - - Cost cost = sa.getPayCosts(); - Target tgt = sa.getTarget(); - - if (cost == null) { - payManaCost(sa); - sa.chooseTargetAI(); - sa.getBeforePayManaAI().execute(); - AllZone.getStack().addAndUnfreeze(sa); - } else { - if (tgt != null && tgt.doesTarget()) - sa.chooseTargetAI(); - - Cost_Payment pay = new Cost_Payment(cost, sa); - if (pay.payComputerCosts()) - AllZone.getStack().addAndUnfreeze(sa); - } - } - - /** - *

counterSpellRestriction.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a int. - */ - static public int counterSpellRestriction(SpellAbility sa) { - // Move this to AF? - // Restriction Level is Based off a handful of factors - - int restrict = 0; - - Card source = sa.getSourceCard(); - Target tgt = sa.getTarget(); - AbilityFactory af = sa.getAbilityFactory(); - HashMap params = af.getMapParams(); - - // Play higher costing spells first? - Cost cost = sa.getPayCosts(); - // Convert cost to CMC - //String totalMana = source.getSVar("PayX"); // + cost.getCMC() - - // Consider the costs here for relative "scoring" - if (cost.getDiscardType().equals("Hand")) { - // Null Brooch aid - restrict -= (AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()).size() * 20); - } - - // Abilities before Spells (card advantage) - if (af.isAbility()) - restrict += 40; - - // TargetValidTargeting gets biggest bonus - if (tgt.getSAValidTargeting() != null) { - restrict += 35; - } - - // Unless Cost gets significant bonus + 10-Payment Amount - String unless = params.get("UnlessCost"); - if (unless != null) { - int amount = AbilityFactory.calculateAmount(source, unless, sa); - - int usableManaSources = CardFactoryUtil.getUsableManaSources(AllZone.getHumanPlayer()); - - // If the Unless isn't enough, this should be less likely to be used - if (amount > usableManaSources) - restrict += 20 - (2 * amount); - else - restrict -= (10 - (2 * amount)); - } - - // Then base on Targeting Restriction - String[] validTgts = tgt.getValidTgts(); - if (validTgts.length != 1 || !validTgts[0].equals("Card")) - restrict += 10; - - // And lastly give some bonus points to least restrictive TargetType (Spell,Ability,Triggered) - String tgtType = tgt.getTargetSpellAbilityType(); - restrict -= (5 * tgtType.split(",").length); - - return restrict; - } - - //if return true, go to next phase - /** - *

playCounterSpell.

- * - * @param possibleCounters a {@link java.util.ArrayList} object. - * @return a boolean. - */ - static public boolean playCounterSpell(ArrayList possibleCounters) { - SpellAbility bestSA = null; - int bestRestriction = Integer.MIN_VALUE; - - for (SpellAbility sa : possibleCounters) { - sa.setActivatingPlayer(AllZone.getComputerPlayer()); - if (canBePlayedAndPayedByAI(sa)) { //checks everything nescessary - if (bestSA == null) { - bestSA = sa; - bestRestriction = counterSpellRestriction(sa); - } else { - // Compare bestSA with this SA - int restrictionLevel = counterSpellRestriction(sa); - - if (restrictionLevel > bestRestriction) { - bestRestriction = restrictionLevel; - bestSA = sa; - } - } - } - } - - if (bestSA == null) - return false; - - // TODO - // "Look" at Targeted SA and "calculate" the threshold - // if (bestRestriction < targetedThreshold) return false; - - AllZone.getStack().freezeStack(); - Card source = bestSA.getSourceCard(); - - if (bestSA.isSpell() && !source.isCopiedSpell()) - AllZone.getGameAction().moveToStack(source); - - Cost cost = bestSA.getPayCosts(); - - if (cost == null) { - // Honestly Counterspells shouldn't use this branch - payManaCost(bestSA); - bestSA.chooseTargetAI(); - bestSA.getBeforePayManaAI().execute(); - AllZone.getStack().addAndUnfreeze(bestSA); - } else { - Cost_Payment pay = new Cost_Payment(cost, bestSA); - if (pay.payComputerCosts()) - AllZone.getStack().addAndUnfreeze(bestSA); - } - - return true; - }//playCounterSpell() - - - //this is used for AI's counterspells - /** - *

playStack.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - final static public void playStack(SpellAbility sa) { - if (canPayCost(sa)) { - Card source = sa.getSourceCard(); - if (sa.isSpell() && !source.isCopiedSpell()) - AllZone.getGameAction().moveToStack(source); - - sa.setActivatingPlayer(AllZone.getComputerPlayer()); - - payManaCost(sa); - - AllZone.getStack().add(sa); - } - } - - /** - *

playStackFree.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - final static public void playStackFree(SpellAbility sa) { - sa.setActivatingPlayer(AllZone.getComputerPlayer()); - - Card source = sa.getSourceCard(); - if (sa.isSpell() && !source.isCopiedSpell()) - AllZone.getGameAction().moveToStack(source); - - AllZone.getStack().add(sa); - } - - /** - *

playNoStack.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - final static public void playNoStack(SpellAbility sa) { - // TODO: We should really restrict what doesn't use the Stack - - if (canPayCost(sa)) { - Card source = sa.getSourceCard(); - if (sa.isSpell() && !source.isCopiedSpell()) - AllZone.getGameAction().moveToStack(source); - - sa.setActivatingPlayer(AllZone.getComputerPlayer()); - - Cost cost = sa.getPayCosts(); - if (cost == null) - payManaCost(sa); - else { - Cost_Payment pay = new Cost_Payment(cost, sa); - pay.payComputerCosts(); - } - - AbilityFactory.resolve(sa, false); - - //destroys creatures if they have lethal damage, etc.. - AllZone.getGameAction().checkStateEffects(); - } - }//play() - - - //gets Spells of cards in hand and Abilities of cards in play - //checks to see - //1. if canPlay() returns true, 2. can pay for mana - /** - *

getSpellAbility.

- * - * @return an array of {@link forge.card.spellability.SpellAbility} objects. - */ - static public SpellAbility[] getSpellAbility() { - CardList all = new CardList(); - all.addAll(AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer())); - all.addAll(AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer())); - all.addAll(CardFactoryUtil.getExternalZoneActivationCards(AllZone.getComputerPlayer())); - - CardList humanPlayable = new CardList(); - humanPlayable.addAll(AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer())); - humanPlayable = humanPlayable.filter(new CardListFilter() { - public boolean addCard(Card c) { - return (c.canAnyPlayerActivate()); - } - }); - - all.addAll(humanPlayable); - - ArrayList spellAbility = new ArrayList(); - for (int outer = 0; outer < all.size(); outer++) { - SpellAbility[] sa = all.get(outer).getSpellAbility(); - for (int i = 0; i < sa.length; i++) - spellAbility.add(sa[i]);//this seems like it needs to be copied, not sure though - } - - SpellAbility[] sa = new SpellAbility[spellAbility.size()]; - spellAbility.toArray(sa); - return sa; - } - - //This is for playing spells regularly (no Cascade/Ripple etc.) - /** - *

canBePlayedAndPayedByAI.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - * @since 1.0.15 - */ - static public boolean canBePlayedAndPayedByAI(SpellAbility sa) { - return sa.canPlayAI() && sa.canPlay() && canPayCost(sa); - } - - /** - *

canPayCost.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - static public boolean canPayCost(SpellAbility sa) { - return canPayCost(sa, AllZone.getComputerPlayer()); - }//canPayCost() - - - /** - *

canPayCost.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param player a {@link forge.Player} object. - * @return a boolean. - */ - static public boolean canPayCost(SpellAbility sa, Player player) { - if (!payManaCost(sa, player, true, 0)) - return false; - - return canPayAdditionalCosts(sa, player); - }//canPayCost() - - - /** - *

determineLeftoverMana.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a int. - */ - static public int determineLeftoverMana(SpellAbility sa) { - return determineLeftoverMana(sa, AllZone.getComputerPlayer()); - } - - /** - *

determineLeftoverMana.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param player a {@link forge.Player} object. - * @return a int. - * @since 1.0.15 - */ - static public int determineLeftoverMana(SpellAbility sa, Player player) { - - int xMana = 0; - - for (int i = 1; i < 99; i++) { - if (!payManaCost(sa, player, true, xMana)) - break; - xMana = i; - } - - return xMana; - } - - - /** - *

canPayAdditionalCosts.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - static public boolean canPayAdditionalCosts(SpellAbility sa) { - return canPayAdditionalCosts(sa, AllZone.getComputerPlayer()); - } - - /** - *

canPayAdditionalCosts.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param player a {@link forge.Player} object. - * @return a boolean. - */ - static public boolean canPayAdditionalCosts(SpellAbility sa, Player player) { - // Add additional cost checks here before attempting to activate abilities - Cost cost = sa.getPayCosts(); - if (cost == null) - return true; - Card card = sa.getSourceCard(); - - if (cost.getTap() && (card.isTapped() || card.isSick())) - return false; - - if (cost.getUntap() && (card.isUntapped() || card.isSick())) - return false; - - if (cost.getTapXTypeCost()) { - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(player); - typeList = typeList.getValidCards(cost.getTapXType().split(","), sa.getActivatingPlayer(), sa.getSourceCard()); - - if (cost.getTap()) - typeList.remove(sa.getSourceCard()); - typeList = typeList.filter(AllZoneUtil.untapped); - - if (cost.getTapXTypeAmount() > typeList.size()) - return false; - } - - if (cost.getSubCounter()) { - Counters c = cost.getCounterType(); - if (card.getCounters(c) - cost.getCounterNum() < 0 || !AllZoneUtil.isCardInPlay(card)) { - return false; - } - } - - if (cost.getAddCounter()) { - // this should always be true - } - - if (cost.getLifeCost()) { - if (player.getLife() <= cost.getLifeAmount()) - return false; - } - - if (cost.getDiscardCost()) { - CardList handList = AllZoneUtil.getPlayerHand(player); - String discType = cost.getDiscardType(); - int discAmount = cost.getDiscardAmount(); - - if (cost.getDiscardThis()) { - if (!AllZone.getZone(card).getZoneName().equals(Constant.Zone.Hand)) - return false; - } else if (discType.equals("LastDrawn")) { - //compy can't yet use this effectively - return false; - } else if (discType.equals("Hand")) { - // this will always work - } else { - if (!discType.equals("Any") && !discType.equals("Random")) { - String validType[] = discType.split(","); - handList = handList.getValidCards(validType, sa.getActivatingPlayer(), sa.getSourceCard()); - } - if (discAmount > handList.size()) { - // not enough cards in hand to pay - return false; - } - } - } - - if (cost.getSacCost()) { - // if there's a sacrifice in the cost, just because we can Pay it doesn't mean we want to. - if (!cost.getSacThis()) { - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(player); - typeList = typeList.getValidCards(cost.getSacType().split(","), sa.getActivatingPlayer(), sa.getSourceCard()); - Card target = sa.getTargetCard(); - if (target != null && target.getController().isPlayer(player)) // don't sacrifice the card we're pumping - typeList.remove(target); - - if (cost.getSacAmount() > typeList.size()) - return false; - } else if (cost.getSacThis() && !AllZoneUtil.isCardInPlay(card)) - return false; - } - - if (cost.getExileCost()) { - // if there's an exile in the cost, just because we can Pay it doesn't mean we want to. - if (!cost.getExileThis()) { - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(player); - typeList = typeList.getValidCards(cost.getExileType().split(","), sa.getActivatingPlayer(), sa.getSourceCard()); - Card target = sa.getTargetCard(); - if (target != null && target.getController().isPlayer(player)) // don't exile the card we're pumping - typeList.remove(target); - - if (cost.getExileAmount() > typeList.size()) - return false; - } else if (cost.getExileThis() && !AllZoneUtil.isCardInPlay(card)) - return false; - } - - if (cost.getExileFromHandCost()) { - // if there's an exile in the cost, just because we can Pay it doesn't mean we want to. - if (!cost.getExileFromHandThis()) { - CardList typeList = AllZoneUtil.getPlayerHand(player); - typeList = typeList.getValidCards(cost.getExileFromHandType().split(","), sa.getActivatingPlayer(), sa.getSourceCard()); - Card target = sa.getTargetCard(); - if (target != null && target.getController().isPlayer(player)) // don't exile the card we're pumping - typeList.remove(target); - - if (cost.getExileFromHandAmount() > typeList.size()) - return false; - } else if (cost.getExileFromHandThis() && !AllZoneUtil.isCardInPlayerHand(player, card)) - return false; - } - - if (cost.getExileFromGraveCost()) { - if (!cost.getExileFromGraveThis()) { - CardList typeList = AllZoneUtil.getPlayerGraveyard(player); - typeList = typeList.getValidCards(cost.getExileFromGraveType().split(","), sa.getActivatingPlayer(), sa.getSourceCard()); - Card target = sa.getTargetCard(); - if (target != null && target.getController().isPlayer(player)) // don't exile the card we're pumping - typeList.remove(target); - - if (cost.getExileFromGraveAmount() > typeList.size()) - return false; - } else if (cost.getExileFromGraveThis() && !AllZoneUtil.isCardInPlayerGraveyard(player, card)) - return false; - } - - if (cost.getExileFromTopCost()) { - if (!cost.getExileFromTopThis()) { - CardList typeList = AllZoneUtil.getPlayerCardsInLibrary(player); - typeList = typeList.getValidCards(cost.getExileFromTopType().split(","), sa.getActivatingPlayer(), sa.getSourceCard()); - Card target = sa.getTargetCard(); - if (target != null && target.getController().isPlayer(player)) // don't exile the card we're pumping - typeList.remove(target); - - if (cost.getExileFromTopAmount() > typeList.size()) - return false; - } else if (cost.getExileFromTopThis() && !AllZoneUtil.isCardInPlayerLibrary(player, card)) - return false; - } - - if (cost.getReturnCost()) { - // if there's a return in the cost, just because we can Pay it doesn't mean we want to. - if (!cost.getReturnThis()) { - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(player); - typeList = typeList.getValidCards(cost.getReturnType().split(","), sa.getActivatingPlayer(), sa.getSourceCard()); - Card target = sa.getTargetCard(); - if (target != null && target.getController().isPlayer(player)) // don't bounce the card we're pumping - typeList.remove(target); - - if (cost.getReturnAmount() > typeList.size()) - return false; - } else if (!AllZoneUtil.isCardInPlay(card)) - return false; - } - - return true; - } - - /** - *

payManaCost.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - static public void payManaCost(SpellAbility sa) { - payManaCost(sa, AllZone.getComputerPlayer(), false, 0); - } - - /** - *

payManaCost.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param player a {@link forge.Player} object. - * @param test (is for canPayCost, if true does not change the game state) - * @param extraMana a int. - * @return a boolean. - * @since 1.0.15 - */ - static public boolean payManaCost(SpellAbility sa, Player player, boolean test, int extraMana) { - String mana = sa.getPayCosts() != null ? sa.getPayCosts().getTotalMana() : sa.getManaCost(); - - ManaCost cost = new ManaCost(mana); - - cost = AllZone.getGameAction().getSpellCostChange(sa, cost); - - ManaPool manapool = AllZone.getComputerManaPool(); - if (player.isHuman()) manapool = AllZone.getManaPool(); - - Card card = sa.getSourceCard(); - // Tack xMana Payments into mana here if X is a set value - if (sa.getPayCosts() != null && cost.getXcounter() > 0) { - - int manaToAdd = 0; - if (test && extraMana > 0) - manaToAdd = extraMana * cost.getXcounter(); - else { - // For Count$xPaid set PayX in the AFs then use that here - // Else calculate it as appropriate. - String xSvar = card.getSVar("X").equals("Count$xPaid") ? "PayX" : "X"; - if (!card.getSVar(xSvar).equals("")) { - if (xSvar.equals("PayX")) - manaToAdd = Integer.parseInt(card.getSVar(xSvar)) * cost.getXcounter(); // X has already been decided - else { - manaToAdd = AbilityFactory.calculateAmount(card, xSvar, sa) * cost.getXcounter(); - } - } - } - - cost.increaseColorlessMana(manaToAdd); - if (!test) - card.setXManaCostPaid(manaToAdd); - } - - if (cost.isPaid()) - return true; - - ArrayList colors; - - cost = ((ManaPool) manapool).subtractMana(sa, cost); - - CardList manaSources = getAvailableMana(); - - //this is to prevent errors for mana sources that have abilities that cost mana. - manaSources.remove(sa.getSourceCard()); - - for (int i = 0; i < manaSources.size(); i++) { - Card sourceCard = manaSources.get(i); - ArrayList manaAbilities = sourceCard.getAIPlayableMana(); - - boolean used = false; //this is for testing paying mana only - - manaAbilities = sortForNeeded(cost, manaAbilities, player); - - for (Ability_Mana m : manaAbilities) { - - if (used) break; //mana source already used in the test - - //if the AI can't pay the additional costs skip the mana ability - if (m.getPayCosts() != null) { - if (!canPayAdditionalCosts(m, player)) - continue; - } else if (sourceCard.isTapped()) - continue; - - //don't use abilities with dangerous drawbacks - if (m.getSubAbility() != null) - if (!m.getSubAbility().chkAI_Drawback()) - continue; - - colors = getProduceableColors(m, player); - for (int j = 0; j < colors.size(); j++) { - if (used) break; //mana source already used in the test - - if (cost.isNeeded(colors.get(j))) { - if (!test) { - //Pay additional costs - if (m.getPayCosts() != null) { - Cost_Payment pay = new Cost_Payment(m.getPayCosts(), m); - if (!pay.payComputerCosts()) continue; - } else - sourceCard.tap(); - } else used = true; // mana source is now used in the test - - cost.payMana(colors.get(j)); - - if (!test) { - //resolve subabilities - AbilityFactory af = m.getAbilityFactory(); - if (af != null) - AbilityFactory.resolveSubAbilities(m); - - if (sourceCard.getName().equals("Undiscovered Paradise")) { - sourceCard.setBounceAtUntap(true); - } - - if (sourceCard.getName().equals("Rainbow Vale")) { - sourceCard.addExtrinsicKeyword("An opponent gains control of CARDNAME at the beginning of the next end step."); - } - - //System.out.println("just subtracted " + colors.get(j) + ", cost is now: " + cost.toString()); - //Run triggers - HashMap runParams = new HashMap(); - - runParams.put("Card", sourceCard); - runParams.put("Player", player); - runParams.put("Produced", colors.get(j)); //can't tell what mana the computer just paid? - AllZone.getTriggerHandler().runTrigger("TapsForMana", runParams); - }//not a test - } - if (cost.isPaid()) { - //if (sa instanceof Spell_Permanent) // should probably add this - sa.getSourceCard().setColorsPaid(cost.getColorsPaid()); - sa.getSourceCard().setSunburstValue(cost.getSunburst()); - manapool.clearPay(sa, test); - return true; - } - } - } - - } - - if (!test) // real payment should not arrive here - throw new RuntimeException("ComputerUtil : payManaCost() cost was not paid for " + sa.getSourceCard().getName()); - - return false; - - }//payManaCost() - - - /** - *

getProduceableColors.

- * - * @param m a {@link forge.card.spellability.Ability_Mana} object. - * @param player a {@link forge.Player} object. - * @return a {@link java.util.ArrayList} object. - * @since 1.0.15 - */ - public static ArrayList getProduceableColors(Ability_Mana m, Player player) { - ArrayList colors = new ArrayList(); - - //if the mana ability is not avaiable move to the next one - m.setActivatingPlayer(player); - if (!m.canPlay()) return colors; - - if (!colors.contains(Constant.Color.Black) && m.isBasic() && m.mana().equals("B")) - colors.add(Constant.Color.Black); - if (!colors.contains(Constant.Color.White) && m.isBasic() && m.mana().equals("W")) - colors.add(Constant.Color.White); - if (!colors.contains(Constant.Color.Green) && m.isBasic() && m.mana().equals("G")) - colors.add(Constant.Color.Green); - if (!colors.contains(Constant.Color.Red) && m.isBasic() && m.mana().equals("R")) - colors.add(Constant.Color.Red); - if (!colors.contains(Constant.Color.Blue) && m.isBasic() && m.mana().equals("U")) - colors.add(Constant.Color.Blue); - if (!colors.contains(Constant.Color.Colorless) && m.isBasic() && m.mana().equals("1")) - colors.add(Constant.Color.Colorless); - - return colors; - } - - /** - *

getAvailableMana.

- * - * @return a {@link forge.CardList} object. - */ - static public CardList getAvailableMana() { - return getAvailableMana(AllZone.getComputerPlayer()); - }//getAvailableMana() - - //gets available mana sources and sorts them - /** - *

getAvailableMana.

- * - * @param player a {@link forge.Player} object. - * @return a {@link forge.CardList} object. - */ - static public CardList getAvailableMana(final Player player) { - CardList list = AllZoneUtil.getPlayerCardsInPlay(player); - CardList manaSources = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - for (Ability_Mana am : c.getAIPlayableMana()) { - am.setActivatingPlayer(player); - if (am.canPlay()) return true; - } - - return false; - } - });//CardListFilter - - CardList sortedManaSources = new CardList(); - - // 1. Use lands that can only produce colorless mana without drawback/cost first - for (int i = 0; i < manaSources.size(); i++) { - Card card = manaSources.get(i); - - if (card.isCreature() || card.isEnchanted()) continue; //don't use creatures before other permanents - - int usableManaAbilities = 0; - boolean needsLimitedResources = false; - ArrayList manaAbilities = card.getAIPlayableMana(); - - for (Ability_Mana m : manaAbilities) { - - Cost cost = m.getPayCosts(); - - //if the AI can't pay the additional costs skip the mana ability - if (cost != null) { - if (!canPayAdditionalCosts(m, player)) - continue; - if (cost.getSubCounter() || cost.getLifeCost()) - needsLimitedResources = true; - } else if (card.isTapped()) - continue; - - //don't use abilities with dangerous drawbacks - if (m.getSubAbility() != null) { - if (!m.getSubAbility().chkAI_Drawback()) - continue; - needsLimitedResources = true; //TODO: check for good drawbacks (gainLife) - } - usableManaAbilities++; - } - - //use lands that can only produce colorless mana first - if (usableManaAbilities == 1 && !needsLimitedResources && manaAbilities.get(0).mana().equals("1")) - sortedManaSources.add(card); - } - - // 2. Search for mana sources that have a certain number of mana abilities (start with 1 and go up to 5) and no drawback/costs - for (int number = 1; number < 6; number++) - for (int i = 0; i < manaSources.size(); i++) { - Card card = manaSources.get(i); - - if (card.isCreature() || card.isEnchanted()) continue; //don't use creatures before other permanents - - int usableManaAbilities = 0; - boolean needsLimitedResources = false; - ArrayList manaAbilities = card.getAIPlayableMana(); - - for (Ability_Mana m : manaAbilities) { - - Cost cost = m.getPayCosts(); - - //if the AI can't pay the additional costs skip the mana ability - if (cost != null) { - if (!canPayAdditionalCosts(m, player)) - continue; - if (cost.getSubCounter() || cost.getLifeCost()) - needsLimitedResources = true; - } else if (card.isTapped()) - continue; - - //don't use abilities with dangerous drawbacks - if (m.getSubAbility() != null) { - if (!m.getSubAbility().chkAI_Drawback()) - continue; - needsLimitedResources = true; //TODO: check for good drawbacks (gainLife) - } - usableManaAbilities++; - } - - if (usableManaAbilities == number && !needsLimitedResources && !sortedManaSources.contains(card)) - sortedManaSources.add(card); - } - - //Add the rest - for (int j = 0; j < manaSources.size(); j++) { - if (!sortedManaSources.contains(manaSources.get(j))) - sortedManaSources.add(manaSources.get(j)); - } - - return sortedManaSources; - }//getAvailableMana() - - // sorts the most needed mana abilities to come first - /** - *

sortForNeeded.

- * - * @param cost a {@link forge.card.mana.ManaCost} object. - * @param manaAbilities a {@link java.util.ArrayList} object. - * @param player a {@link forge.Player} object. - * @return a {@link java.util.ArrayList} object. - * @since 1.0.15 - */ - static public ArrayList sortForNeeded(ManaCost cost, ArrayList manaAbilities, Player player) { - - ArrayList colors; - - ArrayList res = new ArrayList(); - - ManaCost onlyColored = new ManaCost(cost.toString()); - - onlyColored.removeColorlessMana(); - - for (Ability_Mana am : manaAbilities) { - colors = getProduceableColors(am, player); - for (int j = 0; j < colors.size(); j++) { - if (onlyColored.isNeeded(colors.get(j))) { - res.add(am); - break; - } - } - } - - for (Ability_Mana am : manaAbilities) { - - if (res.contains(am)) break; - - colors = getProduceableColors(am, player); - for (int j = 0; j < colors.size(); j++) { - if (cost.isNeeded(colors.get(j))) { - res.add(am); - break; - } - } - } - - return res; - } - - - //plays a land if one is available - /** - *

chooseLandsToPlay.

- * - * @return a boolean. - */ - static public boolean chooseLandsToPlay() { - Player computer = AllZone.getComputerPlayer(); - CardList landList = AllZoneUtil.getPlayerHand(computer); - landList = landList.filter(AllZoneUtil.lands); - - - CardList lands = AllZoneUtil.getPlayerTypeInGraveyard(computer, "Land"); - for (Card crd : lands){ - if (crd.isLand() && crd.hasKeyword("May be played")) - landList.add(crd); - } - - landList = landList.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (c.getSVar("NeedsToPlay").length() > 0) { - String needsToPlay = c.getSVar("NeedsToPlay"); - CardList list = AllZoneUtil.getCardsInPlay(); - - list = list.getValidCards(needsToPlay.split(","), c.getController(), c); - if (list.isEmpty()) return false; - } - if (c.isType("Legendary") - && !c.getName().equals("Flagstones of Trokair")) { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - if (list.containsName(c.getName())) - return false; - } - - //don't play the land if it has cycling and enough lands are available - ArrayList spellAbilities = c.getSpellAbilities(); - for (SpellAbility sa : spellAbilities) - if (sa.isCycling()) { - CardList hand = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); - CardList lands = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - lands.addAll(hand); - lands = lands.getType("Land"); - - if (lands.size() >= Math.max(hand.getHighestConvertedManaCost(), 6)) - return false; - } - - - return true; - } - }); - - while (!landList.isEmpty() && computer.canPlayLand()) { - // play as many lands as you can - int ix = 0; - while (landList.get(ix).isReflectedLand() && (ix + 1 < landList.size())) { - // Skip through reflected lands. Choose last if they are all reflected. - ix++; - } - - Card land = landList.get(ix); - landList.remove(ix); - computer.playLand(land); - - if (AllZone.getStack().size() != 0) - return true; - } - return false; - } - - /** - *

getCardPreference.

- * - * @param activate a {@link forge.Card} object. - * @param pref a {@link java.lang.String} object. - * @param typeList a {@link forge.CardList} object. - * @return a {@link forge.Card} object. - */ - static public Card getCardPreference(Card activate, String pref, CardList typeList) { - String[] prefValid = activate.getSVar("AIPreference").split("\\$"); - if (prefValid[0].equals(pref)) { - CardList prefList = typeList.getValidCards(prefValid[1].split(","), activate.getController(), activate); - if (prefList.size() != 0) { - prefList.shuffle(); - return prefList.get(0); - } - } - if (pref.contains("SacCost")) { // search for permanents with SacMe - for (int ip = 0; ip < 9; ip++) { // priority 0 is the lowest, priority 5 the highest - final int priority = 9 - ip; - CardList SacMeList = typeList.filter(new CardListFilter() { - public boolean addCard(Card c) { - return (!c.getSVar("SacMe").equals("") && Integer.parseInt(c.getSVar("SacMe")) == priority); - } - }); - if (SacMeList.size() != 0) { - SacMeList.shuffle(); - return SacMeList.get(0); - } - } - } - return null; - } - - /** - *

chooseSacrificeType.

- * - * @param type a {@link java.lang.String} object. - * @param activate a {@link forge.Card} object. - * @param target a {@link forge.Card} object. - * @param amount a int. - * @return a {@link forge.CardList} object. - */ - static public CardList chooseSacrificeType(String type, Card activate, Card target, int amount) { - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - typeList = typeList.getValidCards(type.split(","), activate.getController(), activate); - if (target != null && target.getController().isComputer() && typeList.contains(target)) - typeList.remove(target); // don't sacrifice the card we're pumping - - if (typeList.size() == 0) - return null; - - CardList sacList = new CardList(); - int count = 0; - - while (count < amount) { - Card prefCard = getCardPreference(activate, "SacCost", typeList); - if (prefCard != null) { - sacList.add(prefCard); - typeList.remove(prefCard); - count++; - } else - break; - } - - CardListUtil.sortAttackLowFirst(typeList); - - for (int i = count; i < amount; i++) sacList.add(typeList.get(i)); - return sacList; - } - - /** - *

chooseExileType.

- * - * @param type a {@link java.lang.String} object. - * @param activate a {@link forge.Card} object. - * @param target a {@link forge.Card} object. - * @param amount a int. - * @return a {@link forge.CardList} object. - */ - static public CardList chooseExileType(String type, Card activate, Card target, int amount) { - return chooseExileFrom(Constant.Zone.Battlefield, type, activate, target, amount); - } - - /** - *

chooseExileFromHandType.

- * - * @param type a {@link java.lang.String} object. - * @param activate a {@link forge.Card} object. - * @param target a {@link forge.Card} object. - * @param amount a int. - * @return a {@link forge.CardList} object. - */ - static public CardList chooseExileFromHandType(String type, Card activate, Card target, int amount) { - return chooseExileFrom(Constant.Zone.Hand, type, activate, target, amount); - } - - /** - *

chooseExileFromGraveType.

- * - * @param type a {@link java.lang.String} object. - * @param activate a {@link forge.Card} object. - * @param target a {@link forge.Card} object. - * @param amount a int. - * @return a {@link forge.CardList} object. - */ - static public CardList chooseExileFromGraveType(String type, Card activate, Card target, int amount) { - return chooseExileFrom(Constant.Zone.Graveyard, type, activate, target, amount); - } - - /** - *

chooseExileFrom.

- * - * @param zone a {@link java.lang.String} object. - * @param type a {@link java.lang.String} object. - * @param activate a {@link forge.Card} object. - * @param target a {@link forge.Card} object. - * @param amount a int. - * @return a {@link forge.CardList} object. - */ - static public CardList chooseExileFrom(String zone, String type, Card activate, Card target, int amount) { - CardList typeList = AllZoneUtil.getCardsInZone(zone, AllZone.getComputerPlayer()); - typeList = typeList.getValidCards(type.split(","), activate.getController(), activate); - if (target != null && target.getController().isComputer() && typeList.contains(target)) - typeList.remove(target); // don't exile the card we're pumping - - if (typeList.size() == 0) - return null; - - CardListUtil.sortAttackLowFirst(typeList); - CardList exileList = new CardList(); - - for (int i = 0; i < amount; i++) exileList.add(typeList.get(i)); - return exileList; - } - - /** - *

chooseTapType.

- * - * @param type a {@link java.lang.String} object. - * @param activate a {@link forge.Card} object. - * @param tap a boolean. - * @param amount a int. - * @return a {@link forge.CardList} object. - */ - static public CardList chooseTapType(String type, Card activate, boolean tap, int amount) { - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - typeList = typeList.getValidCards(type.split(","), activate.getController(), activate); - - //is this needed? - typeList = typeList.filter(AllZoneUtil.untapped); - - if (tap) - typeList.remove(activate); - - if (typeList.size() == 0 || amount >= typeList.size()) - return null; - - CardListUtil.sortAttackLowFirst(typeList); - - CardList tapList = new CardList(); - - for (int i = 0; i < amount; i++) tapList.add(typeList.get(i)); - return tapList; - } - - /** - *

chooseReturnType.

- * - * @param type a {@link java.lang.String} object. - * @param activate a {@link forge.Card} object. - * @param target a {@link forge.Card} object. - * @param amount a int. - * @return a {@link forge.CardList} object. - */ - static public CardList chooseReturnType(String type, Card activate, Card target, int amount) { - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - typeList = typeList.getValidCards(type.split(","), activate.getController(), activate); - if (target != null && target.getController().isComputer() && typeList.contains(target)) // don't bounce the card we're pumping - typeList.remove(target); - - if (typeList.size() == 0) - return null; - - CardListUtil.sortAttackLowFirst(typeList); - CardList returnList = new CardList(); - - for (int i = 0; i < amount; i++) returnList.add(typeList.get(i)); - return returnList; - } - - /** - *

getPossibleAttackers.

- * - * @return a {@link forge.CardList} object. - */ - static public CardList getPossibleAttackers() { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CombatUtil.canAttack(c); - } - }); - return list; - } - - /** - *

getAttackers.

- * - * @return a {@link forge.Combat} object. - */ - static public Combat getAttackers() { - ComputerUtil_Attack2 att = new ComputerUtil_Attack2(AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()), - AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()), AllZone.getHumanPlayer().getLife()); - - return att.getAttackers(); - } - - /** - *

getBlockers.

- * - * @return a {@link forge.Combat} object. - */ - static public Combat getBlockers() { - CardList blockers = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - - return ComputerUtil_Block2.getBlockers(AllZone.getCombat(), blockers); - } - - /** - *

sortSpellAbilityByCost.

- * - * @param sa an array of {@link forge.card.spellability.SpellAbility} objects. - */ - static void sortSpellAbilityByCost(SpellAbility sa[]) { - //sort from highest cost to lowest - //we want the highest costs first - Comparator c = new Comparator() { - public int compare(SpellAbility a, SpellAbility b) { - int a1 = CardUtil.getConvertedManaCost(a); - int b1 = CardUtil.getConvertedManaCost(b); - - //puts creatures in front of spells - if (a.getSourceCard().isCreature()) - a1 += 1; - - if (b.getSourceCard().isCreature()) - b1 += 1; - - - return b1 - a1; - } - };//Comparator - Arrays.sort(sa, c); - }//sortSpellAbilityByCost() - - /** - *

sacrificePermanents.

- * - * @param amount a int. - * @param list a {@link forge.CardList} object. - */ - static public void sacrificePermanents(int amount, CardList list) { - // used in Annihilator and AF_Sacrifice - int max = list.size(); - if (max > amount) - max = amount; - - CardListUtil.sortCMC(list); - list.reverse(); - - for (int i = 0; i < max; i++) { - // TODO: use getWorstPermanent() would be wayyyy better - - Card c; - if (list.getNotType("Creature").size() == 0) { - c = CardFactoryUtil.AI_getWorstCreature(list); - } else if (list.getNotType("Land").size() == 0) { - c = CardFactoryUtil.getWorstLand(AllZone.getComputerPlayer()); - } else { - c = list.get(0); - } - - ArrayList auras = c.getEnchantedBy(); - - if (auras.size() > 0) { - // TODO: choose "worst" controlled enchanting Aura - for (int j = 0; j < auras.size(); j++) { - Card aura = auras.get(j); - if (aura.getController().isPlayer(c.getController()) && list.contains(aura)) { - c = aura; - break; - } - } - } - - list.remove(c); - AllZone.getGameAction().sacrifice(c); - } - } - - /** - *

canRegenerate.

- * - * @param card a {@link forge.Card} object. - * @return a boolean. - */ - public static boolean canRegenerate(Card card) { - - if (card.hasKeyword("CARDNAME can't be regenerated.")) return false; - - Player controller = card.getController(); - CardList l = AllZoneUtil.getPlayerCardsInPlay(controller); - for (Card c : l) - for (SpellAbility sa : c.getSpellAbility()){ - //This try/catch should fix the "computer is thinking" bug - try { - AbilityFactory af = sa.getAbilityFactory(); - - if (!sa.isAbility() || af == null || !af.getAPI().equals("Regenerate")) - continue; // Not a Regenerate ability - - //sa.setActivatingPlayer(controller); - if (!(sa.canPlay() && ComputerUtil.canPayCost(sa, controller))) - continue; // Can't play ability - - HashMap mapParams = af.getMapParams(); - - Target tgt = sa.getTarget(); - if (tgt != null){ - if (AllZoneUtil.getCardsInPlay().getValidCards(tgt.getValidTgts(), controller, sa.getSourceCard()).contains(card)) - return true; - } - else if (AbilityFactory.getDefinedCards(sa.getSourceCard(), mapParams.get("Defined"), sa).contains(card)) - return true; - - } - catch (Exception ex) { - showError(ex, "There is an error in the card code for %s:%n", c.getName(), ex.getMessage()); - } - } - - return false; - } - - /** - *

possibleDamagePrevention.

- * - * @param card a {@link forge.Card} object. - * @return a int. - */ - public static int possibleDamagePrevention(Card card) { - - int prevented = 0; - - Player controller = card.getController(); - CardList l = AllZoneUtil.getPlayerCardsInPlay(controller); - for (Card c : l) - for (SpellAbility sa : c.getSpellAbility()) - // if SA is from AF_Counter don't add to getPlayable - //This try/catch should fix the "computer is thinking" bug - try { - if (sa.canPlay() && ComputerUtil.canPayCost(sa, controller) && sa.getAbilityFactory() != null && sa.isAbility()) { - AbilityFactory af = sa.getAbilityFactory(); - HashMap mapParams = af.getMapParams(); - if (mapParams.get("AB").equals("PreventDamage")) { - if (AbilityFactory.getDefinedCards(sa.getSourceCard(), mapParams.get("Defined"), sa).contains(card)) - prevented += AbilityFactory.calculateAmount(af.getHostCard(), mapParams.get("Amount"), sa); - Target tgt = sa.getTarget(); - if (tgt != null) { - if (AllZoneUtil.getCardsInPlay().getValidCards(tgt.getValidTgts(), controller, af.getHostCard()) - .contains(card)) - prevented += AbilityFactory.calculateAmount(af.getHostCard(), mapParams.get("Amount"), sa); - - } - } - } - } catch (Exception ex) { - showError(ex, "There is an error in the card code for %s:%n", c.getName(), ex.getMessage()); - } - - return prevented; - } -} diff --git a/src/forge/ComputerUtil_Attack2.java b/src/forge/ComputerUtil_Attack2.java deleted file mode 100644 index 75141acc8ad..00000000000 --- a/src/forge/ComputerUtil_Attack2.java +++ /dev/null @@ -1,667 +0,0 @@ -package forge; - -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.trigger.Trigger; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Random; - -//doesHumanAttackAndWin() uses the global variable AllZone.getComputerPlayer() -/** - *

ComputerUtil_Attack2 class.

- * - * @author Forge - * @version $Id: $ - */ -public class ComputerUtil_Attack2 { - - //possible attackers and blockers - private CardList attackers; - private CardList blockers; - private CardList playerCreatures; - private int blockerLife; - - private Random random = MyRandom.random; - private final int randomInt = random.nextInt(); - - private CardList humanList; //holds human player creatures - private CardList computerList;//holds computer creatures - - private int aiAggression = 0; // added by Masher, how aggressive the ai attack will be depending on circumstances - - /** - *

Constructor for ComputerUtil_Attack2.

- * - * @param possibleAttackers an array of {@link forge.Card} objects. - * @param possibleBlockers an array of {@link forge.Card} objects. - * @param blockerLife a int. - */ - public ComputerUtil_Attack2(Card[] possibleAttackers, Card[] possibleBlockers, int blockerLife) { - this(new CardList(possibleAttackers), new CardList(possibleBlockers), blockerLife); - } - - /** - *

Constructor for ComputerUtil_Attack2.

- * - * @param possibleAttackers a {@link forge.CardList} object. - * @param possibleBlockers a {@link forge.CardList} object. - * @param blockerLife a int. - */ - public ComputerUtil_Attack2(CardList possibleAttackers, CardList possibleBlockers, int blockerLife) { - humanList = new CardList(possibleBlockers.toArray()); - humanList = humanList.getType("Creature"); - - computerList = new CardList(possibleAttackers.toArray()); - computerList = computerList.getType("Creature"); - playerCreatures = new CardList(possibleBlockers.toArray()); - playerCreatures = playerCreatures.getType("Creature"); - - attackers = getPossibleAttackers(possibleAttackers); - blockers = getPossibleBlockers(possibleBlockers, attackers); - this.blockerLife = blockerLife; - }//constructor - - /** - *

sortAttackers.

- * - * @param in a {@link forge.CardList} object. - * @return a {@link forge.CardList} object. - */ - public CardList sortAttackers(CardList in) { - CardList list = new CardList(); - - //Cards with triggers should come first (for Battle Cry) - for (Card attacker : in) { - ArrayList registeredTriggers = AllZone.getTriggerHandler().getRegisteredTriggers(); - for (Trigger trigger : registeredTriggers) { - HashMap trigParams = trigger.getMapParams(); - if (trigParams.get("Mode").equals("Attacks") && trigger.getHostCard().equals(attacker)) - list.add(attacker); - } - } - - for (Card attacker : in) { - if (!list.contains(attacker)) list.add(attacker); - } - - return list; - }//sortAttackers() - - //Is there any reward for attacking? (for 0/1 creatures there is not) - /** - *

isEffectiveAttacker.

- * - * @param attacker a {@link forge.Card} object. - * @param combat a {@link forge.Combat} object. - * @return a boolean. - */ - public boolean isEffectiveAttacker(Card attacker, Combat combat) { - if (CombatUtil.damageIfUnblocked(attacker, AllZone.getHumanPlayer(), combat) > 0) return true; - if (CombatUtil.poisonIfUnblocked(attacker, AllZone.getHumanPlayer(), combat) > 0) return true; - - ArrayList registeredTriggers = AllZone.getTriggerHandler().getRegisteredTriggers(); - for (Trigger trigger : registeredTriggers) - if (CombatUtil.combatTriggerWillTrigger(attacker, null, trigger, combat) - && trigger.getHostCard().getController().isComputer()) return true; - - return false; - } - - /** - *

getPossibleAttackers.

- * - * @param in a {@link forge.CardList} object. - * @return a {@link forge.CardList} object. - */ - public CardList getPossibleAttackers(CardList in) { - CardList list = new CardList(in.toArray()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CombatUtil.canAttack(c); - } - }); - return list; - }//getPossibleAttackers() - - /** - *

getPossibleBlockers.

- * - * @param blockers a {@link forge.CardList} object. - * @param attackers a {@link forge.CardList} object. - * @return a {@link forge.CardList} object. - */ - public CardList getPossibleBlockers(CardList blockers, CardList attackers) { - CardList possibleBlockers = new CardList(blockers.toArray()); - final CardList attackerList = new CardList(attackers.toArray()); - possibleBlockers = possibleBlockers.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (!c.isCreature()) return false; - for (Card attacker : attackerList) { - if (CombatUtil.canBlock(attacker, c)) return true; - } - return false; - } - }); - return possibleBlockers; - }//getPossibleBlockers() - - //this checks to make sure that the computer player - //doesn't lose when the human player attacks - //this method is used by getAttackers() - /** - *

notNeededAsBlockers.

- * - * @param attackers a {@link forge.CardList} object. - * @param combat a {@link forge.Combat} object. - * @return a {@link forge.CardList} object. - */ - public CardList notNeededAsBlockers(CardList attackers, Combat combat) { - CardList notNeededAsBlockers = new CardList(attackers.toArray()); - CardListUtil.sortAttackLowFirst(attackers); - int blockersNeeded = attackers.size(); - - //don't hold back creatures that can't block any of the human creatures - CardList list = getPossibleBlockers(attackers, humanList); - - for (int i = 0; i < list.size(); i++) { - if (!doesHumanAttackAndWin(i)) { - blockersNeeded = i; - break; - } else notNeededAsBlockers.remove(list.get(i)); - } - - if (blockersNeeded == list.size()) { - // Human will win unless everything is kept back to block - return notNeededAsBlockers; - } - - // Increase the total number of blockers needed by 1 if Finest Hour in play - // (human will get an extra first attack with a creature that untaps) - // In addition, if the computer guesses it needs no blockers, make sure that - // it won't be surprised by Exalted - int humanExaltedBonus = countExaltedBonus(AllZone.getHumanPlayer()); - - if (humanExaltedBonus > 0) { - int nFinestHours = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer(), "Finest Hour").size(); - - if ((blockersNeeded == 0 || nFinestHours > 0) && humanList.size() > 0) { - // - // total attack = biggest creature + exalted, *2 if Rafiq is in play - int humanBaseAttack = getAttack(humanList.get(0)) + humanExaltedBonus; - if (nFinestHours > 0) { - // For Finest Hour, one creature could attack and get the bonus TWICE - humanBaseAttack = humanBaseAttack + humanExaltedBonus; - } - int totalExaltedAttack = AllZoneUtil.isCardInPlay("Rafiq of the Many", AllZone.getHumanPlayer()) ? - 2 * humanBaseAttack : humanBaseAttack; - if ((AllZone.getComputerPlayer().getLife() - 3) <= totalExaltedAttack) { - // We will lose if there is an Exalted attack -- keep one blocker - if (blockersNeeded == 0 && notNeededAsBlockers.size() > 0) - notNeededAsBlockers.remove(0); - - // Finest Hour allows a second Exalted attack: keep a blocker for that too - if (nFinestHours > 0 && notNeededAsBlockers.size() > 0) - notNeededAsBlockers.remove(0); - } - } - } - - //re-add creatures with vigilance - for (Card c : attackers) { - if (c.hasKeyword("Vigilance")) - notNeededAsBlockers.add(c); - } - - return notNeededAsBlockers; - } - - //this uses a global variable, which isn't perfect - /** - *

doesHumanAttackAndWin.

- * - * @param nBlockingCreatures a int. - * @return a boolean. - */ - public boolean doesHumanAttackAndWin(int nBlockingCreatures) { - int totalAttack = 0; - int stop = humanList.size() - nBlockingCreatures; - - for (int i = 0; i < stop; i++) - totalAttack += getAttack(humanList.get(i)); - - //originally -3 so the computer will try to stay at 3 life - //0 now to prevent the AI from not attacking when it's got low life - //(seems to happen too often) - return AllZone.getComputerPlayer().getLife() <= totalAttack; - } - - /** - *

doAssault.

- * - * @return a boolean. - */ - private boolean doAssault() { - //Beastmaster Ascension - if (AllZoneUtil.isCardInPlay("Beastmaster Ascension", AllZone.getComputerPlayer()) && attackers.size() > 1) { - CardList beastions = AllZoneUtil.getCardsInZone(Constant.Zone.Battlefield, AllZone.getComputerPlayer()). - getName("Beastmaster Ascension"); - int minCreatures = 7; - for (Card beastion : beastions) { - int counters = beastion.getCounters(Counters.QUEST); - minCreatures = Math.min(minCreatures, 7 - counters); - } - if (attackers.size() >= minCreatures) - return true; - } - - //I think this is right but the assault code may still be a little off - CardListUtil.sortAttackLowFirst(attackers); - - int totalAttack = 0; - //presumes the Human will block - for (int i = 0; i < (attackers.size() - blockers.size()); i++) - totalAttack += getAttack(attackers.get(i)); - - return blockerLife <= totalAttack; - }//doAssault() - - /** - *

chooseDefender.

- * - * @param c a {@link forge.Combat} object. - * @param bAssault a boolean. - */ - public void chooseDefender(Combat c, boolean bAssault) { - // TODO: split attackers to different planeswalker/human - // AI will only attack one Defender per combat for now - ArrayList defs = c.getDefenders(); - - if (defs.size() == 1 || bAssault) { - c.setCurrentDefender(0); - return; - } - - // Randomly determine who EVERYONE is attacking - // would be better to determine more individually - int n = MyRandom.random.nextInt(defs.size()); - - Object entity = AllZone.getComputerPlayer().getMustAttackEntity(); - if(null != entity) { - ArrayList defenders = AllZone.getCombat().getDefenders(); - n = defenders.indexOf(entity); - if(-1 == n) { - System.out.println("getMustAttackEntity() returned something not in defenders."); - } - else { - c.setCurrentDefender(n); - } - } - else { - c.setCurrentDefender(n); - } - - return; - } - - - /** - *

Getter for the field attackers.

- * - * @return a {@link forge.Combat} object. - */ - public Combat getAttackers() { - //if this method is called multiple times during a turn, - //it will always return the same value - //randomInt is used so that the computer doesn't always - //do the same thing on turn 3 if he had the same creatures in play - //I know this is a little confusing - random.setSeed(AllZone.getPhase().getTurn() + randomInt); - - Combat combat = new Combat(); - combat.setAttackingPlayer(AllZone.getCombat().getAttackingPlayer()); - combat.setDefendingPlayer(AllZone.getCombat().getDefendingPlayer()); - - combat.setDefenders(AllZone.getCombat().getDefenders()); - - boolean bAssault = doAssault(); - // Determine who will be attacked - chooseDefender(combat, bAssault); - - CardList attackersLeft = new CardList(attackers.toArray()); - - //Attackers that don't really have a choice - for (Card attacker : attackers) { - if ((attacker.hasKeyword("CARDNAME attacks each turn if able.") - || attacker.hasKeyword("At the beginning of the end step, destroy CARDNAME.") - || attacker.hasKeyword("At the beginning of the end step, exile CARDNAME.") - || attacker.hasKeyword("At the beginning of the end step, sacrifice CARDNAME.") - || attacker.getSacrificeAtEOT() - || attacker.getSirenAttackOrDestroy() - || (attacker.getController().getMustAttackEntity() != null)) - && CombatUtil.canAttack(attacker, combat)) { - combat.addAttacker(attacker); - attackersLeft.remove(attacker); - } - } - - // ******************* - // start of edits - // ******************* - - int computerForces = 0; - int playerForces = 0; - int playerForcesForAttritionalAttack = 0; - - // examine the potential forces - CardList nextTurnAttackers = new CardList(); - int candidateCounterAttackDamage = 0; - int candidateTotalBlockDamage = 0; - for (Card pCard : playerCreatures) { - - // if the creature can attack next turn add it to counter attackers list - if (CombatUtil.canAttackNextTurn(pCard)) { - nextTurnAttackers.add(pCard); - if (pCard.getNetCombatDamage() > 0) { - candidateCounterAttackDamage += pCard.getNetCombatDamage(); - candidateTotalBlockDamage += pCard.getNetCombatDamage(); - playerForces += 1; // player forces they might use to attack - } - } - // increment player forces that are relevant to an attritional attack - includes walls - if (CombatUtil.canBlock(pCard)) { - playerForcesForAttritionalAttack += 1; - } - } - - // find the potential counter attacking damage compared to AI life total - double aiLifeToPlayerDamageRatio = 1000000; - if (candidateCounterAttackDamage > 0) - aiLifeToPlayerDamageRatio = (double) AllZone.getComputerPlayer().life / candidateCounterAttackDamage; - - // get the potential damage and strength of the AI forces - CardList candidateAttackers = new CardList(); - int candidateUnblockedDamage = 0; - for (Card pCard : computerList) { - // if the creature can attack then it's a potential attacker this turn, assume summoning sickness creatures will be able to - if (CombatUtil.canAttackNextTurn(pCard)) { - - candidateAttackers.add(pCard); - if (pCard.getNetCombatDamage() > 0) { - candidateUnblockedDamage += CombatUtil.damageIfUnblocked(pCard, AllZone.getHumanPlayer(), combat); - computerForces += 1; - } - - } - } - - // find the potential damage ratio the AI can cause - double playerLifeToDamageRatio = 1000000; - if (candidateUnblockedDamage > 0) - playerLifeToDamageRatio = (double) AllZone.getHumanPlayer().life / candidateUnblockedDamage; - - /*System.out.println(String.valueOf(aiLifeToPlayerDamageRatio) + " = ai life to player damage ratio"); - System.out.println(String.valueOf(playerLifeToDamageRatio) + " = player life ai player damage ratio");*/ - - // determine if the ai outnumbers the player - int outNumber = computerForces - playerForces; - - // compare the ratios, higher = better for ai - double ratioDiff = aiLifeToPlayerDamageRatio - playerLifeToDamageRatio; - /* System.out.println(String.valueOf(ratioDiff) + " = ratio difference, higher = better for ai"); - System.out.println(String.valueOf(outNumber) + " = outNumber, higher = better for ai"); */ - - // ********************* - // if outnumber and superior ratio work out whether attritional all out attacking will work - // attritional attack will expect some creatures to die but to achieve victory by sheer weight - // of numbers attacking turn after turn. It's not calculate very carefully, the accuracy - // can probably be improved - // ********************* - boolean doAttritionalAttack = false; - // get list of attackers ordered from low power to high - CardListUtil.sortAttackLowFirst(attackers); - // get player life total - int playerLife = AllZone.getHumanPlayer().life; - // get the list of attackers up to the first blocked one - CardList attritionalAttackers = new CardList(); - for (int x = 0; x < attackers.size() - playerForces; x++) { - attritionalAttackers.add(attackers.getCard(x)); - } - // until the attackers are used up or the player would run out of life - int attackRounds = 1; - while (attritionalAttackers.size() > 0 && playerLife > 0 && attackRounds < 99) { - // sum attacker damage - int damageThisRound = 0; - for (int y = 0; y < attritionalAttackers.size(); y++) { - damageThisRound += attritionalAttackers.getCard(y).getNetCombatDamage(); - } - // remove from player life - playerLife -= damageThisRound; - // shorten attacker list by the length of the blockers - assuming all blocked are killed for convenience - for (int z = 0; z < playerForcesForAttritionalAttack; z++) { - if (attritionalAttackers.size() > 0) { - attritionalAttackers.remove(attritionalAttackers.size() - 1); - } - } - attackRounds += 1; - if (playerLife <= 0) { - doAttritionalAttack = true; - } - } - //System.out.println(doAttritionalAttack + " = do attritional attack"); - // ********************* - // end attritional attack calculation - // ********************* - - // ********************* - // see how long until unblockable attackers will be fatal - // ********************* - double unblockableDamage = 0; - double turnsUntilDeathByUnblockable = 0; - boolean doUnblockableAttack = false; - for (Card attacker : attackers) { - boolean isUnblockableCreature = true; - // check blockers individually, as the bulk canBeBlocked doesn't check all circumstances - for (Card blocker : blockers) { - if (CombatUtil.canBlock(attacker, blocker)) { - isUnblockableCreature = false; - } - } - if (isUnblockableCreature) { - unblockableDamage += CombatUtil.damageIfUnblocked(attacker, AllZone.getHumanPlayer(), combat); - } - } - if (unblockableDamage > 0) { - turnsUntilDeathByUnblockable = AllZone.getHumanPlayer().life / unblockableDamage; - } - if (unblockableDamage > AllZone.getHumanPlayer().life) { - doUnblockableAttack = true; - } - // ***************** - // end see how long until unblockable attackers will be fatal - // ***************** - - // decide on attack aggression based on a comparison of forces, life totals and other considerations - // some bad "magic numbers" here, TODO replace with nice descriptive variable names - if ((ratioDiff > 0 && doAttritionalAttack)) { // (playerLifeToDamageRatio <= 1 && ratioDiff >= 1 && outNumber > 0) || - aiAggression = 5; // attack at all costs - } else if ((playerLifeToDamageRatio < 2 && ratioDiff >= 0) || ratioDiff > 3 || (ratioDiff > 0 && outNumber > 0)) { - aiAggression = 3; // attack expecting to kill creatures or damage player. - } else if (ratioDiff >= 0 || ratioDiff + outNumber >= -1) { - // at 0 ratio expect to potentially gain an advantage by attacking first - // if the ai has a slight advantage - // or the ai has a significant advantage numerically but only a slight disadvantage damage/life - aiAggression = 2; // attack expecting to destroy creatures/be unblockable - } else if (ratioDiff < 0 && aiLifeToPlayerDamageRatio > 1) { - // the player is overmatched but there are a few turns before death - aiAggression = 2; // attack expecting to destroy creatures/be unblockable - } else if (doUnblockableAttack || ((ratioDiff * -1) < turnsUntilDeathByUnblockable)) { - aiAggression = 1; // look for unblockable creatures that might be able to attack for a bit of - // fatal damage even if the player is significantly better - } else if (ratioDiff < 0) { - aiAggression = 0; - } // stay at home to block - System.out.println(String.valueOf(aiAggression) + " = ai aggression"); - - // **************** - // End of edits - // **************** - - //Exalted - if (combat.getAttackers().length == 0 && (countExaltedBonus(AllZone.getComputerPlayer()) >= 3 || - AllZoneUtil.isCardInPlay("Rafiq of the Many", AllZone.getComputerPlayer()) || - AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer(), "Battlegrace Angel").size() >= 2 || - (AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer(), "Finest Hour").size() >= 1) && - AllZone.getPhase().isFirstCombat()) - && !bAssault) { - int biggest = 0; - Card att = null; - for (int i = 0; i < attackersLeft.size(); i++) { - if (getAttack(attackersLeft.get(i)) > biggest) { - biggest = getAttack(attackersLeft.get(i)); - att = attackersLeft.get(i); - } - } - if (att != null && CombatUtil.canAttack(att, combat)) - combat.addAttacker(att); - - System.out.println("Exalted"); - } - - //do assault (all creatures attack) if the computer would win the game - //or if the computer has 4 creatures and the player has 1 - else if (bAssault) { - System.out.println("Assault"); - CardListUtil.sortAttack(attackersLeft); - for (int i = 0; i < attackersLeft.size(); i++) - if (CombatUtil.canAttack(attackersLeft.get(i), combat)) combat.addAttacker(attackersLeft.get(i)); - } else { - System.out.println("Normal attack"); - - attackersLeft = notNeededAsBlockers(attackersLeft, combat); - System.out.println(attackersLeft.size()); - - attackersLeft = sortAttackers(attackersLeft); - - for (int i = 0; i < attackersLeft.size(); i++) { - Card attacker = attackersLeft.get(i); - int totalFirstStrikeBlockPower = 0; - if (!attacker.hasFirstStrike() && !attacker.hasDoubleStrike()) - totalFirstStrikeBlockPower = CombatUtil.getTotalFirstStrikeBlockPower(attacker, AllZone.getHumanPlayer()); - - if (shouldAttack(attacker, blockers, combat) && (totalFirstStrikeBlockPower < attacker.getKillDamage() || aiAggression == 5) - && CombatUtil.canAttack(attacker, combat)) - combat.addAttacker(attacker); - } - }//getAttackers() - - return combat; - }//getAttackers() - - /** - *

countExaltedBonus.

- * - * @param player a {@link forge.Player} object. - * @return a int. - */ - public int countExaltedBonus(Player player) { - CardList list = AllZoneUtil.getPlayerCardsInPlay(player); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.hasKeyword("Exalted"); - } - }); - - return list.size(); - } - - /** - *

getAttack.

- * - * @param c a {@link forge.Card} object. - * @return a int. - */ - public int getAttack(Card c) { - int n = c.getNetCombatDamage(); - - if (c.hasKeyword("Double Strike")) - n *= 2; - - return n; - } - - /** - *

shouldAttack.

- * - * @param attacker a {@link forge.Card} object. - * @param defenders a {@link forge.CardList} object. - * @param combat a {@link forge.Combat} object. - * @return a boolean. - */ - public boolean shouldAttack(Card attacker, CardList defenders, Combat combat) { - boolean canBeKilledByOne = false; // indicates if the attacker can be killed by a single blockers - boolean canKillAll = true; // indicates if the attacker can kill all single blockers - boolean canKillAllDangerous = true; // indicates if the attacker can kill all single blockers with wither or infect - boolean isWorthLessThanAllKillers = true; - boolean canBeBlocked = false; - - if (!isEffectiveAttacker(attacker, combat)) return false; - - // look at the attacker in relation to the blockers to establish a number of factors about the attacking - // context that will be relevant to the attackers decision according to the selected strategy - for (Card defender : defenders) { - if (CombatUtil.canBlock(attacker, defender)) { //, combat )) { - canBeBlocked = true; - if (CombatUtil.canDestroyAttacker(attacker, defender, combat, false)) { - canBeKilledByOne = true; // there is a single creature on the battlefield that can kill the creature - // see if the defending creature is of higher or lower value. We don't want to attack only to lose value - if (CardFactoryUtil.evaluateCreature(defender) <= CardFactoryUtil.evaluateCreature(attacker)) { - isWorthLessThanAllKillers = false; - } - } - // see if this attacking creature can destroy this defender, if not record that it can't kill everything - if (!CombatUtil.canDestroyBlocker(defender, attacker, combat, false)) { - canKillAll = false; - if (defender.hasKeyword("Wither") || defender.hasKeyword("Infect")) { - canKillAllDangerous = false; // there is a dangerous creature that can survive an attack from this creature - } - } - } - } - - // if the creature cannot block and can kill all opponents they might as well attack, they do nothing staying back - if (canKillAll && !CombatUtil.canBlock(attacker) && isWorthLessThanAllKillers) { - System.out.println(attacker.getName() + " = attacking because they can't block, expecting to kill or damage player"); - return true; - } - - // decide if the creature should attack based on the prevailing strategy choice in aiAggression - switch (aiAggression) { - case 5: // all out attacking - System.out.println(attacker.getName() + " = all out attacking"); - return true; - case 4: // expecting to at least trade with something - if (canKillAll || (canKillAllDangerous && !canBeKilledByOne) || !canBeBlocked) { - System.out.println(attacker.getName() + " = attacking expecting to at least trade with something"); - return true; - } - case 3: // expecting to at least kill a creature of equal value, not be blocked - if ((canKillAll && isWorthLessThanAllKillers) || (canKillAllDangerous && !canBeKilledByOne) || !canBeBlocked) { - System.out.println(attacker.getName() + " = attacking expecting to kill creature or cause damage, or is unblockable"); - return true; - } - case 2: // attack expecting to attract a group block or destroying a single blocker and surviving - if ((canKillAll && !canBeKilledByOne) || !canBeBlocked) { - System.out.println(attacker.getName() + " = attacking expecting to survive or attract group block"); - return true; - } - case 1: // unblockable creatures only - if (!canBeBlocked) { - System.out.println(attacker.getName() + " = attacking expecting not to be blocked"); - return true; - } - } - return false; // don't attack - } - -}//end class ComputerUtil_Attack2 diff --git a/src/forge/ComputerUtil_Block2.java b/src/forge/ComputerUtil_Block2.java deleted file mode 100644 index 6b3c6f439a1..00000000000 --- a/src/forge/ComputerUtil_Block2.java +++ /dev/null @@ -1,641 +0,0 @@ -package forge; - -import forge.card.cardFactory.CardFactoryUtil; - -import java.util.ArrayList; - - -/** - *

ComputerUtil_Block2 class.

- * - * @author Forge - * @version $Id: $ - */ -public class ComputerUtil_Block2 { - /** Constant attackers */ - private static CardList attackers = new CardList(); //all attackers - /** Constant attackersLeft */ - private static CardList attackersLeft = new CardList(); //keeps track of all currently unblocked attackers - /** Constant blockedButUnkilled */ - private static CardList blockedButUnkilled = new CardList(); //blocked attackers that currently wouldn't be destroyed - /** Constant blockersLeft */ - private static CardList blockersLeft = new CardList(); //keeps track of all unassigned blockers - /** Constant diff=0 */ - private static int diff = 0; - - - /** - *

Getter for the field attackers.

- * - * @return a {@link forge.CardList} object. - */ - private static CardList getAttackers() { - return attackers; - } - - /** - *

Setter for the field attackers.

- * - * @param cardList a {@link forge.CardList} object. - */ - private static void setAttackers(CardList cardList) { - attackers = (cardList); - } - - /** - *

Getter for the field attackersLeft.

- * - * @return a {@link forge.CardList} object. - */ - private static CardList getAttackersLeft() { - return attackersLeft; - } - - /** - *

Setter for the field attackersLeft.

- * - * @param cardList a {@link forge.CardList} object. - */ - private static void setAttackersLeft(CardList cardList) { - attackersLeft = (cardList); - } - - /** - *

Getter for the field blockedButUnkilled.

- * - * @return a {@link forge.CardList} object. - */ - private static CardList getBlockedButUnkilled() { - return blockedButUnkilled; - - } - - /** - *

Setter for the field blockedButUnkilled.

- * - * @param cardList a {@link forge.CardList} object. - */ - private static void setBlockedButUnkilled(CardList cardList) { - blockedButUnkilled = (cardList); - } - - /** - *

Getter for the field blockersLeft.

- * - * @return a {@link forge.CardList} object. - */ - private static CardList getBlockersLeft() { - return blockersLeft; - } - - /** - *

Setter for the field blockersLeft.

- * - * @param cardList a {@link forge.CardList} object. - */ - private static void setBlockersLeft(CardList cardList) { - blockersLeft = (cardList); - } - - /** - *

Getter for the field diff.

- * - * @return a int. - */ - private static int getDiff() { - return diff; - } - - /** - *

Setter for the field diff.

- * - * @param diff a int. - */ - private static void setDiff(int diff) { - ComputerUtil_Block2.diff = (diff); - } - - - //finds the creatures able to block the attacker - /** - *

getPossibleBlockers.

- * - * @param attacker a {@link forge.Card} object. - * @param blockersLeft a {@link forge.CardList} object. - * @param combat a {@link forge.Combat} object. - * @return a {@link forge.CardList} object. - */ - private static CardList getPossibleBlockers(Card attacker, CardList blockersLeft, Combat combat) { - CardList blockers = new CardList(); - - for (Card blocker : blockersLeft) { - //if the blocker can block a creature with lure it can't block a creature without - if (CombatUtil.canBlock(attacker, blocker, combat)) blockers.add(blocker); - } - - return blockers; - } - - //finds blockers that won't be destroyed - /** - *

getSafeBlockers.

- * - * @param attacker a {@link forge.Card} object. - * @param blockersLeft a {@link forge.CardList} object. - * @param combat a {@link forge.Combat} object. - * @return a {@link forge.CardList} object. - */ - private static CardList getSafeBlockers(Card attacker, CardList blockersLeft, Combat combat) { - CardList blockers = new CardList(); - - for (Card b : blockersLeft) { - if (!CombatUtil.canDestroyBlocker(b, attacker, combat, false)) blockers.add(b); - } - - return blockers; - } - - //finds blockers that destroy the attacker - /** - *

getKillingBlockers.

- * - * @param attacker a {@link forge.Card} object. - * @param blockersLeft a {@link forge.CardList} object. - * @param combat a {@link forge.Combat} object. - * @return a {@link forge.CardList} object. - */ - private static CardList getKillingBlockers(Card attacker, CardList blockersLeft, Combat combat) { - CardList blockers = new CardList(); - - for (Card b : blockersLeft) { - if (CombatUtil.canDestroyAttacker(attacker, b, combat, false)) blockers.add(b); - } - - return blockers; - } - - /** - *

sortPotentialAttackers.

- * - * @param combat a {@link forge.Combat} object. - * @return a {@link forge.CardList} object. - */ - public static CardList sortPotentialAttackers(Combat combat) { - CardList[] attackerLists = combat.sortAttackerByDefender(); - CardList sortedAttackers = new CardList(); - - ArrayList defenders = combat.getDefenders(); - - //Begin with the attackers that pose the biggest threat - CardListUtil.sortByEvaluateCreature(attackerLists[0]); - CardListUtil.sortAttack(attackerLists[0]); - - // If I don't have any planeswalkers than sorting doesn't really matter - if (defenders.size() == 1) - return attackerLists[0]; - - boolean bLifeInDanger = CombatUtil.lifeInDanger(combat); - - // TODO: Add creatures attacking Planeswalkers in order of which we want to protect - // defend planeswalkers with more loyalty before planeswalkers with less loyalty - // if planeswalker will be too difficult to defend don't even bother - for (int i = 1; i < attackerLists.length; i++) { - //Begin with the attackers that pose the biggest threat - CardListUtil.sortAttack(attackerLists[i]); - for (Card c : attackerLists[i]) - sortedAttackers.add(c); - } - - if (bLifeInDanger) { - // add creatures attacking the Player to the front of the list - for (Card c : attackerLists[0]) - sortedAttackers.add(0, c); - - } else { - // add creatures attacking the Player to the back of the list - for (Card c : attackerLists[0]) - sortedAttackers.add(c); - } - - return sortedAttackers; - } - - // ======================= block assignment functions ================================ - - // Good Blocks means a good trade or no trade - /** - *

makeGoodBlocks.

- * - * @param combat a {@link forge.Combat} object. - * @return a {@link forge.Combat} object. - */ - private static Combat makeGoodBlocks(Combat combat) { - - CardList currentAttackers = new CardList(getAttackersLeft().toArray()); - - for (Card attacker : getAttackersLeft()) { - - Card blocker = new Card(); - - CardList blockers = getPossibleBlockers(attacker, getBlockersLeft(), combat); - - CardList safeBlockers = getSafeBlockers(attacker, blockers, combat); - CardList killingBlockers; - - if (safeBlockers.size() > 0) { - // 1.Blockers that can destroy the attacker but won't get destroyed - killingBlockers = getKillingBlockers(attacker, safeBlockers, combat); - if (killingBlockers.size() > 0) blocker = CardFactoryUtil.AI_getWorstCreature(killingBlockers); - - // 2.Blockers that won't get destroyed - else { - blocker = CardFactoryUtil.AI_getWorstCreature(safeBlockers); - getBlockedButUnkilled().add(attacker); - } - } // no safe blockers - else { - killingBlockers = getKillingBlockers(attacker, blockers, combat); - if (killingBlockers.size() > 0) { - // 3.Blockers that can destroy the attacker and are worth less - Card worst = CardFactoryUtil.AI_getWorstCreature(killingBlockers); - - if (CardFactoryUtil.evaluateCreature(worst) + getDiff() < CardFactoryUtil.evaluateCreature(attacker)) { - blocker = worst; - } - } - } - if (blocker.getName() != "") { - currentAttackers.remove(attacker); - getBlockersLeft().remove(blocker); - combat.addBlocker(attacker, blocker); - } - } - setAttackersLeft(new CardList(currentAttackers.toArray())); - return combat; - } - - // Good Gang Blocks means a good trade or no trade - /** - *

makeGangBlocks.

- * - * @param combat a {@link forge.Combat} object. - * @return a {@link forge.Combat} object. - */ - private static Combat makeGangBlocks(Combat combat) { - - CardList currentAttackers = new CardList(getAttackersLeft().toArray()); - currentAttackers = currentAttackers.getKeywordsDontContain("Rampage"); - currentAttackers = currentAttackers.getKeywordsDontContain("CARDNAME can't be blocked by more than one creature."); - CardList blockers; - - //Try to block an attacker without first strike with a gang of first strikers - for (Card attacker : getAttackersLeft()) { - if (!attacker.hasKeyword("First Strike") - && !attacker.hasKeyword("Double Strike")) { - blockers = getPossibleBlockers(attacker, getBlockersLeft(), combat); - CardList firstStrikeBlockers = new CardList(); - CardList blockGang = new CardList(); - for (int i = 0; i < blockers.size(); i++) - if (blockers.get(i).hasFirstStrike() || blockers.get(i).hasDoubleStrike()) - firstStrikeBlockers.add(blockers.get(i)); - - if (firstStrikeBlockers.size() > 1) { - CardListUtil.sortAttack(firstStrikeBlockers); - for (Card blocker : firstStrikeBlockers) { - //if the total damage of the blockgang was not enough without but is enough with this blocker finish the blockgang - if (CombatUtil.totalDamageOfBlockers(attacker, blockGang) < attacker.getKillDamage()) { - blockGang.add(blocker); - if (CombatUtil.totalDamageOfBlockers(attacker, blockGang) >= attacker.getKillDamage()) { - currentAttackers.remove(attacker); - for (Card b : blockGang) { - getBlockersLeft().remove(b); - combat.addBlocker(attacker, b); - } - } - } - } - } - } - } - - setAttackersLeft(new CardList(currentAttackers.toArray())); - currentAttackers = new CardList(getAttackersLeft().toArray()); - - //Try to block an attacker with two blockers of which only one will die - for (final Card attacker : getAttackersLeft()) { - blockers = getPossibleBlockers(attacker, getBlockersLeft(), combat); - CardList usableBlockers; - CardList blockGang = new CardList(); - int absorbedDamage = 0; //The amount of damage needed to kill the first blocker - int currentValue = 0; //The value of the creatures in the blockgang - - //Try to add blockers that could be destroyed, but are worth less than the attacker - //Don't use blockers without First Strike or Double Strike if attacker has it - usableBlockers = blockers.filter(new CardListFilter() { - public boolean addCard(Card c) { - if ((attacker.hasKeyword("First Strike") || attacker.hasKeyword("Double Strike")) - && !(c.hasKeyword("First Strike") || c.hasKeyword("Double Strike"))) - return false; - return CardFactoryUtil.evaluateCreature(c) + getDiff() < CardFactoryUtil.evaluateCreature(attacker); - } - }); - if (usableBlockers.size() < 2) - return combat; - - Card leader = CardFactoryUtil.AI_getBestCreature(usableBlockers); - blockGang.add(leader); - usableBlockers.remove(leader); - absorbedDamage = leader.getEnoughDamageToKill(attacker.getNetCombatDamage(), attacker, true); - currentValue = CardFactoryUtil.evaluateCreature(leader); - - for (Card blocker : usableBlockers) { - //Add an additional blocker if the current blockers are not enough and the new one would deal the remaining damage - int currentDamage = CombatUtil.totalDamageOfBlockers(attacker, blockGang); - int additionalDamage = CombatUtil.dealsDamageAsBlocker(attacker, blocker); - int absorbedDamage2 = blocker.getEnoughDamageToKill(attacker.getNetCombatDamage(), attacker, true); - int addedValue = CardFactoryUtil.evaluateCreature(blocker); - if (attacker.getKillDamage() > currentDamage - && !(attacker.getKillDamage() > currentDamage + additionalDamage) //The attacker will be killed - && (absorbedDamage2 + absorbedDamage > attacker.getNetCombatDamage() //only one blocker can be killed - || currentValue + addedValue - 50 <= CardFactoryUtil.evaluateCreature(attacker)) //attacker is worth more - && CombatUtil.canBlock(attacker, blocker, combat)) {//this is needed for attackers that can't be blocked by more than 1 - currentAttackers.remove(attacker); - combat.addBlocker(attacker, blocker); - combat.addBlocker(attacker, leader); - getBlockersLeft().remove(blocker); - getBlockersLeft().remove(leader); - break; - } - } - } - - setAttackersLeft(new CardList(currentAttackers.toArray())); - return combat; - } - - // Bad Trade Blocks (should only be made if life is in danger) - /** - *

makeTradeBlocks.

- * - * @param combat a {@link forge.Combat} object. - * @return a {@link forge.Combat} object. - */ - private static Combat makeTradeBlocks(Combat combat) { - - CardList currentAttackers = new CardList(getAttackersLeft().toArray()); - CardList killingBlockers; - - for (Card attacker : getAttackersLeft()) { - killingBlockers = - getKillingBlockers(attacker, getPossibleBlockers(attacker, getBlockersLeft(), combat), combat); - if (killingBlockers.size() > 0 && CombatUtil.lifeInDanger(combat)) { - Card blocker = CardFactoryUtil.AI_getWorstCreature(killingBlockers); - combat.addBlocker(attacker, blocker); - currentAttackers.remove(attacker); - getBlockersLeft().remove(blocker); - } - } - setAttackersLeft(new CardList(currentAttackers.toArray())); - return combat; - } - - // Chump Blocks (should only be made if life is in danger) - /** - *

makeChumpBlocks.

- * - * @param combat a {@link forge.Combat} object. - * @return a {@link forge.Combat} object. - */ - private static Combat makeChumpBlocks(Combat combat) { - - CardList currentAttackers = new CardList(getAttackersLeft().toArray()); - CardList chumpBlockers; - - for (Card attacker : getAttackersLeft()) { - chumpBlockers = getPossibleBlockers(attacker, getBlockersLeft(), combat); - if (chumpBlockers.size() > 0 && CombatUtil.lifeInDanger(combat)) { - Card blocker = CardFactoryUtil.AI_getWorstCreature(chumpBlockers); - combat.addBlocker(attacker, blocker); - currentAttackers.remove(attacker); - getBlockedButUnkilled().add(attacker); - getBlockersLeft().remove(blocker); - } - } - setAttackersLeft(new CardList(currentAttackers.toArray())); - return combat; - } - - //Reinforce blockers blocking attackers with trample (should only be made if life is in danger) - /** - *

reinforceBlockersAgainstTrample.

- * - * @param combat a {@link forge.Combat} object. - * @return a {@link forge.Combat} object. - */ - private static Combat reinforceBlockersAgainstTrample(Combat combat) { - - CardList chumpBlockers; - - CardList tramplingAttackers = getAttackers().getKeyword("Trample"); - tramplingAttackers = tramplingAttackers.getKeywordsDontContain("Rampage"); //Don't make it worse - tramplingAttackers = tramplingAttackers.getKeywordsDontContain("CARDNAME can't be blocked by more than one creature."); - //TODO - should check here for a "rampage-like" trigger that replaced the keyword: - // "Whenever CARDNAME becomes blocked, it gets +1/+1 until end of turn for each creature blocking it." - - for (Card attacker : tramplingAttackers) { - chumpBlockers = getPossibleBlockers(attacker, getBlockersLeft(), combat); - for (Card blocker : chumpBlockers) { - //Add an additional blocker if the current blockers are not enough and the new one would suck some of the damage - if (CombatUtil.getAttack(attacker) > CombatUtil.totalShieldDamage(attacker, combat.getBlockers(attacker)) - && CombatUtil.shieldDamage(attacker, blocker) > 0 && CombatUtil.canBlock(attacker, blocker, combat) - && CombatUtil.lifeInDanger(combat)) { - combat.addBlocker(attacker, blocker); - getBlockersLeft().remove(blocker); - } - } - } - - return combat; - } - - //Support blockers not destroying the attacker with more blockers to try to kill the attacker - /** - *

reinforceBlockersToKill.

- * - * @param combat a {@link forge.Combat} object. - * @return a {@link forge.Combat} object. - */ - private static Combat reinforceBlockersToKill(Combat combat) { - - CardList safeBlockers; - CardList blockers; - CardList targetAttackers = getBlockedButUnkilled().getKeywordsDontContain("Rampage"); //Don't make it worse - targetAttackers = targetAttackers.getKeywordsDontContain("CARDNAME can't be blocked by more than one creature."); - //TODO - should check here for a "rampage-like" trigger that replaced the keyword: - // "Whenever CARDNAME becomes blocked, it gets +1/+1 until end of turn for each creature blocking it." - - for (Card attacker : targetAttackers) { - blockers = getPossibleBlockers(attacker, getBlockersLeft(), combat); - - //Try to use safe blockers first - safeBlockers = getSafeBlockers(attacker, blockers, combat); - for (Card blocker : safeBlockers) { - //Add an additional blocker if the current blockers are not enough and the new one would deal additional damage - if (attacker.getKillDamage() > CombatUtil.totalDamageOfBlockers(attacker, combat.getBlockers(attacker)) - && CombatUtil.dealsDamageAsBlocker(attacker, blocker) > 0 && CombatUtil.canBlock(attacker, blocker, combat)) { - combat.addBlocker(attacker, blocker); - getBlockersLeft().remove(blocker); - } - blockers.remove(blocker); //Don't check them again next - } - - //Try to add blockers that could be destroyed, but are worth less than the attacker - //Don't use blockers without First Strike or Double Strike if attacker has it - if (attacker.hasKeyword("First Strike") || attacker.hasKeyword("Double Strike")) { - safeBlockers = blockers.getKeyword("First Strike"); - safeBlockers.addAll(blockers.getKeyword("Double Strike")); - } else safeBlockers = new CardList(blockers.toArray()); - - for (Card blocker : safeBlockers) { - //Add an additional blocker if the current blockers are not enough and the new one would deal the remaining damage - int currentDamage = CombatUtil.totalDamageOfBlockers(attacker, combat.getBlockers(attacker)); - int additionalDamage = CombatUtil.dealsDamageAsBlocker(attacker, blocker); - if (attacker.getKillDamage() > currentDamage - && !(attacker.getKillDamage() > currentDamage + additionalDamage) - && CardFactoryUtil.evaluateCreature(blocker) + getDiff() < CardFactoryUtil.evaluateCreature(attacker) - && CombatUtil.canBlock(attacker, blocker, combat)) { - combat.addBlocker(attacker, blocker); - getBlockersLeft().remove(blocker); - } - } - } - - return combat; - } - - /** - *

resetBlockers.

- * - * @param combat a {@link forge.Combat} object. - * @param possibleBlockers a {@link forge.CardList} object. - * @return a {@link forge.Combat} object. - */ - private static Combat resetBlockers(Combat combat, CardList possibleBlockers) { - - CardList oldBlockers = combat.getAllBlockers(); - for (Card blocker : oldBlockers) { - combat.removeFromCombat(blocker); - } - - setAttackersLeft(new CardList(getAttackers().toArray())); //keeps track of all currently unblocked attackers - setBlockersLeft(new CardList(possibleBlockers.toArray())); //keeps track of all unassigned blockers - setBlockedButUnkilled(new CardList()); //keeps track of all blocked attackers that currently wouldn't be destroyed - - return combat; - } - - //Main function - /** - *

getBlockers.

- * - * @param originalCombat a {@link forge.Combat} object. - * @param possibleBlockers a {@link forge.CardList} object. - * @return a {@link forge.Combat} object. - */ - static public Combat getBlockers(Combat originalCombat, CardList possibleBlockers) { - - Combat combat = originalCombat; - - setAttackers(sortPotentialAttackers(combat)); - - if (getAttackers().size() == 0) - return combat; - - setAttackersLeft(new CardList(getAttackers().toArray())); //keeps track of all currently unblocked attackers - setBlockersLeft(new CardList(possibleBlockers.toArray())); //keeps track of all unassigned blockers - setBlockedButUnkilled(new CardList()); //keeps track of all blocked attackers that currently wouldn't be destroyed - CardList blockers; - CardList chumpBlockers; - - setDiff(AllZone.getComputerPlayer().getLife() * 2 - 5); //This is the minimal gain for an unnecessary trade - - // remove all attackers that can't be blocked anyway - for (Card a : getAttackers()) { - if (!CombatUtil.canBeBlocked(a)) { - getAttackersLeft().remove(a); - } - } - - // remove all blockers that can't block anyway - for (Card b : possibleBlockers) { - if (!CombatUtil.canBlock(b, combat)) getBlockersLeft().remove(b); - } - - if (getAttackersLeft().size() == 0) - return combat; - - //Begin with the weakest blockers - CardListUtil.sortAttackLowFirst(getBlockersLeft()); - - //== 1. choose best blocks first == - combat = makeGoodBlocks(combat); - combat = makeGangBlocks(combat); - if (CombatUtil.lifeInDanger(combat)) - combat = makeTradeBlocks(combat); //choose necessary trade blocks if life is in danger - if (CombatUtil.lifeInDanger(combat)) - combat = makeChumpBlocks(combat); //choose necessary chump blocks if life is still in danger - //Reinforce blockers blocking attackers with trample if life is still in danger - if (CombatUtil.lifeInDanger(combat)) combat = reinforceBlockersAgainstTrample(combat); - //Support blockers not destroying the attacker with more blockers to try to kill the attacker - if (!CombatUtil.lifeInDanger(combat)) combat = reinforceBlockersToKill(combat); - - - //== 2. If the AI life would still be in danger make a safer approach == - if (CombatUtil.lifeInDanger(combat)) { - combat = resetBlockers(combat, possibleBlockers); // reset every block assignment - combat = makeTradeBlocks(combat); //choose necessary trade blocks if life is in danger - combat = makeGoodBlocks(combat); - if (CombatUtil.lifeInDanger(combat)) - combat = makeChumpBlocks(combat); //choose necessary chump blocks if life is still in danger - //Reinforce blockers blocking attackers with trample if life is still in danger - if (CombatUtil.lifeInDanger(combat)) combat = reinforceBlockersAgainstTrample(combat); - combat = makeGangBlocks(combat); - combat = reinforceBlockersToKill(combat); - } - - //== 3. If the AI life would be in serious danger make an even safer approach == - if (CombatUtil.lifeInSeriousDanger(combat)) { - combat = resetBlockers(combat, possibleBlockers); // reset every block assignment - combat = makeChumpBlocks(combat); //choose chump blocks - if (CombatUtil.lifeInDanger(combat)) - combat = makeTradeBlocks(combat); //choose necessary trade blocks if life is in danger - if (!CombatUtil.lifeInDanger(combat)) combat = makeGoodBlocks(combat); - //Reinforce blockers blocking attackers with trample if life is still in danger - if (CombatUtil.lifeInDanger(combat)) combat = reinforceBlockersAgainstTrample(combat); - combat = makeGangBlocks(combat); - //Support blockers not destroying the attacker with more blockers to try to kill the attacker - combat = reinforceBlockersToKill(combat); - } - - // assign blockers that have to block - chumpBlockers = getBlockersLeft().getKeyword("CARDNAME blocks each turn if able."); - // if an attacker with lure attacks - all that can block - for (Card blocker : getBlockersLeft()) { - if (CombatUtil.canBlockAnAttackerWithLure(blocker, combat)) chumpBlockers.add(blocker); - } - if (!chumpBlockers.isEmpty()) { - getAttackers().shuffle(); - for (Card attacker : getAttackers()) { - blockers = getPossibleBlockers(attacker, chumpBlockers, combat); - for (Card blocker : blockers) { - if (CombatUtil.canBlock(attacker, blocker, combat)) { - combat.addBlocker(attacker, blocker); - getBlockersLeft().remove(blocker); - } - } - } - } - - return combat; - } -} diff --git a/src/forge/Constant.java b/src/forge/Constant.java deleted file mode 100644 index afb3f810da8..00000000000 --- a/src/forge/Constant.java +++ /dev/null @@ -1,166 +0,0 @@ -package forge; - - -import forge.deck.Deck; -import forge.quest.data.QuestMatchState; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - - -/** - *

Constant interface.

- * - * @author Forge - * @version $Id: $ - */ -public interface Constant { - /** Constant ProgramName="Forge - http://cardforge.org" */ - public static final String ProgramName = "Forge - http://cardforge.org"; - - //used to pass information between the GUI screens - public interface Runtime { - public static final Deck[] HumanDeck = new Deck[1]; - public static final Deck[] ComputerDeck = new Deck[1]; - public static final String[] GameType = new String[1]; - public static final QuestMatchState matchState = new QuestMatchState(); - public static final boolean[] Smooth = new boolean[1]; - public static final boolean[] Mill = new boolean[1]; - public static final boolean[] DevMode = new boolean[1]; // one for normal mode one for quest mode - - public static final boolean[] NetConn = new boolean[1]; - public static final boolean[] UpldDrft = new boolean[1]; - - public static final boolean[] RndCFoil = new boolean[1]; - - public static final int[] width = new int[1]; - public static final int[] height = new int[1]; - - public static final int[] stackSize = new int[1]; - public static final int[] stackOffset = new int[1]; - } - - public interface GameType { - public static final String Constructed = "constructed"; - public static final String Sealed = "sealed"; - public static final String Draft = "draft"; - public static final List GameTypes = Collections.unmodifiableList(Arrays.asList(Constructed, - Sealed, Draft)); - } - - //public interface IO { - // probably should read this from a file, or set from GUI - - //public static final String deckFile = "all-decks2"; - //public static final String boosterDeckFile = "booster-decks"; - - //public static final String imageBaseDir = "pics"; - - //public static final ImageIcon upIcon = new ImageIcon("up.gif"); - //public static final ImageIcon downIcon = new ImageIcon("down.gif"); - //public static final ImageIcon leftIcon = new ImageIcon("left.gif"); - //public static final ImageIcon rightIcon = new ImageIcon("right.gif"); - //} - - public interface Ability { - public static final String Triggered = "Triggered"; - public static final String Activated = "Activated"; - } - - public interface Phase { - public static final String Untap = "Untap"; - public static final String Upkeep = "Upkeep"; - public static final String Draw = "Draw"; - - public static final String Main1 = "Main1"; - - public static final String Combat_Begin = "BeginCombat"; - public static final String Combat_Declare_Attackers = "Declare Attackers"; - public static final String Combat_Declare_Attackers_InstantAbility = "Declare Attackers - Play Instants and Abilities"; - public static final String Combat_Declare_Blockers = "Declare Blockers"; - public static final String Combat_Declare_Blockers_InstantAbility = "Declare Blockers - Play Instants and Abilities"; - public static final String Combat_Damage = "Combat Damage"; - public static final String Combat_FirstStrikeDamage = "First Strike Damage"; - public static final String Combat_End = "EndCombat"; - - public static final String Main2 = "Main2"; - - public static final String End_Of_Turn = "End of Turn"; - public static final String Cleanup = "Cleanup"; - } - - public interface Zone { - public static final String Hand = "Hand"; - public static final String Library = "Library"; - public static final String Graveyard = "Graveyard"; - public static final String Battlefield = "Battlefield"; - public static final String Exile = "Exile"; - public static final String Command = "Command"; - public static final String Stack = "Stack"; - } - - public interface Color { - public static final String Black = "black"; - public static final String Blue = "blue"; - public static final String Green = "green"; - public static final String Red = "red"; - public static final String White = "white"; - - public static final String Colorless = "colorless"; - //color order "wubrg" - public static final String Colors[] = {White, Blue, Black, Red, Green, Colorless}; - public static final String onlyColors[] = {White, Blue, Black, Red, Green}; - - public static final String Snow = "snow"; - public static final String ManaColors[] = {White, Blue, Black, Red, Green, Colorless, Snow}; - - public static final boolean loaded[] = {false}; - //public static final Constant_StringHashMap[] LandColor = new Constant_StringHashMap[1]; - - public static final String BasicLands[] = {"Plains", "Island", "Swamp", "Mountain", "Forest"}; - } - - public interface Rarity { - public static final String Common = "Common"; - public static final String Uncommon = "Uncommon"; - public static final String Rare = "Rare"; - public static final String Mythic = "Mythic"; - public static final String Land = "Land"; - } - - public interface Quest { - public static final boolean[] fantasyQuest = new boolean[1]; - - //public static final Quest_Assignment[] qa = new Quest_Assignment[1]; - - public static final CardList[] humanList = new CardList[1]; - public static final CardList[] computerList = new CardList[1]; - - public static final int[] humanLife = new int[1]; - public static final int[] computerLife = new int[1]; - - public static final String[] oppIconName = new String[1]; - } - - public interface CardTypes { - public static final boolean loaded[] = {false}; - public static final Constant_StringArrayList cardTypes[] = new Constant_StringArrayList[1]; - public static final Constant_StringArrayList superTypes[] = new Constant_StringArrayList[1]; - public static final Constant_StringArrayList basicTypes[] = new Constant_StringArrayList[1]; - public static final Constant_StringArrayList landTypes[] = new Constant_StringArrayList[1]; - public static final Constant_StringArrayList creatureTypes[] = new Constant_StringArrayList[1]; - public static final Constant_StringArrayList instantTypes[] = new Constant_StringArrayList[1]; - public static final Constant_StringArrayList sorceryTypes[] = new Constant_StringArrayList[1]; - public static final Constant_StringArrayList enchantmentTypes[] = new Constant_StringArrayList[1]; - public static final Constant_StringArrayList artifactTypes[] = new Constant_StringArrayList[1]; - public static final Constant_StringArrayList walkerTypes[] = new Constant_StringArrayList[1]; - } - - public interface Keywords { - public static final boolean loaded[] = {false}; - public static final Constant_StringArrayList NonStackingList[] = new Constant_StringArrayList[1]; - } -}//Constant - - diff --git a/src/forge/CopyFiles.java b/src/forge/CopyFiles.java deleted file mode 100644 index 3775316ccf7..00000000000 --- a/src/forge/CopyFiles.java +++ /dev/null @@ -1,96 +0,0 @@ -package forge; - - -import forge.properties.ForgeProps; -import forge.properties.NewConstants; -import javax.swing.*; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.List; - - -/** - *

CopyFiles class.

- * - * @author Forge - * @version $Id: $ - */ -public class CopyFiles extends SwingWorker implements NewConstants { - - private List FileList; - JLabel jLb; - JProgressBar jB; - JCheckBox jCheck; - JButton jSource; - int count; - - /** - *

Constructor for CopyFiles.

- * - * @param FileList a {@link java.util.List} object. - * @param jLabelTotalFiles a {@link javax.swing.JLabel} object. - * @param Jbar a {@link javax.swing.JProgressBar} object. - * @param jCheckBox a {@link javax.swing.JCheckBox} object. - * @param jButtonSource a {@link javax.swing.JButton} object. - */ - public CopyFiles(List FileList, JLabel jLabelTotalFiles, JProgressBar Jbar, JCheckBox jCheckBox, JButton jButtonSource) { - this.FileList = FileList; - jLb = jLabelTotalFiles; - jB = Jbar; - jCheck = jCheckBox; - jSource = jButtonSource; - } - - /** {@inheritDoc} */ - @Override - protected Void doInBackground() { - for (int i = 0; i < this.FileList.size(); i++) { - publish(); - String cName, name, source; - name = this.FileList.get(i).getName(); - source = this.FileList.get(i).getAbsolutePath(); - cName = name.substring(0, name.length() - 8); - cName = GuiDisplayUtil.cleanString(cName) + ".jpg"; - File sourceFile = new File(source); - File base = ForgeProps.getFile(IMAGE_BASE); - File reciever = new File(base, cName); - reciever.delete(); - - try { - reciever.createNewFile(); - FileOutputStream fos = new FileOutputStream(reciever); - FileInputStream fis = new FileInputStream(sourceFile); - byte[] buff = new byte[32 * 1024]; - int length; - while (fis.available() > 0) { - length = fis.read(buff); - if (length > 0) fos.write(buff, 0, length); - } - fos.flush(); - fis.close(); - fos.close(); - count = i * 100 / this.FileList.size() + 1; - setProgress(count); - - } catch (IOException e1) { - e1.printStackTrace(); - } - - } - return null; - - } - - /** {@inheritDoc} */ - @Override - protected void done() { - jLb.setText("All files were copied successfully."); - jB.setIndeterminate(false); - jCheck.setEnabled(true); - jSource.setEnabled(true); - - } - -} diff --git a/src/forge/Counters.java b/src/forge/Counters.java deleted file mode 100644 index 60ce5e23b01..00000000000 --- a/src/forge/Counters.java +++ /dev/null @@ -1,138 +0,0 @@ -/** - * Counters.java - * - * Created on 17.02.2010 - */ - -package forge; - - -/** - * The class Counters. - * - * @author Clemens Koza - * @version V0.0 17.02.2010 - */ -public enum Counters { - AGE(), - ARROW(), - ARROWHEAD(), - AWAKENING(), - BLAZE(), - BLOOD(), - BOUNTY(), - BRIBERY(), - CARRION(), - CHARGE(), - CORPSE(), - CREDIT(), - CURRENCY(), - DEATH(), - DELAY(), - DEPLETION(), - DEVOTION(), - DIVINITY(), - DOOM(), - ENERGY(), - EON(), - FADE(), - FEATHER(), - FLOOD(), - FUSE(), - GLYPH(), - GOLD(), - GROWTH(), - HATCHLING(), - HEALING(), - HOOFPRINT(), - ICE(), - INFECTION(), - INTERVENTION(), - JAVELIN(), - KI(), - LEVEL(), - LORE(), - LOYALTY(), - LUCK(), - M0M1("-0/-1"), - M0M2("-0/-2"), - M1M0("-1/-0"), - M1M1("-1/-1"), - M2M1("-2/-1"), - M2M2("-2/-2"), - MANA(), - MINING(), - MIRE(), - OMEN(), - ORE(), - PAGE(), - PETAL(), - PIN(), - PLAGUE(), - PRESSURE(), - PHYLACTERY, - POLYP(), - PUPA(), - P0P1("+0/+1"), - P1P0("+1/+0"), - P1P1("+1/+1"), - P1P2("+1/+2"), - P2P2("+2/+2"), - QUEST(), - SCREAM(), - SHELL(), - SHIELD(), - SHRED(), - SLEEP(), - SLEIGHT(), - SOOT(), - SPORE(), - STORAGE(), - TIDE(), - TIME(), - TOWER("tower"), - TRAINING(), - TRAP(), - TREASURE(), - VERSE(), - VITALITY(), - WIND(), - WISH(); - - private String name; - - /** - *

Constructor for Counters.

- */ - private Counters() { - this.name = name().substring(0, 1).toUpperCase() + name().substring(1).toLowerCase(); - } - - /** - *

Constructor for Counters.

- * - * @param name a {@link java.lang.String} object. - */ - private Counters(String name) { - this.name = name; - } - - /** - *

Getter for the field name.

- * - * @return a {@link java.lang.String} object. - */ - public String getName() { - return name; - } - - /** - *

getType.

- * - * @param name a {@link java.lang.String} object. - * @return a {@link forge.Counters} object. - */ - public static Counters getType(String name) { - return Enum.valueOf(Counters.class, name.replace("/", "").replaceAll("\\+", "p").replaceAll("\\-", "m").toUpperCase()); - } -} diff --git a/src/forge/DefaultPlayerZone.java b/src/forge/DefaultPlayerZone.java deleted file mode 100644 index d2b79e766f9..00000000000 --- a/src/forge/DefaultPlayerZone.java +++ /dev/null @@ -1,320 +0,0 @@ -package forge; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Observable; - -/** - *

DefaultPlayerZone class.

- * - * @author Forge - * @version $Id: $ - */ -public class DefaultPlayerZone extends PlayerZone implements java.io.Serializable { - /** Constant serialVersionUID=-5687652485777639176L */ - private static final long serialVersionUID = -5687652485777639176L; - - private ArrayList cards = new ArrayList(); - private String zoneName; - private Player player; - private boolean update = true; - - private CardList cardsAddedThisTurn = new CardList(); - private ArrayList cardsAddedThisTurnSource = new ArrayList(); - - /** - *

Constructor for DefaultPlayerZone.

- * - * @param zone a {@link java.lang.String} object. - * @param inPlayer a {@link forge.Player} object. - */ - public DefaultPlayerZone(String zone, Player inPlayer) { - zoneName = zone; - player = inPlayer; - } - - //************ BEGIN - these methods fire updateObservers() ************* - - /** - * - * @param o a {@link java.lang.Object} object. - */ - public void add(Object o) { - Card c = (Card) o; - - if (!c.isImmutable()) //Immutable cards are usually emblems,effects and the mana pool and we don't want to log those. - { - cardsAddedThisTurn.add(c); - if (AllZone.getZone(c) != null) { - cardsAddedThisTurnSource.add(AllZone.getZone(c).getZoneName()); - } else { - cardsAddedThisTurnSource.add("None"); - } - } - - if (is("Graveyard") - && c.hasKeyword("When CARDNAME is put into a graveyard from anywhere, reveal CARDNAME and shuffle it into its owner's library instead.")) { - PlayerZone lib = AllZone.getZone(Constant.Zone.Library, c.getOwner()); - lib.add(c); - c.getOwner().shuffle(); - return; - } - //slight difference from above I guess, the card gets put into the grave first, then shuffled into library. - //key is that this would trigger abilities that trigger on cards hitting the graveyard - else if (is("Graveyard") - && c.hasKeyword("When CARDNAME is put into a graveyard from anywhere, shuffle it into its owner's library.")) { - PlayerZone lib = AllZone.getZone(Constant.Zone.Library, c.getOwner()); - PlayerZone grave = AllZone.getZone(Constant.Zone.Graveyard, c.getOwner()); - - grave.addOnce(c); - grave.remove(c); - lib.add(c); - c.getOwner().shuffle(); - return; - } - - - if (is("Graveyard") - && c.hasKeyword("When CARDNAME is put into a graveyard from anywhere, reveal CARDNAME and its owner shuffles his or her graveyard into his or her library.")) { - PlayerZone lib = AllZone.getZone(Constant.Zone.Library, c.getOwner()); - PlayerZone grave = AllZone.getZone(Constant.Zone.Graveyard, c.getOwner()); - lib.add(c); - for (Card gc : AllZoneUtil.getPlayerGraveyard(c.getOwner())) - lib.add(gc); - grave.reset(); - c.getOwner().shuffle(); - return; - } - - if (c.isUnearthed() && (is("Graveyard") || is("Hand") || is("Library"))) { - PlayerZone removed = AllZone.getZone(Constant.Zone.Exile, c.getOwner()); - removed.add(c); - c.setUnearthed(false); - return; - } - - - c.addObserver(this); - - c.setTurnInZone(AllZone.getPhase().getTurn()); - - cards.add((Card) c); - update(); - } - - //hack... use for adding Dread / Serra Avenger to grave - - /** - * - * @param o a {@link java.lang.Object} object. - */ - public void addOnce(Object o) { - Card c = (Card) o; - - if (!c.isImmutable()) //Immutable cards are usually emblems,effects and the mana pool and we don't want to log those. - { - cardsAddedThisTurn.add(c); - if (AllZone.getZone(c) != null) { - cardsAddedThisTurnSource.add(AllZone.getZone(c).getZoneName()); - } else { - cardsAddedThisTurnSource.add("None"); - } - } - - c.addObserver(this); - - cards.add((Card) c); - update(); - } - - /** - * - * @param ob - * @param object - */ - public void update(Observable ob, Object object) { - this.update(); - } - - /** - * - * @param c a {@link forge.Card} object. - * @param index a int. - */ - public void add(Card c, int index) { - if (!c.isImmutable()) //Immutable cards are usually emblems,effects and the mana pool and we don't want to log those. - { - cardsAddedThisTurn.add(c); - if (AllZone.getZone(c) != null) { - cardsAddedThisTurnSource.add(AllZone.getZone(c).getZoneName()); - } else { - cardsAddedThisTurnSource.add("None"); - } - } - - cards.add(index, c); - c.setTurnInZone(AllZone.getPhase().getTurn()); - update(); - } - - /** - * - * @param c - */ - public void remove(Object c) { - cards.remove((Card) c); - update(); - } - - /** - *

Setter for the field cards.

- * - * @param c an array of {@link forge.Card} objects. - */ - public void setCards(Card c[]) { - cards = new ArrayList(Arrays.asList(c)); - update(); - } - - //removes all cards - /** - *

reset.

- */ - public void reset() { - cardsAddedThisTurn.clear(); - cardsAddedThisTurnSource.clear(); - cards.clear(); - update(); - } - //************ END - these methods fire updateObservers() ************* - - /** - * - * @param zone a {@link java.lang.String} object. - * @return a boolean - */ - public boolean is(String zone) { - return zone.equals(zoneName); - } - - /** - * - * @param zone a {@link java.lang.String} object. - * @param player a {@link forge.Player} object. - * @return a boolean - */ - public boolean is(String zone, Player player) { - return (zone.equals(zoneName) && player.isPlayer(player)); - } - - /** - *

Getter for the field player.

- * - * @return a {@link forge.Player} object. - */ - public Player getPlayer() { - return player; - } - - /** - *

Getter for the field zoneName.

- * - * @return a {@link java.lang.String} object. - */ - public String getZoneName() { - return zoneName; - } - - /** - *

size.

- * - * @return a int. - */ - public int size() { - return cards.size(); - } - - /** - * - * @param index a int. - * @return a int - */ - public Card get(int index) { - return (Card) cards.get(index); - } - - /** - *

Getter for the field cards.

- * - * @return an array of {@link forge.Card} objects. - */ - public Card[] getCards() { - Card c[] = new Card[cards.size()]; - cards.toArray(c); - return c; - } - - /** - *

update.

- */ - public void update() { - if (update) - updateObservers(); - } - - /** - * - * @param b a boolean. - */ - public void setUpdate(boolean b) { - update = b; - } - - /** - *

Getter for the field update.

- * - * @return a boolean. - */ - public boolean getUpdate() { - return update; - } - - /** - *

toString.

- * - * @return a {@link java.lang.String} object. - */ - public String toString() { - StringBuilder sb = new StringBuilder(); - if (player != null) - sb.append(player.toString()).append(" "); - sb.append(zoneName); - return sb.toString(); - } - - /** - *

Getter for the field cardsAddedThisTurn.

- * - * @param origin a {@link java.lang.String} object. - * @return a {@link forge.CardList} object. - */ - public CardList getCardsAddedThisTurn(String origin) { - System.out.print("Request cards put into " + getZoneName() + " from " + origin + ".Amount: "); - CardList ret = new CardList(); - for (int i = 0; i < cardsAddedThisTurn.size(); i++) { - if (origin.equals(cardsAddedThisTurnSource.get(i)) || origin.equals("Any")) { - ret.add(cardsAddedThisTurn.get(i)); - } - } - System.out.println(ret.size()); - return ret; - } - - /** - *

resetCardsAddedThisTurn.

- */ - public void resetCardsAddedThisTurn() { - cardsAddedThisTurn.clear(); - cardsAddedThisTurnSource.clear(); - } -} diff --git a/src/forge/Display.java b/src/forge/Display.java deleted file mode 100644 index 0567facfc12..00000000000 --- a/src/forge/Display.java +++ /dev/null @@ -1,95 +0,0 @@ -package forge; - - -/** - *

Display interface.

- * - * @author Forge - * @version $Id: $ - */ -public interface Display { - /** - *

showMessage.

- * - * @param s a {@link java.lang.String} object. - */ - public void showMessage(String s); - - /** - *

getButtonOK.

- * - * @return a {@link forge.MyButton} object. - */ - public MyButton getButtonOK(); - - /** - *

getButtonCancel.

- * - * @return a {@link forge.MyButton} object. - */ - public MyButton getButtonCancel(); - - // public void showStatus(String message); - /** - *

showCombat.

- * - * @param message a {@link java.lang.String} object. - */ - public void showCombat(String message); - - /** - *

setVisible.

- * - * @param b a boolean. - */ - public void setVisible(boolean b); - - //assigns combat damage, used by Combat.setAssignedDamage() - /** - *

assignDamage.

- * - * @param attacker a {@link forge.Card} object. - * @param blockers a {@link forge.CardList} object. - * @param damage a int. - */ - public void assignDamage(Card attacker, CardList blockers, int damage); - //public void addAssignDamage(Card attacker, Card blocker, int damage); - //public void addAssignDamage(Card attacker, int damage); - - /** - *

stopAtPhase.

- * - * @param turn a {@link forge.Player} object. - * @param phase a {@link java.lang.String} object. - * @return a boolean. - */ - public boolean stopAtPhase(Player turn, String phase); - - /** - *

loadPrefs.

- * - * @return a boolean. - */ - public boolean loadPrefs(); - - /** - *

savePrefs.

- * - * @return a boolean. - */ - public boolean savePrefs(); - - /** - *

canLoseByDecking.

- * - * @return a boolean. - */ - public boolean canLoseByDecking(); - - /** - *

setCard.

- * - * @param c a {@link forge.Card} object. - */ - public void setCard(Card c); -} diff --git a/src/forge/EndOfCombat.java b/src/forge/EndOfCombat.java deleted file mode 100644 index aa1b3aa46e5..00000000000 --- a/src/forge/EndOfCombat.java +++ /dev/null @@ -1,81 +0,0 @@ -package forge; - -//handles "until end of combat" and "at end of combat" commands from cards -/** - *

EndOfCombat class.

- * - * @author Forge - * @version $Id: $ - */ -public class EndOfCombat implements java.io.Serializable { - - /** Constant serialVersionUID=3035250030566186842L */ - private static final long serialVersionUID = 3035250030566186842L; - - private CommandList at = new CommandList(); - private CommandList until = new CommandList(); - - /** - *

addAt.

- * - * @param c a {@link forge.Command} object. - */ - public void addAt(Command c) { - at.add(c); - } - - /** - *

addUntil.

- * - * @param c a {@link forge.Command} object. - */ - public void addUntil(Command c) { - until.add(c); - } - - /** - *

executeAt.

- */ - public void executeAt() { - //AllZone.getStateBasedEffects().rePopulateStateBasedList(); - execute(at); - }//executeAt() - - - /** - *

executeUntil.

- */ - public void executeUntil() { - execute(until); - } - - /** - *

sizeAt.

- * - * @return a int. - */ - public int sizeAt() { - return at.size(); - } - - /** - *

sizeUntil.

- * - * @return a int. - */ - public int sizeUntil() { - return until.size(); - } - - /** - *

execute.

- * - * @param c a {@link forge.CommandList} object. - */ - private void execute(CommandList c) { - int length = c.size(); - - for (int i = 0; i < length; i++) - c.remove(0).execute(); - } -} diff --git a/src/forge/EndOfTurn.java b/src/forge/EndOfTurn.java deleted file mode 100644 index e03f60ef832..00000000000 --- a/src/forge/EndOfTurn.java +++ /dev/null @@ -1,292 +0,0 @@ -package forge; - -import forge.card.spellability.Ability; -import forge.card.spellability.SpellAbility; - -//handles "until end of turn" and "at end of turn" commands from cards -/** - *

EndOfTurn class.

- * - * @author Forge - * @version $Id: $ - */ -public class EndOfTurn implements java.io.Serializable { - /** Constant serialVersionUID=-3656715295379727275L */ - private static final long serialVersionUID = -3656715295379727275L; - - private CommandList at = new CommandList(); - private CommandList until = new CommandList(); - private CommandList last = new CommandList(); - - /** - *

addAt.

- * - * @param c a {@link forge.Command} object. - */ - public void addAt(Command c) { - at.add(c); - } - - /** - *

addUntil.

- * - * @param c a {@link forge.Command} object. - */ - public void addUntil(Command c) { - until.add(c); - } - - /** - *

addLast.

- * - * @param c a {@link forge.Command} object. - */ - public void addLast(Command c) { - last.add(c); - } - - /** - *

executeAt.

- */ - public void executeAt() { - - //Pyrohemia and Pestilence - CardList all = AllZoneUtil.getCardsInPlay(); - - GameActionUtil.endOfTurn_Predatory_Advantage(); - GameActionUtil.endOfTurn_Wall_Of_Reverence(); - GameActionUtil.endOfTurn_Lighthouse_Chronologist(); - - //reset mustAttackEntity for me - AllZone.getPhase().getPlayerTurn().setMustAttackEntity(null); - - GameActionUtil.removeAttackedBlockedThisTurn(); - AllZone.getGameInfo().setPreventCombatDamageThisTurn(false); - - AllZone.getStaticEffects().rePopulateStateBasedList(); - - for (Card c : all) { - if (!c.isFaceDown() - && c.hasKeyword("At the beginning of the end step, sacrifice CARDNAME.")) { - final Card card = c; - final SpellAbility sac = new Ability(card, "0") { - @Override - public void resolve() { - if (AllZoneUtil.isCardInPlay(card)) AllZone.getGameAction().sacrifice(card); - } - }; - StringBuilder sb = new StringBuilder(); - sb.append("Sacrifice ").append(card); - sac.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(sac); - - } - if (!c.isFaceDown() - && c.hasKeyword("At the beginning of the end step, exile CARDNAME.")) { - final Card card = c; - final SpellAbility exile = new Ability(card, "0") { - @Override - public void resolve() { - if (AllZoneUtil.isCardInPlay(card)) AllZone.getGameAction().exile(card); - } - }; - StringBuilder sb = new StringBuilder(); - sb.append("Exile ").append(card); - exile.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(exile); - - } - if (!c.isFaceDown() - && c.hasKeyword("At the beginning of the end step, destroy CARDNAME.")) { - final Card card = c; - final SpellAbility destroy = new Ability(card, "0") { - @Override - public void resolve() { - if (AllZoneUtil.isCardInPlay(card)) AllZone.getGameAction().destroy(card); - } - }; - StringBuilder sb = new StringBuilder(); - sb.append("Destroy ").append(card); - destroy.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(destroy); - - } - //Berserk is using this, so don't check isFaceDown() - if (c.hasKeyword("At the beginning of the next end step, destroy CARDNAME if it attacked this turn.")) { - if (c.getCreatureAttackedThisTurn()) { - final Card card = c; - final SpellAbility sac = new Ability(card, "0") { - @Override - public void resolve() { - if (AllZoneUtil.isCardInPlay(card)) AllZone.getGameAction().destroy(card); - } - }; - StringBuilder sb = new StringBuilder(); - sb.append("Destroy ").append(card); - sac.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(sac); - - } else { - c.removeExtrinsicKeyword("At the beginning of the next end step, destroy CARDNAME if it attacked this turn."); - } - } - if (c.hasKeyword("An opponent gains control of CARDNAME at the beginning of the next end step.")) { - final Card vale = c; - final SpellAbility change = new Ability(vale, "0") { - @Override - public void resolve() { - if (AllZoneUtil.isCardInPlay(vale)) { - AllZone.getGameAction().changeController(new CardList(vale), vale.getController(), vale.getController().getOpponent()); - - vale.removeExtrinsicKeyword("An opponent gains control of CARDNAME at the beginning of the next end step."); - } - } - }; - StringBuilder sb = new StringBuilder(); - sb.append(vale.getName()).append(" changes controllers."); - change.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(change); - - } - if (c.getName().equals("Erg Raiders") && !c.getCreatureAttackedThisTurn() && - !c.isSick() && AllZone.getPhase().isPlayerTurn(c.getController())) { - final Card raider = c; - final SpellAbility change = new Ability(raider, "0") { - @Override - public void resolve() { - if (AllZoneUtil.isCardInPlay(raider)) { - raider.getController().addDamage(2, raider); - } - } - }; - StringBuilder sb = new StringBuilder(); - sb.append(raider).append(" deals 2 damage to controller."); - change.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(change); - - } - if (c.hasKeyword("At the beginning of your end step, sacrifice this creature unless it attacked this turn.") - && !c.getCreatureAttackedThisTurn() - /* && !(c.getTurnInZone() == AllZone.getPhase().getTurn())*/ - && AllZone.getPhase().isPlayerTurn(c.getController())) { - final Card source = c; - final SpellAbility change = new Ability(source, "0") { - @Override - public void resolve() { - if (AllZoneUtil.isCardInPlay(source)) { - AllZone.getGameAction().sacrifice(source); - } - } - }; - StringBuilder sb = new StringBuilder(); - sb.append(source.getName()).append(" - sacrifice ").append(source.getName()).append("."); - change.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(change); - - } - if (c.hasKeyword("At the beginning of your end step, destroy this creature if it didn't attack this turn.") - && !c.getCreatureAttackedThisTurn() - && AllZone.getPhase().isPlayerTurn(c.getController())) { - final Card source = c; - final SpellAbility change = new Ability(source, "0") { - @Override - public void resolve() { - if (AllZoneUtil.isCardInPlay(source)) { - AllZone.getGameAction().destroy(source); - } - } - }; - StringBuilder sb = new StringBuilder(); - sb.append(source.getName()).append(" - destroy ").append(source.getName()).append("."); - change.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(change); - - } - if (c.hasKeyword("At the beginning of your end step, return CARDNAME to its owner's hand.") - && AllZone.getPhase().isPlayerTurn(c.getController())) { - final Card source = c; - final SpellAbility change = new Ability(source, "0") { - @Override - public void resolve() { - if (AllZoneUtil.isCardInPlay(source)) { - AllZone.getGameAction().moveToHand(source); - } - } - }; - StringBuilder sb = new StringBuilder(); - sb.append(source).append(" - At the beginning of your end step, return CARDNAME to its owner's hand."); - change.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(change); - - } - - } - - - execute(at); - - - CardList all2 = AllZoneUtil.getCardsInPlay(); - for (Card c : all2) { - if (c.getCreatureAttackedThisTurn()) c.setCreatureAttackedThisTurn(false); - } - - }//executeAt() - - - /** - *

executeUntil.

- */ - public void executeUntil() { - execute(until); - execute(last); - } - - /** - *

sizeAt.

- * - * @return a int. - */ - public int sizeAt() { - return at.size(); - } - - /** - *

sizeUntil.

- * - * @return a int. - */ - public int sizeUntil() { - return until.size(); - } - - /** - *

sizeLast.

- * - * @return a int. - */ - public int sizeLast() { - return last.size(); - } - - /** - *

execute.

- * - * @param c a {@link forge.CommandList} object. - */ - private void execute(CommandList c) { - int length = c.size(); - - for (int i = 0; i < length; i++) - c.remove(0).execute(); - } -} diff --git a/src/forge/ExternalPanel.java b/src/forge/ExternalPanel.java deleted file mode 100644 index b6697877a0a..00000000000 --- a/src/forge/ExternalPanel.java +++ /dev/null @@ -1,105 +0,0 @@ -package forge; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; - - -/** - * ExternalPanel.java - * - * Created on 13.08.2009 - */ - - -/** - * The class ExternalPanel. A panel with which some other component can be shown in an external window. - * - * @author Clemens Koza - * @version V0.0 13.08.2009 - */ -public class ExternalPanel extends JPanel { - - /** Constant serialVersionUID=9098962430872706173L */ - private static final long serialVersionUID = 9098962430872706173L; - private Component child, head; - private JFrame frame; - - /** - *

Constructor for ExternalPanel.

- * - * @param child a {@link java.awt.Component} object. - */ - public ExternalPanel(Component child) { - this(child, BorderLayout.EAST); - } - - /** - *

Constructor for ExternalPanel.

- * - * @param child a {@link java.awt.Component} object. - * @param side a {@link java.lang.String} object. - */ - public ExternalPanel(Component child, String side) { - super(new BorderLayout()); - add(this.child = child); - JButton b = new JButton(); - b.setPreferredSize(new Dimension(6, 6)); - b.setToolTipText("Click to move component into an extra Window"); - b.addActionListener(new ExternListener()); - head = b; - setHeadSide(side); - } - - /** - *

setHeadSide.

- * - * @param side a {@link java.lang.String} object. - */ - public void setHeadSide(String side) { - remove(head); - add(head, side); - } - - /** {@inheritDoc} */ - @Override - protected void addImpl(Component comp, Object constraints, int index) { - if (comp != child && comp != head) throw new IllegalArgumentException(); - super.addImpl(comp, constraints, index); - } - - private final class ExternListener extends WindowAdapter implements ActionListener { - private void bringOut() { - frame = new JFrame(); - frame.addWindowListener(this); - frame.addWindowStateListener(this); - frame.add(child); - frame.getRootPane().setPreferredSize(child.getSize()); - frame.pack(); - frame.setVisible(true); - validate(); - repaint(); - } - - private void bringIn() { - add(child); - frame.dispose(); - frame = null; - validate(); - repaint(); - } - - public void actionPerformed(ActionEvent e) { - if (frame == null) bringOut(); - else bringIn(); - } - - @Override - public void windowClosing(WindowEvent e) { - bringIn(); - } - } -} diff --git a/src/forge/FileFinder.java b/src/forge/FileFinder.java deleted file mode 100644 index ed84cdd19ec..00000000000 --- a/src/forge/FileFinder.java +++ /dev/null @@ -1,185 +0,0 @@ -package forge; - -import java.io.File; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - *

FileFinder class.

- * - * @author Forge - * @version $Id: $ - */ -public class FileFinder { - - private Pattern p = null; - private Matcher m = null; - private long totalLength = 0; - private int filesNumber = 0; - private long directoriesNumber = 0; - /** Constant FILES=0 */ - private static final int FILES = 0; - /** Constant DIRECTORIES=1 */ - private static final int DIRECTORIES = 1; - private ArrayList fileNames; - private ArrayList fName; - - - /** - *

Constructor for FileFinder.

- */ - public FileFinder() { - } - - /** - *

findFiles.

- * - * @param startPath a {@link java.lang.String} object. - * @param mask a {@link java.lang.String} object. - * @return a {@link java.util.List} object. - * @throws java.lang.Exception if any. - */ - public List findFiles(String startPath, String mask) - throws Exception { - fileNames = new ArrayList(); - fName = new ArrayList(); - return findWithFull(startPath, mask, FILES); - } - - - /** - *

getDirectorySize.

- * - * @return a long. - */ - public long getDirectorySize() { - return totalLength; - } - - /** - *

Getter for the field filesNumber.

- * - * @return a int. - */ - public int getFilesNumber() { - return filesNumber; - } - - /** - *

Getter for the field directoriesNumber.

- * - * @return a long. - */ - public long getDirectoriesNumber() { - return directoriesNumber; - } - - /** - *

accept.

- * - * @param name a {@link java.lang.String} object. - * @return a boolean. - */ - private boolean accept(String name) { - - if (p == null) { - - return true; - } - - m = p.matcher(name); - - if (m.matches()) { - return true; - } else { - return false; - } - } - - - /** - *

findWithFull.

- * - * @param startPath a {@link java.lang.String} object. - * @param mask a {@link java.lang.String} object. - * @param objectType a int. - * @return a {@link java.util.List} object. - * @throws java.lang.Exception if any. - */ - private List findWithFull(String startPath, String mask, int objectType) throws Exception { - - if (startPath == null || mask == null) { - throw new Exception("Error"); - } - File topDirectory = new File(startPath); - if (!topDirectory.exists()) { - throw new Exception("Error"); - } - - if (!mask.equals("")) { - p = Pattern.compile(mask, - Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE); - } - filesNumber = 0; - directoriesNumber = 0; - totalLength = 0; - ArrayList res = new ArrayList(100); - - searchWithFull(topDirectory, res, objectType); - p = null; - return res; - } - - - /** - *

searchWithFull.

- * - * @param topDirectory a {@link java.io.File} object. - * @param res a {@link java.util.List} object. - * @param objectType a int. - */ - private void searchWithFull(File topDirectory, List res, int objectType) { - - File[] list = topDirectory.listFiles(); - - for (int i = 0; i < list.length; i++) { - - if (list[i].isDirectory()) { - - if (objectType != FILES && accept(list[i].getName())) { - - directoriesNumber++; - res.add(list[i]); - } - - searchWithFull(list[i], res, objectType); - } else { - - if (objectType != DIRECTORIES && accept(list[i].getName())) { - if (list[i].getName().contains("full")) { - if (fileNames.size() == 0) { - fileNames.add(list[i].getName()); - filesNumber++; - totalLength += list[i].length(); - res.add(list[i]); - } - fName.add(list[i].getName()); - if (fileNames.size() >= 1) { - if (Collections.indexOfSubList(fileNames, fName) == -1) { - fileNames.add(list[i].getName()); - filesNumber++; - totalLength += list[i].length(); - res.add(list[i]); - } - fName.remove(0); - } - } - } - } - } - } - -} diff --git a/src/forge/FileUtil.java b/src/forge/FileUtil.java deleted file mode 100644 index 3bc01678492..00000000000 --- a/src/forge/FileUtil.java +++ /dev/null @@ -1,104 +0,0 @@ -package forge; - -import forge.error.ErrorViewer; - -import java.io.*; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - - -/** - *

FileUtil class.

- * - * @author Forge - * @version $Id: $ - */ -public class FileUtil { - /** - *

doesFileExist.

- * - * @param filename a {@link java.lang.String} object. - * @return a boolean. - */ - public static boolean doesFileExist(String filename) { - File f = new File(filename); - return f.exists(); - } - - /** - *

writeFile.

- * - * @param filename a {@link java.lang.String} object. - * @param data a {@link java.util.List} object. - */ - public static void writeFile(String filename, List data) { - writeFile(new File(filename), data); - } - - //writes each element of ArrayList on a separate line - //this is used to write a file of Strings - //this will create a new file if needed - //if filename already exists, it is deleted - /** - *

writeFile.

- * - * @param file a {@link java.io.File} object. - * @param data a {@link java.util.List} object. - */ - public static void writeFile(File file, List data) { - try { - Collections.sort(data); - - BufferedWriter io = new BufferedWriter(new FileWriter(file)); - for (int i = 0; i < data.size(); i++) - io.write(data.get(i) + "\r\n"); - - io.flush(); - io.close(); - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("FileUtil : writeFile() error, problem writing file - " + file + " : " + ex); - } - }//writeAllDecks() - - /** - *

readFile.

- * - * @param filename a {@link java.lang.String} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList readFile(String filename) { - return readFile(new File(filename)); - } - - //reads line by line and adds each line to the ArrayList - //this will return blank lines as well - //if filename not found, returns an empty ArrayList - /** - *

readFile.

- * - * @param file a {@link java.io.File} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList readFile(File file) { - ArrayList list = new ArrayList(); - BufferedReader in; - - try { - if (file == null || !file.exists()) return list; - - - in = new BufferedReader(new FileReader(file)); - - String line; - while ((line = in.readLine()) != null) - list.add(line); - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("FileUtil : readFile() error, " + ex); - } - - return list; - }//readFile() -} diff --git a/src/forge/GUI_DeckAnalysis.java b/src/forge/GUI_DeckAnalysis.java deleted file mode 100644 index 73d2e5934c5..00000000000 --- a/src/forge/GUI_DeckAnalysis.java +++ /dev/null @@ -1,1344 +0,0 @@ -package forge; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.event.ActionEvent; -import java.awt.event.MouseEvent; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.math.BigDecimal; -import java.util.Arrays; - -import javax.swing.BorderFactory; -import javax.swing.DefaultComboBoxModel; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JSeparator; -import javax.swing.JTable; -import javax.swing.ListModel; -import javax.swing.SwingConstants; -import javax.swing.border.BevelBorder; -import javax.swing.event.MouseInputAdapter; -import javax.swing.table.DefaultTableModel; - -import net.miginfocom.swing.MigLayout; - -/** - * This code was edited or generated using CloudGarden's Jigloo SWT/Swing GUI - * Builder, which is free for non-commercial use. If Jigloo is being used - * commercially (ie, by a corporation, company or business for any purpose - * whatever) then you should purchase a license for each developer using Jigloo. - * Please visit www.cloudgarden.com for details. Use of Jigloo implies - * acceptance of these licensing terms. A COMMERCIAL LICENSE HAS NOT BEEN - * PURCHASED FOR THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED LEGALLY FOR - * ANY CORPORATE OR COMMERCIAL PURPOSE. - * - * @author Forge - * @version $Id: $ - */ -public class GUI_DeckAnalysis extends javax.swing.JDialog { - - /** Constant serialVersionUID=-8475271235196182185L */ - private static final long serialVersionUID = -8475271235196182185L; - private JPanel jPanel1; - private JLabel jLabelColorless; - private JLabel jLabelMultiColor; - private JLabel jLabelWhite; - private JLabel jLabelSixMana; - private JLabel jLabelFiveMana; - private JLabel jLabelFourMana; - private JLabel jLabelThreeMana; - private JLabel jLabel1; - private JScrollPane jScrollPane1; - private JTable jTable1; - private JPanel jPanel5; - private JButton jButtonRegenerate; - private JLabel jLabel4; - private JSeparator jSeparator4; - private JPanel jPanel4; - private JList jListFirstHand; - private JLabel jLabelTwoMana; - private JLabel jLabelOneMana; - private JLabel jLabelManaCost; - private JSeparator jSeparator3; - private JLabel jLabelZeroMana; - private JPanel jPanel3; - private JLabel jLabelSorcery; - private JLabel jLabelPlaneswalker; - private JLabel jLabelRed; - private JLabel jLabelGreen; - private JLabel jLabelBlue; - private JLabel jLabelBlack; - private JLabel jLabelEnchant; - private JLabel jLabelLandType; - private JLabel jLabelInstant; - private JLabel jLabelCreature; - private JLabel jLabel3; - private JSeparator jSeparator2; - private JLabel jLabelArtifact; - private JPanel jPanel2; - private JLabel jLabelTotal; - private JLabel jLabelLand; - private JSeparator jSeparator1; - private JLabel jLabel2; - private JButton jButtonOk; - private JFrame jF; - // private ButtonGroup buttonGroup1; - - public CardList filterCardList; - public TableModel tModel; - - /** - *

- * Constructor for GUI_DeckAnalysis. - *

- * - * @param g - * a {@link javax.swing.JFrame} object. - * @param tb - * a {@link forge.TableModel} object. - */ - public GUI_DeckAnalysis(JFrame g, TableModel tb) { - super(g); - tModel = tb; - - jF = g; - initGUI(); - } - - /** - *

- * initGUI. - *

- */ - private void initGUI() { - try { - - getContentPane().setLayout(null); - setVisible(true); - int wWidth = 600; - int wHeight = 600; - this.setPreferredSize(new java.awt.Dimension(wWidth, wHeight)); - - Dimension screen = getToolkit().getScreenSize(); - int x = (screen.width - wWidth) / 2; - int y = (screen.height - wHeight) / 2; - this.setBounds(x, y, wWidth, wHeight); - this.setResizable(false); - this.setTitle("Deck Analysis"); - pack(); - // this.setIconImage(null); - - this.addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent arg0) { - jF.setEnabled(true); - } - - @Override - public void windowOpened(WindowEvent arg0) { - - int cBlack, cBlue, cGreen, cRed, cWhite, cMulticolor, cColorless, cLand; - int cArtifact, cCreature, cEnchant, cInstant, cLandType, cPlaneswalker, cSorcery; - int mZero, mOne, mTwo, mThree, mFour, mFive, mSixMore; - float tManaCost; - Card c; - cBlack = 0; - cBlue = 0; - cGreen = 0; - cRed = 0; - cWhite = 0; - cMulticolor = 0; - cColorless = 0; - cLand = 0; - cArtifact = 0; - cCreature = 0; - cEnchant = 0; - cInstant = 0; - cLandType = 0; - cPlaneswalker = 0; - cSorcery = 0; - mZero = 0; - mOne = 0; - mTwo = 0; - mThree = 0; - mFour = 0; - mFive = 0; - mSixMore = 0; - tManaCost = 0; - CardList cList; - cList = tModel.getCards(); - for (int i = 0; i < cList.size(); i++) { - c = cList.getCard(i); - if (CardUtil.getColors(c).size() > 1) { - cMulticolor = cMulticolor + 1; - } else { - if (CardUtil.getColors(c).contains(Constant.Color.Black)) { - cBlack = cBlack + 1; - } - if (CardUtil.getColors(c).contains(Constant.Color.Blue)) { - cBlue = cBlue + 1; - } - if (CardUtil.getColors(c).contains(Constant.Color.Green)) { - cGreen = cGreen + 1; - } - if (CardUtil.getColors(c).contains(Constant.Color.Red)) { - cRed = cRed + 1; - } - if (CardUtil.getColors(c).contains(Constant.Color.White)) { - cWhite = cWhite + 1; - } - if (CardUtil.getColors(c).contains(Constant.Color.Colorless)) { - if (c.isLand()) { - cLand = cLand + 1; - } else { - cColorless = cColorless + 1; - } - } - } - - } - - for (int i = 0; i < cList.size(); i++) { - c = cList.getCard(i); - if (c.isArtifact()) { - cArtifact = cArtifact + 1; - } - if (c.isCreature()) { - cCreature = cCreature + 1; - } - if (c.isEnchantment()) { - cEnchant = cEnchant + 1; - } - if (c.isInstant()) { - cInstant = cInstant + 1; - } - if (c.isLand()) { - cLandType = cLandType + 1; - } - if (c.isPlaneswalker()) { - cPlaneswalker = cPlaneswalker + 1; - } - if (c.isSorcery()) { - cSorcery = cSorcery + 1; - } - } - - for (int i = 0; i < cList.size(); i++) { - c = cList.getCard(i); - if (CardUtil.getConvertedManaCost(c.getManaCost()) == 0) { - mZero = mZero + 1; - } - if (CardUtil.getConvertedManaCost(c.getManaCost()) == 1) { - mOne = mOne + 1; - } - if (CardUtil.getConvertedManaCost(c.getManaCost()) == 2) { - mTwo = mTwo + 1; - } - if (CardUtil.getConvertedManaCost(c.getManaCost()) == 3) { - mThree = mThree + 1; - } - if (CardUtil.getConvertedManaCost(c.getManaCost()) == 4) { - mFour = mFour + 1; - } - if (CardUtil.getConvertedManaCost(c.getManaCost()) == 5) { - mFive = mFive + 1; - } - if (CardUtil.getConvertedManaCost(c.getManaCost()) >= 6) { - mSixMore = mSixMore + 1; - } - } - - for (int i = 0; i < cList.size(); i++) { - c = cList.getCard(i); - tManaCost = tManaCost + CardUtil.getConvertedManaCost(c.getManaCost()); - } - BigDecimal aManaCost = new BigDecimal(tManaCost / cList.size()); - aManaCost = aManaCost.setScale(2, BigDecimal.ROUND_HALF_UP); - jLabelTotal.setText("Information about deck (total cards: " + cList.size() + "):"); - jLabelManaCost.setText("Mana cost (ACC:" + aManaCost + ")"); - Color cr = new Color(100, 100, 100); - if (cBlack == 0) { - jLabelBlack.setForeground(cr); - } - jLabelBlack.setText("Black: " + cBlack + " (" + cBlack * 100 / cList.size() + "%)"); - if (cBlue == 0) { - jLabelBlue.setForeground(cr); - } - jLabelBlue.setText("Blue: " + cBlue + " (" + cBlue * 100 / cList.size() + "%)"); - if (cGreen == 0) { - jLabelGreen.setForeground(cr); - } - jLabelGreen.setText("Green: " + cGreen + " (" + cGreen * 100 / cList.size() + "%)"); - if (cRed == 0) { - jLabelRed.setForeground(cr); - } - jLabelRed.setText("Red: " + cRed + " (" + cRed * 100 / cList.size() + "%)"); - if (cWhite == 0) { - jLabelWhite.setForeground(cr); - } - jLabelWhite.setText("White: " + cWhite + " (" + cWhite * 100 / cList.size() + "%)"); - if (cMulticolor == 0) { - jLabelMultiColor.setForeground(cr); - } - jLabelMultiColor.setText("Multicolor: " + cMulticolor + " (" + cMulticolor * 100 / cList.size() - + "%)"); - if (cColorless == 0) { - jLabelColorless.setForeground(cr); - } - jLabelColorless.setText("Colorless: " + cColorless + " (" + cColorless * 100 / cList.size() + "%)"); - if (cLand == 0) { - jLabelLand.setForeground(cr); - } - jLabelLand.setText("Land: " + cLand + " (" + cLand * 100 / cList.size() + "%)"); - if (cArtifact == 0) { - jLabelArtifact.setForeground(cr); - } - jLabelArtifact.setText("Artifact: " + cArtifact + " (" + cArtifact * 100 / cList.size() + "%)"); - if (cCreature == 0) { - jLabelCreature.setForeground(cr); - } - jLabelCreature.setText("Creature: " + cCreature + " (" + cCreature * 100 / cList.size() + "%)"); - if (cEnchant == 0) { - jLabelEnchant.setForeground(cr); - } - jLabelEnchant.setText("Enchant: " + cEnchant + " (" + cEnchant * 100 / cList.size() + "%)"); - if (cInstant == 0) { - jLabelInstant.setForeground(cr); - } - jLabelInstant.setText("Instant: " + cInstant + " (" + cInstant * 100 / cList.size() + "%)"); - if (cLandType == 0) { - jLabelLandType.setForeground(cr); - } - jLabelLandType.setText("Land: " + cLandType + " (" + cLandType * 100 / cList.size() + "%)"); - if (cPlaneswalker == 0) { - jLabelPlaneswalker.setForeground(cr); - } - jLabelPlaneswalker.setText("Planeswalker: " + cPlaneswalker + " (" + cPlaneswalker * 100 - / cList.size() + "%)"); - if (cSorcery == 0) { - jLabelSorcery.setForeground(cr); - } - jLabelSorcery.setText("Sorcery: " + cSorcery + " (" + cSorcery * 100 / cList.size() + "%)"); - if (mZero == 0) { - jLabelZeroMana.setForeground(cr); - } - jLabelZeroMana.setText("Zero mana: " + mZero + " (" + mZero * 100 / cList.size() + "%)"); - if (mOne == 0) { - jLabelOneMana.setForeground(cr); - } - jLabelOneMana.setText("One mana: " + mOne + " (" + mOne * 100 / cList.size() + "%)"); - if (mTwo == 0) { - jLabelTwoMana.setForeground(cr); - } - jLabelTwoMana.setText("Two mana: " + mTwo + " (" + mTwo * 100 / cList.size() + "%)"); - if (mThree == 0) { - jLabelThreeMana.setForeground(cr); - } - jLabelThreeMana.setText("Three mana :" + mThree + " (" + mThree * 100 / cList.size() + "%)"); - if (mFour == 0) { - jLabelFourMana.setForeground(cr); - } - jLabelFourMana.setText("Four mana: " + mFour + " (" + mFour * 100 / cList.size() + "%)"); - if (mFive == 0) { - jLabelFiveMana.setForeground(cr); - } - jLabelFiveMana.setText("Five mana: " + mFive + " (" + mFive * 100 / cList.size() + "%)"); - if (mSixMore == 0) { - jLabelSixMana.setForeground(cr); - } - jLabelSixMana.setText("Six and more: " + mSixMore + " (" + mSixMore * 100 / cList.size() + "%)"); - } - }); - - getContentPane().add(getJButton1()); - getContentPane().add(getJLabel1xx()); - getContentPane().add(getJButtonOk()); - getContentPane().add(getJPanel1()); - getContentPane().add(getJPanel2()); - getContentPane().add(getJPanel3()); - getContentPane().add(getJPanel4()); - getContentPane().add(getJPanel5()); - getContentPane().add(getJLabel1xxxxx()); - - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** - *

- * Getter for the field jPanel1. - *

- * - * @return a {@link javax.swing.JPanel} object. - */ - private JPanel getJPanel1() { - if (jPanel1 == null) { - jPanel1 = new JPanel(); - - jPanel1.setLayout(null); - jPanel1.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); - jPanel1.setBackground(new java.awt.Color(192, 192, 192)); - jPanel1.setBounds(5, 35, 137, 203); - jPanel1.add(getJLabel1()); - jPanel1.add(getJSeparator1()); - jPanel1.add(getJLabel2()); - jPanel1.add(getJLabel3()); - jPanel1.add(getJLabel4()); - jPanel1.add(getJLabel5()); - jPanel1.add(getJLabel6()); - jPanel1.add(getJLabel7()); - jPanel1.add(getJLabel8()); - jPanel1.add(getJLabel1x()); - } - return jPanel1; - } - - /** - *

- * Getter for the field jLabel2. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel2() { - if (jLabel2 == null) { - jLabel2 = new JLabel(); - jLabel2.setText("Color"); - jLabel2.setHorizontalAlignment(SwingConstants.CENTER); - jLabel2.setFont(new java.awt.Font("Segoe UI", 0, 14)); - jLabel2.setPreferredSize(new java.awt.Dimension(152, 39)); - jLabel2.setLayout(null); - jLabel2.setBounds(2, -3, 135, 26); - } - return jLabel2; - } - - /** - *

- * Getter for the field jSeparator1. - *

- * - * @return a {@link javax.swing.JSeparator} object. - */ - private JSeparator getJSeparator1() { - if (jSeparator1 == null) { - jSeparator1 = new JSeparator(); - jSeparator1.setPreferredSize(new java.awt.Dimension(117, 6)); - jSeparator1.setLayout(null); - jSeparator1.setBounds(1, 20, 136, 5); - } - return jSeparator1; - } - - /** - *

- * Getter for the field jButtonOk. - *

- * - * @return a {@link javax.swing.JButton} object. - */ - private JButton getJButtonOk() { - if (jButtonOk == null) { - jButtonOk = new JButton(); - jButtonOk.setLayout(null); - jButtonOk.setText("OK"); - jButtonOk.setBounds(206, 536, 168, 31); - jButtonOk.addMouseListener(new MouseInputAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - jF.setEnabled(true); - dispose(); - } - }); - } - return jButtonOk; - } - - /** - *

- * Getter for the field jLabel1. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel1() { - if (jLabelBlack == null) { - jLabelBlack = new JLabel(); - jLabelBlack.setText("Black:"); - jLabelBlack.setPreferredSize(new java.awt.Dimension(105, 12)); - jLabelBlack.setLayout(null); - jLabelBlack.setBounds(10, 28, 127, 13); - } - return jLabelBlack; - } - - /** - *

- * Getter for the field jLabel3. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel3() { - if (jLabelBlue == null) { - jLabelBlue = new JLabel(); - jLabelBlue.setText("Blue:"); - jLabelBlue.setLayout(null); - jLabelBlue.setBounds(10, 50, 127, 13); - } - return jLabelBlue; - } - - /** - *

- * Getter for the field jLabel4. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel4() { - if (jLabelGreen == null) { - jLabelGreen = new JLabel(); - jLabelGreen.setText("Green:"); - jLabelGreen.setLayout(null); - jLabelGreen.setBounds(10, 72, 127, 13); - } - return jLabelGreen; - } - - /** - *

- * getJLabel5. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel5() { - if (jLabelRed == null) { - jLabelRed = new JLabel(); - jLabelRed.setText("Red:"); - jLabelRed.setLayout(null); - jLabelRed.setBounds(10, 94, 127, 14); - } - return jLabelRed; - } - - /** - *

- * getJLabel6. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel6() { - if (jLabelWhite == null) { - jLabelWhite = new JLabel(); - jLabelWhite.setText("White:"); - jLabelWhite.setLayout(null); - jLabelWhite.setBounds(10, 116, 127, 13); - } - return jLabelWhite; - } - - /** - *

- * getJLabel7. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel7() { - if (jLabelMultiColor == null) { - jLabelMultiColor = new JLabel(); - jLabelMultiColor.setText("Multicolor:"); - jLabelMultiColor.setLayout(null); - jLabelMultiColor.setBounds(10, 138, 127, 12); - } - return jLabelMultiColor; - } - - /** - *

- * getJLabel8. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel8() { - if (jLabelColorless == null) { - jLabelColorless = new JLabel(); - jLabelColorless.setText("Colorless:"); - jLabelColorless.setLayout(null); - jLabelColorless.setBounds(10, 160, 128, 11); - } - return jLabelColorless; - } - - /** - *

- * getJLabel1x. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel1x() { - if (jLabelLand == null) { - jLabelLand = new JLabel(); - jLabelLand.setText("Land: "); - jLabelLand.setLayout(null); - jLabelLand.setBounds(10, 182, 129, 10); - } - return jLabelLand; - } - - /** - *

- * getJLabel1xx. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel1xx() { - if (jLabelTotal == null) { - jLabelTotal = new JLabel(); - jLabelTotal.setText("Information about deck:"); - jLabelTotal.setLayout(null); - jLabelTotal.setBounds(5, 0, 454, 35); - } - return jLabelTotal; - } - - /** - *

- * Getter for the field jPanel2. - *

- * - * @return a {@link javax.swing.JPanel} object. - */ - private JPanel getJPanel2() { - if (jPanel2 == null) { - jPanel2 = new JPanel(); - - jPanel2.setBackground(new java.awt.Color(192, 192, 192)); - jPanel2.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); - jPanel2.setLayout(null); - jPanel2.setBounds(153, 35, 137, 203); - jPanel2.add(getJLabel1xxx()); - jPanel2.add(getJSeparator2()); - jPanel2.add(getJLabel3x()); - jPanel2.add(getJLabel4x()); - jPanel2.add(getJLabel5x()); - jPanel2.add(getJLabel6x()); - jPanel2.add(getJLabel7x()); - jPanel2.add(getJLabel8x()); - jPanel2.add(getJLabel10()); - } - return jPanel2; - } - - /** - *

- * getJLabel1xxx. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel1xxx() { - if (jLabelArtifact == null) { - jLabelArtifact = new JLabel(); - jLabelArtifact.setText("Artifact:"); - jLabelArtifact.setPreferredSize(new java.awt.Dimension(105, 12)); - jLabelArtifact.setLayout(null); - jLabelArtifact.setBounds(10, 28, 127, 13); - } - return jLabelArtifact; - } - - /** - *

- * Getter for the field jSeparator2. - *

- * - * @return a {@link javax.swing.JSeparator} object. - */ - private JSeparator getJSeparator2() { - if (jSeparator2 == null) { - jSeparator2 = new JSeparator(); - jSeparator2.setPreferredSize(new java.awt.Dimension(117, 6)); - jSeparator2.setLayout(null); - jSeparator2.setBounds(1, 20, 136, 5); - } - return jSeparator2; - } - - /** - *

- * getJLabel3x. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel3x() { - if (jLabel3 == null) { - jLabel3 = new JLabel(); - jLabel3.setText("Type"); - jLabel3.setHorizontalAlignment(SwingConstants.CENTER); - jLabel3.setFont(new java.awt.Font("Segoe UI", 0, 14)); - jLabel3.setPreferredSize(new java.awt.Dimension(152, 39)); - jLabel3.setLayout(null); - jLabel3.setBounds(2, -3, 135, 26); - } - return jLabel3; - } - - /** - *

- * getJLabel4x. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel4x() { - if (jLabelCreature == null) { - jLabelCreature = new JLabel(); - jLabelCreature.setText("Creature:"); - jLabelCreature.setLayout(null); - jLabelCreature.setBounds(10, 53, 127, 13); - } - return jLabelCreature; - } - - /** - *

- * getJLabel5x. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel5x() { - if (jLabelEnchant == null) { - jLabelEnchant = new JLabel(); - jLabelEnchant.setText("Enchant:"); - jLabelEnchant.setLayout(null); - jLabelEnchant.setBounds(10, 79, 127, 13); - } - return jLabelEnchant; - } - - /** - *

- * getJLabel6x. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel6x() { - if (jLabelInstant == null) { - jLabelInstant = new JLabel(); - jLabelInstant.setText("Instant:"); - jLabelInstant.setLayout(null); - jLabelInstant.setBounds(10, 105, 127, 14); - } - return jLabelInstant; - } - - /** - *

- * getJLabel7x. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel7x() { - if (jLabelLandType == null) { - jLabelLandType = new JLabel(); - jLabelLandType.setText("Land:"); - jLabelLandType.setLayout(null); - jLabelLandType.setBounds(10, 130, 127, 13); - } - return jLabelLandType; - } - - /** - *

- * getJLabel8x. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel8x() { - if (jLabelPlaneswalker == null) { - jLabelPlaneswalker = new JLabel(); - jLabelPlaneswalker.setText("Planeswalker:"); - jLabelPlaneswalker.setLayout(null); - jLabelPlaneswalker.setBounds(10, 156, 127, 13); - } - return jLabelPlaneswalker; - } - - /** - *

- * getJLabel10. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel10() { - if (jLabelSorcery == null) { - jLabelSorcery = new JLabel(); - jLabelSorcery.setText("Sorcery:"); - jLabelSorcery.setLayout(null); - jLabelSorcery.setBounds(10, 182, 127, 11); - } - return jLabelSorcery; - } - - /** - *

- * Getter for the field jPanel3. - *

- * - * @return a {@link javax.swing.JPanel} object. - */ - private JPanel getJPanel3() { - if (jPanel3 == null) { - jPanel3 = new JPanel(); - jPanel3.setBackground(new java.awt.Color(192, 192, 192)); - jPanel3.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); - jPanel3.setLayout(null); - jPanel3.setBounds(302, 35, 137, 203); - jPanel3.add(getJLabel1xxxx()); - jPanel3.add(getJSeparator3()); - jPanel3.add(getJLabel4xx()); - jPanel3.add(getJLabel5xx()); - jPanel3.add(getJLabel6xx()); - jPanel3.add(getJLabel7xx()); - jPanel3.add(getJLabel8xx()); - jPanel3.add(getJLabel9()); - jPanel3.add(getJLabel10x()); - } - return jPanel3; - } - - /** - *

- * getJLabel1xxxx. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel1xxxx() { - if (jLabelZeroMana == null) { - jLabelZeroMana = new JLabel(); - jLabelZeroMana.setText("Zero mana:"); - jLabelZeroMana.setPreferredSize(new java.awt.Dimension(105, 12)); - jLabelZeroMana.setLayout(null); - jLabelZeroMana.setBounds(10, 28, 127, 13); - } - return jLabelZeroMana; - } - - /** - *

- * Getter for the field jSeparator3. - *

- * - * @return a {@link javax.swing.JSeparator} object. - */ - private JSeparator getJSeparator3() { - if (jSeparator3 == null) { - jSeparator3 = new JSeparator(); - jSeparator3.setPreferredSize(new java.awt.Dimension(117, 6)); - jSeparator3.setLayout(null); - jSeparator3.setBounds(1, 20, 136, 5); - } - return jSeparator3; - } - - /** - *

- * getJLabel4xx. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel4xx() { - if (jLabelManaCost == null) { - jLabelManaCost = new JLabel(); - jLabelManaCost.setText("Mana cost"); - jLabelManaCost.setHorizontalAlignment(SwingConstants.CENTER); - jLabelManaCost.setFont(new java.awt.Font("Segoe UI", 0, 14)); - jLabelManaCost.setPreferredSize(new java.awt.Dimension(152, 39)); - jLabelManaCost.setLayout(null); - jLabelManaCost.setBounds(2, -3, 135, 26); - } - return jLabelManaCost; - } - - /** - *

- * getJLabel5xx. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel5xx() { - if (jLabelOneMana == null) { - jLabelOneMana = new JLabel(); - jLabelOneMana.setText("One mana:"); - jLabelOneMana.setLayout(null); - jLabelOneMana.setBounds(10, 53, 127, 13); - } - return jLabelOneMana; - } - - /** - *

- * getJLabel6xx. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel6xx() { - if (jLabelTwoMana == null) { - jLabelTwoMana = new JLabel(); - jLabelTwoMana.setText("Two mana:"); - jLabelTwoMana.setLayout(null); - jLabelTwoMana.setBounds(10, 79, 127, 13); - } - return jLabelTwoMana; - } - - /** - *

- * getJLabel7xx. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel7xx() { - if (jLabelThreeMana == null) { - jLabelThreeMana = new JLabel(); - jLabelThreeMana.setText("Three mana:"); - jLabelThreeMana.setLayout(null); - jLabelThreeMana.setBounds(10, 105, 127, 14); - } - return jLabelThreeMana; - } - - /** - *

- * getJLabel8xx. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel8xx() { - if (jLabelFourMana == null) { - jLabelFourMana = new JLabel(); - jLabelFourMana.setText("Four mana:"); - jLabelFourMana.setLayout(null); - jLabelFourMana.setBounds(10, 130, 127, 13); - } - return jLabelFourMana; - } - - /** - *

- * getJLabel9. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel9() { - if (jLabelFiveMana == null) { - jLabelFiveMana = new JLabel(); - jLabelFiveMana.setText("Five mana:"); - jLabelFiveMana.setLayout(null); - jLabelFiveMana.setBounds(10, 156, 127, 13); - } - return jLabelFiveMana; - } - - /** - *

- * getJLabel10x. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel10x() { - if (jLabelSixMana == null) { - jLabelSixMana = new JLabel(); - jLabelSixMana.setText("Six and more:"); - jLabelSixMana.setLayout(null); - jLabelSixMana.setBounds(10, 182, 127, 11); - } - return jLabelSixMana; - } - - /** - *

- * getJList1. - *

- * - * @return a {@link javax.swing.JList} object. - */ - private JList getJList1() { - CardList rList; - rList = tModel.getCards(); - - rList.shuffle(); - ListModel jList1Model; - if (jListFirstHand == null) { - if (rList.size() >= 40) { - jList1Model = new DefaultComboBoxModel(new String[] { rList.getCard(0).getName(), - rList.getCard(1).getName(), rList.getCard(2).getName(), rList.getCard(3).getName(), - rList.getCard(4).getName(), rList.getCard(5).getName(), rList.getCard(6).getName() }); - jListFirstHand = new JList(); - } else { - jList1Model = new DefaultComboBoxModel(new String[] { "Few cards." }); - jListFirstHand = new JList(); - } - } else { - if (rList.size() >= 40) { - jList1Model = new DefaultComboBoxModel(new String[] { rList.getCard(0).getName(), - rList.getCard(1).getName(), rList.getCard(2).getName(), rList.getCard(3).getName(), - rList.getCard(4).getName(), rList.getCard(5).getName(), rList.getCard(6).getName() }); - - } else { - jList1Model = new DefaultComboBoxModel(new String[] { "Few cards." }); - - } - } - - jListFirstHand.setModel(jList1Model); - jListFirstHand.setLayout(null); - jListFirstHand.setBackground(new java.awt.Color(192, 192, 192)); - jListFirstHand.setSelectionBackground(new java.awt.Color(192, 192, 192)); - jListFirstHand.setSelectionForeground(new java.awt.Color(0, 0, 0)); - jListFirstHand.setFixedCellHeight(24); - jListFirstHand.setBounds(2, 21, 133, 167); - - return jListFirstHand; - } - - /** - *

- * Getter for the field jPanel4. - *

- * - * @return a {@link javax.swing.JPanel} object. - */ - private JPanel getJPanel4() { - if (jPanel4 == null) { - jPanel4 = new JPanel(); - jPanel4.setBackground(new java.awt.Color(192, 192, 192)); - jPanel4.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); - jPanel4.setLayout(null); - jPanel4.setBounds(451, 35, 137, 202); - jPanel4.add(getJSeparator4()); - jPanel4.add(getJLabel4xxx()); - jPanel4.add(getJList1()); - jPanel4.add(getJButton1()); - } else { - jPanel4.removeAll(); - MigLayout jPanel4Layout = new MigLayout(); - jPanel4.setBackground(new java.awt.Color(192, 192, 192)); - jPanel4.setPreferredSize(new java.awt.Dimension(139, 201)); - jPanel4.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); - jPanel4.setLayout(jPanel4Layout); - jPanel4.add(getJSeparator4()); - jPanel4.add(getJLabel4xxx()); - jPanel4.add(getJList1()); - jPanel4.add(getJButton1()); - } - return jPanel4; - - } - - /** - *

- * Getter for the field jSeparator4. - *

- * - * @return a {@link javax.swing.JSeparator} object. - */ - private JSeparator getJSeparator4() { - if (jSeparator4 == null) { - jSeparator4 = new JSeparator(); - jSeparator4.setPreferredSize(new java.awt.Dimension(138, 8)); - jSeparator4.setLayout(null); - jSeparator4.setBounds(0, 19, 137, 7); - } - return jSeparator4; - } - - /** - *

- * getJLabel4xxx. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel4xxx() { - if (jLabel4 == null) { - jLabel4 = new JLabel(); - jLabel4.setText("Random start hand"); - jLabel4.setHorizontalAlignment(SwingConstants.CENTER); - jLabel4.setFont(new java.awt.Font("Segoe UI", 0, 14)); - jLabel4.setPreferredSize(new java.awt.Dimension(136, 24)); - jLabel4.setLayout(null); - jLabel4.setBounds(2, 0, 135, 20); - } - return jLabel4; - } - - /** - *

- * getJButton1. - *

- * - * @return a {@link javax.swing.JButton} object. - */ - private JButton getJButton1() { - CardList rList; - rList = tModel.getCards(); - if (jButtonRegenerate == null) { - if (rList.size() >= 40) { - jButtonRegenerate = new JButton(); - jButtonRegenerate.setLayout(null); - jButtonRegenerate.setText("Regenerate hand"); - jButtonRegenerate.setPreferredSize(new java.awt.Dimension(139, 21)); - jButtonRegenerate.setBounds(2, 189, 133, 13); - jButtonRegenerate.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - jButtonRegenerate_actionPerformed(e); - } - }); - } else { - jButtonRegenerate = new JButton(); - jButtonRegenerate.setBounds(2, 189, 133, 13); - jButtonRegenerate.setVisible(false); - } - } - return jButtonRegenerate; - } - - /** - *

- * jButtonRegenerate_actionPerformed. - *

- * - * @param e - * a {@link java.awt.event.ActionEvent} object. - */ - void jButtonRegenerate_actionPerformed(ActionEvent e) { - getContentPane().removeAll(); - getContentPane().add(getJPanel5()); - getContentPane().add(getJLabel1xx()); - getContentPane().add(getJButtonOk()); - getContentPane().add(getJPanel1()); - getContentPane().add(getJPanel2()); - getContentPane().add(getJPanel3()); - getContentPane().add(getJPanel4()); - getContentPane().add(getJPanel5()); - getContentPane().add(getJLabel1xxxxx()); - getContentPane().repaint(); - - } - - /** - *

- * Getter for the field jPanel5. - *

- * - * @return a {@link javax.swing.JPanel} object. - */ - private JPanel getJPanel5() { - if (jPanel5 == null) { - jPanel5 = new JPanel(); - jPanel5.setLayout(null); - jPanel5.setBounds(5, 262, 583, 270); - jPanel5.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); - jPanel5.add(getJScrollPane1()); - } - return jPanel5; - } - - /** - *

- * Getter for the field jTable1. - *

- * - * @return a {@link javax.swing.JTable} object. - */ - private JTable getJTable1() { - if (jTable1 == null) { - DefaultTableModel dm = new DefaultTableModel(); - dm.setDataVector(new Object[][] { {} }, new Object[] { "Card", "Qty", "1st", "2nd", "3rd", "4th", "5th", - "6th", "7th" }); - - jTable1 = new JTable(dm); - CardList rList; - rList = tModel.getCards(); - String[] cardsName = new String[rList.size()]; - int cCount; - float fCount; - float firstTurnF, secondTurnF, thirdTurnF, fourthTurnF, fivethTurnF, sixthTurnF, seventhTurnF; - - for (int i = 0; i < rList.size(); i++) { - cardsName[i] = rList.getCard(i).getName(); - } - Arrays.sort(cardsName); - jTable1.setValueAt("Few cards.", 0, 0); - - if (rList.size() >= 40) { - jTable1.setValueAt(cardsName[0], 0, 0); - cCount = 1; - for (int i = 1; i < cardsName.length; i++) { - if (cardsName[i].equals(cardsName[i - 1])) { - cCount = cCount + 1; - - } else { - dm.addRow(new Object[][] { {} }); - jTable1.setValueAt(cardsName[i], dm.getRowCount() - 1, 0); - jTable1.setValueAt(cCount, dm.getRowCount() - 2, 1); - fCount = cCount; - - firstTurnF = fCount / rList.size(); - BigDecimal firstTurn = new BigDecimal(firstTurnF * 100); - firstTurn = firstTurn.setScale(1, BigDecimal.ROUND_HALF_UP); - jTable1.setValueAt(firstTurn.toString() + " %", dm.getRowCount() - 2, 2); - - secondTurnF = (1 - firstTurnF) * fCount / (rList.size() - 1) + firstTurnF; - BigDecimal secondTurn = new BigDecimal(secondTurnF * 100); - secondTurn = secondTurn.setScale(1, BigDecimal.ROUND_HALF_UP); - jTable1.setValueAt(secondTurn.toString() + " %", dm.getRowCount() - 2, 3); - - thirdTurnF = (1 - secondTurnF) * fCount / (rList.size() - 2) + secondTurnF; - BigDecimal thirdTurn = new BigDecimal(thirdTurnF * 100); - thirdTurn = thirdTurn.setScale(1, BigDecimal.ROUND_HALF_UP); - jTable1.setValueAt(thirdTurn.toString() + " %", dm.getRowCount() - 2, 4); - - fourthTurnF = (1 - thirdTurnF) * fCount / (rList.size() - 3) + thirdTurnF; - BigDecimal fourthTurn = new BigDecimal(fourthTurnF * 100); - fourthTurn = fourthTurn.setScale(1, BigDecimal.ROUND_HALF_UP); - jTable1.setValueAt(fourthTurn.toString() + " %", dm.getRowCount() - 2, 5); - - fivethTurnF = (1 - fourthTurnF) * fCount / (rList.size() - 4) + fourthTurnF; - BigDecimal fivethTurn = new BigDecimal(fivethTurnF * 100); - fivethTurn = fivethTurn.setScale(1, BigDecimal.ROUND_HALF_UP); - jTable1.setValueAt(fivethTurn.toString() + " %", dm.getRowCount() - 2, 6); - - sixthTurnF = (1 - fivethTurnF) * fCount / (rList.size() - 5) + fivethTurnF; - BigDecimal sixthTurn = new BigDecimal(sixthTurnF * 100); - sixthTurn = sixthTurn.setScale(1, BigDecimal.ROUND_HALF_UP); - jTable1.setValueAt(sixthTurn.toString() + " %", dm.getRowCount() - 2, 7); - - seventhTurnF = (1 - sixthTurnF) * fCount / (rList.size() - 6) + sixthTurnF; - BigDecimal seventhTurn = new BigDecimal(seventhTurnF * 100); - seventhTurn = seventhTurn.setScale(1, BigDecimal.ROUND_HALF_UP); - jTable1.setValueAt(seventhTurn.toString() + " %", dm.getRowCount() - 2, 8); - - cCount = 1; - } - if (i == cardsName.length - 1) { - jTable1.setValueAt(cCount, dm.getRowCount() - 1, 1); - fCount = cCount; - - firstTurnF = fCount / rList.size(); - BigDecimal firstTurn = new BigDecimal(firstTurnF * 100); - firstTurn = firstTurn.setScale(1, BigDecimal.ROUND_HALF_UP); - jTable1.setValueAt(firstTurn.toString() + " %", dm.getRowCount() - 1, 2); - - secondTurnF = (1 - firstTurnF) * fCount / (rList.size() - 1) + firstTurnF; - BigDecimal secondTurn = new BigDecimal(secondTurnF * 100); - secondTurn = secondTurn.setScale(1, BigDecimal.ROUND_HALF_UP); - jTable1.setValueAt(secondTurn.toString() + " %", dm.getRowCount() - 1, 3); - - thirdTurnF = (1 - secondTurnF) * fCount / (rList.size() - 2) + secondTurnF; - BigDecimal thirdTurn = new BigDecimal(thirdTurnF * 100); - thirdTurn = thirdTurn.setScale(1, BigDecimal.ROUND_HALF_UP); - jTable1.setValueAt(thirdTurn.toString() + " %", dm.getRowCount() - 1, 4); - - fourthTurnF = (1 - thirdTurnF) * fCount / (rList.size() - 3) + thirdTurnF; - BigDecimal fourthTurn = new BigDecimal(fourthTurnF * 100); - fourthTurn = fourthTurn.setScale(1, BigDecimal.ROUND_HALF_UP); - jTable1.setValueAt(fourthTurn.toString() + " %", dm.getRowCount() - 1, 5); - - fivethTurnF = (1 - fourthTurnF) * fCount / (rList.size() - 4) + fourthTurnF; - BigDecimal fivethTurn = new BigDecimal(fivethTurnF * 100); - fivethTurn = fivethTurn.setScale(1, BigDecimal.ROUND_HALF_UP); - jTable1.setValueAt(fivethTurn.toString() + " %", dm.getRowCount() - 1, 6); - - sixthTurnF = (1 - fivethTurnF) * fCount / (rList.size() - 5) + fivethTurnF; - BigDecimal sixthTurn = new BigDecimal(sixthTurnF * 100); - sixthTurn = sixthTurn.setScale(1, BigDecimal.ROUND_HALF_UP); - jTable1.setValueAt(sixthTurn.toString() + " %", dm.getRowCount() - 1, 7); - - seventhTurnF = (1 - sixthTurnF) * fCount / (rList.size() - 6) + sixthTurnF; - BigDecimal seventhTurn = new BigDecimal(seventhTurnF * 100); - seventhTurn = seventhTurn.setScale(1, BigDecimal.ROUND_HALF_UP); - jTable1.setValueAt(seventhTurn.toString() + " %", dm.getRowCount() - 1, 8); - - } - - } - } - - jTable1.getColumn("Qty").setMaxWidth(50); - jTable1.getColumn("1st").setMaxWidth(50); - jTable1.getColumn("2nd").setMaxWidth(50); - jTable1.getColumn("3rd").setMaxWidth(50); - jTable1.getColumn("4th").setMaxWidth(50); - jTable1.getColumn("5th").setMaxWidth(50); - jTable1.getColumn("6th").setMaxWidth(50); - jTable1.getColumn("7th").setMaxWidth(50); - jTable1.setRowHeight(18); - jTable1.setPreferredSize(new java.awt.Dimension(576, 18 * dm.getRowCount() + 3)); - } - return jTable1; - } - - /** - *

- * Getter for the field jScrollPane1. - *

- * - * @return a {@link javax.swing.JScrollPane} object. - */ - private JScrollPane getJScrollPane1() { - if (jScrollPane1 == null) { - jScrollPane1 = new JScrollPane(); - jScrollPane1.setBounds(2, 2, 582, 268); - jScrollPane1.setSize(580, 268); - jScrollPane1.setViewportView(getJTable1()); - } - return jScrollPane1; - } - - /** - *

- * getJLabel1xxxxx. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getJLabel1xxxxx() { - if (jLabel1 == null) { - jLabel1 = new JLabel(); - jLabel1.setText("Draw Probabilities:"); - jLabel1.setLayout(null); - jLabel1.setBounds(7, 237, 447, 25); - } - return jLabel1; - } - -} diff --git a/src/forge/GUI_Filter.java b/src/forge/GUI_Filter.java deleted file mode 100644 index dbfc59389f8..00000000000 --- a/src/forge/GUI_Filter.java +++ /dev/null @@ -1,763 +0,0 @@ -package forge; - -import java.awt.Dimension; -import java.awt.Font; -import java.awt.event.MouseEvent; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; - -import javax.swing.BorderFactory; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.border.BevelBorder; -import javax.swing.event.MouseInputAdapter; - -import net.miginfocom.swing.MigLayout; - -/** - * @author Forge - * @version $Id: $ - */ -public class GUI_Filter extends javax.swing.JDialog { - - /** - * Constant serialVersionUID=-8475271235196182185L - */ - private static final long serialVersionUID = -8475271235196182185L; - private JLabel nameLabel; - private JTextField nameTextField; - private JLabel cardTextLabel; - private JTextField cardTextField; - private JPanel colorPanel; - private JPanel bottomPanel; - private JCheckBox jCheckBoxColorless; - private JCheckBox jCheckBoxWhite; - private JCheckBox jCheckBoxRed; - private JCheckBox jCheckBoxGreen; - private JCheckBox jCheckBoxBlue; - private JLabel colorLabel; - private JLabel typeLabel; - private JCheckBox jCheckBoxPlaneswalker; - private JCheckBox jCheckBoxArtifact; - private JCheckBox jCheckBoxCreature; - private JCheckBox jCheckBoxEnchant; - private JCheckBox jCheckBoxInstant; - private JCheckBox jCheckBoxLand; - private JCheckBox jCheckBoxSorcery; - private JPanel typePanel; - private JCheckBox jCheckBoxBlack; - private JButton jButtonOk; - private JPanel topPanel; - private DeckDisplay deckDisplay; - - /** - *

- * Constructor for GUI_Filter. - *

- * - * @param g - * a {@link javax.swing.JFrame} object. - * @param display - * a {@link forge.DeckDisplay} object. - */ - public GUI_Filter(JFrame g, DeckDisplay display) { - super(g); - deckDisplay = display; - initGUI(); - } - - /** - *

- * initGUI. - *

- */ - private void initGUI() { - try { - this.isResizable(); - - getContentPane().setLayout(new MigLayout("fill")); - getContentPane().add(getTopPanel(), "span 3, wrap"); - getContentPane().add(getColorPanel(), "aligny top, growy"); - getContentPane().add(getTypePanel(), "aligny top, wrap"); - getContentPane().add(getBottomPanel(), "align center, span 3"); - setVisible(true); - Dimension screen = getToolkit().getScreenSize(); - int x = (screen.width - 340) / 2; - int y = (screen.height - 500) / 2; - this.setBounds(x, y, 340, 500); - this.setResizable(true); - this.setTitle("Filter"); - - setIconImage(null); - - this.addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent arg0) { - Gui_DeckEditor g = (Gui_DeckEditor) deckDisplay; - g.setEnabled(true); - } - }); - - } catch (Exception e) { - e.printStackTrace(); - } - } - - private JTextField getNameTextField() { - if (nameTextField == null) { - nameTextField = new JTextField(30); - nameTextField.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return nameTextField; - } - - private JLabel getNameLabel() { - if (nameLabel == null) { - nameLabel = new JLabel(); - nameLabel.setText("Name:"); - nameLabel.setFont(new Font("Segoe UI", 0, 16)); - } - return nameLabel; - } - - private JPanel getTopPanel() { - if (topPanel == null) { - topPanel = new JPanel(); - topPanel.setLayout(new MigLayout()); - topPanel.add(getNameLabel(), "gap"); - topPanel.add(getNameTextField(), "span 3, wrap"); - topPanel.add(getCardTextLabel(), "gap"); - topPanel.add(getCardTextField(), "span 3, wrap"); - } - - return topPanel; - } - - /** - *

- * Getter for the field colorPanel. - *

- * - * @return a {@link javax.swing.JPanel} object. - */ - private JPanel getColorPanel() { - if (colorPanel == null) { - colorPanel = new JPanel(); - colorPanel.setLayout(new MigLayout()); - colorPanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); - colorPanel.setBackground(new java.awt.Color(192, 192, 192)); - colorPanel.add(getColorLabel(), "align, wrap"); - colorPanel.add(getJCheckBoxBlack(), "wrap"); - colorPanel.add(getJCheckBoxColorless(), "wrap"); - colorPanel.add(getJCheckBoxWhite(), "wrap"); - colorPanel.add(getJCheckBoxRed(), "wrap"); - colorPanel.add(getJCheckBoxGreen(), "wrap"); - colorPanel.add(getJCheckBoxBlue(), "wrap"); - } - return colorPanel; - } - - private JPanel getBottomPanel() { - if (bottomPanel == null) { - bottomPanel = new JPanel(); - bottomPanel.setLayout(new MigLayout()); - bottomPanel.add(getJButtonOk(), "align, span 3, grow"); - } - return bottomPanel; - } - - /** - *

- * Getter for the field jCheckBoxBlue. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxBlue() { - if (jCheckBoxBlue == null) { - jCheckBoxBlue = new JCheckBox(); - jCheckBoxBlue.setText("Blue"); - jCheckBoxBlue.setSelected(true); - jCheckBoxBlue.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxBlue.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxBlue; - } - - /** - *

- * Getter for the field jCheckBoxGreen. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxGreen() { - if (jCheckBoxGreen == null) { - jCheckBoxGreen = new JCheckBox(); - jCheckBoxGreen.setText("Green"); - jCheckBoxGreen.setSelected(true); - jCheckBoxGreen.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxGreen.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxGreen; - } - - /** - *

- * Getter for the field jCheckBoxRed. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxRed() { - if (jCheckBoxRed == null) { - jCheckBoxRed = new JCheckBox(); - jCheckBoxRed.setText("Red"); - jCheckBoxRed.setSelected(true); - jCheckBoxRed.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxRed.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxRed; - } - - /** - *

- * Getter for the field jCheckBoxWhite. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxWhite() { - if (jCheckBoxWhite == null) { - jCheckBoxWhite = new JCheckBox(); - jCheckBoxWhite.setText("White"); - jCheckBoxWhite.setSelected(true); - jCheckBoxWhite.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxWhite.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxWhite; - } - - /** - *

- * Getter for the field jCheckBoxColorless. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxColorless() { - if (jCheckBoxColorless == null) { - jCheckBoxColorless = new JCheckBox(); - jCheckBoxColorless.setText("Colorless"); - jCheckBoxColorless.setSelected(true); - jCheckBoxColorless.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxColorless.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxColorless; - } - - /** - *

- * Getter for the field jButtonOk. - *

- * - * @return a {@link javax.swing.JButton} object. - */ - private JButton getJButtonOk() { - if (jButtonOk == null) { - jButtonOk = new JButton(); - jButtonOk.setText("OK"); - jButtonOk.addMouseListener(new MouseInputAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - FilterCardTable(); - } - }); - } - return jButtonOk; - } - - /** - *

- * Getter for the field jCheckBoxBlack. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxBlack() { - if (jCheckBoxBlack == null) { - jCheckBoxBlack = new JCheckBox(); - jCheckBoxBlack.setText("Black"); - jCheckBoxBlack.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxBlack.setSelected(true); - jCheckBoxBlack.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxBlack; - } - - /** - *

- * Getter for the field typePanel. - *

- * - * @return a {@link javax.swing.JPanel} object. - */ - private JPanel getTypePanel() { - if (typePanel == null) { - typePanel = new JPanel(); - typePanel.setLayout(new MigLayout()); - typePanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); - typePanel.setBackground(new java.awt.Color(192, 192, 192)); - typePanel.add(getTypeLabel(), "align, wrap"); - typePanel.add(getJCheckBoxSorcery(), "wrap"); - typePanel.add(getJCheckBoxPlaneswalker(), "wrap"); - typePanel.add(getJCheckBoxLand(), "wrap"); - typePanel.add(getJCheckBoxInstant(), "wrap"); - typePanel.add(getJCheckBoxEnchant(), "wrap"); - typePanel.add(getJCheckBoxCreature(), "wrap"); - typePanel.add(getJCheckBoxArtifact(), "wrap"); - } - return typePanel; - } - - /** - *

- * Getter for the field colorLabel. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getColorLabel() { - if (colorLabel == null) { - colorLabel = new JLabel(); - colorLabel.setText("Color"); - colorLabel.setFont(new java.awt.Font("Segoe UI", 0, 14)); - } - return colorLabel; - } - - /** - *

- * Getter for the field typeLabel. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getTypeLabel() { - if (typeLabel == null) { - typeLabel = new JLabel(); - typeLabel.setText("Type"); - typeLabel.setFont(new java.awt.Font("Segoe UI", 0, 14)); - } - return typeLabel; - } - - /** - *

- * getJCheckBoxSorcery. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxSorcery() { - if (jCheckBoxSorcery == null) { - jCheckBoxSorcery = new JCheckBox(); - jCheckBoxSorcery.setText("Sorcery"); - jCheckBoxSorcery.setSelected(true); - jCheckBoxSorcery.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxSorcery.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxSorcery; - } - - /** - *

- * getJCheckBoxPlaneswalker. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxPlaneswalker() { - if (jCheckBoxPlaneswalker == null) { - jCheckBoxPlaneswalker = new JCheckBox(); - jCheckBoxPlaneswalker.setText("Planeswalker"); - jCheckBoxPlaneswalker.setSelected(true); - jCheckBoxPlaneswalker.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxPlaneswalker.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxPlaneswalker; - } - - /** - *

- * getJCheckBoxLand. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxLand() { - if (jCheckBoxLand == null) { - jCheckBoxLand = new JCheckBox(); - jCheckBoxLand.setText("Land"); - jCheckBoxLand.setSelected(true); - jCheckBoxLand.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxLand.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxLand; - } - - /** - *

- * getJCheckBoxInstant. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxInstant() { - if (jCheckBoxInstant == null) { - jCheckBoxInstant = new JCheckBox(); - jCheckBoxInstant.setText("Instant"); - jCheckBoxInstant.setSelected(true); - jCheckBoxInstant.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxInstant.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxInstant; - } - - /** - *

- * getJCheckBoxEnchant. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxEnchant() { - if (jCheckBoxEnchant == null) { - jCheckBoxEnchant = new JCheckBox(); - jCheckBoxEnchant.setText("Enchant"); - jCheckBoxEnchant.setSelected(true); - jCheckBoxEnchant.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxEnchant.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxEnchant; - } - - /** - *

- * getJCheckBoxCreature. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxCreature() { - if (jCheckBoxCreature == null) { - jCheckBoxCreature = new JCheckBox(); - jCheckBoxCreature.setText("Creature"); - jCheckBoxCreature.setSelected(true); - jCheckBoxCreature.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxCreature.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxCreature; - } - - /** - *

- * getJCheckBoxArtifact. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxArtifact() { - if (jCheckBoxArtifact == null) { - jCheckBoxArtifact = new JCheckBox(); - jCheckBoxArtifact.setText("Artifact"); - jCheckBoxArtifact.setSelected(true); - jCheckBoxArtifact.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxArtifact.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxArtifact; - } - - /** - *

- * getCardTextField. - *

- * - * @return a {@link javax.swing.JTextField} object. - */ - private JTextField getCardTextField() { - if (cardTextField == null) { - cardTextField = new JTextField(30); - cardTextField.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return cardTextField; - } - - /** - *

- * Getter for the field cardTextLabel. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getCardTextLabel() { - if (cardTextLabel == null) { - cardTextLabel = new JLabel(); - cardTextLabel.setText("Card Text:"); - cardTextLabel.setFont(new java.awt.Font("Segoe UI", 0, 16)); - } - return cardTextLabel; - } - - /** - *

- * FilterCardTable. - *

- */ - private void FilterCardTable() { - - String name = nameTextField.getText(); - String cText = cardTextField.getText(); - - CardList filterCardList; - CardFilter filter = new CardFilter(); - Gui_DeckEditor g = (Gui_DeckEditor) deckDisplay; - g.blackCheckBox.setSelected(true); - g.blackCheckBox.setEnabled(true); - g.blueCheckBox.setSelected(true); - g.blueCheckBox.setEnabled(true); - g.greenCheckBox.setSelected(true); - g.greenCheckBox.setEnabled(true); - g.redCheckBox.setSelected(true); - g.redCheckBox.setEnabled(true); - g.whiteCheckBox.setSelected(true); - g.whiteCheckBox.setEnabled(true); - g.colorlessCheckBox.setSelected(true); - g.colorlessCheckBox.setEnabled(true); - g.artifactCheckBox.setSelected(true); - g.artifactCheckBox.setEnabled(true); - g.creatureCheckBox.setSelected(true); - g.creatureCheckBox.setEnabled(true); - g.enchantmentCheckBox.setSelected(true); - g.enchantmentCheckBox.setEnabled(true); - g.instantCheckBox.setSelected(true); - g.instantCheckBox.setEnabled(true); - g.landCheckBox.setSelected(true); - g.landCheckBox.setEnabled(true); - g.planeswalkerCheckBox.setSelected(true); - g.planeswalkerCheckBox.setEnabled(true); - g.sorceryCheckBox.setSelected(true); - g.sorceryCheckBox.setEnabled(true); - g.setEnabled(true); - if (name != "") { - if (cText != "") { - filterCardList = filter.cardListNameFilter(AllZone.getCardFactory(), name); - - if (filterCardList.size() == 0) { - JOptionPane.showMessageDialog(null, "Sorry, cards with name: " + name + " not found.", "Filter", - JOptionPane.INFORMATION_MESSAGE); - } else { - filterCardList = filter.CardListTextFilter(filterCardList, cText); - if (filterCardList.size() == 0) { - JOptionPane.showMessageDialog(null, "Sorry, cards with text: " + cText + " not found.", - "Filter", JOptionPane.INFORMATION_MESSAGE); - } else { - if (jCheckBoxBlack.isSelected() == false) { - filterCardList = filter.CardListColorFilter(filterCardList, "black"); - g.blackCheckBox.setSelected(false); - g.blackCheckBox.setEnabled(false); - } - if (jCheckBoxBlue.isSelected() == false) { - filterCardList = filter.CardListColorFilter(filterCardList, "blue"); - g.blueCheckBox.setSelected(false); - g.blueCheckBox.setEnabled(false); - } - if (jCheckBoxGreen.isSelected() == false) { - filterCardList = filter.CardListColorFilter(filterCardList, "green"); - g.greenCheckBox.setSelected(false); - g.greenCheckBox.setEnabled(false); - } - if (jCheckBoxRed.isSelected() == false) { - filterCardList = filter.CardListColorFilter(filterCardList, "red"); - g.redCheckBox.setSelected(false); - g.redCheckBox.setEnabled(false); - } - if (jCheckBoxWhite.isSelected() == false) { - filterCardList = filter.CardListColorFilter(filterCardList, "white"); - g.whiteCheckBox.setSelected(false); - g.whiteCheckBox.setEnabled(false); - } - if (jCheckBoxColorless.isSelected() == false) { - filterCardList = filter.CardListColorFilter(filterCardList, "colorless"); - g.colorlessCheckBox.setSelected(false); - g.colorlessCheckBox.setEnabled(false); - } - if (jCheckBoxArtifact.isSelected() == false) { - filterCardList = filter.CardListTypeFilter(filterCardList, "artifact"); - g.artifactCheckBox.setSelected(false); - g.artifactCheckBox.setEnabled(false); - } - if (jCheckBoxCreature.isSelected() == false) { - filterCardList = filter.CardListTypeFilter(filterCardList, "creature"); - g.creatureCheckBox.setSelected(false); - g.creatureCheckBox.setEnabled(false); - } - if (jCheckBoxEnchant.isSelected() == false) { - filterCardList = filter.CardListTypeFilter(filterCardList, "enchantment"); - g.enchantmentCheckBox.setSelected(false); - g.enchantmentCheckBox.setEnabled(false); - } - if (jCheckBoxInstant.isSelected() == false) { - filterCardList = filter.CardListTypeFilter(filterCardList, "instant"); - g.instantCheckBox.setSelected(false); - g.instantCheckBox.setEnabled(false); - } - if (jCheckBoxLand.isSelected() == false) { - filterCardList = filter.CardListTypeFilter(filterCardList, "land"); - g.landCheckBox.setSelected(false); - g.landCheckBox.setEnabled(false); - } - if (jCheckBoxPlaneswalker.isSelected() == false) { - filterCardList = filter.CardListTypeFilter(filterCardList, "planeswalker"); - g.planeswalkerCheckBox.setSelected(false); - g.planeswalkerCheckBox.setEnabled(false); - } - if (jCheckBoxSorcery.isSelected() == false) { - filterCardList = filter.CardListTypeFilter(filterCardList, "sorcery"); - g.sorceryCheckBox.setSelected(false); - g.sorceryCheckBox.setEnabled(false); - } - deckDisplay.updateDisplay(filterCardList, deckDisplay.getBottom()); - } - } - } - - } - dispose(); - } -} diff --git a/src/forge/GUI_ImportPicture.java b/src/forge/GUI_ImportPicture.java deleted file mode 100644 index 6ac832b97bb..00000000000 --- a/src/forge/GUI_ImportPicture.java +++ /dev/null @@ -1,371 +0,0 @@ -package forge; - -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - -import javax.swing.*; -import javax.swing.event.MouseInputAdapter; - -import java.awt.Color; -import java.awt.*; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -/** - *

- * GUI_ImportPicture class. - *

- * - * @author Forge - * @version $Id: $ - */ -public class GUI_ImportPicture extends JDialog implements NewConstants { - /** Constant serialVersionUID=-4191539152208389089L */ - private static final long serialVersionUID = -4191539152208389089L; - private JPanel jContentPane = null; - private JLabel jLabel = null; - private JLabel jLabel1 = null; - private JLabel jLabelSource = null; - private JButton jButtonSource = null; - private JPanel jPanel = null; - private JCheckBox jCheckBox = null; - private JButton jButtonStart = null; - GUI_ImportPicture frame; - private JLabel jLabelHDDFree = null; - private JLabel jLabelNeedSpace = null; - public JLabel jLabelTotalFiles = null; - private List listFiles; - private ArrayList fileCopyList; - private long freeSpaceM; - private int filesForCopy; - private String oldText; - private JProgressBar jProgressBar = null; - - /** - *

- * Constructor for GUI_ImportPicture. - *

- * - * @param owner - * a {@link javax.swing.JFrame} object. - */ - public GUI_ImportPicture(JFrame owner) { - super(owner); - frame = this; - initialize(); - } - - /** - * This method initializes this - */ - private void initialize() { - Dimension screen = getToolkit().getScreenSize(); - Rectangle bounds = getBounds(); - - bounds.width = 400; - bounds.height = 295; - this.setSize(new Dimension(400, 295)); - this.setResizable(false); - bounds.x = (screen.width - bounds.width) / 2; - bounds.y = (screen.height - bounds.height) / 2; - setBounds(bounds); - this.setModal(true); - this.setTitle("Import Picture"); - this.setContentPane(getJContentPane()); - } - - /** - * This method initializes jContentPane - * - * @return javax.swing.JPanel - */ - private JPanel getJContentPane() { - if (jContentPane == null) { - jLabelTotalFiles = new JLabel(); - jLabelTotalFiles.setBounds(new Rectangle(15, 180, 248, 16)); - jLabelTotalFiles.setText("Total files for copying: Unknown."); - jLabelNeedSpace = new JLabel(); - jLabelNeedSpace.setBounds(new Rectangle(15, 150, 177, 16)); - jLabelNeedSpace.setText("HDD Need Space: Unknown."); - jLabelHDDFree = new JLabel(); - jLabelHDDFree.setBounds(new Rectangle(15, 119, 177, 16)); - - File file = ForgeProps.getFile(IMAGE_BASE); - - long freeSpace = file.getFreeSpace(); - freeSpaceM = freeSpace / 1024 / 1024; - - // MiB here is not a typo; it is the unit for megabytes calculated - // by powers of 1024 instead of 1000. - jLabelHDDFree.setText("HDD Free Space: " + freeSpaceM + " MiB"); - - jLabelSource = new JLabel(); - jLabelSource.setBounds(new Rectangle(63, 45, 267, 17)); - jLabelSource.setBorder(BorderFactory.createLineBorder(Color.black, 1)); - jLabelSource.setText(""); - jLabel1 = new JLabel(); - jLabel1.setBounds(new Rectangle(16, 45, 48, 17)); - jLabel1.setText("Source:"); - jLabel = new JLabel(); - jLabel.setBounds(new Rectangle(15, 15, 360, 19)); - jLabel.setText("Please select source directory:"); - jContentPane = new JPanel(); - jContentPane.setLayout(null); - jContentPane.add(jLabel, null); - jContentPane.add(jLabel1, null); - jContentPane.add(jLabelSource, null); - jContentPane.add(getJButtonSource(), null); - jContentPane.add(getJPanel(), null); - jContentPane.add(getJButtonStart(), null); - jContentPane.add(jLabelHDDFree, null); - jContentPane.add(jLabelNeedSpace, null); - jContentPane.add(jLabelTotalFiles, null); - jContentPane.add(getJProgressBar(), null); - } - return jContentPane; - } - - /** - * This method initializes jButtonSource - * - * @return javax.swing.JButton - */ - private JButton getJButtonSource() { - if (jButtonSource == null) { - jButtonSource = new JButton(); - jButtonSource.setBounds(new Rectangle(329, 45, 47, 17)); - jButtonSource.setText("..."); - jButtonSource.addMouseListener(new java.awt.event.MouseAdapter() { - @Override - public void mouseClicked(java.awt.event.MouseEvent e) { - JFileChooser chooser; - String choosertitle; - choosertitle = "Select source directory."; - chooser = new JFileChooser(); - chooser.setCurrentDirectory(new java.io.File(".")); - chooser.setDialogTitle(choosertitle); - chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - - chooser.setAcceptAllFileFilterUsed(false); - oldText = jLabelSource.getText(); - jLabelSource.setText("Please wait..."); - if (chooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) { - FileFinder ff = new FileFinder(); - try { - listFiles = ff.findFiles(chooser.getSelectedFile().toString(), ".+\\.jpg"); - } catch (Exception e2) { - e2.printStackTrace(); - } - jLabelSource.setText(chooser.getSelectedFile().toString()); - if (jCheckBox.isSelected()) { - filesForCopy = ff.getFilesNumber(); - jLabelTotalFiles.setText("Total files for copying: " + filesForCopy); - jLabelNeedSpace.setText("HDD Need Space: " + ff.getDirectorySize() / 1024 / 1024 + " MB"); - jProgressBar.setValue(0); - if ((freeSpaceM > (ff.getDirectorySize() / 1024 / 1024)) && (filesForCopy > 0)) { - jButtonStart.setEnabled(true); - } - - } else { - String fName; - int start; - long filesToCopySize; - filesForCopy = 0; - filesToCopySize = 0; - fileCopyList = new ArrayList(); - - for (int i = 0; i < listFiles.size(); i++) { - - fName = listFiles.get(i).getName(); - start = fName.indexOf("full"); - fName = fName.substring(0, start - 1) + fName.substring(start + 4, fName.length() - 4); - fName = GuiDisplayUtil.cleanString(fName) + ".jpg"; - File file = new File(ForgeProps.getFile(IMAGE_BASE), fName); - if (!file.exists()) { - filesForCopy = filesForCopy + 1; - filesToCopySize = filesToCopySize + listFiles.get(i).length(); - fileCopyList.add(listFiles.get(i)); - } - } - jLabelTotalFiles.setText("Total files for copying: " + filesForCopy); - jLabelNeedSpace.setText("HDD Need Space: " + filesToCopySize / 1024 / 1024 + " MB"); - jProgressBar.setValue(0); - if ((freeSpaceM > (filesToCopySize / 1024 / 1024)) && (filesForCopy > 0)) { - jButtonStart.setEnabled(true); - } - } - - } else { - if (oldText.equals("")) { - jLabelSource.setText(""); - } else { - jLabelSource.setText(oldText); - } - - } - } - }); - } - return jButtonSource; - } - - /** - * This method initializes jPanel - * - * @return javax.swing.JPanel - */ - private JPanel getJPanel() { - if (jPanel == null) { - GridBagConstraints gridBagConstraints = new GridBagConstraints(); - gridBagConstraints.gridx = 0; - gridBagConstraints.gridwidth = 2; - gridBagConstraints.insets = new Insets(0, 0, 0, 120); - gridBagConstraints.gridy = 0; - jPanel = new JPanel(); - jPanel.setLayout(new GridBagLayout()); - jPanel.setBounds(new Rectangle(15, 74, 362, 31)); - jPanel.setBorder(BorderFactory.createLineBorder(Color.black, 1)); - jPanel.add(getJCheckBox(), gridBagConstraints); - } - return jPanel; - } - - /** - * This method initializes jCheckBox - * - * @return javax.swing.JCheckBox - */ - private JCheckBox getJCheckBox() { - if (jCheckBox == null) { - jCheckBox = new JCheckBox(); - jCheckBox.setSelected(false); - jCheckBox.setText("Overwriting picture in resource folder"); - jCheckBox.addMouseListener(new java.awt.event.MouseAdapter() { - @Override - public void mouseClicked(java.awt.event.MouseEvent e) { - jButtonStart.setEnabled(false); - if (jLabelSource.getText() != "") { - FileFinder ff = new FileFinder(); - try { - listFiles = ff.findFiles(jLabelSource.getText().toString(), ".+\\.jpg"); - } catch (Exception e2) { - e2.printStackTrace(); - } - if (jCheckBox.isSelected()) { - filesForCopy = ff.getFilesNumber(); - jLabelTotalFiles.setText("Total files for copying: " + filesForCopy); - jLabelNeedSpace.setText("HDD Need Space: " + ff.getDirectorySize() / 1024 / 1024 + " MB"); - jProgressBar.setValue(0); - if ((freeSpaceM > (ff.getDirectorySize() / 1024 / 1024)) && (filesForCopy > 0)) { - jButtonStart.setEnabled(true); - } - } else { - - String fName; - int start; - long filesToCopySize; - filesForCopy = 0; - filesToCopySize = 0; - fileCopyList = new ArrayList(); - - for (int i = 0; i < listFiles.size(); i++) { - - fName = listFiles.get(i).getName(); - start = fName.indexOf("full"); - fName = fName.substring(0, start - 1) + fName.substring(start + 4, fName.length() - 4); - fName = GuiDisplayUtil.cleanString(fName) + ".jpg"; - File file = new File(ForgeProps.getFile(IMAGE_BASE), fName); - if (!file.exists()) { - filesForCopy = filesForCopy + 1; - filesToCopySize = filesToCopySize + listFiles.get(i).length(); - fileCopyList.add(listFiles.get(i)); - } - } - jLabelTotalFiles.setText("Total files for copying: " + filesForCopy); - jLabelNeedSpace.setText("HDD Need Space: " + filesToCopySize / 1024 / 1024 + " MB"); - jProgressBar.setValue(0); - if ((freeSpaceM > (filesToCopySize / 1024 / 1024)) && (filesForCopy > 0)) { - jButtonStart.setEnabled(true); - } - } - } - } - }); - } - return jCheckBox; - } - - /** - * This method initializes jButtonStart - * - * @return javax.swing.JButton - */ - private JButton getJButtonStart() { - if (jButtonStart == null) { - jButtonStart = new JButton(); - jButtonStart.setEnabled(false); - jButtonStart.setBounds(new Rectangle(136, 239, 123, 17)); - jButtonStart.setText("Import"); - // jButtonStart.addMouseListener(new CustomListener()); - jButtonStart.addMouseListener(new MouseInputAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - - if (jButtonStart.isEnabled()) { - jLabelTotalFiles.setText("Please wait while all files are copying."); - if (jCheckBox.isSelected()) { - jButtonStart.setEnabled(false); - jCheckBox.setEnabled(false); - jButtonSource.setEnabled(false); - CopyFiles cFiles = new CopyFiles(listFiles, jLabelTotalFiles, jProgressBar, jCheckBox, - jButtonSource); - cFiles.addPropertyChangeListener(new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - if ("progress".equals(evt.getPropertyName())) { - jProgressBar.setValue((Integer) evt.getNewValue()); - } - } - }); - cFiles.execute(); - } else { - jButtonStart.setEnabled(false); - jCheckBox.setEnabled(false); - jButtonSource.setEnabled(false); - CopyFiles cFiles = new CopyFiles(fileCopyList, jLabelTotalFiles, jProgressBar, jCheckBox, - jButtonSource); - cFiles.addPropertyChangeListener(new PropertyChangeListener() { - public void propertyChange(PropertyChangeEvent evt) { - if ("progress".equals(evt.getPropertyName())) { - jProgressBar.setValue((Integer) evt.getNewValue()); - } - } - }); - } - } - } - }); - } - return jButtonStart; - } - - /** - * This method initializes jProgressBar - * - * @return javax.swing.JProgressBar - */ - private JProgressBar getJProgressBar() { - if (jProgressBar == null) { - jProgressBar = new JProgressBar(); - jProgressBar.setBounds(new Rectangle(15, 210, 363, 18)); - jProgressBar.setMinimum(0); - jProgressBar.setMaximum(100); - } - return jProgressBar; - } -} // @jve:decl-index=0:visual-constraint="10,10" diff --git a/src/forge/GUI_Quest_Filter.java b/src/forge/GUI_Quest_Filter.java deleted file mode 100644 index 0c815053d56..00000000000 --- a/src/forge/GUI_Quest_Filter.java +++ /dev/null @@ -1,741 +0,0 @@ -package forge; - -import java.awt.Dimension; -import java.awt.Font; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.WindowEvent; -import java.awt.event.WindowListener; -import java.awt.event.WindowAdapter; - -import javax.swing.BorderFactory; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.border.BevelBorder; -import javax.swing.event.MouseInputAdapter; - -import net.miginfocom.swing.MigLayout; - -/** - * @author Forge - * @version $Id: $ - */ -public class GUI_Quest_Filter extends JDialog { - - /** - * Constant serialVersionUID=-8475271235196182185L - */ - private static final long serialVersionUID = -8475271235196182185L; - private JLabel nameLabel; - private JTextField nameTextField; - private JLabel cardTextLabel; - private JTextField cardTextField; - private JPanel colorPanel; - private JPanel bottomPanel; - private JCheckBox jCheckBoxColorless; - private JCheckBox jCheckBoxWhite; - private JCheckBox jCheckBoxRed; - private JCheckBox jCheckBoxGreen; - private JCheckBox jCheckBoxBlue; - private JLabel colorLabel; - private JLabel typeLabel; - private JCheckBox jCheckBoxPlaneswalker; - private JCheckBox jCheckBoxArtifact; - private JCheckBox jCheckBoxCreature; - private JCheckBox jCheckBoxEnchant; - private JCheckBox jCheckBoxInstant; - private JCheckBox jCheckBoxLand; - private JCheckBox jCheckBoxSorcery; - private JPanel typePanel; - private JCheckBox jCheckBoxBlack; - private JButton jButtonOk; - private JPanel topPanel; - private DeckDisplay deckDisplay; - - /** - *

- * Constructor for GUI_Quest_Filter. - *

- * - * @param g - * a {@link javax.swing.JFrame} object. - * @param display - * a {@link forge.DeckDisplay} object. - */ - public GUI_Quest_Filter(JFrame g, DeckDisplay display) { - super(g); - deckDisplay = display; - initGUI(); - } - - /** - *

- * initGUI. - *

- */ - private void initGUI() { - try { - this.isResizable(); - getContentPane().setLayout(new MigLayout("fill")); - getContentPane().add(getTopPanel(), "span 3, wrap"); - getContentPane().add(getColorPanel(), "aligny top, growy"); - getContentPane().add(getTypePanel(), "aligny top, wrap"); - getContentPane().add(getBottomPanel(), "align center, span 3"); - setVisible(true); - Dimension screen = getToolkit().getScreenSize(); - int x = (screen.width - 340) / 2; - int y = (screen.height - 500) / 2; - this.setBounds(x, y, 340, 500); - this.setResizable(true); - this.setTitle("Filter"); - - setIconImage(null); - - this.addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent arg0) { - Gui_DeckEditor g = (Gui_DeckEditor) deckDisplay; - g.setEnabled(true); - } - }); - - } catch (Exception e) { - e.printStackTrace(); - } - } - - private JTextField getNameTextField() { - if (nameTextField == null) { - nameTextField = new JTextField(30); - nameTextField.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return nameTextField; - } - - private JLabel getNameLabel() { - if (nameLabel == null) { - nameLabel = new JLabel(); - nameLabel.setText("Name:"); - nameLabel.setFont(new Font("Segoe UI", 0, 16)); - } - return nameLabel; - } - - private JPanel getTopPanel() { - if (topPanel == null) { - topPanel = new JPanel(); - topPanel.setLayout(new MigLayout()); - topPanel.add(getNameLabel(), "gap"); - topPanel.add(getNameTextField(), "span 3, wrap"); - topPanel.add(getCardTextLabel(), "gap"); - topPanel.add(getCardTextField(), "span 3, wrap"); - } - - return topPanel; - } - - /** - *

- * Getter for the field colorPanel. - *

- * - * @return a {@link javax.swing.JPanel} object. - */ - private JPanel getColorPanel() { - if (colorPanel == null) { - colorPanel = new JPanel(); - colorPanel.setLayout(new MigLayout()); - colorPanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); - colorPanel.setBackground(new java.awt.Color(192, 192, 192)); - colorPanel.add(getColorLabel(), "align, wrap"); - colorPanel.add(getJCheckBoxBlack(), "wrap"); - colorPanel.add(getJCheckBoxColorless(), "wrap"); - colorPanel.add(getJCheckBoxWhite(), "wrap"); - colorPanel.add(getJCheckBoxRed(), "wrap"); - colorPanel.add(getJCheckBoxGreen(), "wrap"); - colorPanel.add(getJCheckBoxBlue(), "wrap"); - } - return colorPanel; - } - - private JPanel getBottomPanel() { - if (bottomPanel == null) { - bottomPanel = new JPanel(); - bottomPanel.setLayout(new MigLayout()); - bottomPanel.add(getJButtonOk(), "align, span 3, grow"); - } - return bottomPanel; - } - - /** - *

- * Getter for the field jCheckBoxBlue. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxBlue() { - if (jCheckBoxBlue == null) { - jCheckBoxBlue = new JCheckBox(); - jCheckBoxBlue.setText("Blue"); - jCheckBoxBlue.setSelected(true); - jCheckBoxBlue.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxBlue.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxBlue; - } - - /** - *

- * Getter for the field jCheckBoxGreen. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxGreen() { - if (jCheckBoxGreen == null) { - jCheckBoxGreen = new JCheckBox(); - jCheckBoxGreen.setText("Green"); - jCheckBoxGreen.setSelected(true); - jCheckBoxGreen.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxGreen.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxGreen; - } - - /** - *

- * Getter for the field jCheckBoxRed. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxRed() { - if (jCheckBoxRed == null) { - jCheckBoxRed = new JCheckBox(); - jCheckBoxRed.setText("Red"); - jCheckBoxRed.setSelected(true); - jCheckBoxRed.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxRed.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxRed; - } - - /** - *

- * Getter for the field jCheckBoxWhite. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxWhite() { - if (jCheckBoxWhite == null) { - jCheckBoxWhite = new JCheckBox(); - jCheckBoxWhite.setText("White"); - jCheckBoxWhite.setSelected(true); - jCheckBoxWhite.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxWhite.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxWhite; - } - - /** - *

- * Getter for the field jCheckBoxColorless. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxColorless() { - if (jCheckBoxColorless == null) { - jCheckBoxColorless = new JCheckBox(); - jCheckBoxColorless.setText("Colorless"); - jCheckBoxColorless.setSelected(true); - jCheckBoxColorless.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxColorless.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxColorless; - } - - /** - *

- * Getter for the field jButtonOk. - *

- * - * @return a {@link javax.swing.JButton} object. - */ - private JButton getJButtonOk() { - if (jButtonOk == null) { - jButtonOk = new JButton(); - jButtonOk.setText("OK"); - jButtonOk.addMouseListener(new MouseInputAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - FilterCardTable(); - } - }); - } - return jButtonOk; - } - - /** - *

- * Getter for the field jCheckBoxBlack. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxBlack() { - if (jCheckBoxBlack == null) { - jCheckBoxBlack = new JCheckBox(); - jCheckBoxBlack.setText("Black"); - jCheckBoxBlack.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxBlack.setSelected(true); - jCheckBoxBlack.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxBlack; - } - - /** - *

- * Getter for the field typePanel. - *

- * - * @return a {@link javax.swing.JPanel} object. - */ - private JPanel getTypePanel() { - if (typePanel == null) { - typePanel = new JPanel(); - typePanel.setLayout(new MigLayout()); - typePanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); - typePanel.setBackground(new java.awt.Color(192, 192, 192)); - typePanel.add(getTypeLabel(), "align, wrap"); - typePanel.add(getJCheckBoxSorcery(), "wrap"); - typePanel.add(getJCheckBoxPlaneswalker(), "wrap"); - typePanel.add(getJCheckBoxLand(), "wrap"); - typePanel.add(getJCheckBoxInstant(), "wrap"); - typePanel.add(getJCheckBoxEnchant(), "wrap"); - typePanel.add(getJCheckBoxCreature(), "wrap"); - typePanel.add(getJCheckBoxArtifact(), "wrap"); - } - return typePanel; - } - - /** - *

- * Getter for the field colorLabel. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getColorLabel() { - if (colorLabel == null) { - colorLabel = new JLabel(); - colorLabel.setText("Color"); - colorLabel.setFont(new java.awt.Font("Segoe UI", 0, 14)); - } - return colorLabel; - } - - /** - *

- * Getter for the field typeLabel. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getTypeLabel() { - if (typeLabel == null) { - typeLabel = new JLabel(); - typeLabel.setText("Type"); - typeLabel.setFont(new java.awt.Font("Segoe UI", 0, 14)); - } - return typeLabel; - } - - /** - *

- * getJCheckBoxSorcery. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxSorcery() { - if (jCheckBoxSorcery == null) { - jCheckBoxSorcery = new JCheckBox(); - jCheckBoxSorcery.setText("Sorcery"); - jCheckBoxSorcery.setSelected(true); - jCheckBoxSorcery.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxSorcery.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxSorcery; - } - - /** - *

- * getJCheckBoxPlaneswalker. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxPlaneswalker() { - if (jCheckBoxPlaneswalker == null) { - jCheckBoxPlaneswalker = new JCheckBox(); - jCheckBoxPlaneswalker.setText("Planeswalker"); - jCheckBoxPlaneswalker.setSelected(true); - jCheckBoxPlaneswalker.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxPlaneswalker.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxPlaneswalker; - } - - /** - *

- * getJCheckBoxLand. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxLand() { - if (jCheckBoxLand == null) { - jCheckBoxLand = new JCheckBox(); - jCheckBoxLand.setText("Land"); - jCheckBoxLand.setSelected(true); - jCheckBoxLand.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxLand.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxLand; - } - - /** - *

- * getJCheckBoxInstant. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxInstant() { - if (jCheckBoxInstant == null) { - jCheckBoxInstant = new JCheckBox(); - jCheckBoxInstant.setText("Instant"); - jCheckBoxInstant.setSelected(true); - jCheckBoxInstant.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxInstant.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxInstant; - } - - /** - *

- * getJCheckBoxEnchant. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxEnchant() { - if (jCheckBoxEnchant == null) { - jCheckBoxEnchant = new JCheckBox(); - jCheckBoxEnchant.setText("Enchant"); - jCheckBoxEnchant.setSelected(true); - jCheckBoxEnchant.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxEnchant.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxEnchant; - } - - /** - *

- * getJCheckBoxCreature. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxCreature() { - if (jCheckBoxCreature == null) { - jCheckBoxCreature = new JCheckBox(); - jCheckBoxCreature.setText("Creature"); - jCheckBoxCreature.setSelected(true); - jCheckBoxCreature.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxCreature.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxCreature; - } - - /** - *

- * getJCheckBoxArtifact. - *

- * - * @return a {@link javax.swing.JCheckBox} object. - */ - private JCheckBox getJCheckBoxArtifact() { - if (jCheckBoxArtifact == null) { - jCheckBoxArtifact = new JCheckBox(); - jCheckBoxArtifact.setText("Artifact"); - jCheckBoxArtifact.setSelected(true); - jCheckBoxArtifact.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxArtifact.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return jCheckBoxArtifact; - } - - /** - *

- * getCardTextField. - *

- * - * @return a {@link javax.swing.JTextField} object. - */ - private JTextField getCardTextField() { - if (cardTextField == null) { - cardTextField = new JTextField(30); - cardTextField.addKeyListener(new java.awt.event.KeyAdapter() { - @Override - public void keyPressed(java.awt.event.KeyEvent e) { - - if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) { - FilterCardTable(); - } - } - }); - } - return cardTextField; - } - - /** - *

- * Getter for the field cardTextLabel. - *

- * - * @return a {@link javax.swing.JLabel} object. - */ - private JLabel getCardTextLabel() { - if (cardTextLabel == null) { - cardTextLabel = new JLabel(); - cardTextLabel.setText("Card Text:"); - cardTextLabel.setFont(new java.awt.Font("Segoe UI", 0, 16)); - } - return cardTextLabel; - } - - /** - *

- * FilterCardTable. - *

- */ - private void FilterCardTable() { - String name = nameTextField.getText(); - String cText = cardTextField.getText(); - Gui_Quest_DeckEditor g = (Gui_Quest_DeckEditor) deckDisplay; - CardFilter filter = new CardFilter(); - g.setEnabled(true); - CardList filterCardList = g.stCardList; - if (name != "") { - if (cText != "") { - filterCardList = filter.cardListNameFilter(filterCardList, name); - if (filterCardList.size() == 0) { - JOptionPane.showMessageDialog(null, "Sorry, cards with name: " + name + " not found.", "Filter", - JOptionPane.INFORMATION_MESSAGE); - g.filterUsed = false; - deckDisplay.updateDisplay(g.stCardList, deckDisplay.getBottom()); - } else { - filterCardList = filter.CardListTextFilter(filterCardList, cText); - if (filterCardList.size() == 0) { - JOptionPane.showMessageDialog(null, "Sorry, cards with text: " + cText + " not found.", - "Filter", JOptionPane.INFORMATION_MESSAGE); - g.filterUsed = false; - deckDisplay.updateDisplay(g.stCardList, deckDisplay.getBottom()); - } else { - if (jCheckBoxBlack.isSelected() == false) { - filterCardList = filter.CardListColorFilter(filterCardList, "black"); - g.blackCheckBox.setSelected(false); - g.blackCheckBox.setEnabled(false); - } - if (jCheckBoxBlue.isSelected() == false) { - filterCardList = filter.CardListColorFilter(filterCardList, "blue"); - g.blueCheckBox.setSelected(false); - g.blueCheckBox.setEnabled(false); - } - if (jCheckBoxGreen.isSelected() == false) { - filterCardList = filter.CardListColorFilter(filterCardList, "green"); - g.greenCheckBox.setSelected(false); - g.greenCheckBox.setEnabled(false); - } - if (jCheckBoxRed.isSelected() == false) { - filterCardList = filter.CardListColorFilter(filterCardList, "red"); - g.redCheckBox.setSelected(false); - g.redCheckBox.setEnabled(false); - } - if (jCheckBoxWhite.isSelected() == false) { - filterCardList = filter.CardListColorFilter(filterCardList, "white"); - g.whiteCheckBox.setSelected(false); - g.whiteCheckBox.setEnabled(false); - } - if (jCheckBoxColorless.isSelected() == false) { - filterCardList = filter.CardListColorFilter(filterCardList, "colorless"); - g.colorlessCheckBox.setSelected(false); - g.colorlessCheckBox.setEnabled(false); - } - if (jCheckBoxArtifact.isSelected() == false) { - filterCardList = filter.CardListTypeFilter(filterCardList, "artifact"); - g.artifactCheckBox.setSelected(false); - g.artifactCheckBox.setEnabled(false); - } - if (jCheckBoxCreature.isSelected() == false) { - filterCardList = filter.CardListTypeFilter(filterCardList, "creature"); - g.creatureCheckBox.setSelected(false); - g.creatureCheckBox.setEnabled(false); - } - if (jCheckBoxEnchant.isSelected() == false) { - filterCardList = filter.CardListTypeFilter(filterCardList, "enchantment"); - g.enchantmentCheckBox.setSelected(false); - g.enchantmentCheckBox.setEnabled(false); - } - if (jCheckBoxInstant.isSelected() == false) { - filterCardList = filter.CardListTypeFilter(filterCardList, "instant"); - g.instantCheckBox.setSelected(false); - g.instantCheckBox.setEnabled(false); - } - if (jCheckBoxLand.isSelected() == false) { - filterCardList = filter.CardListTypeFilter(filterCardList, "land"); - g.landCheckBox.setSelected(false); - g.landCheckBox.setEnabled(false); - } - if (jCheckBoxPlaneswalker.isSelected() == false) { - filterCardList = filter.CardListTypeFilter(filterCardList, "planeswalker"); - g.planeswalkerCheckBox.setSelected(false); - g.planeswalkerCheckBox.setEnabled(false); - } - if (jCheckBoxSorcery.isSelected() == false) { - filterCardList = filter.CardListTypeFilter(filterCardList, "sorcery"); - g.sorceryCheckBox.setSelected(false); - g.sorceryCheckBox.setEnabled(false); - } - - deckDisplay.updateDisplay(filterCardList, deckDisplay.getBottom()); - } - } - } - - } - dispose(); - } -} diff --git a/src/forge/GameAction.java b/src/forge/GameAction.java deleted file mode 100644 index 6aafcf0a04e..00000000000 --- a/src/forge/GameAction.java +++ /dev/null @@ -1,2345 +0,0 @@ -package forge; - - -import forge.card.abilityFactory.AbilityFactory; -import forge.card.abilityFactory.AbilityFactory_Attach; -import forge.card.cardFactory.CardFactoryInterface; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.mana.ManaCost; -import forge.card.mana.ManaPool; -import forge.card.spellability.*; -import forge.card.staticAbility.StaticAbility; -import forge.card.trigger.Trigger; -import forge.deck.Deck; -import forge.gui.GuiUtils; -import forge.gui.input.Input_Mulligan; -import forge.gui.input.Input_PayManaCost; -import forge.gui.input.Input_PayManaCost_Ability; -import forge.properties.ForgeProps; -import forge.properties.NewConstants.LANG.GameAction.GAMEACTION_TEXT; - -import javax.swing.*; -import java.util.*; - -/** - *

GameAction class.

- * - * @author Forge - * @version $Id: $ - */ -public class GameAction { - - /** - *

resetActivationsPerTurn.

- */ - public void resetActivationsPerTurn() { - CardList all = AllZoneUtil.getCardsInGame(); - - // Reset Activations per Turn - for (Card card : all) { - for (SpellAbility sa : card.getSpellAbility()) - sa.getRestrictions().resetTurnActivations(); - } - } - - /** - *

changeZone.

- * - * @param prev a {@link forge.PlayerZone} object. - * @param zone a {@link forge.PlayerZone} object. - * @param c a {@link forge.Card} object. - * @return a {@link forge.Card} object. - */ - public static Card changeZone(PlayerZone prev, PlayerZone zone, Card c) { - if (prev == null && !c.isToken()) { - zone.add(c); - return c; - } - - boolean suppress; - if (prev == null && !c.isToken()) { - suppress = true; - } else if (c.isToken()) { - suppress = false; - } else { - suppress = prev.equals(zone); - } - - Card copied = null; - - // Don't copy Tokens, Cards staying in same zone, or cards entering Battlefield - if (c.isToken() || suppress || zone.is(Constant.Zone.Battlefield)) - copied = c; - else { - copied = AllZone.getCardFactory().copyCard(c); - - // todo: improve choices here - // Certain attributes need to be copied from Hand->Stack and Stack->Battlefield - if (c.wasSuspendCast()) // these probably can be moved back to SubtractCounters - copied = addSuspendTriggers(c); - copied.setUnearthed(c.isUnearthed()); // this might be unnecessary - } - - // This is the fix for Isochron Scepter and friends, we need to test other situations - // To make sure it doesn't break anything serious - for (Trigger trigger : c.getTriggers()) - trigger.setHostCard(copied); - - if (suppress) - AllZone.getTriggerHandler().suppressMode("ChangesZone"); - - zone.add(copied); - - //Tokens outside the battlefield disappear immideately. - if (copied.isToken() && !zone.is(Constant.Zone.Battlefield)) - zone.remove(copied); - - HashMap runParams = new HashMap(); - runParams.put("Card", copied); - if (prev != null) { - runParams.put("Origin", prev.getZoneName()); - } else { - runParams.put("Origin", null); - } - runParams.put("Destination", zone.getZoneName()); - AllZone.getTriggerHandler().runTrigger("ChangesZone", runParams); - //AllZone.getStack().chooseOrderOfSimultaneousStackEntryAll(); - - if (suppress) - AllZone.getTriggerHandler().clearSuppression("ChangesZone"); - - if (prev != null) { - if (prev.is(Constant.Zone.Battlefield) && c.isCreature()) - AllZone.getCombat().removeFromCombat(c); - - prev.remove(c); - } - - //remove all counters from the card if destination is not the battlefield - if (!zone.is(Constant.Zone.Battlefield)) - copied.clearCounters(); - - copied.setTimestamp(AllZone.getNextTimestamp()); - - return copied; - } - - /** - *

moveTo.

- * - * @param zone a {@link forge.PlayerZone} object. - * @param c a {@link forge.Card} object. - * @return a {@link forge.Card} object. - */ - public Card moveTo(PlayerZone zone, Card c) { - // Ideally move to should never be called without a prevZone - // Remove card from Current Zone, if it has one - PlayerZone prev = AllZone.getZone(c); - //String prevName = prev != null ? prev.getZoneName() : ""; - - if (c.hasKeyword("If CARDNAME would leave the battlefield, exile it instead of putting it anywhere else.") && - !zone.is(Constant.Zone.Exile)) { - PlayerZone removed = AllZone.getZone(Constant.Zone.Exile, c.getOwner()); - c.removeExtrinsicKeyword("If CARDNAME would leave the battlefield, exile it instead of putting it anywhere else."); - return moveTo(removed, c); - } - - //Card lastKnownInfo = c; - - c = changeZone(prev, zone, c); - - if (c.isAura() && zone.is(Constant.Zone.Battlefield) && (prev == null || !prev.is(Constant.Zone.Stack))) { - // TODO: Need a way to override this for Abilities that put Auras into play attached to things - AbilityFactory_Attach.attachAuraOnIndirectEnterBattlefield(c); - } - - return c; - } - - /** - *

moveToPlayFromHand.

- * - * @param c a {@link forge.Card} object. - * @return a {@link forge.Card} object. - */ - public Card moveToPlayFromHand(Card c) { - //handles the case for Clone, etc where prev was null - - PlayerZone hand = AllZone.getZone(Constant.Zone.Hand, c.getOwner()); - PlayerZone play = AllZone.getZone(Constant.Zone.Battlefield, c.getController()); - - c = changeZone(hand, play, c); - - return c; - } - - /** - *

changeController.

- * - * @param list a {@link forge.CardList} object. - * @param oldController a {@link forge.Player} object. - * @param newController a {@link forge.Player} object. - */ - public void changeController(CardList list, Player oldController, Player newController) { - if (oldController.equals(newController)) - return; - - // Consolidating this code for now. In the future I want moveTo to handle this garbage - PlayerZone oldBattlefield = AllZone.getZone(Constant.Zone.Battlefield, oldController); - PlayerZone newBattlefield = AllZone.getZone(Constant.Zone.Battlefield, newController); - - AllZone.getTriggerHandler().suppressMode("ChangesZone"); - ((PlayerZone_ComesIntoPlay) AllZone.getHumanBattlefield()).setTriggers(false); - ((PlayerZone_ComesIntoPlay) AllZone.getComputerBattlefield()).setTriggers(false); - //so "enters the battlefield" abilities don't trigger - - for (Card c : list) { - int turnInZone = c.getTurnInZone(); - oldBattlefield.remove(c); - c.setController(newController); - newBattlefield.add(c); - //set summoning sickness - c.setSickness(true); - c.setTurnInZone(turnInZone); // The number of turns in the zone should not change - if (c.isCreature()) - AllZone.getCombat().removeFromCombat(c); - } - - AllZone.getTriggerHandler().clearSuppression("ChangesZone"); - ((PlayerZone_ComesIntoPlay) AllZone.getHumanBattlefield()).setTriggers(true); - ((PlayerZone_ComesIntoPlay) AllZone.getComputerBattlefield()).setTriggers(true); - } - - /** - *

moveToStack.

- * - * @param c a {@link forge.Card} object. - * @return a {@link forge.Card} object. - */ - public Card moveToStack(Card c) { - PlayerZone stack = AllZone.getZone(Constant.Zone.Stack, null); - return moveTo(stack, c); - } - - /** - *

moveToGraveyard.

- * - * @param c a {@link forge.Card} object. - * @return a {@link forge.Card} object. - */ - public Card moveToGraveyard(Card c) { - final PlayerZone origZone = AllZone.getZone(c); - final PlayerZone grave = AllZone.getZone(Constant.Zone.Graveyard, c.getOwner()); - - if (AllZoneUtil.isCardInPlay("Leyline of the Void", c.getOwner().getOpponent())) { - return moveTo(AllZone.getZone(Constant.Zone.Exile, c.getOwner()), c); - } - - if (c.getName().equals("Nissa's Chosen") && origZone.is(Constant.Zone.Battlefield)) { - return moveToLibrary(c, -1); - } - - if (c.hasKeyword("If CARDNAME would be put into a graveyard this turn, exile it instead.")) { - return moveTo(AllZone.getZone(Constant.Zone.Exile, c.getOwner()), c); - } - - if (c.hasKeyword("If CARDNAME is put into a graveyard this turn, its controller gets a poison counter.")) { - c.getController().addPoisonCounters(1); - } - - //must put card in OWNER's graveyard not controller's - c = moveTo(grave, c); - - //Recover keyword - if (c.isCreature() - && origZone.is(Constant.Zone.Battlefield)) { - for (final Card recoverable : AllZoneUtil.getPlayerGraveyard(c.getOwner())) { - if (recoverable.hasStartOfKeyword("Recover")) { - SpellAbility abRecover = new Ability(recoverable, "0") { - @Override - public void resolve() { - AllZone.getGameAction().moveToHand(recoverable); - } - - @Override - public String getStackDescription() { - StringBuilder SD = new StringBuilder(recoverable.getName()); - SD.append(" - Recover."); - - return SD.toString(); - } - }; - - Command notPaid = new Command() { - private static final long serialVersionUID = 5812397026869965462L; - - public void execute() { - AllZone.getGameAction().exile(recoverable); - } - }; - - abRecover.setCancelCommand(notPaid); - abRecover.setTrigger(true); - - String recoverCost = recoverable.getKeyword().get(recoverable.getKeywordPosition("Recover")).split(":")[1]; - Cost abCost = new Cost(recoverCost, recoverable.getName(), false); - abRecover.setPayCosts(abCost); - - StringBuilder question = new StringBuilder("Recover "); - question.append(recoverable.getName()); - question.append("("); - question.append(recoverable.getUniqueNumber()); - question.append(")"); - question.append("?"); - - boolean shouldRecoverForAI = false; - boolean shouldRecoverForHuman = false; - - if (c.getOwner().isHuman()) { - shouldRecoverForHuman = GameActionUtil.showYesNoDialog(recoverable, question.toString()); - } else if (c.getOwner().isComputer()) { - shouldRecoverForAI = ComputerUtil.canPayCost(abRecover); - } - - if (shouldRecoverForHuman) { - AllZone.getStack().addSimultaneousStackEntry(abRecover); - //AllZone.getGameAction().playSpellAbility(abRecover); - } else if (shouldRecoverForAI) { - AllZone.getStack().addSimultaneousStackEntry(abRecover); - //ComputerUtil.playStack(abRecover); - } - - if (!grave.hasChanged()) //If the controller declined Recovery or didn't pay the cost, exile the recoverable - { - - } - } - } - } - return c; - } - - /** - *

moveToHand.

- * - * @param c a {@link forge.Card} object. - * @return a {@link forge.Card} object. - */ - public Card moveToHand(Card c) { - PlayerZone hand = AllZone.getZone(Constant.Zone.Hand, c.getOwner()); - return moveTo(hand, c); - } - - /** - *

moveToPlay.

- * - * @param c a {@link forge.Card} object. - * @return a {@link forge.Card} object. - */ - public Card moveToPlay(Card c) { - PlayerZone play = AllZone.getZone(Constant.Zone.Battlefield, c.getOwner()); - return moveTo(play, c); - } - - /** - *

moveToPlay.

- * - * @param c a {@link forge.Card} object. - * @param p a {@link forge.Player} object. - * @return a {@link forge.Card} object. - */ - public Card moveToPlay(Card c, Player p) { - // move to a specific player's Battlefield - PlayerZone play = AllZone.getZone(Constant.Zone.Battlefield, p); - return moveTo(play, c); - } - - /** - *

moveToBottomOfLibrary.

- * - * @param c a {@link forge.Card} object. - * @return a {@link forge.Card} object. - */ - public Card moveToBottomOfLibrary(Card c) { - return moveToLibrary(c, -1); - } - - /** - *

moveToLibrary.

- * - * @param c a {@link forge.Card} object. - * @return a {@link forge.Card} object. - */ - public Card moveToLibrary(Card c) { - return moveToLibrary(c, 0); - } - - /** - *

moveToLibrary.

- * - * @param c a {@link forge.Card} object. - * @param libPosition a int. - * @return a {@link forge.Card} object. - */ - public Card moveToLibrary(Card c, int libPosition) { - PlayerZone p = AllZone.getZone(c); - PlayerZone library = AllZone.getZone(Constant.Zone.Library, c.getOwner()); - - if (c.hasKeyword("If CARDNAME would leave the battlefield, exile it instead of putting it anywhere else.")) { - PlayerZone removed = AllZone.getZone(Constant.Zone.Exile, c.getOwner()); - c.removeExtrinsicKeyword("If CARDNAME would leave the battlefield, exile it instead of putting it anywhere else."); - return moveTo(removed, c); - } - - if (p != null) p.remove(c); - - - if (c.isToken()) - return c; - - if (p != null && p.is(Constant.Zone.Battlefield)) - c = AllZone.getCardFactory().copyCard(c); - - c.clearCounters(); //remove all counters - - if (libPosition == -1 || libPosition > library.size()) - libPosition = library.size(); - - library.add(c, libPosition); - return c; - } - - /** - *

exile.

- * - * @param c a {@link forge.Card} object. - * @return a {@link forge.Card} object. - */ - public Card exile(Card c) { - if (AllZoneUtil.isCardExiled(c)) return c; - - PlayerZone removed = AllZone.getZone(Constant.Zone.Exile, c.getOwner()); - - return AllZone.getGameAction().moveTo(removed, c); - } - - /** - *

moveTo.

- * - * @param name a {@link java.lang.String} object. - * @param c a {@link forge.Card} object. - * @param libPosition a int. - * @return a {@link forge.Card} object. - */ - public Card moveTo(String name, Card c, int libPosition) { - // Call specific functions to set PlayerZone, then move onto moveTo - if (name.equals(Constant.Zone.Hand)) - return moveToHand(c); - else if (name.equals(Constant.Zone.Library)) - return moveToLibrary(c, libPosition); - else if (name.equals(Constant.Zone.Battlefield)) - return moveToPlay(c); - else if (name.equals(Constant.Zone.Graveyard)) - return moveToGraveyard(c); - else if (name.equals(Constant.Zone.Exile)) - return exile(c); - else //if (name.equals(Constant.Zone.Stack)) - return moveToStack(c); - } - - /** - *

AI_discardNumType.

- * - * @param numDiscard a int. - * @param uTypes an array of {@link java.lang.String} objects. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - public boolean AI_discardNumType(int numDiscard, String[] uTypes, SpellAbility sa) { - CardList hand = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); - CardList tHand = hand.getValidCards(uTypes, sa.getActivatingPlayer(), sa.getSourceCard()); - - if (tHand.size() >= numDiscard) { - CardListUtil.sortCMC(tHand); - tHand.reverse(); - for (int i = 0; i < numDiscard; i++) - tHand.get(i).getController().discard(tHand.get(i), sa); - return true; - } - return false; - } - - /** - *

discard_PutIntoPlayInstead.

- * - * @param c a {@link forge.Card} object. - */ - public void discard_PutIntoPlayInstead(Card c) { - moveToPlay(c); - - if (c.getName().equals("Dodecapod")) - c.setCounter(Counters.P1P1, 2, false); - } - - /** - *

discard_madness.

- * - * @param c a {@link forge.Card} object. - */ - public void discard_madness(Card c) { - // Whenever a card with madness is discarded, you may cast it for it's madness cost - if (!c.hasMadness()) - return; - - final Card madness = c; - final Ability cast = new Ability(madness, madness.getMadnessCost()) { - @Override - public void resolve() { - playCardNoCost(madness); - System.out.println("Madness cost paid"); - } - }; - - StringBuilder sb = new StringBuilder(); - sb.append(madness.getName()).append(" - Cast via Madness"); - cast.setStackDescription(sb.toString()); - - final Ability activate = new Ability(madness, "0") { - @Override - public void resolve() { - // pay madness cost here. - if (madness.getOwner().isHuman()) { - if (GameActionUtil.showYesNoDialog(madness, madness + " - Discarded. Pay Madness Cost?")) { - if (cast.getManaCost().equals("0")) - AllZone.getStack().add(cast); - else - AllZone.getInputControl().setInput(new Input_PayManaCost(cast)); - } - } else // computer will ALWAYS pay a madness cost if he has the mana. - ComputerUtil.playStack(cast); - } - }; - - StringBuilder sbAct = new StringBuilder(); - sbAct.append(madness.getName()).append(" - Discarded. Pay Madness Cost?"); - activate.setStackDescription(sbAct.toString()); - - AllZone.getStack().add(activate); - } - - /** - *

checkEndGameSate.

- * - * @return a boolean. - */ - public boolean checkEndGameSate() { - // Win / Lose - boolean humanWins = false; - boolean computerWins = false; - Player computer = AllZone.getComputerPlayer(); - Player human = AllZone.getHumanPlayer(); - - int gameWon = Constant.Runtime.matchState.getWin(); - - if (human.hasWon()) { // Winning Conditions can be worth more than losing conditions - // Human wins - humanWins = true; - if (human.getAltWin()) { - Constant.Runtime.matchState.setWinMethod(gameWon, human.getWinCondition()); - } - Constant.Runtime.matchState.addWin(); - } else if (computer.hasLost()) { - // Human wins - humanWins = true; - - if (computer.getAltLose()) { - Constant.Runtime.matchState.setWinMethod(gameWon, computer.getLoseCondition()); - } - Constant.Runtime.matchState.addWin(); - } - - - if (computer.hasWon() || human.hasLost()) { - if (humanWins) { - // both players won/lost at the same time. - // TODO: Handle a Draw here - } - - // Computer wins - computerWins = true; - Constant.Runtime.matchState.addLose(); - } - - return humanWins || computerWins; - } - - - /** - *

checkStateEffects.

- */ - public void checkStateEffects() { - // sol(10/29) added for Phase updates, state effects shouldn't be checked during Spell Resolution - if (AllZone.getStack().getResolving()) - return; - - boolean refreeze = AllZone.getStack().isFrozen(); - AllZone.getStack().setFrozen(true); - - JFrame frame = (JFrame) AllZone.getDisplay(); - if (!frame.isDisplayable()) return; - - if (checkEndGameSate()) { - AllZone.getDisplay().savePrefs(); - frame.dispose(); - if (!Constant.Quest.fantasyQuest[0]) - new Gui_WinLose(); - else - new Gui_WinLose(Constant.Quest.humanList[0], Constant.Quest.computerList[0], - Constant.Quest.humanLife[0], Constant.Quest.computerLife[0]); - return; - } - - //do this twice, sometimes creatures/permanents will survive when they shouldn't - for (int q = 0; q < 9; q++) { - - boolean checkAgain = false; - - //remove old effects - AllZone.getStaticEffects().clearStaticEffects(); - - //search for cards with static abilities - CardList allCards = AllZoneUtil.getCardsInGame(); - CardList cardsWithStAbs = new CardList(); - for (Card card : allCards) { - ArrayList staticAbilities = card.getStaticAbilities(); - if (!staticAbilities.isEmpty()) - cardsWithStAbs.add(card); - } - - //apply continuous effects - for (int layer = 4; layer < 9; layer++) { - for (Card card : cardsWithStAbs) { - ArrayList staticAbilities = card.getStaticAbilities(); - for (StaticAbility stAb : staticAbilities) - if (stAb.getLayer() == layer) - stAb.applyAbility("Continuous"); - } - } - - HashMap runParams = new HashMap(); - AllZone.getTriggerHandler().runTrigger("Always", runParams); - - //card state effects like Glorious Anthem - for (String effect : AllZone.getStaticEffects().getStateBasedMap().keySet()) { - Command com = GameActionUtil.commands.get(effect); - com.execute(); - } - - GameActionUtil.stAnimate.execute(); - - CardList list = AllZoneUtil.getCardsInPlay(); - Card c; - - Iterator it = list.iterator(); - - while (it.hasNext()) { - c = it.next(); - - if (c.isEquipped()) { - for (int i = 0; i < c.getEquippedBy().size(); i++) { - Card equipment = c.getEquippedBy().get(i); - if (!AllZoneUtil.isCardInPlay(equipment)) { - equipment.unEquipCard(c); - checkAgain = true; - } - } - }//if isEquipped() - - if (c.isEquipping()) { - Card equippedCreature = c.getEquipping().get(0); - if (!AllZoneUtil.isCardInPlay(equippedCreature)) { - c.unEquipCard(equippedCreature); - checkAgain = true; - } - - //make sure any equipment that has become a creature stops equipping - if (c.isCreature()) { - c.unEquipCard(equippedCreature); - checkAgain = true; - } - }//if isEquipping() - - if (c.isAura()) { - // Check if Card Aura is attached to is a legal target - for (int i = 0; i < c.getEnchanting().size(); i++) { - Card perm = c.getEnchanting().get(i); - - SpellAbility sa = c.getSpellPermanent(); - Target tgt = null; - if (sa != null) - tgt = sa.getTarget(); - - // I think the Keyword checks might be superfluous with the isValidCard check - if (!AllZoneUtil.isCardInPlay(perm) - || CardFactoryUtil.hasProtectionFrom(c, perm) - || ((c.hasKeyword("Enchant creature") || c.hasKeyword("Enchant tapped creature")) - && !perm.isCreature()) - || (c.hasKeyword("Enchant tapped creature") && perm.isUntapped()) - || (tgt != null && !perm.isValidCard(tgt.getValidTgts(), c.getController(), c)) ) { - - c.unEnchantCard(perm); - moveToGraveyard(c); - checkAgain = true; - } - } - }//if isAura - - if (c.isCreature()){ - if (c.getNetDefense() <= c.getDamage() && !c.hasKeyword("Indestructible")) { - destroy(c); - AllZone.getCombat().removeFromCombat(c); //this is untested with instants and abilities but required for First Strike combat phase - checkAgain = true; - } else if (c.getNetDefense() <= 0) { - // TODO: This shouldn't be a destroy, and should happen before the damage check probably - destroy(c); - AllZone.getCombat().removeFromCombat(c); - checkAgain = true; - } - } - - }//while it.hasNext() - - if (!checkAgain) break; //do not continue the loop - - }//for q=0;q<2 - - destroyLegendaryCreatures(); - destroyPlaneswalkers(); - - GameActionUtil.stLandManaAbilities.execute(); - - if (!refreeze) - AllZone.getStack().unfreezeStack(); - }//checkStateEffects() - - - /** - *

destroyPlaneswalkers.

- */ - private void destroyPlaneswalkers() { - //get all Planeswalkers - CardList list = AllZoneUtil.getTypeInPlay("Planeswalker"); - - Card c; - for (int i = 0; i < list.size(); i++) { - c = list.get(i); - - if (c.getCounters(Counters.LOYALTY) <= 0) AllZone.getGameAction().moveToGraveyard(c); - - String subtype = c.getType().get(c.getType().size() - 1); - CardList cl = list.getType(subtype); - - if (cl.size() > 1) { - for (Card crd : cl) { - AllZone.getGameAction().moveToGraveyard(crd); - } - } - } - - } - - /** - *

destroyLegendaryCreatures.

- */ - private void destroyLegendaryCreatures() { - CardList a = AllZoneUtil.getTypeInPlay("Legendary"); - - while (!a.isEmpty() && !AllZoneUtil.isCardInPlay("Mirror Gallery")) { - CardList b = AllZoneUtil.getCardsInPlay(a.get(0).getName()); - a.remove(0); - if (1 < b.size()) { - for (int i = 0; i < b.size(); i++) - AllZone.getGameAction().sacrificeDestroy(b.get(i)); - } - } - }//destroyLegendaryCreatures() - - /** - *

sacrifice.

- * - * @param c a {@link forge.Card} object. - * @return a boolean. - */ - public boolean sacrifice(Card c) { - if (c.getName().equals("Mana Pool")) { - System.out.println("Trying to sacrifice mana pool..."); - return false; - } - sacrificeDestroy(c); - - //Run triggers - HashMap runParams = new HashMap(); - runParams.put("Card", c); - AllZone.getTriggerHandler().runTrigger("Sacrificed", runParams); - - return true; - } - - /** - *

destroyNoRegeneration.

- * - * @param c a {@link forge.Card} object. - * @return a boolean. - */ - public boolean destroyNoRegeneration(Card c) { - if (!AllZoneUtil.isCardInPlay(c) || c.hasKeyword("Indestructible")) return false; - - if (c.isEnchanted()) { - CardList list = new CardList(c.getEnchantedBy().toArray()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card crd) { - return crd.hasKeyword("Totem armor"); - } - }); - CardListUtil.sortCMC(list); - - if (list.size() != 0) { - final Card crd; - if (list.size() == 1) { - crd = list.get(0); - } else { - if (c.getController().isHuman()) - crd = GuiUtils.getChoiceOptional("Select totem armor to destroy", list.toArray()); - else - crd = list.get(0); - } - - final Card card = c; - Ability_Static ability = new Ability_Static(crd, "0") { - public void resolve() { - destroy(crd); - card.setDamage(0); - - } - }; - - StringBuilder sb = new StringBuilder(); - sb.append(crd).append(" - Totem armor: destroy this aura."); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().add(ability); - return false; - } - }//totem armor - - return sacrificeDestroy(c); - } - - /** - *

addSuspendTriggers.

- * - * @param c a {@link forge.Card} object. - * @return a {@link forge.Card} object. - */ - public static Card addSuspendTriggers(final Card c) { - c.setSVar("HasteFromSuspend", "True"); - - Command intoPlay = new Command() { - private static final long serialVersionUID = -4514610171270596654L; - - public void execute() { - if (AllZoneUtil.isCardInPlay(c) && c.isCreature()) - c.addExtrinsicKeyword("Haste"); - }//execute() - }; - - c.addComesIntoPlayCommand(intoPlay); - - Command loseControl = new Command() { - private static final long serialVersionUID = -4514610171270596654L; - - public void execute() { - if (c.getSVar("HasteFromSuspend").equals("True")) { - c.setSVar("HasteFromSuspend", "False"); - c.removeExtrinsicKeyword("Haste"); - } - }//execute() - }; - - c.addChangeControllerCommand(loseControl); - c.addLeavesPlayCommand(loseControl); - return c; - } - - /** - *

sacrificeDestroy.

- * - * @param c a {@link forge.Card} object. - * @return a boolean. - */ - public boolean sacrificeDestroy(Card c) { - if (!AllZoneUtil.isCardInPlay(c)) return false; - - Player owner = c.getOwner(); - if (!(owner.isComputer() || owner.isHuman())) - throw new RuntimeException("GameAction : destroy() invalid card.getOwner() - " + c + " " + owner); - - boolean persist = (c.hasKeyword("Persist") && c.getCounters(Counters.M1M1) == 0) && !c.isToken(); - - Card newCard = moveToGraveyard(c); - - // Destroy needs to be called with Last Known Information - c.destroy(); - - //System.out.println("Card " + c.getName() + " is getting sent to GY, and this turn it got damaged by: "); - for (Card crd : c.getReceivedDamageFromThisTurn().keySet()) { - if (c.getReceivedDamageFromThisTurn().get(crd) > 0) { - //System.out.println(crd.getName() ); - GameActionUtil.executeVampiricEffects(crd); - } - } - - if (persist) { - final Card persistCard = newCard; - Ability persistAb = new Ability(persistCard, "0") { - - @Override - public void resolve() { - if (AllZone.getZone(persistCard).is(Constant.Zone.Graveyard)) { - PlayerZone ownerPlay = AllZone.getZone(Constant.Zone.Battlefield, persistCard.getOwner()); - Card card = moveTo(ownerPlay, persistCard); - card.addCounter(Counters.M1M1, 1); - } - } - }; - persistAb.setStackDescription(newCard.getName() + " - Returning from Persist"); - AllZone.getStack().add(persistAb); - } - return true; - }//sacrificeDestroy() - - - /** - *

destroy.

- * - * @param c a {@link forge.Card} object. - * @return a boolean. - */ - public boolean destroy(Card c) { - if (!AllZoneUtil.isCardInPlay(c) - || (c.hasKeyword("Indestructible") - && (!c.isCreature() || c.getNetDefense() > 0))) return false; - - if (c.canBeShielded() && c.getShield() > 0) { - c.subtractShield(); - c.setDamage(0); - c.tap(); - AllZone.getCombat().removeFromCombat(c); - return false; - } - - if (c.isEnchanted()) { - CardList list = new CardList(c.getEnchantedBy().toArray()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card crd) { - return crd.hasKeyword("Totem armor"); - } - }); - CardListUtil.sortCMC(list); - - - if (list.size() != 0) { - final Card crd; - if (list.size() == 1) { - crd = list.get(0); - } else { - if (c.getController().isHuman()) - crd = GuiUtils.getChoiceOptional("Select totem armor to destroy", list.toArray()); - else - crd = list.get(0); - } - - c.setDamage(0); - destroy(crd); - System.out.println("Totem armor destroyed instead of original card"); - return false; - } - }//totem armor - - return sacrificeDestroy(c); - } - - /** - *

newGame.

- * for Quest fantasy mode - * - * @param humanDeck a {@link forge.deck.Deck} object. - * @param computerDeck a {@link forge.deck.Deck} object. - * @param human a {@link forge.CardList} object. - * @param humanLife a int. - * @param computerLife a int. - * @param qa a {@link forge.Quest_Assignment} object. - * @param computer a {@link forge.CardList} object. - */ - public void newGame(Deck humanDeck, Deck computerDeck, CardList human, CardList computer, int humanLife, int computerLife, Quest_Assignment qa) { - this.newGame(humanDeck, computerDeck); - - AllZone.getComputerPlayer().setLife(computerLife, null); - AllZone.getHumanPlayer().setLife(humanLife, null); - - if (qa != null) { - computer.addAll(forge.quest.data.QuestUtil.getComputerCreatures(AllZone.getQuestData(), AllZone.getQuestAssignment())); - } - - for (Card c : human) { - for (Trigger trig : c.getTriggers()) { - AllZone.getTriggerHandler().registerTrigger(trig); - } - - AllZone.getHumanBattlefield().add(c); - c.setSickness(true); - } - - for (Card c : computer) { - for (Trigger trig : c.getTriggers()) { - AllZone.getTriggerHandler().registerTrigger(trig); - } - - AllZone.getComputerBattlefield().add(c); - c.setSickness(true); - } - Constant.Quest.fantasyQuest[0] = true; - } - - private boolean Start_Cut = false; - - /** - *

newGame.

- * - * @param humanDeck a {@link forge.deck.Deck} object. - * @param computerDeck a {@link forge.deck.Deck} object. - */ - public void newGame(Deck humanDeck, Deck computerDeck) { - //AllZone.getComputer() = new ComputerAI_Input(new ComputerAI_General()); - Constant.Quest.fantasyQuest[0] = false; - - AllZone.getGameInfo().setPreventCombatDamageThisTurn(false); - AllZone.getGameInfo().setHumanNumberOfTimesMulliganed(0); - AllZone.getGameInfo().setHumanMulliganedToZero(false); - AllZone.getGameInfo().setComputerStartedThisGame(false); - - AllZone.getHumanPlayer().reset(); - AllZone.getComputerPlayer().reset(); - - AllZone.getPhase().reset(); - AllZone.getStack().reset(); - AllZone.getCombat().reset(); - AllZone.getDisplay().showCombat(""); - AllZone.getDisplay().loadPrefs(); - - AllZone.getHumanGraveyard().reset(); - AllZone.getHumanHand().reset(); - AllZone.getHumanLibrary().reset(); - AllZone.getHumanBattlefield().reset(); - AllZone.getHumanExile().reset(); - - AllZone.getComputerGraveyard().reset(); - AllZone.getComputerHand().reset(); - AllZone.getComputerLibrary().reset(); - AllZone.getComputerBattlefield().reset(); - AllZone.getComputerExile().reset(); - - AllZone.getInputControl().clearInput(); - - AllZone.getStaticEffects().reset(); - - // player.reset() now handles this - //AllZone.getHumanPlayer().clearHandSizeOperations(); - //AllZone.getComputerPlayer().clearHandSizeOperations(); - - AllZone.getTriggerHandler().clearRegistered(); - forge.card.trigger.Trigger.resetIDs(); - - - {//re-number cards just so their unique numbers are low, just for user friendliness - CardFactoryInterface c = AllZone.getCardFactory(); - - Card.resetUniqueNumber(); - - Random generator = MyRandom.random; - - for (int i = 0; i < humanDeck.countMain(); i++) { - Card card = new Card(); - - String cardName = humanDeck.getMain(i); - String setCode = ""; - if (cardName.contains("|")) { - String s[] = cardName.split("\\|", 2); - cardName = s[0]; - setCode = s[1]; - } - - card = c.getCard(cardName, AllZone.getHumanPlayer()); - - if (!setCode.equals("")) - card.setCurSetCode(setCode); - else if ((card.getSets().size() > 0)) // && card.getCurSetCode().equals("")) - card.setRandomSetCode(); - - if (!card.getCurSetCode().equals("")) { - int n = SetInfoUtil.getSetInfo_Code(card.getSets(), card.getCurSetCode()).PicCount; - if (n > 1) - card.setRandomPicture(generator.nextInt(n - 1) + 1); - - card.setImageFilename(CardUtil.buildFilename(card)); - } - - // Assign random foiling on approximately 1:20 cards - if (Constant.Runtime.RndCFoil[0] && Constant.Runtime.GameType[0].equals(Constant.GameType.Constructed)) { - if (MyRandom.percentTrue(5)) - card.setFoil(MyRandom.random.nextInt(9) + 1); - } - - //System.out.println("human random number:" + card.getRandomPicture()); - //} - - AllZone.getHumanLibrary().add(card); - - for (Trigger trig : card.getTriggers()) { - AllZone.getTriggerHandler().registerTrigger(trig); - } - } - - ArrayList RAICards = new ArrayList(); - for (int i = 0; i < computerDeck.countMain(); i++) { - Card card = new Card(); - - String cardName = computerDeck.getMain(i); - String setCode = ""; - if (cardName.contains("|")) { - String s[] = cardName.split("\\|", 2); - cardName = s[0]; - setCode = s[1]; - } - - card = c.getCard(cardName, AllZone.getComputerPlayer()); - - //if(card.isBasicLand()) { - //String PC = card.getSVar("PicCount"); - //int n = 0; - //if (PC.matches("[0-9][0-9]?")) - // n = Integer.parseInt(PC); - //if (n > 1) - // card.setRandomPicture(generator.nextInt(n)); - //System.out.println("computer random number:" + card.getRandomPicture()); - //} - - if (!setCode.equals("")) - card.setCurSetCode(setCode); - else if ((card.getSets().size() > 0)) // && card.getCurSetCode().equals("")) - card.setRandomSetCode(); - - if (!card.getCurSetCode().equals("")) { - int n = SetInfoUtil.getSetInfo_Code(card.getSets(), card.getCurSetCode()).PicCount; - if (n > 1) - card.setRandomPicture(generator.nextInt(n - 1) + 1); - - card.setImageFilename(CardUtil.buildFilename(card)); - } - - // Assign random foiling on approximately 1:20 cards - if (Constant.Runtime.RndCFoil[0] && Constant.Runtime.GameType[0].equals(Constant.GameType.Constructed)) { - if (MyRandom.percentTrue(5)) - card.setFoil(MyRandom.random.nextInt(9) + 1); - } - - AllZone.getComputerLibrary().add(card); - - for (Trigger trig : card.getTriggers()) { - AllZone.getTriggerHandler().registerTrigger(trig); - } - - if (card.getSVar("RemAIDeck").equals("True")) - RAICards.add(card.getName()); - //get card picture so that it is in the image cache - // ImageCache.getImage(card); - } - - if (RAICards.size() > 0) { - StringBuilder sb = new StringBuilder("AI deck contains the following cards that it can't play or may be buggy:\n"); - for (int i = 0; i < RAICards.size(); i++) { - sb.append(RAICards.get(i)); - if (((i % 4) == 0) && (i > 0)) - sb.append("\n"); - else if (i != (RAICards.size() - 1)) - sb.append(", "); - } - - JOptionPane.showMessageDialog(null, sb.toString(), "", JOptionPane.INFORMATION_MESSAGE); - - } - }//end re-numbering - - for (int i = 0; i < 100; i++) - AllZone.getHumanPlayer().shuffle(); - - //do this instead of shuffling Computer's deck - boolean smoothLand = Constant.Runtime.Smooth[0]; - - if (smoothLand) { - Card[] c = smoothComputerManaCurve(AllZoneUtil.getPlayerCardsInLibrary(AllZone.getComputerPlayer()).toArray()); - AllZone.getComputerLibrary().setCards(c); - } else { - AllZone.getComputerLibrary().setCards(AllZoneUtil.getPlayerCardsInLibrary(AllZone.getComputerPlayer()).toArray()); - AllZone.getComputerPlayer().shuffle(); - } - - // Only cut/coin toss if it's the first game of the match - if (Constant.Runtime.matchState.countWinLose() == 0) { - // New code to determine who goes first. Delete this if it doesn't work properly - if (isStartCut()) - seeWhoPlaysFirst(); - else - seeWhoPlaysFirst_CoinToss(); - } else if (Constant.Runtime.matchState.didWinRecently()) // if player won last, AI starts - computerStartsGame(); - - for (int i = 0; i < 7; i++) { - AllZone.getHumanPlayer().drawCard(); - AllZone.getComputerPlayer().drawCard(); - } - - // TODO: ManaPool should be moved to Player and be represented in the player panel - ManaPool mp = AllZone.getManaPool(); - mp.setImageFilename("mana_pool"); - AllZone.getHumanBattlefield().add(mp); - - AllZone.getInputControl().setInput(new Input_Mulligan()); - Phase.setGameBegins(1); - }//newGame() - - //this is where the computer cheats - //changes AllZone.getComputerLibrary() - - /** - *

smoothComputerManaCurve.

- * - * @param in an array of {@link forge.Card} objects. - * @return an array of {@link forge.Card} objects. - */ - Card[] smoothComputerManaCurve(Card[] in) { - CardList library = new CardList(in); - library.shuffle(); - - //remove all land, keep non-basicland in there, shuffled - CardList land = library.getType("Land"); - for (int i = 0; i < land.size(); i++) - if (land.get(i).isLand()) library.remove(land.get(i)); - - //non-basic lands are removed, because the computer doesn't seem to - //effectively use them very well - land = threadLand(land); - - try { - //mana weave, total of 7 land - // The Following have all been reduced by 1, to account for the computer starting first. - library.add(6, land.get(0)); - library.add(7, land.get(1)); - library.add(8, land.get(2)); - library.add(9, land.get(3)); - library.add(10, land.get(4)); - - library.add(12, land.get(5)); - library.add(15, land.get(6)); - } catch (IndexOutOfBoundsException e) { - System.err.println("Error: cannot smooth mana curve, not enough land"); - return in; - } - - //add the rest of land to the end of the deck - for (int i = 0; i < land.size(); i++) - if (!library.contains(land.get(i))) library.add(land.get(i)); - - - //check - for (int i = 0; i < library.size(); i++) - System.out.println(library.get(i)); - - - return library.toArray(); - }//smoothComputerManaCurve() - - //non-basic lands are removed, because the computer doesn't seem to - //effectively used them very well - - /** - *

threadLand.

- * - * @param in a {@link forge.CardList} object. - * @return a {@link forge.CardList} object. - */ - public CardList threadLand(CardList in) { - //String[] basicLand = {"Forest", "Swamp", "Mountain", "Island", "Plains"}; //unused - - //Thread stuff with as large a spread of colors as possible: - String[] allLand = { - "Bayou", "Volcanic Island", "Savannah", "Badlands", "Tundra", "Taiga", "Underground Sea", - "Plateau", "Tropical Island", "Scrubland", "Overgrown Tomb", "Steam Vents", "Temple Garden", - "Blood Crypt", "Hallowed Fountain", "Stomping Ground", "Watery Grave", "Sacred Foundry", - "Breeding Pool", "Godless Shrine", "Pendelhaven", "Flagstones of Trokair", "Forest", "Swamp", - "Mountain", "Island", "Plains", "Tree of Tales", "Vault of Whispers", "Great Furnace", - "Seat of the Synod", "Ancient Den", "Treetop Village", "Ghitu Encampment", "Faerie Conclave", - "Forbidding Watchtower", "Savage Lands", "Arcane Sanctum", "Jungle Shrine", - "Crumbling Necropolis", "Seaside Citadel", "Elfhame Palace", "Coastal Tower", "Salt Marsh", - "Kher Keep", "Library of Alexandria", "Dryad Arbor"}; - - - ArrayList land = new ArrayList(); - - //get different CardList of all Forest, Swamps, etc... - CardList check; - for (int i = 0; i < allLand.length; i++) { - check = in.getName(allLand[i]); - - if (!check.isEmpty()) land.add(check); - } - /* - //get non-basic land CardList - check = in.filter(new CardListFilter() - { - public boolean addCard(Card c) - { - return c.isLand() && !c.isBasicLand(); - } - }); - if(! check.isEmpty()) - land.add(check); - */ - - //thread all separate CardList's of land together to get something like - //Mountain, Plains, Island, Mountain, Plains, Island - CardList out = new CardList(); - - int i = 0; - while (!land.isEmpty()) { - i = (i + 1) % land.size(); - - check = land.get(i); - if (check.isEmpty()) { - //System.out.println("removed"); - land.remove(i); - i--; - continue; - } - - out.add(check.get(0)); - check.remove(0); - }//while - - return out; - }//threadLand() - - - /** - *

getDifferentLand.

- * - * @param list a {@link forge.CardList} object. - * @param land a {@link java.lang.String} object. - * @return a int. - */ - @SuppressWarnings("unused") - // getDifferentLand - private int getDifferentLand(CardList list, String land) { - int out = 0; - - return out; - } - - //decides who goes first when starting another game, used by newGame() - - /** - *

seeWhoPlaysFirst_CoinToss.

- */ - public void seeWhoPlaysFirst_CoinToss() { - Object[] possibleValues = {ForgeProps.getLocalized(GAMEACTION_TEXT.HEADS), ForgeProps.getLocalized(GAMEACTION_TEXT.TAILS)}; - Object q = JOptionPane.showOptionDialog(null, ForgeProps.getLocalized(GAMEACTION_TEXT.HEADS_OR_TAILS), ForgeProps.getLocalized(GAMEACTION_TEXT.COIN_TOSS), - JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, - null, possibleValues, possibleValues[0]); - - int Flip = MyRandom.random.nextInt(2); - String Human_Flip = " "; - String Computer_Flip = " "; - // JOptionPane.showMessageDialog(null, q, "", JOptionPane.INFORMATION_MESSAGE); - if (q.equals(0)) { - Human_Flip = ForgeProps.getLocalized(GAMEACTION_TEXT.HEADS); - Computer_Flip = ForgeProps.getLocalized(GAMEACTION_TEXT.TAILS); - } else { - Human_Flip = ForgeProps.getLocalized(GAMEACTION_TEXT.TAILS); - Computer_Flip = ForgeProps.getLocalized(GAMEACTION_TEXT.HEADS); - } - - if ((Flip == 0 && q.equals(0)) || (Flip == 1 && q.equals(1))) - JOptionPane.showMessageDialog(null, Human_Flip + "\r\n" + ForgeProps.getLocalized(GAMEACTION_TEXT.HUMAN_WIN), "", JOptionPane.INFORMATION_MESSAGE); - else { - computerStartsGame(); - JOptionPane.showMessageDialog(null, Computer_Flip + "\r\n" + ForgeProps.getLocalized(GAMEACTION_TEXT.COMPUTER_WIN), "", JOptionPane.INFORMATION_MESSAGE); - } - }//seeWhoPlaysFirst_CoinToss() - - private Card HumanCut = null; - private Card ComputerCut = null; - - /** - *

seeWhoPlaysFirst.

- */ - public void seeWhoPlaysFirst() { - - CardList HLibrary = AllZoneUtil.getPlayerCardsInLibrary(AllZone.getHumanPlayer()); - HLibrary = HLibrary.filter(AllZoneUtil.nonlands); - CardList CLibrary = AllZoneUtil.getPlayerCardsInLibrary(AllZone.getComputerPlayer()); - CLibrary = CLibrary.filter(AllZoneUtil.nonlands); - - boolean Starter_Determined = false; - int Cut_Count = 0; - int Cut_CountMax = 20; - for (int i = 0; i < Cut_CountMax; i++) { - if (Starter_Determined == true) break; - - if (HLibrary.size() > 0) - setHumanCut(HLibrary.get(MyRandom.random.nextInt(HLibrary.size()))); - else { - computerStartsGame(); - JOptionPane.showMessageDialog(null, ForgeProps.getLocalized(GAMEACTION_TEXT.HUMAN_MANA_COST) + "\r\n" + ForgeProps.getLocalized(GAMEACTION_TEXT.COMPUTER_STARTS), "", JOptionPane.INFORMATION_MESSAGE); - return; - } - - if (CLibrary.size() > 0) - setComputerCut(CLibrary.get(MyRandom.random.nextInt(CLibrary.size()))); - else { - JOptionPane.showMessageDialog(null, ForgeProps.getLocalized(GAMEACTION_TEXT.COMPUTER_MANA_COST) + "\r\n" + ForgeProps.getLocalized(GAMEACTION_TEXT.HUMAN_STARTS), "", JOptionPane.INFORMATION_MESSAGE); - return; - } - - Cut_Count = Cut_Count + 1; - AllZone.getGameAction().moveTo(AllZone.getZone(Constant.Zone.Library, AllZone.getHumanPlayer()), AllZone.getGameAction().getHumanCut()); - AllZone.getGameAction().moveTo(AllZone.getZone(Constant.Zone.Library, AllZone.getComputerPlayer()), AllZone.getGameAction().getComputerCut()); - - StringBuilder sb = new StringBuilder(); - sb.append(ForgeProps.getLocalized(GAMEACTION_TEXT.HUMAN_CUT) + getHumanCut().getName() + " (" + getHumanCut().getManaCost() + ")" + "\r\n"); - sb.append(ForgeProps.getLocalized(GAMEACTION_TEXT.COMPUTER_CUT) + getComputerCut().getName() + " (" + getComputerCut().getManaCost() + ")" + "\r\n"); - sb.append("\r\n" + "Number of times the deck has been cut: " + Cut_Count + "\r\n"); - if (CardUtil.getConvertedManaCost(getComputerCut().getManaCost()) > CardUtil.getConvertedManaCost(getHumanCut().getManaCost())) { - computerStartsGame(); - JOptionPane.showMessageDialog(null, sb + ForgeProps.getLocalized(GAMEACTION_TEXT.COMPUTER_STARTS), "", JOptionPane.INFORMATION_MESSAGE); - return; - } else if (CardUtil.getConvertedManaCost(getComputerCut().getManaCost()) < CardUtil.getConvertedManaCost(getHumanCut().getManaCost())) { - JOptionPane.showMessageDialog(null, sb + ForgeProps.getLocalized(GAMEACTION_TEXT.HUMAN_STARTS), "", JOptionPane.INFORMATION_MESSAGE); - return; - } else { - sb.append(ForgeProps.getLocalized(GAMEACTION_TEXT.EQUAL_CONVERTED_MANA) + "\r\n"); - if (i == Cut_CountMax - 1) { - sb.append(ForgeProps.getLocalized(GAMEACTION_TEXT.RESOLVE_STARTER)); - if (MyRandom.random.nextInt(2) == 1) - JOptionPane.showMessageDialog(null, sb + ForgeProps.getLocalized(GAMEACTION_TEXT.HUMAN_WIN), "", JOptionPane.INFORMATION_MESSAGE); - else { - computerStartsGame(); - JOptionPane.showMessageDialog(null, sb + ForgeProps.getLocalized(GAMEACTION_TEXT.COMPUTER_WIN), "", JOptionPane.INFORMATION_MESSAGE); - } - return; - } else { - sb.append(ForgeProps.getLocalized(GAMEACTION_TEXT.CUTTING_AGAIN)); - } - JOptionPane.showMessageDialog(null, sb, "", JOptionPane.INFORMATION_MESSAGE); - } - } // for-loop for multiple card cutting - - - }//seeWhoPlaysFirst() - - /** - *

computerStartsGame.

- */ - public void computerStartsGame() { - AllZone.getPhase().setPlayerTurn(AllZone.getComputerPlayer()); - AllZone.getGameInfo().setComputerStartedThisGame(true); - } - - //if Card had the type "Aura" this method would always return true, since local enchantments are always attached to something - //if Card is "Equipment", returns true if attached to something - - /** - *

isAttachee.

- * - * @param c a {@link forge.Card} object. - * @return a boolean. - */ - public boolean isAttachee(Card c) { - CardList list = AllZoneUtil.getCardsInPlay(); - - for (int i = 0; i < list.size(); i++) { - CardList check = new CardList(list.getCard(i).getAttachedCards()); - if (check.contains(c)) return true; - } - - return false; - }//isAttached(Card c) - - /** - *

playCard.

- * - * @param c a {@link forge.Card} object. - * @return a boolean. - */ - public boolean playCard(Card c) { - // this can only be called by the Human - HashMap map = new HashMap(); - SpellAbility[] abilities = canPlaySpellAbility(c.getSpellAbility()); - ArrayList choices = new ArrayList(); - Player human = AllZone.getHumanPlayer(); - - if (c.isLand() && human.canPlayLand()){ - PlayerZone zone = AllZone.getZone(c); - - if (zone.is(Constant.Zone.Hand) || - (!zone.is(Constant.Zone.Battlefield)) && c.hasKeyword("May be played")) - choices.add("Play land"); - } - - for (SpellAbility sa : abilities) { - // for uncastables like lotus bloom, check if manaCost is blank - sa.setActivatingPlayer(human); - if (sa.canPlay() && (!sa.isSpell() || !sa.getManaCost().equals(""))) { - choices.add(sa.toString()); - map.put(sa.toString(), sa); - } - } - - String choice; - if (choices.size() == 0) - return false; - else if (choices.size() == 1) - choice = choices.get(0); - else - choice = (String) GuiUtils.getChoiceOptional("Choose", choices.toArray()); - - if (choice == null) - return false; - - if (choice.equals("Play land")) { - AllZone.getHumanPlayer().playLand(c); - return true; - } - - SpellAbility ability = map.get(choice); - if (ability != null) { - playSpellAbility(ability); - return true; - } - return false; - } - - /** - *

playCardNoCost.

- * - * @param c a {@link forge.Card} object. - */ - public void playCardNoCost(Card c) { - //SpellAbility[] choices = (SpellAbility[]) c.getSpells().toArray(); - ArrayList choices = c.getBasicSpells(); - SpellAbility sa; - - //TODO: add Buyback, Kicker, ... , spells here - /* - ArrayList additional = c.getAdditionalCostSpells(); - for (SpellAbility s : additional) - { - - } - */ - /* - System.out.println(choices.length); - for(int i = 0; i < choices.length; i++) - System.out.println(choices[i]); - */ - if (choices.size() == 0) return; - else if (choices.size() == 1) sa = choices.get(0); - else sa = (SpellAbility) GuiUtils.getChoiceOptional("Choose", choices.toArray()); - - if (sa == null) return; - - // Ripple causes a crash because it doesn't set the activatingPlayer in this entrance - if (sa.getActivatingPlayer() == null) - sa.setActivatingPlayer(AllZone.getHumanPlayer()); - playSpellAbilityForFree(sa); - } - - - /** - *

playSpellAbilityForFree.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public void playSpellAbilityForFree(final SpellAbility sa) { - if (sa.getPayCosts() != null) { - Target_Selection ts = new Target_Selection(sa.getTarget(), sa); - Cost_Payment payment = new Cost_Payment(sa.getPayCosts(), sa); - - SpellAbility_Requirements req = new SpellAbility_Requirements(sa, ts, payment); - req.setFree(true); - req.fillRequirements(); - } else if (sa.getBeforePayMana() == null) { - if (sa.isSpell()) { - Card c = sa.getSourceCard(); - if (!c.isCopiedSpell()) - AllZone.getGameAction().moveToStack(c); - } - boolean x = false; - if (sa.getSourceCard().getManaCost().contains("X")) - x = true; - - if (sa.isKickerAbility()) { - Command paid1 = new Command() { - private static final long serialVersionUID = -6531785460264284794L; - - public void execute() { - AllZone.getStack().add(sa); - } - }; - AllZone.getInputControl().setInput(new Input_PayManaCost_Ability(sa.getAdditionalManaCost(), paid1)); - } else { - AllZone.getStack().add(sa, x); - } - } else { - sa.setManaCost("0"); // Beached As - if (sa.isKickerAbility()) { - sa.getBeforePayMana().setFree(false); - sa.setManaCost(sa.getAdditionalManaCost()); - } else { - sa.getBeforePayMana().setFree(true); - } - AllZone.getInputControl().setInput(sa.getBeforePayMana()); - } - } - - int CostCutting_GetMultiMickerManaCostPaid = 0; - String CostCutting_GetMultiMickerManaCostPaid_Colored = ""; - - /** - *

getSpellCostChange.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param originalCost a {@link forge.card.mana.ManaCost} object. - * @return a {@link forge.card.mana.ManaCost} object. - */ - public ManaCost getSpellCostChange(SpellAbility sa, ManaCost originalCost) { - // Beached - Card originalCard = sa.getSourceCard(); - Player controller = originalCard.getController(); - SpellAbility spell = sa; - String mana = originalCost.toString(); - ManaCost manaCost = new ManaCost(mana); - if (sa.isXCost() && !originalCard.isCopiedSpell()) originalCard.setXManaCostPaid(0); - - if (Phase.getGameBegins() != 1) - return manaCost; - - if (spell.isSpell() == true) { - if (originalCard.getName().equals("Avatar of Woe")) { - Player player = AllZone.getPhase().getPlayerTurn(); - Player opponent = player.getOpponent(); - CardList PlayerCreatureList = AllZoneUtil.getPlayerGraveyard(player); - PlayerCreatureList = PlayerCreatureList.getType("Creature"); - CardList OpponentCreatureList = AllZoneUtil.getPlayerGraveyard(opponent); - OpponentCreatureList = OpponentCreatureList.getType("Creature"); - if ((PlayerCreatureList.size() + OpponentCreatureList.size()) >= 10) { - manaCost = new ManaCost("B B"); - } // Avatar of Woe - } else if (originalCard.getName().equals("Avatar of Will")) { - Player opponent = AllZone.getPhase().getPlayerTurn().getOpponent(); - CardList opponentHandList = AllZoneUtil.getPlayerHand(opponent); - if (opponentHandList.size() == 0) { - manaCost = new ManaCost("U U"); - } // Avatar of Will - } else if (originalCard.getName().equals("Avatar of Fury")) { - Player opponent = AllZone.getPhase().getPlayerTurn().getOpponent(); - CardList opponentLand = AllZoneUtil.getPlayerLandsInPlay(opponent); - if (opponentLand.size() >= 7) { - manaCost = new ManaCost("R R"); - } // Avatar of Fury - } else if (originalCard.getName().equals("Avatar of Might")) { - Player player = AllZone.getPhase().getPlayerTurn(); - Player opponent = player.getOpponent(); - CardList playerCreature = AllZoneUtil.getCreaturesInPlay(player); - CardList opponentCreature = AllZoneUtil.getCreaturesInPlay(opponent); - if (opponentCreature.size() - playerCreature.size() >= 4) { - manaCost = new ManaCost("G G"); - } // Avatar of Might - } - } // isSpell - - // Get Cost Reduction - CardList Cards_In_Play = AllZoneUtil.getCardsInPlay(); - Cards_In_Play = Cards_In_Play.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (c.getKeyword().toString().contains("CostChange")) return true; - return false; - } - }); - Cards_In_Play.add(originalCard); - CardList Player_Play = AllZoneUtil.getPlayerCardsInPlay(controller); - CardList Player_Hand = AllZoneUtil.getPlayerHand(controller); - int XBonus = 0; - int Max = 25; - if (sa.isMultiKicker()) CostCutting_GetMultiMickerManaCostPaid_Colored = ""; - - if (mana.toString().length() == 0) mana = "0"; - for (int i = 0; i < Cards_In_Play.size(); i++) { - Card card = Cards_In_Play.get(i); - ArrayList a = card.getKeyword(); - int CostKeywords = 0; - int CostKeyword_Number[] = new int[a.size()]; - for (int x = 0; x < a.size(); x++) - if (a.get(x).toString().startsWith("CostChange")) { - CostKeyword_Number[CostKeywords] = x; - CostKeywords = CostKeywords + 1; - } - for (int CKeywords = 0; CKeywords < CostKeywords; CKeywords++) { - String parse = card.getKeyword().get(CostKeyword_Number[CKeywords]).toString(); - String k[] = parse.split(":"); - if (card.equals(originalCard)) { - if (!k[4].equals("Self")) k[2] = "Owned"; - } - if (k[6].equals("ChosenType")) k[6] = card.getChosenType(); - if (k[2].equals("More")) { - if (k[7].equals("OnlyOneBonus")) { // Only Works for Color and Type - for (int string_no = 5; string_no < 7; string_no++) { - String spilt = k[string_no]; - String color_spilt[] = spilt.split("/"); - - for (int cs_num = 0; cs_num < color_spilt.length; cs_num++) { - k[string_no] = color_spilt[cs_num]; - if (string_no == 5 && CardUtil.getColors(originalCard).contains(k[5])) break; - if (string_no == 6 && (originalCard.isType(k[6]))) break; - } - } - } - if (k[7].contains("All Conditions")) { // Only Works for Color and Type - for (int string_no = 5; string_no < 7; string_no++) { - String spilt = k[string_no]; - String color_spilt[] = spilt.split("/"); - for (int cs_num = 0; cs_num < color_spilt.length; cs_num++) { - k[string_no] = color_spilt[cs_num]; - if (string_no == 5) { - if (CardUtil.getColors(originalCard).contains(k[5]) || k[5].equals("All")) { - } else { - k[5] = "Nullified"; - break; - } - } - if (string_no == 6) { - if (originalCard.isType(k[6]) || k[6].equals("All")) { - } else { - k[6] = "Nullified"; - break; - } - } - } - } - if (!k[5].equals("Nullified")) k[5] = "All"; - if (!k[6].equals("Nullified")) k[6] = "All"; - } - if ((k[1].equals("Player") && card.getController().equals(controller) - || (k[1].equals("Opponent") && card.getController().equals(controller.getOpponent())) || k[1].equals("All")) - && ((k[4].equals("Spell") && sa.isSpell() == true) || (k[4].equals("Ability") && sa.isAbility() == true) - || (k[4].startsWith("Ability_Cycling") && sa.isCycling()) || (k[4].equals("Self") && originalCard.equals(card)) - || (k[4].equals("Enchanted") && originalCard.getEnchantedBy().contains(card)) || k[4].equals("All")) - && ((CardUtil.getColors(originalCard).contains(k[5])) || k[5].equals("All")) - && ((originalCard.isType(k[6])) - || (!(originalCard.isType(k[6])) && k[7].contains("NonType")) || k[6].equals("All"))) { - if (k[7].contains("CardIsTapped")) { - if (card.isTapped() == false) k[3] = "0"; - } - if (k[7].contains("TargetInPlay")) { - if (!Player_Play.contains(originalCard)) k[3] = "0"; - } - if (k[7].contains("TargetInHand")) { - if (!Player_Hand.contains(originalCard)) k[3] = "0"; - } - if (k[7].contains("NonType")) { - if (originalCard.isType(k[6])) k[3] = "0"; - } - if (k[7].contains("OpponentTurn")) { - if (AllZone.getPhase().isPlayerTurn(controller)) k[3] = "0"; - } - if (k[7].contains("Affinity")) { - String spilt = k[7]; - String color_spilt[] = spilt.split("/"); - k[7] = color_spilt[1]; - CardList PlayerList = AllZoneUtil.getPlayerCardsInPlay(controller); - PlayerList = PlayerList.getType(k[7]); - k[3] = String.valueOf(PlayerList.size()); - } - String[] Numbers = new String[Max]; - if ("X".equals(k[3])) { - for (int no = 0; no < Max; no++) Numbers[no] = String.valueOf(no); - String Number_ManaCost = " "; - if (mana.toString().length() == 1) { - Number_ManaCost = mana.toString().substring(0, 1); - } else if (mana.toString().length() == 0) { - Number_ManaCost = "0"; // Should Never Occur - } else { - Number_ManaCost = mana.toString().substring(0, 2); - } - Number_ManaCost = Number_ManaCost.trim(); - for (int check = 0; check < Max; check++) { - if (Number_ManaCost.equals(Numbers[check])) { - int xValue = CardFactoryUtil.xCount(card, card.getSVar("X")); - //if((spell.isXCost()) || (spell.isMultiKicker()) && (check - Integer.valueOf(k[3])) < 0) XBonus = XBonus - check + Integer.valueOf(k[3]); - mana = mana.replaceFirst(String.valueOf(check), String.valueOf(check + xValue)); - } - if (mana.equals("")) mana = "0"; - manaCost = new ManaCost(mana); - } - } else if (!"WUGRB".contains(k[3])) { - for (int no = 0; no < Max; no++) Numbers[no] = String.valueOf(no); - String Number_ManaCost = " "; - if (mana.toString().length() == 1) Number_ManaCost = mana.toString().substring(0, 1); - else if (mana.toString().length() == 0) Number_ManaCost = "0"; // Should Never Occur - else Number_ManaCost = mana.toString().substring(0, 2); - Number_ManaCost = Number_ManaCost.trim(); - - for (int check = 0; check < Max; check++) { - if (Number_ManaCost.equals(Numbers[check])) { - mana = mana.replaceFirst(String.valueOf(check), String.valueOf(check + Integer.valueOf(k[3]))); - } - if (mana.equals("")) mana = "0"; - manaCost = new ManaCost(mana); - } - if (!manaCost.toString().contains("0") && !manaCost.toString().contains("1") && !manaCost.toString().contains("2") - && !manaCost.toString().contains("3") && !manaCost.toString().contains("4") && !manaCost.toString().contains("5") - && !manaCost.toString().contains("6") && !manaCost.toString().contains("7") && !manaCost.toString().contains("8") - && !manaCost.toString().contains("9")) { - mana = k[3] + " " + mana; - manaCost = new ManaCost(mana); - } - } else { - mana = mana + " " + k[3]; - manaCost = new ManaCost(mana); - } - } - } - } - } - - if (mana.equals("0") && spell.isAbility()) { - } else { - for (int i = 0; i < Cards_In_Play.size(); i++) { - Card card = Cards_In_Play.get(i); - ArrayList a = card.getKeyword(); - int CostKeywords = 0; - int CostKeyword_Number[] = new int[a.size()]; - for (int x = 0; x < a.size(); x++) - if (a.get(x).toString().startsWith("CostChange")) { - CostKeyword_Number[CostKeywords] = x; - CostKeywords = CostKeywords + 1; - } - for (int CKeywords = 0; CKeywords < CostKeywords; CKeywords++) { - String parse = card.getKeyword().get(CostKeyword_Number[CKeywords]).toString(); - String k[] = parse.split(":"); - if (card.equals(originalCard)) { - if (!k[4].equals("Self")) k[2] = "Owned"; - } - if (k[6].equals("ChosenType")) k[6] = card.getChosenType(); - if (k[2].equals("Less")) { - if (k[7].equals("OnlyOneBonus")) { // Only Works for Color and Type - for (int string_no = 5; string_no < 7; string_no++) { - String spilt = k[string_no]; - String color_spilt[] = spilt.split("/"); - - for (int cs_num = 0; cs_num < color_spilt.length; cs_num++) { - k[string_no] = color_spilt[cs_num]; - if (string_no == 5 && CardUtil.getColors(originalCard).contains(k[5])) - break; - if (string_no == 6 && (originalCard.isType(k[6]))) break; - } - } - } - if (k[7].contains("All Conditions")) { // Only Works for Color and Type - for (int string_no = 5; string_no < 7; string_no++) { - String spilt = k[string_no]; - String color_spilt[] = spilt.split("/"); - for (int cs_num = 0; cs_num < color_spilt.length; cs_num++) { - k[string_no] = color_spilt[cs_num]; - if (string_no == 5) { - if (CardUtil.getColors(originalCard).contains(k[5]) || k[5].equals("All")) { - } else { - k[5] = "Nullified"; - break; - } - } - if (string_no == 6) { - if (originalCard.isType(k[6]) || k[6].equals("All")) { - } else { - k[6] = "Nullified"; - break; - } - } - } - } - if (!k[5].equals("Nullified")) k[5] = "All"; - if (!k[6].equals("Nullified")) k[6] = "All"; - } - if ((k[1].equals("Player") && card.getController().equals(controller) - || (k[1].equals("Opponent") && card.getController().equals(controller.getOpponent())) || k[1].equals("All")) - && ((k[4].equals("Spell") && sa.isSpell() == true) || (k[4].equals("Ability") && sa.isAbility() == true) - || (k[4].startsWith("Ability_Cycling") && sa.isCycling()) || (k[4].equals("Self") && originalCard.equals(card)) - || (k[4].equals("Enchanted") && originalCard.getEnchantedBy().contains(card)) || k[4].equals("All")) - && ((CardUtil.getColors(originalCard).contains(k[5])) || k[5].equals("All")) - && ((originalCard.isType(k[6])) - || (!(originalCard.isType(k[6])) && k[7].contains("NonType")) || k[6].equals("All"))) { - if (k[7].contains("CardIsTapped")) { - if (card.isTapped() == false) k[3] = "0"; - } - if (k[7].contains("TargetInPlay")) { - if (!Player_Play.contains(originalCard)) k[3] = "0"; - } - if (k[7].contains("TargetInHand")) { - if (!Player_Hand.contains(originalCard)) k[3] = "0"; - } - if (k[7].contains("NonType")) { - if (originalCard.isType(k[6])) k[3] = "0"; - } - if (k[7].contains("OpponentTurn")) { - if (AllZone.getPhase().isPlayerTurn(controller)) k[3] = "0"; - } - if (k[7].contains("Affinity")) { - String spilt = k[7]; - String color_spilt[] = spilt.split("/"); - k[7] = color_spilt[1]; - CardList PlayerList = AllZoneUtil.getPlayerCardsInPlay(controller); - PlayerList = PlayerList.getType(k[7]); - k[3] = String.valueOf(PlayerList.size()); - } - - String[] Numbers = new String[Max]; - if (!"WUGRB".contains(k[3])) { - - int value = 0; - if ("X".equals(k[3])) - value = CardFactoryUtil.xCount(card, card.getSVar("X")); - else - value = Integer.valueOf(k[3]); - - for (int no = 0; no < Max; no++) Numbers[no] = String.valueOf(no); - String Number_ManaCost = " "; - if (mana.toString().length() == 1) - Number_ManaCost = mana.toString().substring(0, 1); - else if (mana.toString().length() == 0) - Number_ManaCost = "0"; // Should Never Occur - else Number_ManaCost = mana.toString().substring(0, 2); - Number_ManaCost = Number_ManaCost.trim(); - - for (int check = 0; check < Max; check++) { - if (Number_ManaCost.equals(Numbers[check])) { - if ((spell.isXCost()) || (spell.isMultiKicker()) && (check - value) < 0) - XBonus = XBonus - check + value; - if (check - value < 0) value = check; - mana = mana.replaceFirst(String.valueOf(check), String.valueOf(check - value)); - } - if (mana.equals("")) mana = "0"; - manaCost = new ManaCost(mana); - } - } else { - // JOptionPane.showMessageDialog(null, Mana + " " + Mana.replaceFirst(k[3],""), "", JOptionPane.INFORMATION_MESSAGE); - if (mana.equals(mana.replaceFirst(k[3], ""))) { - // if(sa.isXCost()) sa.getSourceCard().addXManaCostPaid(1); Not Included as X Costs are not in Colored Mana - if (sa.isMultiKicker()) - CostCutting_GetMultiMickerManaCostPaid_Colored = CostCutting_GetMultiMickerManaCostPaid_Colored + k[3]; - // JOptionPane.showMessageDialog(null, CostCutting_GetMultiMickerManaCostPaid_Colored, "", JOptionPane.INFORMATION_MESSAGE); - } else { - mana = mana.replaceFirst(k[3], ""); - mana = mana.trim(); - if (mana.equals("")) mana = "0"; - manaCost = new ManaCost(mana); - } - } - } - mana = mana.trim(); - if (mana.length() == 0 || mana.equals("0")) { - if (sa.isSpell() || sa.isCycling()) mana = "0"; - else { - mana = "1"; - } - } - } - manaCost = new ManaCost(mana); - } - } - } - if (sa.isXCost()) { - for (int XPaid = 0; XPaid < XBonus; XPaid++) originalCard.addXManaCostPaid(1); - } - if (sa.isMultiKicker()) { - CostCutting_GetMultiMickerManaCostPaid = 0; - for (int XPaid = 0; XPaid < XBonus; XPaid++) - CostCutting_GetMultiMickerManaCostPaid = CostCutting_GetMultiMickerManaCostPaid + 1; - } - - if (originalCard.getName().equals("Khalni Hydra") && spell.isSpell() == true) { - Player player = AllZone.getPhase().getPlayerTurn(); - CardList playerCreature = AllZoneUtil.getCreaturesInPlay(player); - playerCreature = playerCreature.filter(AllZoneUtil.green); - String manaC = manaCost + " "; - if (playerCreature.size() > 0) { - for (int i = 0; i < playerCreature.size(); i++) { - manaC = manaC.replaceFirst("G ", ""); - } - manaC = manaC.trim(); - if (manaC.equals("")) manaC = "0"; - manaCost = new ManaCost(manaC); - } - } // Khalni Hydra - return manaCost; - }//GetSpellCostChange - - /** - *

playSpellAbility.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public void playSpellAbility(SpellAbility sa) { - sa.setActivatingPlayer(AllZone.getHumanPlayer()); - - // Need to check PayCosts, and Ability + All SubAbilities for Target - boolean newAbility = sa.getPayCosts() != null; - SpellAbility ability = sa; - while(ability != null && !newAbility){ - Target tgt = ability.getTarget(); - - newAbility |= tgt != null; - ability = ability.getSubAbility(); - } - - if (newAbility) { - Target_Selection ts = new Target_Selection(sa.getTarget(), sa); - Cost_Payment payment = null; - if (sa.getPayCosts() == null) { - payment = new Cost_Payment(new Cost("0", sa.getSourceCard().getName(), sa.isAbility()), sa); - } else { - payment = new Cost_Payment(sa.getPayCosts(), sa); - } - - if (!sa.isTrigger()) - payment.changeCost(); - - SpellAbility_Requirements req = new SpellAbility_Requirements(sa, ts, payment); - req.fillRequirements(); - } else { - ManaCost manaCost = new ManaCost(sa.getManaCost()); - if (sa.getSourceCard().isCopiedSpell() && sa.isSpell()) { - manaCost = new ManaCost("0"); - } else { - - manaCost = getSpellCostChange(sa, new ManaCost(sa.getManaCost())); - } - if (manaCost.isPaid() && sa.getBeforePayMana() == null) { - if (sa.getAfterPayMana() == null) { - Card source = sa.getSourceCard(); - if (sa.isSpell() && !source.isCopiedSpell()) - AllZone.getGameAction().moveToStack(source); - - AllZone.getStack().add(sa); - if (sa.isTapAbility() && !sa.wasCancelled()) sa.getSourceCard().tap(); - if (sa.isUntapAbility()) sa.getSourceCard().untap(); - return; - } else - AllZone.getInputControl().setInput(sa.getAfterPayMana()); - } else if (sa.getBeforePayMana() == null) - AllZone.getInputControl().setInput(new Input_PayManaCost(sa)); - else - AllZone.getInputControl().setInput(sa.getBeforePayMana()); - } - } - - /** - *

playSpellAbility_NoStack.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param skipTargeting a boolean. - */ - public void playSpellAbility_NoStack(SpellAbility sa, boolean skipTargeting) { - sa.setActivatingPlayer(AllZone.getHumanPlayer()); - - if (sa.getPayCosts() != null) { - Target_Selection ts = new Target_Selection(sa.getTarget(), sa); - Cost_Payment payment = new Cost_Payment(sa.getPayCosts(), sa); - - if (!sa.isTrigger()) - payment.changeCost(); - - SpellAbility_Requirements req = new SpellAbility_Requirements(sa, ts, payment); - req.setSkipStack(true); - req.fillRequirements(skipTargeting); - } else { - ManaCost manaCost = new ManaCost(sa.getManaCost()); - if (sa.getSourceCard().isCopiedSpell() && sa.isSpell()) { - manaCost = new ManaCost("0"); - } else { - - manaCost = getSpellCostChange(sa, new ManaCost(sa.getManaCost())); - } - if (manaCost.isPaid() && sa.getBeforePayMana() == null) { - if (sa.getAfterPayMana() == null) { - AbilityFactory.resolve(sa, false); - if (sa.isTapAbility() && !sa.wasCancelled()) sa.getSourceCard().tap(); - if (sa.isUntapAbility()) sa.getSourceCard().untap(); - return; - } else - AllZone.getInputControl().setInput(sa.getAfterPayMana()); - } else if (sa.getBeforePayMana() == null) - AllZone.getInputControl().setInput(new Input_PayManaCost(sa, true)); - else - AllZone.getInputControl().setInput(sa.getBeforePayMana()); - } - } - - /** - *

canPlaySpellAbility.

- * - * @param sa an array of {@link forge.card.spellability.SpellAbility} objects. - * @return an array of {@link forge.card.spellability.SpellAbility} objects. - */ - public SpellAbility[] canPlaySpellAbility(SpellAbility[] sa) { - ArrayList list = new ArrayList(); - - for (int i = 0; i < sa.length; i++) { - sa[i].setActivatingPlayer(AllZone.getHumanPlayer()); - if (sa[i].canPlay()) - list.add(sa[i]); - } - - SpellAbility[] array = new SpellAbility[list.size()]; - list.toArray(array); - return array; - }//canPlaySpellAbility() - - /** - *

searchLibraryBasicLand.

- * - * @param player a {@link forge.Player} object. - * @param Zone1 a {@link java.lang.String} object. - * @param tapLand a boolean. - */ - public void searchLibraryBasicLand(Player player, String Zone1, boolean tapLand) { - searchLibraryTwoLand("Basic", player, Zone1, tapLand, "", false); - } - - /** - *

searchLibraryTwoLand.

- * - * @param type a {@link java.lang.String} object. - * @param player a {@link forge.Player} object. - * @param Zone1 a {@link java.lang.String} object. - * @param tapFirstLand a boolean. - * @param Zone2 a {@link java.lang.String} object. - * @param tapSecondLand a boolean. - */ - public void searchLibraryTwoLand(String type, Player player, - String Zone1, boolean tapFirstLand, - String Zone2, boolean tapSecondLand) { - if (player.isHuman()) { - humanSearchTwoLand(type, Zone1, tapFirstLand, Zone2, tapSecondLand); - } else { - aiSearchTwoLand(type, Zone1, tapFirstLand, Zone2, tapSecondLand); - } - - player.shuffle(); - - } - - /** - *

searchLibraryTwoBasicLand.

- * - * @param player a {@link forge.Player} object. - * @param Zone1 a {@link java.lang.String} object. - * @param tapFirstLand a boolean. - * @param Zone2 a {@link java.lang.String} object. - * @param tapSecondLand a boolean. - */ - public void searchLibraryTwoBasicLand(Player player, - String Zone1, boolean tapFirstLand, - String Zone2, boolean tapSecondLand) { - searchLibraryTwoLand("Basic", player, Zone1, tapFirstLand, Zone2, tapSecondLand); - } - - /** - *

aiSearchTwoLand.

- * - * @param type a {@link java.lang.String} object. - * @param Zone1 a {@link java.lang.String} object. - * @param tapFirstLand a boolean. - * @param Zone2 a {@link java.lang.String} object. - * @param tapSecondLand a boolean. - */ - private void aiSearchTwoLand(String type, String Zone1, boolean tapFirstLand, - String Zone2, boolean tapSecondLand) { - CardList land = AllZoneUtil.getPlayerCardsInLibrary(AllZone.getComputerPlayer()); - land = land.getType(type); - PlayerZone firstZone = AllZone.getZone(Zone1, AllZone.getComputerPlayer()); - - if (type.contains("Basic")) { - // No need for special sorting for basic land - // just shuffle to make the computer a little less predictable - land.shuffle(); - } else { - Comparator aiLandComparator = new Comparator() { - private int scoreLand(Card a) { - String valakutName = "Valakut, the Molten Pinnacle"; - - int theScore = 0; - if (!a.isBasicLand()) { - // favor non-basic land - theScore++; - if (a.getName().contains(valakutName)) { - // TODO: Add names of other special lands - theScore++; - } - } - return theScore; - } - - public int compare(Card a, Card b) { - int aScore = scoreLand(a); - int bScore = scoreLand(b); - return bScore - aScore; - } // compare - };//Comparator - - // Prioritize the land somewhat - land.sort(aiLandComparator); - } - //3 branches: 1-no land in deck, 2-one land in deck, 3-two or more land in deck - if (land.size() != 0) { - //branch 2 - at least 1 land in library - Card firstLand = land.remove(0); - if (tapFirstLand) - firstLand.tap(); - - AllZone.getGameAction().moveTo(firstZone, firstLand); - - //branch 3 - if (Zone2.trim().length() != 0 && (land.size() != 0)) { - PlayerZone secondZone = AllZone.getZone(Zone2, AllZone.getComputerPlayer()); - Card secondLand = land.remove(0); - if (tapSecondLand) - secondLand.tap(); - AllZone.getGameAction().moveTo(secondZone, secondLand); - } - } - } - - /** - *

humanSearchTwoLand.

- * - * @param type a {@link java.lang.String} object. - * @param Zone1 a {@link java.lang.String} object. - * @param tapFirstLand a boolean. - * @param Zone2 a {@link java.lang.String} object. - * @param tapSecondLand a boolean. - */ - private void humanSearchTwoLand(String type, String Zone1, boolean tapFirstLand, String Zone2, boolean tapSecondLand) { - PlayerZone firstZone = AllZone.getZone(Zone1, AllZone.getHumanPlayer()); - - CardList list = AllZoneUtil.getPlayerCardsInLibrary(AllZone.getHumanPlayer()); - list = list.getType(type); - - //3 branches: 1-no land in deck, 2-one land in deck, 3-two or more land in deck - - //branch 1 - if (list.size() == 0) return; - - // Check whether we were only asked for one land, and adjust the prompt accordingly - boolean onlyOneLand = (Zone2.trim().length() == 0); - String firstPrompt; - if (onlyOneLand) - firstPrompt = "Choose a land"; - else - firstPrompt = "Choose first land"; - - //branch 2 - Object o = GuiUtils.getChoiceOptional(firstPrompt, list.toArray()); - if (o != null) { - Card c = (Card) o; - list.remove(c); - if (tapFirstLand) - c.tap(); - moveTo(firstZone, c); - }//if - if ((list.size() == 0) || onlyOneLand) return; - //branch 3 - o = GuiUtils.getChoiceOptional(ForgeProps.getLocalized(GAMEACTION_TEXT.CHOOSE_2ND_LAND), list.toArray()); - if (o != null) { - PlayerZone secondZone = AllZone.getZone(Zone2, AllZone.getHumanPlayer()); - - Card c = (Card) o; - list.remove(c); - if (tapSecondLand) - c.tap(); - moveTo(secondZone, c); - } - } - - /** - *

setComputerCut.

- * - * @param computerCut a {@link forge.Card} object. - */ - public void setComputerCut(Card computerCut) { - ComputerCut = computerCut; - } - - /** - *

getComputerCut.

- * - * @return a {@link forge.Card} object. - */ - public Card getComputerCut() { - return ComputerCut; - } - - /** - *

setStartCut.

- * - * @param start_Cut a boolean. - */ - public void setStartCut(boolean start_Cut) { - Start_Cut = start_Cut; - } - - /** - *

isStartCut.

- * - * @return a boolean. - */ - public boolean isStartCut() { - return Start_Cut; - } - - /** - *

setHumanCut.

- * - * @param humanCut a {@link forge.Card} object. - */ - public void setHumanCut(Card humanCut) { - HumanCut = humanCut; - } - - /** - *

getHumanCut.

- * - * @return a {@link forge.Card} object. - */ - public Card getHumanCut() { - return HumanCut; - } -} diff --git a/src/forge/GameActionUtil.java b/src/forge/GameActionUtil.java deleted file mode 100644 index a04db8a1e44..00000000000 --- a/src/forge/GameActionUtil.java +++ /dev/null @@ -1,2749 +0,0 @@ -package forge; - - -import forge.card.abilityFactory.AbilityFactory; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.*; -import forge.gui.GuiUtils; -import forge.gui.input.Input; -import forge.gui.input.Input_PayManaCostUtil; -import forge.gui.input.Input_PayManaCost_Ability; - -import javax.swing.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; - - -/** - *

GameActionUtil class.

- * - * @author Forge - * @version $Id: $ - */ -public class GameActionUtil { - - /** - *

executeDrawStepEffects.

- */ - public static void executeDrawStepEffects() { - AllZone.getStack().freezeStack(); - final Player player = AllZone.getPhase().getPlayerTurn(); - - draw_Sylvan_Library(player); - - AllZone.getStack().unfreezeStack(); - } - - /** - *

executePlayCardEffects.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public static void executePlayCardEffects(SpellAbility sa) { - // experimental: - // this method check for cards that have triggered abilities whenever a - // card gets played - // (called in MagicStack.java) - Card c = sa.getSourceCard(); - - playCard_Cascade(c); - playCard_Ripple(c); - playCard_Storm(sa); - - playCard_Vengevine(c); - playCard_Standstill(c); - playCard_Curse_of_Wizardry(c); - playCard_Venser_Emblem(c); - playCard_Ichneumon_Druid(c); - - } - - /** - *

playCard_Cascade.

- * - * @param c a {@link forge.Card} object. - */ - public static void playCard_Cascade(final Card c) { - Command Cascade = new Command() { - private static final long serialVersionUID = -845154812215847505L; - - public void execute() { - - CardList humanNexus = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer(), "Maelstrom Nexus"); - CardList computerNexus = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer(), "Maelstrom Nexus"); - - if (humanNexus.size() > 0) { - if (Phase.getPlayerSpellCount() == 1 && !c.isCopiedSpell()) { - for (int i = 0; i < humanNexus.size(); i++) { - DoCascade(c); - } - } - } - if (computerNexus.size() > 0) { - if (Phase.getComputerSpellCount() == 1 && !c.isCopiedSpell()) { - for (int i = 0; i < computerNexus.size(); i++) { - DoCascade(c); - } - } - } - if (c.hasKeyword("Cascade") - || c.getName().equals("Bituminous Blast")) //keyword gets cleared for Bitumonous Blast - { - DoCascade(c); - } - }// execute() - - void DoCascade(Card c) { - final Player controller = c.getController(); - final Card cascCard = c; - - final Ability ability = new Ability(c, "0") { - @Override - public void resolve() { - CardList topOfLibrary = AllZoneUtil.getPlayerCardsInLibrary(controller); - CardList revealed = new CardList(); - - if (topOfLibrary.size() == 0) return; - - Card cascadedCard = null; - Card crd; - int count = 0; - while (cascadedCard == null) { - crd = topOfLibrary.get(count++); - revealed.add(crd); - if ((!crd.isLand() && CardUtil.getConvertedManaCost(crd.getManaCost()) < CardUtil.getConvertedManaCost(cascCard.getManaCost()))) - cascadedCard = crd; - - if (count == topOfLibrary.size()) break; - - }//while - GuiUtils.getChoiceOptional("Revealed cards:", revealed.toArray()); - - if (cascadedCard != null && !cascadedCard.isUnCastable()) { - - if (cascadedCard.getController().isHuman()) { - StringBuilder title = new StringBuilder(); - title.append(cascCard.getName()).append(" - Cascade Ability"); - StringBuilder question = new StringBuilder(); - question.append("Cast ").append(cascadedCard.getName()).append(" without paying its mana cost?"); - - int answer = JOptionPane.showConfirmDialog(null, question.toString(), title.toString(), JOptionPane.YES_NO_OPTION); - - if (answer == JOptionPane.YES_OPTION) { - AllZone.getGameAction().playCardNoCost(cascadedCard); - revealed.remove(cascadedCard); - } - } else //computer - { - ArrayList choices = cascadedCard.getBasicSpells(); - - for (SpellAbility sa : choices) { - if (sa.canPlayAI()) { - ComputerUtil.playStackFree(sa); - revealed.remove(cascadedCard); - break; - } - } - } - } - revealed.shuffle(); - for (Card bottom : revealed) { - AllZone.getGameAction().moveToBottomOfLibrary(bottom); - } - } - }; - StringBuilder sb = new StringBuilder(); - sb.append(c).append(" - Cascade."); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - }; - Cascade.execute(); - } - - /** - *

playCard_Ripple.

- * - * @param c a {@link forge.Card} object. - */ - public static void playCard_Ripple(final Card c) { - Command Ripple = new Command() { - private static final long serialVersionUID = -845154812215847505L; - - public void execute() { - - CardList humanThrummingStone = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer(), "Thrumming Stone"); - CardList computerThrummingStone = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer(), "Thrumming Stone"); - - for (int i = 0; i < humanThrummingStone.size(); i++) { - if (c.getController().isHuman()) c.addExtrinsicKeyword("Ripple:4"); - } - for (int i = 0; i < computerThrummingStone.size(); i++) { - if (c.getController().isComputer()) c.addExtrinsicKeyword("Ripple:4"); - } - ArrayList a = c.getKeyword(); - for (int x = 0; x < a.size(); x++) - if (a.get(x).toString().startsWith("Ripple")) { - String parse = c.getKeyword().get(x).toString(); - String k[] = parse.split(":"); - DoRipple(c, Integer.valueOf(k[1])); - } - }// execute() - - void DoRipple(Card c, final int RippleCount) { - final Player controller = c.getController(); - final Card RippleCard = c; - boolean Activate_Ripple = false; - if (controller.isHuman()) { - Object[] possibleValues = {"Yes", "No"}; - AllZone.getDisplay().showMessage("Activate Ripple? "); - Object q = JOptionPane.showOptionDialog(null, "Activate Ripple for " + c, "Ripple", - JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, - null, possibleValues, possibleValues[0]); - if (q.equals(0)) Activate_Ripple = true; - } else Activate_Ripple = true; - if (Activate_Ripple == true) { - final Ability ability = new Ability(c, "0") { - @Override - public void resolve() { - CardList topOfLibrary = AllZoneUtil.getPlayerCardsInLibrary(controller); - CardList revealed = new CardList(); - int RippleNumber = RippleCount; - if (topOfLibrary.size() == 0) return; - int RippleMax = 10; // Shouldn't Have more than Ripple 10, seeing as no cards exist with a ripple greater than 4 - Card[] RippledCards = new Card[RippleMax]; - Card crd; - if (topOfLibrary.size() < RippleNumber) RippleNumber = topOfLibrary.size(); - - for (int i = 0; i < RippleNumber; i++) { - crd = topOfLibrary.get(i); - revealed.add(crd); - if (crd.getName().equals(RippleCard.getName())) RippledCards[i] = crd; - }//For - GuiUtils.getChoiceOptional("Revealed cards:", revealed.toArray()); - for (int i = 0; i < RippleMax; i++) { - if (RippledCards[i] != null - && !RippledCards[i].isUnCastable()) { - - if (RippledCards[i].getController().isHuman()) { - Object[] possibleValues = {"Yes", "No"}; - Object q = JOptionPane.showOptionDialog(null, "Cast " + RippledCards[i].getName() + "?", "Ripple", - JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, - null, possibleValues, possibleValues[0]); - if (q.equals(0)) { - AllZone.getGameAction().playCardNoCost(RippledCards[i]); - revealed.remove(RippledCards[i]); - } - } else //computer - { - ArrayList choices = RippledCards[i].getBasicSpells(); - - for (SpellAbility sa : choices) { - if (sa.canPlayAI() - && !sa.getSourceCard().isType("Legendary")) { - ComputerUtil.playStackFree(sa); - revealed.remove(RippledCards[i]); - break; - } - } - } - } - } - revealed.shuffle(); - for (Card bottom : revealed) { - AllZone.getGameAction().moveToBottomOfLibrary(bottom); - } - } - }; - StringBuilder sb = new StringBuilder(); - sb.append(c).append(" - Ripple."); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - } - }; - Ripple.execute(); - }//playCard_Ripple() - - /** - *

playCard_Storm.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public static void playCard_Storm(SpellAbility sa) { - Card source = sa.getSourceCard(); - if (!source.isCopiedSpell() - && source.hasKeyword("Storm")) { - int StormNumber = Phase.getStormCount() - 1; - for (int i = 0; i < StormNumber; i++) - AllZone.getCardFactory().copySpellontoStack(source, source, sa, true); - } - }//playCard_Storm() - - /** - *

playCard_Vengevine.

- * - * @param c a {@link forge.Card} object. - */ - public static void playCard_Vengevine(Card c) { - if (c.isCreature() == true && (Phase.getPlayerCreatureSpellCount() == 2 || Phase.getComputerCreatureSpellCount() == 2)) { - final Player controller = c.getController(); - final PlayerZone play = AllZone.getZone(Constant.Zone.Battlefield, controller); - CardList list = AllZoneUtil.getPlayerGraveyard(controller); - list = list.getName("Vengevine"); - if (list.size() > 0) { - for (int i = 0; i < list.size(); i++) { - final Card card = list.get(i); - Ability ability = new Ability(card, "0") { - @Override - public void resolve() { - if (controller.isComputer() || GameActionUtil.showYesNoDialog(card, "Return Vengevine from the graveyard?")) { - if (AllZoneUtil.isCardInPlayerGraveyard(controller, card)) { - AllZone.getGameAction().moveTo(play, card); - } - } - } - }; // ability - - StringBuilder sb = new StringBuilder(); - sb.append(card).append(" - ").append("Whenever you cast a spell, if it's the second creature "); - sb.append("spell you cast this turn, you may return Vengevine from your graveyard to the battlefield."); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - }//if - } - }//playCard_Vengevine() - - /** - *

playCard_Ichneumon_Druid.

- * - * @param c a {@link forge.Card} object. - */ - public static void playCard_Ichneumon_Druid(Card c) { - if (c.isInstant() && (Phase.getPlayerInstantSpellCount() >= 2 || Phase.getComputerInstantSpellCount() >= 2)) { - final Player player = c.getController(); - final Player opp = player.getOpponent(); - CardList list = AllZoneUtil.getPlayerCardsInPlay(opp, "Ichneumon Druid"); - for (int i = 0; i < list.size(); i++) { - final Card card = list.get(i); - Ability ability = new Ability(card, "0") { - @Override - public void resolve() { - player.addDamage(4, card); - } - }; // ability - - StringBuilder sb = new StringBuilder(); - sb.append(card).append(" - ").append("Whenever an opponent casts an instant spell other than the first instant spell that player casts each turn, Ichneumon Druid deals 4 damage to him or her."); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability); - } - } - }//playCard_Ichneumon_Druid() - - /** - *

playCard_Venser_Emblem.

- * - * @param c a {@link forge.Card} object. - */ - public static void playCard_Venser_Emblem(Card c) { - final Player controller = c.getController(); - - CardList list = AllZoneUtil.getPlayerCardsInPlay(controller); - - list = list.filter(new CardListFilter() { - public boolean addCard(Card crd) { - return crd.hasKeyword("Whenever you cast a spell, exile target permanent."); - } - }); - - for (int i = 0; i < list.size(); i++) { - final Card card = list.get(i); - final SpellAbility ability = new Ability(card, "0") { - public void resolve() { - Card target = getTargetCard(); - if (CardFactoryUtil.canTarget(card, target) && AllZoneUtil.isCardInPlay(target)) - AllZone.getGameAction().exile(target); - } - - public void chooseTargetAI() { - CardList humanList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - CardList compList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - - CardListFilter filter = new CardListFilter() { - public boolean addCard(Card c) { - return CardFactoryUtil.canTarget(card, c); - } - }; - - humanList = humanList.filter(filter); - compList = compList.filter(filter); - - if (humanList.size() > 0) { - CardListUtil.sortCMC(humanList); - setTargetCard(humanList.get(0)); - } else if (compList.size() > 0) { - CardListUtil.sortCMC(compList); - compList.reverse(); - setTargetCard(compList.get(0)); - } - - } - }; - - Input runtime = new Input() { - private static final long serialVersionUID = -7620283169787412409L; - - @Override - public void showMessage() { - CardList list = AllZoneUtil.getCardsInPlay(); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isPermanent() && CardFactoryUtil.canTarget(card, c); - } - }); - - stopSetNext(CardFactoryUtil.input_targetSpecific(ability, list, - "Select target permanent to Exile", true, false)); - }//showMessage() - };//Input - - ability.setBeforePayMana(runtime); - if (controller.isHuman()) - AllZone.getGameAction().playSpellAbility(ability); - else { - ability.chooseTargetAI(); - - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - } - } - - - /** - *

playCard_Standstill.

- * - * @param c a {@link forge.Card} object. - */ - public static void playCard_Standstill(Card c) { - CardList list = AllZoneUtil.getCardsInPlay("Standstill"); - - for (int i = 0; i < list.size(); i++) { - final Player drawer = c.getController().getOpponent(); - final Card card = list.get(i); - - Ability ability2 = new Ability(card, "0") { - @Override - public void resolve() { - // sac standstill - AllZone.getGameAction().sacrifice(card); - // player who didn't play spell, draws 3 cards - drawer.drawCards(3); - } - }; // ability2 - - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - ").append(c.getController()); - sb.append(" played a spell, ").append(drawer).append(" draws three cards."); - ability2.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability2); - - } - - } - - - /** - *

playCard_Curse_of_Wizardry.

- * - * @param c a {@link forge.Card} object. - */ - public static void playCard_Curse_of_Wizardry(final Card c) { - CardList list = AllZoneUtil.getCardsInPlay("Curse of Wizardry"); - - if (list.size() > 0) { - ArrayList cl = CardUtil.getColors(c); - - for (int i = 0; i < list.size(); i++) { - final Card card = list.get(i); - if (cl.contains(card.getChosenColor())) { - Ability ability = new Ability(card, "0") { - public void resolve() { - c.getController().loseLife(1, card); - } //resolve - };//ability - - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - ").append(c.getController()); - sb.append(" played a ").append(card.getChosenColor()).append(" spell, "); - sb.append(c.getController()).append(" loses 1 life."); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - }//if - }//if - }//Curse of Wizardry - - /** - *

payManaDuringAbilityResolve.

- * - * @param message a {@link java.lang.String} object. - * @param manaCost a {@link java.lang.String} object. - * @param paid a {@link forge.Command} object. - * @param unpaid a {@link forge.Command} object. - */ - public static void payManaDuringAbilityResolve(String message, String manaCost, Command paid, Command unpaid) { - // temporarily disable the Resolve flag, so the user can payMana for the resolving Ability - boolean bResolving = AllZone.getStack().getResolving(); - AllZone.getStack().setResolving(false); - AllZone.getInputControl().setInput(new Input_PayManaCost_Ability(message, manaCost, paid, unpaid)); - AllZone.getStack().setResolving(bResolving); - } - - //START ENDOFTURN CARDS - - /** - *

endOfTurn_Wall_Of_Reverence.

- */ - public static void endOfTurn_Wall_Of_Reverence() { - final Player player = AllZone.getPhase().getPlayerTurn(); - CardList list = AllZoneUtil.getPlayerCardsInPlay(player, "Wall of Reverence"); - - Ability ability; - for (int i = 0; i < list.size(); i++) { - final Card card = list.get(i); - ability = new Ability(list.get(i), "0") { - public void resolve() { - CardList creats = AllZoneUtil.getCreaturesInPlay(player); - creats = creats.filter(AllZoneUtil.getCanTargetFilter(card)); - if (creats.size() == 0) - return; - - if (player.isHuman()) { - Object o = GuiUtils.getChoiceOptional("Select target creature for Wall of Reverence life gain", creats.toArray()); - if (o != null) { - Card c = (Card) o; - int power = c.getNetAttack(); - player.gainLife(power, card); - } - } else//computer - { - CardListUtil.sortAttack(creats); - Card c = creats.get(0); - if (c != null) { - int power = c.getNetAttack(); - player.gainLife(power, card); - } - } - } // resolve - }; // ability - - StringBuilder sb = new StringBuilder(); - sb.append(card).append(" - ").append(player).append(" gains life equal to target creature's power."); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - }//endOfTurn_Wall_Of_Reverence() - - /** - *

endOfTurn_Predatory_Advantage.

- */ - public static void endOfTurn_Predatory_Advantage() { - final Player player = AllZone.getPhase().getPlayerTurn(); - CardList list = AllZoneUtil.getPlayerCardsInPlay(player.getOpponent(), "Predatory Advantage"); - for (int i = 0; i < list.size(); i++) { - final Player controller = list.get(i).getController(); - if ((player.isHuman() && Phase.getPlayerCreatureSpellCount() == 0) || (player.isComputer() && Phase.getComputerCreatureSpellCount() == 0)) { - Ability abTrig = new Ability(list.get(i), "0") { - public void resolve() { - CardFactoryUtil.makeToken("Lizard", "G 2 2 Lizard", controller, "G", new String[]{"Creature", "Lizard"}, 2, 2, new String[]{""}); - } - }; - abTrig.setTrigger(true); - abTrig.setStackDescription("At the beginning of each opponent's end step, if that player didn't cast a creature spell this turn, put a 2/2 green Lizard creature token onto the battlefield."); - - AllZone.getGameAction().playSpellAbility(abTrig); - } - } - } - - /** - *

endOfTurn_Lighthouse_Chronologist.

- */ - public static void endOfTurn_Lighthouse_Chronologist() { - final Player player = AllZone.getPhase().getPlayerTurn(); - final Player opponent = player.getOpponent(); - CardList list = AllZoneUtil.getPlayerCardsInPlay(opponent); - - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getName().equals("Lighthouse Chronologist") && c.getCounters(Counters.LEVEL) >= 7; - } - }); - - Ability ability; - for (int i = 0; i < list.size(); i++) { - final Card card = list.get(i); - ability = new Ability(list.get(i), "0") { - public void resolve() { - AllZone.getPhase().addExtraTurn(card.getController()); - } - }; - - StringBuilder sb = new StringBuilder(); - sb.append(card).append(" - ").append(card.getController()).append(" takes an extra turn."); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - } - - //END ENDOFTURN CARDS - - /** - *

removeAttackedBlockedThisTurn.

- */ - public static void removeAttackedBlockedThisTurn() { - // resets the status of attacked/blocked this turn - Player player = AllZone.getPhase().getPlayerTurn(); - CardList list = AllZoneUtil.getCreaturesInPlay(player); - - for (int i = 0; i < list.size(); i++) { - Card c = list.get(i); - if (c.getCreatureAttackedThisCombat()) c.setCreatureAttackedThisCombat(false); - if (c.getCreatureBlockedThisCombat()) c.setCreatureBlockedThisCombat(false); - //do not reset setCreatureAttackedThisTurn(), this appears to be combat specific - - if (c.getCreatureGotBlockedThisCombat()) c.setCreatureGotBlockedThisCombat(false); - } - - AllZone.getGameInfo().setAssignedFirstStrikeDamageThisCombat(false); - AllZone.getGameInfo().setResolvedFirstStrikeDamageThisCombat(false); - } - - /** - *

showYesNoDialog.

- * - * @param c a {@link forge.Card} object. - * @param question a {@link java.lang.String} object. - * @return a boolean. - */ - public static boolean showYesNoDialog(Card c, String question) { - return showYesNoDialog(c, question, false); - } - - /** - *

showYesNoDialog.

- * - * @param c a {@link forge.Card} object. - * @param question a {@link java.lang.String} object. - * @param defaultNo true if the default option should be "No", false otherwise - * @return a boolean. - */ - public static boolean showYesNoDialog(Card c, String question, boolean defaultNo) { - AllZone.getDisplay().setCard(c); - StringBuilder title = new StringBuilder(); - title.append(c.getName()).append(" - Ability"); - - if (!(question.length() > 0)) { - question = "Activate card's ability?"; - } - - int answer; - if(defaultNo) { - Object options[] = {"Yes", "No"}; - answer = JOptionPane.showOptionDialog(null, question, title.toString(), JOptionPane.YES_NO_OPTION, - JOptionPane.PLAIN_MESSAGE, null, options, options[1]); - } - else { - answer= JOptionPane.showConfirmDialog(null, question, title.toString(), JOptionPane.YES_NO_OPTION); - } - - if (answer == JOptionPane.YES_OPTION) return true; - else return false; - } - - /** - *

showInfoDialg.

- * - * @param message a {@link java.lang.String} object. - */ - public static void showInfoDialg(String message) { - JOptionPane.showMessageDialog(null, message); - } - - /** - *

flipACoin.

- * - * @param caller a {@link forge.Player} object. - * @param source a {@link forge.Card} object. - * @return a boolean. - */ - public static boolean flipACoin(Player caller, Card source) { - String choice = ""; - String choices[] = {"heads", "tails"}; - boolean flip = (50 > MyRandom.random.nextInt(100)); - if (caller.isHuman()) { - choice = (String) GuiUtils.getChoice(source.getName() + " - Call coin flip", choices); - } else { - choice = choices[MyRandom.random.nextInt(2)]; - } - - if ((flip == true && choice.equals("heads")) || (flip == false && choice.equals("tails"))) { - JOptionPane.showMessageDialog(null, source.getName() + " - " + caller + " wins flip.", source.getName(), JOptionPane.PLAIN_MESSAGE); - return true; - } else { - JOptionPane.showMessageDialog(null, source.getName() + " - " + caller + " loses flip.", source.getName(), JOptionPane.PLAIN_MESSAGE); - return false; - } - } - - /** - *

executeLandfallEffects.

- * - * @param c a {@link forge.Card} object. - */ - public static void executeLandfallEffects(Card c) { - if (c.getName().equals("Lotus Cobra")) landfall_Lotus_Cobra(c); - } - - /** - *

showLandfallDialog.

- * - * @param c a {@link forge.Card} object. - * @return a boolean. - */ - private static boolean showLandfallDialog(Card c) { - AllZone.getDisplay().setCard(c); - String[] choices = {"Yes", "No"}; - - Object q = null; - - q = GuiUtils.getChoiceOptional("Use " + c.getName() + " Landfall?", choices); - - if (q == null || q.equals("No")) return false; - else return true; - } - - /** - *

landfall_Lotus_Cobra.

- * - * @param c a {@link forge.Card} object. - */ - private static void landfall_Lotus_Cobra(final Card c) { - Ability ability = new Ability(c, "0") { - @Override - public void resolve() { - String color = ""; - - Object o = GuiUtils.getChoice("Choose mana color", Constant.Color.onlyColors); - color = Input_PayManaCostUtil.getShortColorString((String) o); - - Ability_Mana abMana = new Ability_Mana(c, "0", color) { - private static final long serialVersionUID = -2182129023960978132L; - }; - abMana.produceMana(); - } - }; - - - StringBuilder sb = new StringBuilder(); - sb.append(c.getName()).append(" - add one mana of any color to your mana pool."); - ability.setStackDescription(sb.toString()); - - if (c.getController().isHuman()) { - if (showLandfallDialog(c)) AllZone.getStack().addSimultaneousStackEntry(ability); - } else { - // TODO: once AI has a mana pool he should choose add Ability and choose a mana as appropriate - } - } - - //not restricted to combat damage, not restricted to dealing damage to creatures/players - /** - *

executeDamageDealingEffects.

- * - * @param source a {@link forge.Card} object. - * @param damage a int. - */ - public static void executeDamageDealingEffects(final Card source, int damage) { - - if (damage <= 0) return; - - if (source.hasKeyword("Lifelink")) source.getController().gainLife(damage, source); - - } - - //restricted to combat damage and dealing damage to creatures - /** - *

executeCombatDamageToCreatureEffects.

- * - * @param source a {@link forge.Card} object. - * @param affected a {@link forge.Card} object. - * @param damage a int. - */ - public static void executeCombatDamageToCreatureEffects(final Card source, final Card affected, int damage) { - - if (damage <= 0) return; - - //placeholder for any future needs (everything that was here is converted to script) - } - - //not restricted to combat damage, restricted to dealing damage to creatures - /** - *

executeDamageToCreatureEffects.

- * - * @param source a {@link forge.Card} object. - * @param affected a {@link forge.Card} object. - * @param damage a int. - */ - public static void executeDamageToCreatureEffects(final Card source, final Card affected, int damage) { - - if (damage <= 0) return; - - if (affected.getName().equals("Stuffy Doll")) { - final Player opponent = affected.getOwner().getOpponent(); - final int stuffyDamage = damage; - SpellAbility ability = new Ability(affected, "0") { - @Override - public void resolve() { - opponent.addDamage(stuffyDamage, affected); - } - }; - StringBuilder sb = new StringBuilder(); - sb.append(affected.getName() + " - Deals ").append(stuffyDamage).append(" damage to ").append(opponent); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - - if (affected.hasKeyword("Whenever CARDNAME is dealt damage, put a +1/+1 counter on it.")) { - Ability ability2 = new Ability(affected, "0") { - @Override - public void resolve() { - affected.addCounter(Counters.P1P1, 1); - } - }; // ability2 - - StringBuilder sb2 = new StringBuilder(); - sb2.append(affected.getName()).append(" - gets a +1/+1 counter"); - ability2.setStackDescription(sb2.toString()); - int amount = affected.getAmountOfKeyword("Whenever CARDNAME is dealt damage, put a +1/+1 counter on it."); - - for (int i = 0; i < amount; i++) - AllZone.getStack().addSimultaneousStackEntry(ability2); - - } - - if (affected.hasStartOfKeyword("When CARDNAME is dealt damage, destroy it.")) { - final Ability ability = new Ability(source, "0") { - @Override - public void resolve() { - AllZone.getGameAction().destroy(affected); - } - }; - - final Ability ability2 = new Ability(source, "0") { - @Override - public void resolve() { - AllZone.getGameAction().destroyNoRegeneration(affected); - } - }; - - StringBuilder sb = new StringBuilder(); - sb.append(affected).append(" - destroy"); - ability.setStackDescription(sb.toString()); - ability2.setStackDescription(sb.toString()); - - if (affected.hasKeyword("When CARDNAME is dealt damage, destroy it. It can't be regenerated.")) { - int amount = affected.getAmountOfKeyword("When CARDNAME is dealt damage, destroy it. It can't be regenerated."); - - for (int i = 0; i < amount; i++) - AllZone.getStack().addSimultaneousStackEntry(ability2); - - } - int amount = affected.getAmountOfKeyword("When CARDNAME is dealt damage, destroy it."); - - for (int i = 1; i < amount; i++) - AllZone.getStack().addSimultaneousStackEntry(ability); - AllZone.getStack().addSimultaneousStackEntry(ability); - } - - if (source.hasKeyword("Deathtouch") - && affected.isCreature()) - AllZone.getGameAction().destroy(affected); - - - } - - /** - *

executeSwordOfLightAndShadowEffects.

- * - * @param source a {@link forge.Card} object. - */ - public static void executeSwordOfLightAndShadowEffects(final Card source) { - final Card src = source; - final Ability ability = new Ability(src, "0") { - @Override - public void resolve() { - Card target = getTargetCard(); - if (target != null) { - if (AllZoneUtil.isCardInPlayerGraveyard(src.getController(), target)) { - PlayerZone hand = AllZone.getZone(Constant.Zone.Hand, src.getController()); - AllZone.getGameAction().moveTo(hand, target); - } - } - - src.getController().gainLife(3, source); - } - }; // ability - - Command res = new Command() { - private static final long serialVersionUID = -7433708170033536384L; - - public void execute() { - CardList list = AllZoneUtil.getPlayerGraveyard(src.getController()); - list = list.filter(AllZoneUtil.creatures); - - if (list.isEmpty()) { - AllZone.getStack().addSimultaneousStackEntry(ability); - - return; - } - - if (src.getController().isHuman()) { - Object o = GuiUtils.getChoiceOptional("Select target card", list.toArray()); - if (o != null) { - ability.setTargetCard((Card) o); - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - }//if - else//computer - { - Card best = CardFactoryUtil.AI_getBestCreature(list); - ability.setTargetCard(best); - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - }//execute() - };//Command - - StringBuilder sb = new StringBuilder(); - sb.append("Sword of Light and Shadow - You gain 3 life and you may return "); - sb.append("up to one target creature card from your graveyard to your hand"); - ability.setStackDescription(sb.toString()); - - res.execute(); - } - - //this is for cards like Sengir Vampire - /** - *

executeVampiricEffects.

- * - * @param c a {@link forge.Card} object. - */ - public static void executeVampiricEffects(Card c) { - ArrayList a = c.getKeyword(); - for (int i = 0; i < a.size(); i++) { - if (AllZoneUtil.isCardInPlay(c) - && a.get(i).toString().startsWith( - "Whenever a creature dealt damage by CARDNAME this turn is put into a graveyard, put")) { - final Card thisCard = c; - final String kw = a.get(i).toString(); - Ability ability2 = new Ability(c, "0") { - @Override - public void resolve() { - Counters counter = Counters.P1P1; - if (kw.contains("+2/+2")) counter = Counters.P2P2; - if (AllZoneUtil.isCardInPlay(thisCard)) thisCard.addCounter(counter, 1); - } - }; // ability2 - - StringBuilder sb = new StringBuilder(); - sb.append(c.getName()); - if (kw.contains("+2/+2")) { - sb.append(" - gets a +2/+2 counter"); - } else { - sb.append(" - gets a +1/+1 counter"); - } - ability2.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability2); - - } - } - } - - //not restricted to just combat damage, restricted to players - /** - *

executeDamageToPlayerEffects.

- * - * @param player a {@link forge.Player} object. - * @param c a {@link forge.Card} object. - * @param damage a int. - */ - public static void executeDamageToPlayerEffects(final Player player, final Card c, final int damage) { - if (damage <= 0) return; - - CardList playerPerms = AllZoneUtil.getPlayerCardsInPlay(player); - - if (playerPerms.getName("Farsight Mask").size() > 0) { - final Card c1 = c; - CardList l = playerPerms.filter(new CardListFilter() { - public boolean addCard(Card crd) { - return crd.getName().equals("Farsight Mask") && crd.isUntapped() && !c1.getController().equals(crd.getController()); - } - }); - for (Card crd : l) - playerDamage_Farsight_Mask(player, c, crd); - } - - if (AllZoneUtil.isCardInPlay("Lich", player)) { - CardList lichs = playerPerms.getName("Lich"); - for (Card crd : lichs) { - final Card lich = crd; - SpellAbility ability = new Ability(lich, "0") { - public void resolve() { - for (int i = 0; i < damage; i++) { - CardList nonTokens = AllZoneUtil.getPlayerCardsInPlay(player); - nonTokens = nonTokens.filter(AllZoneUtil.nonToken); - if (nonTokens.size() == 0) { - player.altLoseConditionMet("Lich"); - } else player.sacrificePermanent("Select a permanent to sacrifice", nonTokens); - } - } - }; - - StringBuilder sb = new StringBuilder(); - sb.append(lich.getName()).append(" - ").append(lich.getController()); - sb.append(" sacrifices ").append(damage).append(" nontoken Permanents."); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - } - - if (c.getName().equals("Whirling Dervish") || c.getName().equals("Dunerider Outlaw")) - playerCombatDamage_Whirling_Dervish(c); - - if (player.isPlayer(AllZone.getHumanPlayer())) c.setDealtDmgToHumanThisTurn(true); - if (player.isPlayer(AllZone.getComputerPlayer())) c.setDealtDmgToComputerThisTurn(true); - } - - - //restricted to combat damage, restricted to players - /** - *

executeCombatDamageToPlayerEffects.

- * - * @param player a {@link forge.Player} object. - * @param c a {@link forge.Card} object. - * @param damage a int. - */ - public static void executeCombatDamageToPlayerEffects(final Player player, final Card c, final int damage) { - - if (damage <= 0) return; - - if (c.isCreature() && AllZoneUtil.isCardInPlay("Contested War Zone", player)) { - CardList zones = AllZoneUtil.getPlayerCardsInPlay(player, "Contested War Zone"); - for (final Card zone : zones) { - Ability ability = new Ability(zone, "0") { - @Override - public void resolve() { - if (AllZoneUtil.isCardInPlay(zone)) { - AllZone.getGameAction().changeController(new CardList(zone), zone.getController(), c.getController()); - } - } - }; - ability.setStackDescription(zone + " - " + c.getController() + " gains control of " + zone); - - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - } - - if (c.hasStartOfKeyword("Poisonous")) { - int KeywordPosition = c.getKeywordPosition("Poisonous"); - String parse = c.getKeyword().get(KeywordPosition).toString(); - String k[] = parse.split(" "); - final int poison = Integer.parseInt(k[1]); - final Card crd = c; - - Ability ability = new Ability(c, "0") { - public void resolve() { - final Player player = crd.getController(); - final Player opponent = player.getOpponent(); - - if (opponent.isHuman()) - AllZone.getHumanPlayer().addPoisonCounters(poison); - else - AllZone.getComputerPlayer().addPoisonCounters(poison); - } - }; - - StringBuilder sb = new StringBuilder(); - sb.append(c); - sb.append(" - Poisonous: "); - sb.append(c.getController().getOpponent()); - sb.append(" gets "); - sb.append(poison); - sb.append(" poison counters."); - - ability.setStackDescription(sb.toString()); - ArrayList keywords = c.getKeyword(); - - for (int i = 0; i < keywords.size(); i++) { - if (keywords.get(i).startsWith("Poisonous")) - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - } - - if (CardFactoryUtil.hasNumberEquipments(c, "Quietus Spike") > 0 && c.getNetAttack() > 0) { - for (int k = 0; k < CardFactoryUtil.hasNumberEquipments(c, "Quietus Spike"); k++) { - playerCombatDamage_lose_halflife_up(c); - } - } - - if (c.isEquipped()) { - ArrayList equips = c.getEquippedBy(); - for (Card equip : equips) { - if (equip.getName().equals("Sword of Light and Shadow")) { - GameActionUtil.executeSwordOfLightAndShadowEffects(equip); - } - } - }//isEquipped - - - if (c.getName().equals("Scalpelexis")) playerCombatDamage_Scalpelexis(c); - else if (c.getName().equals("Augury Adept")) playerCombatDamage_Augury_Adept(c); - else if (c.getName().equals("Spawnwrithe")) playerCombatDamage_Spawnwrithe(c); - else if (c.getName().equals("Treva, the Renewer")) playerCombatDamage_Treva(c); - else if (c.getName().equals("Rith, the Awakener")) playerCombatDamage_Rith(c); - - else if (c.isEnchantedBy("Celestial Mantle")) execute_Celestial_Mantle(c); - - //Unused variable - //c.setDealtCombatDmgToOppThisTurn(true); - - }//executeCombatDamageToPlayerEffects - - /** - *

execute_Celestial_Mantle.

- * - * @param enchanted a {@link forge.Card} object. - */ - private static void execute_Celestial_Mantle(final Card enchanted) { - ArrayList auras = enchanted.getEnchantedBy(); - for (final Card aura : auras) { - if (aura.getName().equals("Celestial Mantle")) { - Ability doubleLife = new Ability(aura, "0") { - public void resolve() { - int life = enchanted.getController().getLife(); - enchanted.getController().setLife(life * 2, aura); - } - }; - doubleLife.setStackDescription(aura.getName() + " - " + enchanted.getController() + " doubles his or her life total."); - - AllZone.getStack().addSimultaneousStackEntry(doubleLife); - - } - } - } - - /** - *

playerDamage_Farsight_Mask.

- * - * @param player a {@link forge.Player} object. - * @param c a {@link forge.Card} object. - * @param crd a {@link forge.Card} object. - * @param crd a {@link forge.Card} object. - */ - private static void playerDamage_Farsight_Mask(final Player player, final Card c, final Card crd) { - Ability ability = new Ability(crd, "0") { - public void resolve() { - if (crd.isUntapped()) { - player.mayDrawCard(); - } - } - }; - ability.setStackDescription("Farsight Mask - You may draw a card."); - - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - - - /** - *

playerCombatDamage_Treva.

- * - * @param c a {@link forge.Card} object. - */ - private static void playerCombatDamage_Treva(Card c) { - SpellAbility[] sa = c.getSpellAbility(); - if (c.getController().isHuman()) AllZone.getGameAction().playSpellAbility(sa[1]); - else ComputerUtil.playNoStack(sa[1]); - - } - - /** - *

playerCombatDamage_Rith.

- * - * @param c a {@link forge.Card} object. - */ - private static void playerCombatDamage_Rith(Card c) { - SpellAbility[] sa = c.getSpellAbility(); - if (c.getController().isHuman()) AllZone.getGameAction().playSpellAbility(sa[1]); - else ComputerUtil.playNoStack(sa[1]); - } - - /** - *

playerCombatDamage_Whirling_Dervish.

- * - * @param c a {@link forge.Card} object. - */ - private static void playerCombatDamage_Whirling_Dervish(Card c) { - final int power = c.getNetAttack(); - final Card card = c; - - if (power > 0) { - final Ability ability2 = new Ability(c, "0") { - @Override - public void resolve() { - card.addCounter(Counters.P1P1, 1); - } - };// ability2 - - StringBuilder sb = new StringBuilder(); - sb.append(c.getName()).append(" - gets a +1/+1 counter."); - ability2.setStackDescription(sb.toString()); - - Command dealtDmg = new Command() { - private static final long serialVersionUID = 2200679209414069339L; - - public void execute() { - AllZone.getStack().addSimultaneousStackEntry(ability2); - - } - }; - AllZone.getEndOfTurn().addAt(dealtDmg); - - } // if - } - - /** - *

playerCombatDamage_lose_halflife_up.

- * - * @param c a {@link forge.Card} object. - */ - private static void playerCombatDamage_lose_halflife_up(Card c) { - final Player player = c.getController(); - final Player opponent = player.getOpponent(); - final Card F_card = c; - if (c.getNetAttack() > 0) { - Ability ability2 = new Ability(c, "0") { - @Override - public void resolve() { - int x = 0; - int y = 0; - if (player.isHuman()) { - y = (AllZone.getComputerPlayer().getLife() % 2); - if (!(y == 0)) y = 1; - else y = 0; - - x = (AllZone.getComputerPlayer().getLife() / 2) + y; - } else { - y = (AllZone.getHumanPlayer().getLife() % 2); - if (!(y == 0)) y = 1; - else y = 0; - - x = (AllZone.getHumanPlayer().getLife() / 2) + y; - } - opponent.loseLife(x, F_card); - - } - };// ability2 - - StringBuilder sb = new StringBuilder(); - sb.append(c.getName()).append(" - ").append(opponent); - sb.append(" loses half his or her life, rounded up."); - ability2.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability2); - - } - } - - /** - *

playerCombatDamage_Scalpelexis.

- * - * @param c a {@link forge.Card} object. - */ - private static void playerCombatDamage_Scalpelexis(Card c) { - final Player player = c.getController(); - final Player opponent = player.getOpponent(); - - if (c.getNetAttack() > 0) { - Ability ability = new Ability(c, "0") { - @Override - public void resolve() { - - CardList libList = AllZoneUtil.getPlayerCardsInLibrary(opponent); - int count = 0; - int broken = 0; - for (int i = 0; i < libList.size(); i = i + 4) { - Card c1 = null; - Card c2 = null; - Card c3 = null; - Card c4 = null; - if (i < libList.size()) c1 = libList.get(i); - else broken = 1; - if (i + 1 < libList.size()) c2 = libList.get(i + 1); - else broken = 1; - if (i + 2 < libList.size()) c3 = libList.get(i + 2); - else broken = 1; - if (i + 3 < libList.size()) c4 = libList.get(i + 3); - else broken = 1; - if (broken == 0) { - if ((c1.getName().contains(c2.getName()) || c1.getName().contains(c3.getName()) - || c1.getName().contains(c4.getName()) || c2.getName().contains(c3.getName()) - || c2.getName().contains(c4.getName()) || c3.getName().contains(c4.getName()))) { - count = count + 1; - } else { - broken = 1; - } - } - - } - count = (count * 4) + 4; - int max = count; - if (libList.size() < count) max = libList.size(); - - for (int j = 0; j < max; j++) { - Card c = libList.get(j); - AllZone.getGameAction().exile(c); - } - } - };// ability - - StringBuilder sb = new StringBuilder(); - sb.append("Scalpelexis - ").append(opponent); - sb.append(" exiles the top four cards of his or her library. "); - sb.append("If two or more of those cards have the same name, repeat this process."); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - } - - /** - *

playerCombatDamage_Spawnwrithe.

- * - * @param c a {@link forge.Card} object. - */ - private static void playerCombatDamage_Spawnwrithe(Card c) { - final Player player = c.getController(); - final Card crd = c; - - Ability ability2 = new Ability(c, "0") { - @Override - public void resolve() { - CardList cl = CardFactoryUtil.makeToken("Spawnwrithe", "", crd.getController(), "2 G", new String[]{ - "Creature", "Elemental"}, 2, 2, new String[]{"Trample"}); - - for (Card c : cl) { - c.setText("Whenever Spawnwrithe deals combat damage to a player, put a token that's a copy of Spawnwrithe onto the battlefield."); - c.setCopiedToken(true); - } - } - };// ability2 - - StringBuilder sb = new StringBuilder(); - sb.append(c.getName()).append(" - ").append(player).append(" puts copy onto the battlefield."); - ability2.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability2); - - } - - /** - *

playerCombatDamage_Augury_Adept.

- * - * @param c a {@link forge.Card} object. - */ - private static void playerCombatDamage_Augury_Adept(Card c) { - final Player[] player = new Player[1]; - final Card crd = c; - - if (c.getNetAttack() > 0) { - Ability ability2 = new Ability(crd, "0") { - @Override - public void resolve() { - player[0] = crd.getController(); - PlayerZone lib = AllZone.getZone(Constant.Zone.Library, player[0]); - - if (lib.size() > 0) { - CardList cl = new CardList(); - cl.add(lib.get(0)); - GuiUtils.getChoiceOptional("Top card", cl.toArray()); - } - ; - if (lib.size() == 0) - return; - Card top = lib.get(0); - player[0].gainLife(CardUtil.getConvertedManaCost(top.getManaCost()), crd); - AllZone.getGameAction().moveToHand(top); - } - };// ability2 - - player[0] = c.getController(); - - StringBuilder sb = new StringBuilder(); - sb.append(c.getName()).append(" - ").append(player[0]); - sb.append(" reveals the top card of his library and put that card into his hand. "); - sb.append("He gain life equal to its converted mana cost."); - ability2.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability2); - - } - } - - - /** - *

draw_Sylvan_Library.

- * - * @param player a {@link forge.Player} object. - */ - private static void draw_Sylvan_Library(final Player player) { - /* - * At the beginning of your draw step, you may draw two additional - * cards. If you do, choose two cards in your hand drawn this turn. - * For each of those cards, pay 4 life or put the card on top of - * your library. - */ - final CardList cards = AllZoneUtil.getPlayerCardsInPlay(player, "Sylvan Library"); - - for (final Card source : cards) { - final Ability ability = new Ability(source, "") { - @Override - public void resolve() { - final Player player = source.getController(); - if (player.isHuman()) { - String question = "Draw 2 additional cards?"; - final String cardQuestion = "Pay 4 life and keep in hand?"; - if (GameActionUtil.showYesNoDialog(source, question)) { - player.drawCards(2); - for (int i = 0; i < 2; i++) { - final String prompt = source + " - Select a card drawn this turn: " + (2 - i) + " of 2"; - AllZone.getInputControl().setInput(new Input() { - private static final long serialVersionUID = -3389565833121544797L; - - @Override - public void showMessage() { - if (AllZone.getHumanHand().size() == 0) stop(); - AllZone.getDisplay().showMessage(prompt); - ButtonUtil.disableAll(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (zone.is(Constant.Zone.Hand) && true == card.getDrawnThisTurn()) { - if (player.canPayLife(4) && GameActionUtil.showYesNoDialog(source, cardQuestion)) { - player.payLife(4, source); - //card stays in hand - } else { - AllZone.getGameAction().moveToLibrary(card); - } - stop(); - } - } - });//end Input - } - } - } else { - //Computer, but he's too stupid to play this - } - }//resolve - };// Ability - - StringBuilder sb = new StringBuilder(); - sb.append("At the beginning of your draw step, you may draw two additional cards. If you do, choose two cards in your hand drawn this turn. For each of those cards, pay 4 life or put the card on top of your library."); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability); - - }//end for - } - - - /* Constant Conspiracy - public static Command Conspiracy = new Command() { - private static final long serialVersionUID = -752798545956593342L; - - CardList gloriousAnthemList = new CardList(); - - public void execute() { - //String keyword = "Defender"; - - CardList list = gloriousAnthemList; - Card c; - // reset all cards in list - aka "old" cards - for (int i = 0; i < list.size(); i++) { - c = list.get(i); - //System.out.println("prev type: " +c.getPrevType()); - c.setType(c.getPrevType()); - } - - list.clear(); - - PlayerZone[] zone = new PlayerZone[4]; - - CardList cl = AllZoneUtil.getCardsInPlay("Conspiracy"); - - for (int i = 0; i < cl.size(); i++) { - Card card = cl.get(i); - Player player = card.getController(); - zone[0] = AllZone.getZone(Constant.Zone.Hand, - player); - zone[1] = AllZone.getZone(Constant.Zone.Library, - player); - zone[2] = AllZone.getZone( - Constant.Zone.Graveyard, player); - zone[3] = AllZone.getZone(Constant.Zone.Battlefield, - player); - - for (int outer = 0; outer < zone.length; outer++) { - CardList creature = AllZoneUtil.getCardsInZone(zone[outer]); - creature = creature.getType("Creature"); - - for (int j = 0; j < creature.size(); j++) { - boolean art = false; - boolean ench = false; - - c = creature.get(j); - - if (c.isArtifact()) art = true; - if (c.isEnchantment()) ench = true; - - if (c.getPrevType().size() == 0) c.setPrevType(c.getType()); - c.setType(new ArrayList()); - c.addType("Creature"); - if (art) c.addType("Artifact"); - if (ench) c.addType("Enchantment"); - c.addType(card.getChosenType()); - - gloriousAnthemList.add(c); - } - } - }// for inner - }// execute() - }; //Conspiracy*/ - - - /** Constant Elspeth_Emblem */ - public static Command Elspeth_Emblem = new Command() { - - private static final long serialVersionUID = 7414127991531889390L; - CardList gloriousAnthemList = new CardList(); - - public void execute() { - String keyword = "Indestructible"; - - CardList list = gloriousAnthemList; - Card c; - // reset all cards in list - aka "old" cards - for (int i = 0; i < list.size(); i++) { - c = list.get(i); - c.removeExtrinsicKeyword(keyword); - } - - list.clear(); - - CardList emblem = AllZoneUtil.getCardsInPlay(); - emblem = emblem.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isEmblem() - && c.hasKeyword("Artifacts, creatures, enchantments, and lands you control are indestructible."); - } - }); - - for (int i = 0; i < emblem.size(); i++) { - CardList perms = AllZoneUtil.getPlayerCardsInPlay(emblem.get(i).getController()); - - for (int j = 0; j < perms.size(); j++) { - c = perms.get(j); - if (!c.hasKeyword(keyword)) { - c.addExtrinsicKeyword(keyword); - gloriousAnthemList.add(c); - } - } - } - }// execute() - }; - - /** Constant Favor_of_the_Mighty */ - public static Command Favor_of_the_Mighty = new Command() { - private static final long serialVersionUID = 2920036758177137722L; - private CardList pumped = new CardList(); - - public void execute() { - //Reset old cards - for (Card c : pumped) { - c.removeIntrinsicKeyword("Protection from white"); - c.removeIntrinsicKeyword("Protection from blue"); - c.removeIntrinsicKeyword("Protection from black"); - c.removeIntrinsicKeyword("Protection from red"); - c.removeIntrinsicKeyword("Protection from green"); - } - pumped.clear(); - - //Find creature(s) with highest cmc - int maxCMC = -1; - //boolean keepLooping = true; - CardList creats = AllZoneUtil.getCreaturesInPlay(); - for (Card c : creats) { - if (c.getCMC() > maxCMC) { - pumped.clear(); - pumped.add(c); - maxCMC = c.getCMC(); - } else if (c.getCMC() == maxCMC) { - pumped.add(c); - } - } - - //Pump new cards - for (Card c : pumped) { - c.addIntrinsicKeyword("Protection from white"); - c.addIntrinsicKeyword("Protection from blue"); - c.addIntrinsicKeyword("Protection from black"); - c.addIntrinsicKeyword("Protection from red"); - c.addIntrinsicKeyword("Protection from green"); - } - } - }; - - /** Constant Koth_Emblem */ - public static Command Koth_Emblem = new Command() { - - private static final long serialVersionUID = -3233715310427996429L; - CardList gloriousAnthemList = new CardList(); - - public void execute() { - CardList list = gloriousAnthemList; - Card crd; - // reset all cards in list - aka "old" cards - for (int i = 0; i < list.size(); i++) { - crd = list.get(i); - SpellAbility[] sas = crd.getSpellAbility(); - for (int j = 0; j < sas.length; j++) { - if (sas[j].isKothThirdAbility()) - crd.removeSpellAbility(sas[j]); - } - } - - CardList emblem = AllZoneUtil.getCardsInPlay(); - emblem = emblem.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isEmblem() - && c.hasKeyword("Mountains you control have 'tap: This land deals 1 damage to target creature or player.'"); - } - }); - - for (int i = 0; i < emblem.size(); i++) { - CardList mountains = AllZoneUtil.getPlayerCardsInPlay(emblem.get(i).getController()); - mountains = mountains.filter(new CardListFilter() { - public boolean addCard(Card crd) { - return crd.isType("Mountain"); - } - }); - - for (int j = 0; j < mountains.size(); j++) { - final Card c = mountains.get(j); - boolean hasAbility = false; - SpellAbility[] sas = c.getSpellAbility(); - for (SpellAbility sa : sas) { - if (sa.isKothThirdAbility()) - hasAbility = true; - } - - if (!hasAbility) { - Cost abCost = new Cost("T", c.getName(), true); - Target target = new Target(c, "TgtCP"); - final Ability_Activated ability = new Ability_Activated(c, abCost, target) { - private static final long serialVersionUID = -7560349014757367722L; - - public void chooseTargetAI() { - CardList list = CardFactoryUtil.AI_getHumanCreature(1, c, true); - list.shuffle(); - - if (list.isEmpty() || AllZone.getHumanPlayer().getLife() < 5) - setTargetPlayer(AllZone.getHumanPlayer()); - else - setTargetCard(list.get(0)); - } - - public void resolve() { - if (getTargetCard() != null) { - if (AllZoneUtil.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(c, getTargetCard())) - getTargetCard().addDamage(1, c); - } else { - getTargetPlayer().addDamage(1, c); - } - }//resolve() - };//SpellAbility - ability.setKothThirdAbility(true); - ability.setDescription(abCost + "This land deals 1 damage to target creature or player."); - - c.addSpellAbility(ability); - - gloriousAnthemList.add(c); - } - } - } - - } - }; - - // Special Conditions - /** - *

specialConditionsMet.

- * - * @param SourceCard a {@link forge.Card} object. - * @param SpecialConditions a {@link java.lang.String} object. - * @return a boolean. - */ - public static boolean specialConditionsMet(Card SourceCard, String SpecialConditions) { - - if (SpecialConditions.contains("CardsInHandMore")) { - CardList SpecialConditionsCardList = AllZoneUtil.getPlayerHand(SourceCard.getController()); - String Condition = SpecialConditions.split("/")[1]; - if (SpecialConditionsCardList.size() < Integer.valueOf(Condition)) return false; - } - if (SpecialConditions.contains("OppHandEmpty")) { - CardList oppHand = AllZoneUtil.getPlayerHand(SourceCard.getController().getOpponent()); - if (!(oppHand.size() == 0)) return false; - } - if (SpecialConditions.contains("TopCardOfLibraryIsBlack")) { - PlayerZone lib = AllZone.getZone(Constant.Zone.Library, SourceCard.getController()); - if (!(lib.get(0).isBlack())) return false; - } - if (SpecialConditions.contains("LibraryLE")) { - CardList Library = AllZoneUtil.getPlayerCardsInLibrary(SourceCard.getController()); - String maxnumber = SpecialConditions.split("/")[1]; - if (Library.size() > Integer.valueOf(maxnumber)) return false; - } - if (SpecialConditions.contains("LifeGE")) { - int life = SourceCard.getController().getLife(); - String maxnumber = SpecialConditions.split("/")[1]; - if (!(life >= Integer.valueOf(maxnumber))) return false; - } - if (SpecialConditions.contains("OppCreatureInPlayGE")) { - CardList OppInPlay = AllZoneUtil.getPlayerCardsInPlay(SourceCard.getController().getOpponent()); - OppInPlay = OppInPlay.getType("Creature"); - String maxnumber = SpecialConditions.split("/")[1]; - if (!(OppInPlay.size() >= Integer.valueOf(maxnumber))) return false; - } - if (SpecialConditions.contains("LandYouCtrlLE")) { - CardList LandInPlay = AllZoneUtil.getPlayerCardsInPlay(SourceCard.getController()); - LandInPlay = LandInPlay.getType("Land"); - String maxnumber = SpecialConditions.split("/")[1]; - if (!(LandInPlay.size() <= Integer.valueOf(maxnumber))) return false; - } - if (SpecialConditions.contains("LandOppCtrlLE")) { - CardList OppLandInPlay = AllZoneUtil.getPlayerCardsInPlay(SourceCard.getController().getOpponent()); - OppLandInPlay = OppLandInPlay.getType("Land"); - String maxnumber = SpecialConditions.split("/")[1]; - if (!(OppLandInPlay.size() <= Integer.valueOf(maxnumber))) return false; - } - if (SpecialConditions.contains("OppCtrlMoreCreatures")) { - CardList CreaturesInPlayYou = AllZoneUtil.getPlayerCardsInPlay(SourceCard.getController()); - CreaturesInPlayYou = CreaturesInPlayYou.getType("Creature"); - CardList CreaturesInPlayOpp = AllZoneUtil.getPlayerCardsInPlay(SourceCard.getController().getOpponent()); - CreaturesInPlayOpp = CreaturesInPlayOpp.getType("Creature"); - if (CreaturesInPlayYou.size() > CreaturesInPlayOpp.size()) return false; - } - if (SpecialConditions.contains("OppCtrlMoreLands")) { - CardList LandsInPlayYou = AllZoneUtil.getPlayerCardsInPlay(SourceCard.getController()); - LandsInPlayYou = LandsInPlayYou.getType("Land"); - CardList LandsInPlayOpp = AllZoneUtil.getPlayerCardsInPlay(SourceCard.getController().getOpponent()); - LandsInPlayOpp = LandsInPlayOpp.getType("Land"); - if (LandsInPlayYou.size() > LandsInPlayOpp.size()) return false; - } - if (SpecialConditions.contains("EnchantedControllerCreaturesGE")) { - CardList EnchantedControllerInPlay = AllZoneUtil.getPlayerCardsInPlay(SourceCard.getEnchantingCard().getController()); - EnchantedControllerInPlay = EnchantedControllerInPlay.getType("Creature"); - String maxnumber = SpecialConditions.split("/")[1]; - if (!(EnchantedControllerInPlay.size() >= Integer.valueOf(maxnumber))) return false; - } - if (SpecialConditions.contains("OppLifeLE")) { - int life = SourceCard.getController().getOpponent().getLife(); - String maxnumber = SpecialConditions.split("/")[1]; - if (!(life <= Integer.valueOf(maxnumber))) return false; - } - if (SpecialConditions.contains("Threshold")) { - if (!SourceCard.getController().hasThreshold()) return false; - } - if (SpecialConditions.contains("Imprint")) { - if (SourceCard.getImprinted().isEmpty()) return false; - } - if (SpecialConditions.contains("Hellbent")) { - CardList Handcards = AllZoneUtil.getPlayerHand(SourceCard.getController()); - if (Handcards.size() > 0) return false; - } - if (SpecialConditions.contains("Metalcraft")) { - CardList CardsinPlay = AllZoneUtil.getPlayerCardsInPlay(SourceCard.getController()); - CardsinPlay = CardsinPlay.getType("Artifact"); - if (CardsinPlay.size() < 3) return false; - } - if (SpecialConditions.contains("isPresent")) { // is a card of a certain type/color present? - String Requirements = SpecialConditions.replaceAll("isPresent ", ""); - CardList CardsinPlay = AllZoneUtil.getCardsInPlay(); - String Conditions[] = Requirements.split(","); - CardsinPlay = CardsinPlay.getValidCards(Conditions, SourceCard.getController(), SourceCard); - if (CardsinPlay.isEmpty()) return false; - } - if (SpecialConditions.contains("isInGraveyard")) { // is a card of a certain type/color present in yard? - String Requirements = SpecialConditions.replaceAll("isInGraveyard ", ""); - CardList CardsinYards = AllZoneUtil.getCardsInGraveyard(); - String Conditions[] = Requirements.split(","); - CardsinYards = CardsinYards.getValidCards(Conditions, SourceCard.getController(), SourceCard); - if (CardsinYards.isEmpty()) return false; - } - if (SpecialConditions.contains("isNotPresent")) { // is no card of a certain type/color present? - String Requirements = SpecialConditions.replaceAll("isNotPresent ", ""); - CardList CardsinPlay = AllZoneUtil.getCardsInPlay(); - String Conditions[] = Requirements.split(","); - CardsinPlay = CardsinPlay.getValidCards(Conditions, SourceCard.getController(), SourceCard); - if (!CardsinPlay.isEmpty()) return false; - } - if (SpecialConditions.contains("isEquipped")) { - if (!SourceCard.isEquipped()) return false; - } - if (SpecialConditions.contains("isEnchanted")) { - if (!SourceCard.isEnchanted()) return false; - } - if (SpecialConditions.contains("isUntapped")) { - if (!SourceCard.isUntapped()) return false; - } - if (SpecialConditions.contains("isValid")) { // does this card meet the valid description? - String Requirements = SpecialConditions.replaceAll("isValid ", ""); - if (!SourceCard.isValid(Requirements, SourceCard.getController(), SourceCard)) return false; - } - if (SpecialConditions.contains("isYourTurn")) { - if (!AllZone.getPhase().isPlayerTurn(SourceCard.getController())) return false; - } - if (SpecialConditions.contains("notYourTurn")) { - if (!AllZone.getPhase().isPlayerTurn(SourceCard.getController().getOpponent())) return false; - } - if (SpecialConditions.contains("OppPoisoned")) { - if (SourceCard.getController().getOpponent().getPoisonCounters() == 0) return false; - } - if (SpecialConditions.contains("OppNotPoisoned")) { - if (SourceCard.getController().getOpponent().getPoisonCounters() > 0) return false; - } - return true; - - } - - /** Constant stLandManaAbilities */ - public static Command stLandManaAbilities = new Command() { - private static final long serialVersionUID = 8005448956536998277L; - - public void execute() { - - - HashMap produces = new HashMap(); - /* - * for future use - boolean naked = AllZoneUtil.isCardInPlay("Naked Singularity"); - boolean twist = AllZoneUtil.isCardInPlay("Reality Twist"); - //set up what they produce - produces.put("Forest", naked || twist ? "B" : "G"); - produces.put("Island", naked == true ? "G" : "U"); - if(naked) produces.put("Mountain", "U"); - else if(twist) produces.put("Mountain", "W"); - else produces.put("Mountain", "R"); - produces.put("Plains", naked || twist ? "R" : "W"); - if(naked) produces.put("Swamp", "W"); - else if(twist) produces.put("Swamp", "G"); - else produces.put("Swamp", "B"); - */ - produces.put("Forest", "G"); - produces.put("Island", "U"); - produces.put("Mountain", "R"); - produces.put("Plains", "W"); - produces.put("Swamp", "B"); - - CardList lands = AllZoneUtil.getCardsInGame(); - lands = lands.filter(AllZoneUtil.lands); - - //remove all abilities granted by this Command - for (Card land : lands) { - ArrayList sas = land.getManaAbility(); - for (SpellAbility sa : sas) { - if (sa.getType().equals("BasicLandTypeMana")) { - land.removeSpellAbility(sa); - } - } - } - - //add all appropriate mana abilities based on current types - for (Card land : lands) { - if (land.isType("Swamp")) { - AbilityFactory AF = new AbilityFactory(); - SpellAbility sa = AF.getAbility("AB$ Mana | Cost$ T | Produced$ " + produces.get("Swamp") + " | SpellDescription$ Add " + produces.get("Swamp") + " to your mana pool.", land); - sa.setType("BasicLandTypeMana"); - land.addSpellAbility(sa); - } - if (land.isType("Forest")) { - AbilityFactory AF = new AbilityFactory(); - SpellAbility sa = AF.getAbility("AB$ Mana | Cost$ T | Produced$ " + produces.get("Forest") + " | SpellDescription$ Add " + produces.get("Forest") + " to your mana pool.", land); - sa.setType("BasicLandTypeMana"); - land.addSpellAbility(sa); - } - if (land.isType("Island")) { - AbilityFactory AF = new AbilityFactory(); - SpellAbility sa = AF.getAbility("AB$ Mana | Cost$ T | Produced$ " + produces.get("Island") + " | SpellDescription$ Add " + produces.get("Island") + " to your mana pool.", land); - sa.setType("BasicLandTypeMana"); - land.addSpellAbility(sa); - } - if (land.isType("Mountain")) { - AbilityFactory AF = new AbilityFactory(); - SpellAbility sa = AF.getAbility("AB$ Mana | Cost$ T | Produced$ " + produces.get("Mountain") + " | SpellDescription$ Add " + produces.get("Mountain") + " to your mana pool.", land); - sa.setType("BasicLandTypeMana"); - land.addSpellAbility(sa); - } - if (land.isType("Plains")) { - AbilityFactory AF = new AbilityFactory(); - SpellAbility sa = AF.getAbility("AB$ Mana | Cost$ T | Produced$ " + produces.get("Plains") + " | SpellDescription$ Add " + produces.get("Plains") + " to your mana pool.", land); - sa.setType("BasicLandTypeMana"); - land.addSpellAbility(sa); - } - } - }// execute() - - };//stLandManaAbilities - - - /** Constant Coat_of_Arms */ - public static Command Coat_of_Arms = new Command() { - private static final long serialVersionUID = 583505612126735693L; - - CardList gloriousAnthemList = new CardList(); - - public void execute() { - CardList list = gloriousAnthemList; - // reset all cards in list - aka "old" cards - for (int i2 = 0; i2 < list.size(); i2++) { - list.get(i2).addSemiPermanentAttackBoost(-1); - list.get(i2).addSemiPermanentDefenseBoost(-1); - } - // add +1/+1 to cards - list.clear(); - PlayerZone[] zone = getZone("Coat of Arms"); - - // for each zone found add +1/+1 to each card - for (int outer = 0; outer < zone.length; outer++) { - CardList creature = AllZoneUtil.getCardsInPlay(); - - for (int i = 0; i < creature.size(); i++) { - final Card crd = creature.get(i); - CardList Type = AllZoneUtil.getCardsInPlay(); - Type = Type.filter(new CardListFilter() { - public boolean addCard(Card card) { - return !card.equals(crd) && card.isCreature() && !crd.getName().equals("Mana Pool"); - } - }); - CardList Already_Added = new CardList(); - for (int x = 0; x < Type.size(); x++) { - Already_Added.clear(); - for (int x2 = 0; x2 < Type.get(x).getType().size(); x2++) { - if (!Already_Added.contains(Type.get(x))) { - if (!Type.get(x).getType().get(x2).equals("Creature") && !Type.get(x).getType().get(x2).equals("Legendary") - && !Type.get(x).getType().get(x2).equals("Artifact")) { - if (crd.isType(Type.get(x).getType().get(x2)) - || crd.hasKeyword("Changeling") - || Type.get(x).hasKeyword("Changeling")) { - Already_Added.add(Type.get(x)); - crd.addSemiPermanentAttackBoost(1); - crd.addSemiPermanentDefenseBoost(1); - gloriousAnthemList.add(crd); - } - } - } - } - } - }// for inner - }// for outer - }// execute - }; // Coat of Arms - - /** - * stores the Command - */ - public static Command Umbra_Stalker = new Command() { - private static final long serialVersionUID = -3500747003228938898L; - - public void execute() { - // get all creatures - CardList cards = AllZoneUtil.getCardsInPlay("Umbra Stalker"); - for (Card c : cards) { - Player player = c.getController(); - CardList grave = AllZoneUtil.getPlayerGraveyard(player); - int pt = CardFactoryUtil.getNumberOfManaSymbolsByColor("B", grave); - c.setBaseAttack(pt); - c.setBaseDefense(pt); - } - }// execute() - }; - - /** Constant Ajani_Avatar_Token */ - public static Command Ajani_Avatar_Token = new Command() { - private static final long serialVersionUID = 3027329837165436727L; - - public void execute() { - CardList list = AllZoneUtil.getCardsInPlay(); - - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getName().equals("Avatar") - && c.getImageName().equals("W N N Avatar"); - } - }); - for (int i = 0; i < list.size(); i++) { - Card card = list.get(i); - int n = card.getController().getLife(); - card.setBaseAttack(n); - card.setBaseDefense(n); - }// for - }// execute - }; // Ajani Avatar - - /** Constant Old_Man_of_the_Sea */ - public static Command Old_Man_of_the_Sea = new Command() { - private static final long serialVersionUID = 8076177362922156784L; - - public void execute() { - CardList list = AllZoneUtil.getCardsInPlay("Old Man of the Sea"); - for (Card oldman : list) { - if (!oldman.getGainControlTargets().isEmpty()) { - if (oldman.getNetAttack() < oldman.getGainControlTargets().get(0).getNetAttack()) { - ArrayList coms = oldman.getGainControlReleaseCommands(); - for (int i = 0; i < coms.size(); i++) { - coms.get(i).execute(); - } - } - } - } - } - };//Old Man of the Sea - - /** Constant Homarid */ - public static Command Homarid = new Command() { - private static final long serialVersionUID = 7156319758035295773L; - - public void execute() { - CardList list = AllZoneUtil.getCardsInPlay("Homarid"); - - for (Card homarid : list) { - int tide = homarid.getCounters(Counters.TIDE); - if (tide == 4) { - homarid.setCounter(Counters.TIDE, 0, true); - } - } - }// execute() - }; - - /** Constant Liu_Bei */ - public static Command Liu_Bei = new Command() { - - private static final long serialVersionUID = 4235093010715735727L; - - public void execute() { - CardList list = AllZoneUtil.getCardsInPlay("Liu Bei, Lord of Shu"); - - if (list.size() > 0) { - for (int i = 0; i < list.size(); i++) { - - Card c = list.get(i); - if (getsBonus(c)) { - c.setBaseAttack(4); - c.setBaseDefense(6); - } else { - c.setBaseAttack(2); - c.setBaseDefense(4); - } - - } - } - }// execute() - - private boolean getsBonus(Card c) { - CardList list = AllZoneUtil.getPlayerCardsInPlay(c.getController()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getName().equals("Guan Yu, Sainted Warrior") - || c.getName().equals("Zhang Fei, Fierce Warrior"); - } - }); - - return list.size() > 0; - } - - }; //Liu_Bei - - - /** Constant Sound_the_Call_Wolf */ - public static Command Sound_the_Call_Wolf = new Command() { - private static final long serialVersionUID = 4614281706799537283L; - - public void execute() { - CardList list = AllZoneUtil.getCardsInPlay(); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getName().equals("Wolf") - && c.hasKeyword("This creature gets +1/+1 for each card named Sound the Call in each graveyard."); - } - }); - - for (int i = 0; i < list.size(); i++) { - Card c = list.get(i); - c.setBaseAttack(1 + countSoundTheCalls()); - c.setBaseDefense(c.getBaseAttack()); - } - } - - private int countSoundTheCalls() { - CardList list = AllZoneUtil.getCardsInGraveyard(); - list = list.getName("Sound the Call"); - return list.size(); - } - - }; //Sound_the_Call_Wolf - - /** Constant Tarmogoyf */ - public static Command Tarmogoyf = new Command() { - private static final long serialVersionUID = 5895665460018262987L; - - public void execute() { - // get all creatures - CardList list = AllZoneUtil.getCardsInPlay("Tarmogoyf"); - - for (int i = 0; i < list.size(); i++) { - Card c = list.get(i); - c.setBaseAttack(countDiffTypes()); - c.setBaseDefense(c.getBaseAttack() + 1); - } - - }// execute() - - private int countDiffTypes() { - CardList list = AllZoneUtil.getCardsInGraveyard(); - - int count = 0; - for (int q = 0; q < list.size(); q++) { - if (list.get(q).isCreature()) { - count++; - break; - } - } - for (int q = 0; q < list.size(); q++) { - if (list.get(q).isSorcery()) { - count++; - break; - } - } - for (int q = 0; q < list.size(); q++) { - if (list.get(q).isInstant()) { - count++; - break; - } - } - for (int q = 0; q < list.size(); q++) { - if (list.get(q).isArtifact()) { - count++; - break; - } - } - - for (int q = 0; q < list.size(); q++) { - if (list.get(q).isEnchantment()) { - count++; - break; - } - } - - for (int q = 0; q < list.size(); q++) { - if (list.get(q).isLand()) { - count++; - break; - } - } - - for (int q = 0; q < list.size(); q++) { - if (list.get(q).isPlaneswalker()) { - count++; - break; - } - } - - for (int q = 0; q < list.size(); q++) { - if (list.get(q).isTribal()) { - count++; - break; - } - } - return count; - } - }; - - /** Constant Muraganda_Petroglyphs */ - public static Command Muraganda_Petroglyphs = new Command() { - private static final long serialVersionUID = -6715848091817213517L; - CardList gloriousAnthemList = new CardList(); - - public void execute() { - CardList list = gloriousAnthemList; - Card c; - // reset all cards in list - aka "old" cards - for (int i = 0; i < list.size(); i++) { - c = list.get(i); - c.addSemiPermanentAttackBoost(-2); - c.addSemiPermanentDefenseBoost(-2); - } - - // add +2/+2 to vanilla cards - list.clear(); - PlayerZone[] zone = getZone("Muraganda Petroglyphs"); - - // for each zone found add +2/+2 to each vanilla card - for (int outer = 0; outer < zone.length; outer++) { - CardList creature = AllZoneUtil.getCreaturesInPlay(); - - for (int i = 0; i < creature.size(); i++) { - c = creature.get(i); - if (((c.getAbilityText().trim().equals("") || c.isFaceDown()) && c.getUnhiddenKeyword().size() == 0)) { - c.addSemiPermanentAttackBoost(2); - c.addSemiPermanentDefenseBoost(2); - - gloriousAnthemList.add(c); - } - - }// for inner - }// for outer - }// execute() - }; // Muraganda_Petroglyphs - - /** Constant Meddling_Mage */ - public static Command Meddling_Mage = new Command() { - private static final long serialVersionUID = 738264163993370439L; - CardList gloriousAnthemList = new CardList(); - - public void execute() { - CardList list = gloriousAnthemList; - Card c; - // reset all cards in list - aka "old" cards - for (int i = 0; i < list.size(); i++) { - c = list.get(i); - //c.removeIntrinsicKeyword("This card can't be cast"); - c.setUnCastable(false); - } - - list.clear(); - - CardList cl = AllZoneUtil.getCardsInPlay("Meddling Mage"); - - for (int i = 0; i < cl.size(); i++) { - final Card crd = cl.get(i); - - CardList spells = new CardList(); - spells.addAll(AllZoneUtil.getPlayerGraveyard(AllZone.getHumanPlayer())); - spells.addAll(AllZoneUtil.getPlayerHand(AllZone.getHumanPlayer())); - spells.addAll(AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer())); - spells.addAll(AllZoneUtil.getPlayerGraveyard(AllZone.getComputerPlayer())); - spells = spells.filter(new CardListFilter() { - public boolean addCard(Card c) { - return !c.isLand() - && c.getName().equals( - crd.getNamedCard()); - } - }); - - for (int j = 0; j < spells.size(); j++) { - c = spells.get(j); - if (!c.isLand()) { - //c.addIntrinsicKeyword("This card can't be cast"); - c.setUnCastable(true); - gloriousAnthemList.add(c); - } - }// for inner - }// for outer - }// execute() - }; // Meddling_Mage - - /** Constant Gaddock_Teeg */ - public static Command Gaddock_Teeg = new Command() { - private static final long serialVersionUID = -479252814191086571L; - CardList gloriousAnthemList = new CardList(); - - public void execute() { - CardList list = gloriousAnthemList; - Card c; - // reset all cards in list - aka "old" cards - for (int i = 0; i < list.size(); i++) { - c = list.get(i); - //c.removeIntrinsicKeyword("This card can't be cast"); - c.setUnCastable(false); - } - - list.clear(); - - CardList cl = AllZoneUtil.getCardsInPlay("Gaddock Teeg"); - - for (int i = 0; i < cl.size(); i++) { - CardList spells = new CardList(); - spells.addAll(AllZoneUtil.getPlayerGraveyard(AllZone.getHumanPlayer())); - spells.addAll(AllZoneUtil.getPlayerHand(AllZone.getHumanPlayer())); - spells.addAll(AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer())); - spells.addAll(AllZoneUtil.getPlayerGraveyard(AllZone.getComputerPlayer())); - - spells = spells.filter(new CardListFilter() { - public boolean addCard(Card c) { - - boolean isXNonCreature = false; - if (c.getSpellAbility().length > 0) { - if (c.getSpellAbility()[0].isXCost()) - isXNonCreature = true; - } - - return !c.isLand() - && !c.isCreature() - && (CardUtil.getConvertedManaCost(c.getManaCost()) >= 4 || isXNonCreature); - } - }); - - for (int j = 0; j < spells.size(); j++) { - c = spells.get(j); - if (!c.isLand()) { - c.setUnCastable(true); - gloriousAnthemList.add(c); - } - }// for inner - }// for outer - }// execute() - }; // - - /** Constant Iona_Shield_of_Emeria */ - public static Command Iona_Shield_of_Emeria = new Command() { - private static final long serialVersionUID = 7349652597673216545L; - CardList gloriousAnthemList = new CardList(); - - public void execute() { - CardList list = gloriousAnthemList; - Card c; - // reset all cards in list - aka "old" cards - for (int i = 0; i < list.size(); i++) { - c = list.get(i); - //c.removeIntrinsicKeyword("This card can't be cast"); - c.setUnCastable(false); - } - - list.clear(); - - CardList cl = AllZoneUtil.getCardsInPlay("Iona, Shield of Emeria"); - - for (int i = 0; i < cl.size(); i++) { - final Card crd = cl.get(i); - Player controller = cl.get(i).getController(); - Player opp = controller.getOpponent(); - - CardList spells = new CardList(); - spells.addAll(AllZoneUtil.getPlayerGraveyard(opp)); - spells.addAll(AllZoneUtil.getPlayerHand(opp)); - - spells = spells.filter(new CardListFilter() { - public boolean addCard(Card c) { - return !c.isLand() - && CardUtil.getColors(c).contains( - crd.getChosenColor()); - } - }); - - for (int j = 0; j < spells.size(); j++) { - c = spells.get(j); - if (!c.isLand()) { - c.setUnCastable(true); - gloriousAnthemList.add(c); - } - }// for inner - }// for outer - }// execute() - }; //end Iona, Shield of Emeria - - // returns all PlayerZones that has at least 1 Glorious Anthem - // if Computer has 2 Glorious Anthems, AllZone.getComputerPlay() will be - // returned twice - /** - *

getZone.

- * - * @param cardName a {@link java.lang.String} object. - * @return an array of {@link forge.PlayerZone} objects. - */ - private static PlayerZone[] getZone(String cardName) { - CardList all = AllZoneUtil.getCardsInPlay(); - - ArrayList zone = new ArrayList(); - for (int i = 0; i < all.size(); i++) { - Card c = all.get(i); - if (c.getName().equals(cardName) && !c.isFaceDown()) zone.add(AllZone.getZone(c)); - } - - PlayerZone[] z = new PlayerZone[zone.size()]; - zone.toArray(z); - return z; - } - - /** Constant commands */ - public static HashMap commands = new HashMap(); - - static { - //Please add cards in alphabetical order so they are easier to find - - commands.put("Ajani_Avatar_Token", Ajani_Avatar_Token); - commands.put("Coat_of_Arms", Coat_of_Arms); - //commands.put("Conspiracy", Conspiracy); - commands.put("Elspeth_Emblem", Elspeth_Emblem); - commands.put("Favor_of_the_Mighty", Favor_of_the_Mighty); - commands.put("Gaddock_Teeg", Gaddock_Teeg); - commands.put("Homarid", Homarid); - commands.put("Iona_Shield_of_Emeria", Iona_Shield_of_Emeria); - - commands.put("Koth_Emblem", Koth_Emblem); - commands.put("Liu_Bei", Liu_Bei); - - commands.put("Meddling_Mage", Meddling_Mage); - commands.put("Muraganda_Petroglyphs", Muraganda_Petroglyphs); - - commands.put("Old_Man_of_the_Sea", Old_Man_of_the_Sea); - - commands.put("Sound_the_Call_Wolf", Sound_the_Call_Wolf); - commands.put("Tarmogoyf", Tarmogoyf); - - commands.put("Umbra_Stalker", Umbra_Stalker); - - ///The commands above are in alphabetical order by cardname. - } - - /** Constant stAnimate */ - public static Command stAnimate = new Command() { - /** stAnimate - * Syntax:[ k[0] stAnimate[All][Self][Enchanted] : k[1] AnimateValid : - * k[2] P/T/Keyword : k[3] extra types : k[4] extra colors : - * k[5] Abilities : k[6] Special Conditions : k[7] Description - * - */ - - private static final long serialVersionUID = -1404133561787349004L; - - // storage stores the source card and the cards it gave its bonus to, to know what to remove - private ArrayList storage = new ArrayList(); - - public void execute() { - - // remove all static effects - for (int i = 0; i < storage.size(); i++) { - removeStaticEffect(storage.get(i)); - } - - //clear the list - storage = new ArrayList(); - - //Gather Cards on the Battlefield with the stPump Keyword - CardList cards = AllZoneUtil.getCardsInPlay(); - cards.getKeywordsContain("stAnimate"); - - // check each card - for (int i = 0; i < cards.size(); i++) { - Card cardWithKeyword = cards.get(i); - ArrayList keywords = cardWithKeyword.getKeyword(); - - // check each keyword of the card - for (int j = 0; j < keywords.size(); j++) { - String keyword = keywords.get(j); - - if (keyword.startsWith("stAnimate")) { - StaticEffect se = new StaticEffect(); //create a new StaticEffect - se.setSource(cardWithKeyword); - se.setKeywordNumber(j); - - - //get the affected cards - String k[] = keyword.split(":", 8); - - if (specialConditionsMet(cardWithKeyword, k[6])) { //special conditions are isPresent, isValid - - final String affected = k[1]; - final String specific[] = affected.split(","); - CardList affectedCards = getAffectedCards(cardWithKeyword, k, specific); // options are All, Self, Enchanted etc. - se.setAffectedCards(affectedCards); - - String[] pt = k[2].split("/"); - if (!k[2].equals("no changes") && pt.length > 1) { - - int x = 0; - if (pt[0].contains("X") || pt[1].contains("X")) - x = CardFactoryUtil.xCount(cardWithKeyword, cardWithKeyword.getSVar("X").split("\\$")[1]); - se.setXValue(x); - - int y = 0; - if (pt[1].contains("Y")) - y = CardFactoryUtil.xCount(cardWithKeyword, cardWithKeyword.getSVar("Y").split("\\$")[1]); - se.setYValue(y); - } - - ArrayList types = new ArrayList(); - if (!k[3].equalsIgnoreCase("no types")) { - types.addAll(Arrays.asList(k[3].split(","))); - if (types.contains("Overwrite")) { - types.remove("Overwrite"); - se.setOverwriteTypes(true); - } - if (types.contains("KeepSupertype")) { - types.remove("KeepSupertype"); - se.setKeepSupertype(true); - } - if (types.contains("RemoveSubTypes")) { - types.remove("RemoveSubTypes"); - se.setRemoveSubTypes(true); - } - } - - String colors = ""; - if (!k[4].equalsIgnoreCase("no colors")) { - colors = k[4]; - if (colors.contains(",Overwrite") || colors.contains("Overwrite")) { - colors = colors.replace(",Overwrite", ""); - colors = colors.replace("Overwrite", ""); - se.setOverwriteColors(true); - } - colors = CardUtil.getShortColorsString(new ArrayList(Arrays.asList(k[4].split(",")))); - } - - if (k[2].contains("Overwrite")) { - se.setOverwriteKeywords(true); - } - - if (k[5].contains("Overwrite")) { - se.setOverwriteAbilities(true); - } - - addStaticEffects(se, cardWithKeyword, affectedCards, k[2], types, colors); //give the boni to the affected cards - - storage.add(se); // store the information - } - } - } - } - }// execute() - - private void addStaticEffects(StaticEffect se, Card source, CardList affectedCards, String details, ArrayList types, String colors) { - - for (int i = 0; i < affectedCards.size(); i++) { - Card affectedCard = affectedCards.get(i); - - if (!details.equals("no changes")) { - String[] keyword = details.split("/", 3); - String powerStr = keyword[0]; - String toughStr = keyword[1]; - //copied from stSetPT power/toughness - if (!powerStr.equals("no change")) { - int power = powerStr.matches("[0-9][0-9]?") ? Integer.parseInt(powerStr) : CardFactoryUtil.xCount(affectedCard, powerStr); - se.addOriginalPT(affectedCard, affectedCard.getBaseAttack(), affectedCard.getBaseDefense()); - affectedCard.setBaseAttack(power); - } - if (!toughStr.equals("no change")) { - int toughness = toughStr.matches("[0-9][0-9]?") ? Integer.parseInt(toughStr) : CardFactoryUtil.xCount(affectedCard, toughStr); - se.addOriginalPT(affectedCard, affectedCard.getBaseAttack(), affectedCard.getBaseDefense()); - affectedCard.setBaseDefense(toughness); - } - if (se.isOverwriteKeywords()) { - se.addOriginalKeywords(affectedCard, affectedCard.getIntrinsicKeyword()); - affectedCard.clearAllKeywords(); - } else { - if (keyword.length != 2) { - int index = 2; - if (keyword.length == 1) index = 0; - String keywords[] = keyword[index].split(" & "); - for (int j = 0; j < keywords.length; j++) { - String kw = keywords[j]; - affectedCard.addExtrinsicKeyword(kw); - } - } - } - } - - if (se.isOverwriteTypes()) { - se.addOriginalTypes(affectedCard, affectedCard.getType()); - if (!se.isKeepSupertype()) { - affectedCard.clearAllTypes(); - } else { - ArrayList acTypes = affectedCard.getType(); - for (String t : acTypes) { - if (!CardUtil.isASuperType(t)) affectedCard.removeType(t); - } - } - } - if (se.isRemoveSubTypes()) { - se.addOriginalTypes(affectedCard, affectedCard.getType()); - ArrayList acTypes = affectedCard.getType(); - for (String t : acTypes) { - if (CardUtil.isASubType(t)) affectedCard.removeType(t); - } - } - for (String type : types) { - if (!affectedCard.isType(type)) { - affectedCard.addType(type); - se.addType(affectedCard, type); - } else { - se.removeType(affectedCard, type); - } - } - //Abilities - if (se.isOverwriteAbilities()) { - se.addOriginalAbilities(affectedCard, affectedCard.getAllButFirstSpellAbility()); - affectedCard.clearAllButFirstSpellAbility(); - } else { - //TODO - adding SpellAbilities statically here not supported at this time - } - - long t = affectedCard.addColor(colors, affectedCard, !se.isOverwriteColors(), true); - se.addTimestamp(affectedCard, t); - }//end for - } - - void removeStaticEffect(StaticEffect se) { - Card source = se.getSource(); - CardList affected = se.getAffectedCards(); - int num = se.getKeywordNumber(); - String parse = source.getKeyword().get(num).toString(); - String k[] = parse.split(":"); - for (int i = 0; i < affected.size(); i++) { - Card c = affected.get(i); - removeStaticEffect(se, source, c, k); - } - se.clearAllTypes(); - se.clearTimestamps(); - } - - private void removeStaticEffect(StaticEffect se, Card source, Card affectedCard, String[] details) { - - String[] kw = details[2].split("/", 3); - - if (!details[2].equals("no changes")) { - if (!kw[0].equals("no change")) - affectedCard.setBaseAttack(se.getOriginalPower(affectedCard)); - if (!kw[1].equals("no change")) - affectedCard.setBaseDefense(se.getOriginalToughness(affectedCard)); - } - - for (String type : se.getTypes(affectedCard)) { - affectedCard.removeType(type); - } - if (se.isOverwriteTypes()) { - for (String type : se.getOriginalTypes(affectedCard)) { - if (!se.isKeepSupertype() || (se.isKeepSupertype() && !CardUtil.isASuperType(type))) { - affectedCard.addType(type); - } - } - } - if (se.isRemoveSubTypes()) { - for (String type : se.getOriginalTypes(affectedCard)) { - if (CardUtil.isASubType(type)) affectedCard.addType(type); - } - } - - if (se.isOverwriteKeywords()) { - for (String keyw : se.getOriginalKeywords(affectedCard)) affectedCard.addIntrinsicKeyword(keyw); - } else { - if (kw.length != 2) { - int index = 2; - if (kw.length == 1) index = 0; - String keywords[] = kw[index].split(" & "); - for (int j = 0; j < keywords.length; j++) { - String keyw = keywords[j]; - affectedCard.removeExtrinsicKeyword(keyw); - } - } - } - //Abilities - if (se.isOverwriteAbilities()) { - for (SpellAbility sa : se.getOriginalAbilities(affectedCard)) affectedCard.addSpellAbility(sa); - } else { - //TODO - adding SpellAbilities statically here not supported at this time - } - - affectedCard.removeColor(se.getColorDesc(), affectedCard, !se.isOverwriteColors(), se.getTimestamp(affectedCard)); - }//end removeStaticEffects - - private CardList getAffectedCards(Card source, String[] details, String[] specific) { - // [Self], [All], [Enchanted] - CardList affected = new CardList(); - String range = details[0].replaceFirst("stAnimate", ""); - - if (range.equals("Self")) { - affected.add(source); - } else if (range.equals("All")) { - affected.addAll(AllZoneUtil.getCardsInPlay()); - } else if (range.equals("Enchanted")) { - if (source.getEnchanting().size() > 0) { - affected.addAll(source.getEnchanting().toArray()); - } - } - affected = affected.getValidCards(specific, source.getController(), source); - - return affected; - }//end getAffectedCards() - }; - - - /** - *

doPowerSink.

- * - * @param p a {@link forge.Player} object. - */ - public static void doPowerSink(Player p) { - //get all lands with mana abilities - CardList lands = AllZoneUtil.getPlayerLandsInPlay(p); - lands = lands.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getManaAbility().size() > 0; - } - }); - //tap them - for (Card c : lands) c.tap(); - - //empty mana pool - if (p.isHuman()) AllZone.getManaPool().clearPool(); - else AllZone.getComputerManaPool().clearPool(); - } - -}//end class GameActionUtil diff --git a/src/forge/GameInfo.java b/src/forge/GameInfo.java deleted file mode 100644 index 9169191a06f..00000000000 --- a/src/forge/GameInfo.java +++ /dev/null @@ -1,194 +0,0 @@ -package forge; - -import forge.card.mana.ManaCost; - -import java.util.ArrayList; - -/** - *

GameInfo class.

- * - * @author Forge - * @version $Id: $ - */ -public class GameInfo { - private boolean computerStartedThisGame = false; - - private int humanNumberOfTimesMulliganed; - private boolean humanMulliganedToZero; - - private boolean preventCombatDamageThisTurn; - private boolean assignedFirstStrikeDamageThisCombat; - private boolean resolvedFirstStrikeDamageThisCombat; - - private ArrayList globalColorChanges = new ArrayList(); - - /** - *

Getter for the field humanNumberOfTimesMulliganed.

- * - * @return a int. - */ - public int getHumanNumberOfTimesMulliganed() { - return humanNumberOfTimesMulliganed; - } - - /** - *

addHumanNumberOfTimesMulliganed.

- * - * @param n a int. - */ - public void addHumanNumberOfTimesMulliganed(int n) { - humanNumberOfTimesMulliganed += n; - } - - /** - *

Setter for the field humanNumberOfTimesMulliganed.

- * - * @param n a int. - */ - public void setHumanNumberOfTimesMulliganed(int n) { - humanNumberOfTimesMulliganed = n; - } - - /** - *

Getter for the field humanMulliganedToZero.

- * - * @return a boolean. - */ - public boolean getHumanMulliganedToZero() { - return humanMulliganedToZero; - } - - /** - *

Setter for the field humanMulliganedToZero.

- * - * @param b a boolean. - */ - public void setHumanMulliganedToZero(boolean b) { - humanMulliganedToZero = b; - } - - /** - *

Setter for the field preventCombatDamageThisTurn.

- * - * @param b a boolean. - */ - public void setPreventCombatDamageThisTurn(boolean b) { - preventCombatDamageThisTurn = b; - } - - /** - *

isPreventCombatDamageThisTurn.

- * - * @return a boolean. - */ - public boolean isPreventCombatDamageThisTurn() { - return preventCombatDamageThisTurn; - } - - /** - *

Setter for the field assignedFirstStrikeDamageThisCombat.

- * - * @param b a boolean. - */ - public void setAssignedFirstStrikeDamageThisCombat(boolean b) { - assignedFirstStrikeDamageThisCombat = b; - } - - /** - *

Getter for the field assignedFirstStrikeDamageThisCombat.

- * - * @return a boolean. - */ - public boolean getAssignedFirstStrikeDamageThisCombat() { - return assignedFirstStrikeDamageThisCombat; - } - - /** - *

Setter for the field resolvedFirstStrikeDamageThisCombat.

- * - * @param b a boolean. - */ - public void setResolvedFirstStrikeDamageThisCombat(boolean b) { - resolvedFirstStrikeDamageThisCombat = b; - } - - /** - *

Getter for the field resolvedFirstStrikeDamageThisCombat.

- * - * @return a boolean. - */ - public boolean getResolvedFirstStrikeDamageThisCombat() { - return resolvedFirstStrikeDamageThisCombat; - } - - /** - *

Setter for the field computerStartedThisGame.

- * - * @param computerStartedThisGame a boolean. - */ - public void setComputerStartedThisGame(boolean computerStartedThisGame) { - this.computerStartedThisGame = computerStartedThisGame; - } - - /** - *

isComputerStartedThisGame.

- * - * @return a boolean. - */ - public boolean isComputerStartedThisGame() { - return computerStartedThisGame; - } - - /** - *

addColorChanges.

- * - * @param s a {@link java.lang.String} object. - * @param c a {@link forge.Card} object. - * @param addToColors a boolean. - * @param bIncrease a boolean. - * @return a long. - */ - public long addColorChanges(String s, Card c, boolean addToColors, boolean bIncrease) { - if (bIncrease) - Card_Color.increaseTimestamp(); - globalColorChanges.add(new Card_Color(new ManaCost(s), c, addToColors, false)); - return Card_Color.getTimestamp(); - } - - /** - *

removeColorChanges.

- * - * @param s a {@link java.lang.String} object. - * @param c a {@link forge.Card} object. - * @param addTo a boolean. - * @param timestamp a long. - */ - public void removeColorChanges(String s, Card c, boolean addTo, long timestamp) { - Card_Color removeCol = null; - for (Card_Color cc : globalColorChanges) - if (cc.equals(s, c, addTo, timestamp)) - removeCol = cc; - - if (removeCol != null) - globalColorChanges.remove(removeCol); - } - - /** - *

clearColorChanges.

- */ - public void clearColorChanges() { - // clear the global color changes at end of each game - globalColorChanges.clear(); - } - - /** - *

getColorChanges.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getColorChanges() { - return globalColorChanges; - } - - -} diff --git a/src/forge/GuiDisplay4.java b/src/forge/GuiDisplay4.java deleted file mode 100644 index e2fb75e095b..00000000000 --- a/src/forge/GuiDisplay4.java +++ /dev/null @@ -1,1350 +0,0 @@ -package forge; - - -import arcane.ui.HandArea; -import arcane.ui.PlayArea; -import arcane.ui.ViewPanel; -import arcane.ui.util.Animation; -import forge.card.cardFactory.CardFactoryUtil; -import forge.error.ErrorViewer; -import forge.gui.ForgeAction; -import forge.gui.GuiUtils; -import forge.gui.game.CardDetailPanel; -import forge.gui.game.CardPanel; -import forge.gui.input.Input_Attack; -import forge.gui.input.Input_Block; -import forge.gui.input.Input_PayManaCost; -import forge.gui.input.Input_PayManaCost_Ability; -import forge.properties.ForgePreferences; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; -import net.slightlymagic.braids.util.ImmutableIterableFrom; -import org.jdesktop.swingx.JXMultiSplitPane; -import org.jdesktop.swingx.MultiSplitLayout.Node; - -import com.google.code.jyield.Generator; -import com.google.code.jyield.YieldUtils; - -import javax.swing.*; -import javax.swing.border.Border; -import javax.swing.border.EmptyBorder; -import javax.swing.border.EtchedBorder; -import javax.swing.border.TitledBorder; -import java.awt.*; -import java.awt.Color; -import java.awt.event.*; -import java.beans.XMLDecoder; -import java.beans.XMLEncoder; -import java.io.*; -import java.util.*; -import java.util.List; - -import static org.jdesktop.swingx.MultiSplitLayout.parseModel; - - -/** - *

GuiDisplay4 class.

- * - * @author Forge - * @version $Id$ - */ -public class GuiDisplay4 extends JFrame implements CardContainer, Display, NewConstants, NewConstants.GUI.GuiDisplay, NewConstants.LANG.GuiDisplay { - /** Constant serialVersionUID=4519302185194841060L */ - private static final long serialVersionUID = 4519302185194841060L; - - private GuiInput inputControl; - - Font statFont = new Font("Dialog", Font.PLAIN, 12); - Font lifeFont = new Font("Dialog", Font.PLAIN, 40); - // Font checkboxFont = new Font("Dialog", Font.PLAIN, 9); - - - /** Constant greenColor */ - public static Color greenColor = new Color(0, 164, 0); - - private Action HUMAN_GRAVEYARD_ACTION; - private Action HUMAN_REMOVED_ACTION; - private Action HUMAN_FLASHBACK_ACTION; - private Action COMPUTER_GRAVEYARD_ACTION; - private Action COMPUTER_REMOVED_ACTION; - private Action CONCEDE_ACTION; - //public Card cCardHQ; - - //private CardList multiBlockers = new CardList(); - - /** - *

Constructor for GuiDisplay4.

- */ - public GuiDisplay4() { - AllZone.setDisplay(this); - setupActions(); - initComponents(); - - addObservers(); - addListeners(); - addMenu(); - inputControl = new GuiInput(); - } - - /** {@inheritDoc} */ - @Override - public void setVisible(boolean visible) { - if (visible) { - //causes an error if put in the constructor, causes some random null pointer exception - AllZone.getInputControl().updateObservers(); - - //Use both so that when "un"maximizing, the frame isn't tiny - setSize(1024, 740); - setExtendedState(Frame.MAXIMIZED_BOTH); - } - super.setVisible(visible); - } - - /** {@inheritDoc} */ - public void assignDamage(Card attacker, CardList blockers, int damage) { - if (damage <= 0) - return; - new Gui_MultipleBlockers4(attacker, blockers, damage, this); - } - - /** - *

setupActions.

- */ - private void setupActions() { - HUMAN_GRAVEYARD_ACTION = new ZoneAction(AllZone.getHumanGraveyard(), HUMAN_GRAVEYARD); - HUMAN_REMOVED_ACTION = new ZoneAction(AllZone.getHumanExile(), HUMAN_REMOVED); - HUMAN_FLASHBACK_ACTION = new ZoneAction(AllZone.getHumanGraveyard(), HUMAN_FLASHBACK) { - - private static final long serialVersionUID = 8120331222693706164L; - - @Override - protected Iterable getCardsAsIterable() { - return new ImmutableIterableFrom(CardFactoryUtil.getExternalZoneActivationCards(AllZone.getHumanPlayer())); - } - - @Override - protected void doAction(Card c) { - AllZone.getGameAction().playCard(c); - } - }; - COMPUTER_GRAVEYARD_ACTION = new ZoneAction(AllZone.getComputerGraveyard(), COMPUTER_GRAVEYARD); - COMPUTER_REMOVED_ACTION = new ZoneAction(AllZone.getComputerExile(), COMPUTER_REMOVED); - CONCEDE_ACTION = new ConcedeAction(); - } - - /** - *

addMenu.

- */ - private void addMenu() { - // Game Menu Creation - Object[] obj = { - HUMAN_GRAVEYARD_ACTION, HUMAN_REMOVED_ACTION, HUMAN_FLASHBACK_ACTION, COMPUTER_GRAVEYARD_ACTION, - COMPUTER_REMOVED_ACTION, new JSeparator(), - playsoundCheckboxForMenu, new JSeparator(), ErrorViewer.ALL_THREADS_ACTION, - CONCEDE_ACTION}; - - JMenu gameMenu = new JMenu(ForgeProps.getLocalized(MENU_BAR.MENU.TITLE)); - for (Object o : obj) { - if (o instanceof ForgeAction) gameMenu.add(((ForgeAction) o).setupButton(new JMenuItem())); - else if (o instanceof Action) gameMenu.add((Action) o); - else if (o instanceof Component) gameMenu.add((Component) o); - else throw new AssertionError(); - } - - // Phase Menu Creation - JMenu gamePhases = new JMenu(ForgeProps.getLocalized(MENU_BAR.PHASE.TITLE)); - - JMenuItem aiLabel = new JMenuItem("Computer"); - JMenuItem humanLabel = new JMenuItem("Human"); - - Component[] objPhases = {aiLabel, cbAIUpkeep, cbAIDraw, cbAIBeginCombat, - cbAIEndCombat, cbAIEndOfTurn, new JSeparator(), - humanLabel, cbHumanUpkeep, cbHumanDraw, cbHumanBeginCombat, - cbHumanEndCombat, cbHumanEndOfTurn}; - - for (Component cmp : objPhases) { - gamePhases.add(cmp); - } - - // Dev Mode Creation - JMenu devMenu = new JMenu(ForgeProps.getLocalized(MENU_BAR.DEV.TITLE)); - - devMenu.setEnabled(Constant.Runtime.DevMode[0]); - - if (Constant.Runtime.DevMode[0]) { - canLoseByDecking.setSelected(Constant.Runtime.Mill[0]); - - Action viewAIHand = new ZoneAction(AllZone.getComputerHand(), COMPUTER_HAND.BASE); - Action viewAILibrary = new ZoneAction(AllZone.getComputerLibrary(), COMPUTER_LIBRARY.BASE); - Action viewHumanLibrary = new ZoneAction(AllZone.getHumanLibrary(), HUMAN_LIBRARY.BASE); - ForgeAction generateMana = new ForgeAction(MANAGEN) { - private static final long serialVersionUID = 7171104690016706405L; - - public void actionPerformed(ActionEvent arg0) { - GuiDisplayUtil.devModeGenerateMana(); - } - }; - - // + Battlefield setup + - ForgeAction setupBattleField = new ForgeAction(SETUPBATTLEFIELD) { - private static final long serialVersionUID = -6660930759092583160L; - - public void actionPerformed(ActionEvent arg0) { - GuiDisplayUtil.devSetupGameState(); - } - }; - // - Battlefield setup - - - //DevMode Tutor - ForgeAction tutor = new ForgeAction(TUTOR) { - private static final long serialVersionUID = 2003222642609217705L; - - public void actionPerformed(ActionEvent arg0) { - GuiDisplayUtil.devModeTutor(); - } - }; - //end DevMode Tutor - - //DevMode AddCounter - ForgeAction addCounter = new ForgeAction(ADDCOUNTER) { - private static final long serialVersionUID = 3136264111882855268L; - - public void actionPerformed(ActionEvent arg0) { - GuiDisplayUtil.devModeAddCounter(); - } - }; - //end DevMode AddCounter - - //DevMode Tap - ForgeAction tapPerm = new ForgeAction(TAPPERM) { - private static final long serialVersionUID = -6092045653540313527L; - - public void actionPerformed(ActionEvent arg0) { - GuiDisplayUtil.devModeTapPerm(); - } - }; - //end DevMode Tap - - //DevMode Untap - ForgeAction untapPerm = new ForgeAction(UNTAPPERM) { - private static final long serialVersionUID = 5425291996157256656L; - - public void actionPerformed(ActionEvent arg0) { - GuiDisplayUtil.devModeUntapPerm(); - } - }; - //end DevMode Untap - - //DevMode UnlimitedLand - ForgeAction unlimitedLand = new ForgeAction(NOLANDLIMIT) { - private static final long serialVersionUID = 2184353891062202796L; - - public void actionPerformed(ActionEvent arg0) { - GuiDisplayUtil.devModeUnlimitedLand(); - } - }; - //end DevMode UnlimitedLand - - Object[] objDev = { - GuiDisplay4.canLoseByDecking, - viewAIHand, - viewAILibrary, - viewHumanLibrary, - generateMana, - setupBattleField, - tutor, - addCounter, - tapPerm, - untapPerm, - unlimitedLand - }; - for (Object o : objDev) { - if (o instanceof ForgeAction) - devMenu.add(((ForgeAction) o).setupButton(new JMenuItem())); - else if (o instanceof Component) - devMenu.add((Component) o); - else if (o instanceof Action) - devMenu.add((Action) o); - } - } - - JMenuBar menuBar = new JMenuBar(); - menuBar.add(gameMenu); - menuBar.add(gamePhases); - menuBar.add(devMenu); - menuBar.add(new MenuItem_HowToPlay()); - this.setJMenuBar(menuBar); - }//addMenu() - - /** - *

canLoseByDecking.

- * - * @return a boolean. - */ - public boolean canLoseByDecking() { - return canLoseByDecking.isSelected(); - } - - /** - *

getButtonOK.

- * - * @return a {@link forge.MyButton} object. - */ - public MyButton getButtonOK() { - MyButton ok = new MyButton() { - public void select() { - inputControl.selectButtonOK(); - } - - public boolean isSelectable() { - return okButton.isEnabled(); - } - - public void setSelectable(boolean b) { - okButton.setEnabled(b); - } - - public String getText() { - return okButton.getText(); - } - - public void setText(String text) { - okButton.setText(text); - } - - public void reset() { - okButton.setText("OK"); - } - }; - - return ok; - }//getButtonOK() - - /** - *

getButtonCancel.

- * - * @return a {@link forge.MyButton} object. - */ - public MyButton getButtonCancel() { - MyButton cancel = new MyButton() { - public void select() { - inputControl.selectButtonCancel(); - } - - public boolean isSelectable() { - return cancelButton.isEnabled(); - } - - public void setSelectable(boolean b) { - cancelButton.setEnabled(b); - } - - public String getText() { - return cancelButton.getText(); - } - - public void setText(String text) { - cancelButton.setText(text); - } - - public void reset() { - cancelButton.setText("Cancel"); - } - }; - return cancel; - }//getButtonCancel() - - /** {@inheritDoc} */ - public void showCombat(String message) { - combatArea.setText(message); - } - - /** {@inheritDoc} */ - public void showMessage(String s) { - messageArea.setText(s); - - Border border = null; - int thickness = 3; - - if (AllZone.getStack().size() > 0 && AllZone.getStack().peekInstance().getActivatingPlayer().isComputer()) - border = BorderFactory.createLineBorder(new Color(0, 255, 255), thickness); - else if (s.contains("Main")) - border = BorderFactory.createLineBorder(new Color(30, 0, 255), thickness); - else if (s.contains("To Block")) - border = BorderFactory.createLineBorder(new Color(13, 179, 0), thickness); - else if (s.contains("Play Instants and Abilities") || s.contains("Combat") || s.contains("Damage")) - border = BorderFactory.createLineBorder(new Color(255, 174, 0), thickness); - else if (s.contains("Declare Attackers")) - border = BorderFactory.createLineBorder(new Color(255, 0, 0), thickness); - else if (s.contains("Upkeep") || s.contains("Draw") || s.contains("End of Turn")) - border = BorderFactory.createLineBorder(new Color(200, 0, 170), thickness); - else - border = new EmptyBorder(1, 1, 1, 1); - - messageArea.setBorder(border); - } - - /** - *

addListeners.

- */ - private void addListeners() { - //mouse Card Detail - playerHandPanel.addMouseMotionListener(new MouseMotionAdapter() { - @Override - public void mouseMoved(MouseEvent me) { - Card c = playerHandPanel.getCardFromMouseOverPanel(); - if (c != null) { - setCard(c); - } - }//mouseMoved - }); - - playerPlayPanel.addMouseMotionListener(new MouseMotionAdapter() { - @Override - public void mouseMoved(MouseEvent me) { - Card c = playerPlayPanel.getCardFromMouseOverPanel(); - if (c != null) { - setCard(c); - } - }//mouseMoved - }); - - oppPlayPanel.addMouseMotionListener(new MouseMotionAdapter() { - @Override - public void mouseMoved(MouseEvent me) { - Card c = oppPlayPanel.getCardFromMouseOverPanel(); - if (c != null) { - setCard(c); - } - }//mouseMoved - }); - - - //opponent life mouse listener - oppLifeLabel.addMouseListener(new MouseAdapter() { - - @Override - public void mousePressed(MouseEvent e) { - inputControl.selectPlayer(AllZone.getComputerPlayer()); - } - }); - - oppLifeLabel.addMouseMotionListener(new MouseMotionAdapter() { - @Override - public void mouseMoved(MouseEvent me) { - setCard(AllZone.getComputerManaPool()); - }//mouseMoved - }); - - //self life mouse listener - playerLifeLabel.addMouseListener(new MouseAdapter() { - - @Override - public void mousePressed(MouseEvent e) { - inputControl.selectPlayer(AllZone.getHumanPlayer()); - } - }); - - //self play (land) ---- Mouse - playerPlayPanel.addMouseListener(new MouseAdapter() { - - @Override - public void mousePressed(MouseEvent e) { - Card c = playerPlayPanel.getCardFromMouseOverPanel(); - if (c != null) { - - if (c.isTapped() - && (inputControl.input instanceof Input_PayManaCost || inputControl.input instanceof Input_PayManaCost_Ability)) { - arcane.ui.CardPanel cardPanel = playerPlayPanel.getCardPanel(c.getUniqueNumber()); - for (arcane.ui.CardPanel cp : cardPanel.attachedPanels) { - if (cp.getCard().isUntapped()) { - break; - } - } - } - - CardList att = new CardList(AllZone.getCombat().getAttackers()); - if ((c.isTapped() || c.hasSickness() || ((c.hasKeyword("Vigilance")) && att.contains(c))) - && (inputControl.input instanceof Input_Attack)) { - arcane.ui.CardPanel cardPanel = playerPlayPanel.getCardPanel(c.getUniqueNumber()); - for (arcane.ui.CardPanel cp : cardPanel.attachedPanels) { - if (cp.getCard().isUntapped() && !cp.getCard().hasSickness()) { - break; - } - } - } - - if (e.isMetaDown()) { - if (att.contains(c) && (inputControl.input instanceof Input_Attack) - && !c.hasKeyword("CARDNAME attacks each turn if able.")) { - c.untap(); - AllZone.getCombat().removeFromCombat(c); - } else if (inputControl.input instanceof Input_Block) { - if (c.getController().isHuman()) - AllZone.getCombat().removeFromCombat(c); - ((Input_Block) inputControl.input).removeFromAllBlocking(c); - } - } else inputControl.selectCard(c, AllZone.getHumanBattlefield()); - } - } - }); - - //self hand ---- Mouse - playerHandPanel.addMouseListener(new MouseAdapter() { - - @Override - public void mousePressed(MouseEvent e) { - if (e.getButton() != MouseEvent.BUTTON1) return; - Card c = playerHandPanel.getCardFromMouseOverPanel(); - if (c != null) { - inputControl.selectCard(c, AllZone.getHumanHand()); - okButton.requestFocusInWindow(); - } - } - }); - - //***************************************************************** - //computer - - //computer play (land) ---- Mouse - oppPlayPanel.addMouseListener(new MouseAdapter() { - - @Override - public void mousePressed(MouseEvent e) { - Card c = oppPlayPanel.getCardFromMouseOverPanel(); - if (c != null) { - inputControl.selectCard(c, AllZone.getComputerBattlefield()); - } - } - }); - - - }//addListener() - - /** - *

getCard.

- * - * @return a {@link forge.Card} object. - */ - public Card getCard() { - return detail.getCard(); - } - - /** {@inheritDoc} */ - public void setCard(Card card) { - detail.setCard(card); - picture.setCard(card); - } - - /** - *

addObservers.

- */ - private void addObservers() { - //Human Hand, Graveyard, and Library totals - {//make sure to not interfer with anything below, since this is a very long method - Observer o = new Observer() { - public void update(Observable a, Object b) { - playerHandValue.setText("" + AllZone.getHumanHand().size()); - playerGraveValue.setText("" + AllZone.getHumanGraveyard().size()); - playerLibraryValue.setText("" + AllZone.getHumanLibrary().size()); - playerFBValue.setText("" + CardFactoryUtil.getExternalZoneActivationCards(AllZone.getHumanPlayer()).size()); - playerRemovedValue.setText("" + AllZone.getHumanExile().size()); - - } - }; - AllZone.getHumanHand().addObserver(o); - AllZone.getHumanGraveyard().addObserver(o); - AllZone.getHumanLibrary().addObserver(o); - } - - //opponent Hand, Graveyard, and Library totals - {//make sure to not interfer with anything below, since this is a very long method - Observer o = new Observer() { - public void update(Observable a, Object b) { - oppHandValue.setText("" + AllZone.getComputerHand().size()); - oppGraveValue.setText("" + AllZone.getComputerGraveyard().size()); - oppLibraryValue.setText("" + AllZone.getComputerLibrary().size()); - oppRemovedValue.setText("" + AllZone.getComputerExile().size()); - } - }; - AllZone.getComputerHand().addObserver(o); - AllZone.getComputerGraveyard().addObserver(o); - AllZone.getComputerLibrary().addObserver(o); - } - - - //opponent life - oppLifeLabel.setText("" + AllZone.getComputerPlayer().getLife()); - AllZone.getComputerPlayer().addObserver(new Observer() { - public void update(Observable a, Object b) { - int life = AllZone.getComputerPlayer().getLife(); - oppLifeLabel.setText("" + life); - } - }); - AllZone.getComputerPlayer().updateObservers(); - - if (AllZone.getQuestData() != null) { - File base = ForgeProps.getFile(IMAGE_ICON); - String iconName = ""; - if (Constant.Quest.oppIconName[0] != null) { - iconName = Constant.Quest.oppIconName[0]; - File file = new File(base, iconName); - ImageIcon icon = new ImageIcon(file.toString()); - oppIconLabel.setIcon(icon); - oppIconLabel.setAlignmentX(100); - - } - } - - oppPCLabel.setText("Poison Counters: " + AllZone.getComputerPlayer().getPoisonCounters()); - AllZone.getComputerPlayer().addObserver(new Observer() { - public void update(Observable a, Object b) { - int pcs = AllZone.getComputerPlayer().getPoisonCounters(); - oppPCLabel.setText("Poison Counters: " + pcs); - } - }); - AllZone.getComputerPlayer().updateObservers(); - - //player life - playerLifeLabel.setText("" + AllZone.getHumanPlayer().getLife()); - AllZone.getHumanPlayer().addObserver(new Observer() { - public void update(Observable a, Object b) { - int life = AllZone.getHumanPlayer().getLife(); - playerLifeLabel.setText("" + life); - } - }); - AllZone.getHumanPlayer().updateObservers(); - - playerPCLabel.setText("Poison Counters: " + AllZone.getHumanPlayer().getPoisonCounters()); - AllZone.getHumanPlayer().addObserver(new Observer() { - public void update(Observable a, Object b) { - int pcs = AllZone.getHumanPlayer().getPoisonCounters(); - playerPCLabel.setText("Poison Counters: " + pcs); - } - }); - AllZone.getHumanPlayer().updateObservers(); - - //stack - AllZone.getStack().addObserver(new Observer() { - public void update(Observable a, Object b) { - stackPanel.removeAll(); - MagicStack stack = AllZone.getStack(); - int count = 1; - JLabel label; - - for (int i = stack.size() - 1; 0 <= i; i--) { - label = new JLabel("" + (count++) + ". " + stack.peekInstance(i).getStackDescription()); - - //update card detail - final CardPanel cardPanel = new CardPanel(stack.peekInstance(i).getSourceCard()); - cardPanel.setLayout(new BorderLayout()); - cardPanel.add(label); - cardPanel.addMouseMotionListener(new MouseMotionAdapter() { - - @Override - public void mouseMoved(MouseEvent me) { - setCard(cardPanel.getCard()); - }//mouseMoved - }); - - stackPanel.add(cardPanel); - } - - stackPanel.revalidate(); - stackPanel.repaint(); - - okButton.requestFocusInWindow(); - - } - }); - AllZone.getStack().updateObservers(); - //END, stack - - - //self hand - AllZone.getHumanHand().addObserver(new Observer() { - public void update(Observable a, Object b) { - PlayerZone pZone = (PlayerZone) a; - HandArea p = playerHandPanel; - ; - - Card c[] = AllZoneUtil.getCardsInZone(pZone).toArray(); - - List tmp, diff; - tmp = new ArrayList(); - for (arcane.ui.CardPanel cpa : p.cardPanels) - tmp.add(cpa.gameCard); - diff = new ArrayList(tmp); - diff.removeAll(Arrays.asList(c)); - if (diff.size() == p.cardPanels.size()) - p.clear(); - else { - for (Card card : diff) { - p.removeCardPanel(p.getCardPanel(card.getUniqueNumber())); - } - } - diff = new ArrayList(Arrays.asList(c)); - diff.removeAll(tmp); - - int fromZoneX = 0, fromZoneY = 0; - Rectangle pb = playerLibraryValue.getBounds(); - Point zoneLocation = SwingUtilities.convertPoint(playerLibraryValue, Math.round(pb.width / 2.0f), Math.round(pb.height / 2.0f), layeredPane); - fromZoneX = zoneLocation.x; - fromZoneY = zoneLocation.y; - int startWidth, startX, startY; - startWidth = 10; - startX = fromZoneX - Math.round(startWidth / 2.0f); - startY = fromZoneY - Math.round(Math.round(startWidth * arcane.ui.CardPanel.ASPECT_RATIO) / 2.0f); - - int endWidth, endX, endY; - arcane.ui.CardPanel toPanel = null; - - for (Card card : diff) { - toPanel = p.addCard(card); - endWidth = toPanel.getCardWidth(); - Point toPos = SwingUtilities.convertPoint(playerHandPanel, toPanel.getCardLocation(), layeredPane); - endX = toPos.x; - endY = toPos.y; - arcane.ui.CardPanel animationPanel = new arcane.ui.CardPanel(card); - if (isShowing()) - Animation.moveCard(startX, startY, startWidth, endX, endY, endWidth, animationPanel, toPanel, layeredPane, 500); - else - Animation.moveCard(toPanel); - } - } - }); - AllZone.getHumanHand().updateObservers(); - //END, self hand - - //self play - AllZone.getHumanBattlefield().addObserver(new Observer() { - public void update(Observable a, Object b) { - PlayerZone pZone = (PlayerZone) a; - - Card c[] = AllZoneUtil.getCardsInZone(pZone).toArray(); - - GuiDisplayUtil.setupPlayZone(playerPlayPanel, c); - } - }); - AllZone.getHumanBattlefield().updateObservers(); - //END - self play - - - //computer play - AllZone.getComputerBattlefield().addObserver(new Observer() { - public void update(Observable a, Object b) { - PlayerZone pZone = (PlayerZone) a; - - Card c[] = AllZoneUtil.getCardsInZone(pZone).toArray(); - - GuiDisplayUtil.setupPlayZone(oppPlayPanel, c); - } - }); - AllZone.getComputerBattlefield().updateObservers(); - //END - computer play - - }//addObservers() - - /** - *

initComponents.

- */ - private void initComponents() { - //Preparing the Frame - setTitle(ForgeProps.getLocalized(LANG.PROGRAM_NAME)); - if (!Gui_NewGame.useLAFFonts.isSelected()) setFont(new Font("Times New Roman", 0, 16)); - getContentPane().setLayout(new BorderLayout()); - addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent evt) { - concede(); - } - - @Override - public void windowClosed(WindowEvent e) { - File f = ForgeProps.getFile(LAYOUT_NEW); - Node layout = pane.getMultiSplitLayout().getModel(); - try { - XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(new FileOutputStream(f))); - encoder.writeObject(layout); - encoder.close(); - } catch (IOException ex) { - ex.printStackTrace(); - } - } - }); - - //making the multi split pane - Node model; - File f = ForgeProps.getFile(LAYOUT_NEW); - try { - XMLDecoder decoder = new XMLDecoder(new BufferedInputStream(new FileInputStream(f))); - model = (Node) decoder.readObject(); - decoder.close(); - pane.getMultiSplitLayout().setModel(model); - //pane.getMultiSplitLayout().setFloatingDividers(false); - } catch (Exception ex) { - model = parseModel(""// - + "(ROW "// - + "(COLUMN"// - + " (LEAF weight=0.2 name=info)"// - + " (LEAF weight=0.2 name=compy)"// - + " (LEAF weight=0.2 name=stack)"// - + " (LEAF weight=0.2 name=combat)"// - + " (LEAF weight=0.2 name=human)) "// - + "(COLUMN weight=1"// - + " (LEAF weight=0.4 name=compyPlay)"// - + " (LEAF weight=0.4 name=humanPlay)"// - + " (LEAF weight=0.2 name=humanHand)) "// - + "(COLUMN"// - + " (LEAF weight=0.5 name=detail)"// - + " (LEAF weight=0.5 name=picture)))"); - pane.setModel(model); - } - pane.getMultiSplitLayout().setFloatingDividers(false); - getContentPane().add(pane); - - //adding the individual parts - - if (!Gui_NewGame.useLAFFonts.isSelected()) initFonts(pane); - - initMsgYesNo(pane); - initOpp(pane); - initStackCombat(pane); - initPlayer(pane); - initZones(pane); - initCardPicture(pane); - } - - /** - *

initFonts.

- * - * @param pane a {@link javax.swing.JPanel} object. - */ - private void initFonts(JPanel pane) { - messageArea.setFont(getFont()); - - oppLifeLabel.setFont(lifeFont); - - oppPCLabel.setFont(statFont); - oppLibraryLabel.setFont(statFont); - - oppHandValue.setFont(statFont); - oppLibraryValue.setFont(statFont); - oppRemovedValue.setFont(statFont); - oppGraveValue.setFont(statFont); - - playerLifeLabel.setFont(lifeFont); - playerPCLabel.setFont(statFont); - - playerHandValue.setFont(statFont); - playerLibraryValue.setFont(statFont); - playerRemovedValue.setFont(statFont); - playerGraveValue.setFont(statFont); - playerFBValue.setFont(statFont); - - combatArea.setFont(getFont()); - } - - /** - *

initMsgYesNo.

- * - * @param pane a {@link javax.swing.JPanel} object. - */ - private void initMsgYesNo(JPanel pane) { - //messageArea.setBorder(BorderFactory.createEtchedBorder()); - messageArea.setEditable(false); - messageArea.setLineWrap(true); - messageArea.setWrapStyleWord(true); - - cancelButton.setText("Cancel"); - cancelButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - cancelButtonActionPerformed(evt); - okButton.requestFocusInWindow(); - } - }); - okButton.setText("OK"); - okButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - okButtonActionPerformed(evt); - - if (AllZone.getPhase().isNeedToNextPhase()) { - // moves to next turn - AllZone.getPhase().setNeedToNextPhase(false); - AllZone.getPhase().nextPhase(); - } - okButton.requestFocusInWindow(); - } - }); - okButton.addKeyListener(new KeyAdapter() { - @Override - public void keyPressed(KeyEvent arg0) { - // TODO make triggers on escape - int code = arg0.getKeyCode(); - if (code == KeyEvent.VK_ESCAPE) { - cancelButton.doClick(); - } - } - }); - - okButton.requestFocusInWindow(); - - //if(okButton.isEnabled()) - //okButton.doClick(); - JPanel yesNoPanel = new JPanel(new FlowLayout()); - yesNoPanel.setBorder(new EtchedBorder()); - yesNoPanel.add(cancelButton); - yesNoPanel.add(okButton); - - JPanel panel = new JPanel(new BorderLayout()); - JScrollPane scroll = new JScrollPane(messageArea); - scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - panel.add(scroll); - panel.add(yesNoPanel, BorderLayout.SOUTH); - pane.add(new ExternalPanel(panel), "info"); - } - - /** - *

initOpp.

- * - * @param pane a {@link javax.swing.JPanel} object. - */ - private void initOpp(JPanel pane) { - //oppLifeLabel.setHorizontalAlignment(SwingConstants.CENTER); - - //oppPCLabel.setHorizontalAlignment(SwingConstants.TOP); - oppPCLabel.setForeground(greenColor); - - JLabel oppHandLabel = new JLabel(ForgeProps.getLocalized(COMPUTER_HAND.BUTTON), SwingConstants.TRAILING); - if (!Gui_NewGame.useLAFFonts.isSelected()) oppHandLabel.setFont(statFont); - - JButton oppGraveButton = new JButton(COMPUTER_GRAVEYARD_ACTION); - oppGraveButton.setText((String) COMPUTER_GRAVEYARD_ACTION.getValue("buttonText")); - oppGraveButton.setMargin(new Insets(0, 0, 0, 0)); - oppGraveButton.setHorizontalAlignment(SwingConstants.TRAILING); - if (!Gui_NewGame.useLAFFonts.isSelected()) oppGraveButton.setFont(statFont); - - - JPanel gravePanel = new JPanel(new BorderLayout()); - gravePanel.add(oppGraveButton, BorderLayout.EAST); - - JButton oppRemovedButton = new JButton(COMPUTER_REMOVED_ACTION); - oppRemovedButton.setText((String) COMPUTER_REMOVED_ACTION.getValue("buttonText")); - oppRemovedButton.setMargin(new Insets(0, 0, 0, 0)); - //removedButton.setHorizontalAlignment(SwingConstants.TRAILING); - if (!Gui_NewGame.useLAFFonts.isSelected()) oppRemovedButton.setFont(statFont); - - - oppHandValue.setHorizontalAlignment(SwingConstants.LEADING); - oppLibraryValue.setHorizontalAlignment(SwingConstants.LEADING); - oppGraveValue.setHorizontalAlignment(SwingConstants.LEADING); - oppRemovedValue.setHorizontalAlignment(SwingConstants.LEADING); - - JPanel oppNumbersPanel = new JPanel(new GridLayout(0, 2, 3, 1)); - oppNumbersPanel.add(oppHandLabel); - oppNumbersPanel.add(oppHandValue); - oppNumbersPanel.add(oppRemovedButton); - oppNumbersPanel.add(oppRemovedValue); - oppNumbersPanel.add(oppLibraryLabel); - oppNumbersPanel.add(oppLibraryValue); - oppNumbersPanel.add(gravePanel); - oppNumbersPanel.add(oppGraveValue); - - oppLifeLabel.setHorizontalAlignment(SwingConstants.CENTER); - - JPanel oppIconLifePanel = new JPanel(new GridLayout(0, 1, 0, 0)); - oppIconLifePanel.add(oppIconLabel); - oppIconLifePanel.add(oppLifeLabel); - - JPanel oppPanel = new JPanel(); - oppPanel.setBorder(new TitledBorder(new EtchedBorder(), ForgeProps.getLocalized(COMPUTER_TITLE))); - oppPanel.setLayout(new BorderLayout()); - oppPanel.add(oppNumbersPanel, BorderLayout.WEST); - // oppPanel.add(oppIconLabel, BorderLayout.CENTER); - // oppPanel.add(oppLifeLabel, BorderLayout.EAST); - oppPanel.add(oppIconLifePanel, BorderLayout.EAST); - oppPanel.add(oppPCLabel, BorderLayout.AFTER_LAST_LINE); - pane.add(new ExternalPanel(oppPanel), "compy"); - } - - /** - *

initStackCombat.

- * - * @param pane a {@link javax.swing.JPanel} object. - */ - private void initStackCombat(JPanel pane) { - stackPanel.setLayout(new GridLayout(0, 1, 10, 10)); - JScrollPane stackPane = new JScrollPane(stackPanel); - stackPane.setBorder(new EtchedBorder()); - pane.add(new ExternalPanel(stackPane), "stack"); - - combatArea.setEditable(false); - combatArea.setLineWrap(true); - combatArea.setWrapStyleWord(true); - - JScrollPane combatPane = new JScrollPane(combatArea); - - combatPane.setBorder(new TitledBorder(new EtchedBorder(), ForgeProps.getLocalized(COMBAT))); - pane.add(new ExternalPanel(combatPane), "combat"); - } - - /** - *

initPlayer.

- * - * @param pane a {@link javax.swing.JPanel} object. - */ - private void initPlayer(JPanel pane) { - //int fontSize = 12; - playerLifeLabel.setHorizontalAlignment(SwingConstants.CENTER); - - playerPCLabel.setForeground(greenColor); - - JLabel playerLibraryLabel = new JLabel(ForgeProps.getLocalized(HUMAN_LIBRARY.BUTTON), - SwingConstants.TRAILING); - if (!Gui_NewGame.useLAFFonts.isSelected()) playerLibraryLabel.setFont(statFont); - - JLabel playerHandLabel = new JLabel(ForgeProps.getLocalized(HUMAN_HAND.TITLE), SwingConstants.TRAILING); - if (!Gui_NewGame.useLAFFonts.isSelected()) playerHandLabel.setFont(statFont); - - //JLabel playerGraveLabel = new JLabel("Grave:", SwingConstants.TRAILING); - JButton playerGraveButton = new JButton(HUMAN_GRAVEYARD_ACTION); - playerGraveButton.setText((String) HUMAN_GRAVEYARD_ACTION.getValue("buttonText")); - playerGraveButton.setMargin(new Insets(0, 0, 0, 0)); - playerGraveButton.setHorizontalAlignment(SwingConstants.TRAILING); - if (!Gui_NewGame.useLAFFonts.isSelected()) playerGraveButton.setFont(statFont); - - - JButton playerFlashBackButton = new JButton(HUMAN_FLASHBACK_ACTION); - playerFlashBackButton.setText((String) HUMAN_FLASHBACK_ACTION.getValue("buttonText")); - playerFlashBackButton.setMargin(new Insets(0, 0, 0, 0)); - playerFlashBackButton.setHorizontalAlignment(SwingConstants.TRAILING); - if (!Gui_NewGame.useLAFFonts.isSelected()) playerFlashBackButton.setFont(statFont); - - - JPanel gravePanel = new JPanel(new BorderLayout()); - gravePanel.add(playerGraveButton, BorderLayout.EAST); - - JPanel playerFBPanel = new JPanel(new BorderLayout()); - playerFBPanel.add(playerFlashBackButton, BorderLayout.EAST); - - JButton playerRemovedButton = new JButton(HUMAN_REMOVED_ACTION); - playerRemovedButton.setText((String) HUMAN_REMOVED_ACTION.getValue("buttonText")); - playerRemovedButton.setMargin(new Insets(0, 0, 0, 0)); - //removedButton.setHorizontalAlignment(SwingConstants.TRAILING); - if (!Gui_NewGame.useLAFFonts.isSelected()) playerRemovedButton.setFont(statFont); - - playerHandValue.setHorizontalAlignment(SwingConstants.LEADING); - playerLibraryValue.setHorizontalAlignment(SwingConstants.LEADING); - playerGraveValue.setHorizontalAlignment(SwingConstants.LEADING); - playerFBValue.setHorizontalAlignment(SwingConstants.LEADING); - - //playerRemovedValue.setFont(new Font("MS Sans Serif", 0, fontSize)); - playerRemovedValue.setHorizontalAlignment(SwingConstants.LEADING); - - JPanel playerNumbersPanel = new JPanel(new GridLayout(0, 2, 5, 1)); - playerNumbersPanel.add(playerHandLabel); - playerNumbersPanel.add(playerHandValue); - playerNumbersPanel.add(playerRemovedButton); - playerNumbersPanel.add(playerRemovedValue); - playerNumbersPanel.add(playerLibraryLabel); - playerNumbersPanel.add(playerLibraryValue); - playerNumbersPanel.add(gravePanel); - playerNumbersPanel.add(playerGraveValue); - playerNumbersPanel.add(playerFBPanel); - playerNumbersPanel.add(playerFBValue); - - JPanel playerPanel = new JPanel(); - playerPanel.setBorder(new TitledBorder(new EtchedBorder(), ForgeProps.getLocalized(HUMAN_TITLE))); - playerPanel.setLayout(new BorderLayout()); - playerPanel.add(playerNumbersPanel, BorderLayout.WEST); - playerPanel.add(playerLifeLabel, BorderLayout.EAST); - playerPanel.add(playerPCLabel, BorderLayout.AFTER_LAST_LINE); - pane.add(new ExternalPanel(playerPanel), "human"); - } - - /** - *

initZones.

- * - * @param pane a {@link javax.swing.JPanel} object. - */ - private void initZones(JPanel pane) { - JScrollPane oppScroll = new JScrollPane(); - oppPlayPanel = new PlayArea(oppScroll, true); - oppScroll.setBorder(BorderFactory.createEtchedBorder()); - oppScroll.setViewportView(oppPlayPanel); - pane.add(new ExternalPanel(oppScroll), "compyPlay"); - - JScrollPane playScroll = new JScrollPane(); - playerPlayPanel = new PlayArea(playScroll, false); - playScroll.setBorder(BorderFactory.createEtchedBorder()); - playScroll.setViewportView(playerPlayPanel); - pane.add(new ExternalPanel(playScroll), "humanPlay"); - - JScrollPane handScroll = new JScrollPane(); - playerHandPanel = new HandArea(handScroll, this); - playerHandPanel.setBorder(BorderFactory.createEtchedBorder()); - handScroll.setViewportView(playerHandPanel); - pane.add(new ExternalPanel(handScroll), "humanHand"); - } - - /** - *

initCardPicture.

- * - * @param pane a {@link javax.swing.JPanel} object. - */ - private void initCardPicture(JPanel pane) { - pane.add(new ExternalPanel(detail), "detail"); - pane.add(new ExternalPanel(picturePanel), "picture"); - picturePanel.setCardPanel(picture); - } - - /** - *

cancelButtonActionPerformed.

- * - * @param evt a {@link java.awt.event.ActionEvent} object. - */ - private void cancelButtonActionPerformed(ActionEvent evt) { - inputControl.selectButtonCancel(); - } - - /** - *

okButtonActionPerformed.

- * - * @param evt a {@link java.awt.event.ActionEvent} object. - */ - private void okButtonActionPerformed(ActionEvent evt) { - inputControl.selectButtonOK(); - } - - /** - * Exit the Application - */ - private void concede() { - savePrefs(); - dispose(); - Constant.Runtime.matchState.addLose(); - if (!Constant.Quest.fantasyQuest[0]) - new Gui_WinLose(); - else { - //new Gui_WinLose(Constant.Quest.humanList[0], Constant.Quest.computerList[0],Constant.Quest.humanLife[0], Constant.Quest.computerLife[0]); - CardList humanList = forge.quest.data.QuestUtil.getHumanPlantAndPet(AllZone.getQuestData(), AllZone.getQuestAssignment()); - CardList computerList = forge.quest.data.QuestUtil.getComputerCreatures(AllZone.getQuestData(), AllZone.getQuestAssignment()); - - int humanLife = AllZone.getQuestData().getLife(); - int computerLife = 20; - - if (AllZone.getQuestAssignment() != null) - computerLife = AllZone.getQuestAssignment().getComputerLife(); - new Gui_WinLose(humanList, computerList, humanLife, computerLife); - } - } - - // ********** Phase stuff in Display ****************** - /** {@inheritDoc} */ - public boolean stopAtPhase(Player turn, String phase) { - if (turn.isComputer()) { - if (phase.equals(Constant.Phase.End_Of_Turn)) - return cbAIEndOfTurn.isSelected(); - else if (phase.equals(Constant.Phase.Upkeep)) - return cbAIUpkeep.isSelected(); - else if (phase.equals(Constant.Phase.Draw)) - return cbAIDraw.isSelected(); - else if (phase.equals(Constant.Phase.Combat_Begin)) - return cbAIBeginCombat.isSelected(); - else if (phase.equals(Constant.Phase.Combat_End)) - return cbAIEndCombat.isSelected(); - } else { - if (phase.equals(Constant.Phase.End_Of_Turn)) - return cbHumanEndOfTurn.isSelected(); - else if (phase.equals(Constant.Phase.Upkeep)) - return cbHumanUpkeep.isSelected(); - else if (phase.equals(Constant.Phase.Draw)) - return cbHumanDraw.isSelected(); - else if (phase.equals(Constant.Phase.Combat_Begin)) - return cbHumanBeginCombat.isSelected(); - else if (phase.equals(Constant.Phase.Combat_End)) - return cbHumanEndCombat.isSelected(); - } - return true; - } - - /** - *

loadPrefs.

- * - * @return a boolean. - */ - public boolean loadPrefs() { - ForgePreferences fp = Gui_NewGame.preferences; - - cbAIUpkeep.setSelected(fp.bAIUpkeep); - cbAIDraw.setSelected(fp.bAIDraw); - cbAIEndOfTurn.setSelected(fp.bAIEOT); - cbAIBeginCombat.setSelected(fp.bAIBeginCombat); - cbAIEndCombat.setSelected(fp.bAIEndCombat); - - cbHumanUpkeep.setSelected(fp.bHumanUpkeep); - cbHumanDraw.setSelected(fp.bHumanDraw); - cbHumanEndOfTurn.setSelected(fp.bHumanEOT); - cbHumanBeginCombat.setSelected(fp.bHumanBeginCombat); - cbHumanEndCombat.setSelected(fp.bHumanEndCombat); - - canLoseByDecking.setSelected(fp.millingLossCondition); - - return true; - } - - /** - *

savePrefs.

- * - * @return a boolean. - */ - public boolean savePrefs() { - Constant.Runtime.Mill[0] = canLoseByDecking.isSelected(); - ForgePreferences fp = Gui_NewGame.preferences; - - fp.bAIUpkeep = cbAIUpkeep.isSelected(); - fp.bAIDraw = cbAIDraw.isSelected(); - fp.bAIEOT = cbAIEndOfTurn.isSelected(); - fp.bAIBeginCombat = cbAIBeginCombat.isSelected(); - fp.bAIEndCombat = cbAIEndCombat.isSelected(); - - fp.bHumanUpkeep = cbHumanUpkeep.isSelected(); - fp.bHumanDraw = cbHumanDraw.isSelected(); - fp.bHumanEOT = cbHumanEndOfTurn.isSelected(); - fp.bHumanBeginCombat = cbHumanBeginCombat.isSelected(); - fp.bHumanEndCombat = cbHumanEndCombat.isSelected(); - - fp.millingLossCondition = canLoseByDecking.isSelected(); - - return true; - } - - /** Constant playsoundCheckboxForMenu */ - public static JCheckBoxMenuItem playsoundCheckboxForMenu = new JCheckBoxMenuItem("Play Sound", false); - - // Phases - /** Constant cbAIUpkeep */ - public static JCheckBoxMenuItem cbAIUpkeep = new JCheckBoxMenuItem("Upkeep", true); - /** Constant cbAIDraw */ - public static JCheckBoxMenuItem cbAIDraw = new JCheckBoxMenuItem("Draw", true); - /** Constant cbAIEndOfTurn */ - public static JCheckBoxMenuItem cbAIEndOfTurn = new JCheckBoxMenuItem("End of Turn", true); - /** Constant cbAIBeginCombat */ - public static JCheckBoxMenuItem cbAIBeginCombat = new JCheckBoxMenuItem("Begin Combat", true); - /** Constant cbAIEndCombat */ - public static JCheckBoxMenuItem cbAIEndCombat = new JCheckBoxMenuItem("End Combat", true); - - /** Constant cbHumanUpkeep */ - public static JCheckBoxMenuItem cbHumanUpkeep = new JCheckBoxMenuItem("Upkeep", true); - /** Constant cbHumanDraw */ - public static JCheckBoxMenuItem cbHumanDraw = new JCheckBoxMenuItem("Draw", true); - /** Constant cbHumanEndOfTurn */ - public static JCheckBoxMenuItem cbHumanEndOfTurn = new JCheckBoxMenuItem("End of Turn", true); - /** Constant cbHumanBeginCombat */ - public static JCheckBoxMenuItem cbHumanBeginCombat = new JCheckBoxMenuItem("Begin Combat", true); - /** Constant cbHumanEndCombat */ - public static JCheckBoxMenuItem cbHumanEndCombat = new JCheckBoxMenuItem("End Combat", true); - - // ********** End of Phase stuff in Display ****************** - - // ****** Developer Mode ******* - - /** Constant canLoseByDecking */ - public static JCheckBoxMenuItem canLoseByDecking = new JCheckBoxMenuItem("Lose by Decking", true); - - // ***************************** - - - JXMultiSplitPane pane = new JXMultiSplitPane(); - JButton cancelButton = new JButton(); - JButton okButton = new JButton(); - JTextArea messageArea = new JTextArea(1, 10); - JTextArea combatArea = new JTextArea(); - JPanel stackPanel = new JPanel(); - PlayArea oppPlayPanel = null; - PlayArea playerPlayPanel = null; - HandArea playerHandPanel = null; - //JPanel cdPanel = new JPanel(); - JLabel oppLifeLabel = new JLabel(); - JLabel oppIconLabel = new JLabel(); - JLabel playerLifeLabel = new JLabel(); - JLabel oppPCLabel = new JLabel(); - JLabel playerPCLabel = new JLabel(); - JLabel oppLibraryLabel = new JLabel( - ForgeProps.getLocalized(COMPUTER_LIBRARY.BUTTON), - SwingConstants.TRAILING); - JLabel oppHandValue = new JLabel(); - JLabel oppLibraryValue = new JLabel(); - JLabel oppGraveValue = new JLabel(); - JLabel oppRemovedValue = new JLabel(); - JLabel playerHandValue = new JLabel(); - JLabel playerLibraryValue = new JLabel(); - JLabel playerGraveValue = new JLabel(); - JLabel playerFBValue = new JLabel(); - JLabel playerRemovedValue = new JLabel(); - - CardDetailPanel detail = new CardDetailPanel(null); - ViewPanel picturePanel = new ViewPanel(); - arcane.ui.CardPanel picture = new arcane.ui.CardPanel(null); - JLayeredPane layeredPane = SwingUtilities.getRootPane(this).getLayeredPane(); - - private class ZoneAction extends ForgeAction { - private static final long serialVersionUID = -5822976087772388839L; - private PlayerZone zone; - private String title; - - public ZoneAction(PlayerZone zone, String property) { - super(property); - title = ForgeProps.getLocalized(property + "/title"); - this.zone = zone; - } - - public void actionPerformed(ActionEvent e) { - Generator c = YieldUtils.toGenerator(getCardsAsIterable()); - - if (AllZone.getNameChanger().shouldChangeCardName()) { - c = AllZone.getNameChanger().changeCard(c); - } - - Iterator iter = YieldUtils.toIterable(c).iterator(); - - if (!iter.hasNext()) { - GuiUtils.getChoiceOptional(title, new String[]{"no cards"}); - } - else { - Card choice = GuiUtils.getChoiceOptional(title, iter); - if (choice != null) doAction(choice); - } - } - - /** - * @deprecated - * @see #getCardsAsIterable() - */ - @SuppressWarnings("unused") - protected Card[] getCards() { - return AllZoneUtil.getCardsInZone(zone).toArray(); - } - - protected Iterable getCardsAsIterable() { - return new ImmutableIterableFrom(AllZoneUtil.getCardsInZone(zone)); - } - - protected void doAction(Card c) { - } - } - - private class ConcedeAction extends ForgeAction { - - private static final long serialVersionUID = -6976695235601916762L; - - public ConcedeAction() { - super(CONCEDE); - } - - public void actionPerformed(ActionEvent e) { - concede(); - } - } -} - diff --git a/src/forge/GuiDisplayUtil.java b/src/forge/GuiDisplayUtil.java deleted file mode 100644 index b47f1e64111..00000000000 --- a/src/forge/GuiDisplayUtil.java +++ /dev/null @@ -1,1391 +0,0 @@ -package forge; - - -import arcane.ui.PlayArea; -import arcane.ui.util.Animation; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.mana.ManaPool; -import forge.card.spellability.Ability_Mana; -import forge.card.trigger.Trigger; -import forge.gui.GuiUtils; -import forge.gui.game.CardPanel; -import forge.properties.NewConstants; - -import javax.swing.*; -import javax.swing.border.Border; -import java.awt.Color; -import java.awt.*; -import java.awt.event.MouseEvent; -import java.awt.event.MouseMotionAdapter; -import java.awt.event.MouseMotionListener; -import java.io.*; -import java.util.*; -import java.util.List; - - -/** - *

GuiDisplayUtil class.

- * - * @author Forge - * @version $Id: $ - */ -public class GuiDisplayUtil implements NewConstants { - /** - *

getCardDetailMouse.

- * - * @param visual a {@link forge.CardContainer} object. - * @return a {@link java.awt.event.MouseMotionListener} object. - */ - public static MouseMotionListener getCardDetailMouse(final CardContainer visual) { - return new MouseMotionAdapter() { - @Override - public void mouseMoved(MouseEvent me) { - JPanel panel = (JPanel) me.getSource(); - Object o = panel.getComponentAt(me.getPoint()); - - if ((o != null) && (o instanceof CardPanel)) { - CardContainer cardPanel = (CardContainer) o; - visual.setCard(cardPanel.getCard()); - } - }//mouseMoved - }; - } - - /** - *

getBorder.

- * - * @param card a {@link forge.Card} object. - * @return a {@link javax.swing.border.Border} object. - */ - public static Border getBorder(Card card) { - // color info - if (card == null) - return BorderFactory.createEmptyBorder(2, 2, 2, 2); - java.awt.Color color; - ArrayList list = CardUtil.getColors(card); - - if (card.isFaceDown()) - color = Color.gray; - - else if (list.size() > 1) color = Color.orange; - - else if (list.get(0).equals(Constant.Color.Black)) - color = Color.black; - - else if (list.get(0).equals(Constant.Color.Green)) - color = new Color(0, 220, 39); - - else if (list.get(0).equals(Constant.Color.White)) - color = Color.white; - - else if (list.get(0).equals(Constant.Color.Red)) - color = Color.red; - - else if (list.get(0).equals(Constant.Color.Blue)) - color = Color.blue; - - else if (list.get(0).equals(Constant.Color.Colorless)) - color = Color.gray; - - else color = new Color(200, 0, 230); // If your card has a violet border, something is wrong - - if (color != Color.gray) { - - int r = color.getRed(); - int g = color.getGreen(); - int b = color.getBlue(); - - int shade = 10; - - r -= shade; - g -= shade; - b -= shade; - - r = Math.max(0, r); - g = Math.max(0, g); - b = Math.max(0, b); - - color = new Color(r, g, b); - - return BorderFactory.createLineBorder(color, 2); - } else return BorderFactory.createLineBorder(Color.gray, 2); - } - - /** - *

devModeGenerateMana.

- */ - public static void devModeGenerateMana() { - Card dummy = new Card(); - dummy.setOwner(AllZone.getHumanPlayer()); - dummy.setController(AllZone.getHumanPlayer()); - Ability_Mana abMana = new Ability_Mana(dummy, "0", "W U B G R 1", 10) { - private static final long serialVersionUID = -2164401486331182356L; - - }; - abMana.produceMana(); - } - - /** - *

formatCardType.

- * - * @param card a {@link forge.Card} object. - * @return a {@link java.lang.String} object. - */ - public static String formatCardType(Card card) { - ArrayList list = card.getType(); - StringBuilder sb = new StringBuilder(); - - ArrayList superTypes = new ArrayList(); - ArrayList cardTypes = new ArrayList(); - ArrayList subTypes = new ArrayList(); - for(String t : list) { - if(CardUtil.isASuperType(t) && !superTypes.contains(t)) superTypes.add(t); - if(CardUtil.isACardType(t) && !cardTypes.contains(t)) cardTypes.add(t); - if(CardUtil.isASubType(t) && !subTypes.contains(t)) subTypes.add(t); - - } - - for(String type : superTypes) { - sb.append(type).append(" "); - } - for(String type : cardTypes) { - sb.append(type).append(" "); - } - if(!subTypes.isEmpty()) sb.append("- "); - for(String type : subTypes) { - sb.append(type).append(" "); - } - - return sb.toString(); - } - - /** - *

cleanString.

- * - * @param in a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public static String cleanString(String in) { - StringBuffer out = new StringBuffer(); - char c; - for (int i = 0; i < in.length(); i++) { - c = in.charAt(i); - if (c == ' ' || c == '-') out.append('_'); - else if (Character.isLetterOrDigit(c) || c == '_') { - out.append(c); - } - } - return out.toString().toLowerCase(); - } - - /** - *

cleanStringMWS.

- * - * @return a {@link java.lang.String} object. - * @param in a {@link java.lang.String} object. - */ - public static String cleanStringMWS(String in) - { - StringBuffer out = new StringBuffer(); - char c; - for (int i=0; isetupNoLandPanel.

- * - * @param j a {@link javax.swing.JPanel} object. - * @param c an array of {@link forge.Card} objects. - */ - public static void setupNoLandPanel(JPanel j, Card c[]) { - ArrayList a = new ArrayList(); - /* - for(int i = 0; i < c.length; i++) - if(c[i].isCreature() || c[i].isGlobalEnchantment() || c[i].isArtifact() || c[i].isPlaneswalker()) - a.add(c[i]); - */ - - /* - - //creatures or planeswalkers - for(int i = 0; i < c.length; i++) - //!artifact because of Memnarch turning planeswalkers into artifacts. - if (c[i].isCreature() || (c[i].isPlaneswalker() && !c[i].isArtifact())) - a.add(c[i]); - //(noncreature, non-enchantment,nonland) artifacts - for(int i = 0; i < c.length; i++) - if (c[i].isArtifact() && !c[i].isCreature() && !c[i].isLand() && !c[i].isGlobalEnchantment() ) - a.add(c[i]); - //(noncreature) enchantments - for(int i = 0; i < c.length; i++) - if (c[i].isGlobalEnchantment() && !c[i].isCreature()) - a.add(c[i]); - - */ - - for (int i = 0; i < c.length; i++) { - a.add(c[i]); - } - - setupNoLandPermPanel(j, a, true); - } - - /** - *

setupLandPanel.

- * - * @param j a {@link javax.swing.JPanel} object. - * @param c an array of {@link forge.Card} objects. - */ - public static void setupLandPanel(JPanel j, Card c[]) { - ArrayList a = new ArrayList(); - for (int i = 0; i < c.length; i++) - if ((!(c[i].isCreature() || c[i].isEnchantment() || c[i].isArtifact() || c[i].isPlaneswalker()) || (c[i].isLand() - && c[i].isArtifact() && !c[i].isCreature() && !c[i].isEnchantment())) - && !AllZone.getGameAction().isAttachee(c[i]) - || (c[i].getName().startsWith("Mox") && !c[i].getName().equals("Mox Diamond"))) a.add(c[i]); - - setupPanel(j, a, true); - } - - /* - private static void setupPanel(JPanel p, ArrayList list) { - setupPanel(p, list, false); - } - */ - - //list holds Card objects - //puts local enchanments in the right order - //adds "<<" to local enchanments names - /** - *

setupPanel.

- * - * @param p a {@link javax.swing.JPanel} object. - * @param list a {@link java.util.ArrayList} object. - * @param stack a boolean. - */ - private static void setupPanel(JPanel p, ArrayList list, boolean stack) { - - int maxY = 0; - int maxX = 0; - //remove all local enchantments - - Card c; - /* - for(int i = 0; i < list.size(); i++) - { - c = (Card)list.get(i); - if(c.isLocalEnchantment()) - list.remove(i); - } - - //add local enchantments to the permanents - //put local enchantments "next to" the permanent they are enchanting - //the inner for loop is backward so permanents with more than one local enchantments are in the right order - Card ca[]; - for(int i = 0; i < list.size(); i++) - { - c = (Card)list.get(i); - if(c.hasAttachedCards()) - { - ca = c.getAttachedCards(); - for(int inner = ca.length - 1; 0 <= inner; inner--) - list.add(i + 1, ca[inner]); - } - } - */ - - if (stack) { - // add all Cards in list to the GUI, add arrows to Local Enchantments - - ArrayList manaPools = getManaPools(list); - ArrayList enchantedLands = getEnchantedLands(list); - ArrayList basicBlues = getBasics(list, Constant.Color.Blue); - ArrayList basicReds = getBasics(list, Constant.Color.Red); - ArrayList basicBlacks = getBasics(list, Constant.Color.Black); - ArrayList basicGreens = getBasics(list, Constant.Color.Green); - ArrayList basicWhites = getBasics(list, Constant.Color.White); - ArrayList badlands = getNonBasicLand(list, "Badlands"); - ArrayList bayou = getNonBasicLand(list, "Bayou"); - ArrayList plateau = getNonBasicLand(list, "Plateau"); - ArrayList scrubland = getNonBasicLand(list, "Scrubland"); - ArrayList savannah = getNonBasicLand(list, "Savannah"); - ArrayList taiga = getNonBasicLand(list, "Taiga"); - ArrayList tropicalIsland = getNonBasicLand(list, "Tropical Island"); - ArrayList tundra = getNonBasicLand(list, "Tundra"); - ArrayList undergroundSea = getNonBasicLand(list, "Underground Sea"); - ArrayList volcanicIsland = getNonBasicLand(list, "Volcanic Island"); - - ArrayList nonBasics = getNonBasics(list); - - ArrayList moxEmerald = getMoxen(list, "Mox Emerald"); - ArrayList moxJet = getMoxen(list, "Mox Jet"); - ArrayList moxPearl = getMoxen(list, "Mox Pearl"); - ArrayList moxRuby = getMoxen(list, "Mox Ruby"); - ArrayList moxSapphire = getMoxen(list, "Mox Sapphire"); - //ArrayList moxDiamond = getMoxen(list, "Mox Diamond"); - - list = new ArrayList(); - list.addAll(manaPools); - list.addAll(enchantedLands); - list.addAll(basicBlues); - list.addAll(basicReds); - list.addAll(basicBlacks); - list.addAll(basicGreens); - list.addAll(basicWhites); - list.addAll(badlands); - list.addAll(bayou); - list.addAll(plateau); - list.addAll(scrubland); - list.addAll(savannah); - list.addAll(taiga); - list.addAll(tropicalIsland); - list.addAll(tundra); - list.addAll(undergroundSea); - list.addAll(volcanicIsland); - - list.addAll(nonBasics); - - list.addAll(moxEmerald); - list.addAll(moxJet); - list.addAll(moxPearl); - list.addAll(moxRuby); - list.addAll(moxSapphire); - //list.addAll(moxDiamond); - - - int atInStack = 0; - - int marginX = 5; - int marginY = 5; - - int x = marginX; - - int cardOffset = Constant.Runtime.stackOffset[0]; - - String color = ""; - ArrayList cards = new ArrayList(); - - ArrayList connectedCards = new ArrayList(); - - boolean nextEnchanted = false; - Card prevCard = null; - int nextXIfNotStacked = 0; - for (int i = 0; i < list.size(); i++) { - JPanel addPanel; - c = list.get(i); - - addPanel = new CardPanel(c); - - - boolean startANewStack = false; - - if (!isStackable(c)) { - startANewStack = true; - } else { - String newColor = c.getName(); //CardUtil.getColor(c); - - if (!newColor.equals(color)) { - startANewStack = true; - color = newColor; - } - } - - if (i == 0) { - startANewStack = false; - } - - - if (!startANewStack && atInStack == Constant.Runtime.stackSize[0]) { - startANewStack = true; - } - - - if (c.isAura() && c.isEnchanting() && !nextEnchanted) startANewStack = false; - else if (c.isAura() && c.isEnchanting()) { - startANewStack = true; - nextEnchanted = false; - } - - if (c.isLand() && c.isEnchanted()) { - startANewStack = false; - nextEnchanted = true; - } - - - //very hacky, but this is to ensure enchantment stacking occurs correctly when a land is enchanted, and there are more lands of that same name - - else if ((prevCard != null && c.isLand() && prevCard.isLand() && prevCard.isEnchanted() && prevCard.getName().equals( - c.getName()))) startANewStack = true; - else if (prevCard != null && c.isLand() && prevCard.isLand() - && !prevCard.getName().equals(c.getName())) startANewStack = true; - - /* - if (c.getName().equals("Squirrel Nest")) { - startANewStack = true; - System.out.println("startANewStack: " + startANewStack); - } - */ - if (c.isAura() && c.isEnchanting() && prevCard != null && prevCard instanceof ManaPool) - startANewStack = true; - if (c instanceof ManaPool && prevCard instanceof ManaPool && prevCard.isSnow()) startANewStack = false; - - if (startANewStack) { - setupConnectedCards(connectedCards); - connectedCards.clear(); - - // Fixed distance if last was a stack, looks a bit nicer - if (atInStack > 1) { - x += Math.max(addPanel.getPreferredSize().width, addPanel.getPreferredSize().height) - + marginX; - } else { - x = nextXIfNotStacked; - } - - atInStack = 0; - } else { - if (i != 0) { - x += cardOffset; - } - } - - nextXIfNotStacked = x + marginX + addPanel.getPreferredSize().width; - - int xLoc = x; - - int yLoc = marginY; - yLoc += atInStack * cardOffset; - - addPanel.setLocation(new Point(xLoc, yLoc)); - addPanel.setSize(addPanel.getPreferredSize()); - - - cards.add(addPanel); - - connectedCards.add((CardPanel) addPanel); - - atInStack++; - prevCard = c; - } - - setupConnectedCards(connectedCards); - connectedCards.clear(); - - - for (int i = cards.size() - 1; i >= 0; i--) { - JPanel card = cards.get(i); - //maxX = Math.max(maxX, card.getLocation().x + card.getSize().width + marginX); - maxY = Math.max(maxY, card.getLocation().y + card.getSize().height + marginY); - p.add(card); - } - - maxX = nextXIfNotStacked; - - //System.out.println("x:" + maxX + ", y:" + maxY); - if (maxX > 0 && maxY > 0) { //p.getSize().width || maxY > p.getSize().height) { -// p.setSize(new Dimension(maxX, maxY)); - p.setPreferredSize(new Dimension(maxX, maxY)); - } - - } else { - //add all Cards in list to the GUI, add arrows to Local Enchantments - JPanel addPanel; - for (int i = 0; i < list.size(); i++) { - c = list.get(i); - /*if(c.isLocalEnchantment()) - addPanel = getCardPanel(c, "<< " +c.getName()); - else - addPanel = getCardPanel(c); - */ - addPanel = new CardPanel(c); - - p.add(addPanel); - } - } - }//setupPanel() - - /** - *

setupNoLandPermPanel.

- * - * @param p a {@link javax.swing.JPanel} object. - * @param list a {@link java.util.ArrayList} object. - * @param stack a boolean. - */ - private static void setupNoLandPermPanel(JPanel p, ArrayList list, boolean stack) { - - int maxY = 0; - int maxX = 0; - - Card c; - - if (stack) { - // add all Cards in list to the GUI, add arrows to Local Enchantments - - ArrayList planeswalkers = getPlaneswalkers(list); - ArrayList equippedEnchantedCreatures = getEquippedEnchantedCreatures(list); //this will also fetch the equipment and/or enchantment - ArrayList nonTokenCreatures = getNonTokenCreatures(list); - ArrayList tokenCreatures = getTokenCreatures(list); - - //sort tokenCreatures by name (TODO: fix the warning message somehow) - Collections.sort(tokenCreatures, new Comparator() { - public int compare(Card c1, Card c2) { - return c1.getName().compareTo(c2.getName()); - } - }); - - ArrayList artifacts = getNonCreatureArtifacts(list); - ArrayList enchantments = getGlobalEnchantments(list); - //ArrayList nonBasics = getNonBasics(list); - - - list = new ArrayList(); - list.addAll(planeswalkers); - list.addAll(equippedEnchantedCreatures); - list.addAll(nonTokenCreatures); - list.addAll(tokenCreatures); - list.addAll(artifacts); - list.addAll(enchantments); - - - int atInStack = 0; - - int marginX = 5; - int marginY = 5; - - int x = marginX; - - int cardOffset = Constant.Runtime.stackOffset[0]; - - String color = ""; - ArrayList cards = new ArrayList(); - - ArrayList connectedCards = new ArrayList(); - - - boolean nextEquippedEnchanted = false; - int nextXIfNotStacked = 0; - Card prevCard = null; - for (int i = 0; i < list.size(); i++) { - JPanel addPanel; - c = list.get(i); - addPanel = new CardPanel(c); - - boolean startANewStack = false; - - if (!isStackable(c)) { - startANewStack = true; - } else { - String newColor = c.getName(); //CardUtil.getColor(c); - - if (!newColor.equals(color)) { - startANewStack = true; - color = newColor; - } - } - - - if (i == 0) { - startANewStack = false; - } - - if (!startANewStack && atInStack == Constant.Runtime.stackSize[0]) { - startANewStack = true; - } - - - if ((c.isEquipment() || c.isAura()) && (c.isEquipping() || c.isEnchanting()) - && !nextEquippedEnchanted) startANewStack = false; - else if ((c.isEquipment() || c.isAura()) && (c.isEquipping() || c.isEnchanting())) { - startANewStack = true; - nextEquippedEnchanted = false; - } - - if (c.isCreature() && (c.isEquipped() || c.isEnchanted())) { - startANewStack = false; - nextEquippedEnchanted = true; - } - //very hacky, but this is to ensure equipment stacking occurs correctly when a token is equipped/enchanted, and there are more tokens of that same name - else if ((prevCard != null && c.isCreature() && prevCard.isCreature() - && (prevCard.isEquipped() || prevCard.isEnchanted()) && prevCard.getName().equals( - c.getName()))) startANewStack = true; - else if (prevCard != null && c.isCreature() && prevCard.isCreature() - && !prevCard.getName().equals(c.getName())) startANewStack = true; - - if (((c.isAura() && c.isEnchanting()) || (c.isEquipment() && c.isEquipping())) && prevCard != null - && prevCard.isPlaneswalker()) startANewStack = true; - - if (startANewStack) { - setupConnectedCards(connectedCards); - connectedCards.clear(); - - // Fixed distance if last was a stack, looks a bit nicer - if (atInStack > 1) { - x += Math.max(addPanel.getPreferredSize().width, addPanel.getPreferredSize().height) - + marginX; - } else { - x = nextXIfNotStacked; - } - - atInStack = 0; - } else { - if (i != 0) { - x += cardOffset; - } - } - - nextXIfNotStacked = x + marginX + addPanel.getPreferredSize().width; - - int xLoc = x; - - int yLoc = marginY; - yLoc += atInStack * cardOffset; - - addPanel.setLocation(new Point(xLoc, yLoc)); - addPanel.setSize(addPanel.getPreferredSize()); - - - cards.add(addPanel); - - connectedCards.add((CardPanel) addPanel); - - atInStack++; - prevCard = c; - } - - setupConnectedCards(connectedCards); - connectedCards.clear(); - - - for (int i = cards.size() - 1; i >= 0; i--) { - JPanel card = cards.get(i); - //maxX = Math.max(maxX, card.getLocation().x + card.getSize().width + marginX); - maxY = Math.max(maxY, card.getLocation().y + card.getSize().height + marginY); - p.add(card); - } - - maxX = nextXIfNotStacked; - - if (maxX > 0 && maxY > 0) { //p.getSize().width || maxY > p.getSize().height) { - p.setPreferredSize(new Dimension(maxX, maxY)); - } - - } else { - JPanel addPanel; - for (int i = 0; i < list.size(); i++) { - c = list.get(i); - addPanel = new CardPanel(c); - - p.add(addPanel); - } - } - }//setupPanel() - - /** - *

getPlaneswalkers.

- * - * @param cards a {@link java.util.ArrayList} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getPlaneswalkers(ArrayList cards) { - ArrayList ret = new ArrayList(); - for (Card c : cards) { - if (c.isPlaneswalker() && !c.isArtifact()) ret.add(c); - } - return ret; - } - - /** - *

getEquippedEnchantedCreatures.

- * - * @param cards a {@link java.util.ArrayList} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getEquippedEnchantedCreatures(ArrayList cards) { - ArrayList ret = new ArrayList(); - for (Card c : cards) { - if (c.isCreature() && (c.isEquipped() || c.isEnchanted())) { - if (c.isEquipped()) ret.addAll(c.getEquippedBy()); - if (c.isEnchanted()) ret.addAll(c.getEnchantedBy()); - - ret.add(c); - } - - } - return ret; - } - - - /** - *

getNonTokenCreatures.

- * - * @param cards a {@link java.util.ArrayList} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getNonTokenCreatures(ArrayList cards) { - ArrayList ret = new ArrayList(); - for (Card c : cards) { - if (c.isCreature() && !c.isToken() && !c.isEquipped() && !c.isEnchanted()) ret.add(c); - } - return ret; - } - - /** - *

getTokenCreatures.

- * - * @param cards a {@link java.util.ArrayList} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getTokenCreatures(ArrayList cards) { - ArrayList ret = new ArrayList(); - for (Card c : cards) { - if (c.isCreature() && c.isToken() && !c.isEquipped() && !c.isEnchanted()) ret.add(c); - } - return ret; - } - - /** - *

getTokenCreatures.

- * - * @param cards a {@link java.util.ArrayList} object. - * @param tokenName a {@link java.lang.String} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getTokenCreatures(ArrayList cards, String tokenName) { - ArrayList ret = new ArrayList(); - for (Card c : cards) { - String name = c.getName(); - if (c.isCreature() && c.isToken() && name.equals(tokenName)) ret.add(c); - } - return ret; - } - - /** - *

getMoxen.

- * - * @param cards a {@link java.util.ArrayList} object. - * @param moxName a {@link java.lang.String} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getMoxen(ArrayList cards, String moxName) { - ArrayList ret = new ArrayList(); - for (Card c : cards) { - String name = c.getName(); - if (name.equals(moxName) && !c.isCreature()) ret.add(c); - } - return ret; - } - - /** - *

getNonCreatureArtifacts.

- * - * @param cards a {@link java.util.ArrayList} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getNonCreatureArtifacts(ArrayList cards) { - ArrayList ret = new ArrayList(); - for (Card c : cards) { - String name = c.getName(); - if (c.isArtifact() && !c.isCreature() && !c.isLand() && !c.isGlobalEnchantment() - && !(c.isEquipment() && c.isEquipping()) && !name.equals("Mox Emerald") - && !name.equals("Mox Jet") && !name.equals("Mox Pearl") && !name.equals("Mox Ruby") - && !name.equals("Mox Sapphire")) ret.add(c); - } - return ret; - } - - /** - *

getGlobalEnchantments.

- * - * @param cards a {@link java.util.ArrayList} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getGlobalEnchantments(ArrayList cards) { - ArrayList ret = new ArrayList(); - for (Card c : cards) { - if (c.isGlobalEnchantment() && !c.isCreature()) ret.add(c); - } - return ret; - } - - /** - *

getCard.

- * - * @param cards a {@link java.util.ArrayList} object. - * @param name a {@link java.lang.String} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getCard(ArrayList cards, String name) { - ArrayList ret = new ArrayList(); - for (Card c : cards) { - if (c.getName().equals(name)) ret.add(c); - } - return ret; - } - - /** - *

getEnchantedLands.

- * - * @param cards a {@link java.util.ArrayList} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getEnchantedLands(ArrayList cards) { - ArrayList ret = new ArrayList(); - for (Card c : cards) { - if (c.isLand() && c.isEnchanted()) { - ret.addAll(c.getEnchantedBy()); - ret.add(c); - } - - } - return ret; - } - - - /** - *

getBasics.

- * - * @param cards a {@link java.util.ArrayList} object. - * @param color a {@link java.lang.String} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getBasics(ArrayList cards, String color) { - ArrayList ret = new ArrayList(); - - for (Card c : cards) { - String name = c.getName(); - - if (c.isEnchanted()) ;//do nothing - - else if (name.equals("Swamp") || name.equals("Bog")) { - if (color == Constant.Color.Black) { - ret.add(c); - } - } else if (name.equals("Forest") || name.equals("Grass")) { - if (color == Constant.Color.Green) { - ret.add(c); - } - - } else if (name.equals("Plains") || name.equals("White Sand")) { - if (color == Constant.Color.White) { - ret.add(c); - } - - } else if (name.equals("Mountain") || name.equals("Rock")) { - if (color == Constant.Color.Red) { - ret.add(c); - } - - } else if (name.equals("Island") || name.equals("Underwater")) { - if (color == Constant.Color.Blue) { - ret.add(c); - } - } - } - - return ret; - } - - /** - *

getNonBasics.

- * - * @param cards a {@link java.util.ArrayList} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getNonBasics(ArrayList cards) { - ArrayList ret = new ArrayList(); - - for (Card c : cards) { - if (!c.isLand() && !c.getName().startsWith("Mox") && !(c instanceof ManaPool)) { - ret.add(c); - } else { - String name = c.getName(); - if (c.isEnchanted() || name.equals("Swamp") || name.equals("Bog") || name.equals("Forest") - || name.equals("Grass") || name.equals("Plains") || name.equals("White Sand") - || name.equals("Mountain") || name.equals("Rock") || name.equals("Island") - || name.equals("Underwater") || name.equals("Badlands") || name.equals("Bayou") - || name.equals("Plateau") || name.equals("Scrubland") || name.equals("Savannah") - || name.equals("Taiga") || name.equals("Tropical Island") || name.equals("Tundra") - || name.equals("Underground Sea") || name.equals("Volcanic Island") - || name.startsWith("Mox") || c instanceof ManaPool) { - // do nothing. - } else { - ret.add(c); - } - } - } - - return ret; - } - - /** - *

getNonBasicLand.

- * - * @param cards a {@link java.util.ArrayList} object. - * @param landName a {@link java.lang.String} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getNonBasicLand(ArrayList cards, String landName) { - ArrayList ret = new ArrayList(); - - for (Card c : cards) - if (c.getName().equals(landName)) ret.add(c); - - return ret; - } - - /** - *

getManaPools.

- * - * @param cards a {@link java.util.ArrayList} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getManaPools(ArrayList cards) { - ArrayList ret = new ArrayList(); - for (Card c : cards) { - if (c instanceof ManaPool) { - ret.add(c); - } - } - return ret; - } - - /** - *

isStackable.

- * - * @param c a {@link forge.Card} object. - * @return a boolean. - */ - public static boolean isStackable(Card c) { - - /*String name = c.getName(); - if( name.equals("Swamp") || name.equals("Bog") || - name.equals("Forest") || name.equals("Grass") || - name.equals("Plains") || name.equals("White Sand") || - name.equals("Mountain") || name.equals("Rock") || - name.equals("Island") || name.equals("Underwater")) { - return true; - } - */ - if (c.isLand() || (c.getName().startsWith("Mox") && !c.getName().equals("Mox Diamond")) - || (c.isLand() && c.isEnchanted()) || (c.isAura() && c.isEnchanting()) - || (c.isToken() && CardFactoryUtil.multipleControlled(c)) - || (c.isCreature() && (c.isEquipped() || c.isEnchanted())) || (c.isEquipment() && c.isEquipping()) - || (c.isEnchantment()) || (c instanceof ManaPool && c.isSnow())) return true; - - return false; - } - - //~ - /** - *

setupConnectedCards.

- * - * @param connectedCards a {@link java.util.ArrayList} object. - */ - public static void setupConnectedCards(ArrayList connectedCards) { - for (int i = connectedCards.size() - 1; i > 0; i--) { - //System.out.println("We should have a stack"); - CardPanel cp = connectedCards.get(i); - cp.connectedCard = connectedCards.get(i - 1); - } - } - //~ - - /** - *

setupPlayZone.

- * - * @param p a {@link arcane.ui.PlayArea} object. - * @param c an array of {@link forge.Card} objects. - */ - public static void setupPlayZone(PlayArea p, Card c[]) { - List tmp, diff; - tmp = new ArrayList(); - for (arcane.ui.CardPanel cpa : p.cardPanels) - tmp.add(cpa.gameCard); - diff = new ArrayList(tmp); - diff.removeAll(Arrays.asList(c)); - if (diff.size() == p.cardPanels.size()) - p.clear(); - else { - for (Card card : diff) { - p.removeCardPanel(p.getCardPanel(card.getUniqueNumber())); - } - } - diff = new ArrayList(Arrays.asList(c)); - diff.removeAll(tmp); - - arcane.ui.CardPanel toPanel = null; - for (Card card : diff) { - toPanel = p.addCard(card); - Animation.moveCard(toPanel); - } - - for (Card card : c) { - toPanel = p.getCardPanel(card.getUniqueNumber()); - if (card.isTapped()) { - toPanel.tapped = true; - toPanel.tappedAngle = arcane.ui.CardPanel.TAPPED_ANGLE; - } else { - toPanel.tapped = false; - toPanel.tappedAngle = 0; - } - toPanel.attachedPanels.clear(); - if (card.isEnchanted()) { - ArrayList enchants = card.getEnchantedBy(); - for (Card e : enchants) { - arcane.ui.CardPanel cardE = p.getCardPanel(e.getUniqueNumber()); - if (cardE != null) - toPanel.attachedPanels.add(cardE); - } - } - - if (card.isEquipped()) { - ArrayList enchants = card.getEquippedBy(); - for (Card e : enchants) { - arcane.ui.CardPanel cardE = p.getCardPanel(e.getUniqueNumber()); - if (cardE != null) - toPanel.attachedPanels.add(cardE); - } - } - - if (card.isEnchanting()) { - toPanel.attachedToPanel = p.getCardPanel(card.getEnchanting().get(0).getUniqueNumber()); - } else if (card.isEquipping()) { - toPanel.attachedToPanel = p.getCardPanel(card.getEquipping().get(0).getUniqueNumber()); - } else toPanel.attachedToPanel = null; - - toPanel.setCard(toPanel.gameCard); - } - p.invalidate(); - p.repaint(); - } - - /** - *

updateGUI.

- */ - public static void updateGUI() { - AllZone.getComputerBattlefield().updateObservers(); - AllZone.getHumanBattlefield().updateObservers(); - AllZone.getHumanHand().updateObservers(); - AllZone.getComputerPlayer().updateObservers(); - AllZone.getHumanPlayer().updateObservers(); - } - - /** - *

devSetupGameState.

- */ - public static void devSetupGameState() { - String t_humanLife = "-1"; - String t_computerLife = "-1"; - String t_humanSetupCardsInPlay = "NONE"; - String t_computerSetupCardsInPlay = "NONE"; - String t_humanSetupCardsInHand = "NONE"; - String t_computerSetupCardsInHand = "NONE"; - String t_humanSetupGraveyard = "NONE"; - String t_computerSetupGraveyard = "NONE"; - String t_humanSetupLibrary = "NONE"; - String t_computerSetupLibrary = "NONE"; - String t_humanSetupExile = "NONE"; - String t_computerSetupExile = "NONE"; - String t_changePlayer = "NONE"; - String t_changePhase = "NONE"; - - String wd = "."; - JFileChooser fc = new JFileChooser(wd); - int rc = fc.showDialog(null, "Select Game State File"); - if (rc != JFileChooser.APPROVE_OPTION) - return; - - try { - FileInputStream fstream = new FileInputStream(fc.getSelectedFile().getAbsolutePath()); - DataInputStream in = new DataInputStream(fstream); - BufferedReader br = new BufferedReader(new InputStreamReader(in)); - - String temp = ""; - - while ((temp = br.readLine()) != null) { - String[] temp_data = temp.split("="); - - if (temp_data.length < 2) - continue; - if (temp_data[0].toCharArray()[0] == '#') - continue; - - String categoryName = temp_data[0]; - String categoryValue = temp_data[1]; - - if (categoryName.toLowerCase().equals("humanlife")) - t_humanLife = categoryValue; - else if (categoryName.toLowerCase().equals("ailife")) - t_computerLife = categoryValue; - else if (categoryName.toLowerCase().equals("humancardsinplay")) - t_humanSetupCardsInPlay = categoryValue; - else if (categoryName.toLowerCase().equals("aicardsinplay")) - t_computerSetupCardsInPlay = categoryValue; - else if (categoryName.toLowerCase().equals("humancardsinhand")) - t_humanSetupCardsInHand = categoryValue; - else if (categoryName.toLowerCase().equals("aicardsinhand")) - t_computerSetupCardsInHand = categoryValue; - else if (categoryName.toLowerCase().equals("humancardsingraveyard")) - t_humanSetupGraveyard = categoryValue; - else if (categoryName.toLowerCase().equals("aicardsingraveyard")) - t_computerSetupGraveyard = categoryValue; - else if (categoryName.toLowerCase().equals("humancardsinlibrary")) - t_humanSetupLibrary = categoryValue; - else if (categoryName.toLowerCase().equals("aicardsinlibrary")) - t_computerSetupLibrary = categoryValue; - else if (categoryName.toLowerCase().equals("humancardsinexile")) - t_humanSetupExile = categoryValue; - else if (categoryName.toLowerCase().equals("aicardsinexile")) - t_computerSetupExile = categoryValue; - else if (categoryName.toLowerCase().equals("activeplayer")) - t_changePlayer = categoryValue; - else if (categoryName.toLowerCase().equals("activephase")) - t_changePhase = categoryValue; - } - - in.close(); - } catch (FileNotFoundException fnfe) { - JOptionPane.showMessageDialog(null, "File not found: " + fc.getSelectedFile().getAbsolutePath()); - } catch (Exception e) { - JOptionPane.showMessageDialog(null, "Error loading battle setup file!"); - return; - } - - int setHumanLife = Integer.parseInt(t_humanLife); - int setComputerLife = Integer.parseInt(t_computerLife); - - String humanSetupCardsInPlay[] = t_humanSetupCardsInPlay.split(";"); - String computerSetupCardsInPlay[] = t_computerSetupCardsInPlay.split(";"); - String humanSetupCardsInHand[] = t_humanSetupCardsInHand.split(";"); - String computerSetupCardsInHand[] = t_computerSetupCardsInHand.split(";"); - String humanSetupGraveyard[] = t_humanSetupGraveyard.split(";"); - String computerSetupGraveyard[] = t_computerSetupGraveyard.split(";"); - String humanSetupLibrary[] = t_humanSetupLibrary.split(";"); - String computerSetupLibrary[] = t_computerSetupLibrary.split(";"); - String humanSetupExile[] = t_humanSetupExile.split(";"); - String computerSetupExile[] = t_computerSetupExile.split(";"); - - CardList humanDevSetup = new CardList(); - CardList computerDevSetup = new CardList(); - CardList humanDevHandSetup = new CardList(); - CardList computerDevHandSetup = new CardList(); - CardList humanDevGraveyardSetup = new CardList(); - CardList computerDevGraveyardSetup = new CardList(); - CardList humanDevLibrarySetup = new CardList(); - CardList computerDevLibrarySetup = new CardList(); - CardList humanDevExileSetup = new CardList(); - CardList computerDevExileSetup = new CardList(); - - if (!t_changePlayer.trim().toLowerCase().equals("none")) { - if (t_changePlayer.trim().toLowerCase().equals("human")) { - AllZone.getPhase().setPlayerTurn(AllZone.getHumanPlayer()); - } - if (t_changePlayer.trim().toLowerCase().equals("ai")) { - AllZone.getPhase().setPlayerTurn(AllZone.getComputerPlayer()); - } - } - - if (!t_changePhase.trim().toLowerCase().equals("none")) { - AllZone.getPhase().setDevPhaseState(t_changePhase); - } - - if (!t_humanSetupCardsInPlay.trim().toLowerCase().equals("none")) - humanDevSetup = devProcessCardsForZone(humanSetupCardsInPlay, AllZone.getHumanPlayer()); - - if (!t_humanSetupCardsInHand.trim().toLowerCase().equals("none")) - humanDevHandSetup = devProcessCardsForZone(humanSetupCardsInHand, AllZone.getHumanPlayer()); - - if (!t_computerSetupCardsInPlay.trim().toLowerCase().equals("none")) - computerDevSetup = devProcessCardsForZone(computerSetupCardsInPlay, AllZone.getComputerPlayer()); - - if (!t_computerSetupCardsInHand.trim().toLowerCase().equals("none")) - computerDevHandSetup = devProcessCardsForZone(computerSetupCardsInHand, AllZone.getComputerPlayer()); - - if (!t_computerSetupGraveyard.trim().toLowerCase().equals("none")) - computerDevGraveyardSetup = devProcessCardsForZone(computerSetupGraveyard, AllZone.getComputerPlayer()); - - if (!t_humanSetupGraveyard.trim().toLowerCase().equals("none")) - humanDevGraveyardSetup = devProcessCardsForZone(humanSetupGraveyard, AllZone.getHumanPlayer()); - - if (!t_humanSetupLibrary.trim().toLowerCase().equals("none")) - humanDevLibrarySetup = devProcessCardsForZone(humanSetupLibrary, AllZone.getHumanPlayer()); - - if (!t_computerSetupLibrary.trim().toLowerCase().equals("none")) - computerDevLibrarySetup = devProcessCardsForZone(computerSetupLibrary, AllZone.getComputerPlayer()); - - if (!t_humanSetupExile.trim().toLowerCase().equals("none")) - humanDevExileSetup = devProcessCardsForZone(humanSetupExile, AllZone.getHumanPlayer()); - - if (!t_computerSetupExile.trim().toLowerCase().equals("none")) - computerDevExileSetup = devProcessCardsForZone(computerSetupExile, AllZone.getComputerPlayer()); - - AllZone.getTriggerHandler().suppressMode("ChangesZone"); - - for (Card c : humanDevSetup) { - AllZone.getHumanHand().add(c); - AllZone.getGameAction().moveToPlay(c); - c.setSickness(false); - } - - for (Card c : computerDevSetup) { - AllZone.getComputerHand().add(c); - AllZone.getGameAction().moveToPlay(c); - c.setSickness(false); - } - - if (computerDevGraveyardSetup.size() > 0) - AllZone.getComputerGraveyard().setCards(computerDevGraveyardSetup.toArray()); - if (humanDevGraveyardSetup.size() > 0) - AllZone.getHumanGraveyard().setCards(humanDevGraveyardSetup.toArray()); - - if (computerDevHandSetup.size() > 0) - AllZone.getComputerHand().setCards(computerDevHandSetup.toArray()); - if (humanDevHandSetup.size() > 0) - AllZone.getHumanHand().setCards(humanDevHandSetup.toArray()); - - if (humanDevLibrarySetup.size() > 0) - AllZone.getHumanLibrary().setCards(humanDevLibrarySetup.toArray()); - if (computerDevLibrarySetup.size() > 0) - AllZone.getComputerLibrary().setCards(computerDevLibrarySetup.toArray()); - - if (humanDevExileSetup.size() > 0) - AllZone.getHumanExile().setCards(humanDevExileSetup.toArray()); - if (computerDevExileSetup.size() > 0) - AllZone.getComputerExile().setCards(computerDevExileSetup.toArray()); - - AllZone.getTriggerHandler().clearSuppression("ChangesZone"); - - if (setComputerLife > 0) - AllZone.getComputerPlayer().setLife(setComputerLife, null); - if (setHumanLife > 0) - AllZone.getHumanPlayer().setLife(setHumanLife, null); - - AllZone.getGameAction().checkStateEffects(); - AllZone.getPhase().updateObservers(); - AllZone.getHumanExile().updateObservers(); - AllZone.getComputerExile().updateObservers(); - AllZone.getHumanHand().updateObservers(); - AllZone.getComputerHand().updateObservers(); - AllZone.getHumanGraveyard().updateObservers(); - AllZone.getComputerGraveyard().updateObservers(); - AllZone.getHumanBattlefield().updateObservers(); - AllZone.getComputerBattlefield().updateObservers(); - AllZone.getHumanLibrary().updateObservers(); - AllZone.getComputerLibrary().updateObservers(); - } - - /** - *

devProcessCardsForZone.

- * - * @param data an array of {@link java.lang.String} objects. - * @param player a {@link forge.Player} object. - * @return a {@link forge.CardList} object. - */ - public static CardList devProcessCardsForZone(String[] data, Player player) { - CardList cl = new CardList(); - for (int i = 0; i < data.length; i++) { - String cardinfo[] = data[i].trim().split("\\|"); - - Card c = AllZone.getCardFactory().getCard(cardinfo[0], player); - - if (cardinfo.length != 2) - c.setCurSetCode(c.getMostRecentSet()); - else - c.setCurSetCode(cardinfo[1]); - - c.setImageFilename(CardUtil.buildFilename(c)); - for (Trigger trig : c.getTriggers()) { - AllZone.getTriggerHandler().registerTrigger(trig); - } - cl.add(c); - } - return cl; - } - - /** - *

devModeTutor.

- * - * @since 1.0.15 - */ - public static void devModeTutor() { - CardList lib = AllZoneUtil.getPlayerCardsInLibrary(AllZone.getHumanPlayer()); - Object o = GuiUtils.getChoiceOptional("Choose a card", lib.toArray()); - if (null == o) return; - else { - Card c = (Card) o; - AllZone.getGameAction().moveToHand(c); - } - } - - /** - *

devModeAddCounter.

- * - * @since 1.0.15 - */ - public static void devModeAddCounter() { - CardList play = AllZoneUtil.getCardsInPlay(); - Object o = GuiUtils.getChoiceOptional("Add counters to which card?", play.toArray()); - if (null == o) return; - else { - Card c = (Card) o; - Counters counter = GuiUtils.getChoiceOptional("Which type of counter?", Counters.values()); - if (null == counter) return; - else { - Integer integers[] = new Integer[99]; - for(int j = 0; j < 99; j++) integers[j] = Integer.valueOf(j); - Integer i = GuiUtils.getChoiceOptional("How many counters?", integers); - if (null == i) return; - else { - c.addCounterFromNonEffect(counter, i); - } - } - } - } - - /** - *

devModeTapPerm.

- * - * @since 1.0.15 - */ - public static void devModeTapPerm() { - CardList play = AllZoneUtil.getCardsInPlay(); - Object o = GuiUtils.getChoiceOptional("Choose a permanent", play.toArray()); - if (null == o) return; - else { - Card c = (Card) o; - c.tap(); - } - } - - /** - *

devModeUntapPerm.

- * - * @since 1.0.15 - */ - public static void devModeUntapPerm() { - CardList play = AllZoneUtil.getCardsInPlay(); - Object o = GuiUtils.getChoiceOptional("Choose a permanent", play.toArray()); - if (null == o) return; - else { - Card c = (Card) o; - c.untap(); - } - } - - /** - *

devModeUnlimitedLand.

- * - * @since 1.0.16 - */ - public static void devModeUnlimitedLand() { - AllZone.getHumanPlayer().addMaxLandsToPlay(100); - } - -}//end class GuiDisplayUtil diff --git a/src/forge/GuiInput.java b/src/forge/GuiInput.java deleted file mode 100644 index d85945e017d..00000000000 --- a/src/forge/GuiInput.java +++ /dev/null @@ -1,91 +0,0 @@ -package forge; - - -import forge.gui.input.Input; - -import java.util.Observable; -import java.util.Observer; - - -/** - *

GuiInput class.

- * - * @author Forge - * @version $Id: $ - */ -public class GuiInput extends MyObservable implements Observer { - Input input; - - /** - *

Constructor for GuiInput.

- */ - public GuiInput() { - AllZone.getInputControl().addObserver(this); - AllZone.getStack().addObserver(this); - AllZone.getPhase().addObserver(this); - } - - /** {@inheritDoc} */ - public void update(Observable observable, Object obj) { - Input tmp = AllZone.getInputControl().updateInput(); - if (tmp != null) { - setInput(tmp); - } - } - - /** - *

Setter for the field input.

- * - * @param in a {@link forge.gui.input.Input} object. - */ - private void setInput(Input in) { - input = in; - input.showMessage(); - } - - /** - *

showMessage.

- */ - public void showMessage() { - input.showMessage(); - } - - /** - *

selectButtonOK.

- */ - public void selectButtonOK() { - input.selectButtonOK(); - } - - /** - *

selectButtonCancel.

- */ - public void selectButtonCancel() { - input.selectButtonCancel(); - } - - /** - *

selectPlayer.

- * - * @param player a {@link forge.Player} object. - */ - public void selectPlayer(Player player) { - input.selectPlayer(player); - } - - /** - *

selectCard.

- * - * @param card a {@link forge.Card} object. - * @param zone a {@link forge.PlayerZone} object. - */ - public void selectCard(Card card, PlayerZone zone) { - input.selectCard(card, zone); - } - - /** {@inheritDoc} */ - @Override - public String toString() { - return input.toString(); - } -} diff --git a/src/forge/Gui_BoosterDraft.java b/src/forge/Gui_BoosterDraft.java deleted file mode 100644 index f15060fb753..00000000000 --- a/src/forge/Gui_BoosterDraft.java +++ /dev/null @@ -1,705 +0,0 @@ -package forge; - - -import forge.deck.Deck; -import forge.deck.DeckManager; -import forge.error.ErrorViewer; -import forge.gui.game.CardDetailPanel; -import forge.gui.game.CardPicturePanel; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - -import javax.swing.*; -import javax.swing.border.Border; -import javax.swing.border.TitledBorder; -import javax.swing.event.TableModelEvent; -import javax.swing.event.TableModelListener; -import java.awt.Color; -import java.awt.*; -import java.awt.event.*; -import java.util.ArrayList; -import java.util.Random; - - -/** - *

Gui_BoosterDraft class.

- * - * @author Forge - * @version $Id: $ - */ -public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConstants, NewConstants.LANG.Gui_BoosterDraft { - /** - * Constant serialVersionUID=-6055633915602448260L - */ - private static final long serialVersionUID = -6055633915602448260L; - - private BoosterDraft boosterDraft; - - /** - * Constant limitedDeckEditor=true - */ - private static final boolean limitedDeckEditor = true; - - private TableModel allCardModel; - private TableModel deckModel; - - private JScrollPane jScrollPane1 = new JScrollPane(); - private JScrollPane jScrollPane2 = new JScrollPane(); - private TitledBorder titledBorder1; - private TitledBorder titledBorder2; - private Border border3; - private TitledBorder titledBorder3; - private JLabel statsLabel = new JLabel(); - private JTable allCardTable = new JTable(); - private JTable deckTable = new JTable(); - private JScrollPane jScrollPane3 = new JScrollPane(); - private JPanel jPanel3 = new JPanel(); - private GridLayout gridLayout1 = new GridLayout(); - private JLabel statsLabel2 = new JLabel(); - private JButton jButton1 = new JButton(); - private CardDetailPanel detail = new CardDetailPanel(null); - private CardPicturePanel picture = new CardPicturePanel(null); - - /** - *

showGui.

- * - * @param in_boosterDraft a {@link forge.BoosterDraft} object. - */ - public void showGui(BoosterDraft in_boosterDraft) { - boosterDraft = in_boosterDraft; - - setup(); - showChoices(boosterDraft.nextChoice()); - - allCardModel.sort(1, true); - deckModel.sort(1, true); - - setVisible(true); - } - - /** - *

addListeners.

- */ - private void addListeners() { - this.addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent ev) { - int n = JOptionPane.showConfirmDialog(null, ForgeProps.getLocalized(CLOSE_MESSAGE), "", - JOptionPane.YES_NO_OPTION); - if (n == JOptionPane.YES_OPTION) { - dispose(); - new Gui_NewGame(); - } - }//windowClosing() - }); - }//addListeners() - - /** - *

setup.

- */ - private void setup() { - addListeners(); -// setupMenu(); - - //construct allCardTable, get all cards - allCardModel = new TableModel(new CardList(), this); - allCardModel.addListeners(allCardTable); - allCardTable.setModel(allCardModel); - - allCardModel.resizeCols(allCardTable); - - //construct deckModel - deckModel = new TableModel(this); - deckModel.addListeners(deckTable); - deckTable.setModel(deckModel); - - deckModel.resizeCols(deckTable); - - //add cards to GUI from deck -// refreshGui(); - - allCardTable.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - if ((e.getModifiers() & InputEvent.BUTTON3_MASK) != 0) jButton1_actionPerformed(null); - } - });//MouseListener - - - //get stats from deck - deckModel.addTableModelListener(new TableModelListener() { - public void tableChanged(TableModelEvent ev) { - CardList deck = deckModel.getCards(); - statsLabel.setText(getStats(deck)); - } - }); - - - //get stats from all cards - allCardModel.addTableModelListener(new TableModelListener() { - public void tableChanged(TableModelEvent ev) { - CardList deck = allCardModel.getCards(); - statsLabel2.setText(getStats(deck)); - } - }); - - //Use both so that when "un"maximizing, the frame isn't tiny - setSize(1024, 740); - setExtendedState(Frame.MAXIMIZED_BOTH); - }//setupAndDisplay() - - /** - *

getStats.

- * - * @param deck a {@link forge.CardList} object. - * @return a {@link java.lang.String} object. - */ - private String getStats(CardList deck) { - int total = deck.size(); - int creature = deck.getType("Creature").size(); - int land = deck.getType("Land").size(); - - StringBuffer show = new StringBuffer(); - show.append("Total - ").append(total).append(", Creatures - ").append(creature).append(", Land - ").append(land); - String[] color = Constant.Color.Colors; - for (int i = 0; i < 5; i++) - show.append(", ").append(color[i]).append(" - ").append(CardListUtil.getColor(deck, color[i]).size()); - - return show.toString(); - }//getStats() - - /** - *

Constructor for Gui_BoosterDraft.

- */ - public Gui_BoosterDraft() { - try { - jbInit(); - } catch (Exception ex) { - ErrorViewer.showError(ex); - } - } - - /** - *

getCard.

- * - * @return a {@link forge.Card} object. - */ - public Card getCard() { - return detail.getCard(); - } - - /** {@inheritDoc} */ - public void setCard(Card card) { - detail.setCard(card); - picture.setCard(card); - } - - /** - *

jbInit.

- * - * @throws java.lang.Exception if any. - */ - private void jbInit() throws Exception { - titledBorder1 = new TitledBorder(BorderFactory.createEtchedBorder(Color.white, new Color(148, 145, 140)), - "Previously Picked Cards"); - titledBorder2 = new TitledBorder(BorderFactory.createEtchedBorder(Color.white, new Color(148, 145, 140)), - "Choose one card"); - border3 = BorderFactory.createEtchedBorder(Color.white, new Color(148, 145, 140)); - titledBorder3 = new TitledBorder(border3, "Card Detail"); - this.getContentPane().setLayout(null); - jScrollPane1.setBorder(titledBorder2); - jScrollPane1.setBounds(new Rectangle(19, 28, 661, 344)); - jScrollPane2.setBorder(titledBorder1); - jScrollPane2.setBounds(new Rectangle(19, 478, 661, 184)); - detail.setBorder(titledBorder3); - detail.setBounds(new Rectangle(693, 23, 239, 323)); - picture.setBounds(new Rectangle(693, 348, 240, 340)); - statsLabel.setFont(new java.awt.Font("Dialog", 0, 16)); - statsLabel.setText("Total - 0, Creatures - 0 Land - 0"); - statsLabel.setBounds(new Rectangle(19, 665, 665, 31)); - this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); - this.setTitle("Booster Draft"); - jScrollPane3.setHorizontalScrollBarPolicy(ScrollPaneConstants.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); - statsLabel2.setBounds(new Rectangle(19, 378, 665, 31)); - statsLabel2.setText("Total - 0, Creatures - 0 Land - 0"); - statsLabel2.setFont(new java.awt.Font("Dialog", 0, 16)); - jButton1.setBounds(new Rectangle(238, 418, 147, 44)); - jButton1.setFont(new java.awt.Font("Dialog", 0, 16)); - jButton1.setText("Choose Card"); - jButton1.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - jButton1_actionPerformed(e); - } - }); - this.getContentPane().add(detail, null); - this.getContentPane().add(picture, null); - this.getContentPane().add(jScrollPane1, null); - this.getContentPane().add(statsLabel2, null); - this.getContentPane().add(statsLabel, null); - this.getContentPane().add(jScrollPane2, null); - this.getContentPane().add(jButton1, null); - jScrollPane2.getViewport().add(deckTable, null); - jScrollPane1.getViewport().add(allCardTable, null); - } - - /** - *

addButton_actionPerformed.

- * - * @param e a {@link java.awt.event.ActionEvent} object. - */ - void addButton_actionPerformed(ActionEvent e) { - int n = allCardTable.getSelectedRow(); - if (n != -1) { - setTitle("Deck Editor - " + Constant.Runtime.HumanDeck[0].getName() + " - changed"); - - Card c = allCardModel.rowToCard(n); - deckModel.addCard(c); - deckModel.resort(); - - if (limitedDeckEditor) { - allCardModel.removeCard(c); - } - - //3 conditions" 0 cards left, select the same row, select next row - int size = allCardModel.getRowCount(); - if (size != 0) { - if (size == n) n--; - allCardTable.addRowSelectionInterval(n, n); - } - }//if(valid row) - }//addButton_actionPerformed - - /** - *

removeButton_actionPerformed.

- * - * @param e a {@link java.awt.event.ActionEvent} object. - */ - void removeButton_actionPerformed(ActionEvent e) { - int n = deckTable.getSelectedRow(); - if (n != -1) { - setTitle("Deck Editor - " + Constant.Runtime.HumanDeck[0].getName() + " - changed"); - - Card c = deckModel.rowToCard(n); - deckModel.removeCard(c); - - if (limitedDeckEditor) { - allCardModel.addCard(c); - allCardModel.resort(); - } - - //3 conditions" 0 cards left, select the same row, select next row - int size = deckModel.getRowCount(); - if (size != 0) { - if (size == n) n--; - deckTable.addRowSelectionInterval(n, n); - } - }//if(valid row) - }//removeButton_actionPerformed - - //if true, don't do anything else - - /** - *

checkSaveDeck.

- * - * @return a boolean. - */ - private boolean checkSaveDeck() { - //a crappy way of checking if the deck has been saved - if (getTitle().endsWith("changed")) { - - int n = JOptionPane.showConfirmDialog(null, ForgeProps.getLocalized(SAVE_MESSAGE), - ForgeProps.getLocalized(SAVE_TITLE), JOptionPane.YES_NO_CANCEL_OPTION); - if (n == JOptionPane.CANCEL_OPTION) return true; - else if (n == JOptionPane.YES_OPTION) saveItem_actionPerformed(); - } - return false; - }//checkSaveDeck() - - /** - *

newItem_actionPerformed.

- */ - private void newItem_actionPerformed() { - if (checkSaveDeck()) return; - - setTitle("Deck Editor"); - - Deck deck = Constant.Runtime.HumanDeck[0]; - while (deck.countMain() != 0) - deck.addSideboard(deck.removeMain(0)); - - //refreshGui(); - }//newItem_actionPerformed - - /** - *

closeItem_actionPerformed.

- */ - private void closeItem_actionPerformed() { - //check if saved, show dialog "yes, "no" - checkSaveDeck(); - dispose(); - } - - /** - *

stats_actionPerformed.

- * - * @param list a {@link forge.CardList} object. - */ - private void stats_actionPerformed(CardList list) { - - } - - /** - *

saveAsItem_actionPerformed.

- */ - private void saveAsItem_actionPerformed() { - }//saveItem_actionPerformed() - - /** - *

saveItem_actionPerformed.

- */ - private void saveItem_actionPerformed() { - } - - /** - *

openItem_actionPerformed.

- */ - private void openItem_actionPerformed() { - }//openItem_actionPerformed() - - /** - *

deleteItem_actionPerformed.

- */ - public void deleteItem_actionPerformed() { - } - - /** - *

renameItem_actionPerformed.

- */ - public void renameItem_actionPerformed() { - String newName = ""; - while (newName.equals("")) { - newName = JOptionPane.showInputDialog(null, ForgeProps.getLocalized(RENAME_MESSAGE), - ForgeProps.getLocalized(RENAME_TITLE), JOptionPane.QUESTION_MESSAGE); - if (newName == null) break; - } - - //when the user selects "Cancel" - if (newName != null) { - //String oldName = Constant.Runtime.HumanDeck[0].getName(); //unused - - Constant.Runtime.HumanDeck[0].setName(newName); - setTitle("Deck Editor - " + newName + " - changed"); - } - } - - /** - *

setupMenu.

- */ - @SuppressWarnings("unused") - // setupMenu - private void setupMenu() { - //final boolean[] isSaved = new boolean[1]; // unused - - JMenuItem newItem = new JMenuItem("New"); - JMenuItem openItem = new JMenuItem("Open"); - JMenuItem saveItem = new JMenuItem("Save"); - JMenuItem saveAsItem = new JMenuItem("Save As"); - JMenuItem renameItem = new JMenuItem("Rename"); - JMenuItem deleteItem = new JMenuItem("Delete"); - JMenuItem statsPoolItem = new JMenuItem("Statistics - Card Pool"); - JMenuItem statsDeckItem = new JMenuItem("Statistics - Deck"); - JMenuItem closeItem = new JMenuItem("Close"); - - newItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - newItem_actionPerformed(); - } - }); - openItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - openItem_actionPerformed(); - } - }); - saveItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - saveItem_actionPerformed(); - } - }); - saveAsItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - saveAsItem_actionPerformed(); - } - }); - renameItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - renameItem_actionPerformed(); - } - }); - deleteItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - deleteItem_actionPerformed(); - } - }); - statsPoolItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - stats_actionPerformed(allCardModel.getCards()); - } - }); - statsDeckItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - stats_actionPerformed(deckModel.getCards()); - } - }); - closeItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - closeItem_actionPerformed(); - } - }); - - JMenu fileMenu = new JMenu("Deck Actions"); - fileMenu.add(newItem); - fileMenu.add(openItem); - fileMenu.add(saveItem); - fileMenu.add(saveAsItem); - - fileMenu.addSeparator(); - fileMenu.add(renameItem); - fileMenu.add(deleteItem); -// fileMenu.add(statsPoolItem); -// fileMenu.add(statsDeckItem); - fileMenu.addSeparator(); - fileMenu.add(closeItem); - - JMenuBar menuBar = new JMenuBar(); - menuBar.add(fileMenu); - - this.setJMenuBar(menuBar); - }/*setupMenu(); */ - - //refresh Gui from deck, Gui shows the cards in the deck - -// /** -// *

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]); - - allCardModel.clear(); - deckModel.clear(); - - Card c; - //ReadDraftBoosterPack pack = new ReadDraftBoosterPack(); - for (int i = 0; i < deck.countMain(); i++) { - c = AllZone.getCardFactory().getCard(deck.getMain(i), AllZone.getHumanPlayer()); - - //add rarity to card if this is a sealed card pool - //if (!Constant.Runtime.GameType[0].equals(Constant.GameType.Constructed)) - // c.setRarity(pack.getRarity(c.getName())); - //; - - - deckModel.addCard(c); - }//for - - if (deck.isSealed() || deck.isRegular()) { - //add sideboard to GUI - for (int i = 0; i < deck.countSideboard(); i++) { - c = AllZone.getCardFactory().getCard(deck.getSideboard(i), AllZone.getHumanPlayer()); - //c.setRarity(pack.getRarity(c.getName())); - allCardModel.addCard(c); - } - } else { - - * Braids: "getAllCards copies the entire array, but that does not - * seem to be needed here. Significant performance improvement is - * possible if this code used getCards instead (along with a for each - * loop instead of using get(i), if applicable)." - -// CardList all = AllZone.getCardFactory().getAllCards(); -// for (int i = 0; i < all.size(); i++) -// allCardModel.addCard(all.get(i)); - } - - allCardModel.resort(); - deckModel.resort(); - }//refreshGui() -*/ - //updates Constant.Runtime.HumanDeck[0] from the cards shown in the GUI - - /** - *

refreshDeck.

- */ - @SuppressWarnings("unused") - // refreshDeck - private void refreshDeck() { - //make new Deck - Deck deck = new Deck(Constant.Runtime.GameType[0]); - deck.setName(Constant.Runtime.HumanDeck[0].getName()); - Constant.Runtime.HumanDeck[0] = deck; - - //update Deck with cards shown in GUI - CardList list = deckModel.getCards(); - for (int i = 0; i < list.size(); i++) - deck.addMain(list.get(i).getName()); - - if (deck.isSealed()) { - //add sideboard to deck - list = allCardModel.getCards(); - for (int i = 0; i < list.size(); i++) - deck.addSideboard(list.get(i).getName()); - } - }/* refreshDeck() */ - - /** - *

jButton1_actionPerformed.

- * - * @param e a {@link java.awt.event.ActionEvent} object. - */ - void jButton1_actionPerformed(ActionEvent e) { - //pick card - int n = allCardTable.getSelectedRow(); - if (n == -1) //is valid selection? - return; - - Card c = allCardModel.rowToCard(n); - - deckModel.addCard(c); - deckModel.resort(); - - //get next booster pack - boosterDraft.setChoice(c); - if (boosterDraft.hasNextChoice()) { - showChoices(boosterDraft.nextChoice()); - } else { - if (Constant.Runtime.UpldDrft[0]) { - if (BoosterDraft.draftPicks.size() > 1) { - ArrayList outDraftData = new ArrayList(); - - String keys[] = {""}; - keys = BoosterDraft.draftPicks.keySet().toArray(keys); - - for (int i = 0; i < keys.length; i++) { - outDraftData.add(keys[i] + "|" + BoosterDraft.draftPicks.get(keys[i])); - } - - FileUtil.writeFile("res/draft/tmpDraftData.txt", outDraftData); - - HttpUtil poster = new HttpUtil(); - poster.upload("http://cardforge.org/draftAI/submitDraftData.php?fmt=" + BoosterDraft.draftFormat[0], "res/draft/tmpDraftData.txt"); - } - } - - //quit - saveDraft(); - dispose(); - } - }/*OK Button*/ - - /** - *

showChoices.

- * - * @param list a {@link forge.CardList} object. - */ - private void showChoices(CardList list) { - allCardModel.clear(); - - //ReadDraftBoosterPack pack = new ReadDraftBoosterPack(); - Card c; - for (int i = 0; i < list.size(); i++) { - c = list.get(i); - //c.setRarity(pack.getRarity(c.getName())); - - //String PC = c.getSVar("PicCount"); - Random r = MyRandom.random; - //int n = 0; - //if (PC.matches("[0-9][0-9]?")) - // n = Integer.parseInt(PC); - //if (n > 1) - // c.setRandomPicture(r.nextInt(n)); - - if (c.getCurSetCode().equals("")) - c.setCurSetCode(c.getMostRecentSet()); - - if (!c.getCurSetCode().equals("")) { - int n = SetInfoUtil.getSetInfo_Code(c.getSets(), c.getCurSetCode()).PicCount; - if (n > 1) - c.setRandomPicture(r.nextInt(n - 1) + 1); - - c.setImageFilename(CardUtil.buildFilename(c)); - - c.setRarity(SetInfoUtil.getSetInfo_Code(c.getSets(), c.getCurSetCode()).Rarity); - } - - allCardModel.addCard(c); - } - allCardModel.resort(); - allCardTable.setRowSelectionInterval(0, 0); - - }//showChoices() - - /** - *

getPlayersDeck.

- * - * @return a {@link forge.deck.Deck} object. - */ - private Deck getPlayersDeck() { - Deck deck = new Deck(Constant.GameType.Draft); - Constant.Runtime.HumanDeck[0] = deck; - - //add sideboard to deck - CardList list = deckModel.getCards(); - for (int i = 0; i < list.size(); i++) - deck.addSideboard(list.get(i).getName() + "|" + list.get(i).getCurSetCode()); - - - for (int i = 0; i < 20; i++) { - deck.addSideboard("Forest|" + BoosterDraft.LandSetCode[0]); - deck.addSideboard("Mountain|" + BoosterDraft.LandSetCode[0]); - deck.addSideboard("Swamp|" + BoosterDraft.LandSetCode[0]); - deck.addSideboard("Island|" + BoosterDraft.LandSetCode[0]); - deck.addSideboard("Plains|" + BoosterDraft.LandSetCode[0]); - } - - return deck; - }//getPlayersDeck() - - /** - *

saveDraft.

- */ - private void saveDraft() { - String s = ""; - while (s == null || s.length() == 0) { - s = JOptionPane.showInputDialog(null, ForgeProps.getLocalized(SAVE_DRAFT_MESSAGE), - ForgeProps.getLocalized(SAVE_DRAFT_TITLE), JOptionPane.QUESTION_MESSAGE); - } - //TODO: check if overwriting the same name, and let the user delete old drafts - - //construct computer's decks - //save draft - Deck[] computer = boosterDraft.getDecks(); - - Deck human = getPlayersDeck(); - human.setName(s); - - Deck[] all = { - human, computer[0], computer[1], computer[2], computer[3], computer[4], computer[5], computer[6]}; - - //DeckManager deckManager = new DeckManager(ForgeProps.getFile(NEW_DECKS)); - DeckManager deckManager = AllZone.getDeckManager(); - deckManager.addDraftDeck(all); - - //write file - deckManager.close(); - - //close and open next screen - dispose(); - new Gui_NewGame(); - }/*saveDraft()*/ -} diff --git a/src/forge/Gui_CardShop.java b/src/forge/Gui_CardShop.java deleted file mode 100644 index e39dd45d7b5..00000000000 --- a/src/forge/Gui_CardShop.java +++ /dev/null @@ -1,809 +0,0 @@ -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 java.util.Random; - -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.MouseInputAdapter; -import javax.swing.event.MouseInputListener; -import javax.swing.table.DefaultTableCellRenderer; -import javax.swing.table.TableCellRenderer; - -import forge.deck.Deck; -import forge.error.ErrorViewer; -import forge.gui.game.CardDetailPanel; -import forge.gui.game.CardPicturePanel; -import forge.properties.NewConstants; - -/** - *

- * Gui_CardShop class. - *

- * - * @author Forge - * @version $Id: $ - */ -public class Gui_CardShop extends JFrame implements CardContainer, DeckDisplay, NewConstants { - - /** Constant serialVersionUID=3988857075791576483L */ - 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; - private JTable bottomTable; - 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 forge.quest.data.QuestData questData; - - /** {@inheritDoc} */ - @Override - public void setTitle(String message) { - super.setTitle(message); - } - - /** {@inheritDoc} */ - public void updateDisplay(CardList topParam, CardList bottomParam) { - - this.top = topParam; - this.bottom = bottomParam; - - topModel.clear(); - bottomModel.clear(); - - topParam = AllZone.getNameChanger().changeCardsIfNeeded(topParam); - bottomParam = AllZone.getNameChanger().changeCardsIfNeeded(bottomParam); - - Card c; - String cardName; - ReadBoosterPack pack = new ReadBoosterPack(); - - // update top - for (int i = 0; i < topParam.size(); i++) { - c = topParam.get(i); - - // add rarity to card if this is a sealed card pool - - cardName = AllZone.getNameChanger().getOriginalName(c.getName()); - if (!pack.getRarity(cardName).equals("error")) { - c.setRarity(pack.getRarity(cardName)); - } - - // String PC = c.getSVar("PicCount"); - Random r = MyRandom.random; - // int n = 0; - // if (PC.matches("[0-9][0-9]?")) - // n = Integer.parseInt(PC); - // if (n > 1) - // c.setRandomPicture(r.nextInt(n)); - - if (c.getCurSetCode().equals("")) - c.setCurSetCode(c.getMostRecentSet()); - - if (!c.getCurSetCode().equals("")) { - int n = SetInfoUtil.getSetInfo_Code(c.getSets(), c.getCurSetCode()).PicCount; - if (n > 1) - c.setRandomPicture(r.nextInt(n - 1) + 1); - - c.setImageFilename(CardUtil.buildFilename(c)); - } - - topModel.addCard(c); - - }// for - - // update bottom - for (int i = 0; i < bottomParam.size(); i++) { - c = bottomParam.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())); - - // String PC = c.getSVar("PicCount"); - Random r = MyRandom.random; - // int n = 0; - // if (PC.matches("[0-9][0-9]?")) - // n = Integer.parseInt(PC); - // if (n > 1) - // c.setRandomPicture(r.nextInt(n)); - - if (c.getCurSetCode().equals("")) - c.setCurSetCode(c.getMostRecentSet()); - - if (!c.getCurSetCode().equals("")) { - int n = SetInfoUtil.getSetInfo_Code(c.getSets(), c.getCurSetCode()).PicCount; - if (n > 1) - c.setRandomPicture(r.nextInt(n - 1) + 1); - - c.setImageFilename(CardUtil.buildFilename(c)); - } - - bottomModel.addCard(c); - }// for - - topModel.resort(); - bottomModel.resort(); - }// updateDisplay - - /** - *

- * updateDisplay. - *

- */ - public void updateDisplay() { - // updateDisplay(this.top, this.bottom); - - topModel.clear(); - - top = AllZone.getNameChanger().changeCardsIfNeeded(top); - bottom = AllZone.getNameChanger().changeCardsIfNeeded(bottom); - - 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.getNameChanger().getOriginalName(c.getName()); - if (!pack.getRarity(cardName).equals("error")) { - c.setRarity(pack.getRarity(cardName)); - } - - topModel.addCard(c); - }// for - - topModel.resort(); - } - - /** - *

- * getTopTableModel. - *

- * - * @return a {@link forge.CardShopTableModel} object. - */ - public CardShopTableModel getTopTableModel() { - return topModel; - } - - /** - *

- * Getter for the field top. - *

- * - * @return a {@link forge.CardList} object. - */ - public CardList getTop() { - return topModel.getCards(); - } - - // bottom shows cards that the user has chosen for his library - /** - *

- * Getter for the field bottom. - *

- * - * @return a {@link forge.CardList} object. - */ - public CardList getBottom() { - return bottomModel.getCards(); - } - - /** - *

- * show. - *

- * - * @param exitCommand - * a {@link forge.Command} object. - */ - 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() == null || questData.getShopList().size() == 0) { - shop = pack.getShopCards(questData.getWin(), questData.getLevel()); - ArrayList shopListToBeSaved = new ArrayList(); - - for (int i = 0; i < shop.size(); i++) { - Card crd = shop.get(i); - if (map.containsKey(crd.getName())) - crd.setValue(map.get(crd.getName())); - else { - System.out.println("Card " + crd.getName() + " is not in the price list."); - crd.setValue(10); - if (crd.getRarity().equals("Common")) - crd.setValue(10); - else if (crd.getRarity().equals("Uncommon")) - crd.setValue(50); - else if (crd.getRarity().equals("Rare")) - crd.setValue(200); - } - shopListToBeSaved.add(crd.getName()); - } - questData.setShopList(shopListToBeSaved); - } else // grab existing shopList - { - java.util.List shopList = questData.getShopList(); - shop = new CardList(); - - for (String aShopList : shopList) { - Card c = AllZone.getCardFactory().getCard(aShopList, null); - c.setRarity(pack.getRarity(c.getName())); - if (map.containsKey(c.getName())) { - c.setValue(map.get(c.getName())); - } else // card is not on pricelist - { - System.out.println("Card " + c.getName() + " is not in the price list."); - if (c.getRarity().equals("Common")) { - c.setValue(10); - } else if (c.getRarity().equals("Uncommon")) { - c.setValue(50); - } else if (c.getRarity().equals("Rare")) { - c.setValue(200); - } - } - - shop.add(c); - } - } - - java.util.List list = questData.getCardpool(); - CardList owned = new CardList(); - - for (String aList : list) { - Card c = AllZone.getCardFactory().getCard(aList, null); - - c.setRarity(pack.getRarity(c.getName())); - if (map.containsKey(c.getName())) { - c.setValue(map.get(c.getName())); - } else // card is not on pricelist - { - System.out.println("Card " + c.getName() + " is not in the price list."); - if (c.getRarity().equals("Common")) { - c.setValue(10); - } else if (c.getRarity().equals("Uncommon")) { - c.setValue(50); - } else if (c.getRarity().equals("Rare")) { - c.setValue(200); - } - } - owned.add(c); - } - - customMenu.populateShop(shop, owned); - - double multiPercent = multi * 100; - NumberFormat formatter = new DecimalFormat("#0.00"); - String maxSellingPrice = ""; - if (questData.getWin() <= 50) - maxSellingPrice = " Max selling price: 500"; - sellPercentageLabel.setText("(Sell percentage: " + formatter.format(multiPercent) + "% of value)" - + maxSellingPrice); - - topModel.sort(1, true); - bottomModel.sort(1, true); - }// show(Command) - - /** - *

- * addListeners. - *

- */ - 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() - - /** - *

- * setup. - *

- */ - private void setup() { - multi = 0.20 + (0.001 * questData.getWin()); - if (multi > 0.6) - multi = 0.6; - - if (questData.getMode().equals(forge.quest.data.QuestData.FANTASY)) { - if (questData.getInventory().getItemLevel("Estates") == 1) - multi += 0.01; - else if (questData.getInventory().getItemLevel("Estates") == 2) - multi += 0.0175; - else if (questData.getInventory().getItemLevel("Estates") >= 3) - multi += 0.025; - } - - 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() - - /** - *

- * Constructor for Gui_CardShop. - *

- * - * @param qd - * a {@link forge.quest.data.QuestData} object. - */ - public Gui_CardShop(forge.quest.data.QuestData qd) { - questData = qd; - try { - jbInit(); - } catch (Exception ex) { - ErrorViewer.showError(ex); - } - } - - /** - *

- * getCard. - *

- * - * @return a {@link forge.Card} object. - */ - public Card getCard() { - return detail.getCard(); - } - - /** {@inheritDoc} */ - public void setCard(Card card) { - detail.setCard(card); - picture.setCard(card); - } - - /** - *

- * jbInit. - *

- * - * @throws java.lang.Exception - * if any. - */ - private void jbInit() throws Exception { - - // Replace cell renderer with one that displays the cell text as - // tooltip. - topTable = new JTable() { - private static final long serialVersionUID = -1103518241118990299L; - - public TableCellRenderer getCellRenderer(int row, int column) { - TableCellRenderer renderer = new DefaultTableCellRenderer() { - private static final long serialVersionUID = -9208011190616028553L; - - public String getToolTipText() { - return this.getText(); - } - }; - return renderer; - } - }; - - bottomTable = new JTable() { - private static final long serialVersionUID = -3703821828491920769L; - - public TableCellRenderer getCellRenderer(int row, int column) { - TableCellRenderer renderer = new DefaultTableCellRenderer() { - private static final long serialVersionUID = -2544330968158633077L; - - public String getToolTipText() { - return this.getText(); - } - }; - return renderer; - } - }; - - 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.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 MouseInputAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - } - }); - // 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, 450, 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); - } - - /** - *

- * buyButton_actionPerformed. - *

- * - * @param e - * a {@link java.awt.event.ActionEvent} object. - */ - 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 - - /** - *

- * sellButton_actionPerformed. - *

- * - * @param e - * a {@link java.awt.event.ActionEvent} object. - */ - 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); - - long price = (long) (multi * c.getValue()); - if (questData.getWin() <= 50 && price > 500) - price = 500; - - questData.addCredits(price); - questData.removeCard(c); - - creditsLabel.setText("Total credits: " + questData.getCredits()); - - // remove sold cards from all decks: - java.util.List deckNames = questData.getDeckNames(); - for (String deckName : deckNames) { - Deck deck = questData.getDeck(deckName); - if (deck.getMain().contains(c.getName())) { - // count occurences: - int cardPoolCount = 0; - java.util.List cpList = questData.getCards(); - while (cpList.contains(c.getName())) { - cpList.remove(cpList.indexOf(c.getName())); - cardPoolCount++; - } - if (cardPoolCount < 4) - deck.removeMain(c); - } - } - - // 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 - - /** - *

- * stats_actionPerformed. - *

- * - * @param list - * a {@link forge.CardList} object. - */ - @SuppressWarnings("unused") - // stats_actionPerformed - private void stats_actionPerformed(CardList list) { - - } - - /* - * //refresh Gui from deck, Gui shows the cards in the deck - *//** - *

- * refreshGui. - *

- */ - /* - * @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.getCardFactory().getCard(deck.getMain(i), - * AllZone.getHumanPlayer()); - * - * //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.getCardFactory().getCard(deck.getSideboard(i), - * AllZone.getHumanPlayer()); c.setRarity(pack.getRarity(c.getName())); - * topModel.addCard(c); } } else { - * - * Braids: "getAllCards copies the entire array, but that does not seem to - * be needed here. Significant performance improvement is possible if this - * code used getCards instead (along with a for each loop instead of using - * get(i), if applicable)." - * - * CardList all = AllZone.getCardFactory().getAllCards(); for (int i = 0; i - * < all.size(); i++) topModel.addCard(all.get(i)); } - * - * topModel.resort(); bottomModel.resort(); }////refreshGui() - */ - -} diff --git a/src/forge/Gui_DeckEditor.java b/src/forge/Gui_DeckEditor.java deleted file mode 100644 index 3490d836089..00000000000 --- a/src/forge/Gui_DeckEditor.java +++ /dev/null @@ -1,1374 +0,0 @@ -package forge; - -import java.awt.Color; -import java.awt.Component; -import java.awt.Container; -import java.awt.Font; -import java.awt.Frame; -import java.awt.GridLayout; -import java.awt.Image; -import java.awt.Point; -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.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.Random; - -import javax.swing.BorderFactory; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JFileChooser; -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.JTextField; -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 javax.swing.event.TableModelEvent; -import javax.swing.event.TableModelListener; -import javax.swing.filechooser.FileFilter; - -import net.miginfocom.swing.MigLayout; -import arcane.ui.CardPanel; -import arcane.ui.ViewPanel; -import forge.deck.Deck; -import forge.error.ErrorViewer; -import forge.gui.game.CardDetailPanel; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - -/** - *

- * Gui_DeckEditor class. - *

- * - * @author Forge - * @version $Id: $ - */ -public class Gui_DeckEditor extends JFrame implements CardContainer, DeckDisplay, NewConstants { - /** Constant serialVersionUID=130339644136746796L */ - private static final long serialVersionUID = 130339644136746796L; - - Gui_DeckEditor_Menu customMenu; - public Gui_ProgressBarWindow gPBW = new Gui_ProgressBarWindow(); - - // private ImageIcon upIcon = Constant.IO.upIcon; - // private ImageIcon downIcon = Constant.IO.downIcon; - - private TableModel topModel; - private TableModel bottomModel; - - private JScrollPane jScrollPane1 = new JScrollPane(); - private JScrollPane jScrollPane2 = new JScrollPane(); - private JButton removeButton = new JButton(); - @SuppressWarnings("unused") - // border1 - private Border border1; - private TitledBorder titledBorder1; - private Border border2; - private TitledBorder titledBorder2; - private JButton addButton = new JButton(); - private JButton analysisButton = new JButton(); - private JButton changePictureButton = new JButton(); - private JButton removePictureButton = new JButton(); - private JLabel statsLabel = new JLabel(); - 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 statsLabel2 = new JLabel(); - private JLabel jLabel1 = new JLabel(); - - private JLabel jLabel2 = new JLabel(); - private JLabel jLabel3 = new JLabel(); - - private JLabel jLabel4 = new JLabel(); - - /* - * public JCheckBox whiteCheckBox = new JCheckBox("W", true); public - * JCheckBox blueCheckBox = new JCheckBox("U", true); public JCheckBox - * blackCheckBox = new JCheckBox("B", true); public JCheckBox redCheckBox = - * new JCheckBox("R", true); public JCheckBox greenCheckBox = new - * JCheckBox("G", true); public JCheckBox colorlessCheckBox = new - * JCheckBox("C", true); - * - * public JCheckBox landCheckBox = new JCheckBox("Land", true); public - * JCheckBox creatureCheckBox = new JCheckBox("Creature", true); public - * JCheckBox sorceryCheckBox = new JCheckBox("Sorcery", true); public - * JCheckBox instantCheckBox = new JCheckBox("Instant", true); public - * JCheckBox planeswalkerCheckBox = new JCheckBox("Planeswalker", true); - * public JCheckBox artifactCheckBox = new JCheckBox("Artifact", true); - * public JCheckBox enchantmentCheckBox = new JCheckBox("Enchantment", - * true); - */ - - public JCheckBox whiteCheckBox = new GuiFilterCheckBox("white", "White"); - public JCheckBox blueCheckBox = new GuiFilterCheckBox("blue", "Blue"); - public JCheckBox blackCheckBox = new GuiFilterCheckBox("black", "Black"); - public JCheckBox redCheckBox = new GuiFilterCheckBox("red", "Red"); - public JCheckBox greenCheckBox = new GuiFilterCheckBox("green", "Green"); - public JCheckBox colorlessCheckBox = new GuiFilterCheckBox("colorless", "Colorless"); - - public JCheckBox landCheckBox = new GuiFilterCheckBox("land", "Land"); - public JCheckBox creatureCheckBox = new GuiFilterCheckBox("creature", "Creature"); - public JCheckBox sorceryCheckBox = new GuiFilterCheckBox("sorcery", "Sorcery"); - public JCheckBox instantCheckBox = new GuiFilterCheckBox("instant", "Instant"); - public JCheckBox planeswalkerCheckBox = new GuiFilterCheckBox("planeswalker", "Planeswalker"); - public JCheckBox artifactCheckBox = new GuiFilterCheckBox("artifact", "Artifact"); - public JCheckBox enchantmentCheckBox = new GuiFilterCheckBox("enchant", "Enchantment"); - - /* CHOPPIC */ - public JButton filterButton = new JButton(); - private JTextField searchTextField = new JTextField(); - /* CHOPPIC */ - - private JTextField searchTextField2 = new JTextField(); - private JTextField searchTextField3 = new JTextField(); - private JComboBox searchSetCombo = new JComboBox(); - private JButton clearFilterButton = new JButton(); - - private CardList top; - private CardList bottom; - public Card cCardHQ; - /** Constant previousDirectory */ - private static File previousDirectory = null; - - private CardDetailPanel detail = new CardDetailPanel(null); - private CardPanel picture = new CardPanel(null); - private ViewPanel pictureViewPanel = new ViewPanel(); - private JPanel glassPane; - - /** {@inheritDoc} */ - @Override - public void setTitle(String message) { - super.setTitle(message); - } - - /** {@inheritDoc} */ - public void updateDisplay(CardList top, CardList bottom) { - this.top = top; - this.bottom = bottom; - - topModel.clear(); - bottomModel.clear(); - - top = AllZone.getNameChanger().changeCardsIfNeeded(top); - bottom = AllZone.getNameChanger().changeCardsIfNeeded(bottom); - - Card c; - String cardName; - ReadBoosterPack pack = new ReadBoosterPack(); - - if (gPBW.isVisible()) - gPBW.setProgressRange(0, top.size() + bottom.size()); - - // update top - for (int i = 0; i < top.size(); i++) { - if (gPBW.isVisible()) - gPBW.increment(); - - c = top.get(i); - - // add rarity to card if this is a sealed card pool - - cardName = AllZone.getNameChanger().getOriginalName(c.getName()); - if (!pack.getRarity(cardName).equals("error")) { - c.setRarity(pack.getRarity(cardName)); - } - - boolean filteredOut = filterByColor(c); - - if (!filteredOut) { - filteredOut = filterByType(c); - } - - // String PC = c.getSVar("PicCount"); - Random r = MyRandom.random; - // int n = 0; - // if (!PC.equals("")) { - // if (PC.matches("[0-9][0-9]?")) - // n = Integer.parseInt(PC); - // if (n > 1) - // c.setRandomPicture(r.nextInt(n)); - // } - - if (c.getCurSetCode().equals("")) - c.setCurSetCode(c.getMostRecentSet()); - - if (!c.getCurSetCode().equals("")) { - int n = SetInfoUtil.getSetInfo_Code(c.getSets(), c.getCurSetCode()).PicCount; - if (n > 1) - c.setRandomPicture(r.nextInt(n - 1) + 1); - - c.setImageFilename(CardUtil.buildFilename(c)); - } - - if (!filteredOut) { - topModel.addCard(c); - } - }// for - - // update bottom - for (int i = 0; i < bottom.size(); i++) { - if (gPBW.isVisible()) - gPBW.increment(); - - 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())); - - // String PC = c.getSVar("PicCount"); - Random r = MyRandom.random; - // int n = 0; - // if (!PC.equals("")) { - // if (PC.matches("[0-9][0-9]?")) - // n = Integer.parseInt(PC); - // if (n > 1) - // c.setRandomPicture(r.nextInt(n)); - // } - - if (c.getCurSetCode().equals("")) - c.setCurSetCode(c.getMostRecentSet()); - - if (!c.getCurSetCode().equals("")) { - int n = SetInfoUtil.getSetInfo_Code(c.getSets(), c.getCurSetCode()).PicCount; - if (n > 1) - c.setRandomPicture(r.nextInt(n - 1) + 1); - - c.setImageFilename(CardUtil.buildFilename(c)); - } - - bottomModel.addCard(c); - }// for - - if (gPBW.isVisible()) - gPBW.setTitle("Sorting Deck Editor"); - topModel.resort(); - topTable.repaint(); - bottomModel.resort(); - bottomTable.repaint(); - }// updateDisplay - - /** - *

- * updateDisplay. - *

- */ - public void updateDisplay() { - // updateDisplay(this.top, this.bottom); - - topModel.clear(); - - top = AllZone.getNameChanger().changeCardsIfNeeded(top); - bottom = AllZone.getNameChanger().changeCardsIfNeeded(bottom); - - 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.getNameChanger().getOriginalName(c.getName()); - if (!pack.getRarity(cardName).equals("error")) { - c.setRarity(pack.getRarity(cardName)); - } - - boolean filteredOut = filterByColor(c); - - if (!filteredOut) { - filteredOut = filterByType(c); - } - - if (!filteredOut) { - filteredOut = filterByName(c); - } - - if (!filteredOut) { - filteredOut = filterByCardType(c); - } - - if (!filteredOut) { - filteredOut = filterByCardDescription(c); - } - - if (!filteredOut) { - filteredOut = filterByCardSetCode(c); - } - - if (!filteredOut) { - topModel.addCard(c); - } - }// for - - topModel.resort(); - } - - /* CHOPPIC */ - /** - *

- * filterByName. - *

- * - * @param c - * a {@link forge.Card} object. - * @return a boolean. - */ - private boolean filterByName(Card c) { - boolean filterOut = false; - filterOut = !(c.getName().toLowerCase().contains(searchTextField.getText().toLowerCase())); - return filterOut; - } - - /* CHOPPIC */ - - /** - *

- * filterByCardType. - *

- * - * @param c - * a {@link forge.Card} object. - * @return a boolean. - */ - private boolean filterByCardType(Card c) { - boolean filterOut = false; - if (!(searchTextField2.getText() == "")) { - filterOut = !(c.getType().toString().toLowerCase().contains(searchTextField2.getText().toLowerCase())); - } - return filterOut; - } - - /** - *

- * filterByCardDescription. - *

- * - * @param c - * a {@link forge.Card} object. - * @return a boolean. - */ - private boolean filterByCardDescription(Card c) { - boolean filterOut = false; - if (!(searchTextField3.getText() == "")) { - filterOut = !(c.getText().toString().toLowerCase().contains(searchTextField3.getText().toLowerCase())); - } - return filterOut; - } - - /** - *

- * filterByCardSetCode. - *

- * - * @param c - * a {@link forge.Card} object. - * @return a boolean. - */ - private boolean filterByCardSetCode(Card c) { - boolean filterOut = false; - String SC = ""; - - if (!(searchSetCombo.getSelectedItem().toString().equals(""))) { - SC = SetInfoUtil.getSetCode3_SetName(searchSetCombo.getSelectedItem().toString()); - - boolean result = false; - - if (SetInfoUtil.getSetInfo_Code(c.getSets(), SC) != null) { - c.setCurSetCode(SC); - - Random r = MyRandom.random; - int n = SetInfoUtil.getSetInfo_Code(c.getSets(), SC).PicCount; - if (n > 1) - c.setRandomPicture(r.nextInt(n - 1) + 1); - - result = true; - } - filterOut = !(result); - } else { - SC = c.getMostRecentSet(); - if (!SC.equals("")) - c.setCurSetCode(c.getMostRecentSet()); - } - - c.setImageFilename(CardUtil.buildFilename(c)); - - return filterOut; - } - - /** - *

- * filterByColor. - *

- * - * @param c - * a {@link forge.Card} object. - * @return a boolean. - */ - private boolean filterByColor(Card c) { - boolean filterOut = false; - - if (!whiteCheckBox.isSelected()) { - if (CardUtil.getColors(c).contains(Constant.Color.White)) { - filterOut = true; - } - } - - if (!blueCheckBox.isSelected()) { - if (CardUtil.getColors(c).contains(Constant.Color.Blue)) { - filterOut = true; - } - } - - if (!blackCheckBox.isSelected()) { - if (CardUtil.getColors(c).contains(Constant.Color.Black)) { - filterOut = true; - } - } - - if (!redCheckBox.isSelected()) { - if (CardUtil.getColors(c).contains(Constant.Color.Red)) { - filterOut = true; - } - } - - if (!greenCheckBox.isSelected()) { - if (CardUtil.getColors(c).contains(Constant.Color.Green)) { - filterOut = true; - } - } - - if (!colorlessCheckBox.isSelected()) { - if (CardUtil.getColors(c).contains(Constant.Color.Colorless)) { - filterOut = true; - } - } - - return filterOut; - } - - /** - *

- * filterByType. - *

- * - * @param c - * a {@link forge.Card} object. - * @return a boolean. - */ - private boolean filterByType(Card c) { - boolean filterOut = false; - - if (!landCheckBox.isSelected() && c.isLand()) { - filterOut = true; - } - - if (!creatureCheckBox.isSelected() && c.isCreature()) { - filterOut = true; - } - - if (!sorceryCheckBox.isSelected() && c.isSorcery()) { - filterOut = true; - } - - if (!instantCheckBox.isSelected() && c.isInstant()) { - filterOut = true; - } - - if (!planeswalkerCheckBox.isSelected() && c.isPlaneswalker()) { - filterOut = true; - } - - if (!artifactCheckBox.isSelected() && c.isArtifact()) { - filterOut = true; - } - - if (!enchantmentCheckBox.isSelected() && c.isEnchantment()) { - filterOut = true; - } - - return filterOut; - } - - // top shows available card pool - // if constructed, top shows all cards - // if sealed, top shows 5 booster packs - // if draft, top shows cards that were chosen - - /** - *

- * getTopTableModel. - *

- * - * @return a {@link forge.TableModel} object. - */ - public TableModel getTopTableModel() { - return topModel; - } - - /** - *

- * Getter for the field top. - *

- * - * @return a {@link forge.CardList} object. - */ - public CardList getTop() { - return topModel.getCards(); - } - - // bottom shows cards that the user has chosen for his library - /** - *

- * Getter for the field bottom. - *

- * - * @return a {@link forge.CardList} object. - */ - public CardList getBottom() { - return bottomModel.getCards(); - } - - /** - *

- * show. - *

- * - * @param exitCommand - * a {@link forge.Command} object. - */ - public void show(final Command exitCommand) { - final Command exit = new Command() { - private static final long serialVersionUID = 5210924838133689758L; - - public void execute() { - Gui_DeckEditor.this.dispose(); - exitCommand.execute(); - } - }; - - // pm = new ProgressMonitor(this, "Loading Deck Editor", "", 0, 20000); - gPBW.setTitle("Loading Deck Editor"); - gPBW.setVisible(true); - - customMenu = new Gui_DeckEditor_Menu(this, exit); - 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 - if (Constant.Runtime.GameType[0].equals(Constant.GameType.Constructed)) - customMenu.newConstructed(); - - topModel.sort(1, true); - bottomModel.sort(1, true); - - gPBW.dispose(); - }// show(Command) - - /** - *

- * addListeners. - *

- */ - 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() - - /** - *

- * setup. - *

- */ - private void setup() { - addListeners(); - - // construct topTable, get all cards - topModel = new TableModel(new CardList(), this); - topModel.addListeners(topTable); - - topTable.setModel(topModel); - topModel.resizeCols(topTable); - - // construct bottomModel - bottomModel = new TableModel(this); - bottomModel.addListeners(bottomTable); - - bottomTable.setModel(bottomModel); - topModel.resizeCols(bottomTable); - - // get stats from deck - bottomModel.addTableModelListener(new TableModelListener() { - public void tableChanged(TableModelEvent ev) { - CardList deck = bottomModel.getCards(); - statsLabel.setText(getStats(deck)); - } - }); - - // get stats from all cards - topModel.addTableModelListener(new TableModelListener() { - public void tableChanged(TableModelEvent ev) { - CardList deck = topModel.getCards(); - statsLabel2.setText(getStats(deck)); - } - }); - - // 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); - - // This was an attempt to limit the width of the deck editor to 1400 - // pixels. - /* - * setSize(1024, 740); Rectangle bounds = getBounds(); Dimension screen - * = getToolkit().getScreenSize(); int maxWidth; - * - * if (screen.width >= 1400) { maxWidth = 1400; } else { maxWidth = - * screen.width; } bounds.width = maxWidth; bounds.height = - * screen.height; - * - * setMaximizedBounds(bounds); - */ - }// setupAndDisplay() - - /** - *

- * getStats. - *

- * - * @param deck - * a {@link forge.CardList} object. - * @return a {@link java.lang.String} object. - */ - private String getStats(CardList deck) { - int total = deck.size(); - int creature = deck.getType("Creature").size(); - int land = deck.getType("Land").size(); - - StringBuffer show = new StringBuffer(); - show.append("Total: ").append(total).append(", Creatures: ").append(creature).append(", Land: ").append(land); - String[] color = Constant.Color.Colors; - for (int i = 0; i < 5; i++) - show.append(", ").append(color[i]).append(": ").append(CardListUtil.getColor(deck, color[i]).size()); - - return show.toString(); - }// getStats() - - /** - *

- * Constructor for Gui_DeckEditor. - *

- */ - public Gui_DeckEditor() { - try { - jbInit(); - } catch (Exception ex) { - ErrorViewer.showError(ex); - } - } - - /** - *

- * getCard. - *

- * - * @return a {@link forge.Card} object. - */ - public Card getCard() { - return detail.getCard(); - } - - /** {@inheritDoc} */ - public void setCard(Card card) { - detail.setCard(card); - picture.setCard(card); - } - - /** - *

- * jbInit. - *

- * - * @throws java.lang.Exception - * if any. - */ - 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, "Deck"); - this.getContentPane().setLayout(null); - String tableToolTip = "Click on the column name (like name or color) to sort the cards"; - jScrollPane1.setBorder(titledBorder1); - jScrollPane1.setToolTipText(tableToolTip); - jScrollPane2.setBorder(titledBorder2); - jScrollPane2.setToolTipText(tableToolTip); - // removeButton.setIcon(upIcon); - if (!Gui_NewGame.useLAFFonts.isSelected()) - removeButton.setFont(new java.awt.Font("Dialog", 0, 13)); - removeButton.setText("Remove from Deck"); - removeButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - removeButton_actionPerformed(e); - } - }); - addButton.setText("Add to Deck"); - addButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - addButton_actionPerformed(e); - } - }); - // addButton.setIcon(downIcon); - if (!Gui_NewGame.useLAFFonts.isSelected()) - addButton.setFont(new java.awt.Font("Dialog", 0, 13)); - - /* CHOPPIC */ - filterButton.setText("Apply Filter"); - filterButton.setToolTipText("Pressing the \"return\" key will activate this button"); - filterButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - filterButton_actionPerformed(e); - } - }); - if (!Gui_NewGame.useLAFFonts.isSelected()) - filterButton.setFont(new java.awt.Font("Dialog", 0, 13)); - /* CHOPPIC */ - - clearFilterButton.setText("Clear Filter"); - clearFilterButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - clearFilterButton_actionPerformed(e); - } - }); - if (!Gui_NewGame.useLAFFonts.isSelected()) - clearFilterButton.setFont(new java.awt.Font("Dialog", 0, 13)); - - analysisButton.setText("Deck Analysis"); - analysisButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - analysisButton_actionPerformed(e); - } - }); - if (!Gui_NewGame.useLAFFonts.isSelected()) - analysisButton.setFont(new java.awt.Font("Dialog", 0, 13)); - - changePictureButton.setText("Change picture..."); - changePictureButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - changePictureButton_actionPerformed(e); - } - }); - if (!Gui_NewGame.useLAFFonts.isSelected()) - changePictureButton.setFont(new java.awt.Font("Dialog", 0, 10)); - - removePictureButton.setText("Remove picture..."); - removePictureButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - removePictureButton_actionPerformed(e); - } - }); - if (!Gui_NewGame.useLAFFonts.isSelected()) - removePictureButton.setFont(new java.awt.Font("Dialog", 0, 10)); - - /** - * Type filtering - */ - Font f = new Font("Tahoma", Font.PLAIN, 10); - if (!Gui_NewGame.useLAFFonts.isSelected()) - landCheckBox.setFont(f); - landCheckBox.setOpaque(false); - if (!Gui_NewGame.useLAFFonts.isSelected()) - creatureCheckBox.setFont(f); - creatureCheckBox.setOpaque(false); - if (!Gui_NewGame.useLAFFonts.isSelected()) - sorceryCheckBox.setFont(f); - sorceryCheckBox.setOpaque(false); - if (!Gui_NewGame.useLAFFonts.isSelected()) - instantCheckBox.setFont(f); - instantCheckBox.setOpaque(false); - if (!Gui_NewGame.useLAFFonts.isSelected()) - planeswalkerCheckBox.setFont(f); - planeswalkerCheckBox.setOpaque(false); - if (!Gui_NewGame.useLAFFonts.isSelected()) - artifactCheckBox.setFont(f); - artifactCheckBox.setOpaque(false); - if (!Gui_NewGame.useLAFFonts.isSelected()) - enchantmentCheckBox.setFont(f); - enchantmentCheckBox.setOpaque(false); - - /** - * Color filtering - */ - whiteCheckBox.setOpaque(false); - blueCheckBox.setOpaque(false); - blackCheckBox.setOpaque(false); - redCheckBox.setOpaque(false); - greenCheckBox.setOpaque(false); - colorlessCheckBox.setOpaque(false); - - // picture.addMouseListener(new CustomListener()); - if (!Gui_NewGame.useLAFFonts.isSelected()) - statsLabel.setFont(new java.awt.Font("Dialog", 0, 13)); - statsLabel.setText("Total: 0, Creatures: 0, Land: 0"); - // Do not lower statsLabel any lower, we want this to be visible at 1024 - // x 768 screen size - this.setTitle("Deck Editor"); - jScrollPane3.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - jPanel3.setLayout(gridLayout1); - gridLayout1.setColumns(1); - gridLayout1.setRows(0); - statsLabel2.setText("Total: 0, Creatures: 0, Land: 0"); - if (!Gui_NewGame.useLAFFonts.isSelected()) - statsLabel2.setFont(new java.awt.Font("Dialog", 0, 13)); - /* - * jLabel1.setText( - * "Click on the column name (like name or color) to sort the cards"); - */ - - pictureViewPanel.setCardPanel(picture); - - this.getContentPane().setLayout(new MigLayout("fill")); - - // this.getContentPane().add(landCheckBox, - // "cell 0 0, egx checkbox, split 16"); - this.getContentPane().add(landCheckBox, "cell 0 0, egx checkbox, grow, split 15"); - this.getContentPane().add(creatureCheckBox, "grow"); - this.getContentPane().add(sorceryCheckBox, "grow"); - this.getContentPane().add(instantCheckBox, "grow"); - this.getContentPane().add(planeswalkerCheckBox, "grow"); - this.getContentPane().add(artifactCheckBox, "grow"); - this.getContentPane().add(enchantmentCheckBox, "grow"); - - this.getContentPane().add(whiteCheckBox, "grow"); - this.getContentPane().add(blueCheckBox, "grow"); - this.getContentPane().add(blackCheckBox, "grow"); - this.getContentPane().add(redCheckBox, "grow"); - this.getContentPane().add(greenCheckBox, "grow"); - this.getContentPane().add(colorlessCheckBox, "grow"); - - this.getContentPane().add(filterButton, "wmin 100, hmin 25, wmax 140, hmax 25, grow"); - this.getContentPane().add(clearFilterButton, "wmin 100, hmin 25, wmax 140, hmax 25, grow"); - - this.getContentPane().add(jScrollPane1, "cell 0 2 1 2, pushy, grow"); - // this.getContentPane().add(detail, "w 239, h 323, grow, flowy, wrap"); - this.getContentPane().add(detail, "w 239, h 323, cell 1 0 1 3, grow, flowy, wrap"); - // this.getContentPane().add(detail, - // "align 50% 50%, wmin 239, hmin 323, cell 1 0 1 2, flowy"); - this.getContentPane().add(changePictureButton, "align 50% 0%, cell 1 3, split 2, flowx"); - this.getContentPane().add(removePictureButton, "align 50% 0%, wrap"); - - jLabel1.setText("Name:"); - jLabel1.setToolTipText("Card names must include the text in this field"); - this.getContentPane().add(jLabel1, "cell 0 1, split 7"); - this.getContentPane().add(searchTextField, "wmin 100, grow"); - - jLabel2.setText("Type:"); - jLabel2.setToolTipText("Card types must include the text in this field"); - this.getContentPane().add(jLabel2, ""); - this.getContentPane().add(searchTextField2, "wmin 100, grow"); - jLabel3.setText("Text:"); - jLabel3.setToolTipText("Card descriptions must include the text in this field"); - this.getContentPane().add(jLabel3, ""); - this.getContentPane().add(searchTextField3, "wmin 200, grow"); - - searchSetCombo.removeAllItems(); - searchSetCombo.addItem(""); - for (int i = 0; i < SetInfoUtil.getSetNameList().size(); i++) - searchSetCombo.addItem(SetInfoUtil.getSetNameList().get(i)); - this.getContentPane().add(searchSetCombo, "wmin 150, grow"); - - this.getContentPane().add(statsLabel2, "cell 0 4"); - this.getContentPane().add(pictureViewPanel, "wmin 239, hmin 323, grow, cell 1 4 1 4"); - - this.getContentPane().add(addButton, "w 100, h 49, sg button, cell 0 5, split 4"); - this.getContentPane().add(removeButton, "w 100, h 49, sg button"); - - // jLabel4 is used to push the analysis button to the right - // This will separate this button from the add and remove card buttons - jLabel4.setText(""); - this.getContentPane().add(jLabel4, "wmin 100, grow"); - - this.getContentPane().add(analysisButton, "w 100, h 49, wrap"); - - this.getContentPane().add(jScrollPane2, "cell 0 6, grow"); - this.getContentPane().add(statsLabel, "cell 0 7"); - - 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); - - javax.swing.JRootPane rootPane = this.getRootPane(); - rootPane.setDefaultButton(filterButton); - } - - /** - *

- * addButton_actionPerformed. - *

- * - * @param e - * a {@link java.awt.event.ActionEvent} object. - */ - void addButton_actionPerformed(ActionEvent e) { - setTitle("Deck Editor : " + customMenu.getDeckName() + " : unsaved"); - - int n = topTable.getSelectedRow(); - if (n != -1) { - Card c = topModel.rowToCard(n); - - if (customMenu.getGameType().equals(Constant.GameType.Constructed)) { - Card newC = new Card(); - newC.setName(c.getName()); - newC.setColor(c.getColor()); - newC.setType(c.getType()); - newC.setManaCost(c.getManaCost()); - newC.setBaseAttack(c.getBaseAttack()); - newC.setBaseDefense(c.getBaseDefense()); - newC.setBaseLoyalty(c.getBaseLoyalty()); - newC.setRarity(c.getRarity()); - newC.setCurSetCode(c.getCurSetCode()); - newC.setImageFilename(c.getImageFilename()); - newC.setSets(c.getSets()); - newC.setText(c.getText()); - - bottomModel.addCard(newC); - bottomModel.resort(); - } else { - // if(!Constant.GameType.Constructed.equals(customMenu.getGameType())) - // { - bottomModel.addCard(c); - bottomModel.resort(); - - top.remove(c); - topModel.removeCard(c); - } - - // 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); - } - }// if(valid row) - }// addButton_actionPerformed - - /* CHOPPIC */ - /** - *

- * filterButton_actionPerformed. - *

- * - * @param e - * a {@link java.awt.event.ActionEvent} object. - */ - void filterButton_actionPerformed(ActionEvent e) { - updateDisplay(); - } - - /* CHOPPIC */ - - /** - *

- * clearFilterButton_actionPerformed. - *

- * - * @param e - * a {@link java.awt.event.ActionEvent} object. - */ - void clearFilterButton_actionPerformed(ActionEvent e) { - - if (!landCheckBox.isSelected()) - landCheckBox.doClick(); - if (!creatureCheckBox.isSelected()) - creatureCheckBox.doClick(); - if (!sorceryCheckBox.isSelected()) - sorceryCheckBox.doClick(); - if (!instantCheckBox.isSelected()) - instantCheckBox.doClick(); - if (!planeswalkerCheckBox.isSelected()) - planeswalkerCheckBox.doClick(); - if (!artifactCheckBox.isSelected()) - artifactCheckBox.doClick(); - if (!enchantmentCheckBox.isSelected()) - enchantmentCheckBox.doClick(); - - if (!whiteCheckBox.isSelected()) - whiteCheckBox.doClick(); - if (!blueCheckBox.isSelected()) - blueCheckBox.doClick(); - if (!blackCheckBox.isSelected()) - blackCheckBox.doClick(); - if (!redCheckBox.isSelected()) - redCheckBox.doClick(); - if (!greenCheckBox.isSelected()) - greenCheckBox.doClick(); - if (!colorlessCheckBox.isSelected()) - colorlessCheckBox.doClick(); - - searchTextField.setText(""); - searchTextField2.setText(""); - searchTextField3.setText(""); - searchSetCombo.setSelectedIndex(0); - - updateDisplay(); - }// clearFilterButton_actionPerformed - - /** - *

- * analysisButton_actionPerformed. - *

- * - * @param e - * a {@link java.awt.event.ActionEvent} object. - */ - void analysisButton_actionPerformed(ActionEvent e) { - - if (bottomModel.getRowCount() == 0) { - JOptionPane.showMessageDialog(null, "Cards in deck not found.", "Analysis Deck", - JOptionPane.INFORMATION_MESSAGE); - } else { - Gui_DeckEditor g = Gui_DeckEditor.this; - GUI_DeckAnalysis dAnalysis = new GUI_DeckAnalysis(g, bottomModel); - dAnalysis.setVisible(true); - g.setEnabled(false); - } - } - - /** - *

- * changePictureButton_actionPerformed. - *

- * - * @param e - * a {@link java.awt.event.ActionEvent} object. - */ - void changePictureButton_actionPerformed(ActionEvent e) { - if (cCardHQ != null) { - File file = getImportFilename(); - if (file != null) { - String fileName = GuiDisplayUtil.cleanString(cCardHQ.getName()) + ".jpg"; - File base = ForgeProps.getFile(IMAGE_BASE); - File f = new File(base, fileName); - f.delete(); - - try { - - f.createNewFile(); - FileOutputStream fos = new FileOutputStream(f); - FileInputStream fis = new FileInputStream(file); - byte[] buff = new byte[32 * 1024]; - int length; - while (fis.available() > 0) { - length = fis.read(buff); - if (length > 0) - fos.write(buff, 0, length); - } - fos.flush(); - fis.close(); - fos.close(); - setCard(cCardHQ); - - } catch (IOException e1) { - e1.printStackTrace(); - } - - } - } - } - - /** - *

- * getImportFilename. - *

- * - * @return a {@link java.io.File} object. - */ - private File getImportFilename() { - JFileChooser chooser = new JFileChooser(previousDirectory); - ImagePreviewPanel preview = new ImagePreviewPanel(); - chooser.setAccessory(preview); - chooser.addPropertyChangeListener(preview); - chooser.addChoosableFileFilter(dckFilter); - int returnVal = chooser.showOpenDialog(null); - - if (returnVal == JFileChooser.APPROVE_OPTION) { - File file = chooser.getSelectedFile(); - previousDirectory = file.getParentFile(); - return file; - } - - return null; - - } - - private FileFilter dckFilter = new FileFilter() { - - @Override - public boolean accept(File f) { - return f.getName().endsWith(".jpg") || f.isDirectory(); - } - - @Override - public String getDescription() { - return "*.jpg"; - } - - }; - - /** - *

- * removePictureButton_actionPerformed. - *

- * - * @param e - * a {@link java.awt.event.ActionEvent} object. - */ - void removePictureButton_actionPerformed(ActionEvent e) { - if (cCardHQ != null) { - String options[] = { "Yes", "No" }; - int value = JOptionPane.showOptionDialog(null, "Do you want delete " + cCardHQ.getName() + " picture?", - "Delete picture", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, - options[1]); - if (value == 0) { - String fileName = GuiDisplayUtil.cleanString(cCardHQ.getName()) + ".jpg"; - File base = ForgeProps.getFile(IMAGE_BASE); - File f = new File(base, fileName); - f.delete(); - JOptionPane.showMessageDialog(null, "Picture " + cCardHQ.getName() + " deleted.", "Delete picture", - JOptionPane.INFORMATION_MESSAGE); - setCard(cCardHQ); - } - } - - } - - /** - *

- * removeButton_actionPerformed. - *

- * - * @param e - * a {@link java.awt.event.ActionEvent} object. - */ - void removeButton_actionPerformed(ActionEvent e) { - setTitle("Deck Editor : " + customMenu.getDeckName() + " : unsaved"); - - int n = bottomTable.getSelectedRow(); - if (n != -1) { - Card c = bottomModel.rowToCard(n); - bottomModel.removeCard(c); - - if (!Constant.GameType.Constructed.equals(customMenu.getGameType())) { - topModel.addCard(c); - topModel.resort(); - } - - // 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) - }// - - /** - *

- * stats_actionPerformed. - *

- * - * @param list - * a {@link forge.CardList} object. - */ - @SuppressWarnings("unused") - // stats_actionPerformed - private void stats_actionPerformed(CardList list) { - - } - - // refresh Gui from deck, Gui shows the cards in the deck - /** - *

- * refreshGui. - *

- */ - @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.getCardFactory().getCard(deck.getMain(i), AllZone.getHumanPlayer()); - - // 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.getCardFactory().getCard(deck.getSideboard(i), AllZone.getHumanPlayer()); - // c.setRarity(pack.getRarity(c.getName())); - topModel.addCard(c); - } - } else { - for (Card loopCard : AllZone.getCardFactory()) { - topModel.addCard(loopCard); - c = loopCard; // this might not be necessary - } - } - - topModel.resort(); - bottomModel.resort(); - } // //refreshGui() - - /* CHOPPIC */ - - // public class CustomListener extends MouseAdapter { - // reenable - // public void mouseEntered(MouseEvent e) { - // - // if(picturePanel.getComponentCount() != 0) { - // - // if(GuiDisplayUtil.IsPictureHQExists(cCardHQ)) { - // int cWidth = 0; - // try { - // cWidth = GuiDisplayUtil.getPictureHQwidth(cCardHQ); - // } catch(IOException e2) { - // // TODO Auto-generated catch block - // e2.printStackTrace(); - // } - // int cHeight = 0; - // try { - // cHeight = GuiDisplayUtil.getPictureHQheight(cCardHQ); - // } catch(IOException e2) { - // // Auto-generated catch block - // e2.printStackTrace(); - // } - // - // if(cWidth >= 312 && cHeight >= 445) { - // if(hq == null) { - // hq = new GUI_PictureHQ(Gui_DeckEditor.this, cCardHQ); - // } - // try { - // hq.letsGo(Gui_DeckEditor.this, cCardHQ); - // } catch(IOException e1) { - // e1.printStackTrace(); - // } - // } - // - // } - // } - // - // } - // } - -} diff --git a/src/forge/Gui_DeckEditor_Menu.java b/src/forge/Gui_DeckEditor_Menu.java deleted file mode 100644 index 9174ab48532..00000000000 --- a/src/forge/Gui_DeckEditor_Menu.java +++ /dev/null @@ -1,1596 +0,0 @@ -package forge; - - -import forge.deck.Deck; -import forge.deck.DeckManager; -import forge.deck.DownloadDeck; -import forge.deck.generate.GenerateConstructedDeck; -import forge.error.BugzReporter; -import forge.error.ErrorViewer; -import forge.gui.GuiUtils; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; -import forge.properties.NewConstants.LANG.Gui_DownloadPictures.ERRORS; - -import javax.swing.*; -import javax.swing.filechooser.FileFilter; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.*; -import java.net.Proxy; -import java.net.URL; -import java.nio.channels.FileChannel; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -//import java.util.HashMap; -//import java.util.Map; - -/** - *

Gui_DeckEditor_Menu class.

- * - * @author Forge - * @version $Id: $ - */ -public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { - - /** Constant serialVersionUID=-4037993759604768755L */ - private static final long serialVersionUID = -4037993759604768755L; - - //used by importConstructed() and exportConstructected() - /** Constant previousDirectory */ - private static File previousDirectory = null; - - - /** Constant debugPrint=false */ - private static final boolean debugPrint = false; - - //private final DeckManager deckManager = new DeckManager(ForgeProps.getFile(NEW_DECKS)); - private DeckManager deckManager = AllZone.getDeckManager(); - - //with the new IO, there's no reason to use different instances - - private boolean isDeckSaved; - - private String currentDeckName; - private String currentGameType; - private String currentDeckPlayerType; - - /** - *

Setter for the field currentGameType.

- * - * @param gameType a {@link java.lang.String} object. - * @since 1.0.15 - */ - public void setCurrentGameType(String gameType) { - currentGameType = gameType; - } - - //private JMenuItem newDraftItem; - private DeckDisplay deckDisplay; - - private Command exitCommand; - - - /** - *

Constructor for Gui_DeckEditor_Menu.

- * - * @param in_display a {@link forge.DeckDisplay} object. - * @param exit a {@link forge.Command} object. - */ - public Gui_DeckEditor_Menu(DeckDisplay in_display, Command exit) { - deckDisplay = in_display; - exitCommand = exit; - - //this is added just to make save() and saveAs() work ok - //when first started up, just a silly patch - currentGameType = Constant.GameType.Constructed; - setDeckData("", false); - - setupMenu(); - setupFilterMenu(); - setupSortMenu(); - - JMenu bugMenu = new JMenu("Report Bug"); - JMenuItem bugReport = new JMenuItem("Report Bug"); - bugReport.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - BugzReporter br = new BugzReporter(); - br.setVisible(true); - } - }); - bugMenu.add(bugReport); - this.add(bugMenu); - } - - /** - *

setupFilterMenu.

- */ - private void setupFilterMenu() { - JMenuItem filter = new JMenuItem("New filter"); - JMenuItem clearfilter = new JMenuItem("Clear filter"); - JMenu menu = new JMenu("Filter"); - menu.add(filter); - menu.add(clearfilter); - this.add(menu); - - filter.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - Gui_DeckEditor g = (Gui_DeckEditor) deckDisplay; - GUI_Filter filt = new GUI_Filter(g, deckDisplay); - g.setEnabled(false); - filt.setVisible(true); - } - }); - clearfilter.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - - //CardList all = AllZone.getCardFactory().getAllCards(); - //deckDisplay.updateDisplay(all, deckDisplay.getBottom()); - deckDisplay.updateDisplay(deckDisplay.getTop(), deckDisplay.getBottom()); - Gui_DeckEditor g = (Gui_DeckEditor) deckDisplay; - g.blackCheckBox.setSelected(true); - g.blackCheckBox.setEnabled(true); - g.blueCheckBox.setSelected(true); - g.blueCheckBox.setEnabled(true); - g.greenCheckBox.setSelected(true); - g.greenCheckBox.setEnabled(true); - g.redCheckBox.setSelected(true); - g.redCheckBox.setEnabled(true); - g.whiteCheckBox.setSelected(true); - g.whiteCheckBox.setEnabled(true); - g.colorlessCheckBox.setSelected(true); - g.colorlessCheckBox.setEnabled(true); - g.artifactCheckBox.setSelected(true); - g.artifactCheckBox.setEnabled(true); - g.creatureCheckBox.setSelected(true); - g.creatureCheckBox.setEnabled(true); - g.enchantmentCheckBox.setSelected(true); - g.enchantmentCheckBox.setEnabled(true); - g.instantCheckBox.setSelected(true); - g.instantCheckBox.setEnabled(true); - g.landCheckBox.setSelected(true); - g.landCheckBox.setEnabled(true); - g.planeswalkerCheckBox.setSelected(true); - g.planeswalkerCheckBox.setEnabled(true); - g.sorceryCheckBox.setSelected(true); - g.sorceryCheckBox.setEnabled(true); - - } - }); - - } - - - /** - *

setupSortMenu.

- */ - private void setupSortMenu() { - JMenuItem name = new JMenuItem("Card Name"); - JMenuItem cost = new JMenuItem("Cost"); - JMenuItem color = new JMenuItem("Color"); - JMenuItem type = new JMenuItem("Type"); - JMenuItem stats = new JMenuItem("Power/Toughness"); - JMenuItem rarity = new JMenuItem("Rarity"); - JMenuItem newFirst = new JMenuItem("Most recently added"); - - JMenu menu = new JMenu("Sort By"); - menu.add(name); - menu.add(cost); - menu.add(color); - menu.add(type); - menu.add(stats); - menu.add(rarity); - - // menu.add(newFirst); - /* - * The "Most recently added" menu now causes an error exception. This will prevent - * this option from appearing in the "Sort By" menu. There may be a way (or not) - * to sort the indivudual card files by the date created or the date last modified. - */ - - this.add(menu); - - //add listeners - - - name.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - //index 1 sorts by card name - for more info see TableSorter - // 0 1 2 3 4 5 6 - //private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"}; - Gui_DeckEditor g = (Gui_DeckEditor) deckDisplay; - g.getTopTableModel().sort(1, true); - - } - }); - - cost.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - // 0 1 2 3 4 5 6 - //private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"}; - Gui_DeckEditor g = (Gui_DeckEditor) deckDisplay; - - //sort by type, color, cost - g.getTopTableModel().sort(4, true); - g.getTopTableModel().sort(3, true); - g.getTopTableModel().sort(2, true); - } - }); - - color.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - // 0 1 2 3 4 5 6 - //private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"}; - Gui_DeckEditor g = (Gui_DeckEditor) deckDisplay; - - //sort by type, cost, color - g.getTopTableModel().sort(4, true); - g.getTopTableModel().sort(2, true); - g.getTopTableModel().sort(3, true); - } - }); - - type.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - // 0 1 2 3 4 5 6 - //private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"}; - Gui_DeckEditor g = (Gui_DeckEditor) deckDisplay; - - //sort by cost, color, type - g.getTopTableModel().sort(2, true); - g.getTopTableModel().sort(3, true); - g.getTopTableModel().sort(4, true); - } - }); - - stats.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - // 0 1 2 3 4 5 6 - //private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"}; - Gui_DeckEditor g = (Gui_DeckEditor) deckDisplay; - - g.getTopTableModel().sort(4, true); - g.getTopTableModel().sort(2, true); - g.getTopTableModel().sort(3, true); - g.getTopTableModel().sort(5, true); - } - }); - - rarity.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - // 0 1 2 3 4 5 6 - //private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"}; - Gui_DeckEditor g = (Gui_DeckEditor) deckDisplay; - - //sort by cost, type, color, rarity - g.getTopTableModel().sort(2, true); - g.getTopTableModel().sort(4, true); - g.getTopTableModel().sort(3, true); - g.getTopTableModel().sort(6, true); - } - }); - - newFirst.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - // 0 1 2 3 4 5 6 - //private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"}; - Gui_DeckEditor g = (Gui_DeckEditor) deckDisplay; - - g.getTopTableModel().sort(99, true); - } - }); - - }//setupSortMenu() - - /** - *

populateShop.

- * - * @param shop a {@link forge.CardList} object. - * @param owned a {@link forge.CardList} object. - */ - public void populateShop(CardList shop, CardList owned) { - - deckDisplay.updateDisplay(shop, owned); - } - - /** - *

newConstructed.

- */ - public void newConstructed() { - if (debugPrint) { - System.out.println("New Constructed"); - } - -// if(! isDeckSaved) -// save(); - - currentGameType = Constant.GameType.Constructed; - setDeckData("", false); - - // This is an expensive heap operation. - CardList allCards = new CardList(AllZone.getCardFactory()); - deckDisplay.updateDisplay(allCards, new CardList()); - }//new constructed - - /** - *

newRandomConstructed.

- */ - private void newRandomConstructed() { - if (debugPrint) { - System.out.println("Random Constructed"); - } - -// if(! isDeckSaved) -// save(); - - currentGameType = Constant.GameType.Constructed; - setDeckData("", false); - - CardList random = new CardList(AllZone.getCardFactory().getRandomCombinationWithoutRepetition(15 * 5)); - - random.add(AllZone.getCardFactory().getCard("Forest", AllZone.getHumanPlayer())); - random.add(AllZone.getCardFactory().getCard("Island", AllZone.getHumanPlayer())); - random.add(AllZone.getCardFactory().getCard("Plains", AllZone.getHumanPlayer())); - random.add(AllZone.getCardFactory().getCard("Mountain", AllZone.getHumanPlayer())); - random.add(AllZone.getCardFactory().getCard("Swamp", AllZone.getHumanPlayer())); - - random.add(AllZone.getCardFactory().getCard("Terramorphic Expanse", AllZone.getHumanPlayer())); - - - deckDisplay.updateDisplay(random, new CardList()); - }//new sealed - - - /** - *

newGenerateConstructed.

- */ - private void newGenerateConstructed() { - if (debugPrint) { - System.out.println("Generate Constructed"); - } - -// if(! isDeckSaved) -// save(); - - currentGameType = Constant.GameType.Constructed; - setDeckData("", false); - - GenerateConstructedDeck gen = new GenerateConstructedDeck(); - - // This is an expensive heap operation. - CardList allCards = new CardList(AllZone.getCardFactory()); - deckDisplay.updateDisplay(allCards, gen.generateDeck()); - }//new sealed - - -/* private void newSealed() { - if (debugPrint) { - System.out.println("New Sealed"); - } - -// if(! isDeckSaved) -// save(); - - currentGameType = Constant.GameType.Sealed; - setDeckData("", false); - - deckDisplay.updateDisplay(new ReadBoosterPack().getBoosterPack5(), new CardList()); - }//new sealed -*/ -/* private void newDraft() { - if (debugPrint) { - System.out.println("New Draft"); - } - -// if(! isDeckSaved) -// save(); - - currentGameType = Constant.GameType.Draft; - - //move all cards from deck main and sideboard to CardList - Deck deck = deckManager.getDraftDeck(currentDeckName)[0]; - setDeckData("", false); - - CardList top = new CardList(); - - for (int i = 0; i < deck.countMain(); i++) { - String cardName = deck.getMain(i); - - if (cardName.contains("|")) { - String s[] = cardName.split("\\|", 2); - cardName = s[0]; - } - - top.add(AllZone.getCardFactory().getCard(cardName, AllZone.getHumanPlayer())); - } - - for (int i = 0; i < deck.countSideboard(); i++) { - String cardName = deck.getMain(i); - String setCode = ""; - if (cardName.contains("|")) { - String s[] = cardName.split("\\|", 2); - cardName = s[0]; - setCode = s[1]; - } - - top.add(AllZone.getCardFactory().getCard(cardName, AllZone.getHumanPlayer())); - } - - deckDisplay.updateDisplay(top, new CardList()); - }//new draft -*/ - - private FileFilter dckFilter = new FileFilter() { - @Override - public boolean accept(File f) { - return f.getName().endsWith(".dck") || f.isDirectory(); - } - - @Override - public String getDescription() { - return "Simple Deck File .dck"; - } - }; - - - /** - *

getImportFilename.

- * - * @return a {@link java.io.File} object. - */ - private File getImportFilename() { - JFileChooser chooser = new JFileChooser(previousDirectory); - - chooser.addChoosableFileFilter(dckFilter); - int returnVal = chooser.showOpenDialog(null); - - if (returnVal == JFileChooser.APPROVE_OPTION) { - File file = chooser.getSelectedFile(); - previousDirectory = file.getParentFile(); - return file; - } - - - return null; - - }//openFileDialog() - - /** - *

showDeck.

- * - * @param deck a {@link forge.deck.Deck} object. - */ - private void showDeck(Deck deck) { - String gameType = deck.getDeckType(); - - if (gameType.equals(Constant.GameType.Constructed)) { - showConstructedDeck(deck); - } - - if (gameType.equals(Constant.GameType.Draft)) { - showDraftDeck(deck); - } - - if (gameType.equals(Constant.GameType.Sealed)) { - showSealedDeck(deck); - } - }//showDeck() - - /** - *

importDeck.

- */ - private void importDeck() { - File file = getImportFilename(); - - if (file == null) { - } else if (file.getName().endsWith(".dck")) { - try { - FileChannel srcChannel = new FileInputStream(file).getChannel(); - File dst = new File(ForgeProps.getFile(NEW_DECKS).getAbsolutePath() + java.io.File.separator - + (file.getName())); - if (!dst.createNewFile()) { - JOptionPane.showMessageDialog(null, "Cannot import deck " + file.getName() - + ", a deck currently has that name."); - return; - } - FileChannel dstChannel = new FileOutputStream(dst).getChannel(); - dstChannel.transferFrom(srcChannel, 0, srcChannel.size()); - srcChannel.close(); - dstChannel.close(); - - Deck newDeck = DeckManager.readDeck(file); - deckManager.addDeck(newDeck); - showDeck(newDeck); - - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("Gui_DeckEditor_Menu : importDeck() error, " + ex); - } - } - - }//importDeck() - - /** - *

downloadDeck.

- */ - private void downloadDeck() { - - Object o = JOptionPane.showInputDialog(null, "URL(only from http://magic.tcgplayer.com):", - "Download Deck", JOptionPane.OK_CANCEL_OPTION); - if (o == null) { - return; - } - String url = o.toString(); - - if ((url.length() < 37) - || (url.substring(0, 39).equalsIgnoreCase("http://magic.tcgplayer.com/db/deck.asp"))) { - JOptionPane.showMessageDialog(null, "Bad URL." + "\n" - + "Support only deck from http://magic.tcgplayer.com" + "\n" - + "Example: http://magic.tcgplayer.com/db/deck.asp?deck_id=474146", "Information", - JOptionPane.INFORMATION_MESSAGE); - return; - } - Proxy p = null; - p = Proxy.NO_PROXY; - BufferedInputStream in; - BufferedOutputStream out; - try { - byte[] buf = new byte[1024]; - int len; - File f = new File("deck_temp.html"); - in = new BufferedInputStream(new URL(url).openConnection(p).getInputStream()); - out = new BufferedOutputStream(new FileOutputStream(f)); - //while - read and write file - while ((len = in.read(buf)) != -1) { - out.write(buf, 0, len); - - }//while - read and write file - in.close(); - out.flush(); - out.close(); - String fileName = "deck_temp.html"; - FileReader fr = new FileReader(fileName); - BufferedReader br = new BufferedReader(fr); - String s = ""; - String z = ""; - StringBuffer sb = new StringBuffer(); - while ((z = br.readLine()) != null) { - sb.append(z); - } - s = sb.toString(); - br.close(); - int start = s.indexOf("MAIN DECK"); - int finish = s.indexOf("SIDEBOARD"); - String rStr = ""; - rStr = s.substring(start + 9, finish); - int first; - int second; - while (rStr.indexOf("<") != -1) { - first = rStr.indexOf("<"); - second = rStr.indexOf(">", first); - if (first == 0) { - rStr = rStr.substring(second + 1); - } else { - rStr = rStr.substring(0, first) + " " + rStr.substring(second + 1); - } - } - first = rStr.indexOf("Creatures ["); - second = rStr.indexOf("]", first); - if (first != -1) { - rStr = rStr.substring(0, first) + rStr.substring(second + 1); - } - first = rStr.indexOf("Spells ["); - second = rStr.indexOf("]", first); - if (first != -1) { - rStr = rStr.substring(0, first) + rStr.substring(second + 1); - } - first = rStr.indexOf("Lands ["); - second = rStr.indexOf("]", first); - if (first != -1) { - rStr = rStr.substring(0, first) + rStr.substring(second + 1); - } - String number[] = new String[59]; - String name[] = new String[59]; - int count = 0; - DownloadDeck download = new DownloadDeck(); - while (rStr.length() != 0) { - rStr = download.removeSpace(rStr); - number[count] = download.foundNumberCard(rStr); - rStr = download.removeFoundNumberCard(rStr, number[count]); - rStr = download.removeSpace(rStr); - name[count] = download.foundNameCard(rStr); - name[count] = download.removeSpaceBack(name[count]); - rStr = download.removeFoundNameCard(rStr, name[count]); - rStr = download.removeSpace(rStr); - count = count + 1; - } - String trueName[] = new String[59]; - String trueNumber[] = new String[59]; - String falseName[] = new String[59]; - int trueCount = 0; - int falseCount = 0; - for (int i = 0; i < count; i++) { - if (download.isCardSupport(name[i]) == true) { - trueName[trueCount] = name[i]; - trueNumber[trueCount] = number[i]; - trueCount = trueCount + 1; - } else { - falseName[falseCount] = name[i]; - falseCount = falseCount + 1; - } - - } - - Card c = new Card(); - CardList trueList = new CardList(); - for (int i = 0; i < trueCount; i++) { - for (int k = 0; k < Integer.parseInt(trueNumber[i]); k++) { - c = download.getCardDownload(c, trueName[i]); - trueList.add(c); - } - - } - - StringBuffer falseCards = new StringBuffer(); - for (int i = 0; i < falseCount; i++) { - falseCards.append("\n").append(falseName[i]).append(","); - } - - - deckDisplay.updateDisplay(deckDisplay.getTop(), trueList); - - if (falseCount == 0) { - JOptionPane.showMessageDialog(null, "Deck downloads.", "Information", - JOptionPane.INFORMATION_MESSAGE); - } else { - JOptionPane.showMessageDialog(null, "Sorry, cards:" + falseCards - + "\nnot supported in this version MTGForge. \nDeck downloads without this cards.", - "Information", JOptionPane.INFORMATION_MESSAGE); - } - - f.delete(); - - } catch (Exception ex) { - ErrorViewer.showError(ex, ForgeProps.getLocalized(ERRORS.OTHER), "deck_temp.html", url); - - } - - - } - - - /** - *

exportDeck.

- */ - private void exportDeck() { - File filename = getExportFilename(); - - if (filename == null) { - return; - } - - //write is an Object variable because you might just - //write one Deck object or - //many Deck objects if it is a draft deck - Deck deck = getDeck(); - - deck.setName(filename.getName().substring(0, filename.getName().length() - 4)); - - //export Draft decks, this is a little hacky - //a Draft deck holds 8 decks, [0] is the player's deck - //and the other 7 are the computer's deck - if (currentGameType.equals(Constant.GameType.Draft)) { - //read all draft decks - Deck d[] = deckManager.getDraftDeck(currentDeckName); - - //replace your deck - d[0] = deck; - } - - try { - DeckManager.writeDeck(deck, filename); - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("Gui_DeckEditor_Menu : exportDeck() error, " + ex); - } - - exportDeckText(deck, filename.getAbsolutePath()); - - }//exportDeck() - - // @SuppressWarnings("unchecked") - // TableSorter type saftey - /** - *

exportDeckText.

- * - * @param aDeck a {@link forge.deck.Deck} object. - * @param filename a {@link java.lang.String} object. - */ - private void exportDeckText(Deck aDeck, String filename) { - //convert Deck into CardList - CardList all = new CardList(); - for (int i = 0; i < aDeck.countMain(); i++) { - String cardName = aDeck.getMain(i); - - if (cardName.contains("|")) { - String s[] = cardName.split("\\|", 2); - cardName = s[0]; - } - - Card c = AllZone.getCardFactory().getCard(cardName, null); - - all.add(c); - } - - //sort by card name - all.sort(new TableSorter(all, 1, true)); - - //remove all copies of cards - //make a singleton - CardList noCopies = new CardList(); - for (int i = 0; i < all.size(); i++) { - Card c = all.get(i); - - if (!noCopies.containsName(c.getName())) { - noCopies.add(c); - } - } - - - StringBuffer text = new StringBuffer(); - String newLine = "\r\n"; - int count = 0; - - text.append(all.size()).append(" Total Cards").append(newLine).append(newLine); - - //creatures - text.append(all.getType("Creature").size()).append(" Creatures").append(newLine); - text.append("-------------").append(newLine); - - for (int i = 0; i < noCopies.size(); i++) { - Card c = noCopies.get(i); - if (c.isCreature()) { - count = all.getName(c.getName()).size(); - text.append(count).append("x ").append(c.getName()).append(newLine); - } - } - - //count spells, arg! this is tough - CardListFilter cf = new CardListFilter() { - public boolean addCard(Card c) { - return !(c.isCreature() || c.isLand()); - } - };//CardListFilter - count = all.filter(cf).size(); - - //spells - text.append(newLine).append(count).append(" Spells").append(newLine); - text.append("----------").append(newLine); - - for (int i = 0; i < noCopies.size(); i++) { - Card c = noCopies.get(i); - if (!(c.isCreature() || c.isLand())) { - count = all.getName(c.getName()).size(); - text.append(count).append("x ").append(c.getName()).append(newLine); - } - } - - //land - text.append(newLine).append(all.getType("Land").size()).append(" Land").append(newLine); - text.append("--------").append(newLine); - - for (int i = 0; i < noCopies.size(); i++) { - Card c = noCopies.get(i); - if (c.isLand()) { - count = all.getName(c.getName()).size(); - text.append(count).append("x ").append(c.getName()).append(newLine); - } - } - - //remove ".deck" extension - int cut = filename.indexOf("."); - filename = filename.substring(0, cut); - - try { - FileWriter writer = new FileWriter(filename + ".txt"); - writer.write(text.toString()); - - writer.flush(); - writer.close(); - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("Gui_DeckEditor_Menu : exportDeckText() error, " + ex.getMessage() + " : " - + Arrays.toString(ex.getStackTrace())); - } - }//exportDeckText() - - - /** - *

getExportFilename.

- * - * @return a {@link java.io.File} object. - */ - private File getExportFilename() { - //Object o = null; // unused - - JFileChooser save = new JFileChooser(previousDirectory); - - save.setDialogTitle("Export Deck Filename"); - save.setDialogType(JFileChooser.SAVE_DIALOG); - save.setFileFilter(dckFilter); - - int returnVal = save.showSaveDialog(null); - - if (returnVal == JFileChooser.APPROVE_OPTION) { - File file = save.getSelectedFile(); - String check = file.getAbsolutePath(); - - previousDirectory = file.getParentFile(); - - if (check.endsWith(".dck")) { - return file; - } else { - return new File(check + ".dck"); - } - } - - return null; - } - - /** - *

openConstructed.

- */ - private void openConstructed() { - if (debugPrint) { - System.out.println("Open Constructed"); - } - -// if(! isDeckSaved) -// save(); - - String name = getUserInput_OpenDeck(Constant.GameType.Constructed); - - if (name.equals("")) { - return; - } - - //must be AFTER get user input, since user could cancel - currentGameType = Constant.GameType.Constructed; - //newDraftItem.setEnabled(false); - - Deck deck = deckManager.getDeck(name); - showConstructedDeck(deck); - }//open constructed - - /** - *

showConstructedDeck.

- * - * @param deck a {@link forge.deck.Deck} object. - */ - private void showConstructedDeck(Deck deck) { - setDeckData(deck.getName(), true); - - CardList main = new CardList(); - for (int i = 0; i < deck.countMain(); i++) { - String cardName = deck.getMain(i); - String setCode = ""; - if (cardName.contains("|")) { - String s[] = cardName.split("\\|", 2); - cardName = s[0]; - setCode = s[1]; - } - - Card c = AllZone.getCardFactory().getCard(cardName, AllZone.getHumanPlayer()); - - if (!setCode.equals("")) { - c.setCurSetCode(setCode); - } else if ((c.getSets().size() > 0)) // && card.getCurSetCode().equals("")) - { - c.setRandomSetCode(); - } - - main.add(c); - } - // This is an expensive heap operation. - CardList allCards = new CardList(AllZone.getCardFactory()); - deckDisplay.updateDisplay(allCards, main); - }//showConstructedDeck() - - /** - *

openSealed.

- */ - private void openSealed() { - if (debugPrint) { - System.out.println("Open Sealed"); - } - -// if(! isDeckSaved) -// save(); - - String name = getUserInput_OpenDeck(Constant.GameType.Sealed); - - if (name.equals("")) { - return; - } - - //must be AFTER get user input, since user could cancel - currentGameType = Constant.GameType.Sealed; - - //newDraftItem.setEnabled(false); - - Deck deck = deckManager.getDeck(name); - showSealedDeck(deck); - }//open sealed - - /** - *

showSealedDeck.

- * - * @param deck a {@link forge.deck.Deck} object. - */ - public void showSealedDeck(Deck deck) { - setDeckData(deck.getName(), true); - currentDeckPlayerType = deck.getMetadata("PlayerType"); - - CardList top = new CardList(); - if (deck.countSideboard() > 0) { - for (int i = 0; i < deck.countSideboard(); i++) { - String cardName = deck.getSideboard(i); - String setCode = ""; - if (cardName.contains("|")) { - String s[] = cardName.split("\\|", 2); - cardName = s[0]; - setCode = s[1]; - } - Card c = AllZone.getCardFactory().getCard(cardName, AllZone.getHumanPlayer()); - c.setCurSetCode(setCode); - top.add(c); - } - } - CardList bottom = new CardList(); - if (deck.countMain() > 0) { - for (int i = 0; i < deck.countMain(); i++) { - String cardName = deck.getMain(i); - String setCode = ""; - if (cardName.contains("|")) { - String s[] = cardName.split("\\|", 2); - cardName = s[0]; - setCode = s[1]; - } - Card c = AllZone.getCardFactory().getCard(cardName, AllZone.getHumanPlayer()); - c.setCurSetCode(setCode); - bottom.add(c); - } - } - deckDisplay.updateDisplay(top, bottom); - }//showSealedDeck() - - /** - *

openDraft.

- */ - private void openDraft() { - if (debugPrint) { - System.out.println("Open Draft"); - } - - String name = getUserInput_OpenDeck(Constant.GameType.Draft); - - if (name.equals("")) { - return; - } - - //must be AFTER get user input, since user could cancel - currentGameType = Constant.GameType.Draft; - //newDraftItem.setEnabled(true); - - Deck deck = deckManager.getDraftDeck(name)[0]; - showDraftDeck(deck); - }//open draft - - /** - *

showDraftDeck.

- * - * @param deck a {@link forge.deck.Deck} object. - */ - private void showDraftDeck(Deck deck) { - setDeckData(deck.getName(), true); - - CardList top = new CardList(); - for (int i = 0; i < deck.countSideboard(); i++) { - String cardName = deck.getSideboard(i); - if (cardName.contains("|")) { - String s[] = cardName.split("\\|", 2); - cardName = s[0]; - } - - top.add(AllZone.getCardFactory().getCard(cardName, AllZone.getHumanPlayer())); - } - - CardList bottom = new CardList(); - for (int i = 0; i < deck.countMain(); i++) { - String cardName = deck.getMain(i); - if (cardName.contains("|")) { - String s[] = cardName.split("\\|", 2); - cardName = s[0]; - } - - bottom.add(AllZone.getCardFactory().getCard(cardName, AllZone.getHumanPlayer())); - } - - deckDisplay.updateDisplay(top, bottom); - }//showDraftDeck() - - /** - *

save.

- */ - private void save() { - if (debugPrint) { - System.out.println("Save"); - } - - if (currentDeckName.equals("")) { - saveAs(); - } else if (currentGameType.equals(Constant.GameType.Draft)) { - setDeckData(currentDeckName, true); - //write booster deck - Deck[] all = deckManager.getDraftDeck(currentDeckName); - all[0] = getDeck(); - deckManager.addDraftDeck(all); - } else//constructed or sealed - { - setDeckData(currentDeckName, true); - deckManager.deleteDeck(currentDeckName); - deckManager.addDeck(getDeck()); - } - }//save - - /** - *

saveAs.

- */ - private void saveAs() { - if (debugPrint) { - System.out.println("Save As"); - } - - String name = getUserInput_GetDeckName(); - - if (name.equals("")) { - return; - } else if (currentGameType.equals(Constant.GameType.Draft)) { - //MUST copy array - Deck[] read = deckManager.getDraftDeck(currentDeckName); - Deck[] all = new Deck[read.length]; - - System.arraycopy(read, 0, all, 0, read.length); - - setDeckData(name, true); - - all[0] = getDeck(); - deckManager.addDraftDeck(all); - } else//constructed and sealed - { - setDeckData(name, true); - deckManager.addDeck(getDeck()); - } - }//save as - - /** - *

delete.

- */ - private void delete() { - if (debugPrint) { - System.out.println("Delete"); - } - - if (currentGameType.equals("") || currentDeckName.equals("")) { - return; - } - - int n = JOptionPane.showConfirmDialog(null, "Do you want to delete this deck " + currentDeckName + " ?", - "Delete", JOptionPane.YES_NO_OPTION); - if (n == JOptionPane.NO_OPTION) { - return; - } - - if (currentGameType.equals(Constant.GameType.Draft)) { - deckManager.deleteDraftDeck(currentDeckName); - } else { - deckManager.deleteDeck(currentDeckName); - } - - setDeckData("", true); - deckDisplay.updateDisplay(new CardList(), new CardList()); - }//delete - - /** - *

close.

- */ - public void close() { - if (debugPrint) { - System.out.println("Close"); - } - -// if(! isDeckSaved) -// save(); - - deckManager.close(); - exitCommand.execute(); - }//close - - /** - *

setDeckData.

- * - * @param deckName a {@link java.lang.String} object. - * @param in_isDeckSaved a boolean. - */ - private void setDeckData(String deckName, boolean in_isDeckSaved) { - currentDeckName = deckName; - isDeckSaved = in_isDeckSaved; - - deckDisplay.setTitle("Deck Editor : " + currentDeckName); - } - - /** - *

setTitle.

- * - * @param s a {@link java.lang.String} object. - */ - public void setTitle(String s) { - deckDisplay.setTitle(s); - } - - /** - *

getDeckName.

- * - * @return a {@link java.lang.String} object. - */ - public String getDeckName() { - return currentDeckName; - } - - /** - *

getGameType.

- * - * @return a {@link java.lang.String} object. - */ - public String getGameType() { - return currentGameType; - } - - /** - *

isDeckSaved.

- * - * @return a boolean. - */ - public boolean isDeckSaved() { - return isDeckSaved; - } - - /** - *

getUserInput_GetDeckName.

- * - * @return a {@link java.lang.String} object. - */ - private String getUserInput_GetDeckName() { - Object o = JOptionPane.showInputDialog(null, "Save As", "Deck Name", JOptionPane.OK_CANCEL_OPTION); - - if (o == null) { - return ""; - } - - String deckName = cleanString(o.toString()); - - boolean isUniqueName; - if (currentGameType.equals(Constant.GameType.Draft)) { - isUniqueName = deckManager.isUniqueDraft(deckName); - } else { - isUniqueName = deckManager.isUnique(deckName); - } - - if ((!isUniqueName) || deckName.equals("")) { - JOptionPane.showMessageDialog(null, "Please pick another deck name, a deck currently has that name."); - return getUserInput_GetDeckName(); - } - - return deckName; - }//getUserInput_GetDeckName() - - //only accepts numbers, letters or dashes up to 10 characters in length - /** - *

cleanString.

- * - * @param in a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - private String cleanString(String in) { - char[] c = in.toCharArray(); - - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < c.length && i < 20; i++) { - if (Character.isLetterOrDigit(c[i]) || c[i] == '-') { - sb.append(c[i]); - } - } - return sb.toString(); - } - - - /** - *

getUserInput_OpenDeck.

- * - * @param deckType a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - private String getUserInput_OpenDeck(String deckType) { - ArrayList choices = getDeckNames(deckType); - if (choices.size() == 0) { - JOptionPane.showMessageDialog(null, "No decks found", "Open Deck", JOptionPane.PLAIN_MESSAGE); - return ""; - } - //Object o = JOptionPane.showInputDialog(null, "Deck Name", "Open Deck", JOptionPane.OK_CANCEL_OPTION, null, - // choices.toArray(), choices.toArray()[0]); - Object o = GuiUtils.getChoiceOptional("Open Deck", choices.toArray()); - - if (o == null) { - return ""; - } - - return o.toString(); - }//getUserInput_OpenDeck() - - - /** - *

getDeckNames.

- * - * @param deckType a {@link java.lang.String} object. - * @return a {@link java.util.ArrayList} object. - */ - private ArrayList getDeckNames(String deckType) { - ArrayList list = new ArrayList(); - - //only get decks according to the Gui_NewGame screen option - if (deckType.equals(Constant.GameType.Draft)) { - - for (String s : deckManager.getDraftDecks().keySet()) { - list.add(s); - } - } else { - Collection decks = deckManager.getDecks(); - for (Deck deck : decks) { - if (deckType.equals(deck.getDeckType())) { - list.add(deck.toString()); - } - } - } - - Collections.sort(list); - return list; - }//getDecks() - - /** - *

getDeck.

- * - * @return a {@link forge.deck.Deck} object. - */ - private Deck getDeck() { - Deck deck = new Deck(currentGameType); - deck.setName(currentDeckName); - CardList list; - String cardName; - - //always move "bottom" to main - list = deckDisplay.getBottom(); - for (int i = 0; i < list.size(); i++) { - if (!list.get(i).getCurSetCode().equals("")) { - cardName = list.get(i).getName() + "|" + list.get(i).getCurSetCode(); - } else { - cardName = list.get(i).getName(); - } - deck.addMain(AllZone.getNameChanger().getOriginalName(cardName)); - } - - //if sealed or draft, move "top" to sideboard - if (!currentGameType.equals(Constant.GameType.Constructed)) { - list = deckDisplay.getTop(); - for (int i = 0; i < list.size(); i++) { - cardName = list.get(i).getName() + "|" + list.get(i).getCurSetCode(); - deck.addSideboard(AllZone.getNameChanger().getOriginalName(cardName)); - } - if (currentGameType.equals(Constant.GameType.Sealed)) - deck.addMetaData("PlayerType", currentDeckPlayerType); - } - return deck; - }//getDeck() - - /** - *

setupMenu.

- */ - private void setupMenu() { - JMenuItem newConstructed = new JMenuItem("New Deck - Constructed"); - - //JMenuItem newSealed = new JMenuItem("New Deck - Sealed"); - //JMenuItem newDraft = new JMenuItem("New Deck - Draft"); - - JMenuItem newRandomConstructed = new JMenuItem("New Deck - Generate Random Constructed Cardpool"); - JMenuItem newGenerateConstructed = new JMenuItem("New Deck - Generate Constructed Deck"); - - - JMenuItem importDeck = new JMenuItem("Import Deck"); - JMenuItem exportDeck = new JMenuItem("Export Deck"); - JMenuItem downloadDeck = new JMenuItem("Download Deck"); - - - JMenuItem openConstructed = new JMenuItem("Open Deck - Constructed"); - JMenuItem openSealed = new JMenuItem("Open Deck - Sealed"); - JMenuItem openDraft = new JMenuItem("Open Deck - Draft"); - - //newDraftItem = newDraft; - //newDraftItem.setEnabled(false); - - JMenuItem save = new JMenuItem("Save"); - JMenuItem saveAs = new JMenuItem("Save As"); - JMenuItem delete = new JMenuItem("Delete"); - JMenuItem close = new JMenuItem("Close"); - - JMenu fileMenu = new JMenu("Deck Actions"); - fileMenu.add(newConstructed); - - //fileMenu.add(newSealed); - //fileMenu.add(newDraft); - fileMenu.addSeparator(); - - fileMenu.add(openConstructed); - fileMenu.add(openSealed); - fileMenu.add(openDraft); - fileMenu.addSeparator(); - - fileMenu.add(importDeck); - fileMenu.add(exportDeck); - fileMenu.add(downloadDeck); - fileMenu.addSeparator(); - - fileMenu.add(newRandomConstructed); - fileMenu.add(newGenerateConstructed); - fileMenu.addSeparator(); - - fileMenu.add(save); - fileMenu.add(saveAs); - fileMenu.add(delete); - fileMenu.addSeparator(); - - fileMenu.add(close); - - this.add(fileMenu); - - //add listeners - exportDeck.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - try { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - exportDeck(); - } - }); - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("Gui_DeckEditor_Menu : exportDeck() error - " + ex); - } - } - }); - - - importDeck.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - try { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - importDeck(); - } - }); - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("Gui_DeckEditor_Menu : importDeck() error - " + ex); - } - } - }); - - downloadDeck.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - try { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - downloadDeck(); - } - }); - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("Gui_DeckEditor_Menu : downloadDeck() error - " + ex); - } - } - }); - - newConstructed.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - try { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - newConstructed(); - } - }); - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("Gui_DeckEditor_Menu : newConstructed() error - " + ex); - } - } - }); - - - newRandomConstructed.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - try { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - newRandomConstructed(); - } - }); - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("Gui_DeckEditor_Menu : newRandomConstructed() error - " + ex); - } - } - }); - - - newGenerateConstructed.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - try { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - newGenerateConstructed(); - } - }); - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("Gui_DeckEditor_Menu : newRandomConstructed() error - " + ex); - } - } - }); - - -/* newSealed.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - try { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - newSealed(); - } - }); - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("Gui_DeckEditor_Menu : newSealed() error - " + ex); - } - } - }); -*/ -/* newDraft.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - try { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - newDraft(); - } - }); - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("Gui_DeckEditor_Menu : newDraft() error - " + ex); - } - } - }); -*/ - openConstructed.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - try { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - openConstructed(); - } - }); - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("Gui_DeckEditor_Menu : openConstructed() error - " + ex); - } - } - }); - - openSealed.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - try { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - openSealed(); - } - }); - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("Gui_DeckEditor_Menu : openSealed() error - " + ex); - } - } - }); - - openDraft.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - try { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - openDraft(); - } - }); - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("Gui_DeckEditor_Menu : openDraft() error - " + ex); - } - } - }); - - save.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - try { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - save(); - } - }); - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("Gui_DeckEditor_Menu : save() error - " + ex); - } - } - }); - - saveAs.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - try { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - saveAs(); - } - }); - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("Gui_DeckEditor_Menu : saveAs() error - " + ex); - } - } - }); - - delete.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - try { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - delete(); - } - }); - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("Gui_DeckEditor_Menu : delete() error - " + ex); - } - } - }); - - close.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - try { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - close(); - } - }); - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("Gui_DeckEditor_Menu : close() error - " + ex); - } - } - }); - }//setupMenu() -} diff --git a/src/forge/Gui_DownloadPictures_LQ.java b/src/forge/Gui_DownloadPictures_LQ.java deleted file mode 100644 index c80a1610031..00000000000 --- a/src/forge/Gui_DownloadPictures_LQ.java +++ /dev/null @@ -1,401 +0,0 @@ -package forge; - -import com.esotericsoftware.minlog.Log; -import forge.error.ErrorViewer; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - -import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.*; -import java.net.InetSocketAddress; -import java.net.MalformedURLException; -import java.net.Proxy; -import java.net.URL; -import java.util.ArrayList; -//import java.util.StringTokenizer; - -import static java.lang.Integer.parseInt; -import static javax.swing.JOptionPane.DEFAULT_OPTION; -import static javax.swing.JOptionPane.PLAIN_MESSAGE; - - -/** - *

Gui_DownloadPictures_LQ class.

- * - * @author Forge - * @version $Id: $ - */ -public class Gui_DownloadPictures_LQ extends DefaultBoundedRangeModel implements Runnable, NewConstants, NewConstants.LANG.Gui_DownloadPictures { - - /** Constant serialVersionUID=-7890794857949935256L */ - private static final long serialVersionUID = -7890794857949935256L; - - /** Constant types */ - public static final Proxy.Type[] types = Proxy.Type.values(); - - //proxy - private int type; - private JTextField addr, port; - - //progress - private mCard[] cards; - private int card; - private boolean cancel; - private JProgressBar bar; - - private JOptionPane dlg; - private JButton close; - - /** - *

Constructor for Gui_DownloadPictures_LQ.

- * - * @param c an array of {@link forge.Gui_DownloadPictures_LQ.mCard} objects. - */ - private Gui_DownloadPictures_LQ(mCard[] c) { - this.cards = c; - addr = new JTextField(ForgeProps.getLocalized(PROXY_ADDRESS)); - port = new JTextField(ForgeProps.getLocalized(PROXY_PORT)); - bar = new JProgressBar(this); - - JPanel p0 = new JPanel(); - p0.setLayout(new BoxLayout(p0, BoxLayout.Y_AXIS)); - - //Proxy Choice - ButtonGroup bg = new ButtonGroup(); - String[] labels = { - ForgeProps.getLocalized(NO_PROXY), ForgeProps.getLocalized(HTTP_PROXY), - ForgeProps.getLocalized(SOCKS_PROXY)}; - for (int i = 0; i < types.length; i++) { - JRadioButton rb = new JRadioButton(labels[i]); - rb.addChangeListener(new ProxyHandler(i)); - bg.add(rb); - p0.add(rb); - if (i == 0) rb.setSelected(true); - } - - //Proxy config - p0.add(addr); - p0.add(port); -// JTextField[] tfs = {addr, port}; -// String[] labels = {"Address", "Port"}; -// for(int i = 0; i < labels.length; i++) { -// JPanel p1 = new JPanel(new BorderLayout()); -// p0.add(p1); -//// p1.add(new JLabel(labels[i]), WEST); -// p1.add(tfs[i]); -// } - - //Start - final JButton b = new JButton(ForgeProps.getLocalized(BUTTONS.START)); - b.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - new Thread(Gui_DownloadPictures_LQ.this).start(); - b.setEnabled(false); - } - }); -// p0.add(b); - - p0.add(Box.createVerticalStrut(5)); - - //Progress - p0.add(bar); - bar.setStringPainted(true); - //bar.setString(ForgeProps.getLocalized(BAR_BEFORE_START)); - bar.setString(String.format(ForgeProps.getLocalized(card == cards.length ? BAR_CLOSE : BAR_WAIT), this.card, cards.length)); - Dimension d = bar.getPreferredSize(); - d.width = 300; - bar.setPreferredSize(d); - - //JOptionPane - Object[] options = {b, close = new JButton(ForgeProps.getLocalized(BUTTONS.CANCEL))}; - dlg = new JOptionPane(p0, DEFAULT_OPTION, PLAIN_MESSAGE, null, options, options[1]); - } - - /** {@inheritDoc} */ - @Override - public int getMinimum() { - return 0; - } - - /** {@inheritDoc} */ - @Override - public int getValue() { - return card; - } - - /** {@inheritDoc} */ - @Override - public int getExtent() { - return 0; - } - - /** {@inheritDoc} */ - @Override - public int getMaximum() { - return cards == null ? 0 : cards.length; - } - - /** - *

update.

- * - * @param card a int. - */ - private void update(int card) { - this.card = card; - final class Worker implements Runnable { - private int card; - - Worker(int card) { - this.card = card; - } - - public void run() { - fireStateChanged(); - bar.setString(String.format(ForgeProps.getLocalized(card == cards.length ? BAR_CLOSE : BAR_WAIT), card, - cards.length)); - System.out.println(card + "/" + cards.length); - } - } - ; - EventQueue.invokeLater(new Worker(card)); - } - - /** - *

Getter for the field dlg.

- * - * @param frame a {@link javax.swing.JFrame} object. - * @return a {@link javax.swing.JDialog} object. - */ - public JDialog getDlg(JFrame frame) { - final JDialog dlg = this.dlg.createDialog(frame, ForgeProps.getLocalized(TITLE)); - close.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - dlg.setVisible(false); - } - }); - return dlg; - } - - /** - *

Setter for the field cancel.

- * - * @param cancel a boolean. - */ - public void setCancel(boolean cancel) { - this.cancel = cancel; - } - - - /** - *

run.

- */ - public void run() { - BufferedInputStream in; - BufferedOutputStream out; - - File base = ForgeProps.getFile(IMAGE_BASE); - - Proxy p = null; - if (type == 0) p = Proxy.NO_PROXY; - else try { - p = new Proxy(types[type], new InetSocketAddress(addr.getText(), parseInt(port.getText()))); - } catch (Exception ex) { - ErrorViewer.showError(ex, ForgeProps.getLocalized(ERRORS.PROXY_CONNECT), addr.getText(), - port.getText()); -// throw new RuntimeException("Gui_DownloadPictures : error 1 - " +ex); - return; - } - - if (p != null) { - byte[] buf = new byte[1024]; - int len; - System.out.println("basedir: " + base); - for (update(0); card < cards.length && !cancel; update(card + 1)) { - try { - String url = cards[card].url; - String cName; - if (cards[card].name.substring(0, 3).equals("[T]")) { - base = ForgeProps.getFile(IMAGE_TOKEN); - cName = cards[card].name.substring(3, cards[card].name.length()); - } else { - base = ForgeProps.getFile(IMAGE_BASE); - cName = cards[card].name; - } - - File f = new File(base, cName); - - try { - in = new BufferedInputStream(new URL(url).openConnection(p).getInputStream()); - out = new BufferedOutputStream(new FileOutputStream(f)); - - while ((len = in.read(buf)) != -1) { - //user cancelled - if (cancel) { - in.close(); - out.flush(); - out.close(); - - //delete what was written so far - f.delete(); - - return; - }//if - cancel - - out.write(buf, 0, len); - }//while - read and write file - - in.close(); - out.flush(); - out.close(); - } catch (MalformedURLException mURLe) { - System.out.println("Error - possibly missing URL for: " + cards[card].name); - //Log.error("LQ Pictures", "Malformed URL for: "+cards[card].name, mURLe); - } - } catch (FileNotFoundException fnfe) { - System.out.println("Error - the LQ picture for " + cards[card].name + " could not be found on the server."); - } catch (Exception ex) { - System.out.println("General error - downloading LQ picture for " + cards[card].name); - Log.error("LQ Pictures", "Error downloading pictures", ex); - - } - }//for - } - close.setText(ForgeProps.getLocalized(BUTTONS.CLOSE)); - }//run - - /** - *

startDownload.

- * - * @param frame a {@link javax.swing.JFrame} object. - */ - public static void startDownload(JFrame frame) { - final mCard[] card = getNeededCards(); - - if (card.length == 0) { - JOptionPane.showMessageDialog(frame, ForgeProps.getLocalized(NO_MORE)); - return; - } - - Gui_DownloadPictures_LQ download = new Gui_DownloadPictures_LQ(card); - JDialog dlg = download.getDlg(frame); - dlg.setVisible(true); - dlg.dispose(); - download.setCancel(true); - }//startDownload() - - /** - *

getNeededCards.

- * - * @return an array of {@link forge.Gui_DownloadPictures_LQ.mCard} objects. - */ - private static mCard[] getNeededCards() { - //read all card names and urls - //mCard[] cardPlay = readFile(CARD_PICTURES); - //mCard[] cardTokenLQ = readFile(CARD_PICTURES_TOKEN_LQ); - - ArrayList CList = new ArrayList(); - - for (Card c : AllZone.getCardFactory()) { - String url = c.getSVar("Picture"); - String[] URLs = url.split("\\\\"); - - String iName = GuiDisplayUtil.cleanString(c.getImageName()); - CList.add(new mCard(iName + ".jpg", URLs[0])); - //Log.error(iName + ".jpg" + "\t" + URLs[0]); - - if (URLs.length > 1) - for (int j = 1; j < URLs.length; j++) - CList.add(new mCard(iName + j + ".jpg", URLs[j])); - } - - ArrayList list = new ArrayList(); - File file; - - File base = ForgeProps.getFile(IMAGE_BASE); - mCard[] a = {new mCard("", "")}; - mCard[] cardPlay = CList.toArray(a); - //check to see which cards we already have - for (int i = 0; i < cardPlay.length; i++) { - file = new File(base, cardPlay[i].name); - if (!file.exists()) - list.add(cardPlay[i]); - } -// base = ForgeProps.getFile(IMAGE_TOKEN); -// for (int i = 0; i < cardTokenLQ.length; i++) { -// file = new File(base, cardTokenLQ[i].name.substring(3, cardTokenLQ[i].name.length())); -// if (!file.exists()) list.add(cardTokenLQ[i]); -// } - - //return all card names and urls that are needed - mCard[] out = new mCard[list.size()]; - list.toArray(out); - -// for(int i = 0; i < out.length; i++) -// System.out.println(out[i].name +" " +out[i].url); - return out; - }//getNeededCards() - -/* *//** - *

readFile.

- * - * @param ABC a {@link java.lang.String} object. - * @return an array of {@link forge.Gui_DownloadPictures_LQ.mCard} objects. - *//* - private static mCard[] readFile(String ABC) { - try { - FileReader zrc = new FileReader(ForgeProps.getFile(ABC)); - BufferedReader in = new BufferedReader(zrc); - String line; - ArrayList list = new ArrayList(); - StringTokenizer tok; - - line = in.readLine(); - while (line != null && (!line.equals(""))) { - tok = new StringTokenizer(line); - list.add(new mCard(tok.nextToken(), tok.nextToken())); - - line = in.readLine(); - } - - mCard[] out = new mCard[list.size()]; - list.toArray(out); - return out; - - } catch (Exception ex) { - ErrorViewer.showError(ex, "Gui_DownloadPictures: readFile() error"); - throw new RuntimeException("Gui_DownloadPictures : readFile() error"); - } - }//readFile() -*/ - private class ProxyHandler implements ChangeListener { - private int type; - - public ProxyHandler(int type) { - this.type = type; - } - - public void stateChanged(ChangeEvent e) { - if (((AbstractButton) e.getSource()).isSelected()) { - Gui_DownloadPictures_LQ.this.type = type; - addr.setEnabled(type != 0); - port.setEnabled(type != 0); - } - } - } - - private static class mCard { - final public String name; - final public String url; - - mCard(String cardName, String cardURL) { - name = cardName; - url = cardURL; - } - }//mCard -} diff --git a/src/forge/Gui_DownloadPrices.java b/src/forge/Gui_DownloadPrices.java deleted file mode 100644 index d6f905d05d7..00000000000 --- a/src/forge/Gui_DownloadPrices.java +++ /dev/null @@ -1,262 +0,0 @@ -package forge; - -import forge.properties.ForgeProps; -import forge.properties.NewConstants.LANG.Gui_DownloadPrices.DOWNLOADPRICES; -import forge.properties.NewConstants.QUEST; - -import javax.swing.*; -import java.awt.*; -import java.io.*; -import java.net.Proxy; -import java.net.URL; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; - -/** - *

Gui_DownloadPrices class.

- * - * @author Forge - * @version $Id: $ - */ -public class Gui_DownloadPrices extends JFrame { - - /** Constant serialVersionUID=1L */ - private static final long serialVersionUID = 1L; - private JPanel jContentPane = null; - private JButton jButton = null; - - /** - * This is the default constructor - */ - public Gui_DownloadPrices() { - super(); - initialize(); - } - - /** - * This method initializes this - */ - private void initialize() { - this.setSize(386, 200); - setContentPane(getJContentPane()); - setTitle(ForgeProps.getLocalized(DOWNLOADPRICES.TITLE)); - } - - /** - * This method initializes jContentPane - * - * @return javax.swing.JPanel - */ - private JPanel getJContentPane() { - if (jContentPane == null) { - jContentPane = new JPanel(); - jContentPane.setLayout(null); - jContentPane.add(getJButton(), null); - } - return jContentPane; - } - - /** - * This method initializes jButton - * - * @return javax.swing.JButton - */ - private JButton getJButton() { - if (jButton == null) { - jButton = new JButton(); - jButton.setText(ForgeProps.getLocalized(DOWNLOADPRICES.START_UPDATE)); - jButton.setLocation(new Point(120, 46)); - jButton.setSize(158, 89); - - jButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent e) { - if (jButton.getText().equals("Done!")) - Gui_DownloadPrices.this.dispose(); - - BufferedInputStream in = null; - BufferedOutputStream out = null; - - File f = new File(".//res//tmppl.txt"); - String url = "http://www.magictraders.com/pricelists/current-magic-excel.txt"; - Proxy p = Proxy.NO_PROXY; - byte[] buf = new byte[1024]; - int x = 0; - String s = "Downloading"; - - try { - in = new BufferedInputStream(new URL(url) - .openConnection(p).getInputStream()); - out = new BufferedOutputStream(new FileOutputStream(f)); - - jButton.setText(ForgeProps.getLocalized(DOWNLOADPRICES.DOWNLOADING)); - jContentPane.paintImmediately(jButton.getBounds()); - - - int len = 0; - while ((len = in.read(buf)) != -1) { - out.write(buf, 0, len); - - if (++x % 50 == 0) { - s += "."; - jButton.setText(s); - jContentPane.paintImmediately(jButton - .getBounds()); - - if (x >= 300) { - x = 0; - s = "Downloading"; - } - } - } - in.close(); - out.flush(); - out.close(); - } catch (IOException e1) { - return; - } finally { - try { - if (in != null) - in.close(); - if (out != null) - out.close(); - } catch (IOException ex) { - return; - } - }// while - read and write file - - FileReader fr = null; - FileWriter fw = null; - try { - fr = new FileReader(".//res//tmppl.txt"); - - BufferedReader inBR = new BufferedReader(fr); - String line = null; - - HashMap prices = new HashMap(); - - line = inBR.readLine(); - line = inBR.readLine(); - - jButton.setText(ForgeProps.getLocalized(DOWNLOADPRICES.COMPILING)); - jContentPane.paintImmediately(jButton.getBounds()); - - x = 0; - s = "Compiling"; - while (line != null && !line.equals("")) { - String ll[] = line.split("\\|"); - - if (ll[0].contains("(")) { - int indx = ll[0].indexOf(" ("); - ll[0] = ll[0].substring(0, indx); - } - - Float np = Float.parseFloat(ll[3]) * 100; - int inp = np.intValue(); - - if (prices.containsKey(ll[0])) { - int cp = prices.get(ll[0]); - float fScl = 0; - - if (cp >= inp) { - fScl = 1 - (float) inp / (float) cp; - if (fScl > .333) - cp = cp / 2; - } else { - fScl = 1 - (float) cp / (float) inp; - if (fScl > .333) - inp = inp / 2; - } - - int ap = (cp + inp) / 2; - if (ap < 7) - ap += 10; - prices.put(ll[0], ap); - } else { - if (inp < 7) - inp += 10; - - prices.put(ll[0], inp); - } - - line = inBR.readLine(); - // System.out.println(line); - - if (++x % 100 == 0) { - s += "."; - jButton.setText(s); - jContentPane.paintImmediately(jButton - .getBounds()); - - if (x >= 500) { - x = 0; - s = "Compiling"; - } - } - } - - String pfn = ForgeProps.getFile(QUEST.PRICE) - .getAbsolutePath(); - String pfnb = pfn.replace(".txt", ".bak"); - File ff = new File(pfn); - ff.renameTo(new File(pfnb)); - - fw = new FileWriter(ForgeProps - .getFile(QUEST.PRICE)); - BufferedWriter outBW = new BufferedWriter(fw); - - // Collection keys = prices.keySet(); - ArrayList keys = new ArrayList(); - keys.addAll(prices.keySet()); - Collections.sort(keys); - - for (int i = 0; i < keys.size(); i++) { - // keys.add(key); - String k = keys.get(i); - if (k.equals("Plains") || k.equals("Island") - || k.equals("Swamp") - || k.equals("Mountain") - || k.equals("Forest")) - outBW.write(k + "=5\r\n"); - - else if (k.equals("Snow-Covered Plains") - || k.equals("Snow-Covered Island") - || k.equals("Snow-Covered Swamp") - || k.equals("Snow-Covered Mountain") - || k.equals("Snow-Covered Forest")) - outBW.write(k + "=10\r\n"); - else - outBW.write(keys.get(i) + "=" - + prices.get(keys.get(i)) + "\r\n"); - - if (i % 100 == 0) - outBW.flush(); - } - - outBW.flush(); - outBW.close(); - fw.close(); - - jButton.setText("Done!"); - fr.close(); - f.delete(); - } catch (IOException e1) { - return; - } finally { - try { - if (fr != null) - fr.close(); - if (fw != null) - fw.close(); - } catch (IOException ex) { - return; - } - } - return; - } - }); - } - return jButton; - } - -} // @jve:decl-index=0:visual-constraint="10,10" diff --git a/src/forge/Gui_DownloadSetPictures_LQ.java b/src/forge/Gui_DownloadSetPictures_LQ.java deleted file mode 100644 index fc078c02a61..00000000000 --- a/src/forge/Gui_DownloadSetPictures_LQ.java +++ /dev/null @@ -1,511 +0,0 @@ -package forge; - -import com.esotericsoftware.minlog.Log; -import forge.error.ErrorViewer; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - -import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.*; -import java.net.InetSocketAddress; -import java.net.MalformedURLException; -import java.net.Proxy; -import java.net.URL; -import java.util.ArrayList; -import java.util.Random; -//import java.util.StringTokenizer; - -import static java.lang.Integer.parseInt; -import static javax.swing.JOptionPane.DEFAULT_OPTION; -import static javax.swing.JOptionPane.PLAIN_MESSAGE; - - -/** - *

Gui_DownloadSetPictures_LQ class.

- * - * @author Forge - * @version $Id: $ - */ -public class Gui_DownloadSetPictures_LQ extends DefaultBoundedRangeModel implements Runnable, NewConstants, NewConstants.LANG.Gui_DownloadPictures { - - /** Constant serialVersionUID=-7890794857949935256L */ - private static final long serialVersionUID = -7890794857949935256L; - - /** Constant types */ - public static final Proxy.Type[] types = Proxy.Type.values(); - - //proxy - private int type; - private JTextField addr, port; - - //progress - private mCard[] cards; - private int card; - private boolean cancel; - private JProgressBar bar; - - private JOptionPane dlg; - private JButton close; - - private long times[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - private int tptr = 0; - private long lTime = System.currentTimeMillis(); - - /** - *

getAverageTimePerCard.

- * - * @return a int. - */ - private int getAverageTimePerCard() { - int aTime = 0; - int nz = 10; - - if (tptr > 9) - tptr = 0; - - times[tptr] = System.currentTimeMillis() - lTime; - lTime = System.currentTimeMillis(); - - int tTime = 0; - for (int i = 0; i < 10; i++) { - tTime += times[i]; - if (times[i] == 0) - nz--; - } - aTime = tTime / nz; - - tptr++; - - return aTime; - } - - - /** - *

Constructor for Gui_DownloadSetPictures_LQ.

- * - * @param c an array of {@link forge.Gui_DownloadSetPictures_LQ.mCard} objects. - */ - private Gui_DownloadSetPictures_LQ(mCard[] c) { - this.cards = c; - addr = new JTextField(ForgeProps.getLocalized(PROXY_ADDRESS)); - port = new JTextField(ForgeProps.getLocalized(PROXY_PORT)); - bar = new JProgressBar(this); - - JPanel p0 = new JPanel(); - p0.setLayout(new BoxLayout(p0, BoxLayout.Y_AXIS)); - - //Proxy Choice - ButtonGroup bg = new ButtonGroup(); - String[] labels = { - ForgeProps.getLocalized(NO_PROXY), ForgeProps.getLocalized(HTTP_PROXY), - ForgeProps.getLocalized(SOCKS_PROXY)}; - for (int i = 0; i < types.length; i++) { - JRadioButton rb = new JRadioButton(labels[i]); - rb.addChangeListener(new ProxyHandler(i)); - bg.add(rb); - p0.add(rb); - if (i == 0) rb.setSelected(true); - } - - //Proxy config - p0.add(addr); - p0.add(port); -// JTextField[] tfs = {addr, port}; -// String[] labels = {"Address", "Port"}; -// for(int i = 0; i < labels.length; i++) { -// JPanel p1 = new JPanel(new BorderLayout()); -// p0.add(p1); -//// p1.add(new JLabel(labels[i]), WEST); -// p1.add(tfs[i]); -// } - - //Start - final JButton b = new JButton(ForgeProps.getLocalized(BUTTONS.START)); - b.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - new Thread(Gui_DownloadSetPictures_LQ.this).start(); - b.setEnabled(false); - } - }); -// p0.add(b); - - p0.add(Box.createVerticalStrut(5)); - - //Progress - p0.add(bar); - bar.setStringPainted(true); - //bar.setString(ForgeProps.getLocalized(BAR_BEFORE_START)); - bar.setString(card + "/" + cards.length); - //bar.setString(String.format(ForgeProps.getLocalized(card == cards.length? BAR_CLOSE:BAR_WAIT), this.card, cards.length)); - Dimension d = bar.getPreferredSize(); - d.width = 300; - bar.setPreferredSize(d); - - //JOptionPane - Object[] options = {b, close = new JButton(ForgeProps.getLocalized(BUTTONS.CANCEL))}; - dlg = new JOptionPane(p0, DEFAULT_OPTION, PLAIN_MESSAGE, null, options, options[1]); - } - - /** {@inheritDoc} */ - @Override - public int getMinimum() { - return 0; - } - - /** {@inheritDoc} */ - @Override - public int getValue() { - return card; - } - - /** {@inheritDoc} */ - @Override - public int getExtent() { - return 0; - } - - /** {@inheritDoc} */ - @Override - public int getMaximum() { - return cards == null ? 0 : cards.length; - } - - /** - *

update.

- * - * @param card a int. - */ - private void update(int card) { - this.card = card; - - final class Worker implements Runnable { - private int card; - - Worker(int card) { - this.card = card; - } - - public void run() { - fireStateChanged(); - - StringBuilder sb = new StringBuilder(); - - int a = getAverageTimePerCard(); - - if (card != cards.length) { - sb.append(card + "/" + cards.length + " - "); - - long t2Go = (cards.length - card) * a; - - boolean secOnly = true; - if (t2Go > 3600000) { - sb.append(String.format("%02d:", t2Go / 3600000)); - t2Go = t2Go % 3600000; - secOnly = false; - } - if (t2Go > 60000) { - sb.append(String.format("%02d:", t2Go / 60000)); - t2Go = t2Go % 60000; - secOnly = false; - } - if (!secOnly) - sb.append(String.format("%02d remaining.", t2Go / 1000)); - else - sb.append(String.format("0:%02d remaining.", t2Go / 1000)); - } else - sb.append(String.format(ForgeProps.getLocalized(BAR_CLOSE), card, cards.length)); - - bar.setString(sb.toString()); - //bar.setString(String.format(ForgeProps.getLocalized(card == cards.length? BAR_CLOSE:BAR_WAIT), card, - // cards.length)); - System.out.println(card + "/" + cards.length + " - " + a); - } - } - ; - EventQueue.invokeLater(new Worker(card)); - } - - /** - *

Getter for the field dlg.

- * - * @param frame a {@link javax.swing.JFrame} object. - * @return a {@link javax.swing.JDialog} object. - */ - public JDialog getDlg(JFrame frame) { - final JDialog dlg = this.dlg.createDialog(frame, ForgeProps.getLocalized(TITLE)); - close.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - dlg.setVisible(false); - } - }); - return dlg; - } - - /** - *

Setter for the field cancel.

- * - * @param cancel a boolean. - */ - public void setCancel(boolean cancel) { - this.cancel = cancel; - } - - - /** - *

run.

- */ - public void run() { - BufferedInputStream in; - BufferedOutputStream out; - - File base = ForgeProps.getFile(IMAGE_BASE); - - Random r = MyRandom.random; - - Proxy p = null; - if (type == 0) p = Proxy.NO_PROXY; - else try { - p = new Proxy(types[type], new InetSocketAddress(addr.getText(), parseInt(port.getText()))); - } catch (Exception ex) { - ErrorViewer.showError(ex, ForgeProps.getLocalized(ERRORS.PROXY_CONNECT), addr.getText(), - port.getText()); -// throw new RuntimeException("Gui_DownloadPictures : error 1 - " +ex); - return; - } - - if (p != null) { - byte[] buf = new byte[1024]; - int len; - System.out.println("basedir: " + base); - for (update(0); card < cards.length && !cancel; update(card + 1)) { - try { - String url = cards[card].url; - String cName; - if (cards[card].name.substring(0, 3).equals("[T]")) { - base = ForgeProps.getFile(IMAGE_TOKEN); - cName = cards[card].name.substring(3, cards[card].name.length()); - } else { - base = ForgeProps.getFile(IMAGE_BASE); - cName = cards[card].name; - } - if (Constant.Runtime.DevMode[0]) - System.out.println(cName + " - " + url); - - File f = new File(base, cName); - - //test for folder existence - File test = new File(base, cards[card].folder); - if (!test.exists()) { - // create folder - if (!test.mkdir()) - System.out.println("Can't create folder" + cards[card].folder); - } - - try { - in = new BufferedInputStream(new URL(url).openConnection(p).getInputStream()); - out = new BufferedOutputStream(new FileOutputStream(f)); - - while ((len = in.read(buf)) != -1) { - //user cancelled - if (cancel) { - in.close(); - out.flush(); - out.close(); - - //delete what was written so far - f.delete(); - - return; - }//if - cancel - - out.write(buf, 0, len); - }//while - read and write file - - in.close(); - out.flush(); - out.close(); - } catch (MalformedURLException mURLe) { - System.out.println("Error - possibly missing URL for: " + cards[card].name); - //Log.error("LQ Pictures", "Malformed URL for: "+cards[card].name, mURLe); - } - } catch (FileNotFoundException fnfe) { - System.out.println("Error - the LQ picture for " + cards[card].name + " could not be found on the server. [" + cards[card].url + "] - " + fnfe.getMessage()); - } catch (Exception ex) { - Log.error("LQ Pictures", "Error downloading pictures", ex); - } - - // pause - - try { - Thread.sleep(r.nextInt(750) + 420); - } catch (InterruptedException e) { - Log.error("LQ Set Pictures", "Sleep Error", e); - } - }//for - } - close.setText(ForgeProps.getLocalized(BUTTONS.CLOSE)); - }//run - - /** - *

startDownload.

- * - * @param frame a {@link javax.swing.JFrame} object. - */ - public static void startDownload(JFrame frame) { - final mCard[] card = getNeededCards(); - - if (card.length == 0) { - JOptionPane.showMessageDialog(frame, ForgeProps.getLocalized(NO_MORE)); - return; - } - - Gui_DownloadSetPictures_LQ download = new Gui_DownloadSetPictures_LQ(card); - JDialog dlg = download.getDlg(frame); - dlg.setVisible(true); - dlg.dispose(); - download.setCancel(true); - }//startDownload() - - /** - *

getNeededCards.

- * - * @return an array of {@link forge.Gui_DownloadSetPictures_LQ.mCard} objects. - */ - private static mCard[] getNeededCards() { - //read all card names and urls - //mCard[] cardPlay = readFile(CARD_PICTURES); - //mCard[] cardTokenLQ = readFile(CARD_PICTURES_TOKEN_LQ); - - ArrayList CList = new ArrayList(); - - //File imgBase = ForgeProps.getFile(NewConstants.IMAGE_BASE); - String URLBase = "http://cardforge.org/fpics/"; - String imgFN = ""; - - for (Card c : AllZone.getCardFactory()) { - ArrayList cSetInfo = c.getSets(); - if (cSetInfo.size() > 0) { - for (int j = 0; j < cSetInfo.size(); j++) { - c.setCurSetCode(cSetInfo.get(j).Code); - String SC3 = c.getCurSetCode(); - String SC2 = SetInfoUtil.getSetCode2_SetCode3(c.getCurSetCode()); - - int n = 0; - if (cSetInfo.get(j).PicCount > 0) { - n = cSetInfo.get(j).PicCount; - - for (int k = 1; k <= n; k++) { - c.setRandomPicture(k); - - imgFN = CardUtil.buildFilename(c); - if (imgFN.equals("none") || (!imgFN.contains(SC3) && !imgFN.contains(SC2))) { - String fn = GuiDisplayUtil.cleanStringMWS(c.getName()) + k + ".full.jpg"; - CList.add(new mCard(SC3 + "/" + fn, URLBase + SC2 + "/" + Base64Coder.encodeString(fn, true), SC3)); - } - } - } else { - c.setRandomPicture(0); - - imgFN = CardUtil.buildFilename(c); - if (imgFN.equals("none") || (!imgFN.contains(SC3) && !imgFN.contains(SC2))) { - String fn = GuiDisplayUtil.cleanStringMWS(c.getName()) + ".full.jpg"; - //if (MyRandom.percentTrue(50)) - CList.add(new mCard(SC3 + "/" + fn, URLBase + SC2 + "/" + Base64Coder.encodeString(fn, true), SC3)); - //else - //CList.add(new mCard(SC3 + "/" + fn, c.getCurSetURL(), SC3)); - - } - - } - } - - } - - //Log.error(iName + ".jpg" + "\t" + URLs[0]); - - } - - //ArrayList list = new ArrayList(); - //File file; - - //File base = ForgeProps.getFile(IMAGE_TOKEN); - //for (int i = 0; i < cardTokenLQ.length; i++) { - // file = new File(base, cardTokenLQ[i].name.substring(3, cardTokenLQ[i].name.length())); - // if (!file.exists()) CList.add(cardTokenLQ[i]); - //} - - //return all card names and urls that are needed - mCard[] out = new mCard[CList.size()]; - CList.toArray(out); - - for (int i = 0; i < out.length; i++) - System.out.println(out[i].name + " " + out[i].url); - return out; - }//getNeededCards() - -/* *//** - *

readFile.

- * - * @param ABC a {@link java.lang.String} object. - * @return an array of {@link forge.Gui_DownloadSetPictures_LQ.mCard} objects. - *//* - private static mCard[] readFile(String ABC) { - try { - FileReader zrc = new FileReader(ForgeProps.getFile(ABC)); - BufferedReader in = new BufferedReader(zrc); - String line; - ArrayList list = new ArrayList(); - StringTokenizer tok; - - line = in.readLine(); - while (line != null && (!line.equals(""))) { - tok = new StringTokenizer(line); - list.add(new mCard(tok.nextToken(), tok.nextToken(), "")); - - line = in.readLine(); - } - - mCard[] out = new mCard[list.size()]; - list.toArray(out); - return out; - - } catch (Exception ex) { - ErrorViewer.showError(ex, "Gui_DownloadPictures: readFile() error"); - throw new RuntimeException("Gui_DownloadPictures : readFile() error"); - } - }//readFile() -*/ - private class ProxyHandler implements ChangeListener { - private int type; - - public ProxyHandler(int type) { - this.type = type; - } - - public void stateChanged(ChangeEvent e) { - if (((AbstractButton) e.getSource()).isSelected()) { - Gui_DownloadSetPictures_LQ.this.type = type; - addr.setEnabled(type != 0); - port.setEnabled(type != 0); - } - } - } - - private static class mCard { - final public String name; - final public String url; - final public String folder; - - mCard(String cardName, String cardURL, String cardFolder) { - name = cardName; - url = cardURL; - folder = cardFolder; - } - }//mCard -} diff --git a/src/forge/Gui_MigrateLocalMWSSetPictures_HQ.java b/src/forge/Gui_MigrateLocalMWSSetPictures_HQ.java deleted file mode 100644 index a14e2ed9ed8..00000000000 --- a/src/forge/Gui_MigrateLocalMWSSetPictures_HQ.java +++ /dev/null @@ -1,521 +0,0 @@ -package forge; - -import com.esotericsoftware.minlog.Log; -import forge.error.ErrorViewer; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - -import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.*; -import java.net.InetSocketAddress; -import java.net.MalformedURLException; -import java.net.Proxy; -import java.util.ArrayList; - -import static java.lang.Integer.parseInt; -import static javax.swing.JOptionPane.DEFAULT_OPTION; -import static javax.swing.JOptionPane.PLAIN_MESSAGE; - -//import java.io.BufferedReader; -//import java.io.FileReader; -//import java.util.Random; -//import java.util.StringTokenizer; - - -/** - *

Gui_MigrateLocalMWSSetPictures_HQ class.

- * - * @author Forge - * @version $Id: $ - */ -public class Gui_MigrateLocalMWSSetPictures_HQ extends DefaultBoundedRangeModel implements Runnable, NewConstants, NewConstants.LANG.Gui_DownloadPictures { - - /** Constant serialVersionUID=-7890794857949935256L */ - private static final long serialVersionUID = -7890794857949935256L; - - /** Constant types */ - public static final Proxy.Type[] types = Proxy.Type.values(); - - //proxy - private int type; - private JTextField addr, port; - - //progress - private mCard[] cards; - private int card; - private boolean cancel; - private JProgressBar bar; - - private JOptionPane dlg; - private JButton close; - - private long times[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - private int tptr = 0; - private long lTime = System.currentTimeMillis(); - - /** - *

getAverageTimePerCard.

- * - * @return a int. - */ - private int getAverageTimePerCard() { - int aTime = 0; - int nz = 10; - - if (tptr > 9) - tptr = 0; - - times[tptr] = System.currentTimeMillis() - lTime; - lTime = System.currentTimeMillis(); - - int tTime = 0; - for (int i = 0; i < 10; i++) { - tTime += times[i]; - if (times[i] == 0) - nz--; - } - aTime = tTime / nz; - - tptr++; - - return aTime; - } - - - /** - *

Constructor for Gui_MigrateLocalMWSSetPictures_HQ.

- * - * @param c an array of {@link forge.Gui_MigrateLocalMWSSetPictures_HQ.mCard} objects. - */ - private Gui_MigrateLocalMWSSetPictures_HQ(mCard[] c) { - this.cards = c; - addr = new JTextField(ForgeProps.getLocalized(PROXY_ADDRESS)); - port = new JTextField(ForgeProps.getLocalized(PROXY_PORT)); - bar = new JProgressBar(this); - - JPanel p0 = new JPanel(); - p0.setLayout(new BoxLayout(p0, BoxLayout.Y_AXIS)); - - //Proxy Choice - ButtonGroup bg = new ButtonGroup(); - String[] labels = { - ForgeProps.getLocalized(NO_PROXY), ForgeProps.getLocalized(HTTP_PROXY), - ForgeProps.getLocalized(SOCKS_PROXY)}; - for (int i = 0; i < types.length; i++) { - JRadioButton rb = new JRadioButton(labels[i]); - rb.addChangeListener(new ProxyHandler(i)); - bg.add(rb); - p0.add(rb); - if (i == 0) rb.setSelected(true); - } - - //Proxy config - p0.add(addr); - p0.add(port); -// JTextField[] tfs = {addr, port}; -// String[] labels = {"Address", "Port"}; -// for(int i = 0; i < labels.length; i++) { -// JPanel p1 = new JPanel(new BorderLayout()); -// p0.add(p1); -//// p1.add(new JLabel(labels[i]), WEST); -// p1.add(tfs[i]); -// } - - //Start - final JButton b = new JButton("Start copying"); - b.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - new Thread(Gui_MigrateLocalMWSSetPictures_HQ.this).start(); - b.setEnabled(false); - } - }); -// p0.add(b); - - p0.add(Box.createVerticalStrut(5)); - - //Progress - p0.add(bar); - bar.setStringPainted(true); - //bar.setString(ForgeProps.getLocalized(BAR_BEFORE_START)); - bar.setString(card + "/" + cards.length); - //bar.setString(String.format(ForgeProps.getLocalized(card == cards.length? BAR_CLOSE:BAR_WAIT), this.card, cards.length)); - Dimension d = bar.getPreferredSize(); - d.width = 300; - bar.setPreferredSize(d); - - //JOptionPane - Object[] options = {b, close = new JButton(ForgeProps.getLocalized(BUTTONS.CANCEL))}; - dlg = new JOptionPane(p0, DEFAULT_OPTION, PLAIN_MESSAGE, null, options, options[1]); - } - - /** {@inheritDoc} */ - @Override - public int getMinimum() { - return 0; - } - - /** {@inheritDoc} */ - @Override - public int getValue() { - return card; - } - - /** {@inheritDoc} */ - @Override - public int getExtent() { - return 0; - } - - /** {@inheritDoc} */ - @Override - public int getMaximum() { - return cards == null ? 0 : cards.length; - } - - /** - *

update.

- * - * @param card a int. - */ - private void update(int card) { - this.card = card; - - final class Worker implements Runnable { - private int card; - - Worker(int card) { - this.card = card; - } - - public void run() { - fireStateChanged(); - - StringBuilder sb = new StringBuilder(); - - int a = getAverageTimePerCard(); - - if (card != cards.length) { - sb.append(card + "/" + cards.length + " - "); - - long t2Go = (cards.length - card) * a; - - boolean secOnly = true; - if (t2Go > 3600000) { - sb.append(String.format("%02d:", t2Go / 3600000)); - t2Go = t2Go % 3600000; - secOnly = false; - } - if (t2Go > 60000) { - sb.append(String.format("%02d:", t2Go / 60000)); - t2Go = t2Go % 60000; - secOnly = false; - } - if (!secOnly) - sb.append(String.format("%02d remaining.", t2Go / 1000)); - else - sb.append(String.format("0:%02d remaining.", t2Go / 1000)); - } else - sb.append(String.format(ForgeProps.getLocalized(BAR_CLOSE), card, cards.length)); - - bar.setString(sb.toString()); - //bar.setString(String.format(ForgeProps.getLocalized(card == cards.length? BAR_CLOSE:BAR_WAIT), card, - // cards.length)); - System.out.println(card + "/" + cards.length + " - " + a); - } - } - ; - EventQueue.invokeLater(new Worker(card)); - } - - /** - *

Getter for the field dlg.

- * - * @param frame a {@link javax.swing.JFrame} object. - * @return a {@link javax.swing.JDialog} object. - */ - public JDialog getDlg(JFrame frame) { - final JDialog dlg = this.dlg.createDialog(frame, ForgeProps.getLocalized(TITLE)); - close.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - dlg.setVisible(false); - } - }); - return dlg; - } - - /** - *

Setter for the field cancel.

- * - * @param cancel a boolean. - */ - public void setCancel(boolean cancel) { - this.cancel = cancel; - } - - - /** - *

run.

- */ - public void run() { - BufferedInputStream in; - BufferedOutputStream out; - - File base = ForgeProps.getFile(IMAGE_BASE); - - //Random r = MyRandom.random; - - Proxy p = null; - if (type == 0) p = Proxy.NO_PROXY; - else try { - p = new Proxy(types[type], new InetSocketAddress(addr.getText(), parseInt(port.getText()))); - } catch (Exception ex) { - ErrorViewer.showError(ex, ForgeProps.getLocalized(ERRORS.PROXY_CONNECT), addr.getText(), - port.getText()); - //throw new RuntimeException("Gui_DownloadPictures : error 1 - " +ex); - return; - } - - if (p != null) { - byte[] buf = new byte[1024]; - int len; - System.out.println("basedir: " + base); - for (update(0); card < cards.length && !cancel; update(card + 1)) { - try { - String url = cards[card].url; - String cName; - if (cards[card].name.substring(0, 3).equals("[T]")) { - base = ForgeProps.getFile(IMAGE_TOKEN); - cName = cards[card].name.substring(3, cards[card].name.length()); - } else { - base = ForgeProps.getFile(IMAGE_BASE); - cName = cards[card].name; - } - - File f = new File(base, cName); - - //test for folder existence - File test = new File(base, cards[card].folder); - if (!test.exists()) { - // create folder - if (!test.mkdir()) - System.out.println("Can't create folder" + cards[card].folder); - } - - try { - //in = new BufferedInputStream(new URL(url).openConnection(p).getInputStream()); - - File src = new File(url); - InputStream in2 = new FileInputStream(src); - - in = new BufferedInputStream(in2); - out = new BufferedOutputStream(new FileOutputStream(f)); - - while ((len = in.read(buf)) != -1) { - //user cancelled - if (cancel) { - in.close(); - out.flush(); - out.close(); - - //delete what was written so far - f.delete(); - - return; - }//if - cancel - - out.write(buf, 0, len); - }//while - read and write file - - in.close(); - out.flush(); - out.close(); - } catch (MalformedURLException mURLe) { - //System.out.println("Error - possibly missing URL for: "+cards[card].name); - //Log.error("LQ Pictures", "Malformed URL for: "+cards[card].name, mURLe); - } - } catch (FileNotFoundException fnfe) { - System.out.println("Error - the HQ picture for " + cards[card].name + " could not be found. [" + cards[card].url + "] - " + fnfe.getMessage()); - } catch (Exception ex) { - Log.error("HQ Pictures", "Error copying pictures", ex); - } - - // pause - - try { - Thread.sleep(1); - } catch (InterruptedException e) { - Log.error("HQ Set Pictures", "Sleep Error", e); - } - }//for - } - close.setText(ForgeProps.getLocalized(BUTTONS.CLOSE)); - }//run - - /** - *

startDownload.

- * - * @param frame a {@link javax.swing.JFrame} object. - */ - public static void startDownload(JFrame frame) { - final mCard[] card = getNeededCards(); - - if (card.length == 0) { - JOptionPane.showMessageDialog(frame, ForgeProps.getLocalized(NO_MORE)); - return; - } - - Gui_MigrateLocalMWSSetPictures_HQ download = new Gui_MigrateLocalMWSSetPictures_HQ(card); - JDialog dlg = download.getDlg(frame); - dlg.setVisible(true); - dlg.dispose(); - download.setCancel(true); - }//startDownload() - - /** - *

getNeededCards.

- * - * @return an array of {@link forge.Gui_MigrateLocalMWSSetPictures_HQ.mCard} objects. - */ - private static mCard[] getNeededCards() { - //read all card names and urls - //mCard[] cardPlay = readFile(CARD_PICTURES); - //mCard[] cardTokenLQ = readFile(CARD_PICTURES_TOKEN_LQ); - - ArrayList CList = new ArrayList(); - - //File imgBase = ForgeProps.getFile(NewConstants.IMAGE_BASE); - String URLBase = "C:\\MTGForge\\HQPICS\\"; - String imgFN = ""; - - for (Card c : AllZone.getCardFactory()) { - //String url = c.getSVar("Picture"); - //String[] URLs = url.split("\\\\"); - - ArrayList cSetInfo = c.getSets(); - if (cSetInfo.size() > 0) { - for (int j = 0; j < cSetInfo.size(); j++) { - c.setCurSetCode(cSetInfo.get(j).Code); - String SC3 = c.getCurSetCode(); - String SC2 = SetInfoUtil.getSetCode2_SetCode3(c.getCurSetCode()); - - int n = 0; - if (cSetInfo.get(j).PicCount > 0) { - n = cSetInfo.get(j).PicCount; - - for (int k = 1; k <= n; k++) { - c.setRandomPicture(k); - - imgFN = CardUtil.buildFilename(c); - - if (imgFN.equals("none") || (!imgFN.contains(SC3) && !imgFN.contains(SC2))) { - imgFN += k + ".jpg"; - String fn = GuiDisplayUtil.cleanStringMWS(c.getName()) + k + ".full.jpg"; - //CList.add(new mCard(SC3 + "/" + fn, URLBase + SC2 + "/" + Base64Coder.encodeString(fn, true), SC3)); - CList.add(new mCard(SC3 + "\\" + imgFN, URLBase + SC2 + "\\" + fn, SC3)); - } - } - } else { - c.setRandomPicture(0); - - imgFN = CardUtil.buildFilename(c); - - if (imgFN.equals("none") || (!imgFN.contains(SC3) && !imgFN.contains(SC2))) { - //imgFN += ".jpg"; - - String newFileName = GuiDisplayUtil.cleanString(c.getName()) + ".jpg"; - - String fn = GuiDisplayUtil.cleanStringMWS(c.getName()) + ".full.jpg"; - //fn = fn.replace(" ", "%20%"); - //CList.add(new mCard(SC3 + "/" + fn, URLBase + SC2 + "/" + Base64Coder.encodeString(fn, true), SC3)); - CList.add(new mCard(SC3 + "\\" + newFileName, URLBase + SC2 + "\\" + fn, SC3)); - - } - - } - } - - } - - //Log.error(iName + ".jpg" + "\t" + URLs[0]); - - } - - //ArrayList list = new ArrayList(); - //File file; - /* - File base = ForgeProps.getFile(IMAGE_TOKEN); - for(int i = 0; i < cardTokenLQ.length; i++) { - file = new File(base, cardTokenLQ[i].name.substring(3, cardTokenLQ[i].name.length())); - if(!file.exists()) CList.add(cardTokenLQ[i]); - } - */ - //return all card names and urls that are needed - mCard[] out = new mCard[CList.size()]; - CList.toArray(out); - - for (int i = 0; i < out.length; i++) - System.out.println(out[i].name + " " + out[i].url); - return out; - }//getNeededCards() - /* - private static mCard[] readFile(String ABC) { - try { - FileReader zrc = new FileReader(ForgeProps.getFile(ABC)); - BufferedReader in = new BufferedReader(zrc); - String line; - ArrayList list = new ArrayList(); - StringTokenizer tok; - - line = in.readLine(); - while(line != null && (!line.equals(""))) { - tok = new StringTokenizer(line); - list.add(new mCard(tok.nextToken(), tok.nextToken(), "")); - - line = in.readLine(); - } - - mCard[] out = new mCard[list.size()]; - list.toArray(out); - return out; - - } catch(Exception ex) { - ErrorViewer.showError(ex, "Gui_DownloadPictures: readFile() error"); - throw new RuntimeException("Gui_DownloadPictures : readFile() error"); - } - }//readFile() - */ - - private class ProxyHandler implements ChangeListener { - private int type; - - public ProxyHandler(int type) { - this.type = type; - } - - public void stateChanged(ChangeEvent e) { - if (((AbstractButton) e.getSource()).isSelected()) { - Gui_MigrateLocalMWSSetPictures_HQ.this.type = type; - addr.setEnabled(type != 0); - port.setEnabled(type != 0); - } - } - } - - private static class mCard { - final public String name; - final public String url; - final public String folder; - - mCard(String cardName, String cardURL, String cardFolder) { - name = cardName; - url = cardURL; - folder = cardFolder; - } - }//mCard -} diff --git a/src/forge/Gui_NewGame.java b/src/forge/Gui_NewGame.java deleted file mode 100644 index a51e7a146c0..00000000000 --- a/src/forge/Gui_NewGame.java +++ /dev/null @@ -1,1808 +0,0 @@ -package forge; - -import arcane.ui.util.ManaSymbols; -import arcane.util.MultiplexOutputStream; -import com.esotericsoftware.minlog.Log; -import forge.deck.Deck; -import forge.deck.DeckManager; -import forge.deck.generate.*; -import forge.error.ErrorViewer; -import forge.error.BugzReporter; -import forge.error.ExceptionHandler; -import forge.gui.GuiUtils; -import forge.gui.ListChooser; -import forge.properties.ForgePreferences; -import forge.properties.ForgePreferences.CardSizeType; -import forge.properties.ForgePreferences.StackOffsetType; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; -import forge.properties.NewConstants.LANG.Gui_NewGame.MENU_BAR.MENU; -import forge.properties.NewConstants.LANG.Gui_NewGame.MENU_BAR.OPTIONS; -import net.miginfocom.swing.MigLayout; - -import javax.swing.*; -import javax.swing.UIManager.LookAndFeelInfo; -import javax.swing.border.TitledBorder; -import java.awt.Color; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.io.*; -import java.util.*; -import java.util.List; - -/*CHOPPIC*/ - -/** - *

- * Gui_NewGame class. - *

- * - * @author Forge - * @version $Id: $ - */ -public class Gui_NewGame extends JFrame implements NewConstants, NewConstants.LANG.Gui_NewGame { - /** Constant serialVersionUID=-2437047615019135648L. */ - private static final long serialVersionUID = -2437047615019135648L; - - // private final DeckManager deckManager = new - // DeckManager(ForgeProps.getFile(NEW_DECKS)); - private final DeckManager deckManager = AllZone.getDeckManager(); - // with the new IO, there's no reason to use different instances - private List allDecks; - /** Constant editor. */ - private static Gui_DeckEditor editor; - - private JLabel titleLabel = new JLabel(); - private JLabel jLabel2 = new JLabel(); - private JLabel jLabel3 = new JLabel(); - private JComboBox humanComboBox = new JComboBox(); - private JComboBox computerComboBox = new JComboBox(); - private JButton deckEditorButton = new JButton(); - private JButton startButton = new JButton(); - private ButtonGroup buttonGroup1 = new ButtonGroup(); - private JRadioButton sealedRadioButton = new JRadioButton(); - private JRadioButton singleRadioButton = new JRadioButton(); - - private JRadioButton draftRadioButton = new JRadioButton(); - - /* CHOPPIC */ - private CustomPanel jPanel1 = new CustomPanel(10); - private CustomPanel jPanel2 = new CustomPanel(10); - private CustomPanel jPanel3 = new CustomPanel(10); - /* CHOPPIC */ - - // @SuppressWarnings("unused") - // titledBorder2 - /** Constant newGuiCheckBox */ - // private static JCheckBox newGuiCheckBox = new JCheckBox("", true); - /** Constant smoothLandCheckBox */ - private static JCheckBox smoothLandCheckBox = new JCheckBox("", false); - /** Constant devModeCheckBox */ - private static JCheckBox devModeCheckBox = new JCheckBox("", true); - - private static JCheckBox upldDrftCheckBox = new JCheckBox("", true); - private static JCheckBox foilRandomCheckBox = new JCheckBox("", true); - - // GenerateConstructedDeck.get2Colors() and GenerateSealedDeck.get2Colors() - // use these two variables - /** Constant removeSmallCreatures. */ - public static JCheckBoxMenuItem removeSmallCreatures = new JCheckBoxMenuItem( - ForgeProps.getLocalized(MENU_BAR.OPTIONS.GENERATE.REMOVE_SMALL)); - /** Constant removeArtifacts. */ - public static JCheckBoxMenuItem removeArtifacts = new JCheckBoxMenuItem( - ForgeProps.getLocalized(MENU_BAR.OPTIONS.GENERATE.REMOVE_ARTIFACTS)); - /** Constant useLAFFonts. */ - public static JCheckBoxMenuItem useLAFFonts = new JCheckBoxMenuItem(ForgeProps.getLocalized(MENU_BAR.OPTIONS.FONT)); - /** Constant cardOverlay. */ - public static JCheckBoxMenuItem cardOverlay = new JCheckBoxMenuItem( - ForgeProps.getLocalized(MENU_BAR.OPTIONS.CARD_OVERLAY)); - /** Constant cardScale. */ - public static JCheckBoxMenuItem cardScale = new JCheckBoxMenuItem( - ForgeProps.getLocalized(MENU_BAR.OPTIONS.CARD_SCALE)); - private JButton questButton = new JButton(); - - private Action LOOK_AND_FEEL_ACTION = new LookAndFeelAction(this); - // private Action DOWNLOAD_ACTION = new DownloadAction(); - private Action DOWNLOAD_ACTION_LQ = new DownloadActionLQ(); - private Action DOWNLOAD_ACTION_SETLQ = new DownloadActionSetLQ(); - private Action IMPORT_PICTURE = new ImportPictureAction(); - private Action CARD_SIZES_ACTION = new CardSizesAction(); - private Action CARD_STACK_ACTION = new CardStackAction(); - private Action CARD_STACK_OFFSET_ACTION = new CardStackOffsetAction(); - private Action ABOUT_ACTION = new AboutAction(); - private Action HOW_TO_PLAY_ACTION = new HowToPlayAction(); - private Action DNLD_PRICES_ACTION = new DownloadPriceAction(); - private Action BUGZ_REPORTER_ACTION = new BugzReporterAction(); - - /** Constant preferences */ - public static ForgePreferences preferences; - - /** - *

- * main. - *

- * - * @param args - * an array of {@link java.lang.String} objects. - */ - public static void main(String[] args) { - ExceptionHandler.registerErrorHandling(); - File logFile = new File("forge.log"); - logFile.delete(); - try { - OutputStream logFileStream = new BufferedOutputStream(new FileOutputStream(logFile)); - System.setOut(new PrintStream(new MultiplexOutputStream(System.out, logFileStream), true)); - System.setErr(new PrintStream(new MultiplexOutputStream(System.err, logFileStream), true)); - } catch (FileNotFoundException ex) { - ErrorViewer.showError(ex); - } - try { - preferences = new ForgePreferences("forge.preferences"); - useLAFFonts.setSelected(preferences.lafFonts); - // newGuiCheckBox.setSelected(preferences.newGui); - smoothLandCheckBox.setSelected(preferences.stackAiLand); - Constant.Runtime.Mill[0] = preferences.millingLossCondition; - Constant.Runtime.DevMode[0] = preferences.developerMode; - devModeCheckBox.setSelected(preferences.developerMode); - cardOverlay.setSelected(preferences.cardOverlay); - ImageCache.scaleLargerThanOriginal = preferences.scaleLargerThanOriginal; - cardScale.setSelected(preferences.scaleLargerThanOriginal); - CardStackOffsetAction.set(preferences.stackOffset); - CardStackAction.setVal(preferences.maxStackSize); - CardSizesAction.set(preferences.cardSize); - Constant.Runtime.UpldDrft[0] = preferences.uploadDraftAI; - upldDrftCheckBox.setSelected(preferences.uploadDraftAI); - Constant.Runtime.RndCFoil[0] = preferences.randCFoil; - foilRandomCheckBox.setSelected(preferences.randCFoil); - - HttpUtil pinger = new HttpUtil(); - if (pinger.getURL("http://cardforge.org/draftAI/ping.php").equals("pong")) { - Constant.Runtime.NetConn[0] = true; - } else { - Constant.Runtime.UpldDrft[0] = false; - } - - } catch (Exception e) { - Log.error("Error loading preferences"); - } - - loadDynamicGamedata(); - - SwingUtilities.invokeLater(new Runnable() { - public void run() { - try { - if (preferences.laf.equals("")) { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } else { - UIManager.setLookAndFeel(preferences.laf); - } - } catch (Exception ex) { - ErrorViewer.showError(ex); - } - } - }); - - try { - Constant.Runtime.GameType[0] = Constant.GameType.Constructed; - SwingUtilities.invokeLater(new Runnable() { - public void run() { - AllZone.setComputer(new ComputerAI_Input(new ComputerAI_General())); - new Gui_NewGame(); - } - }); - } catch (Exception ex) { - ErrorViewer.showError(ex); - } - - } - - /** - *

- * Constructor for Gui_NewGame. - *

- */ - public Gui_NewGame() { - - AllZone.setQuestData(null); - allDecks = getDecks(); - Constant.Runtime.matchState.reset(); - - if (Constant.Runtime.width[0] == 0) { - Constant.Runtime.width[0] = 70; - } - - if (Constant.Runtime.height[0] == 0) { - Constant.Runtime.height[0] = 98; - } - - if (Constant.Runtime.stackSize[0] == 0) { - Constant.Runtime.stackSize[0] = 4; - } - - if (Constant.Runtime.stackOffset[0] == 0) { - Constant.Runtime.stackOffset[0] = 10; - } - - try { - jbInit(); - } catch (Exception ex) { - ErrorViewer.showError(ex); - } - - if (Constant.Runtime.GameType[0].equals(Constant.GameType.Constructed)) { - singleRadioButton.setSelected(true); - updateDeckComboBoxes(); - } - if (Constant.Runtime.GameType[0].equals(Constant.GameType.Sealed)) { - sealedRadioButton.setSelected(true); - updateDeckComboBoxes(); - } - if (Constant.Runtime.GameType[0].equals(Constant.GameType.Draft)) { - draftRadioButton.setSelected(true); - draftRadioButton_actionPerformed(null); - } - - addListeners(); - - this.setSize(550, 565); - GuiUtils.centerFrame(this); - - setTitle(ForgeProps.getLocalized(LANG.PROGRAM_NAME)); - setupMenu(); - setVisible(true); - - ManaSymbols.loadImages(); - Log.WARN(); // set logging level to warn - SwingUtilities.updateComponentTreeUI(this); - } - - // init() - - /** - *

- * setupMenu. - *

- */ - private void setupMenu() { - Action[] actions = { - // Remove the option to download HQ pics since the HQ pics - // server appears to be offline. - // LOOK_AND_FEEL_ACTION, DNLD_PRICES_ACTION, DOWNLOAD_ACTION, - // DOWNLOAD_ACTION_LQ, DOWNLOAD_ACTION_SETLQ, IMPORT_PICTURE, - // CARD_SIZES_ACTION, - LOOK_AND_FEEL_ACTION, DNLD_PRICES_ACTION, DOWNLOAD_ACTION_LQ, DOWNLOAD_ACTION_SETLQ, IMPORT_PICTURE, - CARD_SIZES_ACTION, CARD_STACK_ACTION, CARD_STACK_OFFSET_ACTION, BUGZ_REPORTER_ACTION, - ErrorViewer.ALL_THREADS_ACTION, ABOUT_ACTION }; - JMenu menu = new JMenu(ForgeProps.getLocalized(MENU.TITLE)); - for (Action a : actions) { - menu.add(a); - if (a.equals(LOOK_AND_FEEL_ACTION) || a.equals(IMPORT_PICTURE) || a.equals(CARD_STACK_OFFSET_ACTION) - || a.equals(ErrorViewer.ALL_THREADS_ACTION)) { - menu.addSeparator(); - } - } - - // useLAFFonts.setSelected(false); - - // new stuff - JMenu generatedDeck = new JMenu(ForgeProps.getLocalized(MENU_BAR.OPTIONS.GENERATE.TITLE)); - generatedDeck.add(removeSmallCreatures); - generatedDeck.add(removeArtifacts); - JMenu optionsMenu = new JMenu(ForgeProps.getLocalized(OPTIONS.TITLE)); - optionsMenu.add(generatedDeck); - - optionsMenu.add(useLAFFonts); - optionsMenu.addSeparator(); - optionsMenu.add(cardOverlay); - optionsMenu.add(cardScale); - - cardScale.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent arg0) { - ImageCache.scaleLargerThanOriginal = cardScale.isSelected(); - } - }); - - JMenu helpMenu = new JMenu(ForgeProps.getLocalized(MENU_BAR.HELP.TITLE)); - - Action[] helpActions = { HOW_TO_PLAY_ACTION }; - for (Action a : helpActions) { - helpMenu.add(a); - } - - JMenuBar bar = new JMenuBar(); - bar.add(menu); - bar.add(optionsMenu); - bar.add(helpMenu); - // bar.add(new MenuItem_HowToPlay()); - - setJMenuBar(bar); - } - - // returns, ArrayList of Deck objects - /** - *

- * getDecks. - *

- * - * @return a {@link java.util.List} object. - */ - private List getDecks() { - List list = new ArrayList(deckManager.getDecks()); - - Collections.sort(list); - return list; - } - - /** - *

- * addListeners. - *

- */ - private void addListeners() { - this.addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent ev) { - System.exit(0); - } - }); - - questButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - // close this windows - // can't use this.dispose() because "this" object is an - // ActionListener - Gui_NewGame.this.dispose(); - - new Gui_QuestOptions(); - } - }); - } // addListeners() - - /** - *

- * setupSealed. - *

- */ - private void setupSealed() { - Deck deck = new Deck(Constant.GameType.Sealed); - - // ReadBoosterPack booster = new ReadBoosterPack(); - // CardList pack = booster.getBoosterPack5(); - - ArrayList sealedTypes = new ArrayList(); - sealedTypes.add("Full Cardpool"); - sealedTypes.add("Block / Set"); - sealedTypes.add("Custom"); - - String prompt = "Choose Sealed Deck Format:"; - Object o = GuiUtils.getChoice(prompt, sealedTypes.toArray()); - - SealedDeck sd = null; - - if (o.toString().equals(sealedTypes.get(0))) { - sd = new SealedDeck("Full"); - } - - else if (o.toString().equals(sealedTypes.get(1))) { - sd = new SealedDeck("Block"); - } - - else if (o.toString().equals(sealedTypes.get(2))) { - sd = new SealedDeck("Custom"); - } - - CardList sDeck = sd.getCardpool(); - - if (sDeck.size() > 1) { - - for (int i = 0; i < sDeck.size(); i++) { - deck.addSideboard(sDeck.get(i).getName() + "|" + sDeck.get(i).getCurSetCode()); - } - - for (int i = 0; i < Constant.Color.BasicLands.length; i++) { - for (int j = 0; j < 18; j++) { - deck.addSideboard(Constant.Color.BasicLands[i] + "|" + sd.LandSetCode[0]); - } - } - - String sDeckName = JOptionPane.showInputDialog(null, - ForgeProps.getLocalized(NEW_GAME_TEXT.SAVE_SEALED_MSG), - ForgeProps.getLocalized(NEW_GAME_TEXT.SAVE_SEALED_TTL), JOptionPane.QUESTION_MESSAGE); - deck.setName(sDeckName); - deck.addMetaData("PlayerType", "Human"); - - Constant.Runtime.HumanDeck[0] = deck; - Constant.Runtime.GameType[0] = Constant.GameType.Sealed; - - Deck aiDeck = sd.buildAIDeck(sd.getCardpool()); - aiDeck.setName("AI_" + sDeckName); - aiDeck.addMetaData("PlayerType", "AI"); - deckManager.addDeck(aiDeck); - deckManager.writeAllDecks(); - deckManager.readAllDecks(); - updateDeckComboBoxes(); - - deckEditorButton_actionPerformed(null); - editor.customMenu.setCurrentGameType(Constant.GameType.Sealed); - editor.customMenu.showSealedDeck(deck); - - Constant.Runtime.ComputerDeck[0] = aiDeck; - } else { - new Gui_NewGame(); - } - } - - /** - *

- * setupDraft. - *

- */ - private void setupDraft() { - Gui_BoosterDraft draft = new Gui_BoosterDraft(); - - // determine what kind of booster draft to run - ArrayList draftTypes = new ArrayList(); - draftTypes.add("Full Cardpool"); - draftTypes.add("Block / Set"); - draftTypes.add("Custom"); - - String prompt = "Choose Draft Format:"; - Object o = GuiUtils.getChoice(prompt, draftTypes.toArray()); - - if (o.toString().equals(draftTypes.get(0))) { - draft.showGui(new BoosterDraft_1("Full")); - } - - else if (o.toString().equals(draftTypes.get(1))) { - draft.showGui(new BoosterDraft_1("Block")); - } - - else if (o.toString().equals(draftTypes.get(2))) { - draft.showGui(new BoosterDraft_1("Custom")); - } - - } - - /** - *

- * jbInit. - *

- * - * @throws java.lang.Exception - * if any. - */ - private void jbInit() throws Exception { - - /* - * border1 = BorderFactory.createEtchedBorder(Color.white, new - * Color(148, 145, 140)); titledBorder1 = new TitledBorder(border1, - * ForgeProps.getLocalized(NEW_GAME_TEXT.GAMETYPE)); border2 = - * BorderFactory.createEtchedBorder(Color.white, new Color(148, 145, - * 140)); titledBorder2 = new TitledBorder(border2, - * ForgeProps.getLocalized(NEW_GAME_TEXT.LIBRARY)); border3 = - * BorderFactory.createEtchedBorder(Color.white, new Color(148, 145, - * 140)); titledBorder3 = new TitledBorder(border3, - * ForgeProps.getLocalized(NEW_GAME_TEXT.SETTINGS)); - */ - - /* - * CHOPPIC titledBorder1 = - * BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), - * ForgeProps.getLocalized(NEW_GAME_TEXT.GAMETYPE)); titledBorder2 = - * BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), - * ForgeProps.getLocalized(NEW_GAME_TEXT.LIBRARY)); titledBorder3 = - * BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), - * ForgeProps.getLocalized(NEW_GAME_TEXT.SETTINGS)); - * titledBorder1.setTitlePosition(TitledBorder.ABOVE_TOP); - * titledBorder2.setTitlePosition(TitledBorder.ABOVE_TOP); - * titledBorder3.setTitlePosition(TitledBorder.ABOVE_TOP); - */ - - titleLabel.setText(ForgeProps.getLocalized(NEW_GAME_TEXT.NEW_GAME)); - titleLabel.setFont(new java.awt.Font("Dialog", 0, 26)); - - /* CHOPPIC */ - titleLabel.setForeground(Color.WHITE); - /* CHOPPIC */ - - titleLabel.setHorizontalAlignment(SwingConstants.CENTER); - - this.getContentPane().setLayout(new MigLayout("fill")); - - /* - * Game Type Panel - */ - - /* jPanel2.setBorder(titledBorder1); */ - setCustomBorder(jPanel2, ForgeProps.getLocalized(NEW_GAME_TEXT.GAMETYPE)); - jPanel2.setLayout(new MigLayout("align center")); - - singleRadioButton.setText(ForgeProps.getLocalized(NEW_GAME_TEXT.CONSTRUCTED_TEXT)); - singleRadioButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - singleRadioButton_actionPerformed(e); - } - }); - - // sealedRadioButton.setToolTipText(""); - sealedRadioButton.setText(ForgeProps.getLocalized(NEW_GAME_TEXT.SEALED_TEXT)); - sealedRadioButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - sealedRadioButton_actionPerformed(e); - } - }); - - // draftRadioButton.setToolTipText(""); - draftRadioButton.setText(ForgeProps.getLocalized(NEW_GAME_TEXT.BOOSTER_TEXT)); - draftRadioButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - draftRadioButton_actionPerformed(e); - } - }); - - /* - * Library Panel - */ - - /* jPanel1.setBorder(titledBorder2); */ - setCustomBorder(jPanel1, ForgeProps.getLocalized(NEW_GAME_TEXT.LIBRARY)); - jPanel1.setLayout(new MigLayout("align center")); - - jLabel2.setText(ForgeProps.getLocalized(NEW_GAME_TEXT.YOURDECK)); - jLabel3.setText(ForgeProps.getLocalized(NEW_GAME_TEXT.OPPONENT)); - - humanComboBox.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - humanComboBox_actionPerformed(e); - } - }); - - /* - * Settings Panel - */ - - /* jPanel3.setBorder(titledBorder3); */ - setCustomBorder(jPanel3, ForgeProps.getLocalized(NEW_GAME_TEXT.SETTINGS)); - jPanel3.setLayout(new MigLayout("align center")); - - // newGuiCheckBox.setText(ForgeProps.getLocalized(NEW_GAME_TEXT.NEW_GUI)); - smoothLandCheckBox.setText(ForgeProps.getLocalized(NEW_GAME_TEXT.AI_LAND)); - - devModeCheckBox.setText(ForgeProps.getLocalized(NEW_GAME_TEXT.DEV_MODE)); - devModeCheckBox.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - Constant.Runtime.DevMode[0] = devModeCheckBox.isSelected(); - preferences.developerMode = Constant.Runtime.DevMode[0]; - } - }); - - upldDrftCheckBox.setText("Upload Draft Picks"); - upldDrftCheckBox - .setToolTipText("Your picks and all other participants' picks will help the Forge AI make better draft picks."); - upldDrftCheckBox.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - Constant.Runtime.UpldDrft[0] = upldDrftCheckBox.isSelected(); - preferences.uploadDraftAI = Constant.Runtime.UpldDrft[0]; - } - }); - - foilRandomCheckBox.setText("Random Foiling"); - foilRandomCheckBox.setToolTipText("Approximately 1:20 cards will appear with foiling effects applied."); - foilRandomCheckBox.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - Constant.Runtime.RndCFoil[0] = foilRandomCheckBox.isSelected(); - preferences.randCFoil = Constant.Runtime.RndCFoil[0]; - } - }); - - /* - * Buttons - */ - - deckEditorButton.setToolTipText(""); - deckEditorButton.setFont(new java.awt.Font("Dialog", 0, 15)); - deckEditorButton.setText(ForgeProps.getLocalized(NEW_GAME_TEXT.DECK_EDITOR)); - deckEditorButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - deckEditorButton_actionPerformed(e); - } - }); - - startButton.setFont(new java.awt.Font("Dialog", 0, 18)); - startButton.setHorizontalTextPosition(SwingConstants.LEADING); - startButton.setText(ForgeProps.getLocalized(NEW_GAME_TEXT.START_GAME)); - startButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - startButton_actionPerformed(e); - } - }); - - questButton.setFont(new java.awt.Font("Dialog", 0, 18)); - questButton.setText(ForgeProps.getLocalized(NEW_GAME_TEXT.QUEST_MODE)); - - this.getContentPane().add(titleLabel, "align center, span 3, grow, wrap"); - - this.getContentPane().add(jPanel2, "span 3, grow, wrap"); - jPanel2.add(singleRadioButton, "span 3, wrap"); - jPanel2.add(sealedRadioButton, "span 3, wrap"); - jPanel2.add(draftRadioButton, "span 3, wrap"); - updatePanelDisplay(jPanel2); - - this.getContentPane().add(jPanel1, "span 2, grow"); - jPanel1.add(jLabel2); - jPanel1.add(humanComboBox, "sg combobox, wrap"); - jPanel1.add(jLabel3); - jPanel1.add(computerComboBox, "sg combobox"); - updatePanelDisplay(jPanel1); - - this.getContentPane().add(deckEditorButton, "sg buttons, align 50% 50%, wrap"); - - this.getContentPane().add(jPanel3, "span 2, grow"); - - // jPanel3.add(newGuiCheckBox, "wrap"); - jPanel3.add(smoothLandCheckBox, "wrap"); - jPanel3.add(devModeCheckBox, "wrap"); - jPanel3.add(upldDrftCheckBox, "wrap"); - jPanel3.add(foilRandomCheckBox, "wrap"); - updatePanelDisplay(jPanel3); - - this.getContentPane().add(startButton, "sg buttons, align 50% 50%, split 2, flowy"); - this.getContentPane().add(questButton, "sg buttons, align 50% 50%"); - - buttonGroup1.add(singleRadioButton); - buttonGroup1.add(sealedRadioButton); - buttonGroup1.add(draftRadioButton); - - /* CHOPPIC */ - /* Add background image */ - ((JPanel) getContentPane()).setOpaque(false); - ImageIcon bkgd = new ImageIcon("res/images/ui/newgame_background.jpg"); - JLabel myLabel = new JLabel(bkgd); - getLayeredPane().add(myLabel, new Integer(Integer.MIN_VALUE)); - myLabel.setBounds(0, 0, bkgd.getIconWidth(), bkgd.getIconHeight()); - /* CHOPPIC */ - - } - - /* CHOPPIC */ - /* Update Panel Display */ - /** - *

- * updatePanelDisplay. - *

- * - * @param panel - * a {@link javax.swing.JPanel} object. - */ - void updatePanelDisplay(JPanel panel) { - for (Component c : panel.getComponents()) { - if (c instanceof JRadioButton) { - ((JRadioButton) c).setOpaque(false); - } else if (c instanceof JLabel) { - ((JLabel) c).setOpaque(false); - } else if (c instanceof JCheckBox) { - ((JCheckBox) c).setOpaque(false); - } - } - panel.setOpaque(false); - } - - /** - *

- * setCustomBorder. - *

- * - * @param panel - * a {@link javax.swing.JPanel} object. - * @param title - * a {@link java.lang.String} object. - */ - void setCustomBorder(JPanel panel, String title) { - TitledBorder tb = BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), title); - tb.setTitlePosition(TitledBorder.ABOVE_TOP); - tb.setTitleFont(new java.awt.Font("Dialog", 0, 12)); - tb.setTitleColor(Color.BLUE); - panel.setBorder(tb); - } - - /* CHOPPIC */ - - /** - *

- * deckEditorButton_actionPerformed. - *

- * - * @param e - * a {@link java.awt.event.ActionEvent} object. - */ - void deckEditorButton_actionPerformed(ActionEvent e) { - if (editor == null) { - - editor = new Gui_DeckEditor(); - - { - { - Command exit = new Command() { - private static final long serialVersionUID = -9133358399503226853L; - - public void execute() { - new Gui_NewGame(); - } - }; - editor.show(exit); - editor.setVisible(true); - } // run() - } - } // if - - // refresh decks: - allDecks = getDecks(); - - // TODO (TO have DOne) - this seems hacky. If someone knows how to do - // this for real, feel free. - // This make it so the second time you open the Deck Editor, typing a - // card name and pressing enter will filter - javax.swing.JRootPane rootPane = editor.getRootPane(); - rootPane.setDefaultButton(editor.filterButton); - - editor.setVisible(true); - - dispose(); - } - - /** - *

- * getRandomDeck. - *

- * - * @param d - * an array of {@link forge.deck.Deck} objects. - * @return a {@link forge.deck.Deck} object. - */ - Deck getRandomDeck(Deck[] d) { - // get a random number between 0 and d.length - // int i = (int) (Math.random() * d.length); - Random r = MyRandom.random; - - return d[r.nextInt(d.length)]; - } - - /** - *

- * startButton_actionPerformed. - *

- * - * @param e - * a {@link java.awt.event.ActionEvent} object. - */ - void startButton_actionPerformed(ActionEvent e) { - if (humanComboBox.getSelectedItem() == null || computerComboBox.getSelectedItem() == null) { - return; - } - - String human = humanComboBox.getSelectedItem().toString(); - - String computer = null; - if (computerComboBox.getSelectedItem() != null) { - computer = computerComboBox.getSelectedItem().toString(); - } - - if (draftRadioButton.isSelected()) { - if (human.equals("New Draft")) { - dispose(); - - setupDraft(); - - return; - - } else { - // load old draft - Deck[] deck = deckManager.getDraftDeck(human); - int index = Integer.parseInt(computer); - - Constant.Runtime.HumanDeck[0] = deck[0]; - Constant.Runtime.ComputerDeck[0] = deck[index]; - - if (Constant.Runtime.ComputerDeck[0] == null) { - throw new RuntimeException("Gui_NewGame : startButton() error - computer deck is null"); - } - } // else - load old draft - } // if - else if (sealedRadioButton.isSelected()) { - if (human.equals("New Sealed")) { - dispose(); - - setupSealed(); - - return; - } else { - Constant.Runtime.HumanDeck[0] = deckManager.getDeck(human); - - } - - if (!computer.equals("New Sealed")) { - Constant.Runtime.ComputerDeck[0] = deckManager.getDeck(computer); - } - } else { - // non-draft decks - String format = Constant.Runtime.GameType[0]; - // boolean sealed = Constant.GameType.Sealed.equals(format); - boolean constructed = Constant.GameType.Constructed.equals(format); - - boolean humanGenerate = human.equals("Generate Deck"); - boolean humanRandom = human.equals("Random"); - - if (humanGenerate) { - if (constructed) { - genDecks("H"); - } - // else if(sealed) - // Constant.Runtime.HumanDeck[0] = generateSealedDeck(); - } else if (humanRandom) { - Constant.Runtime.HumanDeck[0] = getRandomDeck(getDecks(format)); - - JOptionPane.showMessageDialog(null, - String.format("You are using deck: %s", Constant.Runtime.HumanDeck[0].getName()), "Deck Name", - JOptionPane.INFORMATION_MESSAGE); - } else { - Constant.Runtime.HumanDeck[0] = deckManager.getDeck(human); - } - - assert computer != null; - boolean computerGenerate = computer.equals("Generate Deck"); - boolean computerRandom = computer.equals("Random"); - - if (computerGenerate) { - if (constructed) { - genDecks("C"); - } // Constant.Runtime.ComputerDeck[0] = - // generateConstructedDeck(); - // else if(sealed) - // Constant.Runtime.ComputerDeck[0] = generateSealedDeck(); - } else if (computerRandom) { - Constant.Runtime.ComputerDeck[0] = getRandomDeck(getDecks(format)); - - JOptionPane.showMessageDialog(null, - String.format("The computer is using deck: %s", Constant.Runtime.ComputerDeck[0].getName()), - "Deck Name", JOptionPane.INFORMATION_MESSAGE); - } else { - Constant.Runtime.ComputerDeck[0] = deckManager.getDeck(computer); - } - } // else - - // DO NOT CHANGE THIS ORDER, GuiDisplay needs to be created before cards - // are added - // Constant.Runtime.DevMode[0] = devModeCheckBox.isSelected(); - - // if (newGuiCheckBox.isSelected()) - AllZone.setDisplay(new GuiDisplay4()); - // else AllZone.setDisplay(new GuiDisplay3()); - - Constant.Runtime.Smooth[0] = smoothLandCheckBox.isSelected(); - - AllZone.getGameAction().newGame(Constant.Runtime.HumanDeck[0], Constant.Runtime.ComputerDeck[0]); - AllZone.getDisplay().setVisible(true); - - dispose(); - } // startButton_actionPerformed() - - /* - * private Deck generateSealedDeck() { GenerateSealedDeck gen = new - * GenerateSealedDeck(); CardList name = gen.generateDeck(); Deck deck = new - * Deck(Constant.GameType.Sealed); - * - * for(int i = 0; i < 40; i++) deck.addMain(name.get(i).getName()); return - * deck; } - */ - /** - *

- * genDecks. - *

- * - * @param p - * a {@link java.lang.String} object. - */ - private void genDecks(String p) { - Deck d = null; - - ArrayList decks = new ArrayList(); - decks.add("2-Color Deck (original)"); - decks.add("3-Color Deck (original)"); - decks.add("5-Color Deck (original)"); - decks.add("Semi-Random Theme Deck"); - decks.add("2-Color Deck (new)"); - decks.add("3-Color Deck (new)"); - - String prompt = "Generate "; - if (p.equals("H")) { - prompt += "Human "; - } else { - prompt += "Computer "; - } - prompt += "Deck"; - - Object o = GuiUtils.getChoice(prompt, decks.toArray()); - - if (o.toString().equals(decks.get(0))) { - d = generateConstructedDeck(); - } else if (o.toString().equals(decks.get(1))) { - d = generateConstructed3ColorDeck(); - } else if (o.toString().equals(decks.get(2))) { - d = generateConstructed5ColorDeck(); - } else if (o.toString().equals(decks.get(3))) { - d = generateConstructedThemeDeck(); - } else if (o.toString().equals(decks.get(4))) { - d = generate2ColorDeck(p); - } else if (o.toString().equals(decks.get(5))) { - d = generate3ColorDeck(p); - } - - if (p.equals("H")) { - Constant.Runtime.HumanDeck[0] = d; - } else if (p.equals("C")) { - Constant.Runtime.ComputerDeck[0] = d; - } - } - - /** - *

- * generateConstructedDeck. - *

- * - * @return a {@link forge.deck.Deck} object. - */ - private Deck generateConstructedDeck() { - GenerateConstructedDeck gen = new GenerateConstructedDeck(); - CardList name = gen.generateDeck(); - Deck deck = new Deck(Constant.GameType.Constructed); - - for (int i = 0; i < 60; i++) { - deck.addMain(name.get(i).getName()); - } - return deck; - } - - /** - *

- * generateConstructed3ColorDeck. - *

- * - * @return a {@link forge.deck.Deck} object. - */ - private Deck generateConstructed3ColorDeck() { - GenerateConstructedMultiColorDeck gen = new GenerateConstructedMultiColorDeck(); - CardList name = gen.generate3ColorDeck(); - Deck deck = new Deck(Constant.GameType.Constructed); - - for (int i = 0; i < 60; i++) { - deck.addMain(name.get(i).getName()); - } - return deck; - } - - /** - *

- * generateConstructed5ColorDeck. - *

- * - * @return a {@link forge.deck.Deck} object. - */ - private Deck generateConstructed5ColorDeck() { - GenerateConstructedMultiColorDeck gen = new GenerateConstructedMultiColorDeck(); - CardList name = gen.generate5ColorDeck(); - Deck deck = new Deck(Constant.GameType.Constructed); - - for (int i = 0; i < 60; i++) { - deck.addMain(name.get(i).getName()); - } - return deck; - } - - /** - *

- * generateConstructedThemeDeck. - *

- * - * @return a {@link forge.deck.Deck} object. - */ - private Deck generateConstructedThemeDeck() { - GenerateThemeDeck gen = new GenerateThemeDeck(); - ArrayList tNames = gen.getThemeNames(); - tNames.add(0, "Random"); - Object o = GuiUtils.getChoice("Select a theme.", tNames.toArray()); - - String stDeck; - if (o.toString().equals("Random")) { - Random r = MyRandom.random; - stDeck = tNames.get(r.nextInt(tNames.size() - 1) + 1); - } else { - stDeck = o.toString(); - } - - CardList td = gen.getThemeDeck(stDeck, 60); - Deck deck = new Deck(Constant.GameType.Constructed); - - for (int i = 0; i < td.size(); i++) { - deck.addMain(td.get(i).getName()); - } - - return deck; - } - - /** - *

- * generate2ColorDeck. - *

- * - * @param p - * a {@link java.lang.String} object. - * @return a {@link forge.deck.Deck} object. - */ - private Deck generate2ColorDeck(String p) { - Random r = MyRandom.random; - - ArrayList colors = new ArrayList(); - colors.add("Random"); - colors.add("white"); - colors.add("blue"); - colors.add("black"); - colors.add("red"); - colors.add("green"); - - String c1; - String c2; - if (p.equals("H")) { - c1 = GuiUtils.getChoice("Select first color.", colors.toArray()).toString(); - - if (c1.equals("Random")) { - c1 = colors.get(r.nextInt(colors.size() - 1) + 1); - } - - colors.remove(c1); - - c2 = GuiUtils.getChoice("Select second color.", colors.toArray()).toString(); - - if (c2.equals("Random")) { - c2 = colors.get(r.nextInt(colors.size() - 1) + 1); - } - } else { - // if (p.equals("C")) - c1 = colors.get(r.nextInt(colors.size() - 1) + 1); - colors.remove(c1); - c2 = colors.get(r.nextInt(colors.size() - 1) + 1); - } - Generate2ColorDeck gen = new Generate2ColorDeck(c1, c2); - CardList d = gen.get2ColorDeck(60); - - Deck deck = new Deck(Constant.GameType.Constructed); - - for (int i = 0; i < d.size(); i++) { - deck.addMain(d.get(i).getName()); - } - - return deck; - - } - - /** - *

- * generate3ColorDeck. - *

- * - * @param p - * a {@link java.lang.String} object. - * @return a {@link forge.deck.Deck} object. - */ - private Deck generate3ColorDeck(String p) { - Random r = MyRandom.random; - - ArrayList colors = new ArrayList(); - colors.add("Random"); - colors.add("white"); - colors.add("blue"); - colors.add("black"); - colors.add("red"); - colors.add("green"); - - String c1; - String c2; - String c3; - if (p.equals("H")) { - c1 = GuiUtils.getChoice("Select first color.", colors.toArray()).toString(); - - if (c1.equals("Random")) { - c1 = colors.get(r.nextInt(colors.size() - 1) + 1); - } - - colors.remove(c1); - - c2 = GuiUtils.getChoice("Select second color.", colors.toArray()).toString(); - - if (c2.equals("Random")) { - c2 = colors.get(r.nextInt(colors.size() - 1) + 1); - } - - colors.remove(c2); - - c3 = GuiUtils.getChoice("Select third color.", colors.toArray()).toString(); - if (c3.equals("Random")) { - c3 = colors.get(r.nextInt(colors.size() - 1) + 1); - } - - } else { - // if (p.equals("C")) - c1 = colors.get(r.nextInt(colors.size() - 1) + 1); - colors.remove(c1); - c2 = colors.get(r.nextInt(colors.size() - 1) + 1); - colors.remove(c2); - c3 = colors.get(r.nextInt(colors.size() - 1) + 1); - } - Generate3ColorDeck gen = new Generate3ColorDeck(c1, c2, c3); - CardList d = gen.get3ColorDeck(60); - - Deck deck = new Deck(Constant.GameType.Constructed); - - for (int i = 0; i < d.size(); i++) { - deck.addMain(d.get(i).getName()); - } - - return deck; - - } - - /** - *

- * singleRadioButton_actionPerformed. - *

- * - * @param e - * a {@link java.awt.event.ActionEvent} object. - */ - void singleRadioButton_actionPerformed(ActionEvent e) { - Constant.Runtime.GameType[0] = Constant.GameType.Constructed; - updateDeckComboBoxes(); - } - - /** - *

- * sealedRadioButton_actionPerformed. - *

- * - * @param e - * a {@link java.awt.event.ActionEvent} object. - */ - void sealedRadioButton_actionPerformed(ActionEvent e) { - Constant.Runtime.GameType[0] = Constant.GameType.Sealed; - updateDeckComboBoxes(); - } - - /** - *

- * updateDeckComboBoxes. - *

- */ - private void updateDeckComboBoxes() { - humanComboBox.removeAllItems(); - computerComboBox.removeAllItems(); - - if (Constant.GameType.Sealed.equals(Constant.Runtime.GameType[0])) { - humanComboBox.addItem("New Sealed"); - computerComboBox.addItem("New Sealed"); - - for (Deck allDeck : allDecks) { - if (allDeck.getDeckType().equals(Constant.GameType.Sealed)) { - if (allDeck.getMetadata("PlayerType").equals("Human")) { - humanComboBox.addItem(allDeck.getName()); - } else if (allDeck.getMetadata("PlayerType").equals("AI")) { - computerComboBox.addItem(allDeck.getName()); - } - } - } // for - } else if (Constant.GameType.Constructed.equals(Constant.Runtime.GameType[0])) { - humanComboBox.addItem("Generate Deck"); - computerComboBox.addItem("Generate Deck"); - - humanComboBox.addItem("Random"); - computerComboBox.addItem("Random"); - - for (Deck allDeck : allDecks) { - if (allDeck.getDeckType().equals(Constant.GameType.Constructed)) { - humanComboBox.addItem(allDeck.getName()); - computerComboBox.addItem(allDeck.getName()); - } - } // for - } - // not sure if the code below is useful or not - // this will select the deck that you previously used - - // if(Constant.Runtime.HumanDeck[0] != null) - // humanComboBox.setSelectedItem(Constant.Runtime.HumanDeck[0].getName()); - - } /* updateComboBoxes() */ - - /** - *

- * getDecks. - *

- * - * @param gameType - * a {@link java.lang.String} object. - * @return an array of {@link forge.deck.Deck} objects. - */ - Deck[] getDecks(String gameType) { - ArrayList list = new ArrayList(); - - Deck d; - for (Deck allDeck : allDecks) { - d = allDeck; - - if (d.getDeckType().equals(gameType)) { - list.add(d); - } - } // for - - // convert ArrayList to Deck[] - Deck[] out = new Deck[list.size()]; - list.toArray(out); - - return out; - } // getDecks() - - /** - *

- * draftRadioButton_actionPerformed. - *

- * - * @param e - * a {@link java.awt.event.ActionEvent} object. - */ - void draftRadioButton_actionPerformed(ActionEvent e) { - Constant.Runtime.GameType[0] = Constant.GameType.Draft; - humanComboBox.removeAllItems(); - computerComboBox.removeAllItems(); - - humanComboBox.addItem("New Draft"); - Object[] key = deckManager.getDraftDecks().keySet().toArray(); - Arrays.sort(key); - - for (Object aKey : key) { - humanComboBox.addItem(aKey); - } - - for (int i = 0; i < 7; i++) { - computerComboBox.addItem("" + (i + 1)); - } - } - - /** - *

- * humanComboBox_actionPerformed. - *

- * - * @param e - * a {@link java.awt.event.ActionEvent} object. - */ - void humanComboBox_actionPerformed(ActionEvent e) { - - } /* draftRadioButton_actionPerformed() */ - - public static class LookAndFeelAction extends AbstractAction { - - private static final long serialVersionUID = -4447498333866711215L; - private Component c; - - public LookAndFeelAction(Component c) { - super(ForgeProps.getLocalized(MENU_BAR.MENU.LF)); - this.c = c; - } - - public void actionPerformed(ActionEvent e) { - LookAndFeelInfo[] info = UIManager.getInstalledLookAndFeels(); - HashMap LAFMap = new HashMap(); - for (LookAndFeelInfo anInfo : info) { - LAFMap.put(anInfo.getName(), anInfo.getClassName()); - } - - // add Substance LAFs: - LAFMap.put("Autumn", "org.jvnet.substance.skin.SubstanceAutumnLookAndFeel"); - LAFMap.put("Business", "org.jvnet.substance.skin.SubstanceBusinessLookAndFeel"); - LAFMap.put("Business Black Steel", "org.jvnet.substance.skin.SubstanceBusinessBlackSteelLookAndFeel"); - LAFMap.put("Business Blue Steel", "org.jvnet.substance.skin.SubstanceBusinessBlueSteelLookAndFeel"); - LAFMap.put("Challenger Deep", "org.jvnet.substance.skin.SubstanceChallengerDeepLookAndFeel"); - LAFMap.put("Creme", "org.jvnet.substance.skin.SubstanceCremeLookAndFeel"); - LAFMap.put("Creme Coffee", "org.jvnet.substance.skin.SubstanceCremeCoffeeLookAndFeel"); - LAFMap.put("Dust", "org.jvnet.substance.skin.SubstanceDustLookAndFeel"); - LAFMap.put("Dust Coffee", "org.jvnet.substance.skin.SubstanceDustCoffeeLookAndFeel"); - LAFMap.put("Emerald Dusk", "org.jvnet.substance.skin.SubstanceEmeraldDuskLookAndFeel"); - // LAFMap.put("Gemini", - // "org.jvnet.substance.skin.SubstanceGeminiLookAndFeel"); - // LAFMap.put("Graphite", - // "org.jvnet.substance.skin.SubstanceGraphiteLookAndFeel"); - // LAFMap.put("Graphite Aqua", - // "org.jvnet.substance.skin.SubstanceGraphiteAquaLookAndFeel"); - // LAFMap.put("Graphite Glass", - // "org.jvnet.substance.skin.SubstanceGraphiteGlassLookAndFeel"); - LAFMap.put("Magma", "org.jvnet.substance.skin.SubstanceMagmaLookAndFeel"); - // LAFMap.put("Magellan", - // "org.jvnet.substance.skin.SubstanceMagellanLookAndFeel"); - // LAFMap.put("Mariner", - // "org.jvnet.substance.skin.SubstanceMarinerLookAndFeel"); - LAFMap.put("Mist Aqua", "org.jvnet.substance.skin.SubstanceMistAquaLookAndFeel"); - LAFMap.put("Mist Silver", "org.jvnet.substance.skin.SubstanceMistSilverLookAndFeel"); - LAFMap.put("Moderate", "org.jvnet.substance.skin.SubstanceModerateLookAndFeel"); - LAFMap.put("Nebula", "org.jvnet.substance.skin.SubstanceNebulaLookAndFeel"); - LAFMap.put("Nebula Brick Wall", "org.jvnet.substance.skin.SubstanceNebulaBrickWallLookAndFeel"); - // LAFMap.put("Office Black 2007", - // "org.jvnet.substance.skin.SubstanceOfficeBlack2007LookAndFeel"); - LAFMap.put("Office Blue 2007", "org.jvnet.substance.skin.SubstanceOfficeBlue2007LookAndFeel"); - LAFMap.put("Office Silver 2007", "org.jvnet.substance.skin.SubstanceOfficeSilver2007LookAndFeel"); - LAFMap.put("Raven", "org.jvnet.substance.skin.SubstanceRavenLookAndFeel"); - LAFMap.put("Raven Graphite", "org.jvnet.substance.skin.SubstanceRavenGraphiteLookAndFeel"); - LAFMap.put("Raven Graphite Glass", "org.jvnet.substance.skin.SubstanceRavenGraphiteGlassLookAndFeel"); - LAFMap.put("Sahara", "org.jvnet.substance.skin.SubstanceSaharaLookAndFeel"); - LAFMap.put("Twilight", "org.jvnet.substance.skin.SubstanceTwilightLookAndFeel"); - - String[] keys = new String[LAFMap.size()]; - int count = 0; - - for (String s1 : LAFMap.keySet()) { - keys[count++] = s1; - } - Arrays.sort(keys); - - ListChooser ch = new ListChooser("Choose one", 0, 1, keys); - if (ch.show()) { - try { - String name = ch.getSelectedValue(); - int index = ch.getSelectedIndex(); - if (index == -1) { - return; - } - // UIManager.setLookAndFeel(info[index].getClassName()); - preferences.laf = LAFMap.get(name); - UIManager.setLookAndFeel(LAFMap.get(name)); - - SwingUtilities.updateComponentTreeUI(c); - } catch (Exception ex) { - ErrorViewer.showError(ex); - } - } - } - } - - public static class DownloadPriceAction extends AbstractAction { - private static final long serialVersionUID = 929877827872974298L; - - public DownloadPriceAction() { - super(ForgeProps.getLocalized(MENU_BAR.MENU.DOWNLOADPRICE)); - } - - public void actionPerformed(ActionEvent e) { - Gui_DownloadPrices gdp = new Gui_DownloadPrices(); - gdp.setVisible(true); - } - } - - public static class BugzReporterAction extends AbstractAction { - - public BugzReporterAction() { - super("Report Bug"); - } - - public void actionPerformed(ActionEvent e) { - BugzReporter br = new BugzReporter(); - br.setVisible(true); - } - - - } - - /* - * public static class DownloadAction extends AbstractAction { - * - * private static final long serialVersionUID = 6564425021778307101L; - * - * public DownloadAction() { - * super(ForgeProps.getLocalized(MENU_BAR.MENU.DOWNLOAD)); } - * - * public void actionPerformed(ActionEvent e) { - * - * Gui_DownloadPictures.startDownload(null); } } - */ - public static class DownloadActionLQ extends AbstractAction { - - private static final long serialVersionUID = -6234380664413874813L; - - public DownloadActionLQ() { - super(ForgeProps.getLocalized(MENU_BAR.MENU.DOWNLOADLQ)); - } - - public void actionPerformed(ActionEvent e) { - Gui_DownloadPictures_LQ.startDownload(null); - } - } - - public static class DownloadActionSetLQ extends AbstractAction { - private static final long serialVersionUID = 2947202546752930L; - - public DownloadActionSetLQ() { - super(ForgeProps.getLocalized(MENU_BAR.MENU.DOWNLOADSETLQ)); - } - - public void actionPerformed(ActionEvent e) { - Gui_DownloadSetPictures_LQ.startDownload(null); - } - } - - public static class ImportPictureAction extends AbstractAction { - - private static final long serialVersionUID = 6893292814498031508L; - - public ImportPictureAction() { - super(ForgeProps.getLocalized(MENU_BAR.MENU.IMPORTPICTURE)); - } - - public void actionPerformed(ActionEvent e) { - GUI_ImportPicture ip = new GUI_ImportPicture(null); - ip.setVisible(true); - } - } - - public static class CardSizesAction extends AbstractAction { - - private static final long serialVersionUID = -2900235618450319571L; - private static String[] keys = { "Tiny", "Smaller", "Small", "Medium", "Large", "Huge" }; - private static int[] widths = { 36, 42, 63, 70, 93, 120 }; - private static int[] heights = { 50, 59, 88, 98, 130, 168 }; - - public CardSizesAction() { - super(ForgeProps.getLocalized(MENU_BAR.MENU.CARD_SIZES)); - } - - public void actionPerformed(ActionEvent e) { - ListChooser ch = new ListChooser("Choose one", "Choose a new card size", 0, 1, keys); - if (ch.show()) { - try { - int index = ch.getSelectedIndex(); - if (index == -1) { - return; - } - set(index); - } catch (Exception ex) { - ErrorViewer.showError(ex); - } - } - } - - public static void set(int index) { - preferences.cardSize = CardSizeType.valueOf(keys[index].toLowerCase()); - Constant.Runtime.width[0] = widths[index]; - Constant.Runtime.height[0] = heights[index]; - } - - public static void set(CardSizeType s) { - preferences.cardSize = s; - int index = 0; - for (String str : keys) { - if (str.toLowerCase().equals(s.toString())) { - break; - } - index++; - } - Constant.Runtime.width[0] = widths[index]; - Constant.Runtime.height[0] = heights[index]; - } - } - - public static class CardStackAction extends AbstractAction { - - private static final long serialVersionUID = -3770527681359311455L; - private static String[] keys = { "3", "4", "5", "6", "7", "8", "9", "10", "11", "12" }; - private static int[] values = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; - - public CardStackAction() { - super(ForgeProps.getLocalized(MENU_BAR.MENU.CARD_STACK)); - } - - public void actionPerformed(ActionEvent e) { - ListChooser ch = new ListChooser("Choose one", "Choose the max size of a stack", 0, 1, keys); - if (ch.show()) { - try { - int index = ch.getSelectedIndex(); - if (index == -1) { - return; - } - set(index); - - } catch (Exception ex) { - ErrorViewer.showError(ex); - } - } - } - - public static void set(int index) { - preferences.maxStackSize = values[index]; - Constant.Runtime.stackSize[0] = values[index]; - } - - public static void setVal(int val) { - preferences.maxStackSize = val; - Constant.Runtime.stackSize[0] = val; - } - } - - public static class CardStackOffsetAction extends AbstractAction { - - private static final long serialVersionUID = 5021304777748833975L; - private static String[] keys = { "Tiny", "Small", "Medium", "Large" }; - private static int[] offsets = { 5, 7, 10, 15 }; - - public CardStackOffsetAction() { - super(ForgeProps.getLocalized(MENU_BAR.MENU.CARD_STACK_OFFSET)); - } - - public void actionPerformed(ActionEvent e) { - ListChooser ch = new ListChooser("Choose one", "Choose a stack offset value", 0, 1, keys); - if (ch.show()) { - try { - int index = ch.getSelectedIndex(); - if (index == -1) { - return; - } - set(index); - - } catch (Exception ex) { - ErrorViewer.showError(ex); - } - } - } - - public static void set(int index) { - preferences.stackOffset = StackOffsetType.valueOf(keys[index].toLowerCase()); - Constant.Runtime.stackOffset[0] = offsets[index]; - } - - public static void set(StackOffsetType s) { - preferences.stackOffset = s; - int index = 0; - for (String str : keys) { - if (str.toLowerCase().equals(s.toString())) { - break; - } - index++; - } - Constant.Runtime.stackOffset[0] = offsets[index]; - } - } - - public static class HowToPlayAction extends AbstractAction { - - private static final long serialVersionUID = 5552000208438248428L; - - public HowToPlayAction() { - super(ForgeProps.getLocalized(LANG.HowTo.TITLE)); - } - - public void actionPerformed(ActionEvent e) { - String text = ForgeProps.getLocalized(LANG.HowTo.MESSAGE); - - JTextArea area = new JTextArea(text, 25, 40); - area.setWrapStyleWord(true); - area.setLineWrap(true); - area.setEditable(false); - area.setOpaque(false); - - JOptionPane.showMessageDialog(null, new JScrollPane(area), ForgeProps.getLocalized(LANG.HowTo.TITLE), - JOptionPane.INFORMATION_MESSAGE); - } - } - - public static class AboutAction extends AbstractAction { - - private static final long serialVersionUID = 5492173304463396871L; - - public AboutAction() { - super(ForgeProps.getLocalized(MENU_BAR.MENU.ABOUT)); - } - - public void actionPerformed(ActionEvent e) { - JTextArea area = new JTextArea(12, 25); - - if (useLAFFonts.isSelected()) { - Font f = new Font(area.getFont().getName(), Font.PLAIN, 13); - area.setFont(f); - } - - area.setText("TThe various people who have contributed to this project apologize with deep remorse for any bugs that you may have noticed.\n\nThe development team.\n\nOriginal author: Forge\n\n(Quest icons used created by Teekatas, from his Legendora set:\n http://raindropmemory.deviantart.com)"); - - area.setWrapStyleWord(true); - area.setLineWrap(true); - area.setEditable(false); - - JPanel p = new JPanel(); - area.setBackground(p.getBackground()); - - JOptionPane.showMessageDialog(null, area, "About", JOptionPane.INFORMATION_MESSAGE); - } - } - - /** - *

- * exit. - *

- * - * @return a boolean. - */ - public boolean exit() { - try { - preferences.laf = UIManager.getLookAndFeel().getClass().getName(); - preferences.lafFonts = useLAFFonts.isSelected(); - // preferences.newGui = newGuiCheckBox.isSelected(); - preferences.stackAiLand = smoothLandCheckBox.isSelected(); - preferences.millingLossCondition = Constant.Runtime.Mill[0]; - preferences.developerMode = Constant.Runtime.DevMode[0]; - preferences.cardOverlay = cardOverlay.isSelected(); - preferences.scaleLargerThanOriginal = ImageCache.scaleLargerThanOriginal; - preferences.uploadDraftAI = Constant.Runtime.UpldDrft[0]; - preferences.save(); - } catch (Exception ex) { - int result = JOptionPane.showConfirmDialog(this, - "Preferences could not be saved. Continue to close without saving ?", "Confirm Exit", - JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE); - if (result != JOptionPane.OK_OPTION) { - return false; - } - } - - setVisible(false); - dispose(); - return true; - } - - /** {@inheritDoc} */ - protected void processWindowEvent(WindowEvent event) { - if (event.getID() == WindowEvent.WINDOW_CLOSING) { - if (!exit()) { - return; - } - } - super.processWindowEvent(event); - } - - /* CHOPPIC */ - /* Panel with rounded border and semi-transparent background */ - private class CustomPanel extends JPanel { - private static final long serialVersionUID = 774205995101881824L; - private final int radius; - - CustomPanel(int radius) { - this.radius = radius; - } - - public void paintComponent(Graphics g) { - Color bg = getBackground(); - g.setColor(new Color(bg.getRed(), bg.getGreen(), bg.getBlue(), 180)); - g.fillRoundRect(0, 0, getWidth() - 1, getHeight() - 1, radius, radius); - g.setColor(new Color(0, 0, 0, 70)); - g.drawRoundRect(0, 0, getWidth() - 1, getHeight() - 1, radius, radius); - } - - } - - public static void loadDynamicGamedata() { - if (!Constant.CardTypes.loaded[0]) { - ArrayList typeListFile = FileUtil.readFile("res/gamedata/TypeLists.txt"); - - ArrayList tList = null; - - Constant.CardTypes.cardTypes[0] = new Constant_StringArrayList(); - Constant.CardTypes.superTypes[0] = new Constant_StringArrayList(); - Constant.CardTypes.basicTypes[0] = new Constant_StringArrayList(); - Constant.CardTypes.landTypes[0] = new Constant_StringArrayList(); - Constant.CardTypes.creatureTypes[0] = new Constant_StringArrayList(); - Constant.CardTypes.instantTypes[0] = new Constant_StringArrayList(); - Constant.CardTypes.sorceryTypes[0] = new Constant_StringArrayList(); - Constant.CardTypes.enchantmentTypes[0] = new Constant_StringArrayList(); - Constant.CardTypes.artifactTypes[0] = new Constant_StringArrayList(); - Constant.CardTypes.walkerTypes[0] = new Constant_StringArrayList(); - - if (typeListFile.size() > 0) { - for (int i = 0; i < typeListFile.size(); i++) { - String s = typeListFile.get(i); - - if (s.equals("[CardTypes]")) { - tList = Constant.CardTypes.cardTypes[0].list; - } - - else if (s.equals("[SuperTypes]")) { - tList = Constant.CardTypes.superTypes[0].list; - } - - else if (s.equals("[BasicTypes]")) { - tList = Constant.CardTypes.basicTypes[0].list; - } - - else if (s.equals("[LandTypes]")) { - tList = Constant.CardTypes.landTypes[0].list; - } - - else if (s.equals("[CreatureTypes]")) { - tList = Constant.CardTypes.creatureTypes[0].list; - } - - else if (s.equals("[InstantTypes]")) { - tList = Constant.CardTypes.instantTypes[0].list; - } - - else if (s.equals("[SorceryTypes]")) { - tList = Constant.CardTypes.sorceryTypes[0].list; - } - - else if (s.equals("[EnchantmentTypes]")) { - tList = Constant.CardTypes.enchantmentTypes[0].list; - } - - else if (s.equals("[ArtifactTypes]")) { - tList = Constant.CardTypes.artifactTypes[0].list; - } - - else if (s.equals("[WalkerTypes]")) { - tList = Constant.CardTypes.walkerTypes[0].list; - } - - else if (s.length() > 1) { - tList.add(s); - } - } - } - Constant.CardTypes.loaded[0] = true; - /* - * if (Constant.Runtime.DevMode[0]) { - * System.out.println(Constant.CardTypes.cardTypes[0].list); - * System.out.println(Constant.CardTypes.superTypes[0].list); - * System.out.println(Constant.CardTypes.basicTypes[0].list); - * System.out.println(Constant.CardTypes.landTypes[0].list); - * System.out.println(Constant.CardTypes.creatureTypes[0].list); - * System.out.println(Constant.CardTypes.instantTypes[0].list); - * System.out.println(Constant.CardTypes.sorceryTypes[0].list); - * System.out.println(Constant.CardTypes.enchantmentTypes[0].list); - * System.out.println(Constant.CardTypes.artifactTypes[0].list); - * System.out.println(Constant.CardTypes.walkerTypes[0].list); } - */ - } - - if (!Constant.Keywords.loaded[0]) { - ArrayList nskwListFile = FileUtil.readFile("res/gamedata/NonStackingKWList.txt"); - - Constant.Keywords.NonStackingList[0] = new Constant_StringArrayList(); - - if (nskwListFile.size() > 1) { - for (int i = 0; i < nskwListFile.size(); i++) { - String s = nskwListFile.get(i); - if (s.length() > 1) { - Constant.Keywords.NonStackingList[0].list.add(s); - } - } - } - Constant.Keywords.loaded[0] = true; - if (Constant.Runtime.DevMode[0]) { - System.out.println(Constant.Keywords.NonStackingList[0].list); - } - } - - /* - * if (!Constant.Color.loaded[0]) { ArrayList lcListFile = - * FileUtil.readFile("res/gamedata/LandColorList"); - * - * if (lcListFile.size() > 1) { for (int i=0; i 1) - * Constant.Color.LandColor[0].map.add(s); } } - * Constant.Keywords.loaded[0] = true; if (Constant.Runtime.DevMode[0]) - * { System.out.println(Constant.Keywords.NonStackingList[0].list); } } - */ - } - -} diff --git a/src/forge/Gui_QuestOptions.java b/src/forge/Gui_QuestOptions.java deleted file mode 100644 index 0d2c98273f0..00000000000 --- a/src/forge/Gui_QuestOptions.java +++ /dev/null @@ -1,270 +0,0 @@ -package forge; - -import forge.error.ErrorViewer; -import forge.gui.GuiUtils; -import forge.quest.data.QuestDataIO; -import forge.quest.gui.QuestFrame; - -import javax.swing.*; -import javax.swing.border.Border; -import javax.swing.border.TitledBorder; -import java.awt.Color; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; - -/** - *

Gui_QuestOptions class.

- * - * @author Forge - * @version $Id: $ - */ -public class Gui_QuestOptions extends JFrame { - /** Constant serialVersionUID=2018518804206822235L */ - private static final long serialVersionUID = 2018518804206822235L; - - private forge.quest.data.QuestData questData = new forge.quest.data.QuestData(); - - private JLabel jLabel1 = new JLabel(); - private JButton continueQuestButton = new JButton(); - private JPanel jPanel1 = new JPanel(); - private JPanel jPanel2 = new JPanel(); - private GridLayout gridLayout1 = new GridLayout(); - - private JRadioButton easyRadio = new JRadioButton(); - private JRadioButton hardRadio = new JRadioButton(); - private JRadioButton mediumRadio = new JRadioButton(); - private JRadioButton veryHardRadio = new JRadioButton(); - - private JRadioButton fantasyRadio = new JRadioButton(); - private JRadioButton realisticRadio = new JRadioButton(); - - private JCheckBox cbStandardStart = new JCheckBox(); - - private JButton newQuestButton = new JButton(); - private JTextArea jTextArea1 = new JTextArea(); - private ButtonGroup buttonGroup1 = new ButtonGroup(); - private ButtonGroup buttonGroup2 = new ButtonGroup(); - private JPanel jPanel3 = new JPanel(); - - /** - *

Constructor for Gui_QuestOptions.

- */ - public Gui_QuestOptions() { - try { - jbInit(); - } catch (Exception ex) { - ErrorViewer.showError(ex); - } - - setup(); - setupRadioButtonText(); - - this.setSize(540, 555); - GuiUtils.centerFrame(this); - setVisible(true); - } - - /** - *

setup.

- */ - private void setup() { - //make the text look correct on the screen - jTextArea1.setBackground(getBackground()); - - - //if user closes this window, go back to "New Game" screen - this.addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent ev) { - Gui_QuestOptions.this.dispose(); - new Gui_NewGame(); - } - }); - - //is there any saved data? - if (!questData.hasSaveFile()) continueQuestButton.setEnabled(false); - }//setup() - - //show total number of games for each difficulty - /** - *

setupRadioButtonText.

- */ - private void setupRadioButtonText() { - String[] diff = questData.getDifficultyChoices(); - JRadioButton[] b = {easyRadio, mediumRadio, hardRadio, veryHardRadio}; - - for (int i = 0; i < diff.length; i++) { - b[i].setText(diff[i] + " - " + questData.getTotalNumberOfGames(i)); - } - - }//setupRadioButtonText() - - /** - *

jbInit.

- * - * @throws java.lang.Exception if any. - */ - private void jbInit() throws Exception { - TitledBorder titledBorder1 = new TitledBorder(BorderFactory.createEtchedBorder(Color.white, - new Color(148, 145, 140)), - "Quest Length"); - Border border2 = BorderFactory.createEtchedBorder(Color.white, new Color(148, 145, 140)); - TitledBorder titledBorder2 = new TitledBorder(border2, "Continue"); - jLabel1.setFont(new java.awt.Font("Dialog", 0, 25)); - jLabel1.setHorizontalAlignment(SwingConstants.CENTER); - jLabel1.setText("Quest Options"); - jLabel1.setBounds(new Rectangle(1, 0, 539, 63)); - this.setTitle("Quest Options"); - this.getContentPane().setLayout(null); - continueQuestButton.setBounds(new Rectangle(69, 28, 179, 35)); - continueQuestButton.setFont(new java.awt.Font("Dialog", 0, 18)); - continueQuestButton.setText("Continue Quest"); - continueQuestButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - continueQuestButton_actionPerformed(e); - } - }); - jPanel1.setBorder(titledBorder1); - jPanel1.setBounds(new Rectangle(20, 63, 500, 353)); - jPanel1.setLayout(null); - - jPanel2.setBounds(new Rectangle(20, 27, 460, 101)); - jPanel2.setLayout(gridLayout1); - - gridLayout1.setColumns(2); - gridLayout1.setRows(4); - - easyRadio.setText("Easy - 50 games"); - mediumRadio.setText("Medium - 100 games"); - hardRadio.setText("Hard - 200 games"); - veryHardRadio.setText("Very Hard - 300 games"); - realisticRadio.setText("Realistic"); - fantasyRadio.setText("Fantasy"); - - easyRadio.setSelected(true); - realisticRadio.setSelected(true); - - cbStandardStart.setText("Standard (Type 2) Starting Pool"); - - newQuestButton.setBounds(new Rectangle(179, 292, 140, 38)); - newQuestButton.setFont(new java.awt.Font("Dialog", 0, 16)); - newQuestButton.setText("New Quest"); - newQuestButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - newQuestButton_actionPerformed(e); - } - }); - - StringBuilder sb = new StringBuilder(); - sb.append("New Quest will delete your current player decks, credits and win loss record. "); - sb.append("Continue Quest will allow you to continue a quest that you started at an earlier time."); - sb.append("\r\n"); - sb.append("\r\n"); - sb.append("Realistic is the original quest mode with a new feature, the Card Shop. "); - sb.append("Fantasy adds a Bazaar and the occasional fantasy themed opponent for you to battle."); - - jTextArea1.setBorder(BorderFactory.createEtchedBorder(Color.white, new Color(148, 145, 140))); - jTextArea1.setEnabled(false); - jTextArea1.setFont(new java.awt.Font("Dialog", 0, 12)); - jTextArea1.setDisabledTextColor(Color.black); - jTextArea1.setEditable(false); -// jTextArea1.setText("Note: Starting a new quest will delete your current quest data"); - jTextArea1.setText(sb.toString()); - jTextArea1.setLineWrap(true); - jTextArea1.setWrapStyleWord(true); - jTextArea1.setBounds(new Rectangle(86, 145, 327, 128)); - - jPanel3.setBorder(titledBorder2); - jPanel3.setBounds(new Rectangle(110, 427, 323, 86)); - jPanel3.setLayout(null); - - jPanel2.add(easyRadio, null); - jPanel2.add(realisticRadio, null); - jPanel2.add(mediumRadio, null); - jPanel2.add(fantasyRadio, null); - jPanel2.add(hardRadio, null); - jPanel2.add(new JLabel("")); // for empty cell - jPanel2.add(veryHardRadio, null); - jPanel2.add(cbStandardStart, null); - - jPanel1.add(newQuestButton, null); - jPanel1.add(jTextArea1, null); - this.getContentPane().add(jPanel1, null); - this.getContentPane().add(jPanel3, null); - jPanel3.add(continueQuestButton, null); - this.getContentPane().add(jLabel1, null); - jPanel1.add(jPanel2, null); - buttonGroup1.add(easyRadio); - buttonGroup1.add(mediumRadio); - buttonGroup1.add(hardRadio); - buttonGroup1.add(veryHardRadio); - - buttonGroup2.add(realisticRadio); - buttonGroup2.add(fantasyRadio); - - } - - /** - *

continueQuestButton_actionPerformed.

- * - * @param e a {@link java.awt.event.ActionEvent} object. - */ - void continueQuestButton_actionPerformed(ActionEvent e) { - //set global variable - AllZone.setQuestData(QuestDataIO.loadData()); - AllZone.getQuestData().setDifficultyIndex(); - dispose(); - - new QuestFrame(); - - } - - /** - *

newQuestButton_actionPerformed.

- * - * @param e a {@link java.awt.event.ActionEvent} object. - */ - void newQuestButton_actionPerformed(ActionEvent e) { - int difficulty = 0; - - String mode = fantasyRadio.isSelected() ? forge.quest.data.QuestData.FANTASY : forge.quest.data.QuestData.REALISTIC; - - if (easyRadio.isSelected()) difficulty = 0; - - else if (mediumRadio.isSelected()) difficulty = 1; - - else if (hardRadio.isSelected()) difficulty = 2; - - else if (veryHardRadio.isSelected()) difficulty = 3; - - else //user didn't select a difficulty{ - return; - - if (questData.hasSaveFile()) { - // this will overwrite your save file! - Object[] possibleValues = {"Yes", "No"}; - Object choice = JOptionPane.showOptionDialog(null, "Starting a new quest will overwrite your current quest. Continue?", - "Start New Quest?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, - null, possibleValues, possibleValues[1]); - - if (!choice.equals(0)) - return; - } - - //give the user a few cards to build a deck - questData.newGame(difficulty, mode, cbStandardStart.isSelected()); - - questData.saveData(); - - - //set global variable - AllZone.setQuestData(questData); - - dispose(); - new QuestFrame(); - } - - -} diff --git a/src/forge/Gui_Quest_DeckEditor.java b/src/forge/Gui_Quest_DeckEditor.java deleted file mode 100644 index d8a47ec3fff..00000000000 --- a/src/forge/Gui_Quest_DeckEditor.java +++ /dev/null @@ -1,1169 +0,0 @@ -package forge; - -import forge.deck.Deck; -import forge.error.ErrorViewer; -import forge.gui.game.CardDetailPanel; -import forge.gui.game.CardPicturePanel; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - -import javax.swing.*; -import javax.swing.border.Border; -import javax.swing.border.EtchedBorder; -import javax.swing.border.TitledBorder; -import javax.swing.event.MouseInputAdapter; -import javax.swing.event.MouseInputListener; -import javax.swing.event.TableModelEvent; -import javax.swing.event.TableModelListener; -import javax.swing.filechooser.FileFilter; -import java.awt.Color; -import java.awt.*; -import java.awt.event.*; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Random; - -//import forge.quest.data.QuestBoosterPack; - -/** - *

- * Gui_Quest_DeckEditor class. - *

- * - * @author Forge - * @version $Id: $ - */ -public class Gui_Quest_DeckEditor extends JFrame implements CardContainer, DeckDisplay, NewConstants { - /** Constant serialVersionUID=152061168634545L */ - private static final long serialVersionUID = 152061168634545L; - - Gui_Quest_DeckEditor_Menu customMenu; - - // private ImageIcon upIcon = Constant.IO.upIcon; - // private ImageIcon downIcon = Constant.IO.downIcon; - - public TableModel topModel; - public TableModel bottomModel; - - private JScrollPane jScrollPane1 = new JScrollPane(); - private JScrollPane jScrollPane2 = new JScrollPane(); - private JButton removeButton = new JButton(); - @SuppressWarnings("unused") - // border1 - private Border border1; - private TitledBorder titledBorder1; - private Border border2; - private TitledBorder titledBorder2; - private JButton addButton = new JButton(); - private JButton analysisButton = new JButton(); - private JButton changePictureButton = new JButton(); - private JButton removePictureButton = new JButton(); - private JLabel statsLabel = new JLabel(); - private JTable topTable = new JTable(); - private JTable bottomTable = new JTable(); - private GridLayout gridLayout1 = new GridLayout(); - private JLabel statsLabel2 = new JLabel(); - private JLabel jLabel1 = new JLabel(); - - public JCheckBox whiteCheckBox = new JCheckBox("W", true); - public JCheckBox blueCheckBox = new JCheckBox("U", true); - public JCheckBox blackCheckBox = new JCheckBox("B", true); - public JCheckBox redCheckBox = new JCheckBox("R", true); - public JCheckBox greenCheckBox = new JCheckBox("G", true); - public JCheckBox colorlessCheckBox = new JCheckBox("C", true); - - public JCheckBox landCheckBox = new JCheckBox("Land", true); - public JCheckBox creatureCheckBox = new JCheckBox("Creature", true); - public JCheckBox sorceryCheckBox = new JCheckBox("Sorcery", true); - public JCheckBox instantCheckBox = new JCheckBox("Instant", true); - public JCheckBox planeswalkerCheckBox = new JCheckBox("Planeswalker", true); - public JCheckBox artifactCheckBox = new JCheckBox("Artifact", true); - public JCheckBox enchantmentCheckBox = new JCheckBox("Enchant", true); - public CardList stCardList; - public boolean filterUsed; - private CardList top; - private CardList bottom; - public Card cCardHQ; - /** Constant previousDirectory */ - private static File previousDirectory = null; - - private CardDetailPanel detail = new CardDetailPanel(null); - private CardPicturePanel picture = new CardPicturePanel(null); - private JPanel glassPane; - - /** {@inheritDoc} */ - @Override - public void setTitle(String message) { - super.setTitle(message); - } - - /** {@inheritDoc} */ - public void updateDisplay(CardList top, CardList bottom) { - - this.top = top; - this.bottom = bottom; - - topModel.clear(); - bottomModel.clear(); - - top = AllZone.getNameChanger().changeCardsIfNeeded(top); - bottom = AllZone.getNameChanger().changeCardsIfNeeded(bottom); - - Card c; - String cardName; - // QuestBoosterPack pack = new QuestBoosterPack(); - - java.util.List addedList = AllZone.getQuestData().getAddedCards(); - - // update top - for (int i = 0; i < top.size(); i++) { - c = top.get(i); - - cardName = c.getName(); - c.setRarity(c.getSVar("Rarity")); - - if (addedList.contains(cardName)) - c.setRarity("new"); - - // String PC = c.getSVar("PicCount"); - Random r = MyRandom.random; - // int n = 0; - // if (!PC.equals("")) { - // if (PC.matches("[0-9][0-9]?")) - // n = Integer.parseInt(PC); - // if (n > 1) - // c.setRandomPicture(r.nextInt(n)); - // } - - if (c.getCurSetCode().equals("")) - c.setCurSetCode(c.getMostRecentSet()); - - if (!c.getCurSetCode().equals("")) { - int n = SetInfoUtil.getSetInfo_Code(c.getSets(), c.getCurSetCode()).PicCount; - if (n > 1) - c.setRandomPicture(r.nextInt(n - 1) + 1); - - c.setImageFilename(CardUtil.buildFilename(c)); - } - - topModel.addCard(c); - }// for - - // update bottom - for (int i = 0; i < bottom.size(); i++) { - c = bottom.get(i); - - c.setRarity(c.getSVar("Rarity")); - - // String PC = c.getSVar("PicCount"); - Random r = MyRandom.random; - // int n = 0; - // if (!PC.equals("")){ - // if (PC.matches("[0-9][0-9]?")) - // n = Integer.parseInt(PC); - // if (n > 1) - // c.setRandomPicture(r.nextInt(n)); - // } - - if (c.getCurSetCode().equals("")) - c.setCurSetCode(c.getMostRecentSet()); - - if (!c.getCurSetCode().equals("")) { - int n = SetInfoUtil.getSetInfo_Code(c.getSets(), c.getCurSetCode()).PicCount; - if (n > 1) - c.setRandomPicture(r.nextInt(n - 1) + 1); - - c.setImageFilename(CardUtil.buildFilename(c)); - } - - bottomModel.addCard(c); - }// for - - topModel.resort(); - bottomModel.resort(); - }// updateDisplay - - /** - *

- * updateDisplay. - *

- */ - public void updateDisplay() { - // updateDisplay(this.top, this.bottom); - - topModel.clear(); - - top = AllZone.getNameChanger().changeCardsIfNeeded(top); - bottom = AllZone.getNameChanger().changeCardsIfNeeded(bottom); - - 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.getNameChanger().getOriginalName(c.getName()); - if (!pack.getRarity(cardName).equals("error")) { - c.setRarity(pack.getRarity(cardName)); - } - - boolean filteredOut = filterByColor(c); - - if (!filteredOut) { - filteredOut = filterByType(c); - } - - if (!filteredOut) { - topModel.addCard(c); - } - }// for - - topModel.resort(); - } - - /** - *

- * filterByColor. - *

- * - * @param c - * a {@link forge.Card} object. - * @return a boolean. - */ - private boolean filterByColor(Card c) { - boolean filterOut = false; - - if (!whiteCheckBox.isSelected()) { - if (CardUtil.getColors(c).contains(Constant.Color.White)) { - filterOut = true; - } - } - - if (!blueCheckBox.isSelected()) { - if (CardUtil.getColors(c).contains(Constant.Color.Blue)) { - filterOut = true; - } - } - - if (!blackCheckBox.isSelected()) { - if (CardUtil.getColors(c).contains(Constant.Color.Black)) { - filterOut = true; - } - } - - if (!redCheckBox.isSelected()) { - if (CardUtil.getColors(c).contains(Constant.Color.Red)) { - filterOut = true; - } - } - - if (!greenCheckBox.isSelected()) { - if (CardUtil.getColors(c).contains(Constant.Color.Green)) { - filterOut = true; - } - } - - if (!colorlessCheckBox.isSelected()) { - if (CardUtil.getColors(c).contains(Constant.Color.Colorless)) { - filterOut = true; - } - } - - return filterOut; - } - - /** - *

- * filterByType. - *

- * - * @param c - * a {@link forge.Card} object. - * @return a boolean. - */ - private boolean filterByType(Card c) { - boolean filterOut = false; - - if (!landCheckBox.isSelected() && c.isLand()) { - filterOut = true; - } - - if (!creatureCheckBox.isSelected() && c.isCreature()) { - filterOut = true; - } - - if (!sorceryCheckBox.isSelected() && c.isSorcery()) { - filterOut = true; - } - - if (!instantCheckBox.isSelected() && c.isInstant()) { - filterOut = true; - } - - if (!planeswalkerCheckBox.isSelected() && c.isPlaneswalker()) { - filterOut = true; - } - - if (!artifactCheckBox.isSelected() && c.isArtifact()) { - filterOut = true; - } - - if (!enchantmentCheckBox.isSelected() && c.isEnchantment()) { - filterOut = true; - } - - return filterOut; - } - - /** - *

- * getTopTableModel. - *

- * - * @return a {@link forge.TableModel} object. - */ - public TableModel getTopTableModel() { - return topModel; - } - - // top shows available card pool - /** - *

- * Getter for the field top. - *

- * - * @return a {@link forge.CardList} object. - */ - public CardList getTop() { - return topModel.getCards(); - } - - // bottom shows cards that the user has chosen for his library - /** - *

- * Getter for the field bottom. - *

- * - * @return a {@link forge.CardList} object. - */ - public CardList getBottom() { - return bottomModel.getCards(); - } - - /** - *

- * show. - *

- * - * @param exitCommand - * a {@link forge.Command} object. - */ - public void show(final Command exitCommand) { - final Command exit = new Command() { - private static final long serialVersionUID = -7428793574300520612L; - - public void execute() { - Gui_Quest_DeckEditor.this.dispose(); - exitCommand.execute(); - } - }; - - // do not change this!!!! - this.addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent ev) { - customMenu.close(); - } - }); - - setup(); - - customMenu = new Gui_Quest_DeckEditor_Menu(this, exit); - this.setJMenuBar(customMenu); - - forge.quest.data.QuestData questData = AllZone.getQuestData(); - Deck deck = null; - - // open deck that the player used if QuestData has it - if (Constant.Runtime.HumanDeck[0] != null - && questData.getDeckNames().contains(Constant.Runtime.HumanDeck[0].getName())) { - deck = questData.getDeck(Constant.Runtime.HumanDeck[0].getName()); - } else { - deck = new Deck(Constant.GameType.Sealed); - deck.setName(""); - } - - // tell Gui_Quest_DeckEditor the name of the deck - customMenu.setHumanPlayer(deck.getName()); - - // convert Deck main into CardList to show on the screen - // convert Deck main into CardList to show on the screen - CardList bottom = new CardList(); - for (int i = 0; i < deck.countMain(); i++) { - bottom.add(AllZone.getCardFactory().getCard(deck.getMain(i), null)); - } - - java.util.ArrayList list = (ArrayList) AllZone.getQuestData().getCardpool(); - - CardList cardpool = Gui_Quest_DeckEditor_Menu.covertToCardList(list); - - // remove bottom cards that are in the deck from the card pool - for (int i = 0; i < bottom.size(); i++) { - if (cardpool.containsName(bottom.get(i).getName())) - cardpool.remove(bottom.get(i).getName()); - } - - // show cards, makes this user friendly, lol, well may, ha - updateDisplay(cardpool, bottom); - - // this affects the card pool - topModel.sort(4, true);// sort by type - topModel.sort(3, true);// then sort by color - - bottomModel.sort(1, true); - }// show(Command) - - /** - *

- * addListeners. - *

- */ - 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) < 200) - return; - glassPane.setVisible(true); - } - }); - }// addListeners() - - /** - *

- * setup. - *

- */ - public void setup() { - addListeners(); - - // construct topTable, get all cards - topModel = new TableModel(new CardList(), this); - topModel.addListeners(topTable); - topTable.setModel(topModel); - topModel.resizeCols(topTable); - - // construct bottomModel - bottomModel = new TableModel(this); - bottomModel.addListeners(bottomTable); - bottomTable.setModel(bottomModel); - bottomModel.resizeCols(bottomTable); - - // get stats from deck - bottomModel.addTableModelListener(new TableModelListener() { - public void tableChanged(TableModelEvent ev) { - CardList deck = bottomModel.getCards(); - statsLabel.setText(getStats(deck)); - } - }); - - // get stats from all cards - topModel.addTableModelListener(new TableModelListener() { - public void tableChanged(TableModelEvent ev) { - CardList deck = topModel.getCards(); - statsLabel2.setText(getStats(deck)); - } - }); - - 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() - - /** - *

- * getStats. - *

- * - * @param deck - * a {@link forge.CardList} object. - * @return a {@link java.lang.String} object. - */ - private String getStats(CardList deck) { - int total = deck.size(); - int creature = deck.getType("Creature").size(); - int land = deck.getType("Land").size(); - - StringBuffer show = new StringBuffer(); - show.append("Total - ").append(total).append(", Creatures - ").append(creature).append(", Land - ") - .append(land); - String[] color = Constant.Color.Colors; - for (int i = 0; i < 5; i++) - show.append(", ").append(color[i]).append(" - ").append(CardListUtil.getColor(deck, color[i]).size()); - - return show.toString(); - }// getStats() - - /** - *

- * Constructor for Gui_Quest_DeckEditor. - *

- */ - public Gui_Quest_DeckEditor() { - try { - filterUsed = false; - jbInit(); - } catch (Exception ex) { - ErrorViewer.showError(ex); - } - } - - /** - *

- * getCard. - *

- * - * @return a {@link forge.Card} object. - */ - public Card getCard() { - return detail.getCard(); - } - - /** {@inheritDoc} */ - public void setCard(Card card) { - detail.setCard(card); - picture.setCard(card); - } - - /** - *

- * jbInit. - *

- * - * @throws java.lang.Exception - * if any. - */ - 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, "Deck"); - this.getContentPane().setLayout(null); - jScrollPane1.setBorder(titledBorder1); - jScrollPane1.setBounds(new Rectangle(19, 20, 726, 346)); - jScrollPane2.setBorder(titledBorder2); - jScrollPane2.setBounds(new Rectangle(19, 458, 726, 218)); - removeButton.setBounds(new Rectangle(180, 403, 146, 49)); - // removeButton.setIcon(upIcon); - if (!Gui_NewGame.useLAFFonts.isSelected()) - removeButton.setFont(new java.awt.Font("Dialog", 0, 13)); - removeButton.setText("Remove Card"); - removeButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - removeButton_actionPerformed(e); - } - }); - addButton.setText("Add Card"); - addButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - addButton_actionPerformed(e); - } - }); - // addButton.setIcon(downIcon); - if (!Gui_NewGame.useLAFFonts.isSelected()) - addButton.setFont(new java.awt.Font("Dialog", 0, 13)); - addButton.setBounds(new Rectangle(23, 403, 146, 49)); - - analysisButton.setText("Deck Analysis"); - analysisButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - analysisButton_actionPerformed(e); - } - }); - if (!Gui_NewGame.useLAFFonts.isSelected()) - analysisButton.setFont(new java.awt.Font("Dialog", 0, 13)); - analysisButton.setBounds(new Rectangle(578, 426, 166, 25)); - - changePictureButton.setText("Change picture..."); - changePictureButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - changePictureButton_actionPerformed(e); - } - }); - if (!Gui_NewGame.useLAFFonts.isSelected()) - changePictureButton.setFont(new java.awt.Font("Dialog", 0, 10)); - changePictureButton.setBounds(new Rectangle(765, 349, 118, 20)); - - removePictureButton.setText("Remove picture..."); - removePictureButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - removePictureButton_actionPerformed(e); - } - }); - if (!Gui_NewGame.useLAFFonts.isSelected()) - removePictureButton.setFont(new java.awt.Font("Dialog", 0, 10)); - removePictureButton.setBounds(new Rectangle(885, 349, 118, 20)); - - /** - * Type filtering - */ - Font f = new Font("Tahoma", Font.PLAIN, 10); - landCheckBox.setBounds(340, 400, 48, 20); - if (!Gui_NewGame.useLAFFonts.isSelected()) - landCheckBox.setFont(f); - landCheckBox.setOpaque(false); - landCheckBox.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - updateDisplay(); - } - }); - creatureCheckBox.setBounds(385, 400, 65, 20); - if (!Gui_NewGame.useLAFFonts.isSelected()) - creatureCheckBox.setFont(f); - creatureCheckBox.setOpaque(false); - creatureCheckBox.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - updateDisplay(); - } - }); - sorceryCheckBox.setBounds(447, 400, 62, 20); - if (!Gui_NewGame.useLAFFonts.isSelected()) - sorceryCheckBox.setFont(f); - sorceryCheckBox.setOpaque(false); - sorceryCheckBox.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - updateDisplay(); - } - }); - instantCheckBox.setBounds(505, 400, 60, 20); - if (!Gui_NewGame.useLAFFonts.isSelected()) - instantCheckBox.setFont(f); - instantCheckBox.setOpaque(false); - instantCheckBox.addItemListener(new ItemListener() { - - public void itemStateChanged(ItemEvent e) { - updateDisplay(); - } - }); - planeswalkerCheckBox.setBounds(558, 400, 85, 20); - if (!Gui_NewGame.useLAFFonts.isSelected()) - planeswalkerCheckBox.setFont(f); - planeswalkerCheckBox.setOpaque(false); - planeswalkerCheckBox.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - updateDisplay(); - } - }); - artifactCheckBox.setBounds(638, 400, 58, 20); - if (!Gui_NewGame.useLAFFonts.isSelected()) - artifactCheckBox.setFont(f); - artifactCheckBox.setOpaque(false); - artifactCheckBox.addItemListener(new ItemListener() { - - public void itemStateChanged(ItemEvent e) { - updateDisplay(); - } - }); - enchantmentCheckBox.setBounds(692, 400, 80, 20); - if (!Gui_NewGame.useLAFFonts.isSelected()) - enchantmentCheckBox.setFont(f); - enchantmentCheckBox.setOpaque(false); - enchantmentCheckBox.addItemListener(new ItemListener() { - - public void itemStateChanged(ItemEvent e) { - updateDisplay(); - } - }); - - /** - * Color filtering - */ - whiteCheckBox.setBounds(340, 430, 40, 20); - whiteCheckBox.setOpaque(false); - whiteCheckBox.addItemListener(new ItemListener() { - - public void itemStateChanged(ItemEvent e) { - updateDisplay(); - } - }); - blueCheckBox.setBounds(380, 430, 40, 20); - blueCheckBox.setOpaque(false); - blueCheckBox.addItemListener(new ItemListener() { - - public void itemStateChanged(ItemEvent e) { - updateDisplay(); - } - }); - blackCheckBox.setBounds(420, 430, 40, 20); - blackCheckBox.setOpaque(false); - blackCheckBox.addItemListener(new ItemListener() { - - public void itemStateChanged(ItemEvent e) { - updateDisplay(); - } - }); - redCheckBox.setBounds(460, 430, 40, 20); - redCheckBox.setOpaque(false); - redCheckBox.addItemListener(new ItemListener() { - - public void itemStateChanged(ItemEvent e) { - updateDisplay(); - } - }); - greenCheckBox.setBounds(500, 430, 40, 20); - greenCheckBox.setOpaque(false); - greenCheckBox.addItemListener(new ItemListener() { - - public void itemStateChanged(ItemEvent e) { - updateDisplay(); - } - }); - colorlessCheckBox.setBounds(540, 430, 40, 20); - colorlessCheckBox.setOpaque(false); - colorlessCheckBox.addItemListener(new ItemListener() { - - public void itemStateChanged(ItemEvent e) { - - updateDisplay(); - } - }); - - /** - * Other - */ - - detail.setBounds(new Rectangle(765, 23, 239, 323)); - picture.setBounds(new Rectangle(765, 372, 239, 338)); - picture.addMouseListener(new MouseInputAdapter() { - - }); - if (!Gui_NewGame.useLAFFonts.isSelected()) - statsLabel.setFont(new java.awt.Font("Dialog", 0, 14)); - statsLabel.setText("Total - 0, Creatures - 0 Land - 0"); - statsLabel.setBounds(new Rectangle(19, 672, 720, 31)); - // Do not lower statsLabel any lower, we want this to be visible at 1024 - // x 768 screen size - this.setTitle("Deck Editor"); - gridLayout1.setColumns(1); - gridLayout1.setRows(0); - statsLabel2.setBounds(new Rectangle(19, 365, 720, 31)); - statsLabel2.setText("Total - 0, Creatures - 0 Land - 0"); - if (!Gui_NewGame.useLAFFonts.isSelected()) - statsLabel2.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(addButton, null); - this.getContentPane().add(removeButton, null); - this.getContentPane().add(analysisButton, null); - this.getContentPane().add(changePictureButton, null); - this.getContentPane().add(removePictureButton, null); - this.getContentPane().add(statsLabel2, null); - this.getContentPane().add(statsLabel, null); - this.getContentPane().add(jLabel1, null); - jScrollPane2.getViewport().add(bottomTable, null); - jScrollPane1.getViewport().add(topTable, null); - - this.getContentPane().add(landCheckBox, null); - this.getContentPane().add(creatureCheckBox, null); - this.getContentPane().add(sorceryCheckBox, null); - this.getContentPane().add(instantCheckBox, null); - this.getContentPane().add(planeswalkerCheckBox, null); - this.getContentPane().add(artifactCheckBox, null); - this.getContentPane().add(enchantmentCheckBox, null); - - this.getContentPane().add(whiteCheckBox, null); - this.getContentPane().add(blueCheckBox, null); - this.getContentPane().add(blackCheckBox, null); - this.getContentPane().add(redCheckBox, null); - this.getContentPane().add(greenCheckBox, null); - this.getContentPane().add(colorlessCheckBox, 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); - } - - /** - *

- * addButton_actionPerformed. - *

- * - * @param e - * a {@link java.awt.event.ActionEvent} object. - */ - void addButton_actionPerformed(ActionEvent e) { - setTitle("Deck Editor : " + customMenu.getDeckName() + " : unsaved"); - - int n = topTable.getSelectedRow(); - if (n != -1) { - Card c = topModel.rowToCard(n); - bottomModel.addCard(c); - bottomModel.resort(); - if (filterUsed == true) { - stCardList.remove(c.getName()); - stCardList.shuffle(); - } - - if (!Constant.GameType.Constructed.equals(customMenu.getGameType())) { - topModel.removeCard(c); - if (filterUsed == false) { - stCardList = this.getTop(); - } - - } - - // 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); - } - }// if(valid row) - - }// addButton_actionPerformed - - /** - *

- * analysisButton_actionPerformed. - *

- * - * @param e - * a {@link java.awt.event.ActionEvent} object. - */ - void analysisButton_actionPerformed(ActionEvent e) { - - if (bottomModel.getRowCount() == 0) { - JOptionPane.showMessageDialog(null, "Cards in deck not found.", "Analysis Deck", - JOptionPane.INFORMATION_MESSAGE); - } else { - Gui_Quest_DeckEditor g = Gui_Quest_DeckEditor.this; - GUI_DeckAnalysis dAnalysis = new GUI_DeckAnalysis(g, bottomModel); - dAnalysis.setVisible(true); - g.setEnabled(false); - } - } - - /** - *

- * changePictureButton_actionPerformed. - *

- * - * @param e - * a {@link java.awt.event.ActionEvent} object. - */ - void changePictureButton_actionPerformed(ActionEvent e) { - if (cCardHQ != null) { - File file = getImportFilename(); - if (file != null) { - String fileName = GuiDisplayUtil.cleanString(cCardHQ.getName()) + ".jpg"; - File base = ForgeProps.getFile(IMAGE_BASE); - File f = new File(base, fileName); - f.delete(); - - try { - - f.createNewFile(); - FileOutputStream fos = new FileOutputStream(f); - FileInputStream fis = new FileInputStream(file); - byte[] buff = new byte[32 * 1024]; - int length; - while (fis.available() > 0) { - length = fis.read(buff); - if (length > 0) - fos.write(buff, 0, length); - } - fos.flush(); - fis.close(); - fos.close(); - setCard(cCardHQ); - - } catch (IOException e1) { - e1.printStackTrace(); - } - - } - } - } - - /** - *

- * getImportFilename. - *

- * - * @return a {@link java.io.File} object. - */ - private File getImportFilename() { - JFileChooser chooser = new JFileChooser(previousDirectory); - ImagePreviewPanel preview = new ImagePreviewPanel(); - chooser.setAccessory(preview); - chooser.addPropertyChangeListener(preview); - chooser.addChoosableFileFilter(dckFilter); - int returnVal = chooser.showOpenDialog(null); - - if (returnVal == JFileChooser.APPROVE_OPTION) { - File file = chooser.getSelectedFile(); - previousDirectory = file.getParentFile(); - return file; - } - - return null; - - } - - private FileFilter dckFilter = new FileFilter() { - - @Override - public boolean accept(File f) { - return f.getName().endsWith(".jpg") || f.isDirectory(); - } - - @Override - public String getDescription() { - return "*.jpg"; - } - - }; - - /** - *

- * removePictureButton_actionPerformed. - *

- * - * @param e - * a {@link java.awt.event.ActionEvent} object. - */ - void removePictureButton_actionPerformed(ActionEvent e) { - if (cCardHQ != null) { - String options[] = { "Yes", "No" }; - int value = JOptionPane.showOptionDialog(null, "Do you want delete " + cCardHQ.getName() + " picture?", - "Delete picture", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, - options[1]); - if (value == 0) { - String fileName = GuiDisplayUtil.cleanString(cCardHQ.getName()) + ".jpg"; - File base = ForgeProps.getFile(IMAGE_BASE); - File f = new File(base, fileName); - f.delete(); - JOptionPane.showMessageDialog(null, "Picture " + cCardHQ.getName() + " deleted.", "Delete picture", - JOptionPane.INFORMATION_MESSAGE); - setCard(cCardHQ); - } - } - - } - - /** - *

- * removeButton_actionPerformed. - *

- * - * @param e - * a {@link java.awt.event.ActionEvent} object. - */ - void removeButton_actionPerformed(ActionEvent e) { - setTitle("Deck Editor : " + customMenu.getDeckName() + " : unsaved"); - - int n = bottomTable.getSelectedRow(); - if (n != -1) { - Card c = bottomModel.rowToCard(n); - bottomModel.removeCard(c); - if (filterUsed == true) { - stCardList.add(c); - } - - if (!Constant.GameType.Constructed.equals(customMenu.getGameType())) { - topModel.addCard(c); - topModel.resort(); - if (filterUsed == false) { - stCardList = this.getTop(); - } - } - - // 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) - - }// removeButton_actionPerformed - - /** - *

- * stats_actionPerformed. - *

- * - * @param list - * a {@link forge.CardList} object. - */ - @SuppressWarnings("unused") - // stats_actionPerformed - private void stats_actionPerformed(CardList list) { - - } - - /* - * //refresh Gui from deck, Gui shows the cards in the deck - *//** - *

- * refreshGui. - *

- */ - /* - * @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.getCardFactory().getCard(deck.getMain(i), - * AllZone.getHumanPlayer()); - * - * 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.getCardFactory().getCard(deck.getSideboard(i), - * AllZone.getHumanPlayer()); c.setRarity(pack.getRarity(c.getName())); - * topModel.addCard(c); } } else { - * - * - * Braids: "getAllCards copies the entire array, but that does not seem to - * be needed here. Significant performance improvement is possible if this - * code used getCards instead (along with a for each loop instead of using - * get(i), if applicable)." - * - * CardList all = AllZone.getCardFactory().getAllCards(); for (int i = 0; i - * < all.size(); i++) topModel.addCard(all.get(i)); } - * - * topModel.resort(); bottomModel.resort(); }////refreshGui() - */ - // public class CustomListener extends MouseAdapter { - // TODO reenable - // public void mouseEntered(MouseEvent e) { - // - // if(picturePanel.getComponentCount() != 0) { - // - // - // if(GuiDisplayUtil.IsPictureHQExists(cCardHQ)) { - // int cWidth = 0; - // try { - // cWidth = GuiDisplayUtil.getPictureHQwidth(cCardHQ); - // } catch(IOException e2) { - // // TODO Auto-generated catch block - // e2.printStackTrace(); - // } - // int cHeight = 0; - // try { - // cHeight = GuiDisplayUtil.getPictureHQheight(cCardHQ); - // } catch(IOException e2) { - // // TODO Auto-generated catch block - // e2.printStackTrace(); - // } - // - // if(cWidth >= 312 && cHeight >= 445) { - // - // GUI_PictureHQ hq = new GUI_PictureHQ(Gui_Quest_DeckEditor.this, cCardHQ); - // try { - // hq.letsGo(Gui_Quest_DeckEditor.this, cCardHQ); - // } catch(IOException e1) { - // e1.printStackTrace(); - // } - // } - // - // } - // } - // - // } - // } - -} diff --git a/src/forge/Gui_Quest_DeckEditor_Menu.java b/src/forge/Gui_Quest_DeckEditor_Menu.java deleted file mode 100644 index b1095117e0b..00000000000 --- a/src/forge/Gui_Quest_DeckEditor_Menu.java +++ /dev/null @@ -1,1230 +0,0 @@ -package forge; - - -import forge.deck.Deck; -import forge.deck.DeckManager; -import forge.error.ErrorViewer; -import forge.gui.GuiUtils; -import forge.quest.data.QuestBattleManager; - -import javax.swing.*; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; -import javax.swing.filechooser.FileFilter; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.FileOutputStream; -import java.io.FileWriter; -import java.io.ObjectOutputStream; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - - -//presumes AllZone.getQuestData() is not null -/** - *

Gui_Quest_DeckEditor_Menu class.

- * - * @author Forge - * @version $Id: $ - */ -public class Gui_Quest_DeckEditor_Menu extends JMenuBar { - /** Constant serialVersionUID=-4052319220021158574L */ - private static final long serialVersionUID = -4052319220021158574L; - - //this should be false in the public version - //if true, the Quest Deck editor will let you edit the computer's decks - private final boolean canEditComputerDecks; - - /** Constant deckEditorName="Deck Editor" */ - private static final String deckEditorName = "Deck Editor"; - - //used for import and export, try to made the gui user friendly - /** Constant previousDirectory */ - private static File previousDirectory = null; - - private Command exitCommand; - private forge.quest.data.QuestData questData; - private Deck currentDeck; - - //the class DeckDisplay is in the file "Gui_DeckEditor_Menu.java" - private DeckDisplay deckDisplay; - - - /** - *

Constructor for Gui_Quest_DeckEditor_Menu.

- * - * @param d a {@link forge.DeckDisplay} object. - * @param exit a {@link forge.Command} object. - */ - public Gui_Quest_DeckEditor_Menu(DeckDisplay d, Command exit) { - //is a file named "edit" in this directory - //lame but it works, I don't like 2 versions of MTG Forge floating around - //one that lets you edit the AI decks and one that doesn't - File f = new File("edit"); - if (f.exists()) canEditComputerDecks = true; - else canEditComputerDecks = false; - - - deckDisplay = d; - d.setTitle(deckEditorName); - - questData = AllZone.getQuestData(); - - exitCommand = exit; - - setupMenu(); - setupFilterMenu(); - - if (canEditComputerDecks) setupComputerMenu(); - } - - /** - *

setupFilterMenu.

- */ - private void setupFilterMenu() { - JMenuItem filter = new JMenuItem("New filter"); - JMenuItem clearfilter = new JMenuItem("Clear filter"); - JMenu menu = new JMenu("Filter"); - menu.add(filter); - menu.add(clearfilter); - this.add(menu); - - filter.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - Gui_Quest_DeckEditor g = (Gui_Quest_DeckEditor) deckDisplay; - if (g.stCardList == null) { - g.blackCheckBox.setSelected(true); - g.blackCheckBox.setEnabled(true); - g.blueCheckBox.setSelected(true); - g.blueCheckBox.setEnabled(true); - g.greenCheckBox.setSelected(true); - g.greenCheckBox.setEnabled(true); - g.redCheckBox.setSelected(true); - g.redCheckBox.setEnabled(true); - g.whiteCheckBox.setSelected(true); - g.whiteCheckBox.setEnabled(true); - g.colorlessCheckBox.setSelected(true); - g.colorlessCheckBox.setEnabled(true); - g.artifactCheckBox.setSelected(true); - g.artifactCheckBox.setEnabled(true); - g.creatureCheckBox.setSelected(true); - g.creatureCheckBox.setEnabled(true); - g.enchantmentCheckBox.setSelected(true); - g.enchantmentCheckBox.setEnabled(true); - g.instantCheckBox.setSelected(true); - g.instantCheckBox.setEnabled(true); - g.landCheckBox.setSelected(true); - g.landCheckBox.setEnabled(true); - g.planeswalkerCheckBox.setSelected(true); - g.planeswalkerCheckBox.setEnabled(true); - g.sorceryCheckBox.setSelected(true); - g.sorceryCheckBox.setEnabled(true); - g.stCardList = g.getTop(); - GUI_Quest_Filter filt = new GUI_Quest_Filter(g, deckDisplay); - g.setEnabled(false); - g.filterUsed = true; - filt.setVisible(true); - } else { - g.blackCheckBox.setSelected(true); - g.blackCheckBox.setEnabled(true); - g.blueCheckBox.setSelected(true); - g.blueCheckBox.setEnabled(true); - g.greenCheckBox.setSelected(true); - g.greenCheckBox.setEnabled(true); - g.redCheckBox.setSelected(true); - g.redCheckBox.setEnabled(true); - g.whiteCheckBox.setSelected(true); - g.whiteCheckBox.setEnabled(true); - g.colorlessCheckBox.setSelected(true); - g.colorlessCheckBox.setEnabled(true); - g.artifactCheckBox.setSelected(true); - g.artifactCheckBox.setEnabled(true); - g.creatureCheckBox.setSelected(true); - g.creatureCheckBox.setEnabled(true); - g.enchantmentCheckBox.setSelected(true); - g.enchantmentCheckBox.setEnabled(true); - g.instantCheckBox.setSelected(true); - g.instantCheckBox.setEnabled(true); - g.landCheckBox.setSelected(true); - g.landCheckBox.setEnabled(true); - g.planeswalkerCheckBox.setSelected(true); - g.planeswalkerCheckBox.setEnabled(true); - g.sorceryCheckBox.setSelected(true); - g.sorceryCheckBox.setEnabled(true); - GUI_Quest_Filter filt = new GUI_Quest_Filter(g, deckDisplay); - g.filterUsed = true; - g.setEnabled(false); - filt.setVisible(true); - } - } - }); - clearfilter.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent ev) { - - Gui_Quest_DeckEditor g = (Gui_Quest_DeckEditor) deckDisplay; - if (g.stCardList == null) { - g.blackCheckBox.setSelected(true); - g.blackCheckBox.setEnabled(true); - g.blueCheckBox.setSelected(true); - g.blueCheckBox.setEnabled(true); - g.greenCheckBox.setSelected(true); - g.greenCheckBox.setEnabled(true); - g.redCheckBox.setSelected(true); - g.redCheckBox.setEnabled(true); - g.whiteCheckBox.setSelected(true); - g.whiteCheckBox.setEnabled(true); - g.colorlessCheckBox.setSelected(true); - g.colorlessCheckBox.setEnabled(true); - g.artifactCheckBox.setSelected(true); - g.artifactCheckBox.setEnabled(true); - g.creatureCheckBox.setSelected(true); - g.creatureCheckBox.setEnabled(true); - g.enchantmentCheckBox.setSelected(true); - g.enchantmentCheckBox.setEnabled(true); - g.instantCheckBox.setSelected(true); - g.instantCheckBox.setEnabled(true); - g.landCheckBox.setSelected(true); - g.landCheckBox.setEnabled(true); - g.planeswalkerCheckBox.setSelected(true); - g.planeswalkerCheckBox.setEnabled(true); - g.sorceryCheckBox.setSelected(true); - g.sorceryCheckBox.setEnabled(true); - g.filterUsed = false; - } else { - g.blackCheckBox.setSelected(true); - g.blackCheckBox.setEnabled(true); - g.blueCheckBox.setSelected(true); - g.blueCheckBox.setEnabled(true); - g.greenCheckBox.setSelected(true); - g.greenCheckBox.setEnabled(true); - g.redCheckBox.setSelected(true); - g.redCheckBox.setEnabled(true); - g.whiteCheckBox.setSelected(true); - g.whiteCheckBox.setEnabled(true); - g.colorlessCheckBox.setSelected(true); - g.colorlessCheckBox.setEnabled(true); - g.artifactCheckBox.setSelected(true); - g.artifactCheckBox.setEnabled(true); - g.creatureCheckBox.setSelected(true); - g.creatureCheckBox.setEnabled(true); - g.enchantmentCheckBox.setSelected(true); - g.enchantmentCheckBox.setEnabled(true); - g.instantCheckBox.setSelected(true); - g.instantCheckBox.setEnabled(true); - g.landCheckBox.setSelected(true); - g.landCheckBox.setEnabled(true); - g.planeswalkerCheckBox.setSelected(true); - g.planeswalkerCheckBox.setEnabled(true); - g.sorceryCheckBox.setSelected(true); - g.sorceryCheckBox.setEnabled(true); - g.filterUsed = false; - deckDisplay.updateDisplay(g.stCardList, deckDisplay.getBottom()); - } - - - } - }); - - } - - - /** - *

addImportExport.

- * - * @param menu a {@link javax.swing.JMenu} object. - * @param isHumanMenu a boolean. - */ - private void addImportExport(JMenu menu, final boolean isHumanMenu) { - JMenuItem import2 = new JMenuItem("Import"); - JMenuItem export = new JMenuItem("Export"); - - import2.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent a) { - importDeck();//importDeck(isHumanMenu); - } - });//import - - export.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent a) { - exportDeck(); - } - });//export - - menu.add(import2); - menu.add(export); - - }//addImportExport() - - /** - *

exportDeck.

- */ - private void exportDeck() { - File filename = getExportFilename(); - - if (filename == null) return; - - //write is an Object variable because you might just - //write one Deck object - Deck deck = convertCardListToDeck(deckDisplay.getBottom()); - ; - Object write = deck; - - deck.setName(filename.getName()); - - - try { - ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename)); - out.writeObject(write); - out.flush(); - out.close(); - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("Gui_Quest_DeckEditor_Menu : exportDeck() error, " + ex); - } - - exportDeckText(getExportDeckText(deck), filename.getAbsolutePath()); - - }//exportDeck() - - // TableSorter type safety - /** - *

getExportDeckText.

- * - * @param aDeck a {@link forge.deck.Deck} object. - * @return a {@link java.lang.String} object. - */ - private String getExportDeckText(Deck aDeck) { - //convert Deck into CardList - CardList all = new CardList(); - for (int i = 0; i < aDeck.countMain(); i++) { - String cardName = aDeck.getMain(i); - Card c = AllZone.getCardFactory().getCard(cardName, null); - - all.add(c); - } - - //sort by card name - all.sort(new TableSorter(all, 1, true)); - - //remove all copies of cards - //make a singleton - CardList noCopies = new CardList(); - for (int i = 0; i < all.size(); i++) { - Card c = all.get(i); - - if (!noCopies.containsName(c.getName())) noCopies.add(c); - } - - StringBuffer sb = new StringBuffer(); - String newLine = "\r\n"; - int count = 0; - - sb.append(all.size()).append(" Total Cards").append(newLine).append(newLine); - - //creatures - sb.append(all.getType("Creature").size()).append(" Creatures").append(newLine); - sb.append("-------------").append(newLine); - - for (int i = 0; i < noCopies.size(); i++) { - Card c = noCopies.get(i); - if (c.isCreature()) { - count = all.getName(c.getName()).size(); - sb.append(count).append("x ").append(c.getName()).append(newLine); - } - } - - //count spells, arg! this is tough - CardListFilter cf = new CardListFilter() { - public boolean addCard(Card c) { - return !(c.isCreature() || c.isLand()); - } - };//CardListFilter - count = all.filter(cf).size(); - - //spells - sb.append(newLine).append(count).append(" Spells").append(newLine); - sb.append("----------").append(newLine); - - for (int i = 0; i < noCopies.size(); i++) { - Card c = noCopies.get(i); - if (!(c.isCreature() || c.isLand())) { - count = all.getName(c.getName()).size(); - sb.append(count).append("x ").append(c.getName()).append(newLine); - } - } - - //land - sb.append(newLine).append(all.getType("Land").size()).append(" Land").append(newLine); - sb.append("--------").append(newLine); - - for (int i = 0; i < noCopies.size(); i++) { - Card c = noCopies.get(i); - if (c.isLand()) { - count = all.getName(c.getName()).size(); - sb.append(count).append("x ").append(c.getName()).append(newLine); - } - } - - sb.append(newLine); - - return sb.toString(); - }//getExportDeckText - - /** - *

exportDeckText.

- * - * @param deckText a {@link java.lang.String} object. - * @param filename a {@link java.lang.String} object. - */ - private void exportDeckText(String deckText, String filename) { - - //remove ".deck" extension - int cut = filename.indexOf("."); - filename = filename.substring(0, cut); - - try { - FileWriter writer = new FileWriter(filename + ".txt"); - writer.write(deckText); - - writer.flush(); - writer.close(); - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("Gui_Quest_DeckEditor_Menu : exportDeckText() error, " + ex.getMessage() - + " : " + Arrays.toString(ex.getStackTrace())); - } - }//exportDeckText() - - - /** - *

getFileFilter.

- * - * @return a {@link javax.swing.filechooser.FileFilter} object. - */ - private FileFilter getFileFilter() { - FileFilter filter = new FileFilter() { - @Override - public boolean accept(File f) { - return f.getName().endsWith(".dck") || f.isDirectory(); - } - - @Override - public String getDescription() { - return "Deck File .dck"; - } - }; - - return filter; - }//getFileFilter() - - /** - *

getExportFilename.

- * - * @return a {@link java.io.File} object. - */ - private File getExportFilename() { - //Object o = null; // unused - - JFileChooser save = new JFileChooser(previousDirectory); - - save.setDialogTitle("Export Deck Filename"); - save.setDialogType(JFileChooser.SAVE_DIALOG); - save.addChoosableFileFilter(getFileFilter()); - save.setSelectedFile(new File(currentDeck.getName() + ".deck")); - - int returnVal = save.showSaveDialog(null); - - if (returnVal == JFileChooser.APPROVE_OPTION) { - File file = save.getSelectedFile(); - String check = file.getAbsolutePath(); - - previousDirectory = file.getParentFile(); - - if (check.endsWith(".deck")) return file; - else return new File(check + ".deck"); - } - - return null; - }//getExportFilename() - - /** - *

importDeck.

- */ - private void importDeck() { - File file = getImportFilename(); - - if (file == null) { - } else if (file.getName().endsWith(".dck")) { - try { - Deck newDeck = DeckManager.readDeck(file); - questData.addDeck(newDeck); - - CardList cardpool = new CardList(); - CardList decklist = new CardList(); - for (String s : newDeck.getMain()) { - Card c = null; - if (s.contains("|")) { - String split[] = s.split("\\|", 2); - c = AllZone.getCardFactory().getCard(split[0], null); - decklist.add(c); - cardpool.add(c); - //setCode = s[1]; - } else { - c = AllZone.getCardFactory().getCard(s, null); - } - - decklist.add(c); - cardpool.add(c); - questData.addCard(c); - } - for (String s : questData.getCardpool()) { - cardpool.add(AllZone.getCardFactory().getCard(s, null)); - } - - deckDisplay.updateDisplay(cardpool, decklist); - - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("Gui_DeckEditor_Menu : importDeck() error, " + ex); - } - } - - }//importDeck() - /* - private void importDeck(boolean isHumanDeck) { - File file = getImportFilename(); - - if(file == null) return; - - Object check = null; - - try { - ObjectInputStream in = new ObjectInputStream(new FileInputStream(file)); - check = in.readObject(); - - //deck migration - this is a little hard to read, because i can't just plainly reference a class in the - //default package - Class deckConverterClass = Class.forName("DeckConverter"); - //invoke public static Object toForgeDeck(Object o) of DeckConverter - check = deckConverterClass.getDeclaredMethod("toForgeDeck", Object.class).invoke(null, check); - - in.close(); - } catch(Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("Gui_Quest_DeckEditor_Menu : importDeck() error, " + ex); - } - - Deck deck = (Deck) check; - - deckDisplay.setTitle(deckEditorName + " - " + deck.getName()); - - CardList cardpool; - - if(isHumanDeck) { - questData.addDeck(deck); - - //convert ArrayList of card names (Strings), into Card objects - cardpool = new CardList(); - List list = questData.getCardpool(); - - for (String cardName : list) { - //String setCode = ""; - if (cardName.contains("|")) { - String s[] = cardName.split("\\|", 2); - cardName = s[0]; - //setCode = s[1]; - } - - cardpool.add(AllZone.getCardFactory().getCard(cardName, null)); - } - } else { - QuestBattleManager.addAIDeck(deck); - cardpool = AllZone.getCardFactory().getAllCards(); - } - - //convert Deck main to CardList - CardList deckList = new CardList(); - for(int i = 0; i < deck.countMain(); i++) { - String cardName = deck.getMain(i); - //String setCode = ""; - if (cardName.contains("|")) - { - String s[] = cardName.split("\\|",2); - cardName = s[0]; - //setCode = s[1]; - } - - deckList.add(AllZone.getCardFactory().getCard(cardName, null)); - } - //update gui - deckDisplay.updateDisplay(cardpool, deckList); - - }//importDeck() - */ - - /** - *

getImportFilename.

- * - * @return a {@link java.io.File} object. - */ - private File getImportFilename() { - JFileChooser chooser = new JFileChooser(previousDirectory); - - chooser.addChoosableFileFilter(getFileFilter()); - int returnVal = chooser.showOpenDialog(null); - - if (returnVal == JFileChooser.APPROVE_OPTION) { - File file = chooser.getSelectedFile(); - previousDirectory = file.getParentFile(); - return file; - } - - return null; - }//openFileDialog() - - //edit the AI decks - /** - *

setupComputerMenu.

- */ - private void setupComputerMenu() { - JMenuItem open = new JMenuItem("Open"); - JMenuItem new2 = new JMenuItem("New"); - JMenuItem rename = new JMenuItem("Rename"); - JMenuItem save = new JMenuItem("Save"); - JMenuItem copy = new JMenuItem("Copy"); - JMenuItem delete = new JMenuItem("Delete"); - JMenuItem exit = new JMenuItem("Exit"); - - - JMenuItem viewAllDecks = new JMenuItem("View All Decks"); - - - //AI - viewAllDecks.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent a) { - List nameList = QuestBattleManager.getAIDeckNames(); - Collections.sort(nameList); - - Deck deck; - StringBuffer allText = new StringBuffer(); - - for (String aNameList : nameList) { - deck = QuestBattleManager.getAIDeck(aNameList); - allText.append(deck.getName()).append("\r\n"); - allText.append(getExportDeckText(deck)); - allText.append("++++++++++++++++++++++++++++++++++++++++++++++++++++++ \r\n \r\n"); - } - - JTextArea area = new JTextArea(allText.toString(), 30, 30); - JOptionPane.showMessageDialog(null, new JScrollPane(area)); - - }//actionPerformed() - });//viewAllDecks - - //AI - open.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent a) { - String deckName = getUserInput_OpenDeck(QuestBattleManager.getAIDeckNames()); - - //check if user selected "cancel" - if (deckName.equals("")) return; - - - setComputerPlayer(deckName); - - Deck d = QuestBattleManager.getAIDeck(deckName); - CardList deck = new CardList(); - - for (int i = 0; i < d.countMain(); i++) { - String cardName = d.getMain(i); - //String setCode = ""; - if (cardName.contains("|")) { - String s[] = cardName.split("\\|", 2); - cardName = s[0]; - //setCode = s[1]; - } - - deck.add(AllZone.getCardFactory().getCard(cardName, null)); - } - // This is an expensive heap operation. - CardList cardpool = new CardList(AllZone.getCardFactory()); - - deckDisplay.updateDisplay(cardpool, deck); - - } - });//open - - //AI - new2.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent a) { - // This is an expensive heap operation. - CardList allCards = new CardList(AllZone.getCardFactory()); - deckDisplay.updateDisplay(allCards, new CardList()); - - setComputerPlayer(""); - } - });//new - - - //AI - rename.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent a) { - String name = getUserInput_GetDeckName(QuestBattleManager.getAIDeckNames()); - - //check if user cancels - if (name.equals("")) return; - - //is the current deck already saved and in QuestData? - if (QuestBattleManager.getAIDeckNames().contains(currentDeck.getName())) - QuestBattleManager.removeAIDeck(currentDeck.getName());//remove old deck - - currentDeck.setName(name); - - Deck deck = convertCardListToDeck(deckDisplay.getBottom()); - deck.setName(name); - QuestBattleManager.addAIDeck(deck); - - setComputerPlayer(name); - } - });//rename - - - //AI - save.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent a) { - String name = currentDeck.getName(); - - //check to see if name is set - if (name.equals("")) { - name = getUserInput_GetDeckName(QuestBattleManager.getAIDeckNames()); - - //check if user cancels - if (name.equals("")) return; - } - - setComputerPlayer(name); - - Deck deck = convertCardListToDeck(deckDisplay.getBottom()); - deck.setName(name); - - QuestBattleManager.addAIDeck(deck); - } - });//save - - - //AI - copy.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent a) { - String name = getUserInput_GetDeckName(QuestBattleManager.getAIDeckNames()); - - //check if user cancels - if (name.equals("")) return; - - setComputerPlayer(name); - - Deck deck = convertCardListToDeck(deckDisplay.getBottom()); - deck.setName(name); - - QuestBattleManager.addAIDeck(deck); - } - });//copy - - - //AI - delete.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent a) { - if (currentDeck.getName().equals("")) return; - - int check = JOptionPane.showConfirmDialog(null, "Do you really want to delete this deck?", - "Delete", JOptionPane.YES_NO_OPTION); - if (check == JOptionPane.NO_OPTION) return;//stop here - - QuestBattleManager.removeAIDeck(currentDeck.getName()); - - //show card pool - - // This is an expensive heap operation. - CardList cardpool = new CardList(AllZone.getCardFactory()); - deckDisplay.updateDisplay(cardpool, new CardList()); - - setComputerPlayer(""); - } - });//delete - - - //AI - exit.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent a) { - Gui_Quest_DeckEditor_Menu.this.close(); - } - }); - - JMenu deckMenu = new JMenu("AI Deck"); - deckMenu.add(open); - deckMenu.add(rename); - deckMenu.add(new2); - deckMenu.add(save); - deckMenu.add(copy); - - deckMenu.addSeparator(); - addImportExport(deckMenu, false); - - deckMenu.add(viewAllDecks); - - deckMenu.addSeparator(); - deckMenu.add(delete); - deckMenu.addSeparator(); - deckMenu.add(exit); - - this.add(deckMenu); - - }//setupComputerMenu() - - /** - *

openHumanDeck.

- * - * @param deckName a {@link java.lang.String} object. - */ - private void openHumanDeck(String deckName) { - setHumanPlayer(deckName); - - CardList cardpool = covertToCardList(questData.getCardpool()); - - //covert Deck main to CardList - Deck d = questData.getDeck(deckName); - CardList deck = new CardList(); - - for (int i = 0; i < d.countMain(); i++) { - String cardName = d.getMain(i); - //String setCode = ""; - if (cardName.contains("|")) { - String s[] = cardName.split("\\|", 2); - cardName = s[0]; - //setCode = s[1]; - cardpool.remove(s[0]); - } else { - cardpool.remove(d.getMain(i)); - } - - deck.add(AllZone.getCardFactory().getCard(cardName, null)); - - //remove any cards that are in the deck from the card pool - - } - - deckDisplay.updateDisplay(cardpool, deck); - - }//openHumanDeck - - - //the usual menu options that will be used - /** - *

setupMenu.

- */ - private void setupMenu() { - JMenuItem open = new JMenuItem("Open"); - JMenuItem new2 = new JMenuItem("New"); - JMenuItem rename = new JMenuItem("Rename"); - JMenuItem save = new JMenuItem("Save"); - JMenuItem copy = new JMenuItem("Copy"); - JMenuItem delete = new JMenuItem("Delete"); - JMenuItem exit = new JMenuItem("Exit"); - - //////////////////////////////////////////// - //below is new code - - //adds a card to human player's cardpool - JMenuItem addCard = new JMenuItem("Cheat - Add Card"); - - //add card - addCard.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent a) { - //sort cards by card name - // This is an expensive heap operation. - CardList cardList = new CardList(AllZone.getCardFactory()); - TableSorter sorter = new TableSorter(cardList, 1, true); - cardList.sort(sorter); - - //create a new Card object with a different toString() method - //so that that JList only shows the card's name - // - //this is alot of work just to make it a little - //easier and prettier for the user, gui stuff is very complicated - class BetterCard extends Card { - private Card card; - - BetterCard(Card c) { - card = c; - - //this line is very important - //if you omit this, errors will occur - this.setName(c.getName()); - } - - public String toString() { - return card.getName(); - } - }//BetterCard - - Card[] card = cardList.toArray(); - - for (int i = 0; i < card.length; i++) { - card[i] = new BetterCard(card[i]); - } - - final JList list = new JList(card); - list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - - //update the "card detail" on the right with the card info - list.addListSelectionListener(new ListSelectionListener() { - public void valueChanged(ListSelectionEvent e) { - - /* I think that the code that was based in CardDetailUtil - has been changed and moved to a new/different class? - - CardDetail cd = (CardDetail)deckDisplay; - cd.updateCardDetail((Card)list.getSelectedValue()); - - */ - - } - }); - - Object[] o = {"Add Card to Your Cardpool", new JScrollPane(list)}; - JOptionPane pane = new JOptionPane(o, JOptionPane.INFORMATION_MESSAGE, JOptionPane.OK_CANCEL_OPTION); - - JDialog dialog = pane.createDialog(null, "Cheat - Add Card"); - dialog.setModal(true); - dialog.setVisible(true); - - Object choice = pane.getValue(); - boolean cancel = false; - - //there are a ton of ways to cancel - if ( - choice == null || - choice.equals(JOptionPane.UNINITIALIZED_VALUE) - ) - cancel = true; - else { - int n = ((Integer) choice).intValue(); - if (n == JOptionPane.CANCEL_OPTION) - cancel = true; - } - - if (cancel || list.getSelectedValue() == null) { - //System.out.println("cancelled"); - } else { - //show the choice that the user selected - //System.out.println(list.getSelectedValue()); - - Card c = (Card) list.getSelectedValue(); - - Gui_Quest_DeckEditor g = (Gui_Quest_DeckEditor) deckDisplay; - TableModel table = g.getTopTableModel(); - table.addCard(c); - table.resort(); - } - }//actionPerformed() - });//add card - - - //above is new code - /////////////////////////////////////// - - //human - open.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent a) { - String deckName = getUserInput_OpenDeck(questData.getDeckNames()); - - //check if user selected "cancel" - if (deckName.equals("")) return; - - openHumanDeck(deckName); - } - });//open - - //human - new2.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent a) { - CardList cardpool = covertToCardList(questData.getCardpool()); - deckDisplay.updateDisplay(cardpool, new CardList()); - - setHumanPlayer(""); - } - });//new - - - //human - rename.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent a) { - String name = getUserInput_GetDeckName(questData.getDeckNames()); - - //check if user cancels - if (name.equals("")) return; - - //is the current deck already saved and in QuestData? - if (questData.getDeckNames().contains(currentDeck.getName())) - questData.removeDeck(currentDeck.getName());//remove old deck - - currentDeck.setName(name); - - Deck deck = convertCardListToDeck(deckDisplay.getBottom()); - deck.setName(name); - questData.addDeck(deck); - - setHumanPlayer(name); - } - });//rename - - - //human - save.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent a) { - String name = currentDeck.getName(); - - //check to see if name is set - if (name.equals("")) { - name = getUserInput_GetDeckName(questData.getDeckNames()); - - //check if user cancels - if (name.equals("")) return; - } - - setHumanPlayer(name); - - Deck deck = convertCardListToDeck(deckDisplay.getBottom()); - deck.setName(name); - - questData.addDeck(deck); - } - });//save - - - //human - copy.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent a) { - String name = getUserInput_GetDeckName(questData.getDeckNames()); - - //check if user cancels - if (name.equals("")) return; - - setHumanPlayer(name); - - Deck deck = convertCardListToDeck(deckDisplay.getBottom()); - deck.setName(name); - - questData.addDeck(deck); - } - });//copy - - - //human - delete.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent a) { - if (currentDeck.getName().equals("")) return; - - int check = JOptionPane.showConfirmDialog(null, "Do you really want to delete this deck?", - "Delete", JOptionPane.YES_NO_OPTION); - if (check == JOptionPane.NO_OPTION) return;//stop here - - questData.removeDeck(currentDeck.getName()); - - //show card pool - CardList cardpool = covertToCardList(questData.getCardpool()); - deckDisplay.updateDisplay(cardpool, new CardList()); - - setHumanPlayer(""); - } - });//delete - - - //human - exit.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent a) { - Gui_Quest_DeckEditor_Menu.this.close(); - } - }); - - JMenu deckMenu = new JMenu("Deck"); - deckMenu.add(open); - deckMenu.add(new2); - deckMenu.add(rename); - deckMenu.add(save); - deckMenu.add(copy); - - // The "Cheat - Add Card" menu item is buggy. - // There are other, safer and less buggy ways for people to cheat. - - // deckMenu.addSeparator();//new code - // deckMenu.add(addCard); //new code - - deckMenu.addSeparator(); - addImportExport(deckMenu, true); - - deckMenu.addSeparator(); - deckMenu.add(delete); - deckMenu.addSeparator(); - deckMenu.add(exit); - - this.add(deckMenu); - - }//setupMenu() - - /** - *

convertCardListToDeck.

- * - * @param list a {@link forge.CardList} object. - * @return a {@link forge.deck.Deck} object. - */ - private Deck convertCardListToDeck(CardList list) { - //put CardList into Deck main - Deck deck = new Deck(Constant.GameType.Sealed); - - for (int i = 0; i < list.size(); i++) - deck.addMain(list.get(i).getName()); - - return deck; - } - - //needs to be public because Gui_Quest_DeckEditor.show(Command) uses it - /** - *

setHumanPlayer.

- * - * @param deckName a {@link java.lang.String} object. - */ - public void setHumanPlayer(String deckName) { - //the gui uses this, Gui_Quest_DeckEditor - currentDeck = new Deck(Constant.GameType.Sealed); - currentDeck.setName(deckName); - - deckDisplay.setTitle(deckEditorName + " - " + deckName); - } - - /** - *

setComputerPlayer.

- * - * @param deckName a {@link java.lang.String} object. - */ - private void setComputerPlayer(String deckName) { - //the gui uses this, Gui_Quest_DeckEditor - currentDeck = new Deck(Constant.GameType.Constructed); - currentDeck.setName(deckName); - - deckDisplay.setTitle(deckEditorName + " - " + deckName); - } - - //only accepts numbers, letters or dashes up to 20 characters in length - /** - *

cleanString.

- * - * @param in a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - private String cleanString(String in) { - StringBuffer out = new StringBuffer(); - char[] c = in.toCharArray(); - - for (int i = 0; i < c.length && i < 20; i++) - if (Character.isLetterOrDigit(c[i]) || c[i] == '-' || c[i] == '_' || c[i] == ' ') out.append(c[i]); - - return out.toString(); - } - - //if user cancels, returns "" - /** - *

getUserInput_GetDeckName.

- * - * @param nameList a {@link java.util.List} object. - * @return a {@link java.lang.String} object. - */ - private String getUserInput_GetDeckName(List nameList) { - Object o = JOptionPane.showInputDialog(null, "", "Deck Name", JOptionPane.OK_CANCEL_OPTION); - - if (o == null) return ""; - - String deckName = cleanString(o.toString()); - - if (nameList.contains(deckName) || deckName.equals("")) { - JOptionPane.showMessageDialog(null, "Please pick another deck name, a deck currently has that name."); - return getUserInput_GetDeckName(nameList); - } - - return deckName; - }//getUserInput_GetDeckName() - - - //if user cancels, it will return "" - /** - *

getUserInput_OpenDeck.

- * - * @param deckNameList a {@link java.util.List} object. - * @return a {@link java.lang.String} object. - */ - private String getUserInput_OpenDeck(List deckNameList) { - List choices = deckNameList; - if (choices.size() == 0) { - JOptionPane.showMessageDialog(null, "No decks found", "Open Deck", JOptionPane.PLAIN_MESSAGE); - return ""; - } - - //Object o = JOptionPane.showInputDialog(null, "Deck Name", "Open Deck", JOptionPane.OK_CANCEL_OPTION, null, - // choices.toArray(), choices.toArray()[0]); - Object o = GuiUtils.getChoiceOptional("Select Deck", choices.toArray()); - - if (o == null) return ""; - - return o.toString(); - }//getUserInput_OpenDeck() - - //used by Gui_Quest_DeckEditor - /** - *

close.

- */ - public void close() { - exitCommand.execute(); - } - - //used by Gui_Quest_DeckEditor - /** - *

getDeckName.

- * - * @return a {@link java.lang.String} object. - */ - public String getDeckName() { - return currentDeck.getName(); - } - - //used by Gui_Quest_DeckEditor - /** - *

getGameType.

- * - * @return a {@link java.lang.String} object. - */ - public String getGameType() { - return currentDeck.getDeckType(); - } - - - //returns CardList of Card objects, - //argument ArrayList holds String card names - /** - *

covertToCardList.

- * - * @param list a {@link java.util.List} object. - * @return a {@link forge.CardList} object. - */ - public static CardList covertToCardList(List list) { - CardList c = new CardList(); - Card card; - for (String aList : list) { - - card = AllZone.getCardFactory().getCard(aList, null); - c.add(card); - } - - return c; - } -} diff --git a/src/forge/Gui_WinLose.java b/src/forge/Gui_WinLose.java deleted file mode 100644 index 98a59b50e68..00000000000 --- a/src/forge/Gui_WinLose.java +++ /dev/null @@ -1,554 +0,0 @@ -package forge; - - -import forge.error.ErrorViewer; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; -import forge.properties.NewConstants.LANG.Gui_WinLose.WINLOSE_TEXT; -import forge.quest.data.QuestMatchState; -import forge.quest.data.QuestPreferences; -import forge.quest.gui.QuestFrame; -import net.miginfocom.swing.MigLayout; - -import javax.swing.*; -import javax.swing.border.Border; -import javax.swing.border.TitledBorder; -import java.awt.Color; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.WindowEvent; -import java.io.File; - - -/** - *

Gui_WinLose class.

- * - * @author Forge - * @version $Id: $ - */ -public class Gui_WinLose extends JFrame implements NewConstants { - /** Constant serialVersionUID=-5800412940994975483L */ - private static final long serialVersionUID = -5800412940994975483L; - - //private CardList humanList; - //private CardList computerList; - - //private int humanLife; - //private int computerLife; - - //private boolean fantasyQuest = false; - - private JLabel titleLabel = new JLabel(); - private JButton continueButton = new JButton(); - private JButton restartButton = new JButton(); - private JButton quitButton = new JButton(); - private JLabel statsLabel = new JLabel(); - private JPanel jPanel2 = new JPanel(); - @SuppressWarnings("unused") - // titledBorder1 - private TitledBorder titledBorder1; - @SuppressWarnings("unused") - // border1 - private Border border1; - - /** - *

Constructor for Gui_WinLose.

- * - * @param human a {@link forge.CardList} object. - * @param computer a {@link forge.CardList} object. - * @param hLife a int. - * @param cLife a int. - */ - public Gui_WinLose(CardList human, CardList computer, int hLife, int cLife) { - /* - fantasyQuest = true; - - humanList = human; - computerList = computer; - - humanLife = hLife; - computerLife= cLife; - */ - try { - jbInit(); - } catch (Exception ex) { - ErrorViewer.showError(ex); - } - - setup(); - - Dimension screen = this.getToolkit().getScreenSize(); - setBounds(screen.width / 3, 100, //position - 215, 370); //size - setVisible(true); - } - - /** - *

Constructor for Gui_WinLose.

- */ - public Gui_WinLose() { - /* - fantasyQuest = false; - - humanList = new CardList(); - computerList = new CardList(); - - humanLife = 20; - computerLife= 20; - */ - - try { - jbInit(); - } catch (Exception ex) { - ErrorViewer.showError(ex); - } - - setup(); - - Dimension screen = this.getToolkit().getScreenSize(); - setBounds(screen.width / 3, 100, //position - 215, 370); //size - setVisible(true); - } - - /** - *

setup.

- */ - private void setup() { - AllZone.getGameInfo().clearColorChanges(); - QuestMatchState winLose = Constant.Runtime.matchState; - Phase.setGameBegins(0); - //3 is the match length, 3 is the number of games - //disable buttons if match is up, or human player won 2 or lost 2 games already - if ((winLose.countWinLose() == 3) || (winLose.getWin() == 2) || (winLose.getLose() == 2)) { -// editDeckButton.setEnabled(false); - continueButton.setEnabled(false); - quitButton.grabFocus(); - } - - if (winLose.getWin() == 2) - restartButton.setEnabled(false); - - //show Wins and Loses - statsLabel.setText(ForgeProps.getLocalized(WINLOSE_TEXT.WON) + winLose.getWin() + ForgeProps.getLocalized(WINLOSE_TEXT.LOST) + winLose.getLose()); - - //show "You Won" or "You Lost" - if (winLose.didWinRecently()) { - titleLabel.setText(ForgeProps.getLocalized(WINLOSE_TEXT.WIN)); - - int game = 0; - if (winLose.getWinTurns()[0] != 0) - game = 1; - int turn = AllZone.getPhase().getTurn(); - if (AllZone.getGameInfo().isComputerStartedThisGame()) - turn--; - - if (turn < 1) - turn = 1; - - winLose.setWinTurn(game, turn); - winLose.setMulliganedToZero(game, AllZone.getGameInfo().getHumanMulliganedToZero()); - - //winLose.setWinTurn(winLose.countWinLose()-1, AllZone.getPhase().getTurn()); - - //System.out.println("CountwinLose:" + winLose.countWinLose()); - //System.out.println("You won by turn: " + AllZone.getPhase().getTurn()); - } else { - titleLabel.setText(ForgeProps.getLocalized(WINLOSE_TEXT.LOSE)); - //System.out.println("You lost by turn: " + AllZone.getPhase().getTurn()); - } - }//setup(); - - /** - *

jbInit.

- * - * @throws java.lang.Exception if any. - */ - private void jbInit() throws Exception { - titledBorder1 = new TitledBorder(""); - border1 = BorderFactory.createEtchedBorder(Color.white, new Color(148, 145, 140)); - titleLabel.setFont(new java.awt.Font("Dialog", 0, 26)); - titleLabel.setHorizontalAlignment(SwingConstants.CENTER); - titleLabel.setText(ForgeProps.getLocalized(WINLOSE_TEXT.WIN)); - this.getContentPane().setLayout(new MigLayout("fill")); - continueButton.setText(ForgeProps.getLocalized(WINLOSE_TEXT.CONTINUE)); - continueButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - continueButton_actionPerformed(e); - } - }); - restartButton.setText(ForgeProps.getLocalized(WINLOSE_TEXT.RESTART)); - restartButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - restartButton_actionPerformed(e); - } - }); - quitButton.setText(ForgeProps.getLocalized(WINLOSE_TEXT.QUIT)); - quitButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - quitButton_actionPerformed(e); - } - }); - statsLabel.setFont(new java.awt.Font("Dialog", 0, 16)); - statsLabel.setHorizontalAlignment(SwingConstants.CENTER); - jPanel2.setBorder(BorderFactory.createLineBorder(Color.black)); - jPanel2.setLayout(new MigLayout("align center")); - this.addWindowListener(new java.awt.event.WindowAdapter() { - @Override - public void windowClosing(WindowEvent e) { - this_windowClosing(e); - } - }); - this.getContentPane().add(titleLabel, "align center, grow, wrap"); - this.getContentPane().add(statsLabel, "align center, grow, wrap"); - this.getContentPane().add(jPanel2, "grow"); - jPanel2.add(continueButton, "sg buttons, w 80%, h 20%, wrap"); - jPanel2.add(quitButton, "sg buttons, wrap"); - jPanel2.add(restartButton, "sg buttons"); - - } - - /** - *

editDeckButton_actionPerformed.

- * - * @param e a {@link java.awt.event.ActionEvent} object. - */ - void editDeckButton_actionPerformed(ActionEvent e) { - Command exit = new Command() { - private static final long serialVersionUID = 4735992294414389187L; - - public void execute() { - new Gui_WinLose(); - } - }; - Gui_DeckEditor editor = new Gui_DeckEditor(); - - editor.show(exit); - - dispose(); - }//editDeckButton_actionPerformed() - - /** - *

continueButton_actionPerformed.

- * - * @param e a {@link java.awt.event.ActionEvent} object. - */ - void continueButton_actionPerformed(ActionEvent e) { - //open up "Game" screen - //AllZone.getComputerPlay().reset();//sometimes computer has creature in play in the 2nd game of the match - - if (!Constant.Quest.fantasyQuest[0]) - AllZone.getGameAction().newGame(Constant.Runtime.HumanDeck[0], Constant.Runtime.ComputerDeck[0]); - else { - int extraLife = 0; - if (AllZone.getQuestAssignment() != null) { - forge.quest.data.QuestUtil.setupQuest(AllZone.getQuestAssignment()); - if (AllZone.getQuestData().getInventory().hasItem("Zeppelin")) - extraLife = 3; - } - //AllZone.getGameAction().newGame(Constant.Runtime.HumanDeck[0], Constant.Runtime.ComputerDeck[0], humanList, computerList, humanLife, computerLife); - CardList humanList = forge.quest.data.QuestUtil.getHumanPlantAndPet(AllZone.getQuestData(), AllZone.getQuestAssignment()); - CardList computerList = new CardList(); - - - int humanLife = AllZone.getQuestData().getLife() + extraLife; - int computerLife = 20; - if (AllZone.getQuestAssignment() != null) - computerLife = AllZone.getQuestAssignment().getComputerLife(); - - AllZone.getGameAction().newGame(Constant.Runtime.HumanDeck[0], Constant.Runtime.ComputerDeck[0], humanList, computerList, humanLife, computerLife, AllZone.getQuestAssignment()); - } - AllZone.getDisplay().setVisible(true); - - dispose(); - } - - /** - *

restartButton_actionPerformed.

- * - * @param e a {@link java.awt.event.ActionEvent} object. - */ - void restartButton_actionPerformed(ActionEvent e) { - Constant.Runtime.matchState.reset(); - - if (!Constant.Quest.fantasyQuest[0]) - AllZone.getGameAction().newGame(Constant.Runtime.HumanDeck[0], Constant.Runtime.ComputerDeck[0]); - else { - int extraLife = 0; - //AllZone.getGameAction().newGame(Constant.Runtime.HumanDeck[0], Constant.Runtime.ComputerDeck[0], humanList, computerList, humanLife, computerLife); - if (AllZone.getQuestAssignment() != null) { - forge.quest.data.QuestUtil.setupQuest(AllZone.getQuestAssignment()); - if (AllZone.getQuestData().getInventory().hasItem("Zeppelin")) - extraLife = 3; - } - - CardList humanList = forge.quest.data.QuestUtil.getHumanPlantAndPet(AllZone.getQuestData(), AllZone.getQuestAssignment()); - //CardList computerList = QuestUtil.getComputerCreatures(AllZone.getQuestData(), AllZone.getQuestAssignment()); - CardList computerList = new CardList(); - - int humanLife = AllZone.getQuestData().getLife() + extraLife; - int computerLife = 20; - - if (AllZone.getQuestAssignment() != null) - computerLife = AllZone.getQuestAssignment().getComputerLife(); - - AllZone.getGameAction().newGame(Constant.Runtime.HumanDeck[0], Constant.Runtime.ComputerDeck[0], humanList, computerList, humanLife, computerLife, AllZone.getQuestAssignment()); - } - AllZone.getDisplay().setVisible(true); - - dispose(); - } - - /** - *

getWinText.

- * - * @param creds a long. - * @param winLose a {@link forge.quest.data.QuestMatchState} object. - * @param q a {@link forge.quest.data.QuestData} object. - * @return a {@link java.lang.String} object. - */ - private String getWinText(long creds, QuestMatchState winLose, forge.quest.data.QuestData q) { - // TODO use q.qdPrefs to write bonus credits in prefs file - StringBuilder sb = new StringBuilder(); - String[] wins = winLose.getWinMethods(); - - sb.append(""); - - - for (String s : wins) { - if (s != null) { - sb.append("Alternate win condition: "); - sb.append(""); - sb.append(s); - sb.append(""); - sb.append("! Bonus: +"); - - if (s.equals("Poison Counters")) - sb.append(QuestPreferences.getMatchRewardPoisonWinBonus()); - else if (s.equals("Milled")) - sb.append(QuestPreferences.getMatchRewardMilledWinBonus()); - else if (s.equals("Battle of Wits") || - s.equals("Felidar Sovereign") || s.equals("Helix Pinnacle") || s.equals("Epic Struggle") || - s.equals("Door to Nothingness") || s.equals("Barren Glory") || s.equals("Near-Death Experience") || - s.equals("Mortal Combat") || s.equals("Test of Endurance")) { - - sb.append(QuestPreferences.getMatchRewardAltWinBonus()); - } - - sb.append(" credits.
"); - } - } - - int[] winTurns = winLose.getWinTurns(); - - for (int i : winTurns) { - System.out.println("Quest, won by turn:" + i); - - if (i != 0) { - int turnCredits = 0; - - if (i == 1) { - sb.append("Won in one turn!"); - turnCredits += QuestPreferences.getMatchRewardWinFirst(); - } else if (i <= 5) { - sb.append("Won by turn 5!"); - turnCredits += QuestPreferences.getMatchRewardWinByFifth(); - } else if (i <= 10) { - sb.append("Won by turn 10!"); - turnCredits += QuestPreferences.getMatchRewardWinByTen(); - } else if (i <= 15) { - sb.append("Won by turn 15!"); - turnCredits += QuestPreferences.getMatchRewardWinByFifteen(); - } - if (turnCredits > 0) - sb.append(" Bonus: +").append(turnCredits).append(" credits.
"); - } - } - - boolean[] mulliganedToZero = winLose.getMulliganedToZero(); - - for (boolean b : mulliganedToZero) { - if (b) { - sb.append("Mulliganed to zero and still won! Bonus: +"); - sb.append(QuestPreferences.getMatchMullToZero()).append(" credits.
"); - } - } - - if (winLose.getLose() == 0) - sb.append("You have not lost once! Bonus: +"); - sb.append(QuestPreferences.getMatchRewardNoLosses()).append(" credits.
"); - - if (q.getInventory().getItemLevel("Estates") == 1) - sb.append("Estates bonus: 10%.
"); - else if (q.getInventory().getItemLevel("Estates") == 2) - sb.append("Estates bonus: 15%.
"); - else if (q.getInventory().getItemLevel("Estates") == 3) - sb.append("Estates bonus: 20%.
"); - - sb.append("You have earned " + creds + " credits in total."); - - sb.append(""); - return sb.toString(); - } - - /** - *

getCardIcon.

- * - * @param fileName a {@link java.lang.String} object. - * @return a {@link javax.swing.ImageIcon} object. - */ - private ImageIcon getCardIcon(String fileName) { - File base = ForgeProps.getFile(IMAGE_BASE); - File file = new File(base, fileName); - ImageIcon icon = new ImageIcon(file.toString()); - return icon; - } - - /** - *

getIcon.

- * - * @param fileName a {@link java.lang.String} object. - * @return a {@link javax.swing.ImageIcon} object. - */ - private ImageIcon getIcon(String fileName) { - File base = ForgeProps.getFile(IMAGE_ICON); - File file = new File(base, fileName); - ImageIcon icon = new ImageIcon(file.toString()); - return icon; - } - - /** - *

quitButton_actionPerformed.

- * - * @param e a {@link java.awt.event.ActionEvent} object. - */ - void quitButton_actionPerformed(ActionEvent e) { - //are we on a quest? - if (AllZone.getQuestData() == null) { - new Gui_NewGame(); - } else { //Quest - QuestMatchState matchState = Constant.Runtime.matchState; - forge.quest.data.QuestData quest = AllZone.getQuestData(); - - boolean wonMatch = false; - if (matchState.getWin() == 2) { - quest.addWin(); - wonMatch = true; - } else quest.addLost(); - - //System.out.println("QuestData cardpoolsize:" + AllZone.getQuestData().getCardpool().size()); - if (AllZone.getQuestData().getShopList() != null) - AllZone.getQuestData().clearShopList(); - - if (AllZone.getQuestData().getAvailableQuests() != null) - AllZone.getQuestData().clearAvailableQuests(); - - if (quest.shouldAddCards(wonMatch)) { - quest.addCards(); - String fileName = "BookIcon.png"; - ImageIcon icon = getIcon(fileName); - - StringBuilder sb = new StringBuilder(); - sb.append("You have won the following new cards:\n"); - for (int i = 0; i < quest.getAddedCards().size(); i++) - sb.append(quest.getAddedCards().get(i) + "\n"); - - JOptionPane.showMessageDialog(null, sb.toString(), "", JOptionPane.INFORMATION_MESSAGE, icon); - } - - if (wonMatch) { - long creds = quest.getCreditsToAdd(matchState); - String s = getWinText(creds, matchState, quest); - - String fileName = "GoldIcon.png"; - ImageIcon icon = getIcon(fileName); - - JOptionPane.showMessageDialog(null, s, "", JOptionPane.INFORMATION_MESSAGE, icon); - int wins = quest.getWin(); - if (wins > 0 && wins % 80 == 0) // at every 80 wins, give 10 random rares - { - quest.addRandomRare(10); - fileName = "BoxIcon.png"; - icon = getIcon(fileName); - JOptionPane.showMessageDialog(null, "You just won 10 random rares!", "", JOptionPane.INFORMATION_MESSAGE, icon); - } - - if (AllZone.getQuestAssignment() != null) { - AllZone.getQuestData().addQuestsPlayed(); - Quest_Assignment qa = AllZone.getQuestAssignment(); - - StringBuilder sb = new StringBuilder(); - sb.append("Quest Completed - \r\n"); - - if (qa.getCardRewardList() != null) { - sb.append("You won the following cards:\r\n\r\n"); - for (String cardName : qa.getCardRewardList()) { - sb.append(cardName); - sb.append("\r\n"); - - AllZone.getQuestData().addCard(cardName); - } - AllZone.getQuestData().addToNewList(qa.getCardRewardList()); - sb.append("\r\n"); - } - sb.append("Quest Bounty: "); - sb.append(qa.getCreditsReward()); - - AllZone.getQuestData().addCredits(qa.getCreditsReward()); - - fileName = "BoxIcon.png"; - icon = getIcon(fileName); - JOptionPane.showMessageDialog(null, sb.toString(), "Quest Rewards for " + qa.getName(), JOptionPane.INFORMATION_MESSAGE, icon); - }/* - else if(quest.getDifficultyIndex() == 4) { - Card c = AllZone.getCardFactory().getCard(quest.addRandomRare(), AllZone.getHumanPlayer()); - c.setCurSetCode(c.getMostRecentSet()); - fileName = CardUtil.buildFilename(c) +".jpg"; - icon = getCardIcon(fileName); - - JOptionPane.showMessageDialog(null, "", "You have won a random rare for winning against a very hard deck.", JOptionPane.INFORMATION_MESSAGE, icon); - }*/ - - } else { - quest.subtractCredits(15); - String fileName = "HeartIcon.png"; - ImageIcon icon = getIcon(fileName); - - JOptionPane.showMessageDialog(null, "You lose! You have lost 15 credits.", "Awwww", JOptionPane.INFORMATION_MESSAGE, icon); - } - - if (quest.shouldAddAdditionalCards(wonMatch)) { - Card c = AllZone.getCardFactory().getCard(quest.addRandomRare(), AllZone.getHumanPlayer()); - c.setCurSetCode(c.getMostRecentSet()); - String fileName = CardUtil.buildFilename(c) + ".jpg"; - ImageIcon icon = getCardIcon(fileName); - - JOptionPane.showMessageDialog(null, "", "You have won a random rare.", JOptionPane.INFORMATION_MESSAGE, icon); - } - - matchState.reset(); - - AllZone.setQuestAssignment(null); - - quest.saveData(); - - new QuestFrame(); - }//else - on quest - - dispose(); - - //clear Image caches, so the program doesn't get slower and slower - //not needed with soft values - will shrink as needed -// ImageUtil.rotatedCache.clear(); -// ImageCache.cache.clear(); - } - - /** - *

this_windowClosing.

- * - * @param e a {@link java.awt.event.WindowEvent} object. - */ - void this_windowClosing(WindowEvent e) { - quitButton_actionPerformed(null); - } -} diff --git a/src/forge/HandSizeOp.java b/src/forge/HandSizeOp.java deleted file mode 100644 index b84fa29fd4f..00000000000 --- a/src/forge/HandSizeOp.java +++ /dev/null @@ -1,35 +0,0 @@ -package forge; - -/** - *

HandSizeOp class.

- * - * @author Forge - * @version $Id: $ - */ -public class HandSizeOp { - public String Mode; - public int hsTimeStamp; - public int Amount; - - /** - *

Constructor for HandSizeOp.

- * - * @param M a {@link java.lang.String} object. - * @param A a int. - * @param TS a int. - */ - public HandSizeOp(String M, int A, int TS) { - Mode = M; - Amount = A; - hsTimeStamp = TS; - } - - /** - *

toString.

- * - * @return a {@link java.lang.String} object. - */ - public String toString() { - return "Mode(" + Mode + ") Amount(" + Amount + ") Timestamp(" + hsTimeStamp + ")"; - } -} diff --git a/src/forge/HumanPlayer.java b/src/forge/HumanPlayer.java deleted file mode 100644 index 77354d0cc45..00000000000 --- a/src/forge/HumanPlayer.java +++ /dev/null @@ -1,200 +0,0 @@ -package forge; - -import forge.card.spellability.SpellAbility; -import forge.gui.GuiUtils; -import forge.gui.input.Input; - - -/** - *

HumanPlayer class.

- * - * @author Forge - * @version $Id: $ - */ -public class HumanPlayer extends Player { - - /** - *

Constructor for HumanPlayer.

- * - * @param myName a {@link java.lang.String} object. - */ - public HumanPlayer(String myName) { - this(myName, 20, 0); - } - - /** - *

Constructor for HumanPlayer.

- * - * @param myName a {@link java.lang.String} object. - * @param myLife a int. - * @param myPoisonCounters a int. - */ - public HumanPlayer(String myName, int myLife, int myPoisonCounters) { - super(myName, myLife, myPoisonCounters); - } - - /** - *

getOpponent.

- * - * @return a {@link forge.Player} object. - */ - public Player getOpponent() { - return AllZone.getComputerPlayer(); - } - - //////////////// - /// - /// Methods to ease transition to Abstract Player class - /// - /////////////// - - /** - *

isHuman.

- * - * @return a boolean. - */ - public boolean isHuman() { - return true; - } - - /** - *

isComputer.

- * - * @return a boolean. - */ - public boolean isComputer() { - return false; - } - - /** {@inheritDoc} */ - public boolean isPlayer(Player p1) { - return p1.getName().equals(this.name); - } - - /////////////// - /// - /// End transition methods - /// - /////////////// - - /** {@inheritDoc} */ - public CardList mayDrawCards(int n) { - String[] choices = {"Yes", "No"}; - Object choice = GuiUtils.getChoice("Draw " + n + " cards?", choices); - if (choice.equals("Yes")) - return drawCards(n); - else return new CardList(); - } - - /** {@inheritDoc} */ - public CardList mayDrawCard() { - return mayDrawCards(1); - } - - /** - *

dredge.

- * - * @return a boolean. - */ - public boolean dredge() { - boolean dredged = false; - String choices[] = {"Yes", "No"}; - Object o = GuiUtils.getChoice("Do you want to dredge?", choices); - if (o.equals("Yes")) { - Card c = (Card) GuiUtils.getChoice("Select card to dredge", getDredge().toArray()); - //rule 702.49a - if (getDredgeNumber(c) <= AllZone.getHumanLibrary().size()) { - - //might have to make this more sophisticated - //dredge library, put card in hand - AllZone.getGameAction().moveToHand(c); - - for (int i = 0; i < getDredgeNumber(c); i++) { - Card c2 = AllZone.getHumanLibrary().get(0); - AllZone.getGameAction().moveToGraveyard(c2); - } - dredged = true; - } else { - dredged = false; - } - } - return dredged; - } - - /** {@inheritDoc} */ - public CardList discard(final int num, final SpellAbility sa, boolean duringResolution) { - AllZone.getInputControl().setInput(PlayerUtil.input_discard(num, sa), duringResolution); - - // why is CardList returned? - return new CardList(); - } - - /** {@inheritDoc} */ - public void discardUnless(int num, String uType, SpellAbility sa) { - AllZone.getInputControl().setInput(PlayerUtil.input_discardNumUnless(num, uType, sa)); - } - - protected void discard_Chains_of_Mephistopheles() { - AllZone.getInputControl().setInput(PlayerUtil.input_chainsDiscard(), true); - } - - /** {@inheritDoc} */ - public void handToLibrary(final int numToLibrary, String libPos) { - if (libPos.equals("Top") || libPos.equals("Bottom")) libPos = libPos.toLowerCase(); - else { - String s = "card"; - if (numToLibrary > 1) s += "s"; - - Object o = GuiUtils.getChoice("Do you want to put the " + s - + " on the top or bottom of your library?", new Object[]{"top", "bottom"}); - libPos = o.toString(); - } - AllZone.getInputControl().setInput(PlayerUtil.input_putFromHandToLibrary(libPos, numToLibrary)); - } - - /** {@inheritDoc} */ - protected void doScry(final CardList topN, final int N) { - int num = N; - for (int i = 0; i < num; i++) { - Object o = GuiUtils.getChoiceOptional("Put on bottom of library.", topN.toArray()); - if (o != null) { - Card c = (Card) o; - topN.remove(c); - AllZone.getGameAction().moveToBottomOfLibrary(c); - } else // no card chosen for the bottom - break; - } - num = topN.size(); - for (int i = 0; i < num; i++) { - Object o; - o = GuiUtils.getChoice("Put on top of library.", topN.toArray()); - if (o != null) { - Card c = (Card) o; - topN.remove(c); - AllZone.getGameAction().moveToLibrary(c); - } - // no else - a card must have been chosen - } - } - - /** {@inheritDoc} */ - public void sacrificePermanent(String prompt, CardList choices) { - Input in = PlayerUtil.input_sacrificePermanent(choices, prompt); - AllZone.getInputControl().setInput(in); - } - - /** {@inheritDoc} */ - protected void clashMoveToTopOrBottom(Card c) { - String choice = ""; - String choices[] = {"top", "bottom"}; - AllZone.getDisplay().setCard(c); - choice = (String) GuiUtils.getChoice(c.getName() + " - Top or bottom of Library", choices); - - if (choice.equals("bottom")) { - AllZone.getGameAction().moveToBottomOfLibrary(c); - } else { - AllZone.getGameAction().moveToLibrary(c); - } - } - -}//end HumanPlayer class diff --git a/src/forge/ImageCache.java b/src/forge/ImageCache.java deleted file mode 100644 index e4df85c039e..00000000000 --- a/src/forge/ImageCache.java +++ /dev/null @@ -1,375 +0,0 @@ -package forge; - - -import arcane.ui.util.ImageUtil; -import com.google.common.base.Function; -import com.google.common.collect.ComputationException; -import com.google.common.collect.MapMaker; -import com.mortennobel.imagescaling.ResampleOp; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - -import java.awt.*; -import java.awt.geom.AffineTransform; -import java.awt.image.BufferedImage; -import java.io.File; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import static java.lang.Double.parseDouble; -import static java.lang.Math.min; - - -/** - * This class stores ALL card images in a cache with soft values. this means that the images may be collected when - * they are not needed any more, but will be kept as long as possible. - *

- * The keys are the following: - *

    - *
  • Keys start with the file name, extension is skipped
  • - *
  • The key without suffix belongs to the unmodified image from the file
  • - *
  • If the key belongs to a token, "#Token" is appended
  • - *
  • If the key belongs to the unrotated image, "#Normal" is appended
  • - *
  • If the key belongs to the rotated image, "#Tapped" is appended
  • - *
  • If the key belongs to the large preview image, "#scale" is appended, where scale is a double - * precision floating point number
  • - *
- * - * @author Forge - * @version $Id: $ - */ -public class ImageCache implements NewConstants { - /** Constant imageCache */ - private static final Map imageCache; - /** Constant FULL_SIZE */ - private static final Pattern FULL_SIZE = Pattern.compile("(.*)#(\\d+.\\d+)"); - /** Constant TOKEN="#Token" */ - /** Constant NORMAL="#Normal" */ - /** Constant TAPPED="#Tapped" */ - /** Constant NORMAL="#Normal" */ - /** Constant TAPPED="#Tapped" */ - private static final String TOKEN = "#Token", NORMAL = "#Normal", TAPPED = "#Tapped"; - - /** Constant scaleLargerThanOriginal=true */ - public static boolean scaleLargerThanOriginal = true; - - static { - imageCache = new MapMaker().softValues().makeComputingMap(new Function() { - public BufferedImage apply(String key) { - try { - //DEBUG - /*System.out.printf("Currently %d %s in the cache%n", imageCache.size(), - imageCache.size() == 1? "image":"images");*/ - //DEBUG - //System.out.printf("New Image for key: %s%n", key); - if (key.endsWith(NORMAL)) { - //normal - key = key.substring(0, key.length() - NORMAL.length()); - return getNormalSizeImage(imageCache.get(key)); - } else if (key.endsWith(TAPPED)) { - //tapped - key = key.substring(0, key.length() - TAPPED.length()); - return getTappedSizeImage(imageCache.get(key)); - } - Matcher m = FULL_SIZE.matcher(key); - - if (m.matches()) { - //full size - key = m.group(1); - return getFullSizeImage(imageCache.get(key), parseDouble(m.group(2))); - } else { - //original - File path; - if (key.endsWith(TOKEN)) { - key = key.substring(0, key.length() - TOKEN.length()); - path = ForgeProps.getFile(IMAGE_TOKEN); - } else path = ForgeProps.getFile(IMAGE_BASE); - - File file = null; - file = new File(path, key + ".jpg"); - if (!file.exists()) { - //DEBUG - //System.out.println("File not found, no image created: " + file); - return null; - } - BufferedImage image = ImageUtil.getImage(file); - return image; - } - } catch (Exception ex) { - //DEBUG - //System.err.println("Exception, no image created"); - if (ex instanceof ComputationException) throw (ComputationException) ex; - else throw new ComputationException(ex); - } - } - }); - } - - /** - * Returns the image appropriate to display the card in a zone - * - * @param card a {@link forge.Card} object. - * @return a {@link java.awt.image.BufferedImage} object. - */ - public static BufferedImage getImage(Card card) { - String key = card.isFaceDown() ? "Morph" : getKey(card); - if (card.isTapped()) key += TAPPED; - else key += NORMAL; - return getImage(key); - } - - /** - * Returns the image appropriate to display the card in the picture panel - * - * @param card a {@link forge.Card} object. - * @param width a int. - * @param height a int. - * @return a {@link java.awt.image.BufferedImage} object. - */ - public static BufferedImage getImage(Card card, int width, int height) { - String key = (card.isFaceDown() && card.getController().isComputer()) ? "Morph" : getKey(card); - BufferedImage original = getImage(key); - if (original == null) return null; - - double scale = min((double) width / original.getWidth(), (double) height / original.getHeight()); - //here would be the place to limit the scaling, scaling option in menu ? - if (scale > 1 && !scaleLargerThanOriginal) scale = 1; - - return getImage(key + "#" + scale); - } - - /** - *

getOriginalImage.

- * - * @param card a {@link forge.Card} object. - * @return a {@link java.awt.image.BufferedImage} object. - */ - public static BufferedImage getOriginalImage(Card card) { - String key = (card.isFaceDown() && card.getController().isComputer()) ? "Morph" : getKey(card); - return getImage(key); - } - - /** - * Returns the Image corresponding to the key - * - * @param key a {@link java.lang.String} object. - * @return a {@link java.awt.image.BufferedImage} object. - */ - private static BufferedImage getImage(String key) { - try { - BufferedImage image = imageCache.get(key); - //if an image is still cached and it was not the expected size, drop it - if (!isExpectedSize(key, image)) { - imageCache.remove(key); - image = imageCache.get(key); - } - return image; - } catch (NullPointerException ex) { - //unfortunately NullOutputException, thrown when apply() returns null, is not public - //NullOutputException is a subclass of NullPointerException - //legitimate, happens when a card has no image - return null; - } catch (ComputationException ex) { - if (ex.getCause() instanceof NullPointerException) return null; - ex.printStackTrace(); - return null; - } - } - - /** - * Returns if the image for the key is the proper size. - * - * @param key a {@link java.lang.String} object. - * @param image a {@link java.awt.image.BufferedImage} object. - * @return a boolean. - */ - private static boolean isExpectedSize(String key, BufferedImage image) { - if (key.endsWith(NORMAL)) { - //normal - return image.getWidth() == Constant.Runtime.width[0] - && image.getHeight() == Constant.Runtime.height[0]; - } else if (key.endsWith(TAPPED)) { - //tapped - return image.getWidth() == Constant.Runtime.height[0] - && image.getHeight() == Constant.Runtime.width[0]; - } else { - //original & full is never wrong - return true; - } - } - - /** - * Returns the map key for a card, without any suffixes for the image size. - * - * @param card a {@link forge.Card} object. - * @return a {@link java.lang.String} object. - */ - private static String getKey(Card card) { -/* String key = GuiDisplayUtil.cleanString(card.getImageName()); - //if(card.isBasicLand() && card.getRandomPicture() != 0) key += card.getRandomPicture(); - File path = null; - String tkn = ""; - if (card.isToken() && !card.isCopiedToken()) - { - path = ForgeProps.getFile(IMAGE_TOKEN); - tkn = TOKEN; - } - else - path = ForgeProps.getFile(IMAGE_BASE); - - File f = null; - if (!card.getCurSetCode().equals("")) - { - String nn = ""; - if (card.getRandomPicture() > 0) - nn = Integer.toString(card.getRandomPicture() + 1); - - StringBuilder sbKey = new StringBuilder(); - - //First try 3 letter set code with MWS filename format - sbKey.append(card.getCurSetCode() + "/"); - sbKey.append(GuiDisplayUtil.cleanStringMWS(card.getName()) + nn + ".full"); - - f = new File(path, sbKey.toString() + ".jpg"); - if (f.exists()) - return sbKey.toString(); - - sbKey = new StringBuilder(); - - //Second, try 2 letter set code with MWS filename format - sbKey.append(SetInfoUtil.getSetCode2_SetCode3(card.getCurSetCode()) + "/"); - sbKey.append(GuiDisplayUtil.cleanStringMWS(card.getName()) + nn + ".full"); - - f = new File(path, sbKey.toString() + ".jpg"); - if (f.exists()) - return sbKey.toString(); - - sbKey = new StringBuilder(); - - //Third, try 3 letter set code with Forge filename format - sbKey.append(card.getCurSetCode() + "/"); - sbKey.append(GuiDisplayUtil.cleanString(card.getName()) + nn); - - f = new File(path, sbKey.toString() + ".jpg"); - if (f.exists()) - return sbKey.toString(); - - //Last, give up with set images, go with the old picture type - f = new File(path, key + nn + ".jpg"); - if (f.exists()) - return key; - - //if still no file, download if option enabled - } - - int n = card.getRandomPicture(); - if (n > 0) - key += n; - - key += tkn; -// key = GuiDisplayUtil.cleanString(key); -*/ - if (card.isToken() && !card.isCopiedToken()) - return GuiDisplayUtil.cleanString(card.getImageName()) + TOKEN; - - return card.getImageFilename(); //key; - } - - /** - * Returns an image scaled to the size given in {@link Constant.Runtime} - * - * @param original a {@link java.awt.image.BufferedImage} object. - * @return a {@link java.awt.image.BufferedImage} object. - */ - private static BufferedImage getNormalSizeImage(BufferedImage original) { - int srcWidth = original.getWidth(); - int srcHeight = original.getHeight(); - int tgtWidth = Constant.Runtime.width[0]; - int tgtHeight = Constant.Runtime.height[0]; - - if (srcWidth == tgtWidth && srcHeight == tgtHeight) return original; - - -// AffineTransform at = new AffineTransform(); -// at.scale((double) tgtWidth / srcWidth, (double) tgtHeight / srcHeight); -//// at.translate(srcHeight, 0); -//// at.rotate(PI / 2); -// double scale = min((double) tgtWidth / srcWidth, (double) tgtHeight / srcHeight); -// -// BufferedImage image = new BufferedImage(tgtWidth, tgtHeight, BufferedImage.TYPE_INT_ARGB); -// Graphics2D g2d = (Graphics2D) image.getGraphics(); -// g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); -// g2d.drawImage(scale < 0.5? ImageUtil.getBlurredImage(original, 6, 1.0f):original, at, null); -// g2d.dispose(); - ResampleOp resampleOp = new ResampleOp(tgtWidth, tgtHeight); //defaults to Lanczos3 - BufferedImage image = resampleOp.filter(original, null); - return image; - } - - /** - * Returns an image scaled to the size given in {@link Constant.Runtime}, but rotated - * - * @param original a {@link java.awt.image.BufferedImage} object. - * @return a {@link java.awt.image.BufferedImage} object. - */ - private static BufferedImage getTappedSizeImage(BufferedImage original) { - /*int srcWidth = original.getWidth(); - int srcHeight = original.getHeight();*/ - int tgtWidth = Constant.Runtime.width[0]; - int tgtHeight = Constant.Runtime.height[0]; - - AffineTransform at = new AffineTransform(); -// at.scale((double) tgtWidth / srcWidth, (double) tgtHeight / srcHeight); - at.translate(tgtHeight, 0); - at.rotate(Math.PI / 2); -// -// double scale = min((double) tgtWidth / srcWidth, (double) tgtHeight / srcHeight); -// -// BufferedImage image = new BufferedImage(tgtHeight, tgtWidth, BufferedImage.TYPE_INT_ARGB); -// Graphics2D g2d = (Graphics2D) image.getGraphics(); -// g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); -// g2d.drawImage(scale < 0.5? ImageUtil.getBlurredImage(original, 6, 1.0f):original, at, null); -// g2d.dispose(); - ResampleOp resampleOp = new ResampleOp(tgtWidth, tgtHeight); //defaults to Lanczos3 - BufferedImage image = resampleOp.filter(original, null); - BufferedImage rotatedImage = new BufferedImage(tgtHeight, tgtWidth, BufferedImage.TYPE_INT_ARGB); - Graphics2D g2d = (Graphics2D) rotatedImage.getGraphics(); - g2d.drawImage(image, at, null); - g2d.dispose(); - return rotatedImage; - } - - /** - * Returns an image scaled to the size appropriate for the card picture panel - * - * @param original a {@link java.awt.image.BufferedImage} object. - * @param scale a double. - * @return a {@link java.awt.image.BufferedImage} object. - */ - private static BufferedImage getFullSizeImage(BufferedImage original, double scale) { - if (scale == 1) return original; - -// AffineTransform at = new AffineTransform(); -// at.scale(scale, scale); -// -// BufferedImage image = new BufferedImage((int) (original.getWidth() * scale), -// (int) (original.getHeight() * scale), BufferedImage.TYPE_INT_ARGB); -// Graphics2D g2d = (Graphics2D) image.getGraphics(); -// g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); -// g2d.drawImage(scale < 0.5? ImageUtil.getBlurredImage(original, 6, 1.0f):original, at, null); -// g2d.dispose(); - ResampleOp resampleOp = new ResampleOp((int) (original.getWidth() * scale), - (int) (original.getHeight() * scale)); //defaults to Lanczos3 - BufferedImage image = resampleOp.filter(original, null); - return image; - } - - - /** - *

clear.

- */ - public static void clear() { - imageCache.clear(); - } -} diff --git a/src/forge/ImagePreviewPanel.java b/src/forge/ImagePreviewPanel.java deleted file mode 100644 index 714f9a1f44f..00000000000 --- a/src/forge/ImagePreviewPanel.java +++ /dev/null @@ -1,114 +0,0 @@ -package forge; - - -import javax.swing.*; -import java.awt.Color; -import java.awt.*; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.io.File; - - -/** - *

ImagePreviewPanel class.

- * - * @author Forge - * @version $Id: $ - */ -public class ImagePreviewPanel extends JPanel implements PropertyChangeListener { - - - /** Constant serialVersionUID=2163809931940286240L */ - private static final long serialVersionUID = 2163809931940286240L; - private int width, height; - private ImageIcon icon; - private Image image; - /** Constant ACCSIZE=155 */ - private static final int ACCSIZE = 155; - private Color bg; - - /** - *

Constructor for ImagePreviewPanel.

- */ - public ImagePreviewPanel() { - setPreferredSize(new Dimension(ACCSIZE, -1)); - bg = getBackground(); - } - - /** {@inheritDoc} */ - public void propertyChange(PropertyChangeEvent e) { - String propertyName = e.getPropertyName(); - - // Make sure we are responding to the right event. - if (propertyName.equals(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY)) { - File selection = (File) e.getNewValue(); - String name; - - if (selection == null) return; - else name = selection.getAbsolutePath(); - - /* - * Make reasonably sure we have an image format that AWT can - * handle so we don't try to draw something silly. - */ - if ((name != null) - && (name.toLowerCase().endsWith(".jpg") || name.toLowerCase().endsWith(".jpeg") - || name.toLowerCase().endsWith(".gif") || name.toLowerCase().endsWith(".png"))) { - icon = new ImageIcon(name); - image = icon.getImage(); - scaleImage(); - repaint(); - } - } - } - - /** - *

scaleImage.

- */ - private void scaleImage() { - width = image.getWidth(this); - height = image.getHeight(this); - double ratio = 1.0; - - /* - * Determine how to scale the image. Since the accessory can expand - * vertically make sure we don't go larger than 150 when scaling - * vertically. - */ - if (width >= height) { - ratio = (double) (ACCSIZE - 5) / width; - width = ACCSIZE - 5; - height = (int) (height * ratio); - } else { - if (getHeight() > 150) { - ratio = (double) (ACCSIZE - 5) / height; - height = ACCSIZE - 5; - width = (int) (width * ratio); - } else { - ratio = (double) getHeight() / height; - height = getHeight(); - width = (int) (width * ratio); - } - } - - image = image.getScaledInstance(width, height, Image.SCALE_DEFAULT); - } - - /** {@inheritDoc} */ - @Override - public void paintComponent(Graphics g) { - g.setColor(bg); - - /* - * If we don't do this, we will end up with garbage from previous - * images if they have larger sizes than the one we are currently - * drawing. Also, it seems that the file list can paint outside - * of its rectangle, and will cause odd behavior if we don't clear - * or fill the rectangle for the accessory before drawing. This might - * be a bug in JFileChooser. - */ - g.fillRect(0, 0, ACCSIZE, getHeight()); - g.drawImage(image, getWidth() / 2 - width / 2 + 5, getHeight() / 2 - height / 2, this); - } - -} diff --git a/src/forge/MagicStack.java b/src/forge/MagicStack.java deleted file mode 100644 index bd1722a0a57..00000000000 --- a/src/forge/MagicStack.java +++ /dev/null @@ -1,1107 +0,0 @@ -package forge; - -import com.esotericsoftware.minlog.Log; -import forge.card.abilityFactory.AbilityFactory; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.mana.ManaCost; -import forge.card.spellability.*; -import forge.gui.GuiUtils; -import forge.gui.input.Input; -import forge.gui.input.Input_PayManaCost_Ability; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Stack; - -/** - *

MagicStack class.

- * - * @author Forge - * @version $Id: $ - */ -public class MagicStack extends MyObservable { - private ArrayList simultaneousStackEntryList = new ArrayList(); - - private Stack stack = new Stack(); - private Stack frozenStack = new Stack(); - - private boolean frozen = false; - private boolean bResolving = false; - private int splitSecondOnStack = 0; - - /** - *

isFrozen.

- * - * @return a boolean. - */ - public boolean isFrozen() { - return frozen; - } - - /** - *

Setter for the field frozen.

- * - * @param frozen a boolean. - */ - public void setFrozen(boolean frozen) { - this.frozen = frozen; - } - - /** - *

reset.

- */ - public void reset() { - stack.clear(); - frozen = false; - splitSecondOnStack = 0; - frozenStack.clear(); - this.updateObservers(); - } - - /** - *

isSplitSecondOnStack.

- * - * @return a boolean. - */ - public boolean isSplitSecondOnStack() { - return splitSecondOnStack > 0; - } - - /** - *

incrementSplitSecond.

- * - * @param sp a {@link forge.card.spellability.SpellAbility} object. - */ - public void incrementSplitSecond(SpellAbility sp) { - if (sp.getSourceCard().hasKeyword("Split second")) - splitSecondOnStack++; - } - - /** - *

decrementSplitSecond.

- * - * @param sp a {@link forge.card.spellability.SpellAbility} object. - */ - public void decrementSplitSecond(SpellAbility sp) { - if (sp.getSourceCard().hasKeyword("Split second")) - splitSecondOnStack--; - - if (splitSecondOnStack < 0) - splitSecondOnStack = 0; - } - - /** - *

freezeStack.

- */ - public void freezeStack() { - frozen = true; - } - - /** - *

addAndUnfreeze.

- * - * @param ability a {@link forge.card.spellability.SpellAbility} object. - */ - public void addAndUnfreeze(SpellAbility ability) { - ability.getRestrictions().abilityActivated(); - if (ability.getRestrictions().getActivationNumberSacrifice() != -1 && - ability.getRestrictions().getNumberTurnActivations() >= ability.getRestrictions().getActivationNumberSacrifice()) { - ability.getSourceCard().addExtrinsicKeyword("At the beginning of the end step, sacrifice CARDNAME."); - } - // triggered abilities should go on the frozen stack - if (!ability.isTrigger()) - frozen = false; - - this.add(ability); - - // if the ability is a spell, but not a copied spell and its not already on the stack zone, move there - if (ability.isSpell()) { - Card source = ability.getSourceCard(); - if (!source.isCopiedSpell() && !AllZone.getZone(source).is(Constant.Zone.Stack)) - AllZone.getGameAction().moveToStack(source); - } - - if (ability.isTrigger()) - unfreezeStack(); - } - - /** - *

unfreezeStack.

- */ - public void unfreezeStack() { - frozen = false; - boolean checkState = !frozenStack.isEmpty(); - while (!frozenStack.isEmpty()) { - SpellAbility sa = frozenStack.pop().getSpellAbility(); - this.add(sa); - } - if (checkState) - AllZone.getGameAction().checkStateEffects(); - } - - /** - *

clearFrozen.

- */ - public void clearFrozen() { - // TODO: frozen triggered abilities and undoable costs have nasty consequences - frozen = false; - frozenStack.clear(); - } - - /** - *

setResolving.

- * - * @param b a boolean. - */ - public void setResolving(boolean b) { - bResolving = b; - if (!bResolving) chooseOrderOfSimultaneousStackEntryAll(); - } - - /** - *

getResolving.

- * - * @return a boolean. - */ - public boolean getResolving() { - return bResolving; - } - - /** - *

add.

- * - * @param sp a {@link forge.card.spellability.SpellAbility} object. - * @param useX a boolean. - */ - public void add(SpellAbility sp, boolean useX) { - if (!useX) - this.add(sp); - else { - - // TODO make working triggered abilities! - if (sp instanceof Ability_Mana || sp instanceof Ability_Triggered) - sp.resolve(); - else { - push(sp); - /*if (sp.getTargetCard() != null) - CardFactoryUtil.checkTargetingEffects(sp, sp.getTargetCard());*/ - } - } - } - - /** - *

getMultiKickerSpellCostChange.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link forge.card.mana.ManaCost} object. - */ - public ManaCost getMultiKickerSpellCostChange(SpellAbility sa) { - int Max = 25; - String[] Numbers = new String[Max]; - for (int no = 0; no < Max; no++) - Numbers[no] = String.valueOf(no); - - ManaCost manaCost = new ManaCost(sa.getManaCost()); - String Mana = manaCost.toString(); - - int MultiKickerPaid = AllZone.getGameAction().CostCutting_GetMultiMickerManaCostPaid; - - String Number_ManaCost = " "; - - if (Mana.toString().length() == 1) - Number_ManaCost = Mana.toString().substring(0, 1); - - else if (Mana.toString().length() == 0) - Number_ManaCost = "0"; // Should Never Occur - - else - Number_ManaCost = Mana.toString().substring(0, 2); - Number_ManaCost = Number_ManaCost.trim(); - - for (int check = 0; check < Max; check++) { - if (Number_ManaCost.equals(Numbers[check])) { - - if (check - MultiKickerPaid < 0) { - MultiKickerPaid = MultiKickerPaid - check; - AllZone.getGameAction().CostCutting_GetMultiMickerManaCostPaid = MultiKickerPaid; - Mana = Mana.replaceFirst(String.valueOf(check), "0"); - } else { - Mana = Mana.replaceFirst(String.valueOf(check), String.valueOf(check - MultiKickerPaid)); - MultiKickerPaid = 0; - AllZone.getGameAction().CostCutting_GetMultiMickerManaCostPaid = MultiKickerPaid; - } - } - Mana = Mana.trim(); - if (Mana.equals("")) - Mana = "0"; - manaCost = new ManaCost(Mana); - } - String Color_cut = AllZone.getGameAction().CostCutting_GetMultiMickerManaCostPaid_Colored; - - for (int Colored_Cut = 0; Colored_Cut < Color_cut.length(); Colored_Cut++) { - if ("WUGRB".contains(Color_cut.substring(Colored_Cut, Colored_Cut + 1))) { - - if (!Mana.equals(Mana.replaceFirst((Color_cut.substring(Colored_Cut, Colored_Cut + 1)), ""))) { - Mana = Mana.replaceFirst(Color_cut.substring(Colored_Cut, Colored_Cut + 1), ""); - AllZone.getGameAction().CostCutting_GetMultiMickerManaCostPaid_Colored = AllZone.getGameAction().CostCutting_GetMultiMickerManaCostPaid_Colored - .replaceFirst(Color_cut.substring(Colored_Cut, Colored_Cut + 1), ""); - Mana = Mana.trim(); - if (Mana.equals("")) - Mana = "0"; - manaCost = new ManaCost(Mana); - } - } - } - - return manaCost; - } - - //TODO - this may be able to use a straight copy of MultiKicker cost change - /** - *

getReplicateSpellCostChange.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link forge.card.mana.ManaCost} object. - */ - public ManaCost getReplicateSpellCostChange(SpellAbility sa) { - ManaCost manaCost = new ManaCost(sa.getManaCost()); - //String Mana = manaCost.toString(); - return manaCost; - } - - /** - *

add.

- * - * @param sp a {@link forge.card.spellability.SpellAbility} object. - */ - public void add(final SpellAbility sp) { - ArrayList chosenTargets = sp.getAllTargetChoices(); - - if (sp instanceof Ability_Mana) { // Mana Abilities go straight through - sp.resolve(); - sp.resetOnceResolved(); - return; - } - - if (frozen) { - SpellAbility_StackInstance si = new SpellAbility_StackInstance(sp); - frozenStack.push(si); - return; - } - - // if activating player slips through the cracks, assign activating - // Player to the controller here - if (null == sp.getActivatingPlayer()) { - sp.setActivatingPlayer(sp.getSourceCard().getController()); - System.out.println(sp.getSourceCard().getName() + " - activatingPlayer not set before adding to stack."); - } - - if (AllZone.getPhase().is(Constant.Phase.Cleanup)) { // If something triggers during Cleanup, need to repeat - AllZone.getPhase().repeatPhase(); - } - - // TODO: triggered abilities need to be fixed - if (!(sp instanceof Ability_Triggered || sp instanceof Ability_Static)) - AllZone.getPhase().setPriority(sp.getActivatingPlayer()); // when something is added we need to setPriority - - if (sp instanceof Ability_Triggered || sp instanceof Ability_Static) - // TODO make working triggered ability - sp.resolve(); - else { - if (sp.isKickerAbility()) { - sp.getSourceCard().setKicked(true); - SpellAbility[] sa = sp.getSourceCard().getSpellAbility(); - int AbilityNumber = 0; - - for (int i = 0; i < sa.length; i++) - if (sa[i] == sp) - AbilityNumber = i; - - sp.getSourceCard().setAbilityUsed(AbilityNumber); - } - if (sp.getSourceCard().isCopiedSpell()) - push(sp); - - else if (!sp.isMultiKicker() && !sp.isReplicate() && !sp.isXCost()) { - push(sp); - } else if (sp.getPayCosts() != null && !sp.isMultiKicker() && !sp.isReplicate()) { - push(sp); - } else if (sp.isXCost()) { - // TODO: convert any X costs to use abCost so it happens earlier - final SpellAbility sa = sp; - final Ability ability = new Ability(sp.getSourceCard(), sa.getXManaCost()) { - public void resolve() { - Card crd = this.getSourceCard(); - crd.addXManaCostPaid(1); - } - }; - - final Command unpaidCommand = new Command() { - private static final long serialVersionUID = -3342222770086269767L; - - public void execute() { - push(sa); - } - }; - - final Command paidCommand = new Command() { - private static final long serialVersionUID = -2224875229611007788L; - - public void execute() { - ability.resolve(); - Card crd = sa.getSourceCard(); - AllZone.getInputControl().setInput(new Input_PayManaCost_Ability("Pay X cost for " + crd.getName() - + " (X=" + crd.getXManaCostPaid() + ")\r\n", - ability.getManaCost(), this, unpaidCommand, true)); - } - }; - - Card crd = sa.getSourceCard(); - if (sp.getSourceCard().getController().isHuman()) { - AllZone.getInputControl().setInput(new Input_PayManaCost_Ability("Pay X cost for " + - sp.getSourceCard().getName() + " (X=" + crd.getXManaCostPaid() + ")\r\n", - ability.getManaCost(), paidCommand, unpaidCommand, true)); - } else // computer - { - int neededDamage = CardFactoryUtil.getNeededXDamage(sa); - - while (ComputerUtil.canPayCost(ability) && neededDamage != sa.getSourceCard().getXManaCostPaid()) { - ComputerUtil.playNoStack(ability); - } - push(sa); - } - } else if (sp.isMultiKicker()) { - // TODO: convert multikicker support in abCost so this doesn't happen here - // both X and multi is not supported yet - - final SpellAbility sa = sp; - final Ability ability = new Ability(sp.getSourceCard(), sp.getMultiKickerManaCost()) { - public void resolve() { - this.getSourceCard().addMultiKickerMagnitude(1); - } - }; - - final Command unpaidCommand = new Command() { - private static final long serialVersionUID = -3342222770086269767L; - - public void execute() { - push(sa); - } - }; - - final Command paidCommand = new Command() { - private static final long serialVersionUID = -6037161763374971106L; - - public void execute() { - ability.resolve(); - ManaCost manaCost = getMultiKickerSpellCostChange(ability); - if (manaCost.isPaid()) { - this.execute(); - } else { - if (AllZone.getGameAction().CostCutting_GetMultiMickerManaCostPaid == 0 - && AllZone.getGameAction().CostCutting_GetMultiMickerManaCostPaid_Colored.equals("")) { - - AllZone.getInputControl().setInput(new Input_PayManaCost_Ability( - "Multikicker for " + sa.getSourceCard() + "\r\n" - + "Times Kicked: " + sa.getSourceCard().getMultiKickerMagnitude() + "\r\n", - manaCost.toString(), this, unpaidCommand)); - } else { - AllZone.getInputControl().setInput(new Input_PayManaCost_Ability("Multikicker for " - + sa.getSourceCard() + "\r\n" + "Mana in Reserve: " - + ((AllZone.getGameAction().CostCutting_GetMultiMickerManaCostPaid != 0) ? - AllZone.getGameAction().CostCutting_GetMultiMickerManaCostPaid : "") - + AllZone.getGameAction().CostCutting_GetMultiMickerManaCostPaid_Colored + "\r\n" - + "Times Kicked: " + sa.getSourceCard().getMultiKickerMagnitude() + "\r\n", - manaCost.toString(), this, unpaidCommand)); - } - } - } - }; - - if (sp.getActivatingPlayer().isHuman()) { - ManaCost manaCost = getMultiKickerSpellCostChange(ability); - - if (manaCost.isPaid()) { - paidCommand.execute(); - } else { - if (AllZone.getGameAction().CostCutting_GetMultiMickerManaCostPaid == 0 - && AllZone.getGameAction().CostCutting_GetMultiMickerManaCostPaid_Colored.equals("")) { - AllZone.getInputControl().setInput(new Input_PayManaCost_Ability("Multikicker for " - + sa.getSourceCard() + "\r\n" + "Times Kicked: " - + sa.getSourceCard().getMultiKickerMagnitude() + "\r\n", - manaCost.toString(), paidCommand, unpaidCommand)); - } else { - AllZone.getInputControl().setInput(new Input_PayManaCost_Ability("Multikicker for " - + sa.getSourceCard() + "\r\n" + "Mana in Reserve: " + - ((AllZone.getGameAction().CostCutting_GetMultiMickerManaCostPaid != 0) ? - AllZone.getGameAction().CostCutting_GetMultiMickerManaCostPaid : "") - + AllZone.getGameAction().CostCutting_GetMultiMickerManaCostPaid_Colored - + "\r\n" + "Times Kicked: " + sa.getSourceCard().getMultiKickerMagnitude() + "\r\n", - manaCost.toString(), paidCommand, unpaidCommand)); - } - } - } else // computer - { - while (ComputerUtil.canPayCost(ability)) - ComputerUtil.playNoStack(ability); - push(sa); - } - } else if (sp.isReplicate()) { - // TODO: convert multikicker/replicate support in abCost so this doesn't happen here - // X and multi and replicate are not supported yet - - final SpellAbility sa = sp; - final Ability ability = new Ability(sp.getSourceCard(), sp.getReplicateManaCost()) { - public void resolve() { - this.getSourceCard().addReplicateMagnitude(1); - } - }; - - final Command unpaidCommand = new Command() { - private static final long serialVersionUID = -3180458633098297855L; - - public void execute() { - push(sa); - for (int i = 0; i < sp.getSourceCard().getReplicateMagnitude(); i++) { - AllZone.getCardFactory().copySpellontoStack(sp.getSourceCard(), sp.getSourceCard(), false); - } - } - }; - - final Command paidCommand = new Command() { - private static final long serialVersionUID = 132624005072267304L; - - public void execute() { - ability.resolve(); - ManaCost manaCost = getReplicateSpellCostChange(ability); - if (manaCost.isPaid()) { - this.execute(); - } else { - /* - if (AllZone.getGameAction().CostCutting_GetMultiMickerManaCostPaid == 0 - && AllZone.getGameAction().CostCutting_GetMultiMickerManaCostPaid_Colored.equals("")) { - - AllZone.getInputControl().setInput(new Input_PayManaCost_Ability( - "Replicate for "+ sa.getSourceCard() + "\r\n" - + "Times Kicked: " + sa.getSourceCard().getMultiKickerMagnitude() + "\r\n", - manaCost.toString(), this, unpaidCommand)); - } - - else {*/ - AllZone.getInputControl().setInput(new Input_PayManaCost_Ability("Replicate for " - + sa.getSourceCard() + "\r\n" - + "Times Replicated: " + sa.getSourceCard().getReplicateMagnitude() + "\r\n", - manaCost.toString(), this, unpaidCommand)); - //} - } - } - }; - - if (sp.getSourceCard().getController().equals( - AllZone.getHumanPlayer())) { - ManaCost manaCost = getMultiKickerSpellCostChange(ability); - - if (manaCost.isPaid()) { - paidCommand.execute(); - } else { - AllZone.getInputControl().setInput(new Input_PayManaCost_Ability("Replicate for " - + sa.getSourceCard() + "\r\n" + - "Times Replicated: " + sa.getSourceCard().getReplicateMagnitude() + "\r\n", - manaCost.toString(), paidCommand, unpaidCommand)); - } - } else // computer - { - while (ComputerUtil.canPayCost(ability)) - ComputerUtil.playNoStack(ability); - push(sa); - } - } - - } - - if (!sp.getSourceCard().isCopiedSpell()) //Copied spells aren't cast per se so triggers shouldn't run for them. - { - //Run SpellAbilityCast triggers - HashMap runParams = new HashMap(); - runParams.put("Cost", sp.getPayCosts()); - runParams.put("Player", sp.getSourceCard().getController()); - runParams.put("Activator", sp.getActivatingPlayer()); - runParams.put("CastSA", sp); - AllZone.getTriggerHandler().runTrigger("SpellAbilityCast", runParams); - - //Run SpellCast triggers - if (sp.isSpell()) { - AllZone.getTriggerHandler().runTrigger("SpellCast", runParams); - } - - //Run AbilityCast triggers - if (sp.isAbility()) { - AllZone.getTriggerHandler().runTrigger("AbilityCast", runParams); - } - - //Run Cycled triggers - if (sp.isCycling()) { - runParams.clear(); - runParams.put("Card", sp.getSourceCard()); - AllZone.getTriggerHandler().runTrigger("Cycled", runParams); - } - - //Run BecomesTarget triggers - runParams.clear(); - runParams.put("SourceSA", sp); - if (chosenTargets.size() > 0) { - for (Target_Choices tc : chosenTargets) { - if (tc != null) { - if (tc.getTargetCards() != null) { - for (Object tgt : tc.getTargets()) { - runParams.put("Target", tgt); - - AllZone.getTriggerHandler().runTrigger("BecomesTarget", runParams); - } - } - } - } - } - //Not sure these clauses are necessary. Consider it a precaution for backwards compatibility for hardcoded cards. - if (sp.getTargetCard() != null) { - runParams.put("Target", sp.getTargetCard()); - - AllZone.getTriggerHandler().runTrigger("BecomesTarget", runParams); - } - if (sp.getTargetList() != null) { - if (sp.getTargetList().size() > 0) { - for (Card ctgt : sp.getTargetList()) { - runParams.put("Target", ctgt); - - AllZone.getTriggerHandler().runTrigger("BecomesTarget", runParams); - } - } - } - if (sp.getTargetPlayer() != null) { - runParams.put("Target", sp.getTargetPlayer()); - - AllZone.getTriggerHandler().runTrigger("BecomesTarget", runParams); - } - } - - if (sp instanceof Spell_Permanent && sp.getSourceCard().getName().equals("Mana Vortex")) { - final SpellAbility counter = new Ability(sp.getSourceCard(), "0") { - @Override - public void resolve() { - Input in = new Input() { - private static final long serialVersionUID = -2042489457719935420L; - - @Override - public void showMessage() { - AllZone.getDisplay().showMessage("Mana Vortex - select a land to sacrifice"); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - AllZone.getStack().pop(); - AllZone.getGameAction().moveToGraveyard(sp.getSourceCard()); - stop(); - } - - @Override - public void selectCard(Card c, PlayerZone zone) { - if (zone.is(Constant.Zone.Battlefield) && c.getController().isHuman() - && c.isLand()) { - AllZone.getGameAction().sacrifice(c); - stop(); - } - } - }; - SpellAbility_StackInstance prev = peekInstance(); - if (prev.isSpell() && prev.getSourceCard().getName().equals("Mana Vortex")) { - if (sp.getSourceCard().getController().isHuman()) { - AllZone.getInputControl().setInput(in); - } else {//Computer - CardList lands = AllZoneUtil.getPlayerLandsInPlay(AllZone.getComputerPlayer()); - if (!lands.isEmpty()) { - AllZone.getComputerPlayer().sacrificePermanent("prompt", lands); - } else { - AllZone.getStack().pop(); - AllZone.getGameAction().moveToGraveyard(sp.getSourceCard()); - } - } - } - - }//resolve() - };//SpellAbility - counter.setStackDescription(sp.getSourceCard().getName() + " - counter Mana Vortex unless you sacrifice a land."); - add(counter); - } - - /* - * Whenever a player casts a spell, counter it if a card with the same name - * is in a graveyard or a nontoken permanent with the same name is on the battlefield. - */ - if (sp.isSpell() && AllZoneUtil.isCardInPlay("Bazaar of Wonders")) { - boolean found = false; - CardList all = AllZoneUtil.getCardsInPlay(); - all = all.filter(AllZoneUtil.nonToken); - CardList graves = AllZoneUtil.getCardsInGraveyard(); - all.addAll(graves); - - for (Card c : all) { - if (sp.getSourceCard().getName().equals(c.getName())) found = true; - } - - if (found) { - CardList bazaars = AllZoneUtil.getCardsInPlay("Bazaar of Wonders"); //should only be 1... - for (final Card bazaar : bazaars) { - final SpellAbility counter = new Ability(bazaar, "0") { - @Override - public void resolve() { - if (AllZone.getStack().size() > 0) AllZone.getStack().pop(); - }//resolve() - };//SpellAbility - counter.setStackDescription(bazaar.getName() + " - counter " + sp.getSourceCard().getName() + "."); - add(counter); - } - } - } - - //Lurking Predators - if (sp.isSpell()) { - Player player = sp.getSourceCard().getController(); - CardList lurkingPredators = AllZoneUtil.getPlayerCardsInPlay(player, "Lurking Predators"); - - for (int i = 0; i < lurkingPredators.size(); i++) { - StringBuilder revealMsg = new StringBuilder(""); - if (lurkingPredators.get(i).getController().isHuman()) { - revealMsg.append("You reveal: "); - if (AllZone.getHumanLibrary().size() == 0) { - revealMsg.append("Nothing!"); - GameActionUtil.showInfoDialg(revealMsg.toString()); - continue; - } - Card revealed = AllZone.getHumanLibrary().get(0); - - revealMsg.append(revealed.getName()); - if (!revealed.isCreature()) { - revealMsg.append("\n\rPut it on the bottom of your library?"); - if (GameActionUtil.showYesNoDialog(lurkingPredators.get(i), revealMsg.toString())) { - AllZone.getGameAction().moveToBottomOfLibrary(revealed); - } else { - AllZone.getGameAction().moveToLibrary(revealed); - } - } else { - GameActionUtil.showInfoDialg(revealMsg.toString()); - AllZone.getGameAction().moveToPlay(revealed); - } - } else { - revealMsg.append("Computer reveals: "); - if (AllZone.getComputerLibrary().size() == 0) { - revealMsg.append("Nothing!"); - GameActionUtil.showInfoDialg(revealMsg.toString()); - continue; - } - Card revealed = AllZone.getComputerLibrary().get(0); - revealMsg.append(revealed.getName()); - if (!revealed.isCreature()) { - GameActionUtil.showInfoDialg(revealMsg.toString()); - if (lurkingPredators.size() > i) { - AllZone.getGameAction().moveToBottomOfLibrary(revealed); - } else { - AllZone.getGameAction().moveToLibrary(revealed); - } - } else { - GameActionUtil.showInfoDialg(revealMsg.toString()); - AllZone.getGameAction().moveToPlay(revealed); - } - - } - } - } - - /*if (sp.getTargetCard() != null) - CardFactoryUtil.checkTargetingEffects(sp, sp.getTargetCard());*/ - - if (simultaneousStackEntryList.size() > 0) - AllZone.getPhase().passPriority(); - } - - /** - *

size.

- * - * @return a int. - */ - public int size() { - return stack.size(); - } - - // Push should only be used by add. - /** - *

push.

- * - * @param sp a {@link forge.card.spellability.SpellAbility} object. - */ - private void push(SpellAbility sp) { - if (null == sp.getActivatingPlayer()) { - sp.setActivatingPlayer(sp.getSourceCard().getController()); - System.out.println(sp.getSourceCard().getName() + " - activatingPlayer not set before adding to stack."); - } - - incrementSplitSecond(sp); - - SpellAbility_StackInstance si = new SpellAbility_StackInstance(sp); - stack.push(si); - - this.updateObservers(); - - if (sp.isSpell() && !sp.getSourceCard().isCopiedSpell()) { - Phase.increaseSpellCount(sp); - - GameActionUtil.executePlayCardEffects(sp); - } - } - - /** - *

resolveStack.

- */ - public void resolveStack() { - // Resolving the Stack - GuiDisplayUtil.updateGUI(); - this.freezeStack(); // freeze the stack while we're in the middle of resolving - setResolving(true); - - SpellAbility sa = AllZone.getStack().pop(); - - AllZone.getPhase().resetPriority(); // ActivePlayer gains priority first after Resolve - Card source = sa.getSourceCard(); - - if (hasFizzled(sa, source)) {//Fizzle - // TODO: Spell fizzles, what's the best way to alert player? - Log.debug(source.getName() + " ability fizzles."); - finishResolving(sa, true); - } else if (sa.getAbilityFactory() != null) { - AbilityFactory.handleRemembering(sa.getAbilityFactory()); - AbilityFactory.resolve(sa, true); - } else { - sa.resolve(); - finishResolving(sa, false); - } - - } - - /** - *

removeCardFromStack.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param fizzle a boolean. - * @since 1.0.15 - */ - public void removeCardFromStack(SpellAbility sa, boolean fizzle) { - Card source = sa.getSourceCard(); - - //do nothing - if (sa.getSourceCard().isCopiedSpell() || sa.isAbility()) { - } - // Handle cards that need to be moved differently - else if (sa.isBuyBackAbility() && !fizzle) { - AllZone.getGameAction().moveToHand(source); - } else if (sa.isFlashBackAbility()) { - AllZone.getGameAction().exile(source); - sa.setFlashBackAbility(false); - } - - // If Spell and still on the Stack then let it goto the graveyard or replace its own movement - else if (!source.isCopiedSpell() && (source.isInstant() || source.isSorcery() || fizzle) && - AllZone.getZone(source).is(Constant.Zone.Stack)) { - if (source.getReplaceMoveToGraveyard().size() == 0) - AllZone.getGameAction().moveToGraveyard(source); - else { - source.replaceMoveToGraveyard(); - } - } - } - - /** - *

finishResolving.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param fizzle a boolean. - * @since 1.0.15 - */ - public void finishResolving(SpellAbility sa, boolean fizzle) { - - //remove card from the stack - removeCardFromStack(sa, fizzle); - - // After SA resolves we have to do a handful of things - setResolving(false); - this.unfreezeStack(); - sa.resetOnceResolved(); - - AllZone.getGameAction().checkStateEffects(); - - AllZone.getPhase().setNeedToNextPhase(false); - - if (AllZone.getPhase().inCombat()) - CombatUtil.showCombat(); - - GuiDisplayUtil.updateGUI(); - - //TODO - this is a huge hack. Why is this necessary? - //hostCard in AF is not the same object that's on the battlefield - //verified by System.identityHashCode(card); - Card tmp = sa.getSourceCard(); - if (tmp.getClones().size() > 0) { - for (Card c : AllZoneUtil.getCardsInPlay()) { - if (c.equals(tmp)) { - c.setClones(tmp.getClones()); - } - } - - } - } - - /** - *

hasFizzled.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param source a {@link forge.Card} object. - * @return a boolean. - */ - public boolean hasFizzled(SpellAbility sa, Card source) { - // By default this has not fizzled - boolean fizzle = false; - - boolean firstTarget = true; - - SpellAbility fizzSA = sa; - - while (true) { - Target tgt = fizzSA.getTarget(); - if (tgt != null && tgt.getMinTargets(source, fizzSA) == 0 && tgt.getNumTargeted() == 0) { - // Don't assume fizzled for minTargets == 0 and nothing is targeted - } else if (firstTarget && (tgt != null || fizzSA.getTargetCard() != null || fizzSA.getTargetPlayer() != null)) { - // If there is at least 1 target, fizzle switches because ALL targets need to be invalid - fizzle = true; - firstTarget = false; - } - - if (tgt != null) { - // With multi-targets, as long as one target is still legal, we'll try to go through as much as possible - ArrayList tgts = tgt.getTargets(); - for (Object o : tgts) { - if (o instanceof Player) { - Player p = (Player) o; - fizzle &= !(p.canTarget(fizzSA)); - } - if (o instanceof Card) { - Card card = (Card) o; - fizzle &= !(CardFactoryUtil.isTargetStillValid(fizzSA, card)); - } - if (o instanceof SpellAbility) { - SpellAbility tgtSA = (SpellAbility) o; - fizzle &= !(Target_Selection.matchSpellAbility(fizzSA, tgtSA, tgt)); - } - } - } else if (fizzSA.getTargetCard() != null) { - // Fizzling will only work for Abilities that use the Target class, - // since the info isn't available otherwise - fizzle &= !CardFactoryUtil.isTargetStillValid(fizzSA, fizzSA.getTargetCard()); - } else if (fizzSA.getTargetPlayer() != null) { - fizzle &= !fizzSA.getTargetPlayer().canTarget(fizzSA); - } - - if (fizzSA.getSubAbility() != null) - fizzSA = fizzSA.getSubAbility(); - else - break; - } - - return fizzle; - } - - /** - *

pop.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility pop() { - SpellAbility sp = stack.pop().getSpellAbility(); - decrementSplitSecond(sp); - this.updateObservers(); - return sp; - } - - // CAREFUL! Peeking while an SAs Targets are being choosen may cause issues - // index = 0 is the top, index = 1 is the next to top, etc... - /** - *

peekInstance.

- * - * @param index a int. - * @return a {@link forge.card.spellability.SpellAbility_StackInstance} object. - */ - public SpellAbility_StackInstance peekInstance(int index) { - return stack.get(index); - } - - /** - *

peekAbility.

- * - * @param index a int. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility peekAbility(int index) { - return stack.get(index).getSpellAbility(); - } - - /** - *

peekInstance.

- * - * @return a {@link forge.card.spellability.SpellAbility_StackInstance} object. - */ - public SpellAbility_StackInstance peekInstance() { - return stack.peek(); - } - - /** - *

peekAbility.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility peekAbility() { - return stack.peek().getSpellAbility(); - } - - /** - *

remove.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public void remove(SpellAbility sa) { - SpellAbility_StackInstance si = getInstanceFromSpellAbility(sa); - if (si == null) - return; - - remove(si); - } - - /** - *

remove.

- * - * @param si a {@link forge.card.spellability.SpellAbility_StackInstance} object. - */ - public void remove(SpellAbility_StackInstance si) { - if (stack.remove(si)) { - decrementSplitSecond(si.getSpellAbility()); - } - frozenStack.remove(si); - this.updateObservers(); - } - - /** - *

getInstanceFromSpellAbility.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link forge.card.spellability.SpellAbility_StackInstance} object. - */ - public SpellAbility_StackInstance getInstanceFromSpellAbility(SpellAbility sa) { - // TODO: Confirm this works! - for (SpellAbility_StackInstance si : stack) { - if (si.getSpellAbility().equals(sa)) - return si; - } - return null; - } - - /** - *

hasSimultaneousStackEntries.

- * - * @return a boolean. - */ - public boolean hasSimultaneousStackEntries() { - return simultaneousStackEntryList.size() > 0; - } - - /** - *

addSimultaneousStackEntry.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public void addSimultaneousStackEntry(SpellAbility sa) { - simultaneousStackEntryList.add(sa); - } - - /** - *

chooseOrderOfSimultaneousStackEntryAll.

- */ - public void chooseOrderOfSimultaneousStackEntryAll() { - chooseOrderOfSimultaneousStackEntry(AllZone.getPhase().getPlayerTurn()); - chooseOrderOfSimultaneousStackEntry(AllZone.getPhase().getPlayerTurn().getOpponent()); - } - - /** - *

chooseOrderOfSimultaneousStackEntry.

- * - * @param activePlayer a {@link forge.Player} object. - */ - public void chooseOrderOfSimultaneousStackEntry(Player activePlayer) { - if (simultaneousStackEntryList.size() == 0) - return; - - ArrayList activePlayerSAs = new ArrayList(); - for (int i = 0; i < simultaneousStackEntryList.size(); i++) { - if (simultaneousStackEntryList.get(i).getActivatingPlayer() == null) { - if (simultaneousStackEntryList.get(i).getSourceCard().getController().equals(activePlayer)) { - activePlayerSAs.add(simultaneousStackEntryList.get(i)); - simultaneousStackEntryList.remove(i); - i--; - } - } else { - if (simultaneousStackEntryList.get(i).getActivatingPlayer().equals(activePlayer)) { - activePlayerSAs.add(simultaneousStackEntryList.get(i)); - simultaneousStackEntryList.remove(i); - i--; - } - } - } - if (activePlayerSAs.size() == 0) - return; - - if (activePlayer.isComputer()) { - for (SpellAbility sa : activePlayerSAs) { - sa.doTrigger(sa.isMandatory()); - ComputerUtil.playStack(sa); - } - } else { - while (activePlayerSAs.size() > 1) { - SpellAbility next = (SpellAbility) GuiUtils.getChoice("Choose which spell or ability to put on the stack next.", activePlayerSAs.toArray()); - activePlayerSAs.remove(next); - - if (next.isTrigger()) { - System.out.println("Stack order: AllZone.getGameAction().playSpellAbility(next)"); - AllZone.getGameAction().playSpellAbility(next); - } else { - System.out.println("Stack order: AllZone.getStack().add(next)"); - add(next); - } - } - - if (activePlayerSAs.get(0).isTrigger()) - AllZone.getGameAction().playSpellAbility(activePlayerSAs.get(0)); - else - add(activePlayerSAs.get(0)); - //AllZone.getGameAction().playSpellAbility(activePlayerSAs.get(0)); - } - } - - public boolean hasStateTrigger(int triggerID) { - for(SpellAbility_StackInstance SI : stack) - { - if(SI.isStateTrigger(triggerID)) - { - return true; - } - } - - return false; - } - -} diff --git a/src/forge/MenuItem_HowToPlay.java b/src/forge/MenuItem_HowToPlay.java deleted file mode 100644 index a002536833a..00000000000 --- a/src/forge/MenuItem_HowToPlay.java +++ /dev/null @@ -1,170 +0,0 @@ -package forge; - - -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - -import javax.swing.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - - -/** - *

MenuItem_HowToPlay class.

- * - * @author Forge - * @version $Id: $ - */ -public class MenuItem_HowToPlay extends JMenuItem implements NewConstants.LANG.HowTo { - /** Constant serialVersionUID=5552000208438248428L */ - private static final long serialVersionUID = 5552000208438248428L; - - /** - *

Constructor for MenuItem_HowToPlay.

- */ - public MenuItem_HowToPlay() { - super(ForgeProps.getLocalized(TITLE)); - - this.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent a) { - String text = ForgeProps.getLocalized(MESSAGE); - - JTextArea area = new JTextArea(text, 25, 40); - area.setWrapStyleWord(true); - area.setLineWrap(true); - area.setEditable(false); - - area.setOpaque(false); - - JOptionPane.showMessageDialog(null, new JScrollPane(area), ForgeProps.getLocalized(TITLE), - JOptionPane.INFORMATION_MESSAGE); - } - }); - }//constructor - - /** - *

getString.

- * - * @return a {@link java.lang.String} object. - */ - @SuppressWarnings("unused") - private String getString() { - String newLine = "\r\n\r\n"; - StringBuffer s = new StringBuffer(); - - s.append("How to Play - (Revised: September 2009.)\r\n\r\n\r\n"); - - s.append("Introduction").append(newLine); - s.append("1. This game is similar to many other trading card games. You start out with 20 life and your goal is to reduce your opponents life to zero by attacking with your creatures. The game will end when your life or the computer's life is reduced to zero. You play \"matches\" against the computer as a set of \"best two out of three\" games.") - .append(newLine); - s.append("2. You use land to pay for spells. You can play one land a turn.").append(newLine); - s.append("3. Each land produces a different magical energy. This magical energy is shortened to one letter on cards.") - .append(newLine); - s.append(" Forests make G\r\n"); - s.append(" Swamps make B\r\n"); - s.append(" Plains make W\r\n"); - s.append(" Islands make U\r\n"); - s.append(" Mountains make R").append(newLine); - s.append("4. Each nonland card has a name and a cost. The cost looks like this \"2GG\" A cost like that would require two Forest lands and two other lands. The number 2 can be paid for by any land. A cost like \"R\", would require a Mountain land.") - .append(newLine); - s.append("5. Creature cards stay in play and can attack on the turn AFTER they are played. A creature's attack and defense is shown like 2/4 meaning that the creature has an attack power of 2 and a defense of 4. If this creature receives 4 damage it is put into the graveyard.") - .append(newLine); - s.append("6. When you attack with your creatures the computer has a chance to block with his creatures. When you attack you \"tap\" your creatures by turning them sideways. Your creatures will untap during your next turn. When you block, only untapped creatures can block. Usually a creature cannot attack and block during the same turn.") - .append(newLine); - s.append("7. Sorcery and Instant cards have an effect on the game. After you play any card it goes on the stack to the left, click OK and the stack will clear. Sorcery cards can only be played during your turn and when the stack is empty. Instant cards can be played at any time and are more versatile.") - .append(newLine); - s.append("8. If a card has a target, you get to choose that target. If the target is a player, click on that player's life points.") - .append(newLine); - s.append("9. When you mulligan, the cards in your hand are shuffled into you deck and you are given 1 less card.\r\n\r\n\r\n"); - - s.append("Legendary Cards").append(newLine); - s.append("Legendary cards are powerful cards that can be either creatures, enchantments, lands, artifacts or planeswalkers. These cards can only exist once in the battlefield, and if another copy of the legendary card is played, all copies of the card are destroyed and sent to the graveyard.\r\n\r\n\r\n"); - - s.append("Planeswalkers").append(newLine); - s.append("There are 6 planeswalkers (Ajani Goldmane; Liliana Vess; Garruk Wildspeaker; Chandra Nalaar; Nicol Bolas; Elspeth, Knight-Errant) and they have specific rules for their special abilities.") - .append(newLine); - s.append("You can only use one ability a turn. A planeswalker can be attacked, but you can also block with your creatures. For each 1 damage a planeswalker receives, you remove 1 counter. When a planeswalker doesn't have any counters, it goes to the graveyard.\r\n\r\n\r\n"); - - s.append("Hybrid Mana and Multicolored Cards").append(newLine); - s.append("1. Hybrid Mana Cards are unique in their casting cost as seen in the card. Instead of seeing a single color per mana symbol, these cards have 2 colors per mana symbol indicating that the player has the choice of playing either of the two. There are also cases where numbers and colors are combined together in one mana symbol, which indicates that either colorless or colored mana can be paid for each symbol. Hybrid cards are treated as two colors and as such can be said to be multicolored.") - .append(newLine); - s.append("2. Multicolored Cards are slightly different than hybrid mana cards, as they require two or more different colors of mana, which may or not be in a single mana symbol. An example would be a card like Lightning Helix which requires one red and one white mana to be played.\r\n\r\n\r\n"); - - s.append("Game Types").append(newLine); - s.append("1. In Constructed Deck mode you can use any of the cards to make your deck. To make a constructed deck, from the Deck Editor select \"New Deck � Constructed\". A list of all the cards will be displayed.") - .append(newLine); - s.append("2. In Sealed Deck mode you are given 75 cards and you have to make your deck from just those cards.") - .append(newLine); - s.append("3. In Booster Draft mode you select 1 card at a time and then make your deck from just those cards. After you are done drafting you have to type in a filename, then go to the Deck Editor and from the menu select \"Open Deck - Draft\" and find the filename. This will allow you to construct your deck. You can then play against the other 7 computer opponents that were drafting with you.") - .append(newLine); - s.append("4. In Quest Mode you start out with 275 cards, 200 are Basic Lands. As you complete matches in your quest you will win more cards. In easy mode you get more cards after every game, whether you win or lose. Your goal is to become world champion. Once you reach the end of your quest you can continue to play additional matches and win even more cards or you can start a new quest at anytime.") - .append(newLine); - s.append("At the Quest Options screen you will be given a choice of four different difficulty levels. These difficulty levels control:") - .append(newLine); - s.append("1) the length of the quest in matches,\r\n"); - s.append("2) the hardness of the AI deck that you will face as an opponent,\r\n"); - s.append("3) the number of wins or loses needed to get more cards,\r\n"); - s.append("4) the number of wins needed to advance a player to the next rank.\r\n\r\n\r\n"); - - s.append("Quick Games").append(newLine); - s.append("There may be occasions where you only have a few minutes to play a quick game or two. At the top of the New Game window you will see the three different game types with radio buttons. Click on the Constructed (Easy) button and it will become highlighted.") - .append(newLine); - s.append("In the middle area of the New Game window you will see two menus, one labeled \"Your Deck\" and the other \"Opponent\". For a quick game you should select the \"Generate Deck\" or the \"Random\" option for both you and the computer.") - .append(newLine); - s.append("1. The \"Generate Deck\" option creates a 2 color deck. This option randomly picks cards and sometimes your mana curve may be too high.") - .append(newLine); - s.append("2. The \"Random\" option will randomly select one of the constructed decks that appear in the two deck menus. You either construct these decks in the Deck Editor or you imported a .deck file from the Deck Editor.") - .append(newLine); - s.append("If you select the \"Random\" option and click on the \"Start Game\" button and the match fails to begin � well, this happens if you fail to have any constructed decks saved to your all-decks2 file. You should choose the \"Generate Deck\" option instead.\r\n\r\n\r\n"); - - s.append("Resizable Game Area & Stack AI Land").append(newLine); - s.append("1. The \"Resizable Game Area\" check box should be set to on if your monitor will display more than 1024 x 768 pixels. The window containing the Battlefield and the informational displays will fill the entire screen.") - .append(newLine); - s.append("2. The \"Stack AI Land\" option will make the computer a more difficult opponent to beat. The computer will draw nonland cards from it's library after it has drawn enough lands to cover the cost of it's spells. Set the check box to on for a stronger opponent and set the check box to off for a weaker opponent.") - .append(newLine); - s.append("At times, you may notice that when you click the \"Start Game\" button that the match fails to begin. In this case you should turn the \"Stack AI Land\" option to off.\r\n\r\n\r\n"); - - s.append("Abilities").append(newLine); - s.append("There are three kinds of abilities: Activated, Triggered, and Static.").append(newLine); - s.append("1. Activated abilities contain a colon that separates cost and effect, these can be played any time you could play an instant. An example is Elvish Piper's ability. That cost also contains the tap symbol. For creatures only, abilities containing the tap- or untap symbol can be played starting the turn after the creature entered the battlefield. Another common cost for an activated ability is sacrificing the card. You do that by putting it into your graveyard. Such abilities can only be played once.") - .append(newLine); - s.append("2. Triggered abilities aren't played, they simply trigger when their condition occurs. An example is Angel of Mercy: You don't play the ability, but gain 3 life when it enters the battlefield.") - .append(newLine); - s.append("3. Static abilities are neither played, nor do they trigger. They still have an effect for as long as they are in play. An example is Glorious Anthem. There is no condition or cost, your creatures are just stronger.\r\n\r\n\r\n"); - - s.append("Keyword Abilities").append(newLine); - s.append("1. Flying: Creatures with flying are harder to block. Only creatures with flying or reach can block other flyers.") - .append(newLine); - s.append("2. Haste: Haste lets a creature attack or use any abilities immediately during this turn.") - .append(newLine); - s.append("3. Fear: Creatures with fear can only be blocked by artifact or black creatures. Creatures with fear are harder to block.") - .append(newLine); - s.append("4. Cycling: When you cycle a card you pay some cost like 2 and then you discard that card, and then draw a new card. Cycling helps make your deck more versatile.") - .append(newLine); - s.append("5. Vigilance: This means that the creature will not tap when attacking. This creature can both attack and block during the same turn.") - .append(newLine); - s.append("6. Trample: If you use 2/1 creature to block an attacking 3/4 creature with trample, you will still receive 2 damage because the 3/4 trampled over your 2/1 creature. Trample damage is calculated by (attack - blocker's defense), in this case 3-1 which is 2.") - .append(newLine); - s.append("7. Deathtouch: When a creatures with deathtouch deals damage to a creature, that creature is destroyed.") - .append(newLine); - s.append("8. Defender: Creatures with defender can not attack, they can only block another attacker.") - .append(newLine); - s.append("9. First Strike and Double Strike: Creatures with first strike deals their combat damage first. Creatures with double strike deals their combat damage first, and then deals their combat damage a second time during the combat damage step.") - .append(newLine); - s.append("10. Flash: You can play a creature with flash anytime that you can play an Instant.").append(newLine); - s.append("11. Landwalk: Allows your creature to attack without being blocked if your opponent controls the appropriate land type.") - .append(newLine); - s.append("12. Lifelink: With lifeline you gain life equal to the amount of damage dealt.").append(newLine); - s.append("13. Protection: Can not be damaged, blocked or targeted by sources that match the protection type.") - .append(newLine); - s.append("14. Reach: Creatures with reach can block flying creatures.").append(newLine); - s.append("15. Shroud: Permanents with shroud can not be targeted by abilities or spells.").append(newLine); - s.append("16. Regenerate: Regenerate is an ability that some creatures have which prevents them from being destroyed and put into the graveyard. When you regenerate a creature, it acts like a shield until end of turn.") - .append(newLine); - s.append("17. Morph: A creature with morph can be played by usually paying 3 mana of any color and be treated as a 2/2 creature with no abilities rather than playing the creature's actual cost. This creature is placed face down in the battlefield and can be flipped face up anytime as long as you pay its morph cost which is indicated on the card. Once flipped face up the card is treated as the original card, the one that you would normally play with its original-full casting cost."); - - - return s.toString(); - } -}//MenuItem_HowToPlay - diff --git a/src/forge/Move.java b/src/forge/Move.java deleted file mode 100644 index 02fe13baf80..00000000000 --- a/src/forge/Move.java +++ /dev/null @@ -1,69 +0,0 @@ -package forge; - -/** - *

Abstract Move class.

- * - * @author Forge - * @version $Id: $ - */ -public abstract class Move { - /** - *

generateMoves.

- * - * @return an array of {@link forge.Move} objects. - */ - abstract public Move[] generateMoves(); - - /** - *

getScore.

- * - * @return a int. - */ - abstract public int getScore(); - - public Move bestMove = null; - public int bestScore = Integer.MIN_VALUE; - - /** - *

min.

- * - * @param move a {@link forge.Move} object. - * @param depth a int. - * @return a int. - */ - public int min(Move move, int depth) { - if (depth == 0) - return move.getScore(); - - Move v[] = move.generateMoves(); - int score = Integer.MAX_VALUE; - for (int i = 0; i < v.length; i++) - score = Math.min(score, max(v[i], depth - 1, false)); - return score; - } - - /** - *

max.

- * - * @param move a {@link forge.Move} object. - * @param depth a int. - * @param first a boolean. - * @return a int. - */ - public int max(Move move, int depth, boolean first) { - if (depth == 0) - return move.getScore(); - - Move v[] = move.generateMoves(); - int score = Integer.MIN_VALUE; - for (int i = 0; i < v.length; i++) { - score = Math.max(score, min(v[i], depth - 1)); - - if (first && bestScore < score) { - bestScore = score; - bestMove = v[i]; - } - }//for - return score; - }//max() -} diff --git a/src/forge/MyButton.java b/src/forge/MyButton.java deleted file mode 100644 index 30aa8bd604a..00000000000 --- a/src/forge/MyButton.java +++ /dev/null @@ -1,48 +0,0 @@ -package forge; - -/** - *

MyButton interface.

- * - * @author Forge - * @version $Id: $ - */ -public interface MyButton { - // public MyButton(String buttonText, Command command) - /** - *

select.

- */ - public void select(); - - /** - *

setSelectable.

- * - * @param b a boolean. - */ - public void setSelectable(boolean b); - - /** - *

isSelectable.

- * - * @return a boolean. - */ - public boolean isSelectable(); - - /** - *

getText.

- * - * @return a {@link java.lang.String} object. - */ - public String getText(); - - /** - *

setText.

- * - * @param text a {@link java.lang.String} object. - */ - public void setText(String text); - - /** - *

reset.

- */ - public void reset(); //resets the text and calls setSelectable(false) -} diff --git a/src/forge/MyObservable.java b/src/forge/MyObservable.java deleted file mode 100644 index 4b807927f0f..00000000000 --- a/src/forge/MyObservable.java +++ /dev/null @@ -1,28 +0,0 @@ -package forge; - -import java.util.Observable; - -/** - *

MyObservable class.

- * - * @author Forge - * @version $Id: $ - */ -public class MyObservable extends Observable { - /** - *

updateObservers.

- */ - public final void updateObservers() { - this.setChanged(); - this.notifyObservers(); - - if (AllZone.getPhase() != null && AllZone.getPhase().isNeedToNextPhase()) { - if (AllZone.getPhase().isNeedToNextPhaseInit()) { - // this is used. - AllZone.getPhase().setNeedToNextPhase(false); - AllZone.getPhase().nextPhase(); - } - } - } -} - diff --git a/src/forge/MyRandom.java b/src/forge/MyRandom.java deleted file mode 100644 index 39c9d7667e9..00000000000 --- a/src/forge/MyRandom.java +++ /dev/null @@ -1,24 +0,0 @@ -package forge; - -import java.util.Random; - -/** - *

MyRandom class.
Preferably all Random numbers should be retrieved using this wrapper class

- * - * @author Forge - * @version $Id: $ - */ -public class MyRandom { - /** Constant random */ - public static Random random = new Random(); - - /** - *

percentTrue.
If percent is like 30, then 30% of the time it will be true.

- * - * @param percent a int. - * @return a boolean. - */ - public static boolean percentTrue(int percent) { - return percent > random.nextInt(100); - } -} diff --git a/src/forge/NameChanger.java b/src/forge/NameChanger.java deleted file mode 100644 index 9ee5d37324b..00000000000 --- a/src/forge/NameChanger.java +++ /dev/null @@ -1,255 +0,0 @@ -package forge; - -import forge.card.spellability.SpellAbility; -import forge.error.ErrorViewer; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.util.Map; -import java.util.Map.Entry; -import java.util.StringTokenizer; -import java.util.TreeMap; - -import net.slightlymagic.braids.util.generator.GeneratorFunctions; -import net.slightlymagic.braids.util.lambda.Lambda1; - -import com.google.code.jyield.Generator; -import com.google.code.jyield.YieldUtils; - - -/** - *

NameChanger class.

- * - * @author Forge - * @version $Id: $ - */ -public class NameChanger implements NewConstants { - private Map mutatedMap = new TreeMap(); - private Map originalMap = new TreeMap(); - - private boolean changeCardName; - - /** - *

Constructor for NameChanger.

- */ - public NameChanger() { -// readFile(); - setShouldChangeCardName(false); - } - - //should change card name? - /** - *

shouldChangeCardName.

- * - * @return a boolean. - */ - public boolean shouldChangeCardName() { - return changeCardName; - } - - /** - *

setShouldChangeCardName.

- * - * @param b a boolean. - */ - public void setShouldChangeCardName(boolean b) { - changeCardName = b; - } - - /** - * This change's the inputGenerator's Card instances in place, - * and returns a generator of those same changed instances. - * - * TODO: Should this method return void, because it side effects - * the contents of its inputGenerator? - * - * @param inputGenerator a Generator of Card objects - * @return a Generator of side-effected Card objects - */ - public Generator changeCard(Generator inputGenerator) { - - // Create a new Generator by applying a transform to the - // inputGenerator. - - Lambda1 transform = new Lambda1() { - public Card apply(Card toChange) { - return changeCard(toChange); - }; - }; - - return GeneratorFunctions.transformGenerator(transform, inputGenerator); - } - - //changes card name, getText(), and all SpellAbility getStackDescription() and toString() - /** - *

changeCard.

- * - * @param c a {@link forge.Card} object. - * @return a {@link forge.Card} object. - */ - public Card changeCard(Card c) { - //change name - String newName = changeName(c.getName()); - c.setName(newName); - - //change text - String s; - s = c.getSpellText(); - c.setText(changeString(c, s)); - - //change all SpellAbilities - SpellAbility[] spell = c.getSpellAbility(); - for (int i = 0; i < spell.length; i++) { - s = spell[i].getStackDescription(); - spell[i].setStackDescription(changeString(c, s)); - - s = spell[i].toString(); - spell[i].setDescription(changeString(c, s)); - } - - return c; - }//getMutatedCard() - - /** - *

changeString.

- * - * @param c a {@link forge.Card} object. - * @param in a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public String changeString(Card c, String in) { - //String name = getOriginalName(c.getName()); // unused -// in = in.replaceAll(name, changeName(name)); - - return in; - } - - /** - * Changes a list of cards if shouldChangeCardName() is true. - * - * If not, we just return list. - * - * TODO: Should this method return void, because it side effects the - * contents of its input list? - * - * @param list - * the list of cards to possibly change; while this list is not - * affected, its contents might be - * - * @return either list itself or a new list (possibly wasteful) containing - * the side effected cards - */ - public CardList changeCardsIfNeeded(CardList list) { - if (shouldChangeCardName()) { - list = new CardList(changeCard(YieldUtils.toGenerator(list))); - } - return list; - } - - //always returns mutated (alias) for the card name - //if argument is a mutated name, it returns the same mutated name - /** - *

changeName.

- * - * @param originalName a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public String changeName(String originalName) { - Object o = mutatedMap.get(originalName); - - if (o == null) return originalName; - - return o.toString(); - }//getMutatedName() - - //always returns the original cardname - //if argument is a original name, it returns the same original name - /** - *

getOriginalName.

- * - * @param mutatedName a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public String getOriginalName(String mutatedName) { - Object o = originalMap.get(mutatedName); - - if (o == null) return mutatedName; - - return o.toString(); - }//getOriginalName() - - /** - *

readFile.

- */ - @SuppressWarnings("unused") - private void readFile() { - try { - BufferedReader in = new BufferedReader(new FileReader(ForgeProps.getFile(NAME_MUTATOR))); - - String line = in.readLine(); - - //stop reading if end of file or blank line is read - while (line != null && (line.trim().length() != 0)) { - processLine(line.trim()); - - line = in.readLine(); - }//while - }//try - catch (Exception ex) { -//~ throw new RuntimeException("NameMutator : readFile() error, " +ex); - - - //~ (could be cleaner...) - try { - BufferedReader in = new BufferedReader(new FileReader(ForgeProps.getFile(NAME_MUTATOR))); - - String line; - - //stop reading if end of file or blank line is read - while ((line = in.readLine()) != null && (line.trim().length() != 0)) { - processLine(line.trim()); - }//while - } catch (Exception ex2) { - // Show orig exception - ErrorViewer.showError(ex2); - throw new RuntimeException(String.format("NameMutator : readFile() error, %s", ex), ex); - } - //~ - } - }//readFile() - - //line is formated "original card name : alias card name" - /** - *

processLine.

- * - * @param line a {@link java.lang.String} object. - */ - private void processLine(String line) { - StringTokenizer tok = new StringTokenizer(line, ":"); - - if (tok.countTokens() != 2) - throw new RuntimeException( - "NameMutator : processLine() error, invalid line in file name-mutator.txt - " + line); - - String original = tok.nextToken().trim(); - String mutated = tok.nextToken().trim(); - - mutatedMap.put(original, mutated); - originalMap.put(mutated, original); - } - - /** - *

printMap.

- * - * @param map a {@link java.util.Map} object. - */ - @SuppressWarnings("unused") - // printMap - private void printMap(Map map) { - for (Entry e : map.entrySet()) { - System.out.println(e.getKey() + " : " + e.getValue()); - } - } -} diff --git a/src/forge/Phase.java b/src/forge/Phase.java deleted file mode 100644 index 7c54a0462d8..00000000000 --- a/src/forge/Phase.java +++ /dev/null @@ -1,1029 +0,0 @@ -package forge; - -import com.esotericsoftware.minlog.Log; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.Spell_Permanent; - -import java.util.HashMap; -import java.util.Observer; -import java.util.Stack; - -/** - *

Phase class.

- * - * @author Forge - * @version $Id: $ - */ -public class Phase extends MyObservable implements java.io.Serializable { - - /** Constant serialVersionUID=5207222278370963197L */ - private static final long serialVersionUID = 5207222278370963197L; - - private int phaseIndex; - private int turn; - - // Please use getX, setX, and incrementX methods instead of directly - // accessing the following: - /** Constant GameBegins=0 */ - private static int GameBegins = 0; - /** Constant StormCount= */ - private static int StormCount; - /** Constant PlayerSpellCount= */ - private static int PlayerSpellCount; - /** Constant PlayerCreatureSpellCount= */ - private static int PlayerCreatureSpellCount; - /** Constant PlayerInstantSpellCount= */ - private static int PlayerInstantSpellCount; - /** Constant ComputerSpellCount= */ - private static int ComputerSpellCount; - /** Constant ComputerCreatureSpellCount= */ - private static int ComputerCreatureSpellCount; - /** Constant ComputerInstantSpellCount= */ - private static int ComputerInstantSpellCount; - - private Stack extraTurns = new Stack(); - - private int extraCombats; - - private int nCombatsThisTurn; - - private Player playerTurn = AllZone.getHumanPlayer(); - - /** - *

isPlayerTurn.

- * - * @param player a {@link forge.Player} object. - * @return a boolean. - */ - public boolean isPlayerTurn(Player player) { - return playerTurn.isPlayer(player); - } - - /** - *

Setter for the field playerTurn.

- * - * @param s a {@link forge.Player} object. - */ - public void setPlayerTurn(Player s) { - playerTurn = s; - } - - /** - *

Getter for the field playerTurn.

- * - * @return a {@link forge.Player} object. - */ - public Player getPlayerTurn() { - return playerTurn; - } - - // priority player - - private Player pPlayerPriority = AllZone.getHumanPlayer(); - - /** - *

getPriorityPlayer.

- * - * @return a {@link forge.Player} object. - */ - public Player getPriorityPlayer() { - return pPlayerPriority; - } - - /** - *

setPriorityPlayer.

- * - * @param p a {@link forge.Player} object. - */ - public void setPriorityPlayer(Player p) { - pPlayerPriority = p; - } - - private Player pFirstPriority = AllZone.getHumanPlayer(); - - /** - *

getFirstPriority.

- * - * @return a {@link forge.Player} object. - */ - public Player getFirstPriority() { - return pFirstPriority; - } - - /** - *

setFirstPriority.

- * - * @param p a {@link forge.Player} object. - */ - public void setFirstPriority(Player p) { - pFirstPriority = p; - } - - /** - *

setPriority.

- * - * @param p a {@link forge.Player} object. - */ - public void setPriority(Player p) { - if (AllZone.getStack() != null) - AllZone.getStack().chooseOrderOfSimultaneousStackEntryAll(); - - pFirstPriority = p; - pPlayerPriority = p; - } - - /** - *

resetPriority.

- */ - public void resetPriority() { - setPriority(playerTurn); - } - - private boolean bPhaseEffects = true; - - /** - *

doPhaseEffects.

- * - * @return a boolean. - */ - public boolean doPhaseEffects() { - return bPhaseEffects; - } - - /** - *

setPhaseEffects.

- * - * @param b a boolean. - */ - public void setPhaseEffects(boolean b) { - bPhaseEffects = b; - } - - private boolean bSkipPhase = true; - - /** - *

doSkipPhase.

- * - * @return a boolean. - */ - public boolean doSkipPhase() { - return bSkipPhase; - } - - /** - *

setSkipPhase.

- * - * @param b a boolean. - */ - public void setSkipPhase(boolean b) { - bSkipPhase = b; - } - - private boolean bCombat = false; - - /** - *

inCombat.

- * - * @return a boolean. - */ - public boolean inCombat() { - return bCombat; - } - - /** - *

setCombat.

- * - * @param b a boolean. - */ - public void setCombat(boolean b) { - bCombat = b; - } - - private boolean bRepeat = false; - - /** - *

repeatPhase.

- */ - public void repeatPhase() { - bRepeat = true; - } - - String phaseOrder[] = { - Constant.Phase.Untap, - Constant.Phase.Upkeep, - Constant.Phase.Draw, - Constant.Phase.Main1, - Constant.Phase.Combat_Begin, - Constant.Phase.Combat_Declare_Attackers, - Constant.Phase.Combat_Declare_Attackers_InstantAbility, - Constant.Phase.Combat_Declare_Blockers, - Constant.Phase.Combat_Declare_Blockers_InstantAbility, - Constant.Phase.Combat_FirstStrikeDamage, - Constant.Phase.Combat_Damage, - Constant.Phase.Combat_End, - Constant.Phase.Main2, - Constant.Phase.End_Of_Turn, - Constant.Phase.Cleanup - }; - - /** - *

Constructor for Phase.

- */ - public Phase() { - reset(); - } - - /** - *

reset.

- */ - public void reset() { - turn = 1; - playerTurn = AllZone.getHumanPlayer(); - resetPriority(); - bPhaseEffects = true; - needToNextPhase = false; - setGameBegins(0); - phaseIndex = 0; - extraTurns.clear(); - nCombatsThisTurn = 0; - extraCombats = 0; - bCombat = false; - bRepeat = false; - this.updateObservers(); - } - - /** - *

turnReset.

- */ - public void turnReset() { - setStormCount(0); - setPlayerSpellCount(0); - setPlayerCreatureSpellCount(0); - setPlayerInstantSpellCount(0); - setComputerSpellCount(0); - setComputerCreatureSpellCount(0); - setComputerInstantSpellCount(0); - playerTurn.setNumLandsPlayed(0); - } - - /** - *

handleBeginPhase.

- */ - public void handleBeginPhase() { - AllZone.getPhase().setPhaseEffects(false); - // Handle effects that happen at the beginning of phases - final String phase = AllZone.getPhase().getPhase(); - final Player turn = AllZone.getPhase().getPlayerTurn(); - AllZone.getPhase().setSkipPhase(true); - AllZone.getGameAction().checkStateEffects(); - - if (phase.equals(Constant.Phase.Untap)) { - PhaseUtil.handleUntap(); - } else if (phase.equals(Constant.Phase.Upkeep)) { - PhaseUtil.handleUpkeep(); - } else if (phase.equals(Constant.Phase.Draw)) { - PhaseUtil.handleDraw(); - } else if (phase.equals(Constant.Phase.Combat_Begin)) { - PhaseUtil.verifyCombat(); - } else if (phase.equals(Constant.Phase.Combat_Declare_Attackers_InstantAbility)) { - if (inCombat()) { - PhaseUtil.handleDeclareAttackers(); - } else - AllZone.getPhase().setNeedToNextPhase(true); - } - - // we can skip AfterBlockers and AfterAttackers if necessary - else if (phase.equals(Constant.Phase.Combat_Declare_Blockers)) { - if (inCombat()) { - PhaseUtil.verifyCombat(); - } else - AllZone.getPhase().setNeedToNextPhase(true); - } else if (phase.equals(Constant.Phase.Combat_Declare_Blockers_InstantAbility)) { - // After declare blockers are finished being declared mark them blocked and trigger blocking things - if (!inCombat()) - AllZone.getPhase().setNeedToNextPhase(true); - else { - PhaseUtil.handleDeclareBlockers(); - } - } else if (phase.equals(Constant.Phase.Combat_FirstStrikeDamage)) { - if (!inCombat()) - AllZone.getPhase().setNeedToNextPhase(true); - else { - AllZone.getCombat().verifyCreaturesInPlay(); - - // no first strikers, skip this step - if (!AllZone.getCombat().setAssignedFirstStrikeDamage()) - AllZone.getPhase().setNeedToNextPhase(true); - - else { - if (!AllZone.getGameInfo().isPreventCombatDamageThisTurn()) - Combat.dealAssignedDamage(); - - AllZone.getGameAction().checkStateEffects(); - CombatUtil.showCombat(); - } - } - } else if (phase.equals(Constant.Phase.Combat_Damage)) { - if (!inCombat()) - AllZone.getPhase().setNeedToNextPhase(true); - else { - AllZone.getCombat().verifyCreaturesInPlay(); - - AllZone.getCombat().setAssignedDamage(); - - if (!AllZone.getGameInfo().isPreventCombatDamageThisTurn()) - Combat.dealAssignedDamage(); - - AllZone.getGameAction().checkStateEffects(); - CombatUtil.showCombat(); - } - } else if (phase.equals(Constant.Phase.Combat_End)) { - // End Combat always happens - AllZone.getEndOfCombat().executeUntil(); - AllZone.getEndOfCombat().executeAt(); - } else if (phase.equals(Constant.Phase.End_Of_Turn)) { - AllZone.getEndOfTurn().executeAt(); - } else if (phase.equals(Constant.Phase.Cleanup)) { - AllZone.getPhase().getPlayerTurn().setAssignedDamage(0); - - //Reset Damage received map - CardList list = AllZoneUtil.getCardsInPlay(); - for (Card c : list) { - c.resetPreventNextDamage(); - c.resetReceivedDamageFromThisTurn(); - c.resetDealtDamageToThisTurn(); - c.setDealtDmgToHumanThisTurn(false); - c.setDealtDmgToComputerThisTurn(false); - } - AllZone.getHumanPlayer().resetPreventNextDamage(); - AllZone.getComputerPlayer().resetPreventNextDamage(); - - AllZone.getEndOfTurn().executeUntil(); - CardList cHand = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); - CardList hHand = AllZoneUtil.getPlayerHand(AllZone.getHumanPlayer()); - for (Card c : cHand) c.setDrawnThisTurn(false); - for (Card c : hHand) c.setDrawnThisTurn(false); - AllZone.getHumanPlayer().resetNumDrawnThisTurn(); - AllZone.getComputerPlayer().resetNumDrawnThisTurn(); - } - - if (!AllZone.getPhase().isNeedToNextPhase()) { - // Run triggers if phase isn't being skipped - HashMap runParams = new HashMap(); - runParams.put("Phase", phase); - runParams.put("Player", turn); - AllZone.getTriggerHandler().runTrigger("Phase", runParams); - - } - - //This line fixes Combat Damage triggers not going off when they should - AllZone.getStack().unfreezeStack(); - - if (!phase.equals(Constant.Phase.Untap)) //Nobody recieves priority during untap - resetPriority(); - } - - /** - *

nextPhase.

- */ - public void nextPhase() { - //experimental, add executeCardStateEffects() here: - for (String effect : AllZone.getStaticEffects().getStateBasedMap().keySet()) { - Command com = GameActionUtil.commands.get(effect); - com.execute(); - } - - needToNextPhase = false; - - // If the Stack isn't empty why is nextPhase being called? - if (AllZone.getStack().size() != 0) { - Log.debug("Phase.nextPhase() is called, but Stack isn't empty."); - return; - } - this.bPhaseEffects = true; - if (!AllZoneUtil.isCardInPlay("Upwelling")) { - AllZone.getManaPool().clearPool(); - AllZone.getComputerManaPool().clearPool(); - } - - if (getPhase().equals(Constant.Phase.Combat_Declare_Attackers)) { - AllZone.getStack().unfreezeStack(); - nCombatsThisTurn++; - } else if (getPhase().equals(Constant.Phase.Untap)) { - nCombatsThisTurn = 0; - } - - if (getPhase().equals(Constant.Phase.Combat_End)) { - AllZone.getCombat().reset(); - AllZone.getDisplay().showCombat(""); - resetAttackedThisCombat(getPlayerTurn()); - this.bCombat = false; - } - - if (phaseOrder[phaseIndex].equals(Constant.Phase.Cleanup)) - if (!bRepeat) - AllZone.getPhase().setPlayerTurn(handleNextTurn()); - - if (is(Constant.Phase.Combat_Declare_Blockers)) { - AllZone.getStack().unfreezeStack(); - } - - if (is(Constant.Phase.Combat_End) && extraCombats > 0) { - // TODO: ExtraCombat needs to be changed for other spell/abilities that give extra combat - // can do it like ExtraTurn stack ExtraPhases - - Player player = getPlayerTurn(); - Player opp = player.getOpponent(); - - bCombat = true; - extraCombats--; - AllZone.getCombat().reset(); - AllZone.getCombat().setAttackingPlayer(player); - AllZone.getCombat().setDefendingPlayer(opp); - phaseIndex = findIndex(Constant.Phase.Combat_Declare_Attackers); - } else { - if (!bRepeat) { // for when Cleanup needs to repeat itself - phaseIndex++; - phaseIndex %= phaseOrder.length; - } else - bRepeat = false; - } - - // **** Anything BELOW Here is actually in the next phase. Maybe move this to handleBeginPhase - if (getPhase().equals(Constant.Phase.Untap)) { - turn++; - } - - // When consecutively skipping phases (like in combat) this section pushes through that block - this.updateObservers(); - if (AllZone.getPhase() != null && AllZone.getPhase().isNeedToNextPhase()) { - AllZone.getPhase().setNeedToNextPhase(false); - AllZone.getPhase().nextPhase(); - } - } - - /** - *

handleNextTurn.

- * - * @return a {@link forge.Player} object. - */ - private Player handleNextTurn() { - Player nextTurn = extraTurns.isEmpty() ? getPlayerTurn().getOpponent() : extraTurns.pop(); - - AllZone.resetZoneMoveTracking(); - - return skipTurnTimeVault(nextTurn); - } - - /** - *

skipTurnTimeVault.

- * - * @param turn a {@link forge.Player} object. - * @return a {@link forge.Player} object. - */ - private Player skipTurnTimeVault(Player turn) { - //time vault: - CardList vaults = AllZoneUtil.getPlayerCardsInPlay(turn, "Time Vault"); - vaults = vaults.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isTapped(); - } - }); - - if (vaults.size() > 0) { - final Card crd = vaults.get(0); - - if (turn.isHuman()) { - if (GameActionUtil.showYesNoDialog(crd, "Untap " + crd + "?")) { - crd.untap(); - turn = extraTurns.isEmpty() ? turn.getOpponent() : extraTurns.pop(); - } - } else { - // TODO: Should AI skip his turn for time vault? - } - } - return turn; - } - - /** - *

is.

- * - * @param phase a {@link java.lang.String} object. - * @param player a {@link forge.Player} object. - * @return a boolean. - */ - public synchronized boolean is(String phase, Player player) { - return getPhase().equals(phase) && getPlayerTurn().isPlayer(player); - } - - /** - *

is.

- * - * @param phase a {@link java.lang.String} object. - * @return a boolean. - */ - public synchronized boolean is(String phase) { - return (getPhase().equals(phase)); - } - - /** - *

isAfter.

- * - * @param phase a {@link java.lang.String} object. - * @return a boolean. - */ - public boolean isAfter(String phase) { - return phaseIndex > findIndex(phase); - } - - /** - *

isBefore.

- * - * @param phase a {@link java.lang.String} object. - * @return a boolean. - */ - public boolean isBefore(String phase) { - return phaseIndex < findIndex(phase); - } - - /** - *

findIndex.

- * - * @param phase a {@link java.lang.String} object. - * @return a int. - */ - private int findIndex(String phase) { - for (int i = 0; i < phaseOrder.length; i++) { - if (phase.equals(phaseOrder[i])) - return i; - } - throw new RuntimeException("Phase : findIndex() invalid argument, phase = " + phase); - } - - /** - *

getPhase.

- * - * @return a {@link java.lang.String} object. - */ - public String getPhase() { - return phaseOrder[phaseIndex]; - } - - /** - *

Getter for the field turn.

- * - * @return a int. - */ - public int getTurn() { - return turn; - } - - /** - *

getNextTurn.

- * - * @return a {@link forge.Player} object. - */ - public Player getNextTurn() { - if (extraTurns.isEmpty()) - return getPlayerTurn().getOpponent(); - - return extraTurns.peek(); - } - - /** - *

isNextTurn.

- * - * @param pl a {@link forge.Player} object. - * @return a boolean. - */ - public boolean isNextTurn(Player pl) { - Player next = getNextTurn(); - return (pl.equals(next)); - } - - /** - *

addExtraTurn.

- * - * @param player a {@link forge.Player} object. - */ - public void addExtraTurn(Player player) { - // use a stack to handle extra turns, make sure the bottom of the stack restores original turn order - if (extraTurns.isEmpty()) - extraTurns.push(getPlayerTurn().getOpponent()); - - extraTurns.push(player); - } - - /** - *

skipTurn.

- * - * @param player a {@link forge.Player} object. - */ - public void skipTurn(Player player) { - // skipping turn without having extras is equivalent to giving your opponent an extra turn - if (extraTurns.isEmpty()) - addExtraTurn(player.getOpponent()); - else { - int pos = extraTurns.lastIndexOf(player); - if (pos == -1) - addExtraTurn(player.getOpponent()); - else - extraTurns.remove(pos); - } - } - - /** - *

addExtraCombat.

- */ - public void addExtraCombat() { - // Extra combats can only happen - extraCombats++; - } - - /** - *

isFirstCombat.

- * - * @return a boolean. - */ - public boolean isFirstCombat() { - return (nCombatsThisTurn == 1); - } - - /** - *

resetAttackedThisCombat.

- * - * @param player a {@link forge.Player} object. - */ - public void resetAttackedThisCombat(Player player) { - // resets the status of attacked/blocked this phase - CardList list = AllZoneUtil.getPlayerCardsInPlay(player); - - list = list.getType("Creature"); - - for (int i = 0; i < list.size(); i++) { - Card c = list.get(i); - if (c.getCreatureAttackedThisCombat()) c.setCreatureAttackedThisCombat(false); - if (c.getCreatureBlockedThisCombat()) c.setCreatureBlockedThisCombat(false); - - if (c.getCreatureGotBlockedThisCombat()) c.setCreatureGotBlockedThisCombat(false); - - AllZone.getGameInfo().setAssignedFirstStrikeDamageThisCombat(false); - AllZone.getGameInfo().setResolvedFirstStrikeDamageThisCombat(false); - } - } - - /** - *

passPriority.

- */ - public void passPriority() { - Player actingPlayer = getPriorityPlayer(); - Player lastToAct = getFirstPriority(); - - // actingPlayer is the player who may act - // the lastToAct is the player who gained Priority First in this segment of Priority - - if (lastToAct.equals(actingPlayer)) { - // pass the priority to other player - setPriorityPlayer(actingPlayer.getOpponent()); - AllZone.getInputControl().resetInput(); - AllZone.getStack().chooseOrderOfSimultaneousStackEntryAll(); - } else { - if (AllZone.getStack().size() == 0) { - // end phase - needToNextPhase = true; - pPlayerPriority = getPlayerTurn(); // this needs to be set early as we exit the phase - } else { - if (!AllZone.getStack().hasSimultaneousStackEntries()) - AllZone.getStack().resolveStack(); - } - AllZone.getStack().chooseOrderOfSimultaneousStackEntryAll(); - } - } - - /** {@inheritDoc} */ - @Override - public void addObserver(Observer o) { - super.deleteObservers(); - super.addObserver(o); - } - - boolean needToNextPhase = false; - - /** - *

Setter for the field needToNextPhase.

- * - * @param needToNextPhase a boolean. - */ - public void setNeedToNextPhase(boolean needToNextPhase) { - this.needToNextPhase = needToNextPhase; - } - - /** - *

isNeedToNextPhase.

- * - * @return a boolean. - */ - public boolean isNeedToNextPhase() { - return this.needToNextPhase; - } - - //This should only be true four times! that is for the initial nextPhases in MyObservable - int needToNextPhaseInit = 0; - - /** - *

isNeedToNextPhaseInit.

- * - * @return a boolean. - */ - public boolean isNeedToNextPhaseInit() { - needToNextPhaseInit++; - if (needToNextPhaseInit <= 4) { - return true; - } - return false; - } - - /** - *

canCastSorcery.

- * - * @param player a {@link forge.Player} object. - * @return a boolean. - */ - public static boolean canCastSorcery(Player player) { - return AllZone.getPhase().isPlayerTurn(player) && (AllZone.getPhase().getPhase().equals(Constant.Phase.Main2) || - AllZone.getPhase().getPhase().equals(Constant.Phase.Main1)) && AllZone.getStack().size() == 0; - } - - /** - *

buildActivateString.

- * - * @param startPhase a {@link java.lang.String} object. - * @param endPhase a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public String buildActivateString(String startPhase, String endPhase) { - StringBuilder sb = new StringBuilder(); - - boolean add = false; - for (int i = 0; i < phaseOrder.length; i++) { - if (phaseOrder[i].equals(startPhase)) - add = true; - - if (add) { - if (sb.length() != 0) - sb.append(","); - sb.append(phaseOrder[i]); - } - - if (phaseOrder[i].equals(endPhase)) - add = false; - } - - return sb.toString(); - } - - /** - *

increaseSpellCount.

- * - * @param sp a {@link forge.card.spellability.SpellAbility} object. - */ - public static void increaseSpellCount(SpellAbility sp) { - incrementStormCount(); - - if (sp.getActivatingPlayer().isHuman()) { - incrementPlayerSpellCount(); - if (sp instanceof Spell_Permanent && sp.getSourceCard().isCreature()) { - incrementPlayerCreatureSpellCount(); - } - if (sp.getSourceCard().isInstant()) { - incrementPlayerInstantSpellCount(); - } - } else { - incrementComputerSpellCount(); - if (sp instanceof Spell_Permanent && sp.getSourceCard().isCreature()) { - incrementComputerCreatureSpellCount(); - } - if (sp.getSourceCard().isInstant()) { - incrementComputerInstantSpellCount(); - } - } - } - - /** - *

incrementComputerInstantSpellCount.

- * - * @since 1.0.15 - */ - protected static void incrementComputerInstantSpellCount() { - ComputerInstantSpellCount++; - } - - /** - *

incrementComputerCreatureSpellCount.

- * - * @since 1.0.15 - */ - protected static void incrementComputerCreatureSpellCount() { - ComputerCreatureSpellCount++; - } - - /** - *

incrementComputerSpellCount.

- * - * @since 1.0.15 - */ - protected static void incrementComputerSpellCount() { - ComputerSpellCount++; - } - - /** - *

incrementPlayerInstantSpellCount.

- * - * @since 1.0.15 - */ - protected static void incrementPlayerInstantSpellCount() { - PlayerInstantSpellCount++; - } - - /** - *

incrementPlayerCreatureSpellCount.

- * - * @since 1.0.15 - */ - protected static void incrementPlayerCreatureSpellCount() { - PlayerCreatureSpellCount++; - } - - /** - *

incrementPlayerSpellCount.

- * - * @since 1.0.15 - */ - protected static void incrementPlayerSpellCount() { - PlayerSpellCount++; - } - - /** - *

incrementStormCount.

- * - * @since 1.0.15 - */ - protected static void incrementStormCount() { - StormCount++; - } - - /** - *

setStormCount.

- * - * @param stormCount a int. - */ - public static void setStormCount(int stormCount) { - StormCount = stormCount; - } - - /** - *

getStormCount.

- * - * @return a int. - */ - public static int getStormCount() { - return StormCount; - } - - /** - *

setGameBegins.

- * - * @param gameBegins a int. - */ - public static void setGameBegins(int gameBegins) { - GameBegins = gameBegins; - } - - /** - *

getGameBegins.

- * - * @return a int. - */ - public static int getGameBegins() { - return GameBegins; - } - - // this is a hack for the setup game state mode, do not use outside of devSetupGameState code - // as it avoids calling any of the phase effects that may be necessary in a less enforced context - /** - *

setDevPhaseState.

- * - * @param phaseID a {@link java.lang.String} object. - */ - public void setDevPhaseState(String phaseID) { - this.phaseIndex = findIndex(phaseID); - } - - /** - *

getPlayerSpellCount.

- * - * @return a int. - */ - static int getPlayerSpellCount() { - return PlayerSpellCount; - } - - /** - *

setPlayerSpellCount.

- * - * @param i a int. - */ - static void setPlayerSpellCount(int i) { - PlayerSpellCount = (i); - } - - /** - *

getPlayerCreatureSpellCount.

- * - * @return a int. - */ - static int getPlayerCreatureSpellCount() { - return PlayerCreatureSpellCount; - } - - /** - *

setPlayerCreatureSpellCount.

- * - * @param i a int. - */ - static void setPlayerCreatureSpellCount(int i) { - PlayerCreatureSpellCount = (i); - } - - /** - *

getPlayerInstantSpellCount.

- * - * @return a int. - */ - static int getPlayerInstantSpellCount() { - return PlayerInstantSpellCount; - } - - /** - *

setPlayerInstantSpellCount.

- * - * @param i a int. - */ - static void setPlayerInstantSpellCount(int i) { - PlayerInstantSpellCount = (i); - } - - /** - *

getComputerSpellCount.

- * - * @return a int. - */ - static int getComputerSpellCount() { - return ComputerSpellCount; - } - - /** - *

setComputerSpellCount.

- * - * @param i a int. - */ - static void setComputerSpellCount(int i) { - ComputerSpellCount = (i); - } - - /** - *

getComputerCreatureSpellCount.

- * - * @return a int. - */ - static int getComputerCreatureSpellCount() { - return ComputerCreatureSpellCount; - } - - /** - *

setComputerCreatureSpellCount.

- * - * @param i a int. - */ - static void setComputerCreatureSpellCount(int i) { - ComputerCreatureSpellCount = (i); - } - - /** - *

getComputerInstantSpellCount.

- * - * @return a int. - */ - static int getComputerInstantSpellCount() { - return ComputerInstantSpellCount; - } - - /** - *

setComputerInstantSpellCount.

- * - * @param i a int. - */ - static void setComputerInstantSpellCount(int i) { - ComputerInstantSpellCount = (i); - } -} diff --git a/src/forge/PhaseUtil.java b/src/forge/PhaseUtil.java deleted file mode 100644 index 1b9d4002223..00000000000 --- a/src/forge/PhaseUtil.java +++ /dev/null @@ -1,481 +0,0 @@ -package forge; - -import forge.card.cardFactory.CardFactoryUtil; -import forge.gui.input.Input; - -import java.util.ArrayList; - -/** - *

PhaseUtil class.

- * - * @author Forge - * @version $Id: $ - */ -public class PhaseUtil { - // ******* UNTAP PHASE ***** - /** - *

skipUntap.

- * - * @param p a {@link forge.Player} object. - * @return a boolean. - */ - private static boolean skipUntap(Player p) { - if (AllZoneUtil.isCardInPlay("Sands of Time") || AllZoneUtil.isCardInPlay("Stasis")) - return true; - - if (p.skipNextUntap()) { - p.setSkipNextUntap(false); - return true; - } - - return false; - } - - /** - *

handleUntap.

- */ - public static void handleUntap() { - Player turn = AllZone.getPhase().getPlayerTurn(); - - AllZone.getPhase().turnReset(); - - AllZone.getCombat().reset(); - AllZone.getCombat().setAttackingPlayer(turn); - AllZone.getCombat().setDefendingPlayer(turn.getOpponent()); - - // For tokens a player starts the game with they don't recover from Sum. Sickness on first turn - if (turn.getTurn() > 0) { - CardList list = AllZoneUtil.getPlayerCardsInPlay(turn); - for (Card c : list) - c.setSickness(false); - } - turn.incrementTurn(); - - AllZone.getGameAction().resetActivationsPerTurn(); - - CardList lands = AllZoneUtil.getPlayerLandsInPlay(turn); - lands = lands.filter(AllZoneUtil.untapped); - turn.setNumPowerSurgeLands(lands.size()); - - // anything before this point happens regardless of whether the Untap phase is skipped - - if (skipUntap(turn)) { - AllZone.getPhase().setNeedToNextPhase(true); - return; - } - - // Phasing would happen here - - doUntap(); - - //otherwise land seems to stay tapped when it is really untapped - AllZone.getHumanBattlefield().updateObservers(); - - AllZone.getPhase().setNeedToNextPhase(true); - } - - /** - *

doUntap.

- */ - private static void doUntap() { - Player player = AllZone.getPhase().getPlayerTurn(); - CardList list = AllZoneUtil.getPlayerCardsInPlay(player); - - for (Card c : list) { - if (c.getBounceAtUntap() && c.getName().contains("Undiscovered Paradise")) { - AllZone.getGameAction().moveToHand(c); - } - } - - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (!canUntap(c)) return false; - if (canOnlyUntapOneLand() && c.isLand()) return false; - if ((AllZoneUtil.isCardInPlay("Damping Field") || AllZoneUtil.isCardInPlay("Imi Statue")) - && c.isArtifact()) return false; - if ((AllZoneUtil.isCardInPlay("Smoke") || AllZoneUtil.isCardInPlay("Stoic Angel") - || AllZoneUtil.isCardInPlay("Intruder Alarm")) && c.isCreature()) return false; - return true; - } - }); - - for (Card c : list) { - if (c.hasKeyword("You may choose not to untap CARDNAME during your untap step.")) { - if (c.isTapped()) { - if (c.getController().isHuman()) { - String prompt = "Untap " + c.getName() + "?"; - boolean defaultNo = false; - if (c.getGainControlTargets().size() > 0) { - ArrayList targets = c.getGainControlTargets(); - prompt += "\r\n" + c + " is controlling: "; - for (Card target : targets) { - prompt += target; - if(AllZoneUtil.isCardInPlay(target)) defaultNo |= true; - } - } - if (GameActionUtil.showYesNoDialog(c, prompt, defaultNo)) { - c.untap(); - } - } else { //computer - //if it is controlling something by staying tapped, leave it tapped - //if not, untap it - if (c.getGainControlTargets().size() > 0) { - ArrayList targets = c.getGainControlTargets(); - boolean untap = true; - for (Card target : targets) { - if(AllZoneUtil.isCardInPlay(target)) untap |= true; - } - if(untap) c.untap(); - } - } - } - } else if ((c.getCounters(Counters.WIND) > 0) && AllZoneUtil.isCardInPlay("Freyalise's Winds")) { - //remove a WIND counter instead of untapping - c.subtractCounter(Counters.WIND, 1); - } else c.untap(); - } - - //Remove temporary keywords - list = AllZoneUtil.getPlayerCardsInPlay(player); - for (Card c : list) { - c.removeExtrinsicKeyword("This card doesn't untap during your next untap step."); - c.removeExtrinsicKeyword("HIDDEN This card doesn't untap during your next untap step."); - } - - //opponent untapping during your untap phase - CardList opp = AllZoneUtil.getPlayerCardsInPlay(player.getOpponent()); - for (Card oppCard : opp) - if (oppCard.hasKeyword("CARDNAME untaps during each other player's untap step.")) - oppCard.untap(); - //end opponent untapping during your untap phase - - if (canOnlyUntapOneLand()) { - if (AllZone.getPhase().getPlayerTurn().isComputer()) { - //search for lands the computer has and only untap 1 - CardList landList = AllZoneUtil.getPlayerLandsInPlay(AllZone.getComputerPlayer()); - landList = landList.filter(AllZoneUtil.tapped); - if (landList.size() > 0) { - landList.get(0).untap(); - } - } else { - Input target = new Input() { - private static final long serialVersionUID = 6653677835629939465L; - - public void showMessage() { - AllZone.getDisplay().showMessage("Select one tapped land to untap"); - ButtonUtil.enableOnlyCancel(); - } - - public void selectButtonCancel() { - stop(); - } - - public void selectCard(Card c, PlayerZone zone) { - if (c.isLand() && zone.is(Constant.Zone.Battlefield) && c.isTapped()) { - c.untap(); - stop(); - } - }//selectCard() - };//Input - CardList landList = AllZoneUtil.getPlayerLandsInPlay(AllZone.getHumanPlayer()); - landList = landList.filter(AllZoneUtil.tapped); - if (landList.size() > 0) { - AllZone.getInputControl().setInput(target); - } - } - } - if (AllZoneUtil.isCardInPlay("Damping Field") || AllZoneUtil.isCardInPlay("Imi Statue")) { - if (AllZone.getPhase().getPlayerTurn().isComputer()) { - CardList artList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - artList = artList.filter(AllZoneUtil.artifacts); - artList = artList.filter(AllZoneUtil.tapped); - if (artList.size() > 0) { - CardFactoryUtil.AI_getBestArtifact(artList).untap(); - } - } else { - Input target = new Input() { - private static final long serialVersionUID = 5555427219659889707L; - - public void showMessage() { - AllZone.getDisplay().showMessage("Select one tapped artifact to untap"); - ButtonUtil.enableOnlyCancel(); - } - - public void selectButtonCancel() { - stop(); - } - - public void selectCard(Card c, PlayerZone zone) { - if (c.isArtifact() && zone.is(Constant.Zone.Battlefield) - && c.getController().isHuman()) { - c.untap(); - stop(); - } - }//selectCard() - };//Input - CardList artList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - artList = artList.filter(AllZoneUtil.artifacts); - artList = artList.filter(AllZoneUtil.tapped); - if (artList.size() > 0) { - AllZone.getInputControl().setInput(target); - } - } - } - if ((AllZoneUtil.isCardInPlay("Smoke") || AllZoneUtil.isCardInPlay("Stoic Angel"))) { - if (AllZone.getPhase().getPlayerTurn().isComputer()) { - CardList creatures = AllZoneUtil.getCreaturesInPlay(AllZone.getComputerPlayer()); - creatures = creatures.filter(AllZoneUtil.tapped); - if (creatures.size() > 0) { - creatures.get(0).untap(); - } - } else { - Input target = new Input() { - private static final long serialVersionUID = 5555427219659889707L; - - public void showMessage() { - AllZone.getDisplay().showMessage("Select one creature to untap"); - ButtonUtil.enableOnlyCancel(); - } - - public void selectButtonCancel() { - stop(); - } - - public void selectCard(Card c, PlayerZone zone) { - if (c.isCreature() && zone.is(Constant.Zone.Battlefield) - && c.getController().isHuman()) { - c.untap(); - stop(); - } - }//selectCard() - };//Input - CardList creatures = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer()); - creatures = creatures.filter(AllZoneUtil.tapped); - if (creatures.size() > 0) { - AllZone.getInputControl().setInput(target); - } - } - } - }//end doUntap - - - /** - *

canUntap.

- * - * @param c a {@link forge.Card} object. - * @return a boolean. - */ - public static boolean canUntap(Card c) { - - if (c.hasKeyword("CARDNAME doesn't untap during your untap step.") - || c.hasKeyword("This card doesn't untap during your next untap step.")) return false; - - CardList allp = AllZoneUtil.getCardsInPlay(); - for (Card ca : allp) { - if (ca.hasStartOfKeyword("Permanents don't untap during their controllers' untap steps")) { - int KeywordPosition = ca.getKeywordPosition("Permanents don't untap during their controllers' untap steps"); - String parse = ca.getKeyword().get(KeywordPosition).toString(); - String k[] = parse.split(":"); - final String restrictions[] = k[1].split(","); - final Card card = ca; - if (c.isValidCard(restrictions, card.getController(), card)) return false; - } - } // end of Permanents don't untap during their controllers' untap steps - - return true; - } - - - /** - *

canOnlyUntapOneLand.

- * - * @return a boolean. - */ - private static boolean canOnlyUntapOneLand() { - //Winter Orb was given errata so it no longer matters if it's tapped or not - if (AllZoneUtil.getCardsInPlay("Winter Orb").size() > 0) - return true; - - if (AllZoneUtil.getPlayerCardsInPlay(AllZone.getPhase().getPlayerTurn(), "Mungha Wurm").size() > 0) - return true; - - return false; - } - - // ******* UPKEEP PHASE ***** - /** - *

handleUpkeep.

- */ - public static void handleUpkeep() { - Player turn = AllZone.getPhase().getPlayerTurn(); - if (skipUpkeep()) { - // Slowtrips all say "on the next turn's upkeep" if there is no upkeep next turn, the trigger will never occur. - turn.clearSlowtripList(); - turn.getOpponent().clearSlowtripList(); - AllZone.getPhase().setNeedToNextPhase(true); - return; - } - - AllZone.getUpkeep().executeUntil(turn); - AllZone.getUpkeep().executeAt(); - } - - /** - *

skipUpkeep.

- * - * @return a boolean. - */ - public static boolean skipUpkeep() { - if (AllZoneUtil.isCardInPlay("Eon Hub")) - return true; - - Player turn = AllZone.getPhase().getPlayerTurn(); - - if (AllZoneUtil.getPlayerHand(turn).size() == 0 && AllZoneUtil.isCardInPlay("Gibbering Descent", turn)) - return true; - - return false; - } - - // ******* DRAW PHASE ***** - /** - *

handleDraw.

- */ - public static void handleDraw() { - Player playerTurn = AllZone.getPhase().getPlayerTurn(); - - if (skipDraw(playerTurn)) { - AllZone.getPhase().setNeedToNextPhase(true); - return; - } - - playerTurn.drawCards(1, true); - GameActionUtil.executeDrawStepEffects(); - } - - /** - *

skipDraw.

- * - * @param player a {@link forge.Player} object. - * @return a boolean. - */ - private static boolean skipDraw(Player player) { - // starting player skips his draw - if (AllZone.getPhase().getTurn() == 1) { - return true; - } - - CardList list = AllZoneUtil.getPlayerCardsInPlay(player); - - if (list.containsName("Necropotence") || list.containsName("Yawgmoth's Bargain") || list.containsName("Recycle") || - list.containsName("Dragon Appeasement") || list.containsName("Null Profusion") || list.containsName("Colfenor's Plans") || - list.containsName("Psychic Possession") || list.containsName("Solitary Confinement") || - list.containsName("Symbiotic Deployment")) - return true; - - return false; - } - - // ********* Declare Attackers *********** - - /** - *

verifyCombat.

- */ - public static void verifyCombat() { - AllZone.getCombat().verifyCreaturesInPlay(); - CombatUtil.showCombat(); - } - - /** - *

handleDeclareAttackers.

- */ - public static void handleDeclareAttackers() { - verifyCombat(); - CardList list = new CardList(); - list.addAll(AllZone.getCombat().getAttackers()); - - // TODO move propaganda to happen as the Attacker is Declared - // Remove illegal Propaganda attacks first only for attacking the Player - - int size = list.size(); - for (int i = 0; i < size; i++) { - Card c = list.get(i); - boolean last = (i == size - 1); - CombatUtil.checkPropagandaEffects(c, last); - } - } - - /** - *

handleAttackingTriggers.

- */ - public static void handleAttackingTriggers() { - CardList list = new CardList(); - list.addAll(AllZone.getCombat().getAttackers()); - AllZone.getStack().freezeStack(); - // Then run other Attacker bonuses - //check for exalted: - if (list.size() == 1) { - Player attackingPlayer = AllZone.getCombat().getAttackingPlayer(); - - CardList exalted = AllZoneUtil.getPlayerCardsInPlay(attackingPlayer); - exalted = exalted.getKeyword("Exalted"); - - if (exalted.size() > 0) CombatUtil.executeExaltedAbility(list.get(0), exalted.size()); - // Make sure exalted effects get applied only once per combat - - } - - for (Card c : list) - CombatUtil.checkDeclareAttackers(c); - AllZone.getStack().unfreezeStack(); - } - - /** - *

handleDeclareBlockers.

- */ - public static void handleDeclareBlockers() { - verifyCombat(); - - AllZone.getStack().freezeStack(); - - AllZone.getCombat().setUnblocked(); - - CardList list = new CardList(); - list.addAll(AllZone.getCombat().getAllBlockers()); - - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return !c.getCreatureBlockedThisCombat(); - } - }); - - CardList attList = new CardList(); - attList.addAll(AllZone.getCombat().getAttackers()); - - CombatUtil.checkDeclareBlockers(list); - - for (Card a : attList) { - CardList blockList = AllZone.getCombat().getBlockers(a); - for (Card b : blockList) - CombatUtil.checkBlockedAttackers(a, b); - } - - AllZone.getStack().unfreezeStack(); - CombatUtil.showCombat(); - } - - - // ***** Combat Utility ********** - // TODO: the below functions should be removed and the code blocks that use them should instead use SA_Restriction - /** - *

isBeforeAttackersAreDeclared.

- * - * @return a boolean. - */ - public static boolean isBeforeAttackersAreDeclared() { - String phase = AllZone.getPhase().getPhase(); - return phase.equals(Constant.Phase.Untap) || phase.equals(Constant.Phase.Upkeep) - || phase.equals(Constant.Phase.Draw) || phase.equals(Constant.Phase.Main1) - || phase.equals(Constant.Phase.Combat_Begin); - } -} diff --git a/src/forge/Player.java b/src/forge/Player.java deleted file mode 100644 index f1f456ef1ea..00000000000 --- a/src/forge/Player.java +++ /dev/null @@ -1,1856 +0,0 @@ -package forge; - -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.mana.ManaPool; -import forge.card.spellability.Ability; -import forge.card.spellability.SpellAbility; - -import javax.swing.*; -import java.util.*; - - -/** - *

Abstract Player class.

- * - * @author Forge - * @version $Id: $ - */ -public abstract class Player extends MyObservable { - protected String name; - protected int poisonCounters; - protected int life; - protected int assignedDamage; - protected int preventNextDamage; - protected int numPowerSurgeLands; - - protected boolean altWin = false; - protected String winCondition = ""; - protected boolean altLose = false; - protected String loseCondition = ""; - - protected int nTurns = 0; - protected boolean skipNextUntap = false; - - protected int maxLandsToPlay = 1; - protected int numLandsPlayed = 0; - - protected Card lastDrawnCard; - protected int numDrawnThisTurn = 0; - protected CardList slowtripList = new CardList(); - - protected ArrayList keywords = new ArrayList(); - - protected ManaPool manaPool = null; - - protected Object mustAttackEntity = null; - - /** - *

Constructor for Player.

- * - * @param myName a {@link java.lang.String} object. - */ - public Player(String myName) { - this(myName, 20, 0); - } - - /** - *

Constructor for Player.

- * - * @param myName a {@link java.lang.String} object. - * @param myLife a int. - * @param myPoisonCounters a int. - */ - public Player(String myName, int myLife, int myPoisonCounters) { - reset(); - - name = myName; - life = myLife; - poisonCounters = myPoisonCounters; - } - - /** - *

reset.

- */ - public void reset() { - life = 20; - poisonCounters = 0; - assignedDamage = 0; - preventNextDamage = 0; - lastDrawnCard = null; - numDrawnThisTurn = 0; - slowtripList = new CardList(); - nTurns = 0; - altWin = false; - altLose = false; - winCondition = ""; - loseCondition = ""; - maxLandsToPlay = 1; - numLandsPlayed = 0; - - handSizeOperations = new ArrayList(); - keywords.clear(); - manaPool = new ManaPool(this); - - this.updateObservers(); - } - - /** - *

Getter for the field name.

- * - * @return a {@link java.lang.String} object. - */ - public String getName() { - return name; - } - - /** - *

isHuman.

- * - * @return a boolean. - */ - public abstract boolean isHuman(); - - /** - *

isComputer.

- * - * @return a boolean. - */ - public abstract boolean isComputer(); - - /** - *

isPlayer.

- * - * @param p1 a {@link forge.Player} object. - * @return a boolean. - */ - public abstract boolean isPlayer(Player p1); - - /** - *

getOpponent.

- * - * @return a {@link forge.Player} object. - */ - public abstract Player getOpponent(); - - ////////////////////////// - // - // methods for manipulating life - // - ////////////////////////// - - /** - *

Setter for the field life.

- * - * @param newLife a int. - * @param source a {@link forge.Card} object. - * @return a boolean. - */ - public boolean setLife(final int newLife, final Card source) { - boolean change = false; - //rule 118.5 - if (life > newLife) { - change = loseLife(life - newLife, source); - } else if (newLife > life) { - change = gainLife(newLife - life, source); - } else { - //life == newLife - change = false; - } - this.updateObservers(); - return change; - } - - /** - *

Getter for the field life.

- * - * @return a int. - */ - public int getLife() { - return life; - } - - /** - *

addLife.

- * - * @param toAdd a int. - */ - private void addLife(final int toAdd) { - life += toAdd; - this.updateObservers(); - } - - /** - *

gainLife.

- * - * @param toGain a int. - * @param source a {@link forge.Card} object. - * @return a boolean. - */ - public boolean gainLife(final int toGain, final Card source) { - boolean newLifeSet = false; - if (!canGainLife()) return false; - int lifeGain = toGain; - - if (AllZoneUtil.isCardInPlay("Boon Reflection", this)) { - int amount = AllZoneUtil.getCardsInPlay("Boon Reflection").size(); - for (int i = 0; i < amount; i++) - lifeGain += lifeGain; - } - - if (lifeGain > 0) { - if (AllZoneUtil.isCardInPlay("Lich", this)) { - //draw cards instead of gain life - drawCards(lifeGain); - newLifeSet = false; - } else { - addLife(lifeGain); - newLifeSet = true; - this.updateObservers(); - - //Run triggers - HashMap runParams = new HashMap(); - runParams.put("Player", this); - runParams.put("LifeAmount", lifeGain); - AllZone.getTriggerHandler().runTrigger("LifeGained", runParams); - } - } else System.out.println("Player - trying to gain negative or 0 life"); - - return newLifeSet; - } - - /** - *

canGainLife.

- * - * @return a boolean. - */ - public boolean canGainLife() { - if (AllZoneUtil.isCardInPlay("Sulfuric Vortex") || AllZoneUtil.isCardInPlay("Leyline of Punishment") || - AllZoneUtil.isCardInPlay("Platinum Emperion", this) || AllZoneUtil.isCardInPlay("Forsaken Wastes")) - return false; - return true; - } - - /** - *

loseLife.

- * - * @param toLose a int. - * @param c a {@link forge.Card} object. - * @return a boolean. - */ - public boolean loseLife(final int toLose, final Card c) { - boolean newLifeSet = false; - if (!canLoseLife()) return false; - if (toLose > 0) { - subtractLife(toLose); - newLifeSet = true; - this.updateObservers(); - } else if (toLose == 0) { - //Rule 118.4 - //this is for players being able to pay 0 life - //nothing to do - } else System.out.println("Player - trying to lose positive life"); - - //Run triggers - HashMap runParams = new HashMap(); - runParams.put("Player", this); - runParams.put("LifeAmount", toLose); - AllZone.getTriggerHandler().runTrigger("LifeLost", runParams); - - return newLifeSet; - } - - /** - *

canLoseLife.

- * - * @return a boolean. - */ - public boolean canLoseLife() { - if (AllZoneUtil.isCardInPlay("Platinum Emperion", this)) return false; - return true; - } - - /** - *

subtractLife.

- * - * @param toSub a int. - */ - private void subtractLife(final int toSub) { - life -= toSub; - this.updateObservers(); - } - - /** - *

canPayLife.

- * - * @param lifePayment a int. - * @return a boolean. - */ - public boolean canPayLife(int lifePayment) { - if (life < lifePayment) return false; - if (lifePayment > 0 && AllZoneUtil.isCardInPlay("Platinum Emperion", this)) return false; - return true; - } - - /** - *

payLife.

- * - * @param lifePayment a int. - * @param source a {@link forge.Card} object. - * @return a boolean. - */ - public boolean payLife(int lifePayment, Card source) { - if (!canPayLife(lifePayment)) return false; - //rule 118.8 - if (life >= lifePayment) { - return loseLife(lifePayment, source); - } - - return false; - } - - ////////////////////////// - // - // methods for handling damage - // - ////////////////////////// - - /** - *

addDamage.

- * - * @param damage a int. - * @param source a {@link forge.Card} object. - */ - public void addDamage(final int damage, final Card source) { - int damageToDo = damage; - - damageToDo = replaceDamage(damageToDo, source, false); - damageToDo = preventDamage(damageToDo, source, false); - - addDamageAfterPrevention(damageToDo, source, false); - } - - /** - *

addDamageWithoutPrevention.

- * - * @param damage a int. - * @param source a {@link forge.Card} object. - */ - public void addDamageWithoutPrevention(final int damage, final Card source) { - int damageToDo = damage; - - damageToDo = replaceDamage(damageToDo, source, false); - - addDamageAfterPrevention(damageToDo, source, false); - } - - //This function handles damage after replacement and prevention effects are applied - /** - *

addDamageAfterPrevention.

- * - * @param damage a int. - * @param source a {@link forge.Card} object. - * @param isCombat a boolean. - */ - public void addDamageAfterPrevention(final int damage, final Card source, final boolean isCombat) { - int damageToDo = damage; - - if (source.hasKeyword("Infect")) { - addPoisonCounters(damageToDo); - } else { - //Worship does not reduce the damage dealt but changes the effect of the damage - if (PlayerUtil.worshipFlag(this) && life <= damageToDo) { - loseLife(Math.min(damageToDo, life - 1), source); - } else - //rule 118.2. Damage dealt to a player normally causes that player to lose that much life. - loseLife(damageToDo, source); - } - if (damageToDo > 0) { - addAssignedDamage(damageToDo); - GameActionUtil.executeDamageDealingEffects(source, damageToDo); - GameActionUtil.executeDamageToPlayerEffects(this, source, damageToDo); - - //Run triggers - HashMap runParams = new HashMap(); - runParams.put("DamageSource", source); - runParams.put("DamageTarget", this); - runParams.put("DamageAmount", damageToDo); - runParams.put("IsCombatDamage", isCombat); - AllZone.getTriggerHandler().runTrigger("DamageDone", runParams); - } - } - - /** - *

predictDamage.

- * - * @param damage a int. - * @param source a {@link forge.Card} object. - * @param isCombat a boolean. - * @return a int. - */ - public int predictDamage(final int damage, final Card source, final boolean isCombat) { - - int restDamage = damage; - - restDamage = staticReplaceDamage(restDamage, source, isCombat); - restDamage = staticDamagePrevention(restDamage, source, isCombat); - - return restDamage; - } - - //This should be also usable by the AI to forecast an effect (so it must not change the game state) - /** - *

staticDamagePrevention.

- * - * @param damage a int. - * @param source a {@link forge.Card} object. - * @param isCombat a boolean. - * @return a int. - */ - public int staticDamagePrevention(final int damage, final Card source, final boolean isCombat) { - - if (AllZoneUtil.isCardInPlay("Leyline of Punishment")) return damage; - - int restDamage = damage; - - if (isCombat) { - if (source.hasKeyword("Prevent all combat damage that would be dealt to and dealt by CARDNAME.")) return 0; - if (source.hasKeyword("Prevent all combat damage that would be dealt by CARDNAME.")) return 0; - } - if (source.hasKeyword("Prevent all damage that would be dealt to and dealt by CARDNAME.")) return 0; - if (source.hasKeyword("Prevent all damage that would be dealt by CARDNAME.")) return 0; - if (AllZoneUtil.isCardInPlay("Purity", this) && !isCombat) return 0; - - //stPreventDamage - CardList allp = AllZoneUtil.getCardsInPlay(); - for (Card ca : allp) { - if (ca.hasStartOfKeyword("stPreventDamage")) { - //syntax stPreventDamage:[Who is protected(You/Player/ValidCards)]:[ValidSource]:[Amount/All] - int KeywordPosition = ca.getKeywordPosition("stPreventDamage"); - String parse = ca.getKeyword().get(KeywordPosition).toString(); - String k[] = parse.split(":"); - - final Card card = ca; - if (k[1].equals("Player") || (k[1].equals("You") && card.getController().isPlayer(this))) { - final String restrictions[] = k[2].split(","); - if (source.isValidCard(restrictions, card.getController(), card)) { - if (k[3].equals("All")) return 0; - restDamage = restDamage - Integer.valueOf(k[3]); - } - } - } - } //stPreventDamage - - //specific cards - if (AllZoneUtil.isCardInPlay("Spirit of Resistance", this)) { - if (AllZoneUtil.getPlayerColorInPlay(this, Constant.Color.Black).size() > 0 - && AllZoneUtil.getPlayerColorInPlay(this, Constant.Color.Blue).size() > 0 - && AllZoneUtil.getPlayerColorInPlay(this, Constant.Color.Green).size() > 0 - && AllZoneUtil.getPlayerColorInPlay(this, Constant.Color.Red).size() > 0 - && AllZoneUtil.getPlayerColorInPlay(this, Constant.Color.White).size() > 0) { - return 0; - } - } - if (restDamage > 0) - return restDamage; - else return 0; - } - - //This should be also usable by the AI to forecast an effect (so it must not change the game state) - /** - *

staticReplaceDamage.

- * - * @param damage a int. - * @param source a {@link forge.Card} object. - * @param isCombat a boolean. - * @return a int. - */ - public int staticReplaceDamage(final int damage, Card source, boolean isCombat) { - - int restDamage = damage; - - if (AllZoneUtil.isCardInPlay("Sulfuric Vapors") && source.isSpell() && source.isRed()) { - int amount = AllZoneUtil.getCardsInPlay("Sulfuric Vapors").size(); - for (int i = 0; i < amount; i++) - restDamage += 1; - } - - if (AllZoneUtil.isCardInPlay("Pyromancer's Swath", source.getController()) && (source.isInstant() || source.isSorcery())) { - int amount = AllZoneUtil.getPlayerCardsInPlay(source.getController(), "Pyromancer's Swath").size(); - for (int i = 0; i < amount; i++) - restDamage += 2; - } - - if (AllZoneUtil.isCardInPlay("Furnace of Rath")) { - int amount = AllZoneUtil.getCardsInPlay("Furnace of Rath").size(); - for (int i = 0; i < amount; i++) - restDamage += restDamage; - } - - if (AllZoneUtil.isCardInPlay("Gratuitous Violence", source.getController())) { - int amount = AllZoneUtil.getPlayerCardsInPlay(source.getController(), "Gratuitous Violence").size(); - for (int i = 0; i < amount; i++) - restDamage += restDamage; - } - - if (AllZoneUtil.isCardInPlay("Fire Servant", source.getController()) && source.isRed() - && (source.isInstant() || source.isSorcery())) { - int amount = AllZoneUtil.getPlayerCardsInPlay(source.getController(), "Fire Servant").size(); - for (int i = 0; i < amount; i++) - restDamage += restDamage; - } - - if (AllZoneUtil.isCardInPlay("Benevolent Unicorn") && source.isSpell()) { - int amount = AllZoneUtil.getCardsInPlay("Benevolent Unicorn").size(); - for (int i = 0; i < amount; i++) - if (restDamage > 0) - restDamage -= 1; - } - - if (AllZoneUtil.isCardInPlay("Divine Presence") && restDamage > 3) { - - restDamage = 3; - } - - if (AllZoneUtil.isCardInPlay("Forethought Amulet", this) && (source.isInstant() || source.isSorcery()) && restDamage > 2) { - - restDamage = 2; - } - - return restDamage; - } - - /** - *

replaceDamage.

- * - * @param damage a int. - * @param source a {@link forge.Card} object. - * @param isCombat a boolean. - * @return a int. - */ - public int replaceDamage(final int damage, Card source, boolean isCombat) { - - int restDamage = staticReplaceDamage(damage, source, isCombat); - - if (source.getName().equals("Szadek, Lord of Secrets") && isCombat) { - source.addCounter(Counters.P1P1, restDamage); - for (int i = 0; i < restDamage; i++) { - CardList lib = AllZoneUtil.getPlayerCardsInLibrary(this); - if (lib.size() > 0) { - AllZone.getGameAction().moveToGraveyard(lib.get(0)); - } - } - return 0; - } - - if (AllZoneUtil.isCardInPlay("Crumbling Sanctuary")) { - for (int i = 0; i < restDamage; i++) { - CardList lib = AllZoneUtil.getPlayerCardsInLibrary(this); - if (lib.size() > 0) { - AllZone.getGameAction().exile(lib.get(0)); - } - } - //return so things like Lifelink, etc do not trigger. This is a replacement effect I think. - return 0; - } - - return restDamage; - } - - /** - *

preventDamage.

- * - * @param damage a int. - * @param source a {@link forge.Card} object. - * @param isCombat a boolean. - * @return a int. - */ - public int preventDamage(final int damage, Card source, boolean isCombat) { - - if (AllZoneUtil.isCardInPlay("Leyline of Punishment")) return damage; - - int restDamage = damage; - - // Purity has to stay here because it changes the game state - if (AllZoneUtil.isCardInPlay("Purity", this) && !isCombat) { - gainLife(restDamage, null); - return 0; - } - - restDamage = staticDamagePrevention(restDamage, source, isCombat); - - if (restDamage >= preventNextDamage) { - restDamage = restDamage - preventNextDamage; - preventNextDamage = 0; - } else { - restDamage = 0; - preventNextDamage = preventNextDamage - restDamage; - } - - return restDamage; - } - - /** - *

Setter for the field assignedDamage.

- * - * @param n a int. - */ - public void setAssignedDamage(int n) { - assignedDamage = n; - } - - /** - *

addAssignedDamage.

- * - * @param n a int. - */ - public void addAssignedDamage(int n) { - assignedDamage += n; - } - - /** - *

Getter for the field assignedDamage.

- * - * @return a int. - */ - public int getAssignedDamage() { - return assignedDamage; - } - - /** - *

addCombatDamage.

- * - * @param damage a int. - * @param source a {@link forge.Card} object. - */ - public void addCombatDamage(final int damage, final Card source) { - - int damageToDo = damage; - - damageToDo = replaceDamage(damageToDo, source, true); - damageToDo = preventDamage(damageToDo, source, true); - - addDamageAfterPrevention(damageToDo, source, true); //damage prevention is already checked - - if (damageToDo > 0) { - GameActionUtil.executeCombatDamageToPlayerEffects(this, source, damageToDo); - } - } - - ////////////////////////// - // - // methods for handling Damage Prevention - // - ////////////////////////// - - //PreventNextDamage - /** - *

Setter for the field preventNextDamage.

- * - * @param n a int. - */ - public void setpreventNextDamage(int n) { - preventNextDamage = n; - } - - /** - *

Getter for the field preventNextDamage.

- * - * @return a int. - */ - public int getPreventNextDamage() { - return preventNextDamage; - } - - /** - *

addPreventNextDamage.

- * - * @param n a int. - */ - public void addPreventNextDamage(int n) { - preventNextDamage += n; - } - - /** - *

subtractPreventNextDamage.

- * - * @param n a int. - */ - public void subtractPreventNextDamage(int n) { - preventNextDamage -= n; - } - - /** - *

resetPreventNextDamage.

- */ - public void resetPreventNextDamage() { - preventNextDamage = 0; - } - - ////////////////////////// - // - // methods for handling Poison counters - // - ////////////////////////// - - /** - *

addPoisonCounters.

- * - * @param num a int. - */ - public void addPoisonCounters(int num) { - poisonCounters += num; - this.updateObservers(); - } - - /** - *

Setter for the field poisonCounters.

- * - * @param num a int. - */ - public void setPoisonCounters(int num) { - poisonCounters = num; - this.updateObservers(); - } - - /** - *

Getter for the field poisonCounters.

- * - * @return a int. - */ - public int getPoisonCounters() { - return poisonCounters; - } - - /** - *

subtractPoisonCounters.

- * - * @param num a int. - */ - public void subtractPoisonCounters(int num) { - poisonCounters -= num; - this.updateObservers(); - } - - public ArrayList getKeywords() { - return keywords; - } - - public void setKeywords(ArrayList keywords) { - this.keywords = keywords; - } - - public void addKeyword(String keyword){ - this.keywords.add(keyword); - } - - public boolean hasKeyword(String keyword){ - return this.keywords.contains(keyword); - } - - /** - *

canTarget.

- * - * @param card a {@link forge.Card} object. - * @return a boolean. - */ - public boolean canTarget(SpellAbility sa) { - if (hasKeyword("Shroud") || - (!this.isPlayer(sa.getActivatingPlayer()) && hasKeyword("Hexproof"))) - return false; - - return true; - } - - /** - *

canPlaySpells.

- * - * @return a boolean. - */ - public boolean canCastSpells() { - return !this.keywords.contains("Can't cast spells"); - } - - /** - *

canPlayAbilities.

- * - * @return a boolean. - */ - public boolean canActivateAbilities() { - return !this.keywords.contains("Can't activate abilities"); - } - - /** - *

getCards.

- * - * @param zone a {@link forge.PlayerZone} object. - * @return a {@link forge.CardList} object. - */ - public CardList getCards(PlayerZone zone) { - //TODO - return new CardList(); - } - - - //////////////////////////////// - /// - /// replaces AllZone.getGameAction().draw* methods - /// - //////////////////////////////// - - /** - *

mayDrawCard.

- * - * @return a CardList of cards actually drawn - */ - public abstract CardList mayDrawCard(); - - /** - *

mayDrawCards.

- * - * @param numCards a int. - * @return a CardList of cards actually drawn - */ - public abstract CardList mayDrawCards(int numCards); - - /** - *

drawCard.

- * - * @return a CardList of cards actually drawn - */ - public CardList drawCard() { - return drawCards(1); - } - - /** - *

drawCards.

- * - * @return a CardList of cards actually drawn - */ - public CardList drawCards() { - return drawCards(1); - } - - /** - *

dredge.

- * - * @return a boolean. - */ - public abstract boolean dredge(); - - /** - *

drawCards.

- * - * @param n a int. - * @return a CardList of cards actually drawn - */ - public CardList drawCards(int n) { - return drawCards(n, false); - } - - /** - *

drawCards.

- * - * @param n a int. - * @param firstFromDraw true if this is the card drawn from that player's draw step each turn - * @return a CardList of cards actually drawn - */ - public CardList drawCards(int n, boolean firstFromDraw) { - CardList drawn = new CardList(); - for (int i = 0; i < n; i++) { - - // TODO: multiple replacements need to be selected by the controller - if (getDredge().size() != 0) - if(dredge()) - continue; - - if(!firstFromDraw && AllZoneUtil.isCardInPlay("Chains of Mephistopheles")) { - if(AllZoneUtil.getPlayerHand(this).size() > 0) { - if(isHuman()) discard_Chains_of_Mephistopheles(); - else { //Computer - discard(1, null, false); - //true causes this code not to be run again - drawn.addAll(drawCards(1, true)); - } - } - else { - mill(1); - } - } - else { - drawn.addAll(doDraw()); - } - } - return drawn; - } - - /** - *

doDraw.

- * - * @return a CardList of cards actually drawn - */ - private CardList doDraw() { - CardList drawn = new CardList(); - PlayerZone library = AllZone.getZone(Constant.Zone.Library, this); - if (library.size() != 0) { - Card c = library.get(0); - c = AllZone.getGameAction().moveToHand(c); - - setLastDrawnCard(c); - c.setDrawnThisTurn(true); - numDrawnThisTurn++; - drawn.add(c); - - //Run triggers - HashMap runParams = new HashMap(); - runParams.put("Card", c); - AllZone.getTriggerHandler().runTrigger("Drawn", runParams); - } - //lose: - else if (!Constant.Runtime.DevMode[0] || AllZone.getDisplay().canLoseByDecking()) { - // if devMode is off, or canLoseByDecking is Enabled, run Lose Condition - if (altLoseConditionMet("Milled")) { - AllZone.getGameAction().checkStateEffects(); - } - } - return drawn; - } - - /** - *

getDredge.

- * - * @return a {@link forge.CardList} object. - */ - protected CardList getDredge() { - CardList dredge = new CardList(); - CardList cl = AllZoneUtil.getPlayerGraveyard(this); - - for (Card c : cl) { - ArrayList kw = c.getKeyword(); - for (int i = 0; i < kw.size(); i++) { - if (kw.get(i).toString().startsWith("Dredge")) { - if (AllZoneUtil.getPlayerCardsInLibrary(this).size() >= getDredgeNumber(c)) dredge.add(c); - } - } - } - return dredge; - }//hasDredge() - - /** - *

getDredgeNumber.

- * - * @param c a {@link forge.Card} object. - * @return a int. - */ - protected int getDredgeNumber(Card c) { - ArrayList a = c.getKeyword(); - for (int i = 0; i < a.size(); i++) - if (a.get(i).toString().startsWith("Dredge")) { - String s = a.get(i).toString(); - return Integer.parseInt("" + s.charAt(s.length() - 1)); - } - - throw new RuntimeException("Input_Draw : getDredgeNumber() card doesn't have dredge - " + c.getName()); - }//getDredgeNumber() - - /** - *

resetNumDrawnThisTurn.

- */ - public void resetNumDrawnThisTurn() { - numDrawnThisTurn = 0; - } - - /** - *

Getter for the field numDrawnThisTurn.

- * - * @return a int. - */ - public int getNumDrawnThisTurn() { - return numDrawnThisTurn; - } - - //////////////////////////////// - /// - /// replaces AllZone.getGameAction().discard* methods - /// - //////////////////////////////// - - protected abstract void discard_Chains_of_Mephistopheles(); - - /** - *

discard.

- * - * @param num a int. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param duringResolution a boolean. - * @return a {@link forge.CardList} object. - */ - public abstract CardList discard(final int num, final SpellAbility sa, boolean duringResolution); - - /** - *

discard.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link forge.CardList} object. - */ - public CardList discard(final SpellAbility sa) { - return discard(1, sa, false); - } - - /** - *

discard.

- * - * @param c a {@link forge.Card} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public void discard(Card c, SpellAbility sa) { - doDiscard(c, sa); - } - - /** - *

doDiscard.

- * - * @param c a {@link forge.Card} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - protected void doDiscard(final Card c, final SpellAbility sa) { - // TODO: This line should be moved inside CostPayment somehow - if (sa != null) { - sa.addCostToHashList(c, "Discarded"); - } - - /* - * When a spell or ability an opponent controls causes you - * to discard Psychic Purge, that player loses 5 life. - */ - if (c.getName().equals("Psychic Purge")) { - if (null != sa && !sa.getSourceCard().getController().equals(this)) { - SpellAbility ability = new Ability(c, "") { - public void resolve() { - sa.getSourceCard().getController().loseLife(5, c); - } - }; - ability.setStackDescription(c.getName() + " - " + - sa.getSourceCard().getController() + " loses 5 life."); - AllZone.getStack().add(ability); - } - } - - // necro disrupts madness - if (AllZoneUtil.getPlayerCardsInPlay(c.getOwner(), "Necropotence").size() > 0) { - AllZone.getGameAction().exile(c); - return; - } - - AllZone.getGameAction().discard_madness(c); - - if ((c.hasKeyword("If a spell or ability an opponent controls causes you to discard CARDNAME, put it onto the battlefield instead of putting it into your graveyard.") - || c.hasKeyword("If a spell or ability an opponent controls causes you to discard CARDNAME, put it onto the battlefield with two +1/+1 counters on it instead of putting it into your graveyard.")) - && !c.getController().equals(sa.getSourceCard().getController())) { - AllZone.getGameAction().discard_PutIntoPlayInstead(c); - } else if (c.hasKeyword("If a spell or ability an opponent controls causes you to discard CARDNAME, return it to your hand.")) { - ; - } else { - AllZone.getGameAction().moveToGraveyard(c); - } - - //Run triggers - Card cause = null; - if (sa != null) { - cause = sa.getSourceCard(); - } - HashMap runParams = new HashMap(); - runParams.put("Player", this); - runParams.put("Card", c); - runParams.put("Cause", cause); - AllZone.getTriggerHandler().runTrigger("Discarded", runParams); - - }//end doDiscard - - /** - *

discardHand.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public void discardHand(SpellAbility sa) { - CardList list = AllZoneUtil.getPlayerHand(this); - discardRandom(list.size(), sa); - } - - /** - *

discardRandom.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public void discardRandom(SpellAbility sa) { - discardRandom(1, sa); - } - - /** - *

discardRandom.

- * - * @param num a int. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public void discardRandom(final int num, final SpellAbility sa) { - for (int i = 0; i < num; i++) { - CardList list = AllZoneUtil.getPlayerHand(this); - if (list.size() != 0) - doDiscard(CardUtil.getRandom(list.toArray()), sa); - } - } - - /** - *

discardUnless.

- * - * @param num a int. - * @param uType a {@link java.lang.String} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public abstract void discardUnless(int num, String uType, SpellAbility sa); - - /** - *

mill.

- * - * @param n a int. - */ - public CardList mill(int n) { - return mill(n, Constant.Zone.Graveyard); - } - - /** - *

mill.

- * - * @param n a int. - * @param zone a {@link java.lang.String} object. - */ - public CardList mill(int n, String zone) { - CardList lib = AllZoneUtil.getPlayerCardsInLibrary(this); - CardList milled = new CardList(); - - int max = Math.min(n, lib.size()); - - PlayerZone destination = AllZone.getZone(zone, this); - - for (int i = 0; i < max; i++) { - milled.add(AllZone.getGameAction().moveTo(destination, lib.get(i))); - } - - return milled; - } - - /** - *

handToLibrary.

- * - * @param numToLibrary a int. - * @param libPos a {@link java.lang.String} object. - */ - public abstract void handToLibrary(final int numToLibrary, String libPos); - - //////////////////////////////// - /** - *

shuffle.

- */ - public void shuffle() { - PlayerZone library = AllZone.getZone(Constant.Zone.Library, this); - Card c[] = AllZoneUtil.getPlayerCardsInLibrary(this).toArray(); - - if (c.length <= 1) return; - - ArrayList list = new ArrayList(Arrays.asList(c)); - //overdone but wanted to make sure it was really random - Random random = MyRandom.random; - Collections.shuffle(list, random); - Collections.shuffle(list, random); - Collections.shuffle(list, random); - Collections.shuffle(list, random); - Collections.shuffle(list, random); - Collections.shuffle(list, random); - - Object o; - for (int i = 0; i < list.size(); i++) { - o = list.remove(random.nextInt(list.size())); - list.add(random.nextInt(list.size()), o); - } - - Collections.shuffle(list, random); - Collections.shuffle(list, random); - Collections.shuffle(list, random); - Collections.shuffle(list, random); - Collections.shuffle(list, random); - Collections.shuffle(list, random); - - - list.toArray(c); - library.setCards(c); - - //Run triggers - HashMap runParams = new HashMap(); - runParams.put("Player", this); - AllZone.getTriggerHandler().runTrigger("Shuffled", runParams); - - }//shuffle - //////////////////////////////// - - //////////////////////////////// - /** - *

doScry.

- * - * @param topN a {@link forge.CardList} object. - * @param N a int. - */ - protected abstract void doScry(CardList topN, int N); - - /** - *

scry.

- * - * @param numScry a int. - */ - public void scry(int numScry) { - CardList topN = new CardList(); - PlayerZone library = AllZone.getZone(Constant.Zone.Library, this); - numScry = Math.min(numScry, library.size()); - for (int i = 0; i < numScry; i++) { - topN.add(library.get(i)); - } - doScry(topN, topN.size()); - } - /////////////////////////////// - - /** - *

playLand.

- * - * @param land a {@link forge.Card} object. - */ - public void playLand(Card land) { - if (canPlayLand()) { - AllZone.getGameAction().moveToPlay(land); - CardFactoryUtil.playLandEffects(land); - numLandsPlayed++; - - //check state effects for static animate (Living Lands, Conversion, etc...) - AllZone.getGameAction().checkStateEffects(); - - //Run triggers - HashMap runParams = new HashMap(); - runParams.put("Card", land); - AllZone.getTriggerHandler().runTrigger("LandPlayed", runParams); - } - - AllZone.getStack().unfreezeStack(); - } - - /** - *

canPlayLand.

- * - * @return a boolean. - */ - public boolean canPlayLand() { - return Phase.canCastSorcery(this) && (numLandsPlayed < maxLandsToPlay || - AllZoneUtil.getPlayerCardsInPlay(this, "Fastbond").size() > 0); - } - - public ManaPool getManaPool() { - return manaPool; - } - - /////////////////////////////// - //// - //// properties about the player and his/her cards/game status - //// - /////////////////////////////// - /** - *

hasPlaneswalker.

- * - * @return a boolean. - */ - public boolean hasPlaneswalker() { - return null != getPlaneswalker(); - } - - /** - *

getPlaneswalker.

- * - * @return a {@link forge.Card} object. - */ - public Card getPlaneswalker() { - CardList c = AllZoneUtil.getPlayerTypeInPlay(this, "Planeswalker"); - if (null != c && c.size() > 0) return c.get(0); - else return null; - } - - /** - *

Getter for the field numPowerSurgeLands.

- * - * @return a int. - */ - public int getNumPowerSurgeLands() { - return numPowerSurgeLands; - } - - /** - *

Setter for the field numPowerSurgeLands.

- * - * @param n a int. - * @return a int. - */ - public int setNumPowerSurgeLands(int n) { - numPowerSurgeLands = n; - return numPowerSurgeLands; - } - - /** - *

Getter for the field lastDrawnCard.

- * - * @return a {@link forge.Card} object. - */ - public Card getLastDrawnCard() { - return lastDrawnCard; - } - - /** - *

Setter for the field lastDrawnCard.

- * - * @param c a {@link forge.Card} object. - * @return a {@link forge.Card} object. - */ - public Card setLastDrawnCard(Card c) { - lastDrawnCard = c; - return lastDrawnCard; - } - - /** - *

resetLastDrawnCard.

- * - * @return a {@link forge.Card} object. - */ - public Card resetLastDrawnCard() { - Card old = lastDrawnCard; - lastDrawnCard = null; - return old; - } - - /** - *

skipNextUntap.

- * - * @return a boolean. - */ - public boolean skipNextUntap() { - return skipNextUntap; - } - - /** - *

Setter for the field skipNextUntap.

- * - * @param b a boolean. - */ - public void setSkipNextUntap(boolean b) { - skipNextUntap = b; - } - - /** - *

Getter for the field slowtripList.

- * - * @return a {@link forge.CardList} object. - */ - public CardList getSlowtripList() { - return slowtripList; - } - - /** - *

clearSlowtripList.

- */ - public void clearSlowtripList() { - slowtripList.clear(); - } - - /** - *

addSlowtripList.

- * - * @param card a {@link forge.Card} object. - */ - public void addSlowtripList(Card card) { - slowtripList.add(card); - } - - /** - *

getTurn.

- * - * @return a int. - */ - public int getTurn() { - return nTurns; - } - - /** - *

incrementTurn.

- */ - public void incrementTurn() { - nTurns++; - } - - //////////////////////////////// - /** - *

sacrificePermanent.

- * - * @param prompt a {@link java.lang.String} object. - * @param choices a {@link forge.CardList} object. - */ - public abstract void sacrificePermanent(String prompt, CardList choices); - - /** - *

sacrificeCreature.

- */ - public void sacrificeCreature() { - CardList choices = AllZoneUtil.getCreaturesInPlay(this); - sacrificePermanent("Select a creature to sacrifice.", choices); - } - - /** - *

sacrificeCreature.

- * - * @param choices a {@link forge.CardList} object. - */ - public void sacrificeCreature(CardList choices) { - sacrificePermanent("Select a creature to sacrifice.", choices); - } - - // Game win/loss - - /** - *

Getter for the field altWin.

- * - * @return a boolean. - */ - public boolean getAltWin() { - return altWin; - } - - /** - *

Getter for the field altLose.

- * - * @return a boolean. - */ - public boolean getAltLose() { - return altLose; - } - - /** - *

Getter for the field winCondition.

- * - * @return a {@link java.lang.String} object. - */ - public String getWinCondition() { - return winCondition; - } - - /** - *

Getter for the field loseCondition.

- * - * @return a {@link java.lang.String} object. - */ - public String getLoseCondition() { - return loseCondition; - } - - /** - *

altWinConditionMet.

- * - * @param s a {@link java.lang.String} object. - */ - public void altWinConditionMet(String s) { - if (cantWin()) { - System.out.println("Tried to win, but currently can't."); - return; - } - altWin = true; - winCondition = s; - } - - /** - *

altLoseConditionMet.

- * - * @param s a {@link java.lang.String} object. - * @return a boolean. - */ - public boolean altLoseConditionMet(String s) { - if (cantLose()) { - System.out.println("Tried to lose, but currently can't."); - return false; - } - altLose = true; - loseCondition = s; - return true; - } - - /** - *

cantLose.

- * - * @return a boolean. - */ - public boolean cantLose() { - CardList list = AllZoneUtil.getPlayerCardsInPlay(this); - list = list.getKeyword("You can't lose the game."); - - if (list.size() > 0) - return true; - - CardList oppList = AllZoneUtil.getPlayerCardsInPlay(getOpponent()); - oppList = oppList.getKeyword("Your opponents can't lose the game."); - - return oppList.size() > 0; - } - - /** - *

cantLoseForZeroOrLessLife.

- * - * @return a boolean. - */ - public boolean cantLoseForZeroOrLessLife() { - CardList list = AllZoneUtil.getPlayerCardsInPlay(this); - list = list.getKeyword("You don't lose the game for having 0 or less life."); - - return list.size() > 0; - } - - /** - *

cantWin.

- * - * @return a boolean. - */ - public boolean cantWin() { - CardList list = AllZoneUtil.getPlayerCardsInPlay(getOpponent()); - list = list.getKeyword("You can't win the game."); - - if (list.size() > 0) - return true; - - CardList oppList = AllZoneUtil.getPlayerCardsInPlay(this); - oppList = oppList.getKeyword("Your opponents can't win the game."); - - return oppList.size() > 0; - } - - /** - *

hasLost.

- * - * @return a boolean. - */ - public boolean hasLost() { - - if (cantLose()) - return false; - - if (altLose) { - return true; - } - - if (poisonCounters >= 10) { - altLoseConditionMet("Poison Counters"); - return true; - } - - if (cantLoseForZeroOrLessLife()) { - return false; - } - - return getLife() <= 0; - } - - - /** - *

hasWon.

- * - * @return a boolean. - */ - public boolean hasWon() { - if (cantWin()) - return false; - - return altWin; - } - - /** - *

hasMetalcraft.

- * - * @return a boolean. - */ - public boolean hasMetalcraft() { - CardList list = AllZoneUtil.getPlayerTypeInPlay(this, "Artifact"); - return list.size() >= 3; - } - - /** - *

hasThreshold.

- * - * @return a boolean. - */ - public boolean hasThreshold() { - CardList grave = AllZoneUtil.getPlayerGraveyard(this); - return grave.size() >= 7; - } - - /** - *

hasHellbent.

- * - * @return a boolean. - */ - public boolean hasHellbent() { - CardList hand = AllZoneUtil.getPlayerHand(this); - return hand.size() == 0; - } - - /** - *

hasLandfall.

- * - * @return a boolean. - */ - public boolean hasLandfall() { - CardList list = ((DefaultPlayerZone) AllZone.getZone("Battlefield", this)).getCardsAddedThisTurn("Any").getType("Land"); - return !list.isEmpty(); - } - - private ArrayList handSizeOperations; - - /** - *

getMaxHandSize.

- * - * @return a int. - */ - public int getMaxHandSize() { - - int ret = 7; - for (int i = 0; i < handSizeOperations.size(); i++) { - if (handSizeOperations.get(i).Mode.equals("=")) { - ret = handSizeOperations.get(i).Amount; - } else if (handSizeOperations.get(i).Mode.equals("+") && ret >= 0) { - ret = ret + handSizeOperations.get(i).Amount; - } else if (handSizeOperations.get(i).Mode.equals("-") && ret >= 0) { - ret = ret - handSizeOperations.get(i).Amount; - if (ret < 0) { - ret = 0; - } - } - } - return ret; - } - - /** - *

sortHandSizeOperations.

- */ - public void sortHandSizeOperations() { - if (handSizeOperations.size() < 2) { - return; - } - - int changes = 1; - - while (changes > 0) { - changes = 0; - for (int i = 1; i < handSizeOperations.size(); i++) { - if (handSizeOperations.get(i).hsTimeStamp < handSizeOperations.get(i - 1).hsTimeStamp) { - HandSizeOp tmp = handSizeOperations.get(i); - handSizeOperations.set(i, handSizeOperations.get(i - 1)); - handSizeOperations.set(i - 1, tmp); - changes++; - } - } - } - } - - /** - *

addHandSizeOperation.

- * - * @param theNew a {@link forge.HandSizeOp} object. - */ - public void addHandSizeOperation(HandSizeOp theNew) { - handSizeOperations.add(theNew); - } - - /** - *

removeHandSizeOperation.

- * - * @param timestamp a int. - */ - public void removeHandSizeOperation(int timestamp) { - for (int i = 0; i < handSizeOperations.size(); i++) { - if (handSizeOperations.get(i).hsTimeStamp == timestamp) { - handSizeOperations.remove(i); - break; - } - } - } - - /** - *

clearHandSizeOperations.

- */ - public void clearHandSizeOperations() { - handSizeOperations.clear(); - } - - /** Constant NextHandSizeStamp=0 */ - private static int NextHandSizeStamp = 0; - - /** - *

getHandSizeStamp.

- * - * @return a int. - */ - public static int getHandSizeStamp() { - return NextHandSizeStamp++; - } - - /** - *

Getter for the field maxLandsToPlay.

- * - * @return a int. - */ - public int getMaxLandsToPlay() { - return maxLandsToPlay; - } - - /** - *

Setter for the field maxLandsToPlay.

- * - * @param n a int. - */ - public void setMaxLandsToPlay(int n) { - maxLandsToPlay = n; - } - - /** - *

addMaxLandsToPlay.

- * - * @param n a int. - */ - public void addMaxLandsToPlay(int n) { - maxLandsToPlay += n; - } - - /** - *

Getter for the field numLandsPlayed.

- * - * @return a int. - */ - public int getNumLandsPlayed() { - return numLandsPlayed; - } - - /** - *

Setter for the field numLandsPlayed.

- * - * @param n a int. - */ - public void setNumLandsPlayed(int n) { - numLandsPlayed = n; - } - - //////////////////////////////// - // - // Clash - // - ///////////////////////////////// - - /** - *

clashWithOpponent.

- * - * @param source a {@link forge.Card} object. - * @return a boolean. - */ - public boolean clashWithOpponent(Card source) { - /* - * Each clashing player reveals the top card of his or - * her library, then puts that card on the top or bottom. - * A player wins if his or her card had a higher mana cost. - * - * Clash you win or win you don't. There is no tie. - */ - Player player = source.getController(); - Player opponent = player.getOpponent(); - String lib = Constant.Zone.Library; - - PlayerZone pLib = AllZone.getZone(lib, player); - PlayerZone oLib = AllZone.getZone(lib, opponent); - - StringBuilder reveal = new StringBuilder(); - - Card pCard = null; - Card oCard = null; - - if (pLib.size() > 0) pCard = pLib.get(0); - if (oLib.size() > 0) oCard = oLib.get(0); - - if (pLib.size() == 0 && oLib.size() == 0) return false; - else if (pLib.size() == 0) { - opponent.clashMoveToTopOrBottom(oCard); - return false; - } else if (oLib.size() == 0) { - player.clashMoveToTopOrBottom(pCard); - return true; - } else { - int pCMC = CardUtil.getConvertedManaCost(pCard); - int oCMC = CardUtil.getConvertedManaCost(oCard); - reveal.append(player).append(" reveals: ").append(pCard.getName()).append(". CMC = ").append(pCMC); - reveal.append("\r\n"); - reveal.append(opponent).append(" reveals: ").append(oCard.getName()).append(". CMC = ").append(oCMC); - reveal.append("\r\n\r\n"); - if (pCMC > oCMC) reveal.append(player).append(" wins clash."); - else reveal.append(player).append(" loses clash."); - JOptionPane.showMessageDialog(null, reveal.toString(), source.getName(), JOptionPane.PLAIN_MESSAGE); - player.clashMoveToTopOrBottom(pCard); - opponent.clashMoveToTopOrBottom(oCard); - //JOptionPane.showMessageDialog(null, reveal.toString(), source.getName(), JOptionPane.PLAIN_MESSAGE); - return pCMC > oCMC; - } - } - - /** - *

clashMoveToTopOrBottom.

- * - * @param c a {@link forge.Card} object. - */ - protected abstract void clashMoveToTopOrBottom(Card c); - - /** - * a Player or Planeswalker that this Player must attack if able in an upcoming combat. - * This is cleared at the end of each combat. - * - * @param the Player or Planeswalker (Card) to attack - * - * @since 1.1.01 - */ - public void setMustAttackEntity(Object o) { - mustAttackEntity = o; - } - - /** - * get the Player object or Card (Planeswalker) object that this Player must attack this combat - * - * @return the Player or Card (Planeswalker) - * - * @since 1.1.01 - */ - public Object getMustAttackEntity() { - return mustAttackEntity; - } - - //////////////////////////////// - // - // generic Object overrides - // - ///////////////////////////////// - - /** {@inheritDoc} */ - @Override - public boolean equals(Object o) { - if (o instanceof Player) { - Player p1 = (Player) o; - return p1.getName().equals(name); - } else return false; - } - - /** {@inheritDoc} */ - @Override - public String toString() { - return name; - } -} diff --git a/src/forge/PlayerUtil.java b/src/forge/PlayerUtil.java deleted file mode 100644 index 459ef43debb..00000000000 --- a/src/forge/PlayerUtil.java +++ /dev/null @@ -1,289 +0,0 @@ -package forge; - -import forge.card.spellability.SpellAbility; -import forge.gui.input.Input; - - -/** - *

PlayerUtil class.

- * - * @author Forge - * @version $Id: $ - */ -public class PlayerUtil { - /** - *

worshipFlag.

- * - * @param player a {@link forge.Player} object. - * @return a boolean. - */ - public static boolean worshipFlag(Player player) { - // Instead of hardcoded Ali from Cairo like cards, it is now a Keyword - CardList list = AllZoneUtil.getPlayerCardsInPlay(player); - list = list.getKeyword("Damage that would reduce your life total to less than 1 reduces it to 1 instead."); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return !c.isFaceDown(); - } - }); - - return list.size() > 0; - } - - /** - *

input_discardNumUnless.

- * - * @param nCards a int. - * @param uType a {@link java.lang.String} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link forge.gui.input.Input} object. - * @since 1.0.15 - */ - public static Input input_discardNumUnless(final int nCards, final String uType, SpellAbility sa) { - final SpellAbility sp = sa; - Input target = new Input() { - private static final long serialVersionUID = 8822292413831640944L; - - int n = 0; - - @Override - public void showMessage() { - if (AllZone.getHumanHand().size() == 0) stop(); - AllZone.getDisplay().showMessage("Select " + (nCards - n) + " cards to discard, unless you discard a " - + uType + "."); - ButtonUtil.disableAll(); - } - - @Override - public void selectButtonCancel() { - stop(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (zone.is(Constant.Zone.Hand)) { - card.getController().discard(card, sp); - n++; - - if (card.isType(uType.toString())) stop(); - - else { - if (n == nCards || AllZone.getHumanHand().size() == 0) stop(); - else - showMessage(); - } - } - } - }; - - return target; - }//input_discardNumUnless - - /** - *

input_discard.

- * - * @param nCards a int. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link forge.gui.input.Input} object. - * @since 1.0.15 - */ - public static Input input_discard(final int nCards, SpellAbility sa) { - final SpellAbility sp = sa; - Input target = new Input() { - private static final long serialVersionUID = -329993322080934435L; - - int n = 0; - - @Override - public void showMessage() { - if (AllZone.getHumanHand().size() == 0) stop(); - if (nCards == 0) stop(); - - AllZone.getDisplay().showMessage("Select a card to discard"); - ButtonUtil.disableAll(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (zone.is(Constant.Zone.Hand)) { - card.getController().discard(card, sp); - n++; - - //in case no more cards in hand - if (n == nCards || AllZone.getHumanHand().size() == 0) stop(); - else - showMessage(); - } - } - }; - return target; - }//input_discard() - - /** - *

input_chainsDiscard.

- * - * @return a {@link forge.gui.input.Input} object. - * @since - */ - public static Input input_chainsDiscard() { - Input target = new Input() { - private static final long serialVersionUID = 2856894846224546303L; - - @Override - public void showMessage() { - if (AllZone.getHumanHand().size() == 0) stop(); - - AllZone.getDisplay().showMessage("Chains of Mephistopheles:\n"+"Select a card to discard"); - ButtonUtil.disableAll(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (zone.is(Constant.Zone.Hand)) { - card.getController().discard(card, null); - done(); - } - } - - private void done() { - stop(); - //hack to not trigger Chains of Mephistopheles recursively - AllZone.getHumanPlayer().drawCards(1, true); - } - }; - return target; - }//input_chainsDiscard() - - /** - *

input_sacrificePermanent.

- * - * @param choices a {@link forge.CardList} object. - * @param message a {@link java.lang.String} object. - * @return a {@link forge.gui.input.Input} object. - * @since 1.0.15 - */ - public static Input input_sacrificePermanent(final CardList choices, final String message) { - return input_sacrificePermanentsFromList(1, choices, message); - }//input_sacrifice() - - /** - *

input_sacrificePermanents.

- * - * @param nCards a int. - * @return a {@link forge.gui.input.Input} object. - * @since 1.0.15 - */ - public static Input input_sacrificePermanents(final int nCards) { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - list.remove("Mana Pool"); // is this needed? - return input_sacrificePermanentsFromList(nCards, list, "Select a permanent to sacrifice"); - }//input_sacrificePermanents() - - /** - *

input_sacrificePermanents.

- * - * @param nCards a int. - * @param type a {@link java.lang.String} object. - * @return a {@link forge.gui.input.Input} object. - * @since 1.0.15 - */ - public static Input input_sacrificePermanents(final int nCards, final String type) { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - list.remove("Mana Pool"); // is this needed? - - list = list.getType(type); - return input_sacrificePermanentsFromList(nCards, list, "Select a " + type + " to sacrifice"); - }//input_sacrificePermanents() - - /** - *

input_sacrificePermanentsFromList.

- * - * @param nCards a int. - * @param list a {@link forge.CardList} object. - * @param message a {@link java.lang.String} object. - * @return a {@link forge.gui.input.Input} object. - * @since 1.0.15 - */ - public static Input input_sacrificePermanentsFromList(final int nCards, final CardList list, final String message) { - Input target = new Input() { - private static final long serialVersionUID = 1981791992623774490L; - int n = 0; - - @Override - public void showMessage() { - //in case no more {type}s in play - if (n == nCards || list.size() == 0) { - stop(); - return; - } - - AllZone.getDisplay().showMessage(message + " (" + (nCards - n) + " left)"); - ButtonUtil.disableAll(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (zone.equals(AllZone.getHumanBattlefield()) && list.contains(card)) { - AllZone.getGameAction().sacrifice(card); - n++; - list.remove(card); - - //in case no more {type}s in play - if (n == nCards || list.size() == 0) { - stop(); - return; - } else - showMessage(); - } - } - }; - return target; - }//input_sacrificePermanents() - - /** - *

input_putFromHandToLibrary.

- * - * @param TopOrBottom a {@link java.lang.String} object. - * @param num a int. - * @return a {@link forge.gui.input.Input} object. - * @since 1.0.15 - */ - public static Input input_putFromHandToLibrary(final String TopOrBottom, final int num) { - Input target = new Input() { - private static final long serialVersionUID = 5178077952030689103L; - public int n = 0; - - @Override - public void showMessage() { - AllZone.getDisplay().showMessage("Select a card to put on the " + TopOrBottom + " of your library."); - ButtonUtil.disableAll(); - - if (n == num || AllZone.getHumanHand().size() == 0) stop(); - } - - @Override - public void selectButtonCancel() { - stop(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (zone.is(Constant.Zone.Hand)) { - int position = 0; - if (TopOrBottom.equalsIgnoreCase("bottom")) - position = -1; - - AllZone.getGameAction().moveToLibrary(card, position); - - n++; - if (n == num) stop(); - - showMessage(); - } - } - }; - return target; - } - - -}//end class PlayerUtil diff --git a/src/forge/PlayerZone.java b/src/forge/PlayerZone.java deleted file mode 100644 index ac171d202f4..00000000000 --- a/src/forge/PlayerZone.java +++ /dev/null @@ -1,14 +0,0 @@ -package forge; - -import java.util.Observer; - -//PlayerZone observers the cards that are added to its zone -/** - *

Abstract PlayerZone class.

- * - * @author Forge - * @version $Id: $ - */ -abstract public class PlayerZone extends MyObservable implements IPlayerZone, Observer { - -} diff --git a/src/forge/PlayerZone_ComesIntoPlay.java b/src/forge/PlayerZone_ComesIntoPlay.java deleted file mode 100644 index 4e48162bedf..00000000000 --- a/src/forge/PlayerZone_ComesIntoPlay.java +++ /dev/null @@ -1,298 +0,0 @@ -package forge; - -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.Ability; -import forge.card.spellability.SpellAbility; - -/** - *

PlayerZone_ComesIntoPlay class.

- * - * @author Forge - * @version $Id: $ - */ -public class PlayerZone_ComesIntoPlay extends DefaultPlayerZone { - /** Constant serialVersionUID=5750837078903423978L */ - private static final long serialVersionUID = 5750837078903423978L; - - private boolean trigger = true; - private boolean leavesTrigger = true; - - /** - *

Constructor for PlayerZone_ComesIntoPlay.

- * - * @param zone a {@link java.lang.String} object. - * @param player a {@link forge.Player} object. - */ - public PlayerZone_ComesIntoPlay(String zone, Player player) { - super(zone, player); - } - - /** {@inheritDoc} */ - @Override - public void add(Object o) { - if (o == null) throw new RuntimeException("PlayerZone_ComesInto Play : add() object is null"); - - super.add(o); - - final Card c = (Card) o; - final Player player = c.getController(); - - if (trigger && ((CardFactoryUtil.oppHasKismet(c.getController()) && (c.isLand() || c.isCreature() || c.isArtifact())) - || (AllZoneUtil.isCardInPlay("Urabrask the Hidden", c.getController().getOpponent()) && c.isCreature()) - || (AllZoneUtil.isCardInPlay("Root Maze") && (c.isLand() || c.isArtifact())) - || (AllZoneUtil.isCardInPlay("Orb of Dreams") && c.isPermanent()))) c.tap(); - - //cannot use addComesIntoPlayCommand - trigger might be set to false; - // Keep track of max lands can play per turn - int addMax = 0; - - boolean adjustLandPlays = false; - boolean eachPlayer = false; - - if (c.getName().equals("Exploration") || c.getName().equals("Oracle of Mul Daya")) { - addMax = 1; - adjustLandPlays = true; - } else if (c.getName().equals("Azusa, Lost but Seeking")) { - addMax = 2; - adjustLandPlays = true; - } else if (c.getName().equals("Storm Cauldron") || c.getName().equals("Rites of Flourishing")) { - // these two aren't in yet, but will just need the other part of the card to work with more lands - adjustLandPlays = true; - eachPlayer = true; - addMax = 1; - } - // 7/13: fastbond code removed, fastbond should be unlimited and will be handled elsewhere. - - if (adjustLandPlays) { - if (eachPlayer) { - AllZone.getHumanPlayer().addMaxLandsToPlay(addMax); - AllZone.getComputerPlayer().addMaxLandsToPlay(addMax); - } else - c.getController().addMaxLandsToPlay(addMax); - } - - if (trigger) { - c.setSickness(true);// summoning sickness - c.comesIntoPlay(); - - if (c.isLand()) { - CardList list = AllZoneUtil.getPlayerCardsInPlay(c.getController()); - - /*CardList listValakut = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getName().contains("Valakut, the Molten Pinnacle"); - } - });*/ - - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.hasKeyword("Landfall") - || c.hasKeyword("Landfall - Whenever a land enters the battlefield under your control, CARDNAME gets +2/+2 until end of turn."); - } - }); - - for (int i = 0; i < list.size(); i++) { - GameActionUtil.executeLandfallEffects(list.get(i)); - } - /* - // Check for a mountain - if (!listValakut.isEmpty() && c.isType("Mountain") ) { - for (int i = 0; i < listValakut.size(); i++) { - boolean b = GameActionUtil.executeValakutEffect(listValakut.get(i),c); - if (!b) { - // Not enough mountains to activate Valakut -- stop the loop - break; - } - } - }*/ - - //Tectonic Instability - CardList tis = AllZoneUtil.getCardsInPlay("Tectonic Instability"); - final Card tisLand = c; - for (Card ti : tis) { - final Card source = ti; - SpellAbility ability = new Ability(source, "") { - @Override - public void resolve() { - CardList lands = AllZoneUtil.getPlayerCardsInPlay(tisLand.getController()); - lands = lands.filter(AllZoneUtil.lands); - for (Card land : lands) land.tap(); - } - }; - StringBuilder sb = new StringBuilder(); - sb.append(source).append(" - tap all lands "); - sb.append(tisLand.getController()).append(" controls."); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - - CardList les = AllZoneUtil.getPlayerCardsInPlay(c.getOwner().getOpponent(), "Land Equilibrium"); - final Card lesLand = c; - if (les.size() > 0) { - final Card source = les.get(0); - SpellAbility ability = new Ability(source, "") { - @Override - public void resolve() { - CardList lands = AllZoneUtil.getPlayerLandsInPlay(lesLand.getOwner()); - lesLand.getOwner().sacrificePermanent(source.getName() + " - Select a land to sacrifice", lands); - } - }; - StringBuilder sb = new StringBuilder(); - sb.append(source).append(" - "); - sb.append(tisLand.getController()).append(" sacrifices a land."); - ability.setStackDescription(sb.toString()); - CardList pLands = AllZoneUtil.getPlayerLandsInPlay(lesLand.getOwner()); - CardList oLands = AllZoneUtil.getPlayerLandsInPlay(lesLand.getOwner().getOpponent()); - //(pLands - 1) because this land is in play, and the ability is before it is in play - if (oLands.size() <= (pLands.size() - 1)) { - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - } - - }//isLand() - } - - if (AllZone.getStaticEffects().getCardToEffectsList().containsKey(c.getName())) { - String[] effects = AllZone.getStaticEffects().getCardToEffectsList().get(c.getName()); - for (String effect : effects) { - AllZone.getStaticEffects().addStateBasedEffect(effect); - } - } - - CardList meek = AllZoneUtil.getPlayerGraveyard(c.getController(), "Sword of the Meek"); - - if (meek.size() > 0 && c.isCreature() && c.getNetAttack() == 1 && c.getNetDefense() == 1) { - for (int i = 0; i < meek.size(); i++) { - final Card crd = meek.get(i); - - Ability ability = new Ability(meek.get(i), "0") { - @Override - public void resolve() { - if (crd.getController().isHuman()) { - if (GameActionUtil.showYesNoDialog(crd, "Attach " + crd + " to " + c + "?")) { - if (AllZoneUtil.isCardInPlayerGraveyard(player, crd) - && AllZoneUtil.isCardInPlay(c) && c.isCreature() - && c.getNetAttack() == 1 && c.getNetDefense() == 1) { - AllZone.getGameAction().moveToPlay(crd); - - crd.equipCard(c); - } - } - - } else //computer - { - if (AllZoneUtil.isCardInPlayerGraveyard(player, crd) - && AllZoneUtil.isCardInPlay(c) && c.isCreature() - && c.getNetAttack() == 1 && c.getNetDefense() == 1) { - AllZone.getGameAction().moveToPlay(crd); - - crd.equipCard(c); - } - } - } - }; - - StringBuilder sb = new StringBuilder(); - sb.append("Sword of the Meek - Whenever a 1/1 creature enters the battlefield under your control, you may "); - sb.append("return Sword of the Meek from your graveyard to the battlefield, then attach it to that creature."); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - } - - }// end add() - - /** {@inheritDoc} */ - @Override - public void remove(Object o) { - - super.remove(o); - - Card c = (Card) o; - - // Keep track of max lands can play per turn - int addMax = 0; - - boolean adjustLandPlays = false; - boolean eachPlayer = false; - - if (c.getName().equals("Exploration") || c.getName().equals("Oracle of Mul Daya")) { - addMax = -1; - adjustLandPlays = true; - } else if (c.getName().equals("Azusa, Lost but Seeking")) { - addMax = -2; - adjustLandPlays = true; - } else if (c.getName().equals("Storm Cauldron") || c.getName().equals("Rites of Flourishing")) { - // once their second half of their abilities are programmed these two can be added in - adjustLandPlays = true; - eachPlayer = true; - addMax = -1; - } - // 7/12: fastbond code removed, fastbond should be unlimited and will be handled elsewhere. - - if (adjustLandPlays) { - if (eachPlayer) { - AllZone.getHumanPlayer().addMaxLandsToPlay(addMax); - AllZone.getComputerPlayer().addMaxLandsToPlay(addMax); - } else - c.getController().addMaxLandsToPlay(addMax); - } - - - if (leavesTrigger) { - c.leavesPlay(); - } - - if (AllZone.getStaticEffects().getCardToEffectsList().containsKey(c.getName())) { - String[] effects = AllZone.getStaticEffects().getCardToEffectsList().get(c.getName()); - String tempEffect = ""; - for (String effect : effects) { - tempEffect = effect; - AllZone.getStaticEffects().removeStateBasedEffect(effect); - Command comm = GameActionUtil.commands.get(tempEffect); //this is to make sure cards reset correctly - comm.execute(); - } - - } - - for (String effect : AllZone.getStaticEffects().getStateBasedMap().keySet()) { - Command com = GameActionUtil.commands.get(effect); - com.execute(); - } - - - } - - /** - *

Setter for the field trigger.

- * - * @param b a boolean. - */ - public void setTrigger(boolean b) { - trigger = b; - } - - /** - *

Setter for the field leavesTrigger.

- * - * @param b a boolean. - */ - public void setLeavesTrigger(boolean b) { - leavesTrigger = b; - } - - /** - *

setTriggers.

- * - * @param b a boolean. - */ - public void setTriggers(boolean b) { - trigger = b; - leavesTrigger = b; - } -} diff --git a/src/forge/Quest_Assignment.java b/src/forge/Quest_Assignment.java deleted file mode 100644 index 835f161aac8..00000000000 --- a/src/forge/Quest_Assignment.java +++ /dev/null @@ -1,272 +0,0 @@ -package forge; - -import java.util.ArrayList; - -/** - *

Quest_Assignment class.

- * - * @author Forge - * @version $Id: $ - */ -public class Quest_Assignment { - private int id; - private int requiredNumberWins; - private int computerLife; - - private long creditsReward; - - private String name; - private String desc; - private String difficulty; - private String cardReward; - private String iconName; - - private boolean repeatable; - - private ArrayList cardRewardList = new ArrayList(); - - private CardList human = new CardList(); - private ArrayList compy = new ArrayList(); - - /** - *

Setter for the field id.

- * - * @param id a int. - */ - public void setId(int id) { - this.id = id; - } - - /** - *

Getter for the field id.

- * - * @return a int. - */ - public int getId() { - return id; - } - - /** - *

Setter for the field creditsReward.

- * - * @param creditsReward a long. - */ - public void setCreditsReward(long creditsReward) { - this.creditsReward = creditsReward; - } - - /** - *

Getter for the field creditsReward.

- * - * @return a long. - */ - public long getCreditsReward() { - return creditsReward; - } - - /** - *

Setter for the field name.

- * - * @param name a {@link java.lang.String} object. - */ - public void setName(String name) { - this.name = name; - } - - /** - *

Getter for the field name.

- * - * @return a {@link java.lang.String} object. - */ - public String getName() { - return name; - } - - /** - *

Setter for the field desc.

- * - * @param desc a {@link java.lang.String} object. - */ - public void setDesc(String desc) { - this.desc = desc; - } - - /** - *

Getter for the field desc.

- * - * @return a {@link java.lang.String} object. - */ - public String getDesc() { - return desc; - } - - /** - *

Setter for the field difficulty.

- * - * @param difficulty a {@link java.lang.String} object. - */ - public void setDifficulty(String difficulty) { - this.difficulty = difficulty; - } - - /** - *

Getter for the field difficulty.

- * - * @return a {@link java.lang.String} object. - */ - public String getDifficulty() { - return difficulty; - } - - /** - *

Setter for the field repeatable.

- * - * @param repeatable a boolean. - */ - public void setRepeatable(boolean repeatable) { - this.repeatable = repeatable; - } - - /** - *

isRepeatable.

- * - * @return a boolean. - */ - public boolean isRepeatable() { - return repeatable; - } - - /** - *

Setter for the field requiredNumberWins.

- * - * @param requiredNumberWins a int. - */ - public void setRequiredNumberWins(int requiredNumberWins) { - this.requiredNumberWins = requiredNumberWins; - } - - /** - *

Getter for the field requiredNumberWins.

- * - * @return a int. - */ - public int getRequiredNumberWins() { - return requiredNumberWins; - } - - /** - *

Setter for the field computerLife.

- * - * @param computerLife a int. - */ - public void setComputerLife(int computerLife) { - this.computerLife = computerLife; - } - - /** - *

Getter for the field computerLife.

- * - * @return a int. - */ - public int getComputerLife() { - return computerLife; - } - - /** - *

Setter for the field cardReward.

- * - * @param cardReward a {@link java.lang.String} object. - */ - public void setCardReward(String cardReward) { - this.cardReward = cardReward; - } - - /** - *

Getter for the field cardReward.

- * - * @return a {@link java.lang.String} object. - */ - public String getCardReward() { - return cardReward; - } - - /** - *

Setter for the field iconName.

- * - * @param s a {@link java.lang.String} object. - */ - public void setIconName(String s) { - iconName = s; - } - - /** - *

Getter for the field iconName.

- * - * @return a {@link java.lang.String} object. - */ - public String getIconName() { - return iconName; - } - - /** - *

Setter for the field human.

- * - * @param human a {@link forge.CardList} object. - */ - public void setHuman(CardList human) { - this.human = human; - } - - /** - *

Getter for the field human.

- * - * @return a {@link forge.CardList} object. - */ - public CardList getHuman() { - return human; - } - - /** - *

addCompy.

- * - * @param s a {@link java.lang.String} object. - */ - public void addCompy(String s) { - this.compy.add(s); - } - - /** - *

clearCompy.

- */ - public void clearCompy() { - this.compy.clear(); - } - - - /** - *

Getter for the field compy.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getCompy() { - return compy; - } - - /** - *

Setter for the field cardRewardList.

- * - * @param cardRewardList a {@link java.util.ArrayList} object. - */ - public void setCardRewardList(ArrayList cardRewardList) { - this.cardRewardList = cardRewardList; - } - - /** - *

Getter for the field cardRewardList.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getCardRewardList() { - return cardRewardList; - } -} diff --git a/src/forge/ReadBoosterPack.java b/src/forge/ReadBoosterPack.java deleted file mode 100644 index a0055275a11..00000000000 --- a/src/forge/ReadBoosterPack.java +++ /dev/null @@ -1,472 +0,0 @@ -package forge; - - -//import java.io.BufferedReader; -//import java.io.File; -//import java.io.FileReader; - -import forge.properties.NewConstants; - -import java.util.ArrayList; - - -/** - *

ReadBoosterPack class.

- * - * @author Forge - * @version $Id: $ - */ -public class ReadBoosterPack implements NewConstants { - -// final private static String comment = "//"; - - private CardList commonCreatureList = new CardList(); - private CardList commonNonCreatureList = new CardList(); - - private CardList commonList = new CardList(); - private CardList uncommonList = new CardList(); - private CardList rareList = new CardList(); - - /* - //average creature versus noncreature - - ReadBoosterPack r = new ReadBoosterPack(); - double n = 0; //total - int nCreature = 0; - int nSpell = 0; - - for(int i = 0; i < 1000; i++) - { - CardList list = r.getBoosterPack(); - - int c = list.getType("Creature").size(); - nCreature += c; - nSpell += (15 -c); - - n += 15; - } - System.out.println(nCreature / n +" - " +nSpell / n); - - System.exit(0); - */ - - /** - *

Constructor for ReadBoosterPack.

- */ - public ReadBoosterPack() { - setup(); - } - - //returns "common", "uncommon", or "rare" - /** - *

getRarity.

- * - * @param cardName a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public String getRarity(String cardName) { - if (commonList.containsName(cardName)) return "Common"; - if (uncommonList.containsName(cardName)) return "Uncommon"; - if (rareList.containsName(cardName)) return "Rare"; - - ArrayList land = new ArrayList(); - land.add("Forest"); - land.add("Plains"); - land.add("Swamp"); - land.add("Mountain"); - land.add("Island"); - land.add("Terramorphic Expanse"); - land.add("Snow-Covered Forest"); - land.add("Snow-Covered Plains"); - land.add("Snow-Covered Swamp"); - land.add("Snow-Covered Mountain"); - land.add("Snow-Covered Island"); - if (land.contains(cardName)) return "Land"; - - return "error"; - } - - /** - *

getBoosterPack5.

- * - * @return a {@link forge.CardList} object. - */ - public CardList getBoosterPack5() { - CardList list = new CardList(); - for (int i = 0; i < 5; i++) - list.addAll(getBoosterPack()); - - for (int i = 0; i < 20; i++) { - list.add(AllZone.getCardFactory().getCard("Forest", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Island", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Plains", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Mountain", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Swamp", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Snow-Covered Forest", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Snow-Covered Island", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Snow-Covered Plains", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Snow-Covered Mountain", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Snow-Covered Swamp", AllZone.getHumanPlayer())); - } - - for (int i = 0; i < 4; i++) - list.add(AllZone.getCardFactory().getCard("Terramorphic Expanse", AllZone.getHumanPlayer())); - - return list; - }//getBoosterPack5() - - /** - *

getBoosterPack.

- * - * @return a {@link forge.CardList} object. - */ - public CardList getBoosterPack() { - CardList pack = new CardList(); - - pack.add(getRandomCard(rareList)); - - for (int i = 0; i < 3; i++) - pack.add(getRandomCard(uncommonList)); - - //11 commons, 7 creature 4 noncreature - CardList variety; - for (int i = 0; i < 7; i++) { - variety = getVariety(commonCreatureList); - pack.add(getRandomCard(variety)); - } - - for (int i = 0; i < 4; i++) { - variety = getVariety(commonNonCreatureList); - pack.add(getRandomCard(variety)); - } - - if (pack.size() != 15) - throw new RuntimeException("ReadBoosterPack : getBoosterPack() error, pack is not 15 card - " - + pack.size()); - - return pack; - } - - /** - *

getShopCards.

- * - * @param numberWins a int. - * @param questLevel a int. - * @return a {@link forge.CardList} object. - */ - public CardList getShopCards(int numberWins, int questLevel) { - CardList list = new CardList(); - - // Number of Packs granted - int levelPacks = questLevel > 0 ? 8 / questLevel / 2 : 4; - int winPacks = numberWins / 15; - - int totalPacks = Math.min(levelPacks + winPacks, 6); - - for (int i = 0; i < totalPacks; i++) { - // TODO: Balance CardPool Availability - // Each "Pack" yields 1 Rare, 3 Uncommon, 7 Commons - list.add(getRandomCard(rareList)); - for (int j = 0; j < 7; j++) { - if (j < 3) - list.add(getRandomCard(uncommonList)); - - list.add(getRandomCard(commonList)); - } - } - - for (int i = 0; i < 10; i++) { - // Add basic land availability - list.add(AllZone.getCardFactory().getCard("Forest", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Island", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Plains", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Mountain", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Swamp", AllZone.getHumanPlayer())); - if (i < 5) { - list.add(AllZone.getCardFactory().getCard("Snow-Covered Forest", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Snow-Covered Island", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Snow-Covered Plains", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Snow-Covered Mountain", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Snow-Covered Swamp", AllZone.getHumanPlayer())); - } - } - - return list; - } - - //return CardList of 5 or 6 cards, one for each color and maybe an artifact - /** - *

getVariety.

- * - * @param in a {@link forge.CardList} object. - * @return a {@link forge.CardList} object. - */ - private CardList getVariety(CardList in) { - CardList out = new CardList(); - - String color[] = Constant.Color.Colors; - Card check; - in.shuffle(); - - for (int i = 0; i < color.length; i++) { - check = findColor(in, color[i]); - if (check != null) out.add(check); - } - - return out; - }//getVariety() - - /** - *

findColor.

- * - * @param in a {@link forge.CardList} object. - * @param color a {@link java.lang.String} object. - * @return a {@link forge.Card} object. - */ - private Card findColor(CardList in, String color) { - for (int i = 0; i < in.size(); i++) - if (CardUtil.getColors(in.get(i)).contains(color)) return in.get(i); - - return null; - } - - - /** - *

getRandomCard.

- * - * @param list a {@link forge.CardList} object. - * @return a {@link forge.Card} object. - */ - private Card getRandomCard(CardList list) { - for (int i = 0; i < 10; i++) - list.shuffle(); - - int index = MyRandom.random.nextInt(list.size()); - - Card c = AllZone.getCardFactory().copyCard(list.get(index)); - c.setRarity("rare"); - return c; - }//getRandomCard() - - /** - *

setup.

- */ - private void setup() { - //commonList = readFile(ForgeProps.getFile(REGULAR.COMMON)); - //uncommonList = readFile(ForgeProps.getFile(REGULAR.UNCOMMON)); - //rareList = readFile(ForgeProps.getFile(REGULAR.RARE)); - - //commonCreatureList = commonList.getType("Creature"); - //commonNonCreatureList = commonList.filter(new CardListFilter() { - // public boolean addCard(Card c) { - // return !c.isCreature(); - // } - //}); - - for (Card aCard : AllZone.getCardFactory()) { - String rr = aCard.getSVar("Rarity"); - - if (rr.equals("Common")) { - commonList.add(aCard); - if (aCard.isCreature()) - commonCreatureList.add(aCard); - else - commonNonCreatureList.add(aCard); - } else if (rr.equals("Uncommon")) { - uncommonList.add(aCard); - } else if (rr.equals("Rare")) { - rareList.add(aCard); - } else if (rr.equals("Mythic")) { - rareList.add(aCard); - } - - } - - }//setup() - - -/* private CardList readFile(File file) { - CardList cardList = new CardList(); - - BufferedReader in; - 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)) { - Card c; - if(!line.startsWith(comment)) { - c = AllZone.getCardFactory().getCard(line.trim(), AllZone.getHumanPlayer()); - cardList.add(c); - } - - line = in.readLine(); - }//if - - } catch(Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("ReadBoosterPack : readFile error, " + ex); - } - - return cardList; - }//readFile() -*/ -} - -/* -import java.util.*; -import java.io.*; - -public class ReadBoosterPack -{ -// 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 String commonFilename = "common.txt"; - final private String uncommonFilename = "uncommon.txt"; - final private String rareFilename = "rare.txt"; - - final private String comment = "//"; - - private ArrayList commonList; - private ArrayList uncommonList; - private ArrayList rareList; - - - public static void main(String[] args) - { - ReadBoosterPack r = new ReadBoosterPack(); - CardList list = r.getBoosterPack(); - double n = 0; //total - int nCreature = 0; - int nSpell = 0; - - for(int i = 0; i < 2; i++) - { - int c = list.getType("Creature").size(); - nCreature += c; - nSpell += (15 -c); - - n += 15; - } - System.out.println(nCreature / n +" - " +nSpell / n); - - System.exit(0); - }//main() - - public ReadBoosterPack() {setup();} - - //returns "common", "uncommon", or "rare" - public String getRarity(String cardName) - { - if(commonList.contains(cardName)) - return "Common"; - if(uncommonList.contains(cardName)) - return "Uncommon"; - if(rareList.contains(cardName)) - return "Rare"; - - ArrayList land = new ArrayList(); - land.add("Forest"); - land.add("Plains"); - land.add("Swamp"); - land.add("Mountain"); - land.add("Island"); - land.add("Terramorphic Expanse"); - if(land.contains(cardName)) - return "Land"; - - return "error"; - } - - public CardList getBoosterPack5() - { - CardList list = new CardList(); - for(int i = 0; i < 5; i++) - list.addAll(getBoosterPack()); - - for(int i = 0; i < 40; i++) - { - list.add(AllZone.getCardFactory().getCard("Forest", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Island", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Plains", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Mountain", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Swamp", AllZone.getHumanPlayer())); - } - - for(int i = 0; i < 4; i++) - list.add(AllZone.getCardFactory().getCard("Terramorphic Expanse", AllZone.getHumanPlayer())); - - return list; - }//getBoosterPack5() - - public CardList getBoosterPack() - { - CardList pack = new CardList(); - - pack.add(getRandomCard(rareList)); - - for(int i = 0; i < 3; i++) - pack.add(getRandomCard(uncommonList)); - - for(int i = 0; i < 11; i++) - pack.add(getRandomCard(commonList)); - - return pack; - } - private Card getRandomCard(ArrayList list) - { - for(int i = 0; i < 10; i++) - Collections.shuffle(list, MyRandom.random); - - int index = MyRandom.random.nextInt(list.size()); - String name = list.get(index).toString(); - - Card c = AllZone.getCardFactory().getCard(name, AllZone.getHumanPlayer()); - c.setRarity("rare"); - return c; - }//getRandomCard() - - private void setup() - { - commonList = readFile(commonFilename); - uncommonList = readFile(uncommonFilename); - rareList = readFile(rareFilename); - - checkName(commonList); - checkName(uncommonList); - checkName(rareList); - } - private void checkName(ArrayList name) - { - for(int i = 0; i < name.size(); i++) - AllZone.getCardFactory().getCard(name.get(i).toString(), AllZone.getHumanPlayer()); - } - - //returns an ArrayList of Strings, the names of the cards read - private ArrayList readFile(String filename) - { - ArrayList cardName = new ArrayList(); - - BufferedReader in; - try{ - in = new BufferedReader(new FileReader(filename)); - 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)) - cardName.add(line.trim()); - - line = in.readLine(); - }//if - - }catch(Exception ex){throw new RuntimeException("ReadBoosterPack : readFile error, " + ex);} - - return cardName; - }//readFile() -} -*/ diff --git a/src/forge/ReadDraftBoosterPack.java b/src/forge/ReadDraftBoosterPack.java deleted file mode 100644 index fa11d22c955..00000000000 --- a/src/forge/ReadDraftBoosterPack.java +++ /dev/null @@ -1,301 +0,0 @@ -package forge; - - -import forge.error.ErrorViewer; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.util.ArrayList; - - -/** - *

ReadDraftBoosterPack class.

- * - * @author Forge - * @version $Id: $ - */ -public class ReadDraftBoosterPack implements NewConstants { - - /** Constant comment="//" */ - final private static String comment = "//"; - - private CardList commonCreatureList = new CardList(); - private CardList commonNonCreatureList = new CardList(); - - private CardList commonList = new CardList(); - private CardList uncommonList = new CardList(); - private CardList rareList = new CardList(); - - /** - *

Constructor for ReadDraftBoosterPack.

- */ - public ReadDraftBoosterPack() { - setup(); - } - - //returns "common", "uncommon", or "rare" - /** - *

getRarity.

- * - * @param cardName a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public String getRarity(String cardName) { - if (commonList.containsName(cardName)) return "Common"; - if (uncommonList.containsName(cardName)) return "Uncommon"; - if (rareList.containsName(cardName)) return "Rare"; - - ArrayList land = new ArrayList(); - land.add("Forest"); - land.add("Plains"); - land.add("Swamp"); - land.add("Mountain"); - land.add("Island"); - land.add("Terramorphic Expanse"); - land.add("Snow-Covered Forest"); - land.add("Snow-Covered Plains"); - land.add("Snow-Covered Swamp"); - land.add("Snow-Covered Mountain"); - land.add("Snow-Covered Island"); - if (land.contains(cardName)) return "Land"; - - return "error"; - } - - /** - *

getBoosterPack5.

- * - * @return a {@link forge.CardList} object. - */ - public CardList getBoosterPack5() { - CardList list = new CardList(); - for (int i = 0; i < 5; i++) - list.addAll(getBoosterPack()); - - for (int i = 0; i < 20; i++) { - list.add(AllZone.getCardFactory().getCard("Forest", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Island", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Plains", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Mountain", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Swamp", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Snow-Covered Forest", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Snow-Covered Island", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Snow-Covered Plains", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Snow-Covered Mountain", AllZone.getHumanPlayer())); - list.add(AllZone.getCardFactory().getCard("Snow-Covered Swamp", AllZone.getHumanPlayer())); - } - - for (int i = 0; i < 4; i++) - list.add(AllZone.getCardFactory().getCard("Terramorphic Expanse", AllZone.getHumanPlayer())); - - return list; - }//getBoosterPack5() - - /** - *

getBoosterPack.

- * - * @return a {@link forge.CardList} object. - */ - public CardList getBoosterPack() { - CardList pack = new CardList(); - - pack.add(getRandomCard(rareList)); - - for (int i = 0; i < 3; i++) - pack.add(getRandomCard(uncommonList)); - - //11 commons, 7 creature 4 noncreature - CardList variety; - for (int i = 0; i < 7; i++) { - variety = getVariety(commonCreatureList); - pack.add(getRandomCard(variety)); - } - - for (int i = 0; i < 4; i++) { - variety = getVariety(commonNonCreatureList); - pack.add(getRandomCard(variety)); - } - - if (pack.size() != 15) - throw new RuntimeException("ReadDraftBoosterPack : getBoosterPack() error, pack is not 15 cards - " - + pack.size()); - - return pack; - } - - /** - *

getShopCards.

- * - * @param numberWins a int. - * @return a {@link forge.CardList} object. - */ - public CardList getShopCards(int numberWins) { - CardList list = new CardList(); - - int numberRares = 1 + numberWins / 15; - if (numberRares > 10) - numberRares = 10; - - for (int i = 0; i < numberRares; i++) - list.add(getRandomCard(rareList)); - - int numberUncommons = 3 + numberWins / 10; - if (numberUncommons > 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 - /** - *

getVariety.

- * - * @param in a {@link forge.CardList} object. - * @return a {@link forge.CardList} object. - */ - private CardList getVariety(CardList in) { - CardList out = new CardList(); - - String color[] = Constant.Color.Colors; - Card check; - in.shuffle(); - - for (int i = 0; i < color.length; i++) { - check = findColor(in, color[i]); - if (check != null) out.add(check); - } - - return out; - }//getVariety() - - /** - *

findColor.

- * - * @param in a {@link forge.CardList} object. - * @param color a {@link java.lang.String} object. - * @return a {@link forge.Card} object. - */ - private Card findColor(CardList in, String color) { - for (int i = 0; i < in.size(); i++) - if (CardUtil.getColors(in.get(i)).contains(color)) return in.get(i); - - return null; - } - - - /** - *

getRandomCard.

- * - * @param list a {@link forge.CardList} object. - * @return a {@link forge.Card} object. - */ - private Card getRandomCard(CardList list) { - for (int i = 0; i < 10; i++) - list.shuffle(); - - int index = MyRandom.random.nextInt(list.size()); - - Card c = AllZone.getCardFactory().copyCard(list.get(index)); - c.setRarity("rare"); - return c; - }//getRandomCard() - - /** - *

setup.

- */ - private void setup() { - commonList = readFile(ForgeProps.getFile(DRAFT.COMMON)); - uncommonList = readFile(ForgeProps.getFile(DRAFT.UNCOMMON)); - rareList = readFile(ForgeProps.getFile(DRAFT.RARE)); - - System.out.println("commonList size:" + commonList.size()); - System.out.println("ucommonList size:" + uncommonList.size()); - System.out.println("rareList size:" + rareList.size()); - - commonCreatureList = commonList.getType("Creature"); - commonNonCreatureList = commonList.filter(new CardListFilter() { - public boolean addCard(Card c) { - return !c.isCreature(); - } - }); - -/* CardList AllCards = AllZone.getCardFactory().getAllCards(); - -for (int i=0; ireadFile.

- * - * @param file a {@link java.io.File} object. - * @return a {@link forge.CardList} object. - */ - private CardList readFile(File file) { - CardList cardList = new CardList(); - - BufferedReader in; - 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)) { - Card c; - if (!line.startsWith(comment)) { - c = AllZone.getCardFactory().getCard(line.trim(), AllZone.getHumanPlayer()); - cardList.add(c); - } - - line = in.readLine(); - }//if - - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("ReadDraftBoosterPack : readFile error, " + ex); - } - - return cardList; - }//readFile() -} - - diff --git a/src/forge/ReadPriceList.java b/src/forge/ReadPriceList.java deleted file mode 100644 index 56078aab27c..00000000000 --- a/src/forge/ReadPriceList.java +++ /dev/null @@ -1,109 +0,0 @@ -package forge; - - -import com.esotericsoftware.minlog.Log; -import forge.error.ErrorViewer; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.util.HashMap; -import java.util.Map; -import java.util.Random; - - -/** - *

ReadPriceList class.

- * - * @author Forge - * @version $Id: $ - */ -public class ReadPriceList implements NewConstants { - - /** Constant comment="//" */ - final private static String comment = "//"; - - private HashMap priceMap; - - /** - *

Constructor for ReadPriceList.

- */ - public ReadPriceList() { - setup(); - } - - /** - *

setup.

- */ - private void setup() { - priceMap = readFile(ForgeProps.getFile(QUEST.PRICE)); - }//setup() - - /** - *

readFile.

- * - * @param file a {@link java.io.File} object. - * @return a {@link java.util.HashMap} object. - */ - private HashMap readFile(File file) { - BufferedReader in; - HashMap map = new HashMap(); - Random r = MyRandom.random; - 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(); - - //System.out.println("Name: " + name + ", Price: " + price); - - try { - long val = Long.parseLong(price.trim()); - - if (!(name.equals("Plains") || name.equals("Island") || name.equals("Swamp") || name.equals("Mountain") || name.equals("Forest") || - name.equals("Snow-Covered Plains") || name.equals("Snow-Covered Island") || name.equals("Snow-Covered Swamp") || name.equals("Snow-Covered Mountain") || name.equals("Snow-Covered Forest"))) { - float ff = 0; - if (r.nextInt(100) < 90) // +/- 10% - ff = (float) r.nextInt(10) * (float) .01; - else // +/- 50% - ff = (float) r.nextInt(50) * (float) .01; - - if (r.nextInt(100) < 50) // -ff% - val = (long) ((float) val * ((float) 1 - ff)); - else // +ff% - val = (long) ((float) val * ((float) 1 + ff)); - } - - map.put(name, val); - } catch (NumberFormatException nfe) { - Log.warn("NumberFormatException: " + nfe.getMessage()); - } - } - line = in.readLine(); - }//if - - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("ReadPriceList : readFile error, " + ex); - } - - return map; - }//readFile() - - /** - *

getPriceList.

- * - * @return a {@link java.util.Map} object. - */ - public Map getPriceList() { - return priceMap; - } -} diff --git a/src/forge/ReadQuest_Assignment.java b/src/forge/ReadQuest_Assignment.java deleted file mode 100644 index ed7749ec055..00000000000 --- a/src/forge/ReadQuest_Assignment.java +++ /dev/null @@ -1,211 +0,0 @@ -package forge; - -import forge.error.ErrorViewer; -import forge.properties.NewConstants; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.util.ArrayList; -import java.util.List; - - -/** - *

ReadQuest_Assignment class.

- * - * @author Forge - * @version $Id: $ - */ -public class ReadQuest_Assignment implements Runnable, NewConstants { - private BufferedReader in; - ArrayList allQuests = new ArrayList(); - - private int totalWins; - private List completedQuests = new ArrayList(); - - /** - *

getQuests.

- * - * @return a {@link java.util.List} object. - */ - public List getQuests() { - return new ArrayList(allQuests); - } - - /** - *

getQuestsByIds.

- * - * @param availableQuestIds a {@link java.util.List} object. - * @return a {@link java.util.List} object. - */ - public List getQuestsByIds(List availableQuestIds) { - List quests = new ArrayList(); - - for (Quest_Assignment qa : allQuests) { - if (availableQuestIds.contains(qa.getId())) - quests.add(qa); - } - - return quests; - } - - /** - *

getQuestById.

- * - * @param i a int. - * @return a {@link forge.Quest_Assignment} object. - */ - public Quest_Assignment getQuestById(int i) { - for (Quest_Assignment qa : allQuests) { - if (qa.getId() == i) - return qa; - } - return null; - } - - /* - public Quest_Assignment getQuestById(int id) { - return allQuests.get(id); - } - */ - - /** - *

Constructor for ReadQuest_Assignment.

- * - * @param filename a {@link java.lang.String} object. - * @param questData a {@link forge.quest.data.QuestData} object. - */ - public ReadQuest_Assignment(String filename, forge.quest.data.QuestData questData) { - this(new File(filename), questData); - } - - /** - *

Constructor for ReadQuest_Assignment.

- * - * @param file a {@link java.io.File} object. - * @param questData a {@link forge.quest.data.QuestData} object. - */ - public ReadQuest_Assignment(File file, forge.quest.data.QuestData questData) { - - if (questData != null) { - totalWins = questData.getWin(); - if (questData.getCompletedQuests() != null) - completedQuests = questData.getCompletedQuests(); - else - completedQuests = new ArrayList(); - } - - if (!file.exists()) - throw new RuntimeException("ReadQuest_Assignment : constructor error -- file not found -- filename is " - + file.getAbsolutePath()); - - //makes the checked exception, into an unchecked runtime exception - try { - in = new BufferedReader(new FileReader(file)); - } catch (Exception ex) { - ErrorViewer.showError(ex, "File \"%s\" not found", file.getAbsolutePath()); - throw new RuntimeException("ReadQuest_Assignment : constructor error -- file not found -- filename is " - + file.getPath()); - } - }//ReadCard() - - /* id - * name - * desc - * difficulty - * repeatable - * numberWinsRequired - * cardReward - * creditsReward - */ - - /** - *

run.

- */ - public void run() { - Quest_Assignment qa; - String s = readLine(); - ArrayList ids = new ArrayList(); - - while (!s.equals("End")) { - qa = new Quest_Assignment(); - if (s.equals("")) throw new RuntimeException("ReadQuest_Assignment : run() reading error, id is blank"); - int id = Integer.parseInt(s); - qa.setId(id); - - s = readLine(); - qa.setName(s); - - s = readLine(); - qa.setDesc(s); - - - s = readLine(); - qa.setDifficulty(s); - if (qa.getDifficulty().equals("Medium")) - qa.setComputerLife(25); - else if (qa.getDifficulty().equals("Hard")) - qa.setComputerLife(30); - else if (qa.getDifficulty().equals("Very Hard")) - qa.setComputerLife(35); - else if (qa.getDifficulty().equals("Expert")) - qa.setComputerLife(50); - else if (qa.getDifficulty().equals("Insane")) - qa.setComputerLife(100); - - s = readLine(); - if (s.equals("Repeatable")) - qa.setRepeatable(true); - else - qa.setRepeatable(false); - - s = readLine(); - int wins = Integer.valueOf(s); - qa.setRequiredNumberWins(wins); - - s = readLine(); - qa.setCardReward(s); - - s = readLine(); - long reward = Long.parseLong(s.trim()); - qa.setCreditsReward(reward); - - s = readLine(); - qa.setIconName(s); - - //s = readLine(); - s = readLine(); - - if (ids.contains(qa.getId())) { - System.out.println("ReadQuest_Assignment:run() error - duplicate card name: " + qa.getId()); - throw new RuntimeException("ReadQuest_Assignment:run() error - duplicate card name: " + qa.getId()); - } - - ids.add(qa.getId()); - if (qa.getRequiredNumberWins() <= totalWins && !completedQuests.contains(qa.getId())) { - forge.quest.data.QuestUtil.setupQuest(qa); - allQuests.add(qa); - } - - //id: - s = readLine(); - } - }//run() - - /** - *

readLine.

- * - * @return a {@link java.lang.String} object. - */ - private String readLine() { - //makes the checked exception, into an unchecked runtime exception - try { - String s = in.readLine(); - if (s != null) s = s.trim(); - return s; - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("ReadQuest_Assignment: readLine(Quest_Assignment) error"); - } - }//readLine(Quest_Assignment) -} diff --git a/src/forge/SetInfo.java b/src/forge/SetInfo.java deleted file mode 100644 index 292288f90a2..00000000000 --- a/src/forge/SetInfo.java +++ /dev/null @@ -1,89 +0,0 @@ -package forge; - -/** - *

SetInfo class.

- * - * @author Forge - * @version $Id: $ - */ -public class SetInfo { - public String Code; - public String Rarity; - public String URL; - public int PicCount; - - /** - *

Constructor for SetInfo.

- */ - public SetInfo() { - Code = ""; - Rarity = ""; - URL = ""; - PicCount = 0; - } - - /** - *

Constructor for SetInfo.

- * - * @param c a {@link java.lang.String} object. - * @param r a {@link java.lang.String} object. - * @param u a {@link java.lang.String} object. - */ - public SetInfo(String c, String r, String u) { - Code = c; - Rarity = r; - URL = u; - PicCount = 0; - } - - /** - *

Constructor for SetInfo.

- * - * @param c a {@link java.lang.String} object. - * @param r a {@link java.lang.String} object. - * @param u a {@link java.lang.String} object. - * @param p a int. - */ - public SetInfo(String c, String r, String u, int p) { - Code = c; - Rarity = r; - URL = u; - PicCount = p; - } - - /** - *

Constructor for SetInfo.

- * - * @param parse a {@link java.lang.String} object. - */ - public SetInfo(String parse) { - String[] pp = parse.split("\\|"); - Code = pp[0]; - Rarity = pp[1]; - URL = pp[2]; - if (pp.length > 3) - PicCount = Integer.parseInt(pp[3]); - else - PicCount = 0; - } - - /** - *

toString.

- * - * @return a {@link java.lang.String} object. - */ - public String toString() { - return Code; - } - - /** {@inheritDoc} */ - public boolean equals(Object o) { - if (o instanceof SetInfo) { - SetInfo siO = (SetInfo) o; - return Code.equals(siO.Code); - } else return false; - - } -} - - diff --git a/src/forge/SetInfoUtil.java b/src/forge/SetInfoUtil.java deleted file mode 100644 index b49a1fa073a..00000000000 --- a/src/forge/SetInfoUtil.java +++ /dev/null @@ -1,397 +0,0 @@ -package forge; - -import java.util.ArrayList; -import java.util.HashMap; - -/** - *

SetInfoUtil class.

- * - * @author Forge - * @version $Id: $ - */ -public class SetInfoUtil { - /** Constant setData */ - private static ArrayList> setData = new ArrayList>(); - - /** - *

loadSetData.

- */ - private static void loadSetData() { - ArrayList fData = FileUtil.readFile("res/blockdata/setdata.txt"); - - if (fData.size() > 0) { - for (int i = 0; i < fData.size(); i++) { - String s = fData.get(i); - if (s.length() > 5) { - HashMap sm = new HashMap(); - - String ss[] = s.split("\\|"); - for (int j = 0; j < ss.length; j++) { - String kv[] = ss[j].split(":"); - sm.put(kv[0], kv[1]); - } - - setData.add(sm); - } - } - - } - } - - /** - *

getSetCode2List.

- * - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getSetCode2List() { - ArrayList scl = new ArrayList(); - - if (setData.size() == 0) - loadSetData(); - - for (int i = 0; i < setData.size(); i++) - scl.add(setData.get(i).get("Code2")); - - return scl; - } - - /** - *

getSetCode3List.

- * - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getSetCode3List() { - ArrayList scl = new ArrayList(); - - if (setData.size() == 0) - loadSetData(); - - for (int i = 0; i < setData.size(); i++) - scl.add(setData.get(i).get("Code3")); - - return scl; - } - - /** - *

getSetNameList.

- * - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getSetNameList() { - ArrayList snl = new ArrayList(); - - if (setData.size() == 0) - loadSetData(); - - for (int i = 0; i < setData.size(); i++) - snl.add(setData.get(i).get("Name")); - - return snl; - } - - /** - *

getSetCode2_SetName.

- * - * @param SetName a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public static String getSetCode2_SetName(String SetName) { - if (setData.size() == 0) - loadSetData(); - - for (int i = 0; i < setData.size(); i++) - if (setData.get(i).get("Name").equals(SetName)) - return setData.get(i).get("Code2"); - - return ""; - } - - /** - *

getSetCode3_SetName.

- * - * @param SetName a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public static String getSetCode3_SetName(String SetName) { - if (setData.size() == 0) - loadSetData(); - - for (int i = 0; i < setData.size(); i++) - if (setData.get(i).get("Name").equals(SetName)) - return setData.get(i).get("Code3"); - - return ""; - } - - /** - *

getSetCode2_SetCode3.

- * - * @param SetCode3 a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public static String getSetCode2_SetCode3(String SetCode3) { - if (setData.size() == 0) - loadSetData(); - - for (int i = 0; i < setData.size(); i++) - if (setData.get(i).get("Code3").equals(SetCode3)) - return setData.get(i).get("Code2"); - - return ""; - } - - /** - *

getSetCode3_SetCode2.

- * - * @param SetCode2 a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public static String getSetCode3_SetCode2(String SetCode2) { - if (setData.size() == 0) - loadSetData(); - - for (int i = 0; i < setData.size(); i++) - if (setData.get(i).get("Code2").equals(SetCode2)) - return setData.get(i).get("Code3"); - - return ""; - } - - /** - *

getSetName_SetCode2.

- * - * @param SetCode2 a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public static String getSetName_SetCode2(String SetCode2) { - if (setData.size() == 0) - loadSetData(); - - for (int i = 0; i < setData.size(); i++) - if (setData.get(i).get("Code2").equals(SetCode2)) - return setData.get(i).get("Name"); - - return ""; - } - - /** - *

getSetName_SetCode3.

- * - * @param SetCode3 a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public static String getSetName_SetCode3(String SetCode3) { - if (setData.size() == 0) - loadSetData(); - - for (int i = 0; i < setData.size(); i++) - if (setData.get(i).get("Code3").equals(SetCode3)) - return setData.get(i).get("Name"); - - return ""; - } - - /** - *

getMostRecentSet.

- * - * @param alSI a {@link java.util.ArrayList} object. - * @return a {@link java.lang.String} object. - */ - public static String getMostRecentSet(ArrayList alSI) { - if (setData.size() == 0) - loadSetData(); - - int mostRecent = -1; - - for (int i = 0; i < alSI.size(); i++) { - SetInfo s = alSI.get(i); - - for (int j = 0; j < setData.size(); j++) { - if (setData.get(j).get("Code3").equals(s.Code)) { - if (j > mostRecent) { - mostRecent = j; - break; - } - } - } - - } - - if (mostRecent > -1) - return setData.get(mostRecent).get("Code3"); - - return ""; - } - - /** - *

getSetInfo_Code.

- * - * @param SetList a {@link java.util.ArrayList} object. - * @param SetCode a {@link java.lang.String} object. - * @return a {@link forge.SetInfo} object. - */ - public static SetInfo getSetInfo_Code(ArrayList SetList, String SetCode) { - SetInfo si; - - for (int i = 0; i < SetList.size(); i++) { - si = SetList.get(i); - if (si.Code.equals(SetCode)) - return si; - } - - return null; - } - - /** - *

getSetIndex.

- * - * @param SetCode a {@link java.lang.String} object. - * @return a int. - */ - public static int getSetIndex(String SetCode) { - if (setData.size() == 0) - loadSetData(); - - for (int i = 0; i < setData.size(); i++) { - if (setData.get(i).get("Code3").equals(SetCode)) - return Integer.parseInt(setData.get(i).get("Index")); - } - - return 0; - } - - /** Constant blockData */ - private static ArrayList> blockData = new ArrayList>(); - - /** - *

loadBlockData.

- */ - private static void loadBlockData() { - ArrayList fData = FileUtil.readFile("res/blockdata/blocks.txt"); - - if (fData.size() > 0) { - for (int i = 0; i < fData.size(); i++) { - String s = fData.get(i); - if (s.length() > 5) { - HashMap sm = new HashMap(); - - String ss[] = s.split("\\|"); - for (int j = 0; j < ss.length; j++) { - String kv[] = ss[j].split(":"); - sm.put(kv[0], kv[1]); - } - - blockData.add(sm); - } - } - - } - } - - /** - *

getBlockNameList.

- * - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getBlockNameList() { - ArrayList bnl = new ArrayList(); - - if (blockData.size() == 0) - loadBlockData(); - - for (int i = 0; i < blockData.size(); i++) - bnl.add(blockData.get(i).get("Name")); - - return bnl; - } - - /** - *

getSets_BlockName.

- * - * @param blockName a {@link java.lang.String} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getSets_BlockName(String blockName) { - ArrayList sets = new ArrayList(); - - if (blockData.size() == 0) - loadBlockData(); - - for (int i = 0; i < blockData.size(); i++) { - if (blockData.get(i).get("Name").equals(blockName)) { - if (blockData.get(i).containsKey("Set0")) - sets.add(blockData.get(i).get("Set0")); - - if (blockData.get(i).containsKey("Set1")) - sets.add(blockData.get(i).get("Set1")); - - if (blockData.get(i).containsKey("Set2")) - sets.add(blockData.get(i).get("Set2")); - } - } - - return sets; - } - - /** - *

getDraftPackCount.

- * - * @param blockName a {@link java.lang.String} object. - * @return a int. - */ - public static int getDraftPackCount(String blockName) { - if (blockData.size() == 0) - loadBlockData(); - - for (int i = 0; i < blockData.size(); i++) { - if (blockData.get(i).get("Name").equals(blockName)) - return Integer.parseInt(blockData.get(i).get("DraftPacks")); - } - - return 0; - } - - /** - *

getSealedPackCount.

- * - * @param blockName a {@link java.lang.String} object. - * @return a int. - */ - public static int getSealedPackCount(String blockName) { - if (blockData.size() == 0) - loadBlockData(); - - for (int i = 0; i < blockData.size(); i++) { - if (blockData.get(i).get("Name").equals(blockName)) - return Integer.parseInt(blockData.get(i).get("SealedPacks")); - } - - return 0; - } - - /** - *

getLandCode.

- * - * @param blockName a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public static String getLandCode(String blockName) { - if (blockData.size() == 0) - loadBlockData(); - - for (int i = 0; i < blockData.size(); i++) { - if (blockData.get(i).get("Name").equals(blockName)) - return blockData.get(i).get("LandSetCode"); - } - - return "M11"; // default, should never happen IRL - } - - public static ArrayList getLegalSets(String fmt) { - ArrayList lglSets = new ArrayList(); - - lglSets = FileUtil.readFile("res/blockdata/" + fmt + ".txt"); - - return lglSets; - } -} diff --git a/src/forge/SimpleCombat.java b/src/forge/SimpleCombat.java deleted file mode 100644 index e79b183e428..00000000000 --- a/src/forge/SimpleCombat.java +++ /dev/null @@ -1,146 +0,0 @@ -package forge; - - -import java.util.HashMap; -import java.util.Iterator; - - -/** - *

SimpleCombat class.

- * - * @author Forge - * @version $Id: $ - */ -class SimpleCombat { - private HashMap map = new HashMap(); - private CardList attackers = new CardList(); - - /** - *

Constructor for SimpleCombat.

- */ - public SimpleCombat() { - } - - /** - *

Constructor for SimpleCombat.

- * - * @param attackingCreatures a {@link forge.CardList} object. - */ - public SimpleCombat(CardList attackingCreatures) { - CardList a = attackingCreatures; - for (int i = 0; i < a.size(); i++) - addAttacker(a.get(i)); - } - - /** - *

Getter for the field attackers.

- * - * @return a {@link forge.CardList} object. - */ - public CardList getAttackers() { - return attackers; - } - - /** - *

addAttacker.

- * - * @param c a {@link forge.Card} object. - */ - public void addAttacker(Card c) { - attackers.add(c); - map.put(c, new CardList()); - } - - /** - *

getBlockers.

- * - * @param attacker a {@link forge.Card} object. - * @return a {@link forge.CardList} object. - */ - public CardList getBlockers(Card attacker) { - return map.get(attacker); - } - - /** - *

addBlocker.

- * - * @param attacker a {@link forge.Card} object. - * @param blocker a {@link forge.Card} object. - */ - public void addBlocker(Card attacker, Card blocker) { - CardList list = map.get(attacker); - if (list == null) throw new RuntimeException("SimpleCombat : addBlocker() attacker not found - " + attacker); - - list.add(blocker); - } - - /** - *

getUnblockedAttackers.

- * - * @return a {@link forge.CardList} object. - */ - public CardList getUnblockedAttackers() { - CardList list = new CardList(); - Iterator it = map.keySet().iterator(); - while (it.hasNext()) { - Card attack = it.next(); - CardList block = map.get(attack); - if (block.size() == 0) list.add(attack); - } - - return list; - } - - //creatures destroy each other in combat damage - /** - *

combatDamage.

- * - * @return an array of {@link forge.CardList} objects. - */ - public CardList[] combatDamage() { - //aDestroy holds the number of creatures of A's that were destroyed - CardList aDestroy = new CardList(); - CardList bDestroy = new CardList(); - - CardList allAttackers = this.getAttackers(); - for (int i = 0; i < allAttackers.size(); i++) { - Card attack = allAttackers.get(i); - //for now, CardList blockers should only hold 1 Card - CardList blockers = map.get(attack); - if (blockers.size() == 0) { - } else { - - Card block = blockers.get(0); - int blockerDamage = block.getNetCombatDamage(); - int attackerDamage = attack.getNetCombatDamage(); - - if (attack.getNetDefense() <= blockerDamage) aDestroy.add(attack); - - if (block.getNetDefense() <= attackerDamage) bDestroy.add(block); - } - }//while - return new CardList[]{aDestroy, bDestroy}; - }//combatDamage() - - /** {@inheritDoc} */ - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - CardList attack = this.getAttackers(); - CardList block; - for (int i = 0; i < attack.size(); i++) { - block = this.getBlockers(attack.get(i)); - if (block.isEmpty()) { - sb.append(attack.get(i)); - sb.append(" "); - } else { - sb.append(attack.get(i)); - sb.append(" - "); - sb.append(block.get(0)); - sb.append(" "); - } - } - - return sb.toString(); - } -}//Combat diff --git a/src/forge/StaticEffect.java b/src/forge/StaticEffect.java deleted file mode 100644 index 4afbad688c5..00000000000 --- a/src/forge/StaticEffect.java +++ /dev/null @@ -1,635 +0,0 @@ -package forge; - - -import forge.card.spellability.SpellAbility; - -import java.util.ArrayList; -import java.util.HashMap; - -/** - *

StaticEffect class.

- * - * @author Forge - * @version $Id: $ - */ -public class StaticEffect { - private Card source = new Card(); - private int keywordNumber = 0; - private CardList affectedCards = new CardList(); - private int xValue = 0; - private int yValue = 0; - private long timestamp = -1; - - private String chosenType; - private HashMap mapParams = new HashMap(); - - //for P/T - private HashMap originalPT = new HashMap(); - - //for types - private boolean overwriteTypes = false; - private boolean keepSupertype = false; - private boolean removeSubTypes = false; - private HashMap> types = new HashMap>(); - private HashMap> originalTypes = new HashMap>(); - - //keywords - private boolean overwriteKeywords = false; - private HashMap> originalKeywords = new HashMap>(); - - //for abilities - private boolean overwriteAbilities = false; - private HashMap> originalAbilities = new HashMap>(); - - //for colors - private String colorDesc = ""; - private boolean overwriteColors = false; - private HashMap timestamps = new HashMap(); - - public void setTimestamp(long t) { - timestamp = t; - } - - public long getTimestamp() { - return timestamp; - } - - - //overwrite SAs - /** - *

isOverwriteAbilities.

- * - * @return a boolean. - */ - public boolean isOverwriteAbilities() { - return overwriteAbilities; - } - - /** - *

Setter for the field overwriteAbilities.

- * - * @param overwriteAbilities a boolean. - */ - public void setOverwriteAbilities(boolean overwriteAbilities) { - this.overwriteAbilities = overwriteAbilities; - } - - //original SAs - /** - *

addOriginalAbilities.

- * - * @param c a {@link forge.Card} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public void addOriginalAbilities(Card c, SpellAbility sa) { - if (!originalAbilities.containsKey(c)) { - ArrayList list = new ArrayList(); - list.add(sa); - originalAbilities.put(c, list); - } else originalAbilities.get(c).add(sa); - } - - /** - *

addOriginalAbilities.

- * - * @param c a {@link forge.Card} object. - * @param s a {@link java.util.ArrayList} object. - */ - public void addOriginalAbilities(Card c, ArrayList s) { - ArrayList list = new ArrayList(s); - if (!originalAbilities.containsKey(c)) { - originalAbilities.put(c, list); - } else { - originalAbilities.remove(c); - originalAbilities.put(c, list); - } - } - - /** - *

Getter for the field originalAbilities.

- * - * @param c a {@link forge.Card} object. - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getOriginalAbilities(Card c) { - ArrayList returnList = new ArrayList(); - if (originalAbilities.containsKey(c)) { - returnList.addAll(originalAbilities.get(c)); - } - return returnList; - } - - /** - *

clearOriginalAbilities.

- * - * @param c a {@link forge.Card} object. - */ - public void clearOriginalAbilities(Card c) { - if (originalAbilities.containsKey(c)) { - originalAbilities.get(c).clear(); - } - } - - /** - *

clearAllOriginalAbilities.

- */ - public void clearAllOriginalAbilities() { - originalAbilities.clear(); - } - - //overwrite keywords - /** - *

isOverwriteKeywords.

- * - * @return a boolean. - */ - public boolean isOverwriteKeywords() { - return overwriteKeywords; - } - - /** - *

Setter for the field overwriteKeywords.

- * - * @param overwriteKeywords a boolean. - */ - public void setOverwriteKeywords(boolean overwriteKeywords) { - this.overwriteKeywords = overwriteKeywords; - } - - //original keywords - /** - *

addOriginalKeyword.

- * - * @param c a {@link forge.Card} object. - * @param s a {@link java.lang.String} object. - */ - public void addOriginalKeyword(Card c, String s) { - if (!originalKeywords.containsKey(c)) { - ArrayList list = new ArrayList(); - list.add(s); - originalKeywords.put(c, list); - } else originalKeywords.get(c).add(s); - } - - /** - *

addOriginalKeywords.

- * - * @param c a {@link forge.Card} object. - * @param s a {@link java.util.ArrayList} object. - */ - public void addOriginalKeywords(Card c, ArrayList s) { - ArrayList list = new ArrayList(s); - if (!originalKeywords.containsKey(c)) { - originalKeywords.put(c, list); - } else { - originalKeywords.remove(c); - originalKeywords.put(c, list); - } - } - - /** - *

Getter for the field originalKeywords.

- * - * @param c a {@link forge.Card} object. - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getOriginalKeywords(Card c) { - ArrayList returnList = new ArrayList(); - if (originalKeywords.containsKey(c)) { - returnList.addAll(originalKeywords.get(c)); - } - return returnList; - } - - /** - *

clearOriginalKeywords.

- * - * @param c a {@link forge.Card} object. - */ - public void clearOriginalKeywords(Card c) { - if (originalKeywords.containsKey(c)) { - originalKeywords.get(c).clear(); - } - } - - /** - *

clearAllOriginalKeywords.

- */ - public void clearAllOriginalKeywords() { - originalKeywords.clear(); - } - - //original power/toughness - /** - *

addOriginalPT.

- * - * @param c a {@link forge.Card} object. - * @param power a int. - * @param toughness a int. - */ - public void addOriginalPT(Card c, int power, int toughness) { - String pt = power + "/" + toughness; - if (!originalPT.containsKey(c)) { - originalPT.put(c, pt); - } - } - - /** - *

getOriginalPower.

- * - * @param c a {@link forge.Card} object. - * @return a int. - */ - public int getOriginalPower(Card c) { - int power = -1; - if (originalPT.containsKey(c)) { - power = Integer.parseInt(originalPT.get(c).split("/")[0]); - } - return power; - } - - /** - *

getOriginalToughness.

- * - * @param c a {@link forge.Card} object. - * @return a int. - */ - public int getOriginalToughness(Card c) { - int tough = -1; - if (originalPT.containsKey(c)) { - tough = Integer.parseInt(originalPT.get(c).split("/")[1]); - } - return tough; - } - - /** - *

clearAllOriginalPTs.

- */ - public void clearAllOriginalPTs() { - originalPT.clear(); - } - - //should we overwrite types? - /** - *

isOverwriteTypes.

- * - * @return a boolean. - */ - public boolean isOverwriteTypes() { - return overwriteTypes; - } - - /** - *

Setter for the field overwriteTypes.

- * - * @param overwriteTypes a boolean. - */ - public void setOverwriteTypes(boolean overwriteTypes) { - this.overwriteTypes = overwriteTypes; - } - - /** - *

isKeepSupertype.

- * - * @return a boolean. - */ - public boolean isKeepSupertype() { - return keepSupertype; - } - - /** - *

Setter for the field keepSupertype.

- * - * @param keepSupertype a boolean. - */ - public void setKeepSupertype(boolean keepSupertype) { - this.keepSupertype = keepSupertype; - } - - //should we overwrite land types? - /** - *

isRemoveSubTypes.

- * - * @return a boolean. - */ - public boolean isRemoveSubTypes() { - return removeSubTypes; - } - - /** - *

Setter for the field removeSubTypes.

- * - * @param removeSubTypes a boolean. - */ - public void setRemoveSubTypes(boolean removeSubTypes) { - this.removeSubTypes = removeSubTypes; - } - - //original types - /** - *

addOriginalType.

- * - * @param c a {@link forge.Card} object. - * @param s a {@link java.lang.String} object. - */ - public void addOriginalType(Card c, String s) { - if (!originalTypes.containsKey(c)) { - ArrayList list = new ArrayList(); - list.add(s); - originalTypes.put(c, list); - } else originalTypes.get(c).add(s); - } - - /** - *

addOriginalTypes.

- * - * @param c a {@link forge.Card} object. - * @param s a {@link java.util.ArrayList} object. - */ - public void addOriginalTypes(Card c, ArrayList s) { - ArrayList list = new ArrayList(s); - if (!originalTypes.containsKey(c)) { - originalTypes.put(c, list); - } else { - originalTypes.remove(c); - originalTypes.put(c, list); - } - } - - /** - *

Getter for the field originalTypes.

- * - * @param c a {@link forge.Card} object. - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getOriginalTypes(Card c) { - ArrayList returnList = new ArrayList(); - if (originalTypes.containsKey(c)) { - returnList.addAll(originalTypes.get(c)); - } - return returnList; - } - - /** - *

clearOriginalTypes.

- * - * @param c a {@link forge.Card} object. - */ - public void clearOriginalTypes(Card c) { - if (originalTypes.containsKey(c)) { - originalTypes.get(c).clear(); - } - } - - /** - *

clearAllOriginalTypes.

- */ - public void clearAllOriginalTypes() { - originalTypes.clear(); - } - - //statically assigned types - /** - *

addType.

- * - * @param c a {@link forge.Card} object. - * @param s a {@link java.lang.String} object. - */ - public void addType(Card c, String s) { - if (!types.containsKey(c)) { - ArrayList list = new ArrayList(); - list.add(s); - types.put(c, list); - } else types.get(c).add(s); - } - - /** - *

Getter for the field types.

- * - * @param c a {@link forge.Card} object. - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getTypes(Card c) { - ArrayList returnList = new ArrayList(); - if (types.containsKey(c)) { - returnList.addAll(types.get(c)); - } - return returnList; - } - - /** - *

removeType.

- * - * @param c a {@link forge.Card} object. - * @param type a {@link java.lang.String} object. - */ - public void removeType(Card c, String type) { - if (types.containsKey(c)) { - types.get(c).remove(type); - } - } - - /** - *

clearTypes.

- * - * @param c a {@link forge.Card} object. - */ - public void clearTypes(Card c) { - if (types.containsKey(c)) { - types.get(c).clear(); - } - } - - /** - *

clearAllTypes.

- */ - public void clearAllTypes() { - types.clear(); - } - - /** - *

Getter for the field colorDesc.

- * - * @return a {@link java.lang.String} object. - */ - public String getColorDesc() { - return colorDesc; - } - - /** - *

Setter for the field colorDesc.

- * - * @param colorDesc a {@link java.lang.String} object. - */ - public void setColorDesc(String colorDesc) { - this.colorDesc = colorDesc; - } - - //overwrite color - /** - *

isOverwriteColors.

- * - * @return a boolean. - */ - public boolean isOverwriteColors() { - return overwriteColors; - } - - /** - *

Setter for the field overwriteColors.

- * - * @param overwriteColors a boolean. - */ - public void setOverwriteColors(boolean overwriteColors) { - this.overwriteColors = overwriteColors; - } - - /** - *

Getter for the field timestamps.

- * - * @return a {@link java.util.HashMap} object. - */ - public HashMap getTimestamps() { - return timestamps; - } - - /** - *

getTimestamp.

- * - * @param c a {@link forge.Card} object. - * @return a long. - */ - public long getTimestamp(Card c) { - long stamp = -1; - Long l = timestamps.get(c); - if (null != l) { - stamp = l.longValue(); - } - return stamp; - } - - /** - *

addTimestamp.

- * - * @param c a {@link forge.Card} object. - * @param timestamp a long. - */ - public void addTimestamp(Card c, long timestamp) { - timestamps.put(c, Long.valueOf(timestamp)); - } - - /** - *

clearTimestamps.

- */ - public void clearTimestamps() { - timestamps.clear(); - } - - /** - *

Setter for the field source.

- * - * @param card a {@link forge.Card} object. - */ - public void setSource(Card card) { - source = card; - } - - /** - *

Getter for the field source.

- * - * @return a {@link forge.Card} object. - */ - public Card getSource() { - return source; - } - - /** - *

Setter for the field keywordNumber.

- * - * @param i a int. - */ - public void setKeywordNumber(int i) { - keywordNumber = i; - } - - /** - *

Getter for the field keywordNumber.

- * - * @return a int. - */ - public int getKeywordNumber() { - return keywordNumber; - } - - /** - *

Getter for the field affectedCards.

- * - * @return a {@link forge.CardList} object. - */ - public CardList getAffectedCards() { - return affectedCards; - } - - /** - *

Setter for the field affectedCards.

- * - * @param list a {@link forge.CardList} object. - */ - public void setAffectedCards(CardList list) { - affectedCards = list; - } - - /** - *

Setter for the field xValue.

- * - * @param x a int. - */ - public void setXValue(int x) { - xValue = x; - } - - /** - *

Getter for the field xValue.

- * - * @return a int. - */ - public int getXValue() { - return xValue; - } - - /** - *

Setter for the field yValue.

- * - * @param y a int. - */ - public void setYValue(int y) { - yValue = y; - } - - /** - *

Getter for the field yValue.

- * - * @return a int. - */ - public int getYValue() { - return yValue; - } - - public void setParams(HashMap params) { - mapParams = params; - } - - public HashMap getParams() { - return mapParams; - } - - public void setChosenType(String type) { - chosenType = type; - } - - public String getChosenType() { - return chosenType; - } - - -}//end class StaticEffect diff --git a/src/forge/StaticEffects.java b/src/forge/StaticEffects.java deleted file mode 100644 index 3a8f3835b97..00000000000 --- a/src/forge/StaticEffects.java +++ /dev/null @@ -1,234 +0,0 @@ -package forge; - -import com.esotericsoftware.minlog.Log; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.SpellAbility; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; - - -/** - *

StaticEffects class.

- * - * @author Forge - * @version $Id: $ - */ -public class StaticEffects { - - //**************** StaticAbility system ************************** - public ArrayList staticEffects; - - public void clearStaticEffects() { - // remove all static effects - for (int i = 0; i < staticEffects.size(); i++) { - removeStaticEffect(staticEffects.get(i)); - } - staticEffects = new ArrayList(); - - AllZone.getTriggerHandler().removeTemporaryTriggers(); - } - - public void addStaticEffect(StaticEffect staticEffect) { - staticEffects.add(staticEffect); - } - - void removeStaticEffect(StaticEffect se) { - CardList affectedCards = se.getAffectedCards(); - HashMap params = se.getParams(); - - int powerBonus = 0; - int toughnessBonus = 0; - boolean setPT = false; - String addKeywords[] = null; - String addColors = null; - - if (params.containsKey("SetPower") || params.containsKey("SetToughness")) { - setPT = true; - } - - if (params.containsKey("AddPower")) { - if (params.get("AddPower").equals("X")) { - powerBonus = se.getXValue(); - } else if (params.get("AddPower").equals("Y")) { - powerBonus = se.getYValue(); - } else - powerBonus = Integer.valueOf(params.get("AddPower")); - } - - if (params.containsKey("AddToughness")) { - if (params.get("AddToughness").equals("X")) - toughnessBonus = se.getXValue(); - else if (params.get("AddToughness").equals("Y")) - toughnessBonus = se.getYValue(); - else toughnessBonus = Integer.valueOf(params.get("AddToughness")); - } - - if (params.containsKey("AddKeyword")) - addKeywords = params.get("AddKeyword").split(" & "); - - if (params.containsKey("AddColor")) - addColors = CardUtil.getShortColorsString(new ArrayList(Arrays.asList(params.get("AddColor").split(" & ")))); - - if (params.containsKey("SetColor")) - addColors = CardUtil.getShortColorsString(new ArrayList(Arrays.asList(params.get("SetColor").split(" & ")))); - - //modify the affected card - for (int i = 0; i < affectedCards.size(); i++) { - Card affectedCard = affectedCards.get(i); - - //remove set P/T - if(!params.containsKey("CharacteristicDefining") && setPT) - affectedCard.removeNewPT(se.getTimestamp()); - - //remove P/T bonus - affectedCard.addSemiPermanentAttackBoost(powerBonus * -1); - affectedCard.addSemiPermanentDefenseBoost(toughnessBonus * -1); - - //remove keywords - if (addKeywords != null) - for (String keyword : addKeywords) - affectedCard.removeExtrinsicKeyword(keyword); - - //remove abilities - if (params.containsKey("AddAbility")) { - SpellAbility[] spellAbility = affectedCard.getSpellAbility(); - for (SpellAbility s : spellAbility) - if (s.getType().equals("Temporary")) - affectedCard.removeSpellAbility(s); - } - - //remove Types - if (params.containsKey("AddType")) - affectedCard.removeChangedCardTypes(se.getTimestamp()); - - //remove colors - if (addColors != null) - affectedCard.removeColor(addColors, affectedCard, !se.isOverwriteColors(), se.getTimestamp(affectedCard)); - } - se.clearTimestamps(); - } - - //**************** End StaticAbility system ************************** - - //this is used to keep track of all state-based effects in play: - private HashMap stateBasedMap = new HashMap(); - - //this is used to define all cards that are state-based effects, and map the corresponding commands to their cardnames - /** Constant cardToEffectsList */ - private static HashMap cardToEffectsList = new HashMap(); - - /** - *

Constructor for StaticEffects.

- */ - public StaticEffects() { - initStateBasedEffectsList(); - staticEffects = new ArrayList(); - } - - /** - *

initStateBasedEffectsList.

- */ - public void initStateBasedEffectsList() { - //value has to be an array, since certain cards have multiple commands associated with them - - cardToEffectsList.put("Avatar", new String[]{"Ajani_Avatar_Token"}); - cardToEffectsList.put("Coat of Arms", new String[]{"Coat_of_Arms"}); - //cardToEffectsList.put("Conspiracy", new String[]{"Conspiracy"}); - cardToEffectsList.put("Favor of the Mighty", new String[]{"Favor_of_the_Mighty"}); - cardToEffectsList.put("Gaddock Teeg", new String[]{"Gaddock_Teeg"}); - - cardToEffectsList.put("Homarid", new String[]{"Homarid"}); - cardToEffectsList.put("Iona, Shield of Emeria", new String[]{"Iona_Shield_of_Emeria"}); - cardToEffectsList.put("Liu Bei, Lord of Shu", new String[]{"Liu_Bei"}); - - cardToEffectsList.put("Meddling Mage", new String[]{"Meddling_Mage"}); - cardToEffectsList.put("Muraganda Petroglyphs", new String[]{"Muraganda_Petroglyphs"}); - cardToEffectsList.put("Old Man of the Sea", new String[]{"Old_Man_of_the_Sea"}); - - cardToEffectsList.put("Tarmogoyf", new String[]{"Tarmogoyf"}); - - cardToEffectsList.put("Umbra Stalker", new String[]{"Umbra_Stalker"}); - cardToEffectsList.put("Wolf", new String[]{"Sound_the_Call_Wolf"}); - - } - - /** - *

Getter for the field cardToEffectsList.

- * - * @return a {@link java.util.HashMap} object. - */ - public HashMap getCardToEffectsList() { - return cardToEffectsList; - } - - /** - *

addStateBasedEffect.

- * - * @param s a {@link java.lang.String} object. - */ - public void addStateBasedEffect(String s) { - if (stateBasedMap.containsKey(s)) - stateBasedMap.put(s, stateBasedMap.get(s) + 1); - else - stateBasedMap.put(s, 1); - } - - /** - *

removeStateBasedEffect.

- * - * @param s a {@link java.lang.String} object. - */ - public void removeStateBasedEffect(String s) { - if (stateBasedMap.containsKey(s)) { - stateBasedMap.put(s, stateBasedMap.get(s) - 1); - if (stateBasedMap.get(s) == 0) - stateBasedMap.remove(s); - } - } - - /** - *

Getter for the field stateBasedMap.

- * - * @return a {@link java.util.HashMap} object. - */ - public HashMap getStateBasedMap() { - return stateBasedMap; - } - - /** - *

reset.

- */ - public void reset() { - stateBasedMap.clear(); - } - - /** - *

rePopulateStateBasedList.

- */ - public void rePopulateStateBasedList() { - reset(); - - CardList cards = AllZoneUtil.getCardsInPlay(); - - Log.debug("== Start add state effects =="); - for (int i = 0; i < cards.size(); i++) { - Card c = cards.get(i); - if (cardToEffectsList.containsKey(c.getName())) { - String[] effects = getCardToEffectsList().get(c.getName()); - for (String effect : effects) { - addStateBasedEffect(effect); - Log.debug("Added " + effect); - } - } - if (c.isEmblem() && !CardFactoryUtil.checkEmblemKeyword(c).equals("")) { - String s = CardFactoryUtil.checkEmblemKeyword(c); - addStateBasedEffect(s); - Log.debug("Added " + s); - } - } - Log.debug("== End add state effects =="); - - } -} diff --git a/src/forge/TableModel.java b/src/forge/TableModel.java deleted file mode 100644 index 7887f8ac507..00000000000 --- a/src/forge/TableModel.java +++ /dev/null @@ -1,453 +0,0 @@ -package forge; - - -import javax.swing.*; -import javax.swing.table.AbstractTableModel; -import javax.swing.table.TableColumn; -import javax.swing.table.TableColumnModel; -import java.awt.event.*; -import java.util.Arrays; - - -/** - *

TableModel class.

- * - * @author Forge - * @version $Id: $ - */ -class TableModel 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", "AI"}; - private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "R", "Set", "AI"}; - - //used to resort(), used when addCard(Card) is called - private int recentSortedColumn; - private boolean recentAscending; - - /** - *

Constructor for TableModel.

- * - * @param cd a {@link forge.CardContainer} object. - */ - public TableModel(CardContainer cd) { - this(new CardList(), cd); - } - - /** - *

Constructor for TableModel.

- * - * @param inData a {@link forge.CardList} object. - * @param in_cardDetail a {@link forge.CardContainer} object. - */ - public TableModel(CardList inData, CardContainer in_cardDetail) { - cardDetail = in_cardDetail; - //intialize dataNoCopies and dataCopies - addCard(inData); - } - - - /** - *

resizeCols.

- * - * @param table a {@link javax.swing.JTable} object. - */ - 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(35); // Qty - column.setMaxWidth(35); - column.setMinWidth(35); - } else if (i == 1) { - column.setPreferredWidth(190); // Name - column.setMinWidth(170); - column.setMaxWidth(200); - } else if (i == 2) { - column.setPreferredWidth(80); // Cost - column.setMinWidth(70); - column.setMaxWidth(90); - } else if (i == 3) { - column.setPreferredWidth(70); // Color - column.setMaxWidth(70); - column.setMinWidth(70); - } else if (i == 4) { - column.setPreferredWidth(130); // Type - } else if (i == 5) { - column.setPreferredWidth(50); // Stats - column.setMaxWidth(50); - column.setMinWidth(50); - } else if (i == 6) { - column.setPreferredWidth(25); // R - column.setMaxWidth(25); - column.setMinWidth(25); - } else if (i == 7) { - column.setPreferredWidth(45); // Set - column.setMaxWidth(45); - column.setMinWidth(45); - } else if (i == 8) { - column.setPreferredWidth(30); // AI - column.setMaxWidth(30); - column.setMinWidth(30); - } - }//for - - /*for(int j = 0; j < table.getColumnCount(); j++) { - column = table.getColumnModel().getColumn(j); - //System.out.println("col Width:" + column.getPreferredWidth()); - }*/ - } - - /** - *

clear.

- */ - public void clear() { - dataNoCopies.clear(); - dataCopies.clear(); - //fireTableDataChanged(); - } - - /** - *

getCards.

- * - * @return a {@link forge.CardList} object. - */ - public CardList getCards() { - CardList all = new CardList(); - all.addAll(dataCopies); - all.addAll(dataNoCopies); - - return all; - } - - /** - *

removeCard.

- * - * @param c a {@link forge.Card} object. - */ - 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(); - } - - /** - *

findCardName.

- * - * @param name a {@link java.lang.String} object. - * @param list a {@link forge.CardList} object. - * @return a int. - */ - 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; - } - - /** - *

addCard.

- * - * @param c a {@link forge.Card} object. - */ - public void addCard(Card c) { - if (0 == countQuantity(c, dataNoCopies)) dataNoCopies.add(c); - else dataCopies.add(c); - } - - /** - *

addCard.

- * - * @param c a {@link forge.CardList} object. - */ - public void addCard(CardList c) { - for (int i = 0; i < c.size(); i++) - addCard(c.get(i)); - - fireTableDataChanged(); - } - - /** - *

rowToCard.

- * - * @param row a int. - * @return a {@link forge.Card} object. - */ - public Card rowToCard(int row) { - return dataNoCopies.get(row); - } - - /** - *

countQuantity.

- * - * @param c a {@link forge.Card} object. - * @return a int. - */ - private int countQuantity(Card c) { - return countQuantity(c, dataNoCopies) + countQuantity(c, dataCopies); - } - - //CardList data is either class members "dataNoCopies" or "dataCopies" - /** - *

countQuantity.

- * - * @param c a {@link forge.Card} object. - * @param data a {@link forge.CardList} object. - * @return a int. - */ - private int countQuantity(Card c, CardList data) { - int count = 0; - for (int i = 0; i < data.size(); i++) { - //are the card names and set code the same? - Card dc = data.get(i); - if (dc.getName().equals(c.getName()) && - dc.getCurSetCode().equals(c.getCurSetCode())) count++; - } - - return count; - } - - /** - *

getRowCount.

- * - * @return a int. - */ - public int getRowCount() { - return dataNoCopies.size(); - } - - /** - *

getColumnCount.

- * - * @return a int. - */ - public int getColumnCount() { - return column.length; - } - - /** {@inheritDoc} */ - @Override - public String getColumnName(int n) { - return column[n]; - } - - /** {@inheritDoc} */ - public Object getValueAt(int row, int column) { - return getColumn(dataNoCopies.get(row), column); - } - - /** - *

Getter for the field column.

- * - * @param c a {@link forge.Card} object. - * @param column a int. - * @param column a int. - * @return a {@link java.lang.Object} object. - */ - 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.getBaseAttackString() + "/" + c.getBaseDefenseString():""; - if (c.isCreature()) { - return c.getBaseAttackString() + "/" + c.getBaseDefenseString(); - } else if (c.isPlaneswalker()) { - return Integer.toString(c.getBaseLoyalty()); - } - return ""; - case 6: - String rarity = c.getRarity(); - - if (rarity.equals("new")) - return "n"; - else { - if (rarity.length() > 0) - rarity = rarity.substring(0, 1); - } - - if (!c.getCurSetCode().equals("")) { - SetInfo si = SetInfoUtil.getSetInfo_Code(c.getSets(), c.getCurSetCode()); - if (si != null) - return si.Rarity.substring(0, 1); - } - return rarity; - case 7: - String SC = c.getCurSetCode(); - if (!SC.equals("")) - return SC; - case 8: - if (c.getSVar("RemAIDeck").equals("True") - && c.getSVar("RemRandomDeck").equals("True")) - return "No ?"; - else if (c.getSVar("RemAIDeck").equals("True")) - return "No"; - else if (c.getSVar("RemRandomDeck").equals("True")) - return "?"; - else - return ""; - - default: - return "error"; - } - } - - /** - *

addListeners.

- * - * @param table a {@link javax.swing.JTable} object. - */ - 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 - /** - *

resort.

- */ - public void resort() { - sort(recentSortedColumn, recentAscending); - //this.fireTableDataChanged(); - } - - //returns true if any data changed positions - // @SuppressWarnings("unchecked") - // Arrays.sort - /** - *

sort.

- * - * @param column a int. - * @param ascending a boolean. - * @return a boolean. - */ - 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); - all.addAll(dataCopies); - - TableSorter sorter = new TableSorter(all, column, ascending, true); - 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/TableSorter.java b/src/forge/TableSorter.java deleted file mode 100644 index 8f5b5934c02..00000000000 --- a/src/forge/TableSorter.java +++ /dev/null @@ -1,258 +0,0 @@ -package forge; - - -import forge.properties.NewConstants; - -import java.util.ArrayList; -import java.util.Comparator; - -/** - *

TableSorter class.

- * - * @author Forge - * @version $Id: $ - */ -@SuppressWarnings("unchecked") // Comparable needs -public class TableSorter implements Comparator, NewConstants { - private final int column; - private boolean ascending; - private boolean col7mod; - - private CardList all; - - //used by compare() - @SuppressWarnings("rawtypes") - private Comparable aCom = null; - @SuppressWarnings("rawtypes") - private Comparable bCom = null; - - //used if in_column is 7, new cards first - the order is based on cards.txt - //static because this should only be read once - //static to try to reduce file io operations - //private static HashMap cardsTxt = null; - - // 0 1 2 3 4 5 6 7 - //private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "Rarity"}; New cards first - the order is based on cards.txt - - /** - *

Constructor for TableSorter.

- * - * @param in_all a {@link forge.CardList} object. - * @param in_column a int. - * @param in_ascending a boolean. - */ - public TableSorter(CardList in_all, int in_column, boolean in_ascending) { - all = new CardList(in_all.toArray()); - column = in_column; - ascending = in_ascending; - } - - /** - *

Constructor for TableSorter.

- * - * @param in_all a {@link forge.CardList} object. - * @param in_column a int. - * @param in_ascending a boolean. - * @param in_col7mod a boolean. - */ - public TableSorter(CardList in_all, int in_column, boolean in_ascending, boolean in_col7mod) { - all = new CardList(in_all.toArray()); - column = in_column; - ascending = in_ascending; - col7mod = in_col7mod; - } - - /** - *

compare.

- * - * @param a a {@link forge.Card} object. - * @param b a {@link forge.Card} object. - * @return a int. - */ - final public int compare(Card a, Card b) { - - if (column == 0)//Qty - { - aCom = Integer.valueOf(countCardName(a.getName(), all)); - bCom = Integer.valueOf(countCardName(b.getName(), all)); - } else if (column == 1)//Name - { - aCom = a.getName(); - bCom = b.getName(); - } else if (column == 2)//Cost - { - aCom = Double.valueOf(CardUtil.getWeightedManaCost(a.getManaCost())); - bCom = Double.valueOf(CardUtil.getWeightedManaCost(b.getManaCost())); - - if (a.isLand()) - aCom = Double.valueOf(-1); - if (b.isLand()) - bCom = Double.valueOf(-1); - } else if (column == 3)//Color - { - aCom = getColor(a); - bCom = getColor(b); - } else if (column == 4)//Type - { - aCom = getType(a); - bCom = getType(b); - } else if (column == 5)//Stats, attack and defense - { - if (a.isCreature()) { - aCom = a.getBaseAttackString() + "." + a.getBaseDefenseString(); - } else { - aCom = ""; - } - - if (b.isCreature()) { - bCom = b.getBaseAttackString() + "." + b.getBaseDefenseString(); - } else { - bCom = ""; - } - } else if (column == 6)//Rarity - { - aCom = getRarity(a); - bCom = getRarity(b); - } else if (column == 7 && col7mod == false)//Value - { - aCom = getValue(a); - bCom = getValue(b); - } else if (column == 7 && col7mod == true)//Set - { - aCom = SetInfoUtil.getSetIndex(a.getCurSetCode()); - bCom = SetInfoUtil.getSetIndex(b.getCurSetCode()); - } else if (column == 8)//AI - { - aCom = getAI(a); - bCom = getAI(b); - } - /*else if (column == 99)//New First - { - aCom = sortNewFirst(a); - bCom = sortNewFirst(b); - }*/ - - if (ascending) - return aCom.compareTo(bCom); - else - return bCom.compareTo(aCom); - }//compare() - - /** - *

countCardName.

- * - * @param name a {@link java.lang.String} object. - * @param c a {@link forge.CardList} object. - * @return a int. - */ - final private int countCardName(String name, CardList c) { - int count = 0; - for (int i = 0; i < c.size(); i++) - if (name.equals(c.get(i).getName())) - count++; - - return count; - } - - /** - *

getRarity.

- * - * @param c a {@link forge.Card} object. - * @return a {@link java.lang.Integer} object. - */ - final private Integer getRarity(Card c) { - String rarity = c.getRarity(); - - if (rarity.equals("new")) - return 1; - - if (!c.getCurSetCode().equals("")) { - SetInfo si = SetInfoUtil.getSetInfo_Code(c.getSets(), c.getCurSetCode()); - if (si != null) - rarity = si.Rarity; - } - - if (rarity.equals("Common")) - return 2; - else if (rarity.equals("Uncommon")) - return 3; - else if (rarity.equals("Rare")) - return 4; - else if (rarity.equals("Mythic")) - return 5; - else if (rarity.equals("Special")) - return 6; - else if (rarity.equals("Land")) - return 7; - else - return 8; - - // This older form of the method no longer works as it is not compatible with set info. - /* - if(c.getRarity().equals("Common")) - return Integer.valueOf(1); - else if(c.getRarity().equals("Uncommon")) - return Integer.valueOf(2); - else if(c.getRarity().equals("Rare")) - return Integer.valueOf(3); - else if(c.getRarity().equals("Land")) - return Integer.valueOf(4); - else - return Integer.valueOf(5); - */ - } - - /** - *

getValue.

- * - * @param c a {@link forge.Card} object. - * @return a {@link java.lang.Long} object. - */ - final private Long getValue(Card c) { - return c.getValue(); - } - - /** - *

getColor.

- * - * @param c a {@link forge.Card} object. - * @return a {@link java.lang.String} object. - */ - final public static String getColor(Card c) { - ArrayList list = CardUtil.getColors(c); - - if (list.size() == 1) - return list.get(0).toString(); - - return "multi"; - } - - /** - *

getAI.

- * - * @param c a {@link forge.Card} object. - * @return a {@link java.lang.Integer} object. - */ - final private Integer getAI(Card c) { - if (c.getSVar("RemAIDeck").equals("True") - && c.getSVar("RemRandomDeck").equals("True")) - return Integer.valueOf(3); - else if (c.getSVar("RemAIDeck").equals("True")) - return Integer.valueOf(4); - else if (c.getSVar("RemRandomDeck").equals("True")) - return Integer.valueOf(2); - else - return Integer.valueOf(1); - } - - /** - *

getType.

- * - * @param c a {@link forge.Card} object. - * @return a {@link java.lang.Comparable} object. - */ - final private Comparable getType(Card c) { - return c.getType().toString(); - } - -} diff --git a/src/forge/Time.java b/src/forge/Time.java deleted file mode 100644 index 38c577d4ef2..00000000000 --- a/src/forge/Time.java +++ /dev/null @@ -1,45 +0,0 @@ -package forge; - -/** - *

Time class.

- * - * @author Forge - * @version $Id: $ - */ -public class Time { - private long startTime; - private long stopTime; - - /** - *

Constructor for Time.

- */ - public Time() { - start(); - } - - /** - *

start.

- */ - public void start() { - startTime = System.currentTimeMillis(); - } - - /** - *

stop.

- * - * @return a double. - */ - public double stop() { - stopTime = System.currentTimeMillis(); - return getTime(); - } - - /** - *

getTime.

- * - * @return a double. - */ - public double getTime() { - return (stopTime - startTime) / 1000.0; - } -} diff --git a/src/forge/UndoCommand.java b/src/forge/UndoCommand.java deleted file mode 100644 index 2e50e9a744a..00000000000 --- a/src/forge/UndoCommand.java +++ /dev/null @@ -1,19 +0,0 @@ -package forge; - -/** - *

UndoCommand interface.

- * - * @author Forge - * @version $Id: $ - */ -public interface UndoCommand extends Command { - /** - *

execute.

- */ - public void execute(); - - /** - *

undo.

- */ - public void undo(); -} diff --git a/src/forge/ZCTrigger.java b/src/forge/ZCTrigger.java deleted file mode 100644 index d06d676c1c7..00000000000 --- a/src/forge/ZCTrigger.java +++ /dev/null @@ -1,56 +0,0 @@ -package forge; - -/** - *

ZCTrigger class.

- * - * @author Forge - * @version $Id: $ - */ -public enum ZCTrigger { - ENTERFIELD("comes into play", "any > field"), //explanation: zone before last trigger check ">" zone card currently in - LEAVEFIELD("leaves play", "field > any"), - DESTROY("is put into a graveyard from play", "field > grave"), - ENTERGRAVE("is put into a graveyard from anywhere", "any > grave"); - public String ruleText; - public String[] triggerZones; - - /** - *

Constructor for ZCTrigger.

- * - * @param text a {@link java.lang.String} object. - * @param tofrom a {@link java.lang.String} object. - */ - ZCTrigger(String text, String tofrom) { - this.ruleText = text; - this.triggerZones = tofrom.split(" > "); - } - - /** - *

triggerOn.

- * - * @param sourceZone a {@link java.lang.String} object. - * @param destintationZone a {@link java.lang.String} object. - * @return a boolean. - */ - public boolean triggerOn(String sourceZone, String destintationZone) { - return ((triggerZones[0].equals("any") || triggerZones[0].equals(sourceZone)) && (triggerZones[1].equals("any") || triggerZones[0].equals(sourceZone))); - } - - /** - *

getTrigger.

- * - * @param description a {@link java.lang.String} object. - * @return a {@link forge.ZCTrigger} object. - */ - public static ZCTrigger getTrigger(String description) { - for (ZCTrigger t : ZCTrigger.values()) - if (t.ruleText.equals(description)) return t; - return null; - } - - /** {@inheritDoc} */ - @Override - public String toString() { - return ruleText; - } -} diff --git a/src/forge/card/abilityFactory/AbilityFactory.java b/src/forge/card/abilityFactory/AbilityFactory.java deleted file mode 100644 index 6422aa72134..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory.java +++ /dev/null @@ -1,1798 +0,0 @@ -package forge.card.abilityFactory; - -import forge.*; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.*; - -import java.util.ArrayList; -import java.util.HashMap; - -/** - *

AbilityFactory class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory { - - private Card hostC = null; - - /** - *

getHostCard.

- * - * @return a {@link forge.Card} object. - */ - public Card getHostCard() { - return hostC; - } - - private HashMap mapParams = new HashMap(); - - /** - *

Getter for the field mapParams.

- * - * @return a {@link java.util.HashMap} object. - */ - public HashMap getMapParams() { - return mapParams; - } - - private boolean isAb = false; - private boolean isSp = false; - private boolean isDb = false; - - /** - *

isAbility.

- * - * @return a boolean. - */ - public boolean isAbility() { - return isAb; - } - - /** - *

isSpell.

- * - * @return a boolean. - */ - public boolean isSpell() { - return isSp; - } - - /** - *

isDrawback.

- * - * @return a boolean. - */ - public boolean isDrawback() { - return isDb; - } - - private Cost abCost = null; - - /** - *

Getter for the field abCost.

- * - * @return a {@link forge.card.spellability.Cost} object. - */ - public Cost getAbCost() { - return abCost; - } - - private boolean isTargeted = false; - private boolean hasValid = false; - private Target abTgt = null; - - /** - *

isTargeted.

- * - * @return a boolean. - */ - public boolean isTargeted() { - return isTargeted; - } - - /** - *

hasValid.

- * - * @return a boolean. - */ - public boolean hasValid() { - return hasValid; - } - - /** - *

Getter for the field abTgt.

- * - * @return a {@link forge.card.spellability.Target} object. - */ - public Target getAbTgt() { - return abTgt; - } - - /** - *

isCurse.

- * - * @return a boolean. - */ - public boolean isCurse() { - return mapParams.containsKey("IsCurse"); - } - - private boolean hasSubAb = false; - - /** - *

hasSubAbility.

- * - * @return a boolean. - */ - public boolean hasSubAbility() { - return hasSubAb; - } - - private boolean hasSpDesc = false; - - /** - *

hasSpDescription.

- * - * @return a boolean. - */ - public boolean hasSpDescription() { - return hasSpDesc; - } - - private String API = ""; - - /** - *

getAPI.

- * - * @return a {@link java.lang.String} object. - */ - public String getAPI() { - return API; - } - - //******************************************************* - - /** - *

Getter for the field mapParams.

- * - * @param abString a {@link java.lang.String} object. - * @param hostCard a {@link forge.Card} object. - * @return a {@link java.util.HashMap} object. - */ - public HashMap getMapParams(String abString, Card hostCard) { - HashMap mapParameters = new HashMap(); - - if (!(abString.length() > 0)) - throw new RuntimeException("AbilityFactory : getAbility -- abString too short in " + hostCard.getName() + ": [" + abString + "]"); - - String a[] = abString.split("\\|"); - - for (int aCnt = 0; aCnt < a.length; aCnt++) - a[aCnt] = a[aCnt].trim(); - - if (!(a.length > 0)) - throw new RuntimeException("AbilityFactory : getAbility -- a[] too short in " + hostCard.getName()); - - for (int i = 0; i < a.length; i++) { - String aa[] = a[i].split("\\$"); - - for (int aaCnt = 0; aaCnt < aa.length; aaCnt++) - aa[aaCnt] = aa[aaCnt].trim(); - - if (aa.length != 2) { - StringBuilder sb = new StringBuilder(); - sb.append("AbilityFactory Parsing Error in getAbility() : Split length of "); - sb.append(a[i]).append(" in ").append(hostCard.getName()).append(" is not 2."); - throw new RuntimeException(sb.toString()); - } - - mapParameters.put(aa[0], aa[1]); - } - - return mapParameters; - } - - /** - *

getAbility.

- * - * @param abString a {@link java.lang.String} object. - * @param hostCard a {@link forge.Card} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility getAbility(String abString, Card hostCard) { - - SpellAbility SA = null; - - hostC = hostCard; - - mapParams = getMapParams(abString, hostCard); - - // parse universal parameters - - if (mapParams.containsKey("AB")) { - isAb = true; - API = mapParams.get("AB"); - } else if (mapParams.containsKey("SP")) { - isSp = true; - API = mapParams.get("SP"); - } else if (mapParams.containsKey("DB")) { - isDb = true; - API = mapParams.get("DB"); - } else - throw new RuntimeException("AbilityFactory : getAbility -- no API in " + hostCard.getName()); - - if (!isDb) { - if (!mapParams.containsKey("Cost")) - throw new RuntimeException("AbilityFactory : getAbility -- no Cost in " + hostCard.getName()); - abCost = new Cost(mapParams.get("Cost"), hostCard.getName(), isAb); - } - - if (mapParams.containsKey("ValidTgts")) { - hasValid = true; - isTargeted = true; - } - - if (mapParams.containsKey("Tgt")) { - isTargeted = true; - } - - if (isTargeted) { - String min = mapParams.containsKey("TargetMin") ? mapParams.get("TargetMin") : "1"; - String max = mapParams.containsKey("TargetMax") ? mapParams.get("TargetMax") : "1"; - - if (hasValid) { - // TgtPrompt now optional - StringBuilder sb = new StringBuilder(); - if (hostC != null) sb.append(hostC + " - "); - String prompt = mapParams.containsKey("TgtPrompt") ? mapParams.get("TgtPrompt") : "Select target " + mapParams.get("ValidTgts"); - sb.append(prompt); - abTgt = new Target(hostC, sb.toString(), mapParams.get("ValidTgts").split(","), min, max); - } else - abTgt = new Target(hostC, mapParams.get("Tgt"), min, max); - - if (mapParams.containsKey("TgtZone")) // if Targeting something not in play, this Key should be set - abTgt.setZone(mapParams.get("TgtZone")); - - // Target Type mostly for Counter: Spell,Activated,Triggered,Ability (or any combination of) - // Ability = both activated and triggered abilities - if (mapParams.containsKey("TargetType")) - abTgt.setTargetSpellAbilityType(mapParams.get("TargetType")); - - // TargetValidTargeting most for Counter: e.g. target spell that targets X. - if (mapParams.containsKey("TargetValidTargeting")) - abTgt.setSAValidTargeting(mapParams.get("TargetValidTargeting")); - } - - hasSubAb = mapParams.containsKey("SubAbility"); - - hasSpDesc = mapParams.containsKey("SpellDescription"); - - // *********************************** - // Match API keywords - - if (API.equals("DealDamage")) { - AbilityFactory_DealDamage dd = new AbilityFactory_DealDamage(this); - - if (isAb) - SA = dd.getAbility(); - else if (isSp) - SA = dd.getSpell(); - else if (isDb) - SA = dd.getDrawback(); - } - - else if (API.equals("DamageAll")) { - AbilityFactory_DealDamage dd = new AbilityFactory_DealDamage(this); - if (isAb) - SA = dd.getAbilityDamageAll(); - else if (isSp) - SA = dd.getSpellDamageAll(); - else if (isDb) - SA = dd.getDrawbackDamageAll(); - } - - else if (API.equals("PutCounter")) { - if (isAb) - SA = AbilityFactory_Counters.createAbilityPutCounters(this); - else if (isSp) - SA = AbilityFactory_Counters.createSpellPutCounters(this); - else if (isDb) - SA = AbilityFactory_Counters.createDrawbackPutCounters(this); - } - - else if (API.equals("PutCounterAll")) { - if (isAb) - SA = AbilityFactory_Counters.createAbilityPutCounterAll(this); - else if (isSp) - SA = AbilityFactory_Counters.createSpellPutCounterAll(this); - else if (isDb) - SA = AbilityFactory_Counters.createDrawbackPutCounterAll(this); - } - - else if (API.equals("RemoveCounter")) { - if (isAb) - SA = AbilityFactory_Counters.createAbilityRemoveCounters(this); - else if (isSp) - SA = AbilityFactory_Counters.createSpellRemoveCounters(this); - else if (isDb) - SA = AbilityFactory_Counters.createDrawbackRemoveCounters(this); - } - - else if (API.equals("RemoveCounterAll")) { - if (isAb) - SA = AbilityFactory_Counters.createAbilityRemoveCounterAll(this); - else if (isSp) - SA = AbilityFactory_Counters.createSpellRemoveCounterAll(this); - else if (isDb) - SA = AbilityFactory_Counters.createDrawbackRemoveCounterAll(this); - } - - else if (API.equals("Proliferate")) { - if (isAb) - SA = AbilityFactory_Counters.createAbilityProliferate(this); - else if (isSp) - SA = AbilityFactory_Counters.createSpellProliferate(this); - else if (isDb) - SA = AbilityFactory_Counters.createDrawbackProliferate(this); - } - - else if (API.equals("ChangeZone")) { - if (isAb) - SA = AbilityFactory_ChangeZone.createAbilityChangeZone(this); - else if (isSp) - SA = AbilityFactory_ChangeZone.createSpellChangeZone(this); - else if (isDb) - SA = AbilityFactory_ChangeZone.createDrawbackChangeZone(this); - } - - else if (API.equals("ChangeZoneAll")) { - if (isAb) - SA = AbilityFactory_ChangeZone.createAbilityChangeZoneAll(this); - else if (isSp) - SA = AbilityFactory_ChangeZone.createSpellChangeZoneAll(this); - else if (isDb) - SA = AbilityFactory_ChangeZone.createDrawbackChangeZoneAll(this); - } - - else if (API.equals("Pump")) { - AbilityFactory_Pump afPump = new AbilityFactory_Pump(this); - - if (isAb) - SA = afPump.getAbilityPump(); - else if (isSp) - SA = afPump.getSpellPump(); - else if (isDb) - SA = afPump.getDrawbackPump(); - - if (isAb || isSp) - hostCard.setSVar("PlayMain1", "TRUE"); - } - - else if (API.equals("PumpAll")) { - AbilityFactory_Pump afPump = new AbilityFactory_Pump(this); - - if (isAb) - SA = afPump.getAbilityPumpAll(); - else if (isSp) - SA = afPump.getSpellPumpAll(); - else if (isDb) - SA = afPump.getDrawbackPumpAll(); - - if (isAb || isSp) - hostCard.setSVar("PlayMain1", "TRUE"); - } - - else if (API.equals("GainLife")) { - if (isAb) - SA = AbilityFactory_AlterLife.createAbilityGainLife(this); - else if (isSp) - SA = AbilityFactory_AlterLife.createSpellGainLife(this); - else if (isDb) - SA = AbilityFactory_AlterLife.createDrawbackGainLife(this); - } - - else if (API.equals("LoseLife")) { - if (isAb) - SA = AbilityFactory_AlterLife.createAbilityLoseLife(this); - else if (isSp) - SA = AbilityFactory_AlterLife.createSpellLoseLife(this); - else if (isDb) - SA = AbilityFactory_AlterLife.createDrawbackLoseLife(this); - } - - else if (API.equals("SetLife")) { - if (isAb) - SA = AbilityFactory_AlterLife.createAbilitySetLife(this); - else if (isSp) - SA = AbilityFactory_AlterLife.createSpellSetLife(this); - else if (isDb) - SA = AbilityFactory_AlterLife.createDrawbackSetLife(this); - } - - else if (API.equals("Poison")) { - if (isAb) - SA = AbilityFactory_AlterLife.createAbilityPoison(this); - else if (isSp) - SA = AbilityFactory_AlterLife.createSpellPoison(this); - else if (isDb) - SA = AbilityFactory_AlterLife.createDrawbackPoison(this); - } - - else if (API.equals("Fog")) { - if (isAb) - SA = AbilityFactory_Combat.createAbilityFog(this); - else if (isSp) - SA = AbilityFactory_Combat.createSpellFog(this); - else if (isDb) - SA = AbilityFactory_Combat.createDrawbackFog(this); - } - - else if (API.equals("Untap")) { - if (isAb) - SA = AbilityFactory_PermanentState.createAbilityUntap(this); - else if (isSp) - SA = AbilityFactory_PermanentState.createSpellUntap(this); - else if (isDb) - SA = AbilityFactory_PermanentState.createDrawbackUntap(this); - } - - else if (API.equals("UntapAll")) { - if (isAb) - SA = AbilityFactory_PermanentState.createAbilityUntapAll(this); - else if (isSp) - SA = AbilityFactory_PermanentState.createSpellUntapAll(this); - else if (isDb) - SA = AbilityFactory_PermanentState.createDrawbackUntapAll(this); - } - - else if (API.equals("Tap")) { - if (isAb) - SA = AbilityFactory_PermanentState.createAbilityTap(this); - else if (isSp) - SA = AbilityFactory_PermanentState.createSpellTap(this); - else if (isDb) - SA = AbilityFactory_PermanentState.createDrawbackTap(this); - } - - else if (API.equals("TapAll")) { - if (isAb) - SA = AbilityFactory_PermanentState.createAbilityTapAll(this); - else if (isSp) - SA = AbilityFactory_PermanentState.createSpellTapAll(this); - else if (isDb) - SA = AbilityFactory_PermanentState.createDrawbackTapAll(this); - } - - else if (API.equals("TapOrUntap")) { - if (isAb) - SA = AbilityFactory_PermanentState.createAbilityTapOrUntap(this); - else if (isSp) - SA = AbilityFactory_PermanentState.createSpellTapOrUntap(this); - else if (isDb) - SA = AbilityFactory_PermanentState.createDrawbackTapOrUntap(this); - } - - else if (API.equals("PreventDamage")) { - if (isAb) - SA = AbilityFactory_PreventDamage.getAbilityPreventDamage(this); - else if (isSp) - SA = AbilityFactory_PreventDamage.getSpellPreventDamage(this); - else if (isDb) { - SA = AbilityFactory_PreventDamage.createDrawbackPreventDamage(this); - } - } - - else if (API.equals("Regenerate")) { - if (isAb) - SA = AbilityFactory_Regenerate.getAbilityRegenerate(this); - else if (isSp) - SA = AbilityFactory_Regenerate.getSpellRegenerate(this); - else if (isDb) { - SA = AbilityFactory_Regenerate.createDrawbackRegenerate(this); - } - } - - else if (API.equals("Draw")) { - if (isAb) - SA = AbilityFactory_ZoneAffecting.createAbilityDraw(this); - else if (isSp) - SA = AbilityFactory_ZoneAffecting.createSpellDraw(this); - else if (isDb) - SA = AbilityFactory_ZoneAffecting.createDrawbackDraw(this); - } - - else if (API.equals("Mill")) { - if (isAb) - SA = AbilityFactory_ZoneAffecting.createAbilityMill(this); - else if (isSp) - SA = AbilityFactory_ZoneAffecting.createSpellMill(this); - else if (isDb) - SA = AbilityFactory_ZoneAffecting.createDrawbackMill(this); - } - - else if (API.equals("Scry")) { - if (isAb) - SA = AbilityFactory_Reveal.createAbilityScry(this); - else if (isSp) - SA = AbilityFactory_Reveal.createSpellScry(this); - else if (isDb) - SA = AbilityFactory_Reveal.createDrawbackScry(this); - } - - else if (API.equals("RearrangeTopOfLibrary")) { - if (isAb) - SA = AbilityFactory_Reveal.createRearrangeTopOfLibraryAbility(this); - else if (isSp) - SA = AbilityFactory_Reveal.createRearrangeTopOfLibrarySpell(this); - else if (isDb) - SA = AbilityFactory_Reveal.createRearrangeTopOfLibraryDrawback(this); - } - - else if (API.equals("Sacrifice")) { - if (isAb) - SA = AbilityFactory_Sacrifice.createAbilitySacrifice(this); - else if (isSp) - SA = AbilityFactory_Sacrifice.createSpellSacrifice(this); - else if (isDb) - SA = AbilityFactory_Sacrifice.createDrawbackSacrifice(this); - } - - else if (API.equals("SacrificeAll")) { - if (isAb) - SA = AbilityFactory_Sacrifice.createAbilitySacrificeAll(this); - else if (isSp) - SA = AbilityFactory_Sacrifice.createSpellSacrificeAll(this); - else if (isDb) - SA = AbilityFactory_Sacrifice.createDrawbackSacrificeAll(this); - } - - else if (API.equals("Destroy")) { - if (isAb) - SA = AbilityFactory_Destroy.createAbilityDestroy(this); - else if (isSp) - SA = AbilityFactory_Destroy.createSpellDestroy(this); - else if (isDb) { - SA = AbilityFactory_Destroy.createDrawbackDestroy(this); - } - } - - else if (API.equals("DestroyAll")) { - if (isAb) - SA = AbilityFactory_Destroy.createAbilityDestroyAll(this); - else if (isSp) - SA = AbilityFactory_Destroy.createSpellDestroyAll(this); - else if (isDb) - SA = AbilityFactory_Destroy.createDrawbackDestroyAll(this); - } - - else if (API.equals("Mana")) { - String produced = mapParams.get("Produced"); - if (isAb) - SA = AbilityFactory_Mana.createAbilityMana(this, produced); - if (isSp) - SA = AbilityFactory_Mana.createSpellMana(this, produced); - if (isDb) - SA = AbilityFactory_Mana.createDrawbackMana(this, produced); - } - - else if (API.equals("ManaReflected")) { - // Reflected mana will have a filler for produced of "1" - if (isAb) - SA = AbilityFactory_Mana.createAbilityManaReflected(this, "1"); - if (isSp) { // shouldn't really happen i think? - SA = AbilityFactory_Mana.createSpellManaReflected(this, "1"); - } - } - - else if (API.equals("Token")) { - AbilityFactory_Token AFT = new AbilityFactory_Token(this); - - if (isAb) - SA = AFT.getAbility(); - else if (isSp) - SA = AFT.getSpell(); - else if (isDb) - SA = AFT.getDrawback(); - } - - else if (API.equals("GainControl")) { - AbilityFactory_GainControl afControl = new AbilityFactory_GainControl(this); - - if (isAb) - SA = afControl.getAbilityGainControl(); - else if (isSp) - SA = afControl.getSpellGainControl(); - else if (isDb) { - SA = afControl.getDrawbackGainControl(); - } - } - - else if (API.equals("Discard")) { - if (isAb) - SA = AbilityFactory_ZoneAffecting.createAbilityDiscard(this); - else if (isSp) - SA = AbilityFactory_ZoneAffecting.createSpellDiscard(this); - else if (isDb) - SA = AbilityFactory_ZoneAffecting.createDrawbackDiscard(this); - } - - else if (API.equals("Counter")) { - AbilityFactory_CounterMagic c = new AbilityFactory_CounterMagic(this); - - if (isTargeted) // Since all "Counter" ABs Counter things on the Stack no need for it to be everywhere - abTgt.setZone("Stack"); - - if (isAb) - SA = c.getAbilityCounter(this); - else if (isSp) - SA = c.getSpellCounter(this); - else if (isDb) - SA = c.getDrawbackCounter(this); - } - - else if (API.equals("AddTurn")) { - if (isAb) - SA = AbilityFactory_Turns.createAbilityAddTurn(this); - else if (isSp) - SA = AbilityFactory_Turns.createSpellAddTurn(this); - else if (isDb) - SA = AbilityFactory_Turns.createDrawbackAddTurn(this); - } - - else if (API.equals("Clash")) { - if (isAb) - SA = AbilityFactory_Clash.getAbilityClash(this); - else if (isSp) - SA = AbilityFactory_Clash.getSpellClash(this); - else if (isDb) - SA = AbilityFactory_Clash.getDrawbackClash(this); - } - - else if (API.equals("Animate")) { - if (isAb) - SA = AbilityFactory_Animate.createAbilityAnimate(this); - else if (isSp) - SA = AbilityFactory_Animate.createSpellAnimate(this); - else if (isDb) - SA = AbilityFactory_Animate.createDrawbackAnimate(this); - } - - else if (API.equals("Effect")) { - if (isAb) - SA = AbilityFactory_Effect.createAbilityEffect(this); - else if (isSp) - SA = AbilityFactory_Effect.createSpellEffect(this); - else if (isDb) - SA = AbilityFactory_Effect.createDrawbackEffect(this); - } - - else if (API.equals("WinsGame")) { - if (isAb) - SA = AbilityFactory_EndGameCondition.createAbilityWinsGame(this); - else if (isSp) - SA = AbilityFactory_EndGameCondition.createSpellWinsGame(this); - else if (isDb) - SA = AbilityFactory_EndGameCondition.createDrawbackWinsGame(this); - } - - else if (API.equals("LosesGame")) { - if (isAb) - SA = AbilityFactory_EndGameCondition.createAbilityLosesGame(this); - else if (isSp) - SA = AbilityFactory_EndGameCondition.createSpellLosesGame(this); - else if (isDb) - SA = AbilityFactory_EndGameCondition.createDrawbackLosesGame(this); - } - - else if (API.equals("RevealHand")) { - if (isAb) - SA = AbilityFactory_Reveal.createAbilityRevealHand(this); - else if (isSp) - SA = AbilityFactory_Reveal.createSpellRevealHand(this); - else if (isDb) - SA = AbilityFactory_Reveal.createDrawbackRevealHand(this); - } - - else if (API.equals("Dig")) { - if (isAb) - SA = AbilityFactory_Reveal.createAbilityDig(this); - else if (isSp) - SA = AbilityFactory_Reveal.createSpellDig(this); - else if (isDb) - SA = AbilityFactory_Reveal.createDrawbackDig(this); - } - - else if (API.equals("Shuffle")) { - if (isAb) - SA = AbilityFactory_ZoneAffecting.createAbilityShuffle(this); - else if (isSp) - SA = AbilityFactory_ZoneAffecting.createSpellShuffle(this); - else if (isDb) - SA = AbilityFactory_ZoneAffecting.createDrawbackShuffle(this); - } - - else if (API.equals("ChooseType")) { - if (isAb) - SA = AbilityFactory_Choose.createAbilityChooseType(this); - else if (isSp) - SA = AbilityFactory_Choose.createSpellChooseType(this); - else if (isDb) - SA = AbilityFactory_Choose.createDrawbackChooseType(this); - } - - else if (API.equals("ChooseColor")) { - if (isAb) - SA = AbilityFactory_Choose.createAbilityChooseColor(this); - else if (isSp) - SA = AbilityFactory_Choose.createSpellChooseColor(this); - else if (isDb) - SA = AbilityFactory_Choose.createDrawbackChooseColor(this); - } - - else if (API.equals("CopyPermanent")) { - if (isAb) - SA = AbilityFactory_Copy.createAbilityCopyPermanent(this); - else if (isSp) - SA = AbilityFactory_Copy.createSpellCopyPermanent(this); - else if (isDb) - SA = AbilityFactory_Copy.createDrawbackCopyPermanent(this); - } - - else if (API.equals("CopySpell")) { - if (isTargeted) // Since all "CopySpell" ABs copy things on the Stack no need for it to be everywhere - abTgt.setZone("Stack"); - - if (isAb) - SA = AbilityFactory_Copy.createAbilityCopySpell(this); - else if (isSp) - SA = AbilityFactory_Copy.createSpellCopySpell(this); - else if (isDb) - SA = AbilityFactory_Copy.createDrawbackCopySpell(this); - - hostCard.setCopiesSpells(true); - } - - else if (API.equals("FlipACoin")) { - if (isAb) - SA = AbilityFactory_Clash.createAbilityFlip(this); - else if (isSp) - SA = AbilityFactory_Clash.createSpellFlip(this); - else if (isDb) - SA = AbilityFactory_Clash.createDrawbackFlip(this); - } - - else if (API.equals("DelayedTrigger")) { - if (isAb) - SA = AbilityFactory_DelayedTrigger.getAbility(this); - else if (isSp) - SA = AbilityFactory_DelayedTrigger.getSpell(this); - if (isDb) - SA = AbilityFactory_DelayedTrigger.getDrawback(this); - } - - else if (API.equals("Cleanup")) { - if (isDb) - SA = AbilityFactory_Cleanup.getDrawback(this); - } - - else if (API.equals("RegenerateAll")) { - if (isAb) - SA = AbilityFactory_Regenerate.getAbilityRegenerateAll(this); - else if (isSp) - SA = AbilityFactory_Regenerate.getSpellRegenerateAll(this); - else if (isDb) { - SA = AbilityFactory_Regenerate.createDrawbackRegenerateAll(this); - } - } - - else if (API.equals("AnimateAll")) { - if (isAb) - SA = AbilityFactory_Animate.createAbilityAnimateAll(this); - else if (isSp) - SA = AbilityFactory_Animate.createSpellAnimateAll(this); - else if (isDb) - SA = AbilityFactory_Animate.createDrawbackAnimateAll(this); - } - - else if (API.equals("Debuff")) { - if (isAb) - SA = AbilityFactory_Debuff.createAbilityDebuff(this); - else if (isSp) - SA = AbilityFactory_Debuff.createSpellDebuff(this); - else if (isDb) - SA = AbilityFactory_Debuff.createDrawbackDebuff(this); - } - - else if (API.equals("DebuffAll")) { - if (isAb) - SA = AbilityFactory_Debuff.createAbilityDebuffAll(this); - else if (isSp) - SA = AbilityFactory_Debuff.createSpellDebuffAll(this); - else if (isDb) - SA = AbilityFactory_Debuff.createDrawbackDebuffAll(this); - } - - else if (API.equals("DrainMana")) { - if (isAb) - SA = AbilityFactory_Mana.createAbilityDrainMana(this); - else if (isSp) - SA = AbilityFactory_Mana.createSpellDrainMana(this); - else if (isDb) - SA = AbilityFactory_Mana.createDrawbackDrainMana(this); - } - - else if (API.equals("Protection")) { - if (isAb) - SA = AbilityFactory_Protection.createAbilityProtection(this); - else if (isSp) - SA = AbilityFactory_Protection.createSpellProtection(this); - else if (isDb) - SA = AbilityFactory_Protection.createDrawbackProtection(this); - } - - else if (API.equals("Attach")) { - if (isAb) - SA = AbilityFactory_Attach.createAbilityAttach(this); - else if (isSp) - SA = AbilityFactory_Attach.createSpellAttach(this); - else if (isDb) - SA = AbilityFactory_Attach.createDrawbackAttach(this); - } - - else if (API.equals("ProtectionAll")) { - if (isAb) - SA = AbilityFactory_Protection.createAbilityProtectionAll(this); - else if (isSp) - SA = AbilityFactory_Protection.createSpellProtectionAll(this); - else if (isDb) - SA = AbilityFactory_Protection.createDrawbackProtectionAll(this); - } - - else if(API.equals("MustAttack")) { - if (isAb) { - SA = AbilityFactory_Combat.createAbilityMustAttack(this); - } - else if (isSp) { - SA = AbilityFactory_Combat.createSpellMustAttack(this); - } - else if (isDb) { - SA = AbilityFactory_Combat.createDrawbackMustAttack(this); - } - } - - - if (SA == null) - throw new RuntimeException("AbilityFactory : SpellAbility was not created for " + hostCard.getName() + ". Looking for API: " + API); - - // ********************************************* - // set universal properties of the SpellAbility - - SA.setAbilityFactory(this); - - if (hasSubAbility()) - SA.setSubAbility(getSubAbility()); - - if (SA instanceof Spell_Permanent) - SA.setDescription(SA.getSourceCard().getName()); - else if (hasSpDesc) { - StringBuilder sb = new StringBuilder(); - - if (!isDb) { // SubAbilities don't have Costs or Cost descriptors - if (mapParams.containsKey("PrecostDesc")) - sb.append(mapParams.get("PrecostDesc")).append(" "); - if (mapParams.containsKey("CostDesc")) - sb.append(mapParams.get("CostDesc")).append(" "); - else - sb.append(abCost.toString()); - } - - sb.append(mapParams.get("SpellDescription")); - - SA.setDescription(sb.toString()); - } else - SA.setDescription(""); - - // StackDescriptions are overwritten by the AF type instead of through this - //if (!isTargeted) - // SA.setStackDescription(hostCard.getName()); - - makeRestrictions(SA); - makeConditions(SA); - - return SA; - } - - /** - *

makeRestrictions.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private void makeRestrictions(SpellAbility sa) { - // SpellAbility_Restrictions should be added in here - SpellAbility_Restriction restrict = sa.getRestrictions(); - if (mapParams.containsKey("Flashback")) { - sa.setFlashBackAbility(true); - } - restrict.setRestrictions(mapParams); - } - - /** - *

makeConditions.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private void makeConditions(SpellAbility sa) { - // SpellAbility_Restrictions should be added in here - SpellAbility_Condition condition = sa.getConditions(); - if (mapParams.containsKey("Flashback")) { - sa.setFlashBackAbility(true); - } - condition.setConditions(mapParams); - } - - /** - *

checkConditional.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - public static boolean checkConditional(SpellAbility sa) { - return sa.getConditions().checkConditions(sa); - } - - // Easy creation of SubAbilities - /** - *

getSubAbility.

- * - * @return a {@link forge.card.spellability.Ability_Sub} object. - */ - public Ability_Sub getSubAbility() { - Ability_Sub abSub = null; - - String sSub = getMapParams().get("SubAbility"); - - if (sSub.startsWith("SVar=")) { - sSub = sSub.replace("SVar=", ""); - } - - sSub = getHostCard().getSVar(sSub); - - if (!sSub.equals("")) { - // Older style Drawback no longer supported - AbilityFactory afDB = new AbilityFactory(); - abSub = (Ability_Sub) afDB.getAbility(sSub, getHostCard()); - } else { - System.out.println("SubAbility not found for: " + getHostCard()); - } - - return abSub; - } - - /** - *

playReusable.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - public static boolean playReusable(SpellAbility sa) { - // TODO probably also consider if winter orb or similar are out - - if (sa.getPayCosts() == null) - // This is only true for Drawbacks and triggers - return true; - - return (sa.getPayCosts().isReusuableResource() && AllZone.getPhase().is(Constant.Phase.End_Of_Turn) - && AllZone.getPhase().isNextTurn(AllZone.getComputerPlayer())); - } - - //returns true if it's better to wait until blockers are declared - /** - *

waitForBlocking.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - public static boolean waitForBlocking(SpellAbility sa) { - - return (sa.getSourceCard().isCreature() && sa.getPayCosts().getTap() - && (AllZone.getPhase().isBefore(Constant.Phase.Combat_Declare_Blockers_InstantAbility) - || AllZone.getPhase().isNextTurn(AllZone.getHumanPlayer()))); - } - - /** - *

isSorcerySpeed.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - public static boolean isSorcerySpeed(SpellAbility sa) { - if (sa.isSpell()) - return sa.getSourceCard().isSorcery(); - else if (sa.isAbility()) - return sa.getRestrictions().getSorcerySpeed(); - - return false; - } - - // Utility functions used by the AFs - /** - *

calculateAmount.

- * - * @param card a {@link forge.Card} object. - * @param amount a {@link java.lang.String} object. - * @param ability a {@link forge.card.spellability.SpellAbility} object. - * @return a int. - */ - public static int calculateAmount(Card card, String amount, SpellAbility ability) { - // amount can be anything, not just 'X' as long as sVar exists - - // If Amount is -X, strip the minus sign before looking for an SVar of that kind - int multiplier = 1; - if (amount.startsWith("-")) { - multiplier = -1; - amount = amount.substring(1); - } - - if (!card.getSVar(amount).equals("")) { - String calcX[] = card.getSVar(amount).split("\\$"); - if (calcX.length == 1 || calcX[1].equals("none")) - return 0; - - if (calcX[0].startsWith("Count")) - return CardFactoryUtil.xCount(card, calcX[1]) * multiplier; - - if (calcX[0].startsWith("Number")) - return CardFactoryUtil.xCount(card, card.getSVar(amount)) * multiplier; - - else if (ability != null) { - //Player attribute counting - if (calcX[0].startsWith("TargetedPlayer")) { - ArrayList players = new ArrayList(); - SpellAbility saTargeting = (ability.getTarget() == null) ? findParentsTargetedPlayer(ability) : ability; - if (saTargeting.getTarget() != null) { - players.addAll(saTargeting.getTarget().getTargetPlayers()); - } else { - players.addAll(getDefinedPlayers(card, saTargeting.getAbilityFactory().getMapParams().get("Defined"), saTargeting)); - } - return CardFactoryUtil.playerXCount(players, calcX[1], card) * multiplier; - } - if (calcX[0].startsWith("TargetedController")) { - ArrayList players = new ArrayList(); - ArrayList list = getDefinedCards(card, "Targeted", ability); - ArrayList sas = getDefinedSpellAbilities(card, "Targeted", ability); - - for (Card c : list) { - Player p = c.getController(); - if (!players.contains(p)) - players.add(p); - } - for (SpellAbility s : sas) { - Player p = s.getSourceCard().getController(); - if (!players.contains(p)) players.add(p); - } - return CardFactoryUtil.playerXCount(players, calcX[1], card) * multiplier; - } - - CardList list = new CardList(); - if (calcX[0].startsWith("Sacrificed")) - list = findRootAbility(ability).getPaidList("Sacrificed"); - - else if (calcX[0].startsWith("Discarded")) - list = findRootAbility(ability).getPaidList("Discarded"); - - else if (calcX[0].startsWith("Exiled")) { - list = findRootAbility(ability).getPaidList("Exiled"); - } else if (calcX[0].startsWith("Tapped")) { - list = findRootAbility(ability).getPaidList("Tapped"); - } else if (calcX[0].startsWith("Targeted")) { - Target t = ability.getTarget(); - if (null != t) { - ArrayList all = t.getTargets(); - if (!all.isEmpty() && all.get(0) instanceof SpellAbility) { - SpellAbility saTargeting = findParentsTargetedSpellAbility(ability); - list = new CardList(); - ArrayList sas = saTargeting.getTarget().getTargetSAs(); - for (SpellAbility sa : sas) { - list.add(sa.getSourceCard()); - } - } else { - SpellAbility saTargeting = findParentsTargetedCard(ability); - list = new CardList(saTargeting.getTarget().getTargetCards().toArray()); - } - } else { - SpellAbility parent = findParentsTargetedCard(ability); - - ArrayList all = parent.getTarget().getTargets(); - if (!all.isEmpty() && all.get(0) instanceof SpellAbility) { - list = new CardList(); - ArrayList sas = parent.getTarget().getTargetSAs(); - for (SpellAbility sa : sas) { - list.add(sa.getSourceCard()); - } - } else { - SpellAbility saTargeting = findParentsTargetedCard(ability); - list = new CardList(saTargeting.getTarget().getTargetCards().toArray()); - } - } - } else if (calcX[0].startsWith("Triggered")) { - SpellAbility root = ability.getRootSpellAbility(); - list = new CardList(); - list.add((Card) root.getTriggeringObject(calcX[0].substring(9))); - } else if (calcX[0].startsWith("Remembered")) { - // Add whole Remembered list to handlePaid - list = new CardList(); - for (Object o : card.getRemembered()) { - if (o instanceof Card) - list.add(AllZoneUtil.getCardState((Card) o)); - } - } else if (calcX[0].startsWith("Imprinted")) { - // Add whole Imprinted list to handlePaid - list = new CardList(); - for (Card c : card.getImprinted()) - list.add(AllZoneUtil.getCardState(c)); - } else if (calcX[0].startsWith("TriggerCount")) { - // TriggerCount is similar to a regular Count, but just pulls Integer Values from Trigger objects - String[] l = calcX[1].split("/"); - String[] m = CardFactoryUtil.parseMath(l); - int count = (Integer) ability.getTriggeringObject(l[0]); - - return CardFactoryUtil.doXMath(count, m, card) * multiplier; - } else - return 0; - - return CardFactoryUtil.handlePaid(list, calcX[1], card) * multiplier; - } else - return 0; - } - - return Integer.parseInt(amount) * multiplier; - } - - // should the three getDefined functions be merged into one? Or better to have separate? - // If we only have one, each function needs to Cast the Object to the appropriate type when using - // But then we only need update one function at a time once the casting is everywhere. - // Probably will move to One function solution sometime in the future - /** - *

getDefinedCards.

- * - * @param hostCard a {@link forge.Card} object. - * @param def a {@link java.lang.String} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getDefinedCards(Card hostCard, String def, SpellAbility sa) { - ArrayList cards = new ArrayList(); - String defined = (def == null) ? "Self" : def; // default to Self - - Card c = null; - - if (defined.equals("Self")) - c = hostCard; - - else if (defined.equals("Equipped")) - c = hostCard.getEquippingCard(); - - else if (defined.equals("Enchanted")) - c = hostCard.getEnchantingCard(); - - else if (defined.equals("Targeted")) { - SpellAbility parent = findParentsTargetedCard(sa); - cards.addAll(parent.getTarget().getTargetCards()); - } else if (defined.startsWith("Triggered") && sa != null) { - SpellAbility root = sa.getRootSpellAbility(); - Object crd = root.getTriggeringObject(defined.substring(9)); - if (crd instanceof Card) { - c = AllZoneUtil.getCardState((Card) crd); - } - } else if (defined.equals("Remembered")) { - for (Object o : hostCard.getRemembered()) { - if (o instanceof Card) - cards.add(AllZoneUtil.getCardState((Card) o)); - } - } else if (defined.equals("Clones")) { - for (Card clone : hostCard.getClones()) { - cards.add(AllZoneUtil.getCardState(clone)); - } - } else if (defined.equals("Imprinted")) { - for (Card imprint : hostCard.getImprinted()) { - cards.add(AllZoneUtil.getCardState(imprint)); - } - } else { - CardList list = null; - if (defined.startsWith("Sacrificed")) - list = findRootAbility(sa).getPaidList("Sacrificed"); - - else if (defined.startsWith("Discarded")) - list = findRootAbility(sa).getPaidList("Discarded"); - - else if (defined.startsWith("Exiled")) - list = findRootAbility(sa).getPaidList("Exiled"); - - else if (defined.startsWith("Tapped")) - list = findRootAbility(sa).getPaidList("Tapped"); - - else - return cards; - - for (Card cl : list) - cards.add(cl); - } - - if (c != null) - cards.add(c); - - return cards; - } - - /** - *

getDefinedPlayers.

- * - * @param card a {@link forge.Card} object. - * @param def a {@link java.lang.String} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getDefinedPlayers(Card card, String def, SpellAbility sa) { - ArrayList players = new ArrayList(); - String defined = (def == null) ? "You" : def; - - if (defined.equals("Targeted")) { - Target tgt = sa.getTarget(); - SpellAbility parent = sa; - - do { - - if (!(parent instanceof Ability_Sub)) // did not find any targets - return players; - parent = ((Ability_Sub) parent).getParent(); - tgt = parent.getTarget(); - } while (tgt == null || tgt.getTargetPlayers().size() == 0); - - players.addAll(tgt.getTargetPlayers()); - } else if (defined.equals("TargetedController")) { - ArrayList list = getDefinedCards(card, "Targeted", sa); - ArrayList sas = getDefinedSpellAbilities(card, "Targeted", sa); - - for (Card c : list) { - Player p = c.getController(); - if (!players.contains(p)) - players.add(p); - } - for (SpellAbility s : sas) { - Player p = s.getSourceCard().getController(); - if (!players.contains(p)) players.add(p); - } - } else if (defined.equals("TargetedOwner")) { - ArrayList list = getDefinedCards(card, "Targeted", sa); - - for (Card c : list) { - Player p = c.getOwner(); - if (!players.contains(p)) - players.add(p); - } - } else if (defined.equals("Remembered")) { - for (Object rem : card.getRemembered()) { - if (rem instanceof Player) - players.add((Player) rem); - } - } else if (defined.startsWith("Triggered")) { - SpellAbility root = sa.getRootSpellAbility(); - Object o = null; - if (defined.endsWith("Controller")) { - String triggeringType = defined.substring(9); - triggeringType = triggeringType.substring(0, triggeringType.length() - 10); - Object c = root.getTriggeringObject(triggeringType); - if (c instanceof Card) { - o = ((Card) c).getController(); - } - if (c instanceof SpellAbility) { - o = ((SpellAbility) c).getSourceCard().getController(); - } - } else if (defined.endsWith("Owner")) { - String triggeringType = defined.substring(9); - triggeringType = triggeringType.substring(0, triggeringType.length() - 5); - Object c = root.getTriggeringObject(triggeringType); - if (c instanceof Card) { - o = ((Card) c).getOwner(); - } - } else { - String triggeringType = defined.substring(9); - o = root.getTriggeringObject(triggeringType); - } - if (o != null) { - if (o instanceof Player) { - Player p = (Player) o; - if (!players.contains(p)) - players.add(p); - } - } - } else if (defined.equals("EnchantedController")) { - Player p = card.getEnchantingCard().getController(); - if (!players.contains(p)) - players.add(p); - } else if (defined.equals("EnchantedOwner")) { - Player p = card.getEnchantingCard().getOwner(); - if (!players.contains(p)) - players.add(p); - } else if (defined.equals("AttackingPlayer")) { - Player p = AllZone.getCombat().getAttackingPlayer(); - if (!players.contains(p)) - players.add(p); - } else if (defined.equals("DefendingPlayer")) { - Player p = AllZone.getCombat().getDefendingPlayer(); - if (!players.contains(p)) - players.add(p); - } else { - if (defined.equals("You") || defined.equals("Each")) - players.add(sa.getActivatingPlayer()); - - if (defined.equals("Opponent") || defined.equals("Each")) - players.add(sa.getActivatingPlayer().getOpponent()); - } - return players; - } - - /** - *

getDefinedSpellAbilities.

- * - * @param card a {@link forge.Card} object. - * @param def a {@link java.lang.String} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getDefinedSpellAbilities(Card card, String def, SpellAbility sa) { - ArrayList sas = new ArrayList(); - String defined = (def == null) ? "Self" : def; // default to Self - - SpellAbility s = null; - - //TODO - this probably needs to be fleshed out a bit, but the basics work - if (defined.equals("Self")) { - s = sa; - } else if (defined.equals("Targeted")) { - SpellAbility parent = findParentsTargetedSpellAbility(sa); - sas.addAll(parent.getTarget().getTargetSAs()); - } else if (defined.startsWith("Triggered")) { - SpellAbility root = sa.getRootSpellAbility(); - - String triggeringType = defined.substring(9); - Object o = root.getTriggeringObject(triggeringType); - if (o instanceof SpellAbility) - s = (SpellAbility) o; - } else if (defined.startsWith("Imprinted")) { - for (Card imp : card.getImprinted()) - sas.addAll(imp.getSpellAbilities()); - } - - if (s != null) - sas.add(s); - - return sas; - } - - /** - *

getDefinedObjects.

- * - * @param card a {@link forge.Card} object. - * @param def a {@link java.lang.String} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getDefinedObjects(Card card, String def, SpellAbility sa) { - ArrayList objects = new ArrayList(); - String defined = (def == null) ? "Self" : def; - - objects.addAll(getDefinedPlayers(card, defined, sa)); - objects.addAll(getDefinedCards(card, defined, sa)); - objects.addAll(getDefinedSpellAbilities(card, defined, sa)); - return objects; - } - - - /** - *

findRootAbility.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility findRootAbility(SpellAbility sa) { - SpellAbility parent = sa; - while (parent instanceof Ability_Sub) - parent = ((Ability_Sub) parent).getParent(); - - return parent; - } - - /** - *

findParentsTargetedCard.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility findParentsTargetedCard(SpellAbility sa) { - SpellAbility parent = sa; - - do { - if (!(parent instanceof Ability_Sub)) - return parent; - parent = ((Ability_Sub) parent).getParent(); - } while (parent.getTarget() == null || parent.getTarget().getTargetCards().size() == 0); - - return parent; - } - - /** - *

findParentsTargetedSpellAbility.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - private static SpellAbility findParentsTargetedSpellAbility(SpellAbility sa) { - SpellAbility parent = sa; - - do { - if (!(parent instanceof Ability_Sub)) - return parent; - parent = ((Ability_Sub) parent).getParent(); - } while (parent.getTarget() == null || parent.getTarget().getTargetSAs().size() == 0); - - return parent; - } - - /** - *

findParentsTargetedPlayer.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility findParentsTargetedPlayer(SpellAbility sa) { - SpellAbility parent = sa; - - do { - if (!(parent instanceof Ability_Sub)) - return parent; - parent = ((Ability_Sub) parent).getParent(); - } while (parent.getTarget() == null || parent.getTarget().getTargetPlayers().size() == 0); - - return parent; - } - - /** - *

predictThreatenedObjects.

- * - * @return a {@link java.util.ArrayList} object. - * @since 1.0.15 - */ - public static ArrayList predictThreatenedObjects(AbilityFactory saviourAf) { - ArrayList objects = new ArrayList(); - if (AllZone.getStack().size() == 0) - return objects; - - // check stack for something that will kill this - SpellAbility topStack = AllZone.getStack().peekAbility(); - objects.addAll(predictThreatenedObjects(saviourAf, topStack)); - - return objects; - } - - /** - *

predictThreatenedObjects.

- * - * @param topStack a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.util.ArrayList} object. - * @since 1.0.15 - */ - public static ArrayList predictThreatenedObjects(AbilityFactory saviourAf, SpellAbility topStack) { - ArrayList objects = new ArrayList(); - ArrayList threatened = new ArrayList(); - String saviourApi = ""; - if (saviourAf != null) - saviourApi = saviourAf.getAPI(); - - if (topStack == null) - return objects; - - Card source = topStack.getSourceCard(); - AbilityFactory topAf = topStack.getAbilityFactory(); - - // Can only Predict things from AFs - if (topAf != null) { - Target tgt = topStack.getTarget(); - - if (tgt == null) { - objects = getDefinedObjects(source, topAf.getMapParams().get("Defined"), topStack); - } else { - objects = tgt.getTargets(); - } - - // Determine if Defined Objects are "threatened" will be destroyed due to this SA - - String threatApi = topAf.getAPI(); - HashMap threatParams = topAf.getMapParams(); - - //Lethal Damage => prevent damage/regeneration/bounce - if (threatApi.equals("DealDamage") || threatApi.equals("DamageAll")) { - // If PredictDamage is >= Lethal Damage - int dmg = AbilityFactory.calculateAmount(topStack.getSourceCard(), topAf.getMapParams().get("NumDmg"), topStack); - for (Object o : objects) { - if (o instanceof Card) { - Card c = (Card) o; - - // indestructible - if (c.hasKeyword("Indestructible")) - continue; - - //already regenerated - if (c.getShield() > 0) - continue; - - //don't use it on creatures that can't be regenerated - if (saviourApi.equals("Regenerate") && !c.canBeShielded()) - continue; - - //don't bounce or blink a permanent that the human player owns or is a token - if (saviourApi.equals("ChangeZone") && (c.getOwner().isHuman() || c.isToken())) - continue; - - if (c.predictDamage(dmg, source, false) >= c.getKillDamage()) - threatened.add(c); - } else if (o instanceof Player) { - Player p = (Player) o; - - if (source.hasKeyword("Infect")) { - if (p.predictDamage(dmg, source, false) >= p.getPoisonCounters()) - threatened.add(p); - } else if (p.predictDamage(dmg, source, false) >= p.getLife()) - threatened.add(p); - } - } - } - //Destroy => regeneration/bounce - else if ((threatApi.equals("Destroy") || threatApi.equals("DestroyAll")) - && ((saviourApi.equals("Regenerate") && !threatParams.containsKey("NoRegen")) - || saviourApi.equals("ChangeZone"))){ - for (Object o : objects) - if (o instanceof Card) { - Card c = (Card) o; - // indestructible - if (c.hasKeyword("Indestructible")) - continue; - - //already regenerated - if (c.getShield() > 0) - continue; - - //don't bounce or blink a permanent that the human player owns or is a token - if (saviourApi.equals("ChangeZone") && (c.getOwner().isHuman() || c.isToken())) - continue; - - //don't use it on creatures that can't be regenerated - if (saviourApi.equals("Regenerate") && !c.canBeShielded()) - continue; - - threatened.add(c); - } - - } - //Exiling => bounce - else if ((threatApi.equals("ChangeZone") || threatApi.equals("ChangeZoneAll")) - && saviourApi.equals("ChangeZone") - && threatParams.containsKey("Destination") && threatParams.get("Destination").equals("Exile")) { - for (Object o : objects) - if (o instanceof Card) { - Card c = (Card) o; - - //don't bounce or blink a permanent that the human player owns or is a token - if (saviourApi.equals("ChangeZone") && (c.getOwner().isHuman() || c.isToken())) - continue; - - threatened.add(c); - } - } - } - - threatened.addAll(predictThreatenedObjects(saviourAf, topStack.getSubAbility())); - return threatened; - } - - /** - *

handleRemembering.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - */ - public static void handleRemembering(AbilityFactory AF) { - HashMap params = AF.getMapParams(); - Card host; - - if (!params.containsKey("RememberTargets") && !params.containsKey("Imprint")) { - return; - } - - host = AF.getHostCard(); - - if (params.containsKey("ForgetOtherTargets")) { - host.clearRemembered(); - } - if (params.containsKey("Unimprint")) { - host.clearImprinted(); - } - - Target tgt = AF.getAbTgt(); - - if (params.containsKey("RememberTargets")) { - ArrayList tgts = (tgt == null) ? new ArrayList() : tgt.getTargets(); - for (Object o : tgts) { - host.addRemembered(o); - } - } - if (params.containsKey("Imprint")) { - ArrayList tgts = (tgt == null) ? new ArrayList() : tgt.getTargetCards(); - host.addImprinted(tgts); - } - } - - /** - *

filterListByType.

- * - * @param list a {@link forge.CardList} object. - * @param params a {@link java.util.HashMap} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link forge.CardList} object. - */ - public static CardList filterListByType(CardList list, String type, SpellAbility sa) { - if (type == null) - return list; - - // Filter List Can send a different Source card in for things like Mishra and Lobotomy - - Card source = sa.getSourceCard(); - if (type.contains("Triggered")) { - Object o = sa.getTriggeringObject("Card"); - - // I won't the card attached to the Triggering object - if (!(o instanceof Card)) - return new CardList(); - - source = (Card) (o); - type = type.replace("Triggered", "Card"); - } else if (type.contains("Remembered")) { - boolean hasRememberedCard = false; - for (Object o : source.getRemembered()) { - if (o instanceof Card) { - hasRememberedCard = true; - source = (Card) o; - type = type.replace("Remembered", "Card"); - break; - } - } - - if (!hasRememberedCard) - return new CardList(); - } - - return list.getValidCards(type.split(","), sa.getActivatingPlayer(), source); - } - - /** - *

passUnlessCost.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param usedStack a boolean. - */ - public static void passUnlessCost(final SpellAbility sa, final boolean usedStack) { - Card source = sa.getSourceCard(); - AbilityFactory af = sa.getAbilityFactory(); - final HashMap params = af.getMapParams(); - - //Nothing to do - if (params.get("UnlessCost") == null) { - sa.resolve(); - return; - } - - //The player who has the chance to cancel the ability - String pays = params.containsKey("UnlessPayer") ? params.get("UnlessPayer") : "TargetedController"; - Player payer = getDefinedPlayers(sa.getSourceCard(), pays, sa).get(0); - - //The cost - String unlessCost = params.get("UnlessCost").trim(); - if (unlessCost.equals("X")) - unlessCost = Integer.toString(AbilityFactory.calculateAmount(source, params.get("UnlessCost"), sa)); - - Ability ability = new Ability(source, unlessCost) { - @Override - public void resolve() { - ; - } - }; - - final Command paidCommand = new Command() { - private static final long serialVersionUID = 8094833091127334678L; - - public void execute() { - resolveSubAbilities(sa); - if(usedStack) - AllZone.getStack().finishResolving(sa, false); - } - }; - - final Command unpaidCommand = new Command() { - private static final long serialVersionUID = 8094833091127334678L; - - public void execute() { - sa.resolve(); - if (params.containsKey("PowerSink")) GameActionUtil.doPowerSink(AllZone.getHumanPlayer()); - resolveSubAbilities(sa); - if(usedStack) - AllZone.getStack().finishResolving(sa, false); - } - }; - - if (payer.isHuman()) { - GameActionUtil.payManaDuringAbilityResolve(source + "\r\n", ability.getManaCost(), - paidCommand, unpaidCommand); - } else { - if (ComputerUtil.canPayCost(ability)) { - ComputerUtil.playNoStack(ability); //Unless cost was payed - no resolve - resolveSubAbilities(sa); - if(usedStack) - AllZone.getStack().finishResolving(sa, false); - } else { - sa.resolve(); - if (params.containsKey("PowerSink")) GameActionUtil.doPowerSink(AllZone.getComputerPlayer()); - resolveSubAbilities(sa); - if(usedStack) - AllZone.getStack().finishResolving(sa, false); - } - } - } - - /** - *

resolve.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param usedStack a boolean. - */ - public static void resolve(SpellAbility sa, boolean usedStack) { - if (sa == null) return; - AbilityFactory af = sa.getAbilityFactory(); - if(af == null) { - sa.resolve(); - return; - } - HashMap params = af.getMapParams(); - - - //check conditions - if (AbilityFactory.checkConditional(sa)) { - if (params.get("UnlessCost") == null) { - sa.resolve(); - - //try to resolve subabilities (see null check above) - resolveSubAbilities(sa); - if(usedStack) - AllZone.getStack().finishResolving(sa, false); - } else passUnlessCost(sa, usedStack); - } else - resolveSubAbilities(sa); - } - - /** - *

resolveSubAbilities.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public static void resolveSubAbilities(SpellAbility sa) { - Ability_Sub abSub = sa.getSubAbility(); - if (abSub == null || sa.isWrapper()) return; - //check conditions - if (AbilityFactory.checkConditional(abSub)) { - abSub.resolve(); - } - resolveSubAbilities(abSub); - } - -}//end class AbilityFactory diff --git a/src/forge/card/abilityFactory/AbilityFactory_AlterLife.java b/src/forge/card/abilityFactory/AbilityFactory_AlterLife.java deleted file mode 100644 index da556e5bf1b..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_AlterLife.java +++ /dev/null @@ -1,1233 +0,0 @@ -package forge.card.abilityFactory; - -import forge.*; -import forge.card.spellability.*; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Random; - -/** - *

AbilityFactory_AlterLife class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_AlterLife { - // An AbilityFactory subclass for Gaining, Losing, or Setting Life totals. - - // ************************************************************************* - // ************************* GAIN LIFE ************************************* - // ************************************************************************* - - /** - *

createAbilityGainLife.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityGainLife(final AbilityFactory AF) { - - final SpellAbility abGainLife = new Ability_Activated(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = 8869422603616247307L; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - return gainLifeStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return gainLifeCanPlayAI(af, this); - } - - @Override - public void resolve() { - gainLifeResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return gainLifeDoTriggerAI(af, this, mandatory); - } - - }; - return abGainLife; - } - - /** - *

createSpellGainLife.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellGainLife(final AbilityFactory AF) { - final SpellAbility spGainLife = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = 6631124959690157874L; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - return gainLifeStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - // if X depends on abCost, the AI needs to choose which card he would sacrifice first - // then call xCount with that card to properly calculate the amount - // Or choosing how many to sacrifice - return gainLifeCanPlayAI(af, this); - } - - @Override - public void resolve() { - gainLifeResolve(af, this); - } - - }; - return spGainLife; - } - - /** - *

createDrawbackGainLife.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackGainLife(final AbilityFactory AF) { - final SpellAbility dbGainLife = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()) { - private static final long serialVersionUID = 6631124959690157874L; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - return gainLifeStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - // if X depends on abCost, the AI needs to choose which card he would sacrifice first - // then call xCount with that card to properly calculate the amount - // Or choosing how many to sacrifice - return gainLifeCanPlayAI(af, this); - } - - @Override - public void resolve() { - gainLifeResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return gainLifeDoTriggerAI(af, this, mandatory); - } - - }; - return dbGainLife; - } - - /** - *

gainLifeStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - public static String gainLifeStackDescription(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - StringBuilder sb = new StringBuilder(); - int amount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("LifeAmount"), sa); - - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard().getName()).append(" - "); - else - sb.append(" "); - - String conditionDesc = params.get("ConditionDescription"); - if (conditionDesc != null) - sb.append(conditionDesc).append(" "); - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - for (Player player : tgtPlayers) - sb.append(player).append(" "); - - sb.append("gains ").append(amount).append(" life."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

gainLifeCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - public static boolean gainLifeCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - Random r = MyRandom.random; - HashMap params = af.getMapParams(); - Cost abCost = sa.getPayCosts(); - final Card source = sa.getSourceCard(); - int life = AllZone.getComputerPlayer().getLife(); - int lifeAmount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("LifeAmount"), sa); - String amountStr = params.get("LifeAmount"); - - //don't use it if no life to gain - if (lifeAmount <= 0) return false; - - if (abCost != null) { - if (abCost.getSacCost() && life > 4) { - if (abCost.getSacThis() && life > 6) - return false; - else { - //only sacrifice something that's supposed to be sacrificed - String type = abCost.getSacType(); - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - typeList = typeList.getValidCards(type.split(","), source.getController(), source); - if (ComputerUtil.getCardPreference(source, "SacCost", typeList) == null) - return false; - } - } - if (abCost.getLifeCost() && life > 5) return false; - if (abCost.getDiscardCost() && life > 5) return false; - - if (abCost.getSubCounter()) { - //non +1/+1 counters should be used - if (abCost.getCounterType().equals(Counters.P1P1)) { - // A card has a 25% chance per counter to be able to pass through here - // 4+ counters will always pass. 0 counters will never - int currentNum = source.getCounters(abCost.getCounterType()); - double percent = .25 * (currentNum / abCost.getCounterNum()); - if (percent <= r.nextFloat()) - return false; - } - } - } - - if (!AllZone.getComputerPlayer().canGainLife()) - return false; - - //Don't use lifegain before main 2 if possible - if (AllZone.getPhase().isBefore(Constant.Phase.Main2) && !params.containsKey("ActivatingPhases")) - return false; - - //Don't tap creatures that may be able to block - if (AbilityFactory.waitForBlocking(sa)) - return false; - - // TODO handle proper calculation of X values based on Cost and what would be paid - //final int amount = calculateAmount(af.getHostCard(), amountStr, sa); - - // prevent run-away activations - first time will always return true - boolean chance = r.nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn()); - - Target tgt = sa.getTarget(); - if (tgt != null) { - tgt.resetTargets(); - if (tgt.canOnlyTgtOpponent()) - tgt.addTarget(AllZone.getHumanPlayer()); - else - tgt.addTarget(AllZone.getComputerPlayer()); - } - - if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) { - // Set PayX here to maximum value. - int xPay = ComputerUtil.determineLeftoverMana(sa); - source.setSVar("PayX", Integer.toString(xPay)); - } - - boolean randomReturn = r.nextFloat() <= .6667; - if (AbilityFactory.playReusable(sa)) - randomReturn = true; - - return (randomReturn && chance); - } - - /** - *

gainLifeDoTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - public static boolean gainLifeDoTriggerAI(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa) && !mandatory) // If there is a cost payment it's usually not mandatory - return false; - - HashMap params = af.getMapParams(); - - // If the Target is gaining life, target self. - // if the Target is modifying how much life is gained, this needs to be handled better - Target tgt = sa.getTarget(); - if (tgt != null) { - tgt.resetTargets(); - if (tgt.canOnlyTgtOpponent()) - tgt.addTarget(AllZone.getHumanPlayer()); - else - tgt.addTarget(AllZone.getComputerPlayer()); - } - - Card source = sa.getSourceCard(); - String amountStr = params.get("LifeAmount"); - if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) { - // Set PayX here to maximum value. - int xPay = ComputerUtil.determineLeftoverMana(sa); - source.setSVar("PayX", Integer.toString(xPay)); - } - - // check SubAbilities DoTrigger? - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - return abSub.doTrigger(mandatory); - } - - return true; - } - - /** - *

gainLifeResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public static void gainLifeResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - - int lifeAmount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("LifeAmount"), sa); - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null && !params.containsKey("Defined")) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - for (Player p : tgtPlayers) - if (tgt == null || p.canTarget(sa)) - p.gainLife(lifeAmount, sa.getSourceCard()); - } - - // ************************************************************************* - // ************************* LOSE LIFE ************************************* - // ************************************************************************* - - /** - *

createAbilityLoseLife.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityLoseLife(final AbilityFactory AF) { - final SpellAbility abLoseLife = new Ability_Activated(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = 1129762905315395160L; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - return loseLifeStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - // if X depends on abCost, the AI needs to choose which card he would sacrifice first - // then call xCount with that card to properly calculate the amount - // Or choosing how many to sacrifice - return loseLifeCanPlayAI(af, this); - } - - @Override - public void resolve() { - loseLifeResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return loseLifeDoTriggerAI(af, this, mandatory); - } - }; - return abLoseLife; - } - - /** - *

createSpellLoseLife.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellLoseLife(final AbilityFactory AF) { - final SpellAbility spLoseLife = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = -2966932725306192437L; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - return loseLifeStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - // if X depends on abCost, the AI needs to choose which card he would sacrifice first - // then call xCount with that card to properly calculate the amount - // Or choosing how many to sacrifice - return loseLifeCanPlayAI(af, this); - } - - @Override - public void resolve() { - loseLifeResolve(af, this); - } - }; - return spLoseLife; - } - - /** - *

createDrawbackLoseLife.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackLoseLife(final AbilityFactory AF) { - final SpellAbility dbLoseLife = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()) { - private static final long serialVersionUID = -2966932725306192437L; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - return loseLifeStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - // if X depends on abCost, the AI needs to choose which card he would sacrifice first - // then call xCount with that card to properly calculate the amount - // Or choosing how many to sacrifice - return loseLifeCanPlayAI(af, this); - } - - @Override - public void resolve() { - loseLifeResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return loseLifeDoTriggerAI(af, this, mandatory); - } - }; - return dbLoseLife; - } - - /** - *

loseLifeStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - static String loseLifeStackDescription(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - StringBuilder sb = new StringBuilder(); - int amount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("LifeAmount"), sa); - - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard().getName()).append(" - "); - else - sb.append(" "); - - String conditionDesc = params.get("ConditionDescription"); - if (conditionDesc != null) - sb.append(conditionDesc).append(" "); - - ArrayList tgtPlayers; - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - for (Player player : tgtPlayers) - sb.append(player).append(" "); - - sb.append("loses ").append(amount).append(" life."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

loseLifeCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - public static boolean loseLifeCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - Random r = MyRandom.random; - Cost abCost = sa.getPayCosts(); - final Card source = sa.getSourceCard(); - HashMap params = af.getMapParams(); - int humanLife = AllZone.getHumanPlayer().getLife(); - int aiLife = AllZone.getComputerPlayer().getLife(); - - String amountStr = params.get("LifeAmount"); - - // TODO handle proper calculation of X values based on Cost and what would be paid - final int amount = AbilityFactory.calculateAmount(af.getHostCard(), amountStr, sa); - - if (abCost != null) { - // AI currently disabled for these costs - if (abCost.getSacCost()) { - if (amountStr.contains("X")) - return false; - if (!abCost.getSacThis()) { - //only sacrifice something that's supposed to be sacrificed - String type = abCost.getSacType(); - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - typeList = typeList.getValidCards(type.split(","), source.getController(), source); - if (ComputerUtil.getCardPreference(source, "SacCost", typeList) == null) - return false; - } - } - if (abCost.getLifeCost() && aiLife - abCost.getLifeAmount() < humanLife - amount) return false; - if (abCost.getDiscardCost()) return false; - - if (abCost.getSubCounter()) { - // A card has a 25% chance per counter to be able to pass through here - // 4+ counters will always pass. 0 counters will never - int currentNum = source.getCounters(abCost.getCounterType()); - double percent = .25 * (currentNum / abCost.getCounterNum()); - if (percent <= r.nextFloat()) - return false; - } - } - - if (!AllZone.getHumanPlayer().canLoseLife()) - return false; - - //Don't use loselife before main 2 if possible - if (AllZone.getPhase().isBefore(Constant.Phase.Main2) && !params.containsKey("ActivatingPhases")) - return false; - - //Don't tap creatures that may be able to block - if (AbilityFactory.waitForBlocking(sa)) - return false; - - // prevent run-away activations - first time will always return true - boolean chance = r.nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn()); - - Target tgt = sa.getTarget(); - - if (sa.getTarget() != null) { - tgt.resetTargets(); - sa.getTarget().addTarget(AllZone.getHumanPlayer()); - } - - if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) { - // Set PayX here to maximum value. - int xPay = ComputerUtil.determineLeftoverMana(sa); - source.setSVar("PayX", Integer.toString(xPay)); - } - - boolean randomReturn = r.nextFloat() <= .6667; - if (AbilityFactory.playReusable(sa)) - randomReturn = true; - - return (randomReturn && chance); - } - - /** - *

loseLifeDoTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - public static boolean loseLifeDoTriggerAI(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa) && !mandatory) // If there is a cost payment it's usually not mandatory - return false; - - HashMap params = af.getMapParams(); - - Target tgt = sa.getTarget(); - if (tgt != null) { - tgt.addTarget(AllZone.getHumanPlayer()); - } - - Card source = sa.getSourceCard(); - String amountStr = params.get("LifeAmount"); - int amount = 0; - if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) { - // Set PayX here to maximum value. - int xPay = ComputerUtil.determineLeftoverMana(sa); - source.setSVar("PayX", Integer.toString(xPay)); - amount = xPay; - } else - amount = AbilityFactory.calculateAmount(source, amountStr, sa); - - ArrayList tgtPlayers; - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - - if (tgtPlayers.contains(AllZone.getComputerPlayer())) { - // For cards like Foul Imp, ETB you lose life - if (amount + 3 > AllZone.getComputerPlayer().getLife()) - return false; - } - - // check SubAbilities DoTrigger? - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - return abSub.doTrigger(mandatory); - } - - return true; - } - - /** - *

loseLifeResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public static void loseLifeResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - - int lifeAmount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("LifeAmount"), sa); - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - for (Player p : tgtPlayers) - if (tgt == null || p.canTarget(sa)) - p.loseLife(lifeAmount, sa.getSourceCard()); - - } - - // ************************************************************************* - // ************************** Poison Counters ****************************** - // ************************************************************************* - // - // Made more sense here than in AF_Counters since it affects players and their health - - /** - *

createAbilityPoison.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityPoison(final AbilityFactory af) { - - final SpellAbility abPoison = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 6598936088284756268L; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - return poisonStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return poisonCanPlayAI(af, this); - } - - @Override - public void resolve() { - poisonResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return poisonDoTriggerAI(af, this, mandatory); - } - - }; - return abPoison; - } - - /** - *

createSpellPoison.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellPoison(final AbilityFactory af) { - final SpellAbility spPoison = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -1495708415138457833L; - - @Override - public String getStackDescription() { - return poisonStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - // if X depends on abCost, the AI needs to choose which card he would sacrifice first - // then call xCount with that card to properly calculate the amount - // Or choosing how many to sacrifice - return poisonCanPlayAI(af, this); - } - - @Override - public void resolve() { - poisonResolve(af, this); - } - - }; - return spPoison; - } - - /** - *

createDrawbackPoison.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackPoison(final AbilityFactory af) { - final SpellAbility dbPoison = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = -1173479041548558016L; - - @Override - public String getStackDescription() { - return poisonStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - // if X depends on abCost, the AI needs to choose which card he would sacrifice first - // then call xCount with that card to properly calculate the amount - // Or choosing how many to sacrifice - return poisonCanPlayAI(af, this); - } - - @Override - public void resolve() { - poisonResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return poisonDoTriggerAI(af, this, mandatory); - } - - }; - return dbPoison; - } - - /** - *

poisonDoTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean poisonDoTriggerAI(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa) && !mandatory) // If there is a cost payment it's usually not mandatory - return false; - - HashMap params = af.getMapParams(); - - Target tgt = sa.getTarget(); - if (tgt != null) { - tgt.addTarget(AllZone.getHumanPlayer()); - } else { - ArrayList players = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - for (Player p : players) - if (!mandatory && p.isComputer() && p.getPoisonCounters() > p.getOpponent().getPoisonCounters()) - return false; - } - - // check SubAbilities DoTrigger? - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - return abSub.doTrigger(mandatory); - } - - return true; - } - - /** - *

poisonResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void poisonResolve(final AbilityFactory af, final SpellAbility sa) { - final HashMap params = af.getMapParams(); - int amount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("Num"), sa); - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - for (Player p : tgtPlayers) - if (tgt == null || p.canTarget(sa)) - p.addPoisonCounters(amount); - } - - /** - *

poisonStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String poisonStackDescription(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - StringBuilder sb = new StringBuilder(); - int amount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("Num"), sa); - - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard()).append(" - "); - else - sb.append(" "); - - String conditionDesc = params.get("ConditionDescription"); - if (conditionDesc != null) - sb.append(conditionDesc).append(" "); - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - if (tgtPlayers.size() > 0) { - Iterator it = tgtPlayers.iterator(); - while (it.hasNext()) { - Player p = it.next(); - sb.append(p); - if (it.hasNext()) sb.append(", "); - else sb.append(" "); - } - } - - sb.append("get"); - if (tgtPlayers.size() < 2) sb.append("s"); - sb.append(" ").append(amount).append(" poison counter"); - if (amount != 1) sb.append("s."); - else sb.append("."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

poisonCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean poisonCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - Cost abCost = sa.getPayCosts(); - final Card source = af.getHostCard(); - HashMap params = af.getMapParams(); - //int humanPoison = AllZone.getHumanPlayer().getPoisonCounters(); - //int humanLife = AllZone.getHumanPlayer().getLife(); - //int aiPoison = AllZone.getComputerPlayer().getPoisonCounters(); - int aiLife = AllZone.getComputerPlayer().getLife(); - String amountStr = params.get("Num"); - - // TODO handle proper calculation of X values based on Cost and what would be paid - //final int amount = AbilityFactory.calculateAmount(af.getHostCard(), amountStr, sa); - - if (abCost != null) { - // AI currently disabled for these costs - if (abCost.getSacCost()) { - if (amountStr.contains("X")) - return false; - if (!abCost.getSacThis()) { - //only sacrifice something that's supposed to be sacrificed - String type = abCost.getSacType(); - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - typeList = typeList.getValidCards(type.split(","), source.getController(), source); - if (ComputerUtil.getCardPreference(source, "SacCost", typeList) == null) - return false; - } - } - if (abCost.getLifeCost() && aiLife - abCost.getLifeAmount() <= 0) return false; - } - - //Don't use poison before main 2 if possible - if (AllZone.getPhase().isBefore(Constant.Phase.Main2) && !params.containsKey("ActivatingPhases")) - return false; - - //Don't tap creatures that may be able to block - if (AbilityFactory.waitForBlocking(sa)) - return false; - - Target tgt = sa.getTarget(); - - if (sa.getTarget() != null) { - tgt.resetTargets(); - sa.getTarget().addTarget(AllZone.getHumanPlayer()); - } - - return true; - } - - // ************************************************************************* - // ************************** SET LIFE ************************************* - // ************************************************************************* - - /** - *

createAbilitySetLife.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilitySetLife(final AbilityFactory af) { - final SpellAbility abSetLife = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -7375434097541097668L; - - @Override - public String getStackDescription() { - return setLifeStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return setLifeCanPlayAI(af, this); - } - - @Override - public void resolve() { - setLifeResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return setLifeDoTriggerAI(af, this, mandatory); - } - - }; - return abSetLife; - } - - /** - *

createSpellSetLife.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellSetLife(final AbilityFactory af) { - final SpellAbility spSetLife = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -94657822256270222L; - - @Override - public String getStackDescription() { - return setLifeStackDescription(af, this); - } - - public boolean canPlayAI() { - // if X depends on abCost, the AI needs to choose which card he would sacrifice first - // then call xCount with that card to properly calculate the amount - // Or choosing how many to sacrifice - return setLifeCanPlayAI(af, this); - } - - @Override - public void resolve() { - setLifeResolve(af, this); - } - - }; - return spSetLife; - } - - /** - *

createDrawbackSetLife.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackSetLife(final AbilityFactory af) { - final SpellAbility dbSetLife = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = -7634729949893534023L; - - @Override - public String getStackDescription() { - return setLifeStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - // if X depends on abCost, the AI needs to choose which card he would sacrifice first - // then call xCount with that card to properly calculate the amount - // Or choosing how many to sacrifice - return setLifeCanPlayAI(af, this); - } - - @Override - public void resolve() { - setLifeResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return setLifeDoTriggerAI(af, this, mandatory); - } - - }; - return dbSetLife; - } - - /** - *

setLifeStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String setLifeStackDescription(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - StringBuilder sb = new StringBuilder(); - int amount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("LifeAmount"), sa); - - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard()).append(" -"); - else - sb.append(" "); - - String conditionDesc = params.get("ConditionDescription"); - if (conditionDesc != null) - sb.append(conditionDesc).append(" "); - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - for (Player player : tgtPlayers) - sb.append(player).append(" "); - - sb.append("life total becomes ").append(amount).append("."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

setLifeCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean setLifeCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - Random r = MyRandom.random; - //Ability_Cost abCost = sa.getPayCosts(); - final Card source = sa.getSourceCard(); - int life = AllZone.getComputerPlayer().getLife(); - int hlife = AllZone.getHumanPlayer().getLife(); - HashMap params = af.getMapParams(); - String amountStr = params.get("LifeAmount"); - - if (!AllZone.getComputerPlayer().canGainLife()) - return false; - - //Don't use setLife before main 2 if possible - if (AllZone.getPhase().isBefore(Constant.Phase.Main2) && !params.containsKey("ActivatingPhases")) - return false; - - // TODO handle proper calculation of X values based on Cost and what would be paid - int amount; - //we shouldn't have to worry too much about PayX for SetLife - if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) { - // Set PayX here to maximum value. - int xPay = ComputerUtil.determineLeftoverMana(sa); - source.setSVar("PayX", Integer.toString(xPay)); - amount = xPay; - } else - amount = AbilityFactory.calculateAmount(af.getHostCard(), amountStr, sa); - - // prevent run-away activations - first time will always return true - boolean chance = r.nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn()); - - Target tgt = sa.getTarget(); - if (tgt != null) { - tgt.resetTargets(); - if (tgt.canOnlyTgtOpponent()) { - tgt.addTarget(AllZone.getHumanPlayer()); - //if we can only target the human, and the Human's life would go up, don't play it. - //possibly add a combo here for Magister Sphinx and Higedetsu's (sp?) Second Rite - if (amount > hlife || !AllZone.getHumanPlayer().canLoseLife()) return false; - } else { - if (amount > life && life <= 10) tgt.addTarget(AllZone.getComputerPlayer()); - else if (hlife > amount) tgt.addTarget(AllZone.getHumanPlayer()); - else if (amount > life) tgt.addTarget(AllZone.getComputerPlayer()); - else return false; - } - } else { - if (params.containsKey("Each") && params.get("Defined").equals("Each")) { - if (amount == 0) return false; - else if (life > amount) { //will decrease computer's life - if (life < 5 || ((life - amount) > (hlife - amount))) return false; - } - } - if (amount < life) return false; - } - - //if life is in danger, always activate - if (life < 3 && amount > life) return true; - - return ((r.nextFloat() < .6667) && chance); - } - - /** - *

setLifeDoTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean setLifeDoTriggerAI(AbilityFactory af, SpellAbility sa, boolean mandatory) { - int life = AllZone.getComputerPlayer().getLife(); - int hlife = AllZone.getHumanPlayer().getLife(); - Card source = sa.getSourceCard(); - HashMap params = af.getMapParams(); - String amountStr = params.get("LifeAmount"); - if (!ComputerUtil.canPayCost(sa) && !mandatory) // If there is a cost payment it's usually not mandatory - return false; - - int amount; - if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) { - // Set PayX here to maximum value. - int xPay = ComputerUtil.determineLeftoverMana(sa); - source.setSVar("PayX", Integer.toString(xPay)); - amount = xPay; - } else - amount = AbilityFactory.calculateAmount(af.getHostCard(), amountStr, sa); - - if (source.getName().equals("Eternity Vessel") && - (AllZoneUtil.isCardInPlay("Vampire Hexmage", AllZone.getHumanPlayer()) || (source.getCounters(Counters.CHARGE) == 0))) - return false; - - // If the Target is gaining life, target self. - // if the Target is modifying how much life is gained, this needs to be handled better - Target tgt = sa.getTarget(); - if (tgt != null) { - tgt.resetTargets(); - if (tgt.canOnlyTgtOpponent()) - tgt.addTarget(AllZone.getHumanPlayer()); - else { - if (amount > life && life <= 10) tgt.addTarget(AllZone.getComputerPlayer()); - else if (hlife > amount) tgt.addTarget(AllZone.getHumanPlayer()); - else if (amount > life) tgt.addTarget(AllZone.getComputerPlayer()); - else return false; - } - } - - // check SubAbilities DoTrigger? - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - return abSub.doTrigger(mandatory); - } - - return true; - } - - /** - *

setLifeResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void setLifeResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - - int lifeAmount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("LifeAmount"), sa); - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null && !params.containsKey("Defined")) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - for (Player p : tgtPlayers) - if (tgt == null || p.canTarget(sa)) - p.setLife(lifeAmount, sa.getSourceCard()); - } - -}//end class AbilityFactory_AlterLife diff --git a/src/forge/card/abilityFactory/AbilityFactory_Animate.java b/src/forge/card/abilityFactory/AbilityFactory_Animate.java deleted file mode 100644 index a857a2ebe6e..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_Animate.java +++ /dev/null @@ -1,885 +0,0 @@ -package forge.card.abilityFactory; - -import forge.*; -import forge.card.spellability.*; -import forge.card.staticAbility.StaticAbility; -import forge.card.trigger.Trigger; -import forge.card.trigger.TriggerHandler; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; - -/** - *

AbilityFactory_Animate class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_Animate { - - //************************************************************** - //************************** Animate *************************** - //************************************************************** - - /** - *

createAbilityAnimate.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityAnimate(final AbilityFactory af) { - final SpellAbility abAnimate = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 1938171749867735155L; - - @Override - public boolean canPlayAI() { - return animateCanPlayAI(af, this); - } - - @Override - public void resolve() { - animateResolve(af, this); - } - - @Override - public String getStackDescription() { - return animateStackDescription(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return animateTriggerAI(af, this, mandatory); - } - }; - return abAnimate; - } - - /** - *

createSpellAnimate.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellAnimate(final AbilityFactory af) { - final SpellAbility spAnimate = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -4047747186919390147L; - - @Override - public boolean canPlayAI() { - return animateCanPlayAI(af, this); - } - - @Override - public void resolve() { - animateResolve(af, this); - } - - @Override - public String getStackDescription() { - return animateStackDescription(af, this); - } - }; - return spAnimate; - } - - /** - *

createDrawbackAnimate.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackAnimate(final AbilityFactory af) { - final SpellAbility dbAnimate = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = -8659938411460952874L; - - @Override - public void resolve() { - animateResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return animatePlayDrawbackAI(af, this); - } - - @Override - public String getStackDescription() { - return animateStackDescription(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return animateTriggerAI(af, this, mandatory); - } - }; - return dbAnimate; - } - - /** - *

animateStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String animateStackDescription(final AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - Card host = af.getHostCard(); - Map svars = host.getSVars(); - - int power = -1; - if (params.containsKey("Power")) power = AbilityFactory.calculateAmount(host, params.get("Power"), sa); - int toughness = -1; - if (params.containsKey("Toughness")) - toughness = AbilityFactory.calculateAmount(host, params.get("Toughness"), sa); - - boolean permanent = params.containsKey("Permanent") ? true : false; - final ArrayList types = new ArrayList(); - if (params.containsKey("Types")) types.addAll(Arrays.asList(params.get("Types").split(","))); - final ArrayList keywords = new ArrayList(); - if (params.containsKey("Keywords")) keywords.addAll(Arrays.asList(params.get("Keywords").split(" & "))); - //allow SVar substitution for keywords - for (int i = 0; i < keywords.size(); i++) { - String k = keywords.get(i); - if (svars.containsKey(k)) { - keywords.add("\"" + k + "\""); - keywords.remove(k); - } - } - ArrayList colors = new ArrayList(); - if (params.containsKey("Colors")) colors.addAll(Arrays.asList(params.get("Colors").split(","))); - - StringBuilder sb = new StringBuilder(); - - if (sa instanceof Ability_Sub) - sb.append(" "); - else - sb.append(sa.getSourceCard().getName()).append(" - "); - - Target tgt = af.getAbTgt(); - ArrayList tgts; - if (tgt != null) - tgts = tgt.getTargetCards(); - else - tgts = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa); - - for (Card c : tgts) { - sb.append(c).append(" "); - } - sb.append("become"); - if (tgts.size() == 1) sb.append("s a"); - //if power is -1, we'll assume it's not just setting toughness - if (power != -1) sb.append(" ").append(power).append("/").append(toughness); - - if (colors.size() > 0) sb.append(" "); - if(colors.contains("ChosenColor")) { - sb.append("color of that player's choice"); - } - else { - for (int i = 0; i < colors.size(); i++) { - sb.append(colors.get(i)); - if (i < (colors.size() - 1)) sb.append(" and "); - } - } - sb.append(" "); - for (int i = types.size() - 1; i >= 0; i--) { - sb.append(types.get(i)); - sb.append(" "); - } - if (keywords.size() > 0) sb.append("with "); - for (int i = 0; i < keywords.size(); i++) { - sb.append(keywords.get(i)); - if (i < (keywords.size() - 1)) sb.append(" and "); - } - //sb.append(abilities) - //sb.append(triggers) - if (!permanent) { - if (params.containsKey("UntilEndOfCombat")) sb.append(" until end of combat."); - else if(params.containsKey("UntilHostLeavesPlay")) sb.append(" until ").append(host).append(" leaves the battlefield."); - else sb.append(" until end of turn."); - } else sb.append("."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) - sb.append(abSub.getStackDescription()); - - return sb.toString(); - }//end animateStackDescription() - - /** - *

animateCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean animateCanPlayAI(final AbilityFactory af, SpellAbility sa) { - - HashMap params = af.getMapParams(); - Target tgt = af.getAbTgt(); - Card source = sa.getSourceCard(); - - boolean useAbility = true; - - //TODO - add some kind of check to answer "Am I going to attack with this?" - //TODO - add some kind of check for during human turn to answer "Can I use this to block something?" - - //don't use instant speed animate abilities outside computers Combat_Begin step - if (!AllZone.getPhase().is(Constant.Phase.Combat_Begin) && AllZone.getPhase().isPlayerTurn(AllZone.getComputerPlayer()) - && !AbilityFactory.isSorcerySpeed(sa) && !params.containsKey("ActivatingPhases") - && !params.containsKey("Permanent")) - return false; - - //don't use instant speed animate abilities outside humans Combat_Declare_Attackers_InstantAbility step - if ((!AllZone.getPhase().is(Constant.Phase.Combat_Declare_Attackers_InstantAbility) - || AllZone.getCombat().getAttackers().length == 0) - && AllZone.getPhase().isPlayerTurn(AllZone.getHumanPlayer())) - return false; - - //don't activate during main2 unless this effect is permanent - if (AllZone.getPhase().is(Constant.Phase.Main2) && !params.containsKey("Permanent")) - return false; - - if (null == tgt) { - ArrayList defined = AbilityFactory.getDefinedCards(source, params.get("Defined"), sa); - - boolean bFlag = false; - for (Card c : defined) { - bFlag |= (!c.isCreature() && !c.isTapped() && !(c.getTurnInZone() == AllZone.getPhase().getTurn())); - - //for creatures that could be improved (like Figure of Destiny) - int power = -5; - if (params.containsKey("Power")) power = AbilityFactory.calculateAmount(source, params.get("Power"), sa); - int toughness = -5; - if (params.containsKey("Toughness")) - toughness = AbilityFactory.calculateAmount(source, params.get("Toughness"), sa); - if(power + toughness> c.getCurrentPower() + c.getCurrentToughness()) - bFlag = true; - - } - - if (!bFlag) // All of the defined stuff is animated, not very useful - return false; - } else { - tgt.resetTargets(); - useAbility &= animateTgtAI(af, sa); - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - useAbility &= subAb.chkAI_Drawback(); - - return useAbility; - }// end animateCanPlayAI() - - /** - *

animatePlayDrawbackAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean animatePlayDrawbackAI(final AbilityFactory af, SpellAbility sa) { - // AI should only activate this during Human's turn - boolean chance = animateTgtAI(af, sa); - - // TODO: restrict the subAbility a bit - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return chance; - } - - /** - *

animateTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean animateTriggerAI(final AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) // If there is a cost payment - return false; - - boolean chance = animateTgtAI(af, sa); - - // Improve AI for triggers. If source is a creature with: - // When ETB, sacrifice a creature. Check to see if the AI has something to sacrifice - - // Eventually, we can call the trigger of ETB abilities with not mandatory as part of the checks to cast something - - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return chance || mandatory; - } - - /** - *

animateTgtAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean animateTgtAI(AbilityFactory af, SpellAbility sa) { - //This is reasonable for now. Kamahl, Fist of Krosa and a sorcery or two are the only things - //that animate a target. Those can just use SVar:RemAIDeck:True until this can do a reasonably - //good job of picking a good target - return false; - } - - /** - *

animateResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void animateResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - Card source = sa.getSourceCard(); - Card host = af.getHostCard(); - Map svars = host.getSVars(); - long timest = -1; - - //AF specific params - int power = -1; - if (params.containsKey("Power")) power = AbilityFactory.calculateAmount(host, params.get("Power"), sa); - int toughness = -1; - if (params.containsKey("Toughness")) - toughness = AbilityFactory.calculateAmount(host, params.get("Toughness"), sa); - - if (power != -1 || toughness != -1) - timest = AllZone.getNextTimestamp(); - - final long timestamp = timest; - - boolean permanent = params.containsKey("Permanent") ? true : false; - - final ArrayList types = new ArrayList(); - if (params.containsKey("Types")) types.addAll(Arrays.asList(params.get("Types").split(","))); - - //allow ChosenType - overrides anything else specified - if (types.contains("ChosenType")) { - types.clear(); - types.add(host.getChosenType()); - } - - final ArrayList keywords = new ArrayList(); - if (params.containsKey("Keywords")) keywords.addAll(Arrays.asList(params.get("Keywords").split(" & "))); - //allow SVar substitution for keywords - for (int i = 0; i < keywords.size(); i++) { - String k = keywords.get(i); - if (svars.containsKey(k)) { - keywords.add(svars.get(k)); - keywords.remove(k); - } - } - - //colors to be added or changed to - String tmpDesc = ""; - if (params.containsKey("Colors")) { - String colors = params.get("Colors"); - if (colors.equals("ChosenColor")) { - tmpDesc = CardUtil.getShortColorsString(new ArrayList(Arrays.asList(host.getChosenColor().split(",")))); - } else { - tmpDesc = CardUtil.getShortColorsString(new ArrayList(Arrays.asList(colors.split(",")))); - } - } - final String finalDesc = tmpDesc; - - //abilities to add to the animated being - ArrayList abilities = new ArrayList(); - if (params.containsKey("Abilities")) abilities.addAll(Arrays.asList(params.get("Abilities").split(","))); - - //triggers to add to the animated being - ArrayList triggers = new ArrayList(); - if (params.containsKey("Triggers")) triggers.addAll(Arrays.asList(params.get("Triggers").split(","))); - - //static abilities to add to the animated being - ArrayList stAbs = new ArrayList(); - if (params.containsKey("staticAbilities")) stAbs.addAll(Arrays.asList(params.get("staticAbilities").split(","))); - - //sVars to add to the animated being - ArrayList sVars = new ArrayList(); - if (params.containsKey("sVars")) sVars.addAll(Arrays.asList(params.get("sVars").split(","))); - - Target tgt = af.getAbTgt(); - ArrayList tgts; - if (tgt != null) - tgts = tgt.getTargetCards(); - else - tgts = AbilityFactory.getDefinedCards(source, params.get("Defined"), sa); - - for (final Card c : tgts) { - - final long colorTimestamp = doAnimate(c, af, power, toughness, types, finalDesc, keywords, timestamp); - - //give abilities - final ArrayList addedAbilities = new ArrayList(); - if (abilities.size() > 0) { - for (String s : abilities) { - AbilityFactory newAF = new AbilityFactory(); - String actualAbility = host.getSVar(s); - SpellAbility grantedAbility = newAF.getAbility(actualAbility, c); - addedAbilities.add(grantedAbility); - c.addSpellAbility(grantedAbility); - } - } - - //Grant triggers - final ArrayList addedTriggers = new ArrayList(); - if (triggers.size() > 0) { - for (String s : triggers) { - String actualTrigger = host.getSVar(s); - Trigger parsedTrigger = TriggerHandler.parseTrigger(actualTrigger, c); - addedTriggers.add(c.addTrigger(parsedTrigger)); - AllZone.getTriggerHandler().registerTrigger(parsedTrigger); - } - } - - //give static abilities (should only be used by cards to give itself a static ability) - if (stAbs.size() > 0) { - for (String s : stAbs) { - String actualAbility = host.getSVar(s); - c.addStaticAbility(actualAbility); - } - } - - //give sVars - if (sVars.size() > 0) { - for (String s : sVars) { - String actualsVar = host.getSVar(s); - c.setSVar(s, actualsVar); - } - } - - final boolean givesStAbs = (stAbs.size() > 0); - - final Command unanimate = new Command() { - private static final long serialVersionUID = -5861759814760561373L; - - public void execute() { - doUnanimate(c, af, finalDesc, keywords, addedAbilities, addedTriggers, colorTimestamp, givesStAbs, timestamp); - } - }; - - if (!permanent) { - if (params.containsKey("UntilEndOfCombat")) AllZone.getEndOfCombat().addUntil(unanimate); - else if(params.containsKey("UntilHostLeavesPlay")) { - host.addLeavesPlayCommand(unanimate); - } - else AllZone.getEndOfTurn().addUntil(unanimate); - } - } - }//animateResolve - - /** - *

doAnimate.

- * - * @param c a {@link forge.Card} object. - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param power a int. - * @param toughness a int. - * @param types a {@link java.util.ArrayList} object. - * @param colors a {@link java.lang.String} object. - * @param keywords a {@link java.util.ArrayList} object. - * @return a long. - */ - private static long doAnimate(Card c, AbilityFactory af, int power, int toughness, ArrayList types, String colors, - ArrayList keywords, long timestamp) { - HashMap params = af.getMapParams(); - - boolean removeSuperTypes = false; - boolean removeCardTypes = false; - boolean removeSubTypes = false; - - if (params.containsKey("OverwriteTypes")) { - removeSuperTypes = true; - removeCardTypes = true; - removeSubTypes = true; - } - - if (params.containsKey("KeepSupertypes")) - removeSuperTypes = false; - - if (params.containsKey("KeepCardTypes")) - removeCardTypes = false; - - if (power != -1 || toughness != -1) - c.addNewPT(power, toughness, timestamp); - - if (!types.isEmpty()) - c.addChangedCardTypes(types, removeSuperTypes, removeCardTypes, removeSubTypes, removeSubTypes, timestamp); - - for (String k : keywords) { - if (k.startsWith("HIDDEN")) - c.addExtrinsicKeyword(k); - //this maybe should just blindly add since multiple instances of a keyword sometimes have effects - //practically, this shouldn't matter though, and will display more cleanly - else if (!c.getIntrinsicKeyword().contains(k) || CardUtil.isStackingKeyword(k)) - c.addIntrinsicKeyword(k); - } - - long colorTimestamp = c.addColor(colors, c, !params.containsKey("OverwriteColors"), true); - return colorTimestamp; - } - - /** - *

doUnanimate.

- * - * @param c a {@link forge.Card} object. - * @param originalPower a int. - * @param originalToughness a int. - * @param originalTypes a {@link java.util.ArrayList} object. - * @param colorDesc a {@link java.lang.String} object. - * @param originalKeywords a {@link java.util.ArrayList} object. - * @param addedAbilities a {@link java.util.ArrayList} object. - * @param addedTriggers a {@link java.util.ArrayList} object. - * @param timestamp a long. - */ - private static void doUnanimate(Card c, AbilityFactory af, String colorDesc, - ArrayList originalKeywords, ArrayList addedAbilities, ArrayList addedTriggers, - long colorTimestamp, boolean givesStAbs, long timestamp) { - HashMap params = af.getMapParams(); - - c.removeNewPT(timestamp); - - //remove all static abilities - if (givesStAbs) - c.setStaticAbilities(new ArrayList()); - - if (params.containsKey("Types")) - c.removeChangedCardTypes(timestamp); - - c.removeColor(colorDesc, c, !params.containsKey("OverwriteColors"), colorTimestamp); - - for (String k : originalKeywords) { - if (k.startsWith("HIDDEN")) - c.removeExtrinsicKeyword(k); - //TODO - may want to look at saving off intrinsic and extrinsic separately and add back that way - c.removeIntrinsicKeyword(k); - } - - for (SpellAbility sa : addedAbilities) { - c.removeSpellAbility(sa); - } - - for (Trigger t : addedTriggers) { - AllZone.getTriggerHandler().removeRegisteredTrigger(t); - c.removeTrigger(t); - } - - //any other unanimate cleanup - if (!c.isCreature()) c.unEquipAllCards(); - } - - //************************************************************** - // ************************ AnimateAll ************************* - //************************************************************** - - /** - *

createAbilityAnimateAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityAnimateAll(final AbilityFactory af) { - final SpellAbility abAnimateAll = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -4969632476557290609L; - - @Override - public boolean canPlayAI() { - return animateAllCanPlayAI(af, this); - } - - @Override - public void resolve() { - animateAllResolve(af, this); - } - - @Override - public String getStackDescription() { - return animateAllStackDescription(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return animateAllTriggerAI(af, this, mandatory); - } - }; - return abAnimateAll; - } - - /** - *

createSpellAnimateAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellAnimateAll(final AbilityFactory af) { - final SpellAbility spAnimateAll = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 2946847609068706237L; - - @Override - public boolean canPlayAI() { - return animateAllCanPlayAI(af, this); - } - - @Override - public void resolve() { - animateAllResolve(af, this); - } - - @Override - public String getStackDescription() { - return animateAllStackDescription(af, this); - } - }; - return spAnimateAll; - } - - /** - *

createDrawbackAnimateAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackAnimateAll(final AbilityFactory af) { - final SpellAbility dbAnimateAll = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = 2056843302051205632L; - - @Override - public void resolve() { - animateAllResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return animateAllPlayDrawbackAI(af, this); - } - - @Override - public String getStackDescription() { - return animateAllStackDescription(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return animateAllTriggerAI(af, this, mandatory); - } - }; - return dbAnimateAll; - } - - /** - *

animateAllStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String animateAllStackDescription(final AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - - StringBuilder sb = new StringBuilder(); - - if (sa instanceof Ability_Sub) - sb.append(" "); - else - sb.append(sa.getSourceCard()).append(" - "); - - String desc = ""; - if (params.containsKey("SpellDescription")) { - desc = params.get("SpellDescription"); - } else { - desc = "Animate all valid cards."; - } - - sb.append(desc); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) - sb.append(abSub.getStackDescription()); - - return sb.toString(); - } - - /** - *

animateAllCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean animateAllCanPlayAI(final AbilityFactory af, SpellAbility sa) { - boolean useAbility = false; - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - useAbility &= subAb.chkAI_Drawback(); - - return useAbility; - }// end animateAllCanPlayAI() - - /** - *

animateAllPlayDrawbackAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean animateAllPlayDrawbackAI(final AbilityFactory af, SpellAbility sa) { - boolean chance = false; - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return chance; - } - - /** - *

animateAllTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean animateAllTriggerAI(final AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) // If there is a cost payment - return false; - - boolean chance = false; - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return chance || mandatory; - } - - /** - *

animateAllResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void animateAllResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - Card host = af.getHostCard(); - Map svars = host.getSVars(); - long timest = -1; - - //AF specific params - int power = -1; - if (params.containsKey("Power")) power = AbilityFactory.calculateAmount(host, params.get("Power"), sa); - int toughness = -1; - if (params.containsKey("Toughness")) - toughness = AbilityFactory.calculateAmount(host, params.get("Toughness"), sa); - - if (power != -1 || toughness != -1) - timest = AllZone.getNextTimestamp(); - - final long timestamp = timest; - - boolean permanent = params.containsKey("Permanent") ? true : false; - - final ArrayList types = new ArrayList(); - if (params.containsKey("Types")) types.addAll(Arrays.asList(params.get("Types").split(","))); - - //allow ChosenType - overrides anything else specified - if (types.contains("ChosenType")) { - types.clear(); - types.add(host.getChosenType()); - } - - final ArrayList keywords = new ArrayList(); - if (params.containsKey("Keywords")) keywords.addAll(Arrays.asList(params.get("Keywords").split(" & "))); - //allow SVar substitution for keywords - for (int i = 0; i < keywords.size(); i++) { - String k = keywords.get(i); - if (svars.containsKey(k)) { - keywords.add(svars.get(k)); - keywords.remove(k); - } - } - - //colors to be added or changed to - String tmpDesc = ""; - if (params.containsKey("Colors")) { - String colors = params.get("Colors"); - if (colors.equals("ChosenColor")) { - tmpDesc = CardUtil.getShortColorsString(new ArrayList(Arrays.asList(host.getChosenColor().split(",")))); - } else { - tmpDesc = CardUtil.getShortColorsString(new ArrayList(Arrays.asList(colors.split(",")))); - } - } - final String finalDesc = tmpDesc; - - //abilities to add to the animated being - ArrayList abilities = new ArrayList(); - if (params.containsKey("Abilities")) abilities.addAll(Arrays.asList(params.get("Abilities").split(","))); - - //triggers to add to the animated being - ArrayList triggers = new ArrayList(); - if (params.containsKey("Triggers")) triggers.addAll(Arrays.asList(params.get("Triggers").split(","))); - - String valid = ""; - - if (params.containsKey("ValidCards")) - valid = params.get("ValidCards"); - - CardList list = AllZoneUtil.getCardsInPlay(); - list = list.getValidCards(valid.split(","), host.getController(), host); - - for (final Card c : list) { - - final long colorTimestamp = doAnimate(c, af, power, toughness, types, finalDesc, keywords, timestamp); - - //give abilities - final ArrayList addedAbilities = new ArrayList(); - if (abilities.size() > 0) { - for (String s : abilities) { - AbilityFactory newAF = new AbilityFactory(); - String actualAbility = host.getSVar(s); - SpellAbility grantedAbility = newAF.getAbility(actualAbility, c); - addedAbilities.add(grantedAbility); - c.addSpellAbility(grantedAbility); - } - } - - //Grant triggers - final ArrayList addedTriggers = new ArrayList(); - if (triggers.size() > 0) { - for (String s : triggers) { - String actualTrigger = host.getSVar(s); - Trigger parsedTrigger = TriggerHandler.parseTrigger(actualTrigger, c); - addedTriggers.add(c.addTrigger(parsedTrigger)); - AllZone.getTriggerHandler().registerTrigger(parsedTrigger); - } - } - - final Command unanimate = new Command() { - private static final long serialVersionUID = -5861759814760561373L; - - public void execute() { - doUnanimate(c, af, finalDesc, keywords, addedAbilities, addedTriggers, colorTimestamp, false, timestamp); - } - }; - - if (!permanent) { - if (params.containsKey("UntilEndOfCombat")) AllZone.getEndOfCombat().addUntil(unanimate); - else AllZone.getEndOfTurn().addUntil(unanimate); - } - } - }//animateAllResolve - -}//end class AbilityFactory_Animate diff --git a/src/forge/card/abilityFactory/AbilityFactory_ChangeZone.java b/src/forge/card/abilityFactory/AbilityFactory_ChangeZone.java deleted file mode 100644 index 663ad84bcf7..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_ChangeZone.java +++ /dev/null @@ -1,1765 +0,0 @@ -package forge.card.abilityFactory; - -import forge.*; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.*; -import forge.gui.GuiUtils; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Random; - -/** - *

AbilityFactory_ChangeZone class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_ChangeZone { - - // Change Zone is going to work much differently than other AFs. - // *NOTE* Please do not use this as a base for copying and creating your own AF - - - /** - *

createAbilityChangeZone.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityChangeZone(final AbilityFactory AF) { - final SpellAbility abChangeZone = new Ability_Activated(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = 3728332812890211671L; - - @Override - public boolean canPlayAI() { - return changeZoneCanPlayAI(AF, this); - } - - @Override - public void resolve() { - changeZoneResolve(AF, this); - } - - @Override - public String getStackDescription() { - return changeZoneDescription(AF, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return changeZoneTriggerAI(AF, this, mandatory); - } - - }; - setMiscellaneous(AF, abChangeZone); - return abChangeZone; - } - - /** - *

createSpellChangeZone.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellChangeZone(final AbilityFactory AF) { - final SpellAbility spChangeZone = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = 3270484211099902059L; - - @Override - public boolean canPlayAI() { - return changeZoneCanPlayAI(AF, this); - } - - @Override - public void resolve() { - changeZoneResolve(AF, this); - } - - @Override - public String getStackDescription() { - return changeZoneDescription(AF, this); - } - }; - setMiscellaneous(AF, spChangeZone); - return spChangeZone; - } - - /** - *

createDrawbackChangeZone.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackChangeZone(final AbilityFactory AF) { - final SpellAbility dbChangeZone = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()) { - private static final long serialVersionUID = 3270484211099902059L; - - @Override - public void resolve() { - changeZoneResolve(AF, this); - } - - @Override - public boolean chkAI_Drawback() { - return changeZonePlayDrawbackAI(AF, this); - } - - @Override - public String getStackDescription() { - return changeZoneDescription(AF, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return changeZoneTriggerAI(AF, this, mandatory); - } - }; - setMiscellaneous(AF, dbChangeZone); - return dbChangeZone; - } - - /** - *

isHidden.

- * - * @param origin a {@link java.lang.String} object. - * @param hiddenOverride a boolean. - * @return a boolean. - */ - public static boolean isHidden(String origin, boolean hiddenOverride) { - return (hiddenOverride || origin.equals("Library") || origin.equals("Hand") || origin.equals("Sideboard")); - } - - /** - *

isKnown.

- * - * @param origin a {@link java.lang.String} object. - * @return a boolean. - */ - public static boolean isKnown(String origin) { - return (origin.equals("Graveyard") || origin.equals("Exile") || origin.equals("Battlefield") || origin.equals("Stack")); - } - - /** - *

setMiscellaneous.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void setMiscellaneous(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - String origin = params.get("Origin"); - - Target tgt = af.getAbTgt(); - - // Don't set the zone if it targets a player - if (tgt != null && !tgt.canTgtPlayer()) - af.getAbTgt().setZone(origin); - - if (!(sa instanceof Ability_Sub)) - if (origin.equals("Battlefield") || params.get("Destination").equals("Battlefield")) - af.getHostCard().setSVar("PlayMain1", "TRUE"); - } - - /** - *

changeZoneCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean changeZoneCanPlayAI(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - String origin = params.get("Origin"); - - if (isHidden(origin, params.containsKey("Hidden"))) - return changeHiddenOriginCanPlayAI(af, sa); - - else if (isKnown(origin)) - return changeKnownOriginCanPlayAI(af, sa); - - return false; - } - - /** - *

changeZonePlayDrawbackAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean changeZonePlayDrawbackAI(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - String origin = params.get("Origin"); - - if (isHidden(origin, params.containsKey("Hidden"))) - return changeHiddenOriginPlayDrawbackAI(af, sa); - - else if (isKnown(origin)) - return changeKnownOriginPlayDrawbackAI(af, sa); - - return false; - } - - /** - *

changeZoneTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean changeZoneTriggerAI(AbilityFactory af, SpellAbility sa, boolean mandatory) { - HashMap params = af.getMapParams(); - String origin = params.get("Origin"); - - if (isHidden(origin, params.containsKey("Hidden"))) - return changeHiddenTriggerAI(af, sa, mandatory); - - else if (isKnown(origin)) - return changeKnownOriginTriggerAI(af, sa, mandatory); - - return false; - } - - /** - *

changeZoneDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String changeZoneDescription(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - String origin = params.get("Origin"); - - if (isHidden(origin, params.containsKey("Hidden"))) - return changeHiddenOriginStackDescription(af, sa); - - else if (isKnown(origin)) - return changeKnownOriginStackDescription(af, sa); - - return ""; - } - - /** - *

changeZoneResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void changeZoneResolve(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - String origin = params.get("Origin"); - - if (isHidden(origin, params.containsKey("Hidden")) && !params.containsKey("Ninjutsu")) - changeHiddenOriginResolve(af, sa); - - else if (isKnown(origin) || params.containsKey("Ninjutsu")) - changeKnownOriginResolve(af, sa); - } - - // ************************************************************************************* - // ************ Hidden Origin (Library/Hand/Sideboard/Non-targetd other) *************** - // ******* Hidden origin cards are chosen on the resolution of the spell *************** - // ******* It is possible for these to have Destination of Battlefield ***************** - // ****** Example: Cavern Harpy where you don't choose the card until resolution ******* - // ************************************************************************************* - - /** - *

changeHiddenOriginCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean changeHiddenOriginCanPlayAI(AbilityFactory af, SpellAbility sa) { - // Fetching should occur fairly often as it helps cast more spells, and have access to more mana - Cost abCost = af.getAbCost(); - Card source = af.getHostCard(); - HashMap params = af.getMapParams(); - String origin = params.get("Origin"); - //String destination = params.get("Destination"); - - if (abCost != null) { - // AI currently disabled for these costs - if (abCost.getSacCost() && !abCost.getSacThis()) { - //only sacrifice something that's supposed to be sacrificed - String type = abCost.getSacType(); - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - typeList = typeList.getValidCards(type.split(","), source.getController(), source); - if (ComputerUtil.getCardPreference(source, "SacCost", typeList) == null) - return false; - } - if (abCost.getLifeCost()) { - if (AllZone.getComputerPlayer().getLife() - abCost.getLifeAmount() < 4) - return false; - } - if (abCost.getDiscardCost()) return false; - - if (abCost.getSubCounter()) ; // SubCounter is fine - - } - - Random r = MyRandom.random; - // prevent run-away activations - first time will always return true - - - - boolean chance = r.nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn()); - - ArrayList pDefined; - Target tgt = af.getAbTgt(); - if (tgt != null && tgt.canTgtPlayer()) { - if (af.isCurse()) - tgt.addTarget(AllZone.getHumanPlayer()); - else - tgt.addTarget(AllZone.getComputerPlayer()); - pDefined = tgt.getTargetPlayers(); - } else { - pDefined = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - } - - String type = params.get("ChangeType"); - if (type != null) { - if (type.contains("X") && source.getSVar("X").equals("Count$xPaid")) { - // Set PayX here to maximum value. - int xPay = ComputerUtil.determineLeftoverMana(sa); - source.setSVar("PayX", Integer.toString(xPay)); - } - } - - for (Player p : pDefined) { - CardList list = AllZoneUtil.getCardsInZone(origin, p); - - if (type != null && p.isComputer()) { - // AI only "knows" about his information - list = AbilityFactory.filterListByType(list, params.get("ChangeType"), sa); - } - - if (list.isEmpty()) - return false; - } - - chance &= (r.nextFloat() < .8); - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return chance; - } - - /** - *

changeHiddenOriginPlayDrawbackAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean changeHiddenOriginPlayDrawbackAI(AbilityFactory af, SpellAbility sa) { - // if putting cards from hand to library and parent is drawing cards - // make sure this will actually do something: - Target tgt = af.getAbTgt(); - if (tgt != null && tgt.canTgtPlayer()) { - if (af.isCurse()) - tgt.addTarget(AllZone.getHumanPlayer()); - else - tgt.addTarget(AllZone.getComputerPlayer()); - } - - return true; - } - - /** - *

changeHiddenTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean changeHiddenTriggerAI(AbilityFactory af, SpellAbility sa, boolean mandatory) { - // Fetching should occur fairly often as it helps cast more spells, and have access to more mana - - Card source = sa.getSourceCard(); - - HashMap params = af.getMapParams(); - //String destination = params.get("Destination"); - String origin = params.get("Origin"); - - // this works for hidden because the mana is paid first. - String type = params.get("ChangeType"); - if (type != null && type.contains("X") && source.getSVar("X").equals("Count$xPaid")) { - // Set PayX here to maximum value. - int xPay = ComputerUtil.determineLeftoverMana(sa); - source.setSVar("PayX", Integer.toString(xPay)); - } - - ArrayList pDefined; - Target tgt = af.getAbTgt(); - if (tgt != null && tgt.canTgtPlayer()) { - if (af.isCurse()) { - if (AllZone.getHumanPlayer().canTarget(sa)) - tgt.addTarget(AllZone.getHumanPlayer()); - else if (mandatory && AllZone.getComputerPlayer().canTarget(sa)) - tgt.addTarget(AllZone.getComputerPlayer()); - } else { - if (AllZone.getComputerPlayer().canTarget(sa)) - tgt.addTarget(AllZone.getComputerPlayer()); - else if (mandatory && AllZone.getHumanPlayer().canTarget(sa)) - tgt.addTarget(AllZone.getHumanPlayer()); - } - - pDefined = tgt.getTargetPlayers(); - - if (pDefined.isEmpty()) - return false; - - if (mandatory) { - return pDefined.size() > 0; - } - } else { - if (mandatory) - return true; - pDefined = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - } - - for (Player p : pDefined) { - CardList list = AllZoneUtil.getCardsInZone(origin, p); - - if (p.isComputer()) // Computer should "know" his deck - list = AbilityFactory.filterListByType(list, params.get("ChangeType"), sa); - - if (list.isEmpty()) - return false; - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - return subAb.doTrigger(mandatory); - - return true; - } - - /** - *

changeHiddenOriginStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String changeHiddenOriginStackDescription(AbilityFactory af, SpellAbility sa) { - // TODO: build Stack Description will need expansion as more cards are added - HashMap params = af.getMapParams(); - - StringBuilder sb = new StringBuilder(); - Card host = af.getHostCard(); - - if (!(sa instanceof Ability_Sub)) - sb.append(host.getName()).append(" -"); - - sb.append(" "); - - if (params.containsKey("StackDescription")) - sb.append(params.get("StackDescription")); - - else { - String origin = params.get("Origin"); - String destination = params.get("Destination"); - - String type = params.containsKey("ChangeType") ? params.get("ChangeType") : "Card"; - int num = params.containsKey("ChangeNum") ? AbilityFactory.calculateAmount(host, params.get("ChangeNum"), sa) : 1; - - if (origin.equals("Library")) { - sb.append("Search your library for ").append(num).append(" ").append(type).append(" and "); - - if (params.get("ChangeNum").equals("1")) - sb.append("put that card "); - else - sb.append("put those cards "); - - if (destination.equals("Battlefield")) { - sb.append("onto the battlefield"); - if (params.containsKey("Tapped")) - sb.append(" tapped"); - - - sb.append("."); - - } - if (destination.equals("Hand")) - sb.append("into your hand."); - if (destination.equals("Graveyard")) - sb.append("into your graveyard."); - - sb.append("Then shuffle your library."); - } else if (origin.equals("Hand")) { - sb.append("Put ").append(num).append(" ").append(type).append(" card(s) from your hand "); - - if (destination.equals("Battlefield")) - sb.append("onto the battlefield."); - if (destination.equals("Library")) { - int libraryPos = params.containsKey("LibraryPosition") ? Integer.parseInt(params.get("LibraryPosition")) : 0; - - if (libraryPos == 0) - sb.append("on top"); - if (libraryPos == -1) - sb.append("on bottom"); - - sb.append(" of your library."); - } - } else if (origin.equals("Battlefield")) { - // TODO: Expand on this Description as more cards use it - // for the non-targeted SAs when you choose what is returned on resolution - sb.append("Return ").append(num).append(" ").append(type).append(" card(s) "); - sb.append(" to your ").append(destination); - } - } - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

changeHiddenOriginResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void changeHiddenOriginResolve(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - - ArrayList fetchers; - - fetchers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - Player chooser = null; - if (params.containsKey("Chooser")) { - String choose = params.get("Chooser"); - if (choose.equals("Targeted") && af.getAbTgt().getTargetPlayers() != null) - chooser = af.getAbTgt().getTargetPlayers().get(0); - else - chooser = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), choose, sa).get(0); - } - - for (Player player : fetchers) { - Player decider = chooser; - if (decider == null) - decider = player; - if (decider.isComputer()) { - changeHiddenOriginResolveAI(af, sa, player); - } else { - changeHiddenOriginResolveHuman(af, sa, player); - } - } - } - - /** - *

changeHiddenOriginResolveHuman.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param player a {@link forge.Player} object. - */ - private static void changeHiddenOriginResolveHuman(AbilityFactory af, SpellAbility sa, Player player) { - HashMap params = af.getMapParams(); - Card card = sa.getSourceCard(); - Target tgt = af.getAbTgt(); - if (tgt != null) { - ArrayList players = tgt.getTargetPlayers(); - player = players.get(0); - if (players.contains(player) && !player.canTarget(sa)) - return; - } - - String origin = params.get("Origin"); - String destination = params.get("Destination"); - // this needs to be zero indexed. Top = 0, Third = 2 - int libraryPos = params.containsKey("LibraryPosition") ? Integer.parseInt(params.get("LibraryPosition")) : 0; - - if (params.containsKey("OriginChoice")) { - // Currently only used for Mishra, but may be used by other things - // Improve how this message reacts for other cards - String alt = params.get("OriginAlternative"); - CardList altFetchList = AllZoneUtil.getCardsInZone(alt, player); - altFetchList = AbilityFactory.filterListByType(altFetchList, params.get("ChangeType"), sa); - - StringBuilder sb = new StringBuilder(); - sb.append(params.get("AlternativeMessage")).append(" "); - sb.append(altFetchList.size()).append(" cards match your searching type in Alternate Zones."); - - if (!GameActionUtil.showYesNoDialog(card, sb.toString())) - origin = alt; - } - - if (params.containsKey("DestinationAlternative")) { - - StringBuilder sb = new StringBuilder(); - sb.append(params.get("AlternativeDestinationMessage")); - - if (!GameActionUtil.showYesNoDialog(card, sb.toString())) { - destination = params.get("DestinationAlternative"); - libraryPos = params.containsKey("LibraryPositionAlternative") ? Integer.parseInt(params.get("LibraryPositionAlternative")) : 0; - } - } - - CardList fetchList = AllZoneUtil.getCardsInZone(origin, player); - if (origin.contains("Library")) // Look at whole library before moving onto choosing a card{ - GuiUtils.getChoiceOptional(af.getHostCard().getName() + " - Looking at Library", AllZoneUtil.getCardsInZone("Library", player).toArray()); - - if (origin.contains("Hand") && player.isComputer()) // Look at opponents hand before moving onto choosing a card - GuiUtils.getChoiceOptional(af.getHostCard().getName() + " - Looking at Opponent's Hand", AllZoneUtil.getCardsInZone("Hand", player).toArray()); - - fetchList = AbilityFactory.filterListByType(fetchList, params.get("ChangeType"), sa); - - PlayerZone destZone = AllZone.getZone(destination, player); - - int changeNum = params.containsKey("ChangeNum") ? AbilityFactory.calculateAmount(card, params.get("ChangeNum"), sa) : 1; - - String remember = params.get("RememberChanged"); - - for (int i = 0; i < changeNum; i++) { - if (fetchList.size() == 0 || destination == null) - break; - - Object o; - if (params.containsKey("Mandatory")) - o = GuiUtils.getChoice("Select a card", fetchList.toArray()); - else - o = GuiUtils.getChoiceOptional("Select a card", fetchList.toArray()); - - if (o != null) { - Card c = (Card) o; - fetchList.remove(c); - Card movedCard = null; - - if (destination.equals("Library")) { - // do not shuffle the library once we have placed a fetched card on top. - if (origin.contains("Library") && i < 1) { - player.shuffle(); - } - movedCard = AllZone.getGameAction().moveToLibrary(c, libraryPos); - } else if (destination.equals("Battlefield")) { - if (params.containsKey("Tapped")) - c.tap(); - if (params.containsKey("GainControl")) - c.setController(sa.getActivatingPlayer()); - - movedCard = AllZone.getGameAction().moveTo(AllZone.getZone(destination, c.getController()), c); - } else - movedCard = AllZone.getGameAction().moveTo(destZone, c); - - if (remember != null) - card.addRemembered(movedCard); - //for imprinted since this doesn't use Target - if (params.containsKey("Imprint")) - card.addImprinted(movedCard); - - } else { - StringBuilder sb = new StringBuilder(); - int num = Math.min(fetchList.size(), changeNum - i); - sb.append("Cancel Search? Up to ").append(num).append(" more cards can change zones."); - - if (i + 1 == changeNum || GameActionUtil.showYesNoDialog(card, sb.toString())) - break; - } - } - - if ((origin.contains("Library") && !destination.equals("Library")) || params.containsKey("Shuffle")) - player.shuffle(); - } - - /** - *

changeHiddenOriginResolveAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param player a {@link forge.Player} object. - */ - private static void changeHiddenOriginResolveAI(AbilityFactory af, SpellAbility sa, Player player) { - HashMap params = af.getMapParams(); - Target tgt = af.getAbTgt(); - Card card = af.getHostCard(); - - if (tgt != null) { - if (!tgt.getTargetPlayers().isEmpty()) { - player = tgt.getTargetPlayers().get(0); - if (!player.canTarget(sa)) - return; - } - } - - String origin = params.get("Origin"); - - CardList fetchList = AllZoneUtil.getCardsInZone(origin, player); - fetchList = AbilityFactory.filterListByType(fetchList, params.get("ChangeType"), sa); - - String destination = params.get("Destination"); - - PlayerZone destZone = AllZone.getZone(destination, player); - - String type = params.get("ChangeType"); - if (type == null) - type = "Card"; - - CardList fetched = new CardList(); - - int changeNum = params.containsKey("ChangeNum") ? AbilityFactory.calculateAmount(card, params.get("ChangeNum"), sa) : 1; - - String remember = params.get("RememberChanged"); - - for (int i = 0; i < changeNum; i++) { - if (fetchList.size() == 0 || destination == null) - break; - - // Improve the AI for fetching. - Card c; - if (type.contains("Basic")) - c = basicManaFixing(fetchList); - else if (areAllBasics(type)) // if Searching for only basics, - c = basicManaFixing(fetchList, type); - else if (fetchList.getNotType("Creature").size() == 0) - c = CardFactoryUtil.AI_getBestCreature(fetchList); //if only creatures take the best - else if ("Battlefield".equals(destination) || "Graveyard".equals(destination)) - c = CardFactoryUtil.AI_getMostExpensivePermanent(fetchList, af.getHostCard(), false); - else if ("Exile".equals(destination)) { - // Exiling your own stuff, if Exiling opponents stuff choose best - if (destZone.getPlayer().isHuman()) - c = CardFactoryUtil.AI_getMostExpensivePermanent(fetchList, af.getHostCard(), false); - else - c = CardFactoryUtil.AI_getCheapestPermanent(fetchList, af.getHostCard(), false); - } else { - //Don't fetch another tutor with the same name - if (origin.contains("Library") && !fetchList.getNotName(card.getName()).isEmpty()) - fetchList = fetchList.getNotName(card.getName()); - - fetchList.shuffle(); - c = fetchList.get(0); - } - - fetched.add(c); - fetchList.remove(c); - } - - if (origin.contains("Library")) - player.shuffle(); - - for (Card c : fetched) { - Card newCard = null; - if ("Library".equals(destination)) { - int libraryPos = params.containsKey("LibraryPosition") ? Integer.parseInt(params.get("LibraryPosition")) : 0; - AllZone.getGameAction().moveToLibrary(c, libraryPos); - } else if ("Battlefield".equals(destination)) { - if (params.containsKey("Tapped")) - c.tap(); - if (params.containsKey("GainControl")) - c.setController(sa.getActivatingPlayer()); - // Auras without Candidates stay in their current location - if (c.isAura()){ - SpellAbility saAura = AbilityFactory_Attach.getAttachSpellAbility(c); - if (!saAura.getTarget().hasCandidates(false)) - continue; - } - - newCard = AllZone.getGameAction().moveTo(AllZone.getZone(destination, c.getController()), c); - } else - newCard = AllZone.getGameAction().moveTo(destZone, c); - - if (remember != null) - card.addRemembered(newCard); - //for imprinted since this doesn't use Target - if (params.containsKey("Imprint")) card.addImprinted(newCard); - } - - if (!"Battlefield".equals(destination) && !"Card".equals(type)) { - String picked = af.getHostCard().getName() + " - Computer picked:"; - if (fetched.size() > 0) - GuiUtils.getChoice(picked, fetched.toArray()); - else - GuiUtils.getChoice(picked, new String[]{""}); - } - } - - // *********** Utility functions for Hidden ******************** - /** - *

basicManaFixing.

- * - * @param list a {@link forge.CardList} object. - * @return a {@link forge.Card} object. - */ - private static Card basicManaFixing(CardList list) { // Search for a Basic Land - return basicManaFixing(list, "Plains, Island, Swamp, Mountain, Forest"); - } - - /** - *

basicManaFixing.

- * - * @param list a {@link forge.CardList} object. - * @param type a {@link java.lang.String} object. - * @return a {@link forge.Card} object. - */ - private static Card basicManaFixing(CardList list, String type) { // type = basic land types - CardList combined = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - combined.addAll(AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer())); - - String names[] = type.split(","); - ArrayList basics = new ArrayList(); - - // what types can I go get? - for (int i = 0; i < names.length; i++) { - if (list.getType(names[i]).size() != 0) - basics.add(names[i]); - } - - // Which basic land is least available from hand and play, that I still have in my deck - int minSize = Integer.MAX_VALUE; - String minType = null; - - for (int i = 0; i < basics.size(); i++) { - String b = basics.get(i); - int num = combined.getType(names[i]).size(); - if (num < minSize) { - minType = b; - minSize = num; - } - } - - if (minType != null) - list = list.getType(minType); - - return list.get(0); - } - - /** - *

areAllBasics.

- * - * @param types a {@link java.lang.String} object. - * @return a boolean. - */ - private static boolean areAllBasics(String types) { - String[] split = types.split(","); - String names[] = {"Plains", "Island", "Swamp", "Mountain", "Forest"}; - boolean[] bBasic = new boolean[split.length]; - - for (String s : names) { - for (int i = 0; i < split.length; i++) - bBasic[i] |= s.equals(split[i]); - } - - for (int i = 0; i < split.length; i++) - if (!bBasic[i]) - return false; - - return true; - } - - - // ************************************************************************************* - // **************** Known Origin (Battlefield/Graveyard/Exile) ************************* - // ******* Known origin cards are chosen during casting of the spell (target) ********** - // ************************************************************************************* - - /** - *

changeKnownOriginCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean changeKnownOriginCanPlayAI(AbilityFactory af, SpellAbility sa) { - // Retrieve either this card, or target Cards in Graveyard - Cost abCost = af.getAbCost(); - final Card source = af.getHostCard(); - HashMap params = af.getMapParams(); - - String origin = params.get("Origin"); - String destination = params.get("Destination"); - - float pct = origin.equals("Battlefield") ? .8f : .667f; - - Random r = MyRandom.random; - - if (abCost != null) { - // AI currently disabled for these costs - if (abCost.getSacCost() && !abCost.getSacThis()) { - //only sacrifice something that's supposed to be sacrificed - String type = abCost.getSacType(); - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - typeList = typeList.getValidCards(type.split(","), source.getController(), source); - if (ComputerUtil.getCardPreference(source, "SacCost", typeList) == null) - return false; - } - if (abCost.getLifeCost()) { - if (AllZone.getComputerPlayer().getLife() - abCost.getLifeAmount() < 4) - return false; - } - if (abCost.getDiscardCost()) return false; - - if (abCost.getSubCounter()) { - // A card has a 25% chance per counter to be able to pass through here - // 4+ counters will always pass. 0 counters will never - int currentNum = source.getCounters(abCost.getCounterType()); - double percent = .25 * (currentNum / abCost.getCounterNum()); - if (percent <= r.nextFloat()) - return false; - } - } - - // prevent run-away activations - first time will always return true - boolean chance = r.nextFloat() <= Math.pow(.6667, sa.getRestrictions().getNumberTurnActivations()); - - Target tgt = af.getAbTgt(); - if (tgt != null) { - if (!changeKnownPreferredTarget(af, sa, false)) - return false; - } else { - // non-targeted retrieval - CardList retrieval = knownDetermineDefined(sa, params.get("Defined"), origin); - - if (retrieval == null || retrieval.isEmpty()) - return false; - - //if (origin.equals("Graveyard")) { - // return this card from graveyard: cards like Hammer of Bogardan - // in general this is cool, but we should add some type of restrictions - - // return this card from battlefield: cards like Blinking Spirit - // in general this should only be used to protect from Imminent Harm (dying or losing control of) - if (origin.equals("Battlefield")) { - if (AllZone.getStack().size() == 0) - return false; - - Ability_Sub abSub = sa.getSubAbility(); - String subAPI = ""; - if (abSub != null) - subAPI = abSub.getAbilityFactory().getAPI(); - - //only use blink or bounce effects - if (!(destination.equals("Exile") && (subAPI.equals("DelayedTrigger") || subAPI.equals("ChangeZone"))) - && !destination.equals("Hand")) - return false; - - ArrayList objects = AbilityFactory.predictThreatenedObjects(af); - - for (Card c : retrieval) { - if (objects.contains(c)) - pct = 1; - } - if (pct < 1) - return false; - } - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return ((r.nextFloat() < pct) && chance); - } - - /** - *

changeKnownOriginPlayDrawbackAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean changeKnownOriginPlayDrawbackAI(AbilityFactory af, SpellAbility sa) { - if (sa.getTarget() == null) - return true; - - return changeKnownPreferredTarget(af, sa, false); - } - - /** - *

changeKnownPreferredTarget.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean changeKnownPreferredTarget(AbilityFactory af, SpellAbility sa, boolean mandatory) { - HashMap params = af.getMapParams(); - Card source = sa.getSourceCard(); - String origin = params.get("Origin"); - String destination = params.get("Destination"); - Target tgt = af.getAbTgt(); - - Ability_Sub abSub = sa.getSubAbility(); - String subAPI = ""; - String subAffected = ""; - HashMap subParams = null; - if (abSub != null) { - subAPI = abSub.getAbilityFactory().getAPI(); - subParams = abSub.getAbilityFactory().getMapParams(); - if (subParams.containsKey("Defined")) - subAffected = subParams.get("Defined"); - } - - if (tgt != null) - tgt.resetTargets(); - - CardList list = AllZoneUtil.getCardsInZone(origin); - list = list.getValidCards(tgt.getValidTgts(), AllZone.getComputerPlayer(), source); - - if (list.size() < tgt.getMinTargets(sa.getSourceCard(), sa)) - return false; - - // Narrow down the list: - if (origin.equals("Battlefield")) { - // filter out untargetables - list = list.getTargetableCards(source); - CardList aiPermanents = list.getController(AllZone.getComputerPlayer()); - - // if it's blink or bounce, try to save my about to die stuff - if((destination.equals("Hand") - || (destination.equals("Exile") && (subAPI.equals("DelayedTrigger") - || (subAPI.equals("ChangeZone") && subAffected.equals("Remembered"))))) - && tgt.getMinTargets(sa.getSourceCard(), sa) <= 1) { - - // check stack for something on the stack will kill anything i control - if(AllZone.getStack().size() > 0) { - ArrayList objects = AbilityFactory.predictThreatenedObjects(af); - - CardList threatenedTargets = new CardList(); - - for (Card c : aiPermanents) { - if (objects.contains(c)) - threatenedTargets.add(c); - } - - if (!threatenedTargets.isEmpty()) { - // Choose "best" of the remaining to save - tgt.addTarget(CardFactoryUtil.AI_getBestCreature(threatenedTargets)); - return true; - } - } - // Save combatants - else if (AllZone.getPhase().is(Constant.Phase.Combat_Declare_Blockers_InstantAbility)) { - CardList combatants = aiPermanents.getType("Creature"); - CardListUtil.sortByEvaluateCreature(combatants); - - for (Card c : combatants) - if (c.getShield() == 0 && CombatUtil.combatantWouldBeDestroyed(c)) { - tgt.addTarget(c); - return true; - } - } - } - - } else if (origin.equals("Graveyard")) { - // Retrieve from Graveyard to: - - } - - //blink human targets only during combat - if (origin.equals("Battlefield") && destination.equals("Exile") - && (subAPI.equals("DelayedTrigger") || (subAPI.equals("ChangeZone") && subAffected.equals("Remembered"))) - && !(AllZone.getPhase().is(Constant.Phase.Combat_Declare_Attackers_InstantAbility) || sa.isAbility())) - return false; - - // Exile and bounce opponents stuff - if (destination.equals("Exile") || origin.equals("Battlefield")) - list = list.getController(AllZone.getHumanPlayer()); - - // Only care about combatants during combat - if(AllZone.getPhase().inCombat()) - list.getValidCards("Card.attacking,Card.blocking", null, null); - - if (list.isEmpty()) - return false; - - if (!mandatory && list.size() < tgt.getMinTargets(sa.getSourceCard(), sa)) - return false; - - // target loop - while (tgt.getNumTargeted() < tgt.getMaxTargets(sa.getSourceCard(), sa)) { - // AI Targeting - Card choice = null; - - if (!list.isEmpty()) { - Card mostExpensive = CardFactoryUtil.AI_getMostExpensivePermanent(list, af.getHostCard(), false); - if (destination.equals("Battlefield") || origin.equals("Battlefield")) { - if (mostExpensive.isCreature()) { - //if a creature is most expensive take the best one - if (destination.equals("Exile")) // If Exiling things, don't give bonus to Tokens - choice = CardFactoryUtil.AI_getBestCreature(list); - else - choice = CardFactoryUtil.AI_getBestCreatureToBounce(list); - } else - choice = mostExpensive; - } else { - // TODO: AI needs more improvement to it's retrieval (reuse some code from spReturn here) - list.shuffle(); - choice = list.get(0); - } - } - if (choice == null) { // can't find anything left - if (tgt.getNumTargeted() == 0 || tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) { - if (!mandatory) - tgt.resetTargets(); - return false; - } else { - // TODO is this good enough? for up to amounts? - break; - } - } - - list.remove(choice); - tgt.addTarget(choice); - } - - return true; - } - - /** - *

changeKnownUnpreferredTarget.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean changeKnownUnpreferredTarget(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!mandatory) - return false; - - HashMap params = af.getMapParams(); - Card source = sa.getSourceCard(); - String origin = params.get("Origin"); - String destination = params.get("Destination"); - Target tgt = af.getAbTgt(); - - CardList list = AllZoneUtil.getCardsInZone(origin); - list = list.getValidCards(tgt.getValidTgts(), AllZone.getComputerPlayer(), source); - - - // Narrow down the list: - if (origin.equals("Battlefield")) { - // filter out untargetables - list = list.getTargetableCards(source); - - // if Destination is hand, either bounce opponents dangerous stuff or save my about to die stuff - - // if Destination is exile, filter out my cards - } else if (origin.equals("Graveyard")) { - // Retrieve from Graveyard to: - - } - - for (Card c : tgt.getTargetCards()) - list.remove(c); - - if (list.isEmpty()) - return false; - - // target loop - while (tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) { - // AI Targeting - Card choice = null; - - if (!list.isEmpty()) { - if (CardFactoryUtil.AI_getMostExpensivePermanent(list, af.getHostCard(), false).isCreature() - && (destination.equals("Battlefield") || origin.equals("Battlefield"))) - choice = CardFactoryUtil.AI_getBestCreatureToBounce(list); //if a creature is most expensive take the best - else if (destination.equals("Battlefield") || origin.equals("Battlefield")) - choice = CardFactoryUtil.AI_getMostExpensivePermanent(list, af.getHostCard(), false); - else { - // TODO: AI needs more improvement to it's retrieval (reuse some code from spReturn here) - list.shuffle(); - choice = list.get(0); - } - } - if (choice == null) { // can't find anything left - if (tgt.getNumTargeted() == 0 || tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) { - tgt.resetTargets(); - return false; - } else { - // TODO is this good enough? for up to amounts? - break; - } - } - - list.remove(choice); - tgt.addTarget(choice); - } - - return true; - } - - /** - *

changeKnownOriginTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean changeKnownOriginTriggerAI(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) - return false; - - if (sa.getTarget() == null) // Just in case of Defined cases - ; // do nothing - else if (changeKnownPreferredTarget(af, sa, mandatory)) { - ; // do nothing - } else if (!changeKnownUnpreferredTarget(af, sa, mandatory)) - return false; - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - return subAb.doTrigger(mandatory); - - return true; - } - - - /** - *

changeKnownOriginStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String changeKnownOriginStackDescription(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - - StringBuilder sb = new StringBuilder(); - Card host = af.getHostCard(); - - if (!(sa instanceof Ability_Sub)) - sb.append(host.getName()).append(" -"); - - sb.append(" "); - - String destination = params.get("Destination"); - String origin = params.get("Origin"); - - StringBuilder sbTargets = new StringBuilder(); - - ArrayList tgts; - if (af.getAbTgt() != null) - tgts = af.getAbTgt().getTargetCards(); - else { - // otherwise add self to list and go from there - tgts = new ArrayList(); - for (Card c : knownDetermineDefined(sa, params.get("Defined"), origin)) { - tgts.add(c); - } - } - - for (Card c : tgts) - sbTargets.append(" ").append(c.getName()); - - String targetname = sbTargets.toString(); - - String pronoun = tgts.size() > 1 ? " their " : " its "; - - String fromGraveyard = " from the graveyard"; - - if (destination.equals("Battlefield")) { - sb.append("Put").append(targetname); - if (origin.equals("Graveyard")) - sb.append(fromGraveyard); - - sb.append(" onto the battlefield"); - if (params.containsKey("Tapped")) - sb.append(" tapped"); - if (params.containsKey("GainControl")) - sb.append(" under your control"); - sb.append("."); - } - - if (destination.equals("Hand")) { - sb.append("Return").append(targetname); - if (origin.equals("Graveyard")) - sb.append(fromGraveyard); - sb.append(" to").append(pronoun).append("owners hand."); - } - - if (destination.equals("Library")) { - if (params.containsKey("Shuffle")) { // for things like Gaea's Blessing - sb.append("Shuffle").append(targetname); - - sb.append(" into").append(pronoun).append("owner's library."); - } else { - sb.append("Put").append(targetname); - if (origin.equals("Graveyard")) - sb.append(fromGraveyard); - - // this needs to be zero indexed. Top = 0, Third = 2, -1 = Bottom - int libraryPosition = params.containsKey("LibraryPosition") ? Integer.parseInt(params.get("LibraryPosition")) : 0; - - if (libraryPosition == -1) - sb.append(" on the bottom of").append(pronoun).append("owner's library."); - else if (libraryPosition == 0) - sb.append(" on top of").append(pronoun).append("owner's library."); - else - sb.append(" ").append(libraryPosition + 1).append(" from the top of").append(pronoun).append("owner's library."); - } - } - - if (destination.equals("Exile")) { - sb.append("Exile").append(targetname); - if (origin.equals("Graveyard")) - sb.append(fromGraveyard); - sb.append("."); - } - - if (destination.equals("Graveyard")) { - sb.append("Put").append(targetname); - sb.append(" from ").append(origin); - sb.append(" into").append(pronoun).append("owner's graveyard."); - } - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

changeKnownOriginResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void changeKnownOriginResolve(AbilityFactory af, SpellAbility sa) { - ArrayList tgtCards; - HashMap params = af.getMapParams(); - Target tgt = af.getAbTgt(); - Player player = sa.getActivatingPlayer(); - - String destination = params.get("Destination"); - String origin = params.get("Origin"); - - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else { - tgtCards = new ArrayList(); - for (Card c : knownDetermineDefined(sa, params.get("Defined"), origin)) { - tgtCards.add(c); - } - } - - if (tgtCards.size() != 0) { - for (Card tgtC : tgtCards) { - PlayerZone originZone = AllZone.getZone(tgtC); - // if Target isn't in the expected Zone, continue - if (originZone == null || !originZone.is(origin)) - continue; - - if (tgt != null && origin.equals("Battlefield")) { - // check targeting - if (!CardFactoryUtil.canTarget(sa.getSourceCard(), tgtC)) - continue; - } - - Player pl = player; - if (!destination.equals("Battlefield")) - pl = tgtC.getOwner(); - - if (destination.equals("Library")) { - // library position is zero indexed - int libraryPosition = params.containsKey("LibraryPosition") ? Integer.parseInt(params.get("LibraryPosition")) : 0; - - AllZone.getGameAction().moveToLibrary(tgtC, libraryPosition); - - if (params.containsKey("Shuffle")) // for things like Gaea's Blessing - tgtC.getOwner().shuffle(); - } else { - if (destination.equals("Battlefield")) { - if (params.containsKey("Tapped") || params.containsKey("Ninjutsu")) - tgtC.tap(); - if (params.containsKey("GainControl")) - tgtC.setController(sa.getActivatingPlayer()); - // Auras without Candidates stay in their current location - if (tgtC.isAura()){ - SpellAbility saAura = AbilityFactory_Attach.getAttachSpellAbility(tgtC); - if (!saAura.getTarget().hasCandidates(false)) - continue; - } - - AllZone.getGameAction().moveTo(AllZone.getZone(destination, tgtC.getController()), tgtC); - - if (params.containsKey("Ninjutsu") || params.containsKey("Attacking")) { - AllZone.getCombat().addAttacker(tgtC); - AllZone.getCombat().addUnblockedAttacker(tgtC); - } - } else { - AllZone.getGameAction().moveTo(AllZone.getZone(destination, pl), tgtC); - } - } - } - } - } - - // **************************** Known Utility ************************************** - /** - *

knownDetermineDefined.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param defined a {@link java.lang.String} object. - * @param origin a {@link java.lang.String} object. - * @return a {@link forge.CardList} object. - */ - private static CardList knownDetermineDefined(SpellAbility sa, String defined, String origin) { - // TODO: this function should return a ArrayList and then be handled by the callees - CardList grave = AllZoneUtil.getCardsInZone(origin, sa.getActivatingPlayer()); - CardList ret = new CardList(); - - if (defined != null && defined.equals("Top")) { - // the "top" of the graveyard, is the last to be added to the graveyard list? - if (grave.size() == 0) - return null; - ret.add(grave.get(grave.size() - 1)); - - return ret; - } - - ret.addAll(AbilityFactory.getDefinedCards(sa.getSourceCard(), defined, sa).toArray()); - return ret; - } - - // ************************************************************************************* - // ************************** ChangeZoneAll ******************************************** - // ************ All is non-targeted and should occur similarly to Hidden *************** - // ******* Instead of choosing X of type on resolution, all on type go ***************** - // ************************************************************************************* - /** - *

createAbilityChangeZoneAll.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityChangeZoneAll(final AbilityFactory AF) { - final SpellAbility abChangeZone = new Ability_Activated(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = 3728332812890211671L; - - public boolean canPlayAI() { - return changeZoneAllCanPlayAI(AF, this); - } - - @Override - public void resolve() { - changeZoneAllResolve(AF, this); - } - - @Override - public String getStackDescription() { - return changeZoneAllDescription(AF, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return changeZoneAllCanPlayAI(AF, this); - } - - }; - setMiscellaneous(AF, abChangeZone); - return abChangeZone; - } - - /** - *

createSpellChangeZoneAll.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellChangeZoneAll(final AbilityFactory AF) { - final SpellAbility spChangeZone = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = 3270484211099902059L; - - public boolean canPlayAI() { - return changeZoneAllCanPlayAI(AF, this); - } - - @Override - public void resolve() { - changeZoneAllResolve(AF, this); - } - - @Override - public String getStackDescription() { - return changeZoneAllDescription(AF, this); - } - }; - setMiscellaneous(AF, spChangeZone); - return spChangeZone; - } - - /** - *

createDrawbackChangeZoneAll.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackChangeZoneAll(final AbilityFactory AF) { - final SpellAbility dbChangeZone = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()) { - private static final long serialVersionUID = 3270484211099902059L; - - @Override - public void resolve() { - changeZoneAllResolve(AF, this); - } - - @Override - public boolean chkAI_Drawback() { - return changeZoneAllPlayDrawbackAI(AF, this); - } - - @Override - public String getStackDescription() { - return changeZoneAllDescription(AF, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return changeZoneAllCanPlayAI(AF, this); - } - }; - setMiscellaneous(AF, dbChangeZone); - return dbChangeZone; - } - - - /** - *

changeZoneAllCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean changeZoneAllCanPlayAI(AbilityFactory af, SpellAbility sa) { - // Change Zone All, can be any type moving from one zone to another - Cost abCost = af.getAbCost(); - Card source = af.getHostCard(); - HashMap params = af.getMapParams(); - String destination = params.get("Destination"); - String origin = params.get("Origin"); - - if (abCost != null) { - // AI currently disabled for these costs - if (abCost.getSacCost()) { - // Sac is ok in general, but should add some decision making based off what we Sacrifice and what we might get - } - if (abCost.getLifeCost()) { - if (AllZone.getComputerPlayer().getLife() - abCost.getLifeAmount() < 4) - return false; - } - if (abCost.getDiscardCost()) return false; - - if (abCost.getSubCounter()) - ; // subcounter is fine - - } - - Random r = MyRandom.random; - // prevent run-away activations - first time will always return true - boolean chance = r.nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn()); - - // TODO: targeting with ChangeZoneAll - // really two types of targeting. - // Target Player has all their types change zones - // or target permanent and do something relative to that permanent - // ex. "Return all Auras attached to target" - // ex. "Return all blocking/blocked by target creature" - - CardList humanType = AllZoneUtil.getCardsInZone(origin, AllZone.getHumanPlayer()); - humanType = AbilityFactory.filterListByType(humanType, params.get("ChangeType"), sa); - CardList computerType = AllZoneUtil.getCardsInZone(origin, AllZone.getComputerPlayer()); - computerType = AbilityFactory.filterListByType(computerType, params.get("ChangeType"), sa); - - // TODO: improve restrictions on when the AI would want to use this - // spBounceAll has some AI we can compare to. - if (origin.equals("Hand")) { - - } else if (origin.equals("Library")) { - - } else if (origin.equals("Battlefield")) { - // this statement is assuming the AI is trying to use this spell offensively - // if the AI is using it defensively, then something else needs to occur - // if only creatures are affected evaluate both lists and pass only if human creatures are more valuable - if (humanType.getNotType("Creature").size() == 0 && computerType.getNotType("Creature").size() == 0) { - if (CardFactoryUtil.evaluateCreatureList(computerType) + 200 >= CardFactoryUtil.evaluateCreatureList(humanType)) - return false; - } // otherwise evaluate both lists by CMC and pass only if human permanents are more valuable - else if (CardFactoryUtil.evaluatePermanentList(computerType) + 3 >= CardFactoryUtil.evaluatePermanentList(humanType)) - return false; - - // Don't cast during main1? - if (AllZone.getPhase().is(Constant.Phase.Main1, AllZone.getComputerPlayer())) - return false; - } else if (origin.equals("Graveyard")) { - Target tgt = af.getAbTgt(); - if (tgt != null) { - if (AllZoneUtil.getPlayerGraveyard(AllZone.getHumanPlayer()).isEmpty()) - return false; - tgt.resetTargets(); - tgt.addTarget(AllZone.getHumanPlayer()); - } - } else if (origin.equals("Exile")) { - - } else if (origin.equals("Stack")) { - // time stop can do something like this: - // Origin$ Stack | Destination$ Exile | SubAbility$ DBSkip - // DBSKipToPhase | DB$SkipToPhase | Phase$ Cleanup - // otherwise, this situation doesn't exist - return false; - } else if (origin.equals("Sideboard")) { - // This situation doesn't exist - return false; - } - - if (destination.equals(Constant.Zone.Battlefield)) { - if (params.get("GainControl") != null) { - // Check if the cards are valuable enough - if (humanType.getNotType("Creature").size() == 0 && computerType.getNotType("Creature").size() == 0) { - if (CardFactoryUtil.evaluateCreatureList(computerType) + CardFactoryUtil.evaluateCreatureList(humanType) < 400) - return false; - } // otherwise evaluate both lists by CMC and pass only if human permanents are less valuable - else if (CardFactoryUtil.evaluatePermanentList(computerType) + CardFactoryUtil.evaluatePermanentList(humanType) < 6) - return false; - } else { - // don't activate if human gets more back than AI does - if (humanType.getNotType("Creature").size() == 0 && computerType.getNotType("Creature").size() == 0) { - if (CardFactoryUtil.evaluateCreatureList(computerType) <= CardFactoryUtil.evaluateCreatureList(humanType) + 100) - return false; - } // otherwise evaluate both lists by CMC and pass only if human permanents are less valuable - else if (CardFactoryUtil.evaluatePermanentList(computerType) <= CardFactoryUtil.evaluatePermanentList(humanType) + 2) - return false; - } - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return ((r.nextFloat() < .8 || sa.isTrigger()) && chance); - } - - /** - *

changeZoneAllPlayDrawbackAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean changeZoneAllPlayDrawbackAI(AbilityFactory af, SpellAbility sa) { - // if putting cards from hand to library and parent is drawing cards - // make sure this will actually do something: - - - return true; - } - - /** - *

changeZoneAllDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String changeZoneAllDescription(AbilityFactory af, SpellAbility sa) { - // TODO: build Stack Description will need expansion as more cards are added - StringBuilder sb = new StringBuilder(); - Card host = af.getHostCard(); - - if (!(sa instanceof Ability_Sub)) - sb.append(host.getName()).append(" -"); - - sb.append(" "); - - String[] desc = sa.getDescription().split(":"); - - if (desc.length > 1) - sb.append(desc[1]); - else - sb.append(desc[0]); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

changeZoneAllResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void changeZoneAllResolve(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - String destination = params.get("Destination"); - String origin = params.get("Origin"); - - CardList cards = null; - - ArrayList tgtPlayers = null; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else if (params.containsKey("Defined")) // Make sure Defined exists to use it - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - if (tgtPlayers == null || tgtPlayers.isEmpty()) - cards = AllZoneUtil.getCardsInZone(origin); - else - cards = AllZoneUtil.getCardsInZone(origin, tgtPlayers.get(0)); - - cards = AbilityFactory.filterListByType(cards, params.get("ChangeType"), sa); - - if (params.containsKey("ForgetOtherRemembered")) - sa.getSourceCard().clearRemembered(); - - String remember = params.get("RememberChanged"); - - // I don't know if library position is necessary. It's here if it is, just in case - int libraryPos = params.containsKey("LibraryPosition") ? Integer.parseInt(params.get("LibraryPosition")) : 0; - for (Card c : cards) { - if (destination.equals("Battlefield")){ - // Auras without Candidates stay in their current location - if (c.isAura()){ - SpellAbility saAura = AbilityFactory_Attach.getAttachSpellAbility(c); - if (!saAura.getTarget().hasCandidates(false)) - continue; - } - - - if (params.containsKey("Tapped")) - c.tap(); - } - - if (params.containsKey("GainControl")) { - c.setController(sa.getActivatingPlayer()); - AllZone.getGameAction().moveToPlay(c, sa.getActivatingPlayer()); - } else - AllZone.getGameAction().moveTo(destination, c, libraryPos); - - if (remember != null) - sa.getSourceCard().addRemembered(c); - } - - // if Shuffle parameter exists, and any amount of cards were owned by that player, then shuffle that library - if (params.containsKey("Shuffle")) { - if (cards.getOwner(AllZone.getHumanPlayer()).size() > 0) - AllZone.getHumanPlayer().shuffle(); - if (cards.getOwner(AllZone.getComputerPlayer()).size() > 0) - AllZone.getComputerPlayer().shuffle(); - } - } - - -} diff --git a/src/forge/card/abilityFactory/AbilityFactory_Choose.java b/src/forge/card/abilityFactory/AbilityFactory_Choose.java deleted file mode 100644 index 03234492d05..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_Choose.java +++ /dev/null @@ -1,490 +0,0 @@ -package forge.card.abilityFactory; - -import forge.*; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.*; -import forge.gui.GuiUtils; - -import javax.swing.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; - -/** - *

AbilityFactory_Choose class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_Choose { - // ************************************************************************* - // ************************* ChooseType ************************************ - // ************************************************************************* - - /** - *

createAbilityChooseType.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityChooseType(final AbilityFactory af) { - - final SpellAbility abChooseType = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -7734286034988741837L; - - @Override - public String getStackDescription() { - return chooseTypeStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return chooseTypeCanPlayAI(af, this); - } - - @Override - public void resolve() { - chooseTypeResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return chooseTypeTriggerAI(af, this, mandatory); - } - - }; - return abChooseType; - } - - /** - *

createSpellChooseType.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellChooseType(final AbilityFactory af) { - final SpellAbility spChooseType = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 3395765985146644736L; - - @Override - public String getStackDescription() { - return chooseTypeStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return chooseTypeCanPlayAI(af, this); - } - - @Override - public void resolve() { - chooseTypeResolve(af, this); - } - - }; - return spChooseType; - } - - /** - *

createDrawbackChooseType.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackChooseType(final AbilityFactory af) { - final SpellAbility dbChooseType = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = 5555184803257696143L; - - @Override - public String getStackDescription() { - return chooseTypeStackDescription(af, this); - } - - @Override - public void resolve() { - chooseTypeResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return chooseTypeTriggerAI(af, this, mandatory); - } - - }; - return dbChooseType; - } - - /** - *

chooseTypeStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String chooseTypeStackDescription(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - StringBuilder sb = new StringBuilder(); - - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard()).append(" - "); - else - sb.append(" "); - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - for (Player p : tgtPlayers) { - sb.append(p).append(" "); - } - sb.append("chooses a type."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

chooseTypeCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean chooseTypeCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - return chooseTypeTriggerAI(af, sa, false); - } - - /** - *

chooseTypeTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean chooseTypeTriggerAI(final AbilityFactory af, final SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) - return false; - - Target tgt = sa.getTarget(); - - if (sa.getTarget() != null) { - tgt.resetTargets(); - sa.getTarget().addTarget(AllZone.getComputerPlayer()); - } else { - ArrayList tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), af.getMapParams().get("Defined"), sa); - for (Player p : tgtPlayers) - if (p.isHuman() && !mandatory) - return false; - } - return true; - } - - /** - *

chooseTypeResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void chooseTypeResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - Card card = af.getHostCard(); - String type = params.get("Type"); - ArrayList invalidTypes = new ArrayList(); - if (params.containsKey("InvalidTypes")) { - invalidTypes.addAll(Arrays.asList(params.get("InvalidTypes").split(","))); - } - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - for (Player p : tgtPlayers) { - if (tgt == null || p.canTarget(sa)) { - - if (type.equals("Card")) { - boolean valid = false; - while (!valid) { - if (sa.getActivatingPlayer().isHuman()) { - Object o = GuiUtils.getChoice("Choose a card type", CardUtil.getCardTypes().toArray()); - if (null == o) return; - String choice = (String) o; - if (CardUtil.isACardType(choice) && !invalidTypes.contains(choice)) { - valid = true; - card.setChosenType(choice); - } - } else { - //TODO - //computer will need to choose a type - //based on whether it needs a creature or land, otherwise, lib search for most common type left - //then, reveal chosenType to Human - } - } - } else if (type.equals("Creature")) { - String chosenType = ""; - boolean valid = false; - while (!valid) { - if (sa.getActivatingPlayer().isHuman()) { - chosenType = JOptionPane.showInputDialog(null, "Choose a creature type:", card.getName(), - JOptionPane.QUESTION_MESSAGE); - } else { - String chosen = ""; - if (params.containsKey("AILogic")) { - String logic = params.get("AILogic"); - if(logic.equals("MostProminentOnBattlefield")) - chosen = CardFactoryUtil.getMostProminentCreatureType(AllZoneUtil.getCardsInPlay()); - if(logic.equals("MostProminentComputerControls")) - chosen = CardFactoryUtil.getMostProminentCreatureType( - AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer())); - if(logic.equals("MostProminentHumanControls")) - chosen = CardFactoryUtil.getMostProminentCreatureType( - AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer())); - if(logic.equals("MostProminentInComputerDeck")) - chosen = CardFactoryUtil.getMostProminentCreatureType( - AllZoneUtil.getCardsInGame().getController(AllZone.getComputerPlayer())); - } - if (!CardUtil.isACreatureType(chosen) || invalidTypes.contains(chosen)) - chosen = "Sliver"; - GuiUtils.getChoice("Computer picked: ", chosen); - chosenType = chosen; - } - if (CardUtil.isACreatureType(chosenType) && !invalidTypes.contains(chosenType)) { - valid = true; - card.setChosenType(chosenType); - } - } - } - } - } - } - - // ************************************************************************* - // ************************* ChooseColor *********************************** - // ************************************************************************* - - /** - *

createAbilityChooseColor.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public static SpellAbility createAbilityChooseColor(final AbilityFactory af) { - - final SpellAbility abChooseColor = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 7069068165774633355L; - - @Override - public String getStackDescription() { - return chooseColorStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return chooseColorCanPlayAI(af, this); - } - - @Override - public void resolve() { - chooseColorResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return chooseColorTriggerAI(af, this, mandatory); - } - - }; - return abChooseColor; - } - - /** - *

createSpellChooseColor.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public static SpellAbility createSpellChooseColor(final AbilityFactory af) { - final SpellAbility spChooseColor = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -5627273779759130247L; - - @Override - public String getStackDescription() { - return chooseColorStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return chooseColorCanPlayAI(af, this); - } - - @Override - public void resolve() { - chooseColorResolve(af, this); - } - - }; - return spChooseColor; - } - - /** - *

createDrawbackChooseColor.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public static SpellAbility createDrawbackChooseColor(final AbilityFactory af) { - final SpellAbility dbChooseColor = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = 6969618586164278998L; - - @Override - public String getStackDescription() { - return chooseColorStackDescription(af, this); - } - - @Override - public void resolve() { - chooseColorResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return chooseColorTriggerAI(af, this, mandatory); - } - - }; - return dbChooseColor; - } - - /** - *

chooseColorStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String chooseColorStackDescription(AbilityFactory af, SpellAbility sa) { - StringBuilder sb = new StringBuilder(); - - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard()).append(" - "); - else - sb.append(" "); - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), af.getMapParams().get("Defined"), sa); - - for (Player p : tgtPlayers) { - sb.append(p).append(" "); - } - sb.append("chooses a color."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

chooseColorCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean chooseColorCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - return chooseColorTriggerAI(af, sa, false); - } - - /** - *

chooseColorTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean chooseColorTriggerAI(final AbilityFactory af, final SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) - return false; - - Target tgt = sa.getTarget(); - - if (sa.getTarget() != null) { - tgt.resetTargets(); - sa.getTarget().addTarget(AllZone.getComputerPlayer()); - } else { - ArrayList tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), af.getMapParams().get("Defined"), sa); - for (Player p : tgtPlayers) - if (p.isHuman() && !mandatory) - return false; - } - return true; - } - - /** - *

chooseColorResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void chooseColorResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - Card card = af.getHostCard(); - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - for (Player p : tgtPlayers) { - if (tgt == null || p.canTarget(sa)) { - if (sa.getActivatingPlayer().isHuman()) { - Object o = GuiUtils.getChoice("Choose a color", Constant.Color.onlyColors); - if (null == o) return; - String choice = (String) o; - card.setChosenColor(choice); - } else { - //TODO - needs improvement - card.setChosenColor(Constant.Color.Black); - JOptionPane.showMessageDialog(null, "Computer chooses "+Constant.Color.Black, ""+card, JOptionPane.PLAIN_MESSAGE); - } - } - } - } - -}//end class AbilityFactory_Choose diff --git a/src/forge/card/abilityFactory/AbilityFactory_Clash.java b/src/forge/card/abilityFactory/AbilityFactory_Clash.java deleted file mode 100644 index f974b62eb01..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_Clash.java +++ /dev/null @@ -1,383 +0,0 @@ -package forge.card.abilityFactory; - -import forge.AllZone; -import forge.Card; -import forge.GameActionUtil; -import forge.Player; -import forge.card.spellability.Ability_Activated; -import forge.card.spellability.Ability_Sub; -import forge.card.spellability.Spell; -import forge.card.spellability.SpellAbility; - -import java.util.ArrayList; -import java.util.HashMap; - -/** - *

AbilityFactory_Clash class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_Clash { - - /** - *

getAbilityClash.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public static SpellAbility getAbilityClash(final AbilityFactory AF) { - final SpellAbility abClash = new Ability_Activated(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = -8019637116128196248L; - - @Override - public boolean canPlayAI() { - return true; - } - - @Override - public boolean canPlay() { - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return true; - } - - @Override - public String getStackDescription() { - return AF.getHostCard().getName() + " - Clash with an opponent."; - } - - @Override - public void resolve() { - clashResolve(AF, this); - } - }; - - return abClash; - } - - /** - *

getSpellClash.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public static SpellAbility getSpellClash(final AbilityFactory AF) { - final SpellAbility spClash = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = -4991665176268317172L; - - @Override - public boolean canPlayAI() { - return true; - } - - @Override - public boolean canPlay() { - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return true; - } - - @Override - public String getStackDescription() { - return AF.getHostCard().getName() + " - Clash with an opponent."; - } - - @Override - public void resolve() { - clashResolve(AF, this); - } - }; - - return spClash; - } - - /** - *

getDrawbackClash.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public static SpellAbility getDrawbackClash(final AbilityFactory AF) { - final SpellAbility dbClash = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()) { - private static final long serialVersionUID = -3850086157052881360L; - - @Override - public boolean canPlayAI() { - return true; - } - - @Override - public boolean canPlay() { - return true; - } - - @Override - public boolean chkAI_Drawback() { - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return true; - } - - @Override - public String getStackDescription() { - return AF.getHostCard().getName() + " - Clash with an opponent."; - } - - @Override - public void resolve() { - clashResolve(AF, this); - } - }; - - return dbClash; - } - - /** - *

clashResolve.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param SA a {@link forge.card.spellability.SpellAbility} object. - */ - private static void clashResolve(final AbilityFactory AF, final SpellAbility SA) { - AbilityFactory AF_Outcomes = new AbilityFactory(); - boolean victory = AF.getHostCard().getController().clashWithOpponent(AF.getHostCard()); - - //Run triggers - HashMap runParams = new HashMap(); - runParams.put("Player", AF.getHostCard().getController()); - - if (victory) { - if (AF.getMapParams().containsKey("WinSubAbility")) { - SpellAbility win = AF_Outcomes.getAbility(AF.getHostCard().getSVar(AF.getMapParams().get("WinSubAbility")), AF.getHostCard()); - win.setActivatingPlayer(AF.getHostCard().getController()); - ((Ability_Sub) win).setParent(SA); - - AbilityFactory.resolve(win, false); - } - runParams.put("Won", "True"); - } else { - if (AF.getMapParams().containsKey("OtherwiseSubAbility")) { - SpellAbility otherwise = AF_Outcomes.getAbility(AF.getHostCard().getSVar(AF.getMapParams().get("OtherwiseSubAbility")), AF.getHostCard()); - otherwise.setActivatingPlayer(AF.getHostCard().getController()); - ((Ability_Sub) otherwise).setParent(SA); - - AbilityFactory.resolve(otherwise, false); - } - runParams.put("Won", "False"); - } - - AllZone.getTriggerHandler().runTrigger("Clashed", runParams); - } - - // ************************************************************************* - // ************************* FlipACoin ************************************* - // ************************************************************************* - - /** - *

createAbilityFlip.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public static SpellAbility createAbilityFlip(final AbilityFactory af) { - final SpellAbility abFlip = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -8293336773930687488L; - - @Override - public boolean canPlayAI() { - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return true; - } - - @Override - public String getStackDescription() { - return flipGetStackDescription(af, this); - } - - @Override - public void resolve() { - flipResolve(af, this); - } - }; - - return abFlip; - } - - /** - *

createSpellFlip.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public static SpellAbility createSpellFlip(final AbilityFactory af) { - final SpellAbility spFlip = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -4402144245527547151L; - - @Override - public boolean canPlayAI() { - return true; - } - - @Override - public boolean canPlay() { - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return true; - } - - @Override - public String getStackDescription() { - return flipGetStackDescription(af, this); - } - - @Override - public void resolve() { - flipResolve(af, this); - } - }; - - return spFlip; - } - - /** - *

createDrawbackFlip.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public static SpellAbility createDrawbackFlip(final AbilityFactory af) { - final SpellAbility dbFlip = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = 8581978154811461324L; - - @Override - public boolean canPlayAI() { - return true; - } - - @Override - public boolean canPlay() { - return true; - } - - @Override - public boolean chkAI_Drawback() { - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return true; - } - - @Override - public String getStackDescription() { - return flipGetStackDescription(af, this); - } - - @Override - public void resolve() { - flipResolve(af, this); - } - }; - - return dbFlip; - } - - /** - *

flipGetStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String flipGetStackDescription(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - Card host = af.getHostCard(); - Player player = params.containsKey("OpponentCalls") ? host.getController().getOpponent() : host.getController(); - - StringBuilder sb = new StringBuilder(); - - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard()).append(" - "); - else - sb.append(" "); - - sb.append(player).append(" flips a coin."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

flipResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void flipResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - Card host = af.getHostCard(); - Player player = host.getController(); - - ArrayList caller = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Caller"), sa); - if(caller.size() == 0) caller.add(player); - - AbilityFactory AF_Outcomes = new AbilityFactory(); - boolean victory = GameActionUtil.flipACoin(caller.get(0), sa.getSourceCard()); - - //Run triggers - //HashMap runParams = new HashMap(); - //runParams.put("Player", player); - - if (victory) { - if (params.containsKey("WinSubAbility")) { - SpellAbility win = AF_Outcomes.getAbility(host.getSVar(params.get("WinSubAbility")), host); - win.setActivatingPlayer(player); - ((Ability_Sub) win).setParent(sa); - - AbilityFactory.resolve(win, false); - } - //runParams.put("Won","True"); - } - else { - if(params.containsKey("LoseSubAbility")) { - SpellAbility lose = AF_Outcomes.getAbility(host.getSVar(params.get("LoseSubAbility")), host); - lose.setActivatingPlayer(player); - ((Ability_Sub)lose).setParent(sa); - - AbilityFactory.resolve(lose, false); - } - //runParams.put("Won","False"); - } - - //AllZone.getTriggerHandler().runTrigger("FlipsACoin",runParams); - } - -}//end class AbilityFactory_Clash diff --git a/src/forge/card/abilityFactory/AbilityFactory_Cleanup.java b/src/forge/card/abilityFactory/AbilityFactory_Cleanup.java deleted file mode 100644 index ac75cd823d1..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_Cleanup.java +++ /dev/null @@ -1,60 +0,0 @@ -package forge.card.abilityFactory; - -import forge.card.spellability.Ability_Sub; -import forge.card.spellability.SpellAbility; - -import java.util.HashMap; - -// Cleanup is not the same as other AFs, it is only used as a Drawback, and only used to Cleanup particular card states -// That need to be reset. I'm creating this to clear Remembered Cards at the end of an Effect so they don't get shown on a card -// After the effect finishes resolving. -/** - *

AbilityFactory_Cleanup class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_Cleanup { - - /** - *

getDrawback.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.Ability_Sub} object. - */ - public static Ability_Sub getDrawback(final AbilityFactory AF) { - final Ability_Sub drawback = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()) { - private static final long serialVersionUID = 6192972525033429820L; - - @Override - public boolean chkAI_Drawback() { - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return true; - } - - @Override - public void resolve() { - doResolve(AF, this); - } - }; - - return drawback; - } - - /** - *

doResolve.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void doResolve(AbilityFactory AF, SpellAbility sa) { - HashMap params = AF.getMapParams(); - - if (params.containsKey("ClearRemembered")) - sa.getSourceCard().clearRemembered(); - } -} diff --git a/src/forge/card/abilityFactory/AbilityFactory_Combat.java b/src/forge/card/abilityFactory/AbilityFactory_Combat.java deleted file mode 100644 index 3bcf2b68bdd..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_Combat.java +++ /dev/null @@ -1,445 +0,0 @@ -package forge.card.abilityFactory; - -import java.util.ArrayList; -import java.util.HashMap; - -import forge.AllZone; -import forge.Card; -import forge.CombatUtil; -import forge.ComputerUtil; -import forge.Constant; -import forge.Player; -import forge.card.spellability.Ability_Activated; -import forge.card.spellability.Ability_Sub; -import forge.card.spellability.Spell; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.Target; - -/** - *

AbilityFactory_Combat class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_Combat { - //************************************************************** - // ****************************** FOG ************************** - //************************************************************** - - /** - *

createAbilityFog.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityFog(final AbilityFactory AF) { - final SpellAbility abFog = new Ability_Activated(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = -1933592438783630254L; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - return fogStackDescription(af, this); - } - - public boolean canPlayAI() { - return fogCanPlayAI(af, this); - } - - @Override - public void resolve() { - fogResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return fogDoTriggerAI(af, this, mandatory); - } - - }; - return abFog; - } - - /** - *

createSpellFog.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellFog(final AbilityFactory AF) { - final SpellAbility spFog = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = -5141246507533353605L; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - return fogStackDescription(af, this); - } - - public boolean canPlayAI() { - return fogCanPlayAI(af, this); - } - - @Override - public void resolve() { - fogResolve(af, this); - } - - }; - return spFog; - } - - /** - *

createDrawbackFog.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackFog(final AbilityFactory AF) { - final SpellAbility dbFog = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()) { - private static final long serialVersionUID = -5141246507533353605L; - - final AbilityFactory af = AF; - - @Override - public void resolve() { - fogResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return fogPlayDrawbackAI(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return fogDoTriggerAI(af, this, mandatory); - } - - }; - return dbFog; - } - - /** - *

fogStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - public static String fogStackDescription(AbilityFactory af, SpellAbility sa) { - StringBuilder sb = new StringBuilder(); - - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard().getName()).append(" - "); - else - sb.append(" "); - - sb.append(sa.getSourceCard().getController()); - sb.append(" prevents all combat damage this turn."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

fogCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - public static boolean fogCanPlayAI(final AbilityFactory af, SpellAbility sa) { - // AI should only activate this during Human's Declare Blockers phase - if (AllZone.getPhase().isPlayerTurn(sa.getActivatingPlayer())) return false; - if (!AllZone.getPhase().is(Constant.Phase.Combat_Declare_Blockers_InstantAbility)) return false; - - // Only cast when Stack is empty, so Human uses spells/abilities first - if (AllZone.getStack().size() != 0) return false; - - // Don't cast it, if the effect is already in place - if (AllZone.getGameInfo().isPreventCombatDamageThisTurn()) return false; - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - if (!subAb.chkAI_Drawback()) return false; - - // Cast it if life is in danger - return CombatUtil.lifeInDanger(AllZone.getCombat()); - } - - /** - *

fogPlayDrawbackAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - public static boolean fogPlayDrawbackAI(final AbilityFactory af, SpellAbility sa) { - // AI should only activate this during Human's turn - boolean chance; - if (AllZone.getPhase().isPlayerTurn(sa.getActivatingPlayer().getOpponent())) - chance = AllZone.getPhase().isBefore(Constant.Phase.Combat_FirstStrikeDamage); - else - chance = AllZone.getPhase().isAfter(Constant.Phase.Combat_Damage); - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return chance; - } - - /** - *

fogDoTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - public static boolean fogDoTriggerAI(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa) && !mandatory) // If there is a cost payment it's usually not mandatory - return false; - - boolean chance; - if (AllZone.getPhase().isPlayerTurn(sa.getActivatingPlayer().getOpponent())) - chance = AllZone.getPhase().isBefore(Constant.Phase.Combat_FirstStrikeDamage); - else - chance = AllZone.getPhase().isAfter(Constant.Phase.Combat_Damage); - - // check SubAbilities DoTrigger? - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - return chance && abSub.doTrigger(mandatory); - } - - return chance; - } - - /** - *

fogResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public static void fogResolve(final AbilityFactory af, final SpellAbility sa) { - - // Expand Fog keyword here depending on what we need out of it. - AllZone.getGameInfo().setPreventCombatDamageThisTurn(true); - } - - //************************************************************** - //*********************** MUSTATTACK *************************** - //************************************************************** - - //AB$ MustAttack | Cost$ R T | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Defender$ Self | SpellDescription$ ... - - /** - *

createAbilityMustAttack

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - * - * @since 1.1.01 - */ - public static SpellAbility createAbilityMustAttack(final AbilityFactory af) { - final SpellAbility abMustAttack = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 4559154732470225755L; - - @Override - public String getStackDescription() { - return mustAttackStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return mustAttackCanPlayAI(af, this); - } - - @Override - public void resolve() { - mustAttackResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return mustAttackDoTriggerAI(af, this, mandatory); - } - - }; - return abMustAttack; - } - - /** - *

createSpellMustAttack.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellMustAttack(final AbilityFactory af) { - final SpellAbility spMustAttack = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 4103945257601008403L; - - @Override - public String getStackDescription() { - return mustAttackStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return mustAttackCanPlayAI(af, this); - } - - @Override - public void resolve() { - mustAttackResolve(af, this); - } - - }; - return spMustAttack; - } - - /** - *

createDrawbackMustAttack.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackMustAttack(final AbilityFactory af) { - final SpellAbility dbMustAttack = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = 1294949210616598158L; - - @Override - public void resolve() { - mustAttackResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return mustAttackPlayDrawbackAI(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return mustAttackDoTriggerAI(af, this, mandatory); - } - - }; - return dbMustAttack; - } - - private static String mustAttackStackDescription(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - Card host = af.getHostCard(); - StringBuilder sb = new StringBuilder(); - - if(sa instanceof Ability_Sub) - sb.append(" "); - else - sb.append(sa.getSourceCard()).append(" - "); - - //end standard pre- - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - String defender = null; - if(params.get("Defender").equals("Self")) { - defender = host.toString(); - } - else { - //TODO - if more needs arise in the future - } - - for(Player player : tgtPlayers) { - sb.append("Creatures ").append(player).append(" controls attack ").append(defender).append(" during his or her next turn."); - } - - //begin standard post- - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - private static boolean mustAttackCanPlayAI(final AbilityFactory af, SpellAbility sa) { - //disabled for the AI for now. Only for Gideon Jura at this time. - return false; - } - - private static boolean mustAttackPlayDrawbackAI(final AbilityFactory af, SpellAbility sa) { - // AI should only activate this during Human's turn - boolean chance; - - //TODO - implement AI - chance = false; - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return chance; - } - - private static boolean mustAttackDoTriggerAI(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa) && !mandatory) // If there is a cost payment it's usually not mandatory - return false; - - boolean chance; - - //TODO - implement AI - chance = false; - - // check SubAbilities DoTrigger? - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - return chance && abSub.doTrigger(mandatory); - } - - return chance; - } - - private static void mustAttackResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null && !params.containsKey("Defined")) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - for (final Player p : tgtPlayers) { - if (tgt == null || p.canTarget(sa)) { - Object entity; - if(params.get("Defender").equals("Self")) { - entity = af.getHostCard(); - } - else { - entity = p.getOpponent(); - } - System.out.println("Setting mustAttackEntity to: "+entity); - p.setMustAttackEntity(entity); - } - } - - }//mustAttackResolve() - -}//end class AbilityFactory_Combat diff --git a/src/forge/card/abilityFactory/AbilityFactory_Copy.java b/src/forge/card/abilityFactory/AbilityFactory_Copy.java deleted file mode 100644 index 9f5accea2fa..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_Copy.java +++ /dev/null @@ -1,604 +0,0 @@ -package forge.card.abilityFactory; - -import forge.*; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.*; -import forge.card.trigger.Trigger; -import forge.gui.GuiUtils; - -import java.util.*; - -/** - *

AbilityFactory_Copy class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_Copy { - - // ************************************************************************* - // ************************* CopyPermanent ********************************* - // ************************************************************************* - - /** - *

createAbilityCopyPermanent.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityCopyPermanent(final AbilityFactory af) { - - final SpellAbility abCopyPermanent = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 4557071554433108024L; - - @Override - public String getStackDescription() { - return copyPermanentStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return copyPermanentCanPlayAI(af, this); - } - - @Override - public void resolve() { - copyPermanentResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return copyPermanentTriggerAI(af, this, mandatory); - } - - }; - return abCopyPermanent; - } - - /** - *

createSpellCopyPermanent.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellCopyPermanent(final AbilityFactory af) { - final SpellAbility spCopyPermanent = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 3313370358993251728L; - - @Override - public String getStackDescription() { - return copyPermanentStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return copyPermanentCanPlayAI(af, this); - } - - @Override - public void resolve() { - copyPermanentResolve(af, this); - } - - }; - return spCopyPermanent; - } - - /** - *

createDrawbackCopyPermanent.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackCopyPermanent(final AbilityFactory af) { - final SpellAbility dbCopyPermanent = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = -7725564505830285184L; - - @Override - public String getStackDescription() { - return copyPermanentStackDescription(af, this); - } - - @Override - public void resolve() { - copyPermanentResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return copyPermanentTriggerAI(af, this, mandatory); - } - - }; - return dbCopyPermanent; - } - - /** - *

copyPermanentStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String copyPermanentStackDescription(AbilityFactory af, SpellAbility sa) { - StringBuilder sb = new StringBuilder(); - HashMap params = af.getMapParams(); - - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard()).append(" - "); - else - sb.append(" "); - - ArrayList tgtCards; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else - tgtCards = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa); - - sb.append("Copy "); - Iterator it = tgtCards.iterator(); - while (it.hasNext()) { - sb.append(it.next()); - if (it.hasNext()) sb.append(", "); - } - sb.append("."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

copyPermanentCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean copyPermanentCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - Card source = sa.getSourceCard(); - //TODO - I'm sure someone can do this AI better - - HashMap params = af.getMapParams(); - if (params.containsKey("AtEOT") && !AllZone.getPhase().is(Constant.Phase.Main1)) { - return false; - } else { - double chance = .4; // 40 percent chance with instant speed stuff - if (AbilityFactory.isSorcerySpeed(sa)) - chance = .667; // 66.7% chance for sorcery speed (since it will never activate EOT) - Random r = MyRandom.random; - if (r.nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1)) - return copyPermanentTriggerAI(af, sa, false); - else return false; - } - } - - /** - *

copyPermanentTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean copyPermanentTriggerAI(final AbilityFactory af, final SpellAbility sa, boolean mandatory) { - //HashMap params = af.getMapParams(); - Card source = sa.getSourceCard(); - - if (!ComputerUtil.canPayCost(sa) && !mandatory) - return false; - - ////// - // Targeting - - Target abTgt = sa.getTarget(); - - if (abTgt != null) { - CardList list = AllZoneUtil.getCardsInPlay(); - list = list.getValidCards(abTgt.getValidTgts(), source.getController(), source); - abTgt.resetTargets(); - // target loop - while (abTgt.getNumTargeted() < abTgt.getMaxTargets(sa.getSourceCard(), sa)) { - if (list.size() == 0) { - if (abTgt.getNumTargeted() < abTgt.getMinTargets(sa.getSourceCard(), sa) || abTgt.getNumTargeted() == 0) { - abTgt.resetTargets(); - return false; - } else { - // TODO is this good enough? for up to amounts? - break; - } - } - - Card choice; - if (list.filter(AllZoneUtil.creatures).size() > 0) { - choice = CardFactoryUtil.AI_getBestCreature(list); - } else { - choice = CardFactoryUtil.AI_getMostExpensivePermanent(list, source, true); - } - - if (choice == null) { // can't find anything left - if (abTgt.getNumTargeted() < abTgt.getMinTargets(sa.getSourceCard(), sa) || abTgt.getNumTargeted() == 0) { - abTgt.resetTargets(); - return false; - } else { - // TODO is this good enough? for up to amounts? - break; - } - } - list.remove(choice); - abTgt.addTarget(choice); - } - } else { - //if no targeting, it should always be ok - } - - //end Targeting - - if (af.hasSubAbility()) { - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - return abSub.chkAI_Drawback(); - } - } - return true; - } - - /** - *

copyPermanentResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void copyPermanentResolve(final AbilityFactory af, final SpellAbility sa) { - final HashMap params = af.getMapParams(); - Card hostCard = af.getHostCard(); - ArrayList keywords = new ArrayList(); - if (params.containsKey("Keywords")) { - keywords.addAll(Arrays.asList(params.get("Keywords").split(" & "))); - } - int numCopies = params.containsKey("NumCopies") ? AbilityFactory.calculateAmount(hostCard, params.get("NumCopies"), sa) : 1; - - ArrayList tgtCards; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else - tgtCards = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa); - - hostCard.clearClones(); - - for (Card c : tgtCards) { - if (tgt == null || CardFactoryUtil.canTarget(hostCard, c)) { - - //start copied Kiki code - int multiplier = AllZoneUtil.getDoublingSeasonMagnitude(hostCard.getController()); - multiplier *= numCopies; - Card[] crds = new Card[multiplier]; - - for (int i = 0; i < multiplier; i++) { - //TODO: Use central copy methods - Card copy; - if (!c.isToken()) { - //copy creature and put it onto the battlefield - copy = AllZone.getCardFactory().getCard(c.getName(), sa.getActivatingPlayer()); - - //when copying something stolen: - copy.setController(sa.getActivatingPlayer()); - - copy.setToken(true); - copy.setCopiedToken(true); - } else { //isToken() - copy = CardFactoryUtil.copyStats(c); - - copy.setName(c.getName()); - copy.setImageName(c.getImageName()); - - copy.setOwner(sa.getActivatingPlayer()); - copy.setController(sa.getActivatingPlayer()); - - copy.setManaCost(c.getManaCost()); - copy.setColor(c.getColor()); - copy.setToken(true); - - copy.setType(c.getType()); - - copy.setBaseAttack(c.getBaseAttack()); - copy.setBaseDefense(c.getBaseDefense()); - } - - //add keywords from params - for (String kw : keywords) { - copy.addIntrinsicKeyword(kw); - } - - //Slight hack in case we copy a creature with triggers. - for (Trigger t : copy.getTriggers()) { - AllZone.getTriggerHandler().registerTrigger(t); - } - - copy.setCurSetCode(c.getCurSetCode()); - copy.setImageFilename(c.getImageFilename()); - - if (c.isFaceDown()) { - copy.setIsFaceDown(true); - copy.setManaCost(""); - copy.setBaseAttack(2); - copy.setBaseDefense(2); - copy.setIntrinsicKeyword(new ArrayList()); //remove all keywords - copy.setType(new ArrayList()); //remove all types - copy.addType("Creature"); - copy.clearSpellAbility(); //disallow "morph_up" - copy.setCurSetCode(""); - copy.setImageFilename("morph.jpg"); - } - copy = AllZone.getGameAction().moveToPlay(copy); - - copy.setCloneOrigin(hostCard); - sa.getSourceCard().addClone(copy); - crds[i] = copy; - } - - //have to do this since getTargetCard() might change - //if Kiki-Jiki somehow gets untapped again - final Card[] target = new Card[multiplier]; - for (int i = 0; i < multiplier; i++) { - final int index = i; - target[index] = crds[index]; - - final SpellAbility sac = new Ability(target[index], "0") { - @Override - public void resolve() { - //technically your opponent could steal the token - //and the token shouldn't be sacrificed - if (AllZoneUtil.isCardInPlay(target[index])) { - if (params.get("AtEOT").equals("Sacrifice")) { - AllZone.getGameAction().sacrifice(target[index]); //maybe do a setSacrificeAtEOT, but probably not. - } else if (params.get("AtEOT").equals("Exile")) { - AllZone.getGameAction().exile(target[index]); - } - - //Slight hack in case we copy a creature with triggers - AllZone.getTriggerHandler().removeAllFromCard(target[index]); - } - } - }; - - Command atEOT = new Command() { - private static final long serialVersionUID = -4184510100801568140L; - - public void execute() { - sac.setStackDescription(params.get("AtEOT") + " " + target[index] + "."); - AllZone.getStack().addSimultaneousStackEntry(sac); - } - };//Command - if (params.containsKey("AtEOT")) { - AllZone.getEndOfTurn().addAt(atEOT); - } - //end copied Kiki code - - } - }//end canTarget - }//end foreach Card - }//end resolve - - // ************************************************************************* - // ************************* CopySpell ************************************* - // ************************************************************************* - - /** - *

createAbilityCopySpell.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityCopySpell(final AbilityFactory af) { - - final SpellAbility abCopySpell = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 5232548517225345052L; - - @Override - public String getStackDescription() { - return copySpellStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return copySpellCanPlayAI(af, this); - } - - @Override - public void resolve() { - copySpellResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return copySpellTriggerAI(af, this, mandatory); - } - - }; - return abCopySpell; - } - - /** - *

createSpellCopySpell.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellCopySpell(final AbilityFactory af) { - final SpellAbility spCopySpell = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 1878946074608916745L; - - @Override - public String getStackDescription() { - return copySpellStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return copySpellCanPlayAI(af, this); - } - - @Override - public void resolve() { - copySpellResolve(af, this); - } - - }; - return spCopySpell; - } - - /** - *

createDrawbackCopySpell.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackCopySpell(final AbilityFactory af) { - final SpellAbility dbCopySpell = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = 1927508119173644632L; - - @Override - public String getStackDescription() { - return copySpellStackDescription(af, this); - } - - @Override - public void resolve() { - copySpellResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return copySpellTriggerAI(af, this, mandatory); - } - - }; - return dbCopySpell; - } - - /** - *

copySpellStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String copySpellStackDescription(AbilityFactory af, SpellAbility sa) { - StringBuilder sb = new StringBuilder(); - HashMap params = af.getMapParams(); - - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard().getName()).append(" - "); - else - sb.append(" "); - - ArrayList tgtSpells; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtSpells = tgt.getTargetSAs(); - else - tgtSpells = AbilityFactory.getDefinedSpellAbilities(sa.getSourceCard(), params.get("Defined"), sa); - - sb.append("Copy "); - // TODO Someone fix this Description when Copying Charms - Iterator it = tgtSpells.iterator(); - while (it.hasNext()) { - sb.append(it.next().getSourceCard()); - if (it.hasNext()) sb.append(", "); - } - sb.append("."); - //TODO probably add an optional "You may choose new targets..." - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

copySpellCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean copySpellCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - return false; - } - - /** - *

copySpellTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean copySpellTriggerAI(final AbilityFactory af, final SpellAbility sa, boolean mandatory) { - boolean randomReturn = false; - - if (af.hasSubAbility()) { - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - return randomReturn && abSub.chkAI_Drawback(); - } - } - return randomReturn; - } - - /** - *

copySpellResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void copySpellResolve(final AbilityFactory af, final SpellAbility sa) { - final HashMap params = af.getMapParams(); - Card card = af.getHostCard(); - - ArrayList tgtSpells; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtSpells = tgt.getTargetSAs(); - else - tgtSpells = AbilityFactory.getDefinedSpellAbilities(sa.getSourceCard(), params.get("Defined"), sa); - - if (tgtSpells.size() == 0) - return; - - SpellAbility chosenSA = null; - if (tgtSpells.size() == 1) - chosenSA = tgtSpells.get(0); - else if (sa.getActivatingPlayer().isHuman()) - chosenSA = (SpellAbility) GuiUtils.getChoice("Select a spell to copy", tgtSpells.toArray()); - else - chosenSA = tgtSpells.get(0); - - chosenSA.setActivatingPlayer(sa.getActivatingPlayer()); - if (tgt == null || CardFactoryUtil.canTarget(card, chosenSA.getSourceCard())) - AllZone.getCardFactory().copySpellontoStack(card, chosenSA.getSourceCard(), chosenSA, true); - }//end resolve - -}//end class AbilityFactory_Copy diff --git a/src/forge/card/abilityFactory/AbilityFactory_CounterMagic.java b/src/forge/card/abilityFactory/AbilityFactory_CounterMagic.java deleted file mode 100644 index 6fae19c04ac..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_CounterMagic.java +++ /dev/null @@ -1,434 +0,0 @@ -package forge.card.abilityFactory; - -import forge.*; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.*; - -import java.util.ArrayList; -import java.util.HashMap; - -//Destination - send countered spell to: (only applies to Spells; ignored for Abilities) -// -Graveyard (Default) -// -Exile -// -TopOfLibrary -// -Hand -// -BottomOfLibrary -// -ShuffleIntoLibrary -//PowerSink - true if the drawback type part of Power Sink should be used -//ExtraActions - this has been removed. All SubAbilitys should now use the standard SubAbility system - -//Examples: -//A:SP$Counter | Cost$ 1 G | TargetType$ Activated | SpellDescription$ Counter target activated ability. -//A:AB$Counter | Cost$ G G | TargetType$ Spell | Destination$ Exile | ValidTgts$ Color.Black | SpellDescription$ xxxxx - -/** - *

AbilityFactory_CounterMagic class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_CounterMagic { - - private AbilityFactory af = null; - private HashMap params = null; - private String destination = null; - private String unlessCost = null; - - /** - *

Constructor for AbilityFactory_CounterMagic.

- * - * @param newAF a {@link forge.card.abilityFactory.AbilityFactory} object. - */ - public AbilityFactory_CounterMagic(AbilityFactory newAF) { - af = newAF; - params = af.getMapParams(); - - destination = params.containsKey("Destination") ? params.get("Destination") : "Graveyard"; - - if (params.containsKey("UnlessCost")) - unlessCost = params.get("UnlessCost").trim(); - - } - - /** - *

getAbilityCounter.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility getAbilityCounter(final AbilityFactory AF) { - final SpellAbility abCounter = new Ability_Activated(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = -3895990436431818899L; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - return counterStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return counterCanPlayAI(af, this); - } - - @Override - public void resolve() { - counterResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return counterCanPlayAI(af, this); - } - - }; - return abCounter; - } - - /** - *

getSpellCounter.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility getSpellCounter(final AbilityFactory AF) { - final SpellAbility spCounter = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = -4272851734871573693L; - - @Override - public String getStackDescription() { - return counterStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return counterCanPlayAI(af, this); - } - - @Override - public void resolve() { - counterResolve(af, this); - } - - }; - return spCounter; - } - - // Add Counter Drawback - /** - *

getDrawbackCounter.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility getDrawbackCounter(final AbilityFactory AF) { - final SpellAbility dbCounter = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()) { - private static final long serialVersionUID = -4272851734871573693L; - - @Override - public String getStackDescription() { - return counterStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return counterCanPlayAI(af, this); - } - - @Override - public void resolve() { - counterResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return counterDoTriggerAI(af, this, true); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return counterDoTriggerAI(af, this, mandatory); - } - - }; - return dbCounter; - } - - /** - *

counterCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private boolean counterCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - boolean toReturn = true; - Cost abCost = af.getAbCost(); - final Card source = sa.getSourceCard(); - if (AllZone.getStack().size() < 1) { - return false; - } - - if (abCost != null) { - // AI currently disabled for these costs - if (abCost.getSacCost() && !abCost.getSacThis()) { - //only sacrifice something that's supposed to be sacrificed - String type = abCost.getSacType(); - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - typeList = typeList.getValidCards(type.split(","), source.getController(), source); - if (ComputerUtil.getCardPreference(source, "SacCost", typeList) == null) - return false; - } - if (abCost.getLifeCost()) { - if (AllZone.getComputerPlayer().getLife() - abCost.getLifeAmount() < 4) - return false; - } - } - - Target tgt = sa.getTarget(); - if (tgt != null) { - - SpellAbility topSA = AllZone.getStack().peekAbility(); - if (!CardFactoryUtil.isCounterable(topSA.getSourceCard()) || topSA.getActivatingPlayer().isComputer()) - return false; - - tgt.resetTargets(); - if (Target_Selection.matchSpellAbility(sa, topSA, tgt)) - tgt.addTarget(topSA); - else - return false; - } - - - if (unlessCost != null) { - // Is this Usable Mana Sources? Or Total Available Mana? - int usableManaSources = CardFactoryUtil.getUsableManaSources(AllZone.getHumanPlayer()); - int toPay = 0; - boolean setPayX = false; - if (unlessCost.equals("X") && source.getSVar(unlessCost).equals("Count$xPaid")) { - setPayX = true; - toPay = ComputerUtil.determineLeftoverMana(sa); - } else - toPay = AbilityFactory.calculateAmount(source, unlessCost, sa); - - if (toPay == 0) - return false; - - if (toPay <= usableManaSources) { - // If this is a reusable Resource, feel free to play it most of the time - if (!sa.getPayCosts().isReusuableResource() || MyRandom.random.nextFloat() < .4) - return false; - } - - if (setPayX) - source.setSVar("PayX", Integer.toString(toPay)); - } - - // TODO: Improve AI - - // Will return true if this spell can counter (or is Reusable and can force the Human into making decisions) - - // But really it should be more picky about how it counters things - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - toReturn &= subAb.chkAI_Drawback(); - - return toReturn; - } - - /** - *

counterDoTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - public boolean counterDoTriggerAI(AbilityFactory af, SpellAbility sa, boolean mandatory) { - boolean toReturn = true; - if (AllZone.getStack().size() < 1) { - return false; - } - - Target tgt = sa.getTarget(); - if (tgt != null) { - SpellAbility topSA = AllZone.getStack().peekAbility(); - if (!CardFactoryUtil.isCounterable(topSA.getSourceCard()) || topSA.getActivatingPlayer().isComputer()) - return false; - - tgt.resetTargets(); - if (Target_Selection.matchSpellAbility(sa, topSA, tgt)) - tgt.addTarget(topSA); - else - return false; - - Card source = sa.getSourceCard(); - if (unlessCost != null) { - // Is this Usable Mana Sources? Or Total Available Mana? - int usableManaSources = CardFactoryUtil.getUsableManaSources(AllZone.getHumanPlayer()); - int toPay = 0; - boolean setPayX = false; - if (unlessCost.equals("X") && source.getSVar(unlessCost).equals("Count$xPaid")) { - setPayX = true; - toPay = ComputerUtil.determineLeftoverMana(sa); - } else - toPay = AbilityFactory.calculateAmount(source, unlessCost, sa); - - if (toPay == 0) - return false; - - if (toPay <= usableManaSources) { - // If this is a reusable Resource, feel free to play it most of the time - if (!sa.getPayCosts().isReusuableResource() || MyRandom.random.nextFloat() < .4) - return false; - } - - if (setPayX) - source.setSVar("PayX", Integer.toString(toPay)); - } - } - - // TODO: Improve AI - - // Will return true if this spell can counter (or is Reusable and can force the Human into making decisions) - - // But really it should be more picky about how it counters things - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - toReturn &= subAb.chkAI_Drawback(); - - return toReturn; - } - - /** - *

counterResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private void counterResolve(final AbilityFactory af, final SpellAbility sa) { - - // TODO: Before this resolves we should see if any of our targets are still on the stack - ArrayList sas; - - Target tgt = af.getAbTgt(); - if (tgt != null) - sas = tgt.getTargetSAs(); - else - sas = AbilityFactory.getDefinedSpellAbilities(sa.getSourceCard(), params.get("Defined"), sa); - - if (params.containsKey("ForgetOtherTargets")) { - if (params.get("ForgetOtherTargets").equals("True")) { - af.getHostCard().clearRemembered(); - } - } - - for (final SpellAbility tgtSA : sas) { - Card tgtSACard = tgtSA.getSourceCard(); - - if (tgtSA.isSpell() && tgtSACard.keywordsContain("CARDNAME can't be countered.")) - continue; - - SpellAbility_StackInstance si = AllZone.getStack().getInstanceFromSpellAbility(tgtSA); - if (si == null) - continue; - - removeFromStack(tgtSA, sa, si); - - // Destroy Permanent may be able to be turned into a SubAbility - if (tgtSA.isAbility() && params.containsKey("DestroyPermanent")) { - AllZone.getGameAction().destroy(tgtSACard); - } - - if (params.containsKey("RememberTargets")) { - if (params.get("RememberTargets").equals("True")) { - af.getHostCard().addRemembered(tgtSACard); - } - } - } - }//end counterResolve - - /** - *

counterStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private String counterStackDescription(AbilityFactory af, SpellAbility sa) { - - StringBuilder sb = new StringBuilder(); - - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard().getName()).append(" - "); - else - sb.append(" "); - - ArrayList sas; - - Target tgt = af.getAbTgt(); - if (tgt != null) - sas = tgt.getTargetSAs(); - else - sas = AbilityFactory.getDefinedSpellAbilities(sa.getSourceCard(), params.get("Defined"), sa); - - sb.append("countering"); - - boolean isAbility = false; - for (final SpellAbility tgtSA : sas) { - sb.append(" "); - sb.append(tgtSA.getSourceCard()); - isAbility = tgtSA.isAbility(); - if (isAbility) sb.append("'s ability"); - } - - if (isAbility && params.containsKey("DestroyPermanent")) { - sb.append(" and destroy it"); - } - - sb.append("."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - }//end counterStackDescription - - /** - *

removeFromStack.

- * - * @param tgtSA a {@link forge.card.spellability.SpellAbility} object. - * @param srcSA a {@link forge.card.spellability.SpellAbility} object. - * @param si a {@link forge.card.spellability.SpellAbility_StackInstance} object. - */ - private void removeFromStack(SpellAbility tgtSA, SpellAbility srcSA, SpellAbility_StackInstance si) { - AllZone.getStack().remove(si); - - if (tgtSA.isAbility()) { - //For Ability-targeted counterspells - do not move it anywhere, even if Destination$ is specified. - } else if (destination.equals("Graveyard")) { - AllZone.getGameAction().moveToGraveyard(tgtSA.getSourceCard()); - } else if (destination.equals("Exile")) { - AllZone.getGameAction().exile(tgtSA.getSourceCard()); - } else if (destination.equals("TopOfLibrary")) { - AllZone.getGameAction().moveToLibrary(tgtSA.getSourceCard()); - } else if (destination.equals("Hand")) { - AllZone.getGameAction().moveToHand(tgtSA.getSourceCard()); - } else if (destination.equals("BottomOfLibrary")) { - AllZone.getGameAction().moveToBottomOfLibrary(tgtSA.getSourceCard()); - } else if (destination.equals("ShuffleIntoLibrary")) { - AllZone.getGameAction().moveToBottomOfLibrary(tgtSA.getSourceCard()); - tgtSA.getSourceCard().getController().shuffle(); - } else { - throw new IllegalArgumentException("AbilityFactory_CounterMagic: Invalid Destination argument for card " + srcSA.getSourceCard().getName()); - } - - if (!tgtSA.isAbility()) - System.out.println("Send countered spell to " + destination); - } - -}//end class AbilityFactory_CounterMagic diff --git a/src/forge/card/abilityFactory/AbilityFactory_Counters.java b/src/forge/card/abilityFactory/AbilityFactory_Counters.java deleted file mode 100644 index e6781ced911..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_Counters.java +++ /dev/null @@ -1,1647 +0,0 @@ -package forge.card.abilityFactory; - -import forge.*; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.*; -import forge.gui.GuiUtils; -import forge.gui.input.Input; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Random; - -/** - *

AbilityFactory_Counters class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_Counters { - // An AbilityFactory subclass for Putting or Removing Counters on Cards. - - // ******************************************* - // ********** PutCounters ***************** - // ******************************************* - - /** - *

createAbilityPutCounters.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityPutCounters(final AbilityFactory af) { - - final SpellAbility abPutCounter = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -1259638699008542484L; - - @Override - public String getStackDescription() { - return putStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return putCanPlayAI(af, this); - } - - @Override - public void resolve() { - putResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return putDoTriggerAI(af, this, mandatory); - } - - }; - return abPutCounter; - } - - /** - *

createSpellPutCounters.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellPutCounters(final AbilityFactory af) { - final SpellAbility spPutCounter = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -323471693082498224L; - - @Override - public String getStackDescription() { - return putStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - // if X depends on abCost, the AI needs to choose which card he would sacrifice first - // then call xCount with that card to properly calculate the amount - // Or choosing how many to sacrifice - return putCanPlayAI(af, this); - } - - @Override - public void resolve() { - putResolve(af, this); - } - - }; - return spPutCounter; - } - - /** - *

createDrawbackPutCounters.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackPutCounters(final AbilityFactory af) { - final SpellAbility dbPutCounter = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = -323471693082498224L; - - @Override - public String getStackDescription() { - return putStackDescription(af, this); - } - - @Override - public void resolve() { - putResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return putPlayDrawbackAI(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return putDoTriggerAI(af, this, mandatory); - } - - }; - return dbPutCounter; - } - - /** - *

putStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String putStackDescription(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - StringBuilder sb = new StringBuilder(); - - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard().getName()).append(" - "); - else - sb.append(" "); - - Counters cType = Counters.valueOf(params.get("CounterType")); - Card card = af.getHostCard(); - int amount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("CounterNum"), sa); - - sb.append("Put ").append(amount).append(" ").append(cType.getName()) - .append(" counter"); - if (amount != 1) sb.append("s"); - sb.append(" on "); - - ArrayList tgtCards; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else { - tgtCards = AbilityFactory.getDefinedCards(card, params.get("Defined"), sa); - } - - Iterator it = tgtCards.iterator(); - while (it.hasNext()) { - Card tgtC = it.next(); - if (tgtC.isFaceDown()) sb.append("Morph"); - else sb.append(tgtC); - - if (it.hasNext()) sb.append(", "); - } - - sb.append("."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

putCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean putCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - // AI needs to be expanded, since this function can be pretty complex based on what the expected targets could be - HashMap params = af.getMapParams(); - Random r = MyRandom.random; - Cost abCost = sa.getPayCosts(); - Target abTgt = sa.getTarget(); - final Card source = sa.getSourceCard(); - CardList list; - Card choice = null; - String type = params.get("CounterType"); - String amountStr = params.get("CounterNum"); - - Player player = af.isCurse() ? AllZone.getHumanPlayer() : AllZone.getComputerPlayer(); - - - list = AllZoneUtil.getPlayerCardsInPlay(player); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CardFactoryUtil.canTarget(source, c) && !c.hasKeyword("CARDNAME can't have counters placed on it."); - } - }); - - if (abTgt != null) { - list = list.getValidCards(abTgt.getValidTgts(), source.getController(), source); - - if (list.size() < abTgt.getMinTargets(source, sa)) - return false; - } else { // "put counter on this" - PlayerZone pZone = AllZone.getZone(source); - // Don't activate Curse abilities on my cards and non-curse abilites on my opponents - if (!pZone.getPlayer().equals(player)) - return false; - } - - if (abCost != null) { - // AI currently disabled for these costs - if (abCost.getSacCost() && (!abCost.getSacThis() || source.isCreature())) { - //only sacrifice something that's supposed to be sacrificed - String sacType = abCost.getSacType(); - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - typeList = typeList.getValidCards(sacType.split(","), source.getController(), source); - if (ComputerUtil.getCardPreference(source, "SacCost", typeList) == null) - return false; - } - if (abCost.getLifeCost()) return false; - if (abCost.getDiscardCost()) return false; - - if (abCost.getSubCounter()) { - // A card has a 25% chance per counter to be able to pass through here - // 4+ counters will always pass. 0 counters will never - int currentNum = source.getCounters(abCost.getCounterType()); - double percent = .25 * (currentNum / abCost.getCounterNum()); - if (percent <= r.nextFloat()) - return false; - } - } - - // TODO handle proper calculation of X values based on Cost - int amount = AbilityFactory.calculateAmount(af.getHostCard(), amountStr, sa); - - if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) { - // Set PayX here to maximum value. - amount = ComputerUtil.determineLeftoverMana(sa); - source.setSVar("PayX", Integer.toString(amount)); - // TODO: - } - - //don't use it if no counters to add - if (amount <= 0) return false; - - // prevent run-away activations - first time will always return true - boolean chance = r.nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn()); - - // Targeting - if (abTgt != null) { - abTgt.resetTargets(); - // target loop - while (abTgt.getNumTargeted() < abTgt.getMaxTargets(sa.getSourceCard(), sa)) { - if (list.size() == 0) { - if (abTgt.getNumTargeted() < abTgt.getMinTargets(sa.getSourceCard(), sa) || abTgt.getNumTargeted() == 0) { - abTgt.resetTargets(); - return false; - } else { - // TODO is this good enough? for up to amounts? - break; - } - } - - if (af.isCurse()) { - choice = chooseCursedTarget(list, type, amount); - } else { - choice = chooseBoonTarget(list, type); - } - - if (choice == null) { // can't find anything left - if (abTgt.getNumTargeted() < abTgt.getMinTargets(sa.getSourceCard(), sa) || abTgt.getNumTargeted() == 0) { - abTgt.resetTargets(); - return false; - } else { - // TODO is this good enough? for up to amounts? - break; - } - } - list.remove(choice); - abTgt.addTarget(choice); - } - } else { - // Placeholder: No targeting necessary - int currCounters = sa.getSourceCard().getCounters(Counters.valueOf(type)); - // each non +1/+1 counter on the card is a 10% chance of not activating this ability. - - if (!(type.equals("P1P1") || type.equals("ICE")) && r.nextFloat() < .1 * currCounters) - return false; - } - - //Don't use non P1P1/M1M1 counters before main 2 if possible - if (AllZone.getPhase().isBefore(Constant.Phase.Main2) && !params.containsKey("ActivatingPhases") - && !(type.equals("P1P1") || type.equals("M1M1"))) - return false; - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - if (AbilityFactory.playReusable(sa)) - return chance; - - return ((r.nextFloat() < .6667) && chance); - }//putCanPlayAI - - /** - *

putPlayDrawbackAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean putPlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - boolean chance = true; - Target abTgt = sa.getTarget(); - final Card source = sa.getSourceCard(); - CardList list; - Card choice = null; - String type = params.get("CounterType"); - String amountStr = params.get("CounterNum"); - final int amount = AbilityFactory.calculateAmount(af.getHostCard(), amountStr, sa); - - Player player = af.isCurse() ? AllZone.getHumanPlayer() : AllZone.getComputerPlayer(); - - list = AllZoneUtil.getPlayerCardsInPlay(player); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CardFactoryUtil.canTarget(source, c); - } - }); - - if (abTgt != null) { - list = list.getValidCards(abTgt.getValidTgts(), source.getController(), source); - - if (list.size() == 0) - return false; - - abTgt.resetTargets(); - // target loop - while (abTgt.getNumTargeted() < abTgt.getMaxTargets(sa.getSourceCard(), sa)) { - if (list.size() == 0) { - if (abTgt.getNumTargeted() < abTgt.getMinTargets(sa.getSourceCard(), sa) || abTgt.getNumTargeted() == 0) { - abTgt.resetTargets(); - return false; - } else { - break; - } - } - - if (af.isCurse()) { - choice = chooseCursedTarget(list, type, amount); - } else { - - } - - if (choice == null) { // can't find anything left - if (abTgt.getNumTargeted() < abTgt.getMinTargets(sa.getSourceCard(), sa) || abTgt.getNumTargeted() == 0) { - abTgt.resetTargets(); - return false; - } else { - // TODO is this good enough? for up to amounts? - break; - } - } - list.remove(choice); - abTgt.addTarget(choice); - } - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return chance; - }//putPlayDrawbackAI - - /** - *

putDoTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean putDoTriggerAI(final AbilityFactory af, final SpellAbility sa, boolean mandatory) { - // if there is a cost, it's gotta be optional - if (!ComputerUtil.canPayCost(sa) && !mandatory) - return false; - - HashMap params = af.getMapParams(); - Target abTgt = sa.getTarget(); - final Card source = sa.getSourceCard(); - boolean chance = true; - boolean preferred = true; - CardList list; - Player player = af.isCurse() ? AllZone.getHumanPlayer() : AllZone.getComputerPlayer(); - String type = params.get("CounterType"); - String amountStr = params.get("CounterNum"); - final int amount = AbilityFactory.calculateAmount(af.getHostCard(), amountStr, sa); - - if (abTgt == null) { - // No target. So must be defined - list = new CardList(AbilityFactory.getDefinedCards(source, params.get("Defined"), sa).toArray()); - - if (!mandatory) { - // TODO: If Trigger isn't mandatory, when wouldn't we want to put a counter? - // things like Powder Keg, which are way too complex for the AI - } - } else { - list = AllZoneUtil.getPlayerCardsInPlay(player); - list = list.getTargetableCards(source); - if (abTgt != null) { - list = list.getValidCards(abTgt.getValidTgts(), source.getController(), source); - } - if (list.isEmpty() && mandatory) { - // If there isn't any prefered cards to target, gotta choose non-preferred ones - list = AllZoneUtil.getPlayerCardsInPlay(player.getOpponent()); - list = list.getTargetableCards(source); - if (abTgt != null) { - list = list.getValidCards(abTgt.getValidTgts(), source.getController(), source); - } - preferred = false; - } - // Not mandatory, or the the list was regenerated and is still empty, so return false since there are no targets - if (list.isEmpty()) - return false; - - Card choice = null; - - // Choose targets here: - if (af.isCurse()) { - if (preferred) - choice = chooseCursedTarget(list, type, amount); - - else { - if (type.equals("M1M1")) { - choice = CardFactoryUtil.AI_getWorstCreature(list); - } else { - choice = CardFactoryUtil.getRandomCard(list); - } - } - } else { - if (preferred) - choice = chooseBoonTarget(list, type); - - else { - if (type.equals("P1P1")) { - choice = CardFactoryUtil.AI_getWorstCreature(list); - } else { - choice = CardFactoryUtil.getRandomCard(list); - } - } - } - - //TODO - I think choice can be null here. Is that ok for addTarget()? - abTgt.addTarget(choice); - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.doTrigger(mandatory); - - return true; - } - - /** - *

chooseCursedTarget.

- * - * @param list a {@link forge.CardList} object. - * @param type a {@link java.lang.String} object. - * @param amount a int. - * @return a {@link forge.Card} object. - */ - private static Card chooseCursedTarget(CardList list, String type, final int amount) { - Card choice; - if (type.equals("M1M1")) { - // try to kill the best killable creature, or reduce the best one - CardList killable = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getNetDefense() <= amount; - } - }); - if (killable.size() > 0) - choice = CardFactoryUtil.AI_getBestCreature(killable); - else - choice = CardFactoryUtil.AI_getBestCreature(list); - } else { - // improve random choice here - choice = CardFactoryUtil.getRandomCard(list); - } - return choice; - } - - /** - *

chooseBoonTarget.

- * - * @param list a {@link forge.CardList} object. - * @param type a {@link java.lang.String} object. - * @return a {@link forge.Card} object. - */ - private static Card chooseBoonTarget(CardList list, String type) { - Card choice; - if (type.equals("P1P1")) { - choice = CardFactoryUtil.AI_getBestCreature(list); - } - else if(type.equals("DIVINITY")) { - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getCounters(Counters.DIVINITY) == 0; - } - }); - choice = CardFactoryUtil.AI_getMostExpensivePermanent(list, null, false); - } - else { - // The AI really should put counters on cards that can use it. - // Charge counters on things with Charge abilities, etc. Expand these above - choice = CardFactoryUtil.getRandomCard(list); - } - return choice; - } - - /** - *

putResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void putResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - - Card card = af.getHostCard(); - String type = params.get("CounterType"); - int counterAmount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("CounterNum"), sa); - - ArrayList tgtCards; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else { - tgtCards = AbilityFactory.getDefinedCards(card, params.get("Defined"), sa); - } - - for (Card tgtCard : tgtCards) { - if (tgt == null || CardFactoryUtil.canTarget(card, tgtCard)) { - if (AllZone.getZone(tgtCard).is(Constant.Zone.Battlefield)) - tgtCard.addCounter(Counters.valueOf(type), counterAmount); - else // adding counters to something like re-suspend cards - tgtCard.addCounterFromNonEffect(Counters.valueOf(type), counterAmount); - } - } - } - - // ******************************************* - // ********** RemoveCounters ***************** - // ******************************************* - - /** - *

createAbilityRemoveCounters.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityRemoveCounters(final AbilityFactory af) { - final SpellAbility abRemCounter = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 8581011868395954121L; - - @Override - public String getStackDescription() { - return removeStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return removeCanPlayAI(af, this); - } - - @Override - public void resolve() { - removeResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return removeDoTriggerAI(af, this, mandatory); - } - - }; - return abRemCounter; - } - - /** - *

createSpellRemoveCounters.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellRemoveCounters(final AbilityFactory af) { - final SpellAbility spRemoveCounter = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -5065591869141835456L; - - @Override - public String getStackDescription() { - return removeStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - // if X depends on abCost, the AI needs to choose which card he would sacrifice first - // then call xCount with that card to properly calculate the amount - // Or choosing how many to sacrifice - return removeCanPlayAI(af, this); - } - - @Override - public void resolve() { - removeResolve(af, this); - } - - }; - return spRemoveCounter; - } - - /** - *

createDrawbackRemoveCounters.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackRemoveCounters(final AbilityFactory af) { - final SpellAbility spRemoveCounter = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = -5065591869141835456L; - - @Override - public String getStackDescription() { - return removeStackDescription(af, this); - } - - @Override - public void resolve() { - removeResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return removePlayDrawbackAI(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return removeDoTriggerAI(af, this, mandatory); - } - - }; - return spRemoveCounter; - } - - /** - *

removeStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String removeStackDescription(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - Card card = af.getHostCard(); - StringBuilder sb = new StringBuilder(); - - if (!(sa instanceof Ability_Sub)) - sb.append(card).append(" - "); - else - sb.append(" "); - - Counters cType = Counters.valueOf(params.get("CounterType")); - int amount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("CounterNum"), sa); - - sb.append("Remove "); - if (params.containsKey("UpTo")) sb.append("up to "); - sb.append(amount).append(" ").append(cType.getName()).append(" counter"); - if (amount != 1) sb.append("s"); - sb.append(" from"); - - ArrayList tgtCards; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else { - tgtCards = AbilityFactory.getDefinedCards(card, params.get("Defined"), sa); - } - for (Card c : tgtCards) - sb.append(" ").append(c); - - sb.append("."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

removeCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean removeCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - // AI needs to be expanded, since this function can be pretty complex based on what the expected targets could be - Random r = MyRandom.random; - Cost abCost = sa.getPayCosts(); - //Target abTgt = sa.getTarget(); - final Card source = sa.getSourceCard(); - //CardList list; - //Card choice = null; - HashMap params = af.getMapParams(); - - String type = params.get("CounterType"); - //String amountStr = params.get("CounterNum"); - - //TODO - currently, not targeted, only for Self - - //Player player = af.isCurse() ? AllZone.getHumanPlayer() : AllZone.getComputerPlayer(); - - - if (abCost != null) { - // AI currently disabled for these costs - if (abCost.getSacCost() && !abCost.getSacThis()) { - //only sacrifice something that's supposed to be sacrificed - String sacType = abCost.getSacType(); - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - typeList = typeList.getValidCards(sacType.split(","), source.getController(), source); - if (ComputerUtil.getCardPreference(source, "SacCost", typeList) == null) - return false; - } - if (abCost.getLifeCost()) return false; - if (abCost.getDiscardCost()) return false; - - if (abCost.getSubCounter()) { - // A card has a 25% chance per counter to be able to pass through here - // 4+ counters will always pass. 0 counters will never - int currentNum = source.getCounters(abCost.getCounterType()); - double percent = .25 * (currentNum / abCost.getCounterNum()); - if (percent <= r.nextFloat()) - return false; - } - } - - // TODO handle proper calculation of X values based on Cost - //final int amount = calculateAmount(af.getHostCard(), amountStr, sa); - - // prevent run-away activations - first time will always return true - boolean chance = r.nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn()); - - //currently, not targeted - - // Placeholder: No targeting necessary - int currCounters = sa.getSourceCard().getCounters(Counters.valueOf(type)); - // each counter on the card is a 10% chance of not activating this ability. - if (r.nextFloat() < .1 * currCounters) - return false; - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return ((r.nextFloat() < .6667) && chance); - } - - /** - *

removePlayDrawbackAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean removePlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) { - // AI needs to be expanded, since this function can be pretty complex based on what the expected targets could be - //Target abTgt = sa.getTarget(); - //final Card source = sa.getSourceCard(); - //CardList list; - //Card choice = null; - //HashMap params = af.getMapParams(); - - //String type = params.get("CounterType"); - //String amountStr = params.get("CounterNum"); - - //TODO - currently, not targeted, only for Self - - //Player player = af.isCurse() ? AllZone.getHumanPlayer() : AllZone.getComputerPlayer(); - - // TODO handle proper calculation of X values based on Cost - //final int amount = calculateAmount(af.getHostCard(), amountStr, sa); - - // prevent run-away activations - first time will always return true - boolean chance = true; - - //currently, not targeted - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return chance; - } - - /** - *

removeDoTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean removeDoTriggerAI(final AbilityFactory af, final SpellAbility sa, boolean mandatory) { - // AI needs to be expanded, since this function can be pretty complex based on what the expected targets could be - boolean chance = true; - - //TODO - currently, not targeted, only for Self - - // Note: Not many cards even use Trigger and Remove Counters. And even fewer are not mandatory - // Since the targeting portion of this would be what - - if (!ComputerUtil.canPayCost(sa) && !mandatory) - return false; - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.doTrigger(mandatory); - - return chance; - } - - /** - *

removeResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void removeResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - - Card card = af.getHostCard(); - String type = params.get("CounterType"); - int counterAmount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("CounterNum"), sa); - - ArrayList tgtCards; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else { - tgtCards = AbilityFactory.getDefinedCards(card, params.get("Defined"), sa); - } - - for (Card tgtCard : tgtCards) - if (tgt == null || CardFactoryUtil.canTarget(card, tgtCard)) { - PlayerZone zone = AllZone.getZone(tgtCard); - - if (zone.is(Constant.Zone.Battlefield) || zone.is(Constant.Zone.Exile)) - if (params.containsKey("UpTo") && sa.getActivatingPlayer().isHuman()) { - ArrayList choices = new ArrayList(); - for (int i = 0; i <= counterAmount; i++) choices.add("" + i); - Object o = GuiUtils.getChoice("Select the number of " + type + " counters to remove", choices.toArray()); - counterAmount = Integer.parseInt((String) o); - } - tgtCard.subtractCounter(Counters.valueOf(type), counterAmount); - } - } - - // ******************************************* - // ********** Proliferate ******************** - // ******************************************* - - /** - *

createAbilityProliferate.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityProliferate(final AbilityFactory af) { - final SpellAbility abProliferate = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -6617234927365102930L; - - @Override - public boolean canPlayAI() { - return proliferateShouldPlayAI(this); - } - - @Override - public void resolve() { - proliferateResolve(af, this); - } - - @Override - public String getStackDescription() { - return proliferateStackDescription(this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return proliferateDoTriggerAI(this, mandatory); - } - }; - - return abProliferate; - } - - /** - *

createSpellProliferate.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellProliferate(final AbilityFactory af) { - final SpellAbility spProliferate = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 1265466498444897146L; - - @Override - public boolean canPlayAI() { - return proliferateShouldPlayAI(this); - } - - @Override - public void resolve() { - proliferateResolve(af, this); - } - - @Override - public boolean canPlay() { - // super takes care of AdditionalCosts - return super.canPlay(); - } - - @Override - public String getStackDescription() { - return proliferateStackDescription(this); - } - }; - - return spProliferate; - } - - /** - *

createDrawbackProliferate.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackProliferate(final AbilityFactory af) { - final SpellAbility dbProliferate = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = 1265466498444897146L; - - @Override - public boolean canPlayAI() { - return proliferateShouldPlayAI(this); - } - - @Override - public void resolve() { - proliferateResolve(af, this); - } - - @Override - public String getStackDescription() { - return proliferateStackDescription(this); - } - - @Override - public boolean chkAI_Drawback() { - return proliferateShouldPlayAI(this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return proliferateDoTriggerAI(this, mandatory); - } - }; - - return dbProliferate; - } - - /** - *

proliferateStackDescription.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String proliferateStackDescription(SpellAbility sa) { - StringBuilder sb = new StringBuilder(); - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard()).append(" - "); - else - sb.append(" "); - sb.append("Proliferate."); - sb.append(" (You choose any number of permanents and/or players with "); - sb.append("counters on them, then give each another counter of a kind already there.)"); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

proliferateShouldPlayAI.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean proliferateShouldPlayAI(SpellAbility sa) { - boolean chance = true; - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - // TODO: Make sure Human has poison counters or there are some counters we want to proliferate - return chance; - } - - /** - *

proliferateDoTriggerAI.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean proliferateDoTriggerAI(SpellAbility sa, boolean mandatory) { - boolean chance = true; - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.doTrigger(mandatory); - - // TODO: Make sure Human has poison counters or there are some counters we want to proliferate - return chance; - } - - /** - *

proliferateResolve.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void proliferateResolve(final AbilityFactory AF, SpellAbility sa) { - CardList hperms = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - hperms = hperms.filter(new CardListFilter() { - public boolean addCard(Card crd) { - return !crd.getName().equals("Mana Pool") /*&& crd.hasCounters()*/; - } - }); - - CardList cperms = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - cperms = cperms.filter(new CardListFilter() { - public boolean addCard(Card crd) { - return !crd.getName().equals("Mana Pool") /*&& crd.hasCounters()*/; - } - }); - - if (AF.getHostCard().getController().isHuman()) { - cperms.addAll(hperms); - final CardList unchosen = cperms; - AllZone.getInputControl().setInput(new Input() { - private static final long serialVersionUID = -1779224307654698954L; - - @Override - public void showMessage() { - ButtonUtil.enableOnlyCancel(); - AllZone.getDisplay().showMessage("Proliferate: Choose permanents and/or players"); - } - - @Override - public void selectButtonCancel() { - AllZone.getStack().chooseOrderOfSimultaneousStackEntryAll(); //Hacky intermittent solution to triggers that look for counters being put on. They used to wait for another priority passing after proliferate finished. - stop(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (!unchosen.contains(card)) return; - unchosen.remove(card); - ArrayList choices = new ArrayList(); - for (Counters c_1 : Counters.values()) - if (card.getCounters(c_1) != 0) choices.add(c_1.getName()); - if (choices.size() > 0) - card.addCounter(Counters.getType((choices.size() == 1 ? choices.get(0) : GuiUtils.getChoice("Select counter type", choices.toArray()).toString())), 1); - } - - boolean selComputer = false; - boolean selHuman = false; - - @Override - public void selectPlayer(Player player) { - if (player.isHuman() && selHuman == false) { - selHuman = true; - if (AllZone.getHumanPlayer().getPoisonCounters() > 0) - AllZone.getHumanPlayer().addPoisonCounters(1); - } - if (player.isComputer() && selComputer == false) { - selComputer = true; - if (AllZone.getComputerPlayer().getPoisonCounters() > 0) - AllZone.getComputerPlayer().addPoisonCounters(1); - } - } - }); - } else { //Compy - cperms = cperms.filter(new CardListFilter() { - public boolean addCard(Card crd) { - int pos = 0; - int neg = 0; - for (Counters c_1 : Counters.values()) { - if (crd.getCounters(c_1) != 0) { - if (CardFactoryUtil.isNegativeCounter(c_1)) - neg++; - else - pos++; - } - } - return pos > neg; - } - }); - - hperms = hperms.filter(new CardListFilter() { - public boolean addCard(Card crd) { - int pos = 0; - int neg = 0; - for (Counters c_1 : Counters.values()) { - if (crd.getCounters(c_1) != 0) { - if (CardFactoryUtil.isNegativeCounter(c_1)) - neg++; - else - pos++; - } - } - return pos < neg; - } - }); - - StringBuilder sb = new StringBuilder(); - sb.append("Proliferate:
Computer selects "); - if (cperms.size() == 0 && hperms.size() == 0 && AllZone.getHumanPlayer().getPoisonCounters() == 0) - sb.append("nothing."); - else { - if (cperms.size() > 0) { - sb.append("
From Computer's permanents:
"); - for (Card c : cperms) { - sb.append(c); - sb.append(" "); - } - sb.append("
"); - } - if (hperms.size() > 0) { - sb.append("
From Human's permanents:
"); - for (Card c : cperms) { - sb.append(c); - sb.append(" "); - } - sb.append("
"); - } - if (AllZone.getHumanPlayer().getPoisonCounters() > 0) - sb.append("Human Player."); - }//else - sb.append(""); - - - //add a counter for each counter type, if it would benefit the computer - for (Card c : cperms) { - for (Counters c_1 : Counters.values()) - if (c.getCounters(c_1) != 0) c.addCounter(c_1, 1); - } - - //add a counter for each counter type, if it would screw over the player - for (Card c : hperms) { - for (Counters c_1 : Counters.values()) - if (c.getCounters(c_1) != 0) c.addCounter(c_1, 1); - } - - //give human a poison counter, if he has one - if (AllZone.getHumanPlayer().getPoisonCounters() > 0) - AllZone.getHumanPlayer().addPoisonCounters(1); - - } //comp - } - - // ******************************************* - // ********** PutCounterAll ****************** - // ******************************************* - - /** - *

createAbilityPutCounterAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityPutCounterAll(final AbilityFactory af) { - - final SpellAbility abPutCounterAll = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -712473347429870385L; - - @Override - public String getStackDescription() { - return putAllStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return putAllCanPlayAI(af, this); - } - - @Override - public void resolve() { - putAllResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return putAllCanPlayAI(af, this); - } - - }; - return abPutCounterAll; - } - - /** - *

createSpellPutCounterAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellPutCounterAll(final AbilityFactory af) { - final SpellAbility spPutCounterAll = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -4400684695467183219L; - - @Override - public String getStackDescription() { - return putAllStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return putAllCanPlayAI(af, this); - } - - @Override - public void resolve() { - putAllResolve(af, this); - } - - }; - return spPutCounterAll; - } - - /** - *

createDrawbackPutCounterAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackPutCounterAll(final AbilityFactory af) { - final SpellAbility dbPutCounterAll = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = -3101160929130043022L; - - @Override - public String getStackDescription() { - return putAllStackDescription(af, this); - } - - @Override - public void resolve() { - putAllResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return putAllPlayDrawbackAI(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return putAllPlayDrawbackAI(af, this); - } - - }; - return dbPutCounterAll; - } - - /** - *

putAllStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String putAllStackDescription(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - StringBuilder sb = new StringBuilder(); - - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard().getName()).append(" - "); - else - sb.append(" "); - - Counters cType = Counters.valueOf(params.get("CounterType")); - int amount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("CounterNum"), sa); - - sb.append("Put ").append(amount).append(" ").append(cType.getName()).append(" counter"); - if (amount != 1) sb.append("s"); - sb.append(" on each valid permanent."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

putAllCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean putAllCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - // AI needs to be expanded, since this function can be pretty complex based on what the expected targets could be - Random r = MyRandom.random; - HashMap params = af.getMapParams(); - Cost abCost = sa.getPayCosts(); - final Card source = sa.getSourceCard(); - CardList hList; - CardList cList; - String type = params.get("CounterType"); - String amountStr = params.get("CounterNum"); - String valid = params.get("ValidCards"); - boolean curse = af.isCurse(); - Target tgt = sa.getTarget(); - - hList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - cList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - - hList = hList.getValidCards(valid, source.getController(), source); - cList = cList.getValidCards(valid, source.getController(), source); - - if (abCost != null) { - // AI currently disabled for these costs - if (abCost.getSacCost()) { - return false; - } - if (abCost.getLifeCost()) return false; - if (abCost.getDiscardCost()) return false; - } - - if (tgt != null) { - Player pl; - if (curse) - pl = AllZone.getHumanPlayer(); - else - pl = AllZone.getComputerPlayer(); - - tgt.addTarget(pl); - - hList = hList.getController(pl); - cList = cList.getController(pl); - } - - // TODO improve X value to don't overpay when extra mana won't do anything more useful - final int amount; - if (amountStr.equals("X") && source.getSVar(amountStr).equals("Count$xPaid")) { - // Set PayX here to maximum value. - amount = ComputerUtil.determineLeftoverMana(sa); - source.setSVar("PayX", Integer.toString(amount)); - } else { - amount = AbilityFactory.calculateAmount(af.getHostCard(), amountStr, sa); - } - - // prevent run-away activations - first time will always return true - boolean chance = r.nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn()); - - if (curse) { - if (type.equals("M1M1")) { - CardList killable = hList.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getNetDefense() <= amount; - } - }); - if (!(killable.size() > 2)) return false; - } else { - //make sure compy doesn't harm his stuff more than human's stuff - if (cList.size() > hList.size()) return false; - } - } else { - //human has more things that will benefit, don't play - if (hList.size() >= cList.size()) return false; - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return ((r.nextFloat() < .6667) && chance); - } - - /** - *

putAllPlayDrawbackAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean putAllPlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) { - return putAllCanPlayAI(af, sa); - } - - /** - *

putAllResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void putAllResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - - String type = params.get("CounterType"); - int counterAmount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("CounterNum"), sa); - String valid = params.get("ValidCards"); - - CardList cards = AllZoneUtil.getCardsInPlay(); - cards = cards.getValidCards(valid, sa.getSourceCard().getController(), sa.getSourceCard()); - - Target tgt = sa.getTarget(); - if (tgt != null) { - Player pl = sa.getTargetPlayer(); - cards = cards.getController(pl); - } - - for (Card tgtCard : cards) { - if (AllZone.getZone(tgtCard).is(Constant.Zone.Battlefield)) - tgtCard.addCounter(Counters.valueOf(type), counterAmount); - else // adding counters to something like re-suspend cards - tgtCard.addCounterFromNonEffect(Counters.valueOf(type), counterAmount); - } - } - - // ******************************************* - // ********** RemoveCounterAll *************** - // ******************************************* - - /** - *

createAbilityRemoveCounterAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityRemoveCounterAll(final AbilityFactory af) { - - final SpellAbility abRemoveCounterAll = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 1189198508841846311L; - - @Override - public String getStackDescription() { - return removeCounterAllStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return removeCounterAllCanPlayAI(af, this); - } - - @Override - public void resolve() { - removeCounterAllResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return true; - } - - }; - return abRemoveCounterAll; - } - - /** - *

createSpellRemoveCounterAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellRemoveCounterAll(final AbilityFactory af) { - final SpellAbility spRemoveCounterAll = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 4173468877313664704L; - - @Override - public String getStackDescription() { - return removeCounterAllStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return removeCounterAllCanPlayAI(af, this); - } - - @Override - public void resolve() { - removeCounterAllResolve(af, this); - } - - }; - return spRemoveCounterAll; - } - - /** - *

createDrawbackRemoveCounterAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackRemoveCounterAll(final AbilityFactory af) { - final SpellAbility dbRemoveCounterAll = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = 9210702927696563686L; - - @Override - public String getStackDescription() { - return removeCounterAllStackDescription(af, this); - } - - @Override - public void resolve() { - removeCounterAllResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return removeCounterAllPlayDrawbackAI(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return removeCounterAllPlayDrawbackAI(af, this); - } - - }; - return dbRemoveCounterAll; - } - - /** - *

removeCounterAllStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String removeCounterAllStackDescription(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - StringBuilder sb = new StringBuilder(); - - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard()).append(" - "); - else - sb.append(" "); - - Counters cType = Counters.valueOf(params.get("CounterType")); - int amount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("CounterNum"), sa); - - sb.append("Remove ").append(amount).append(" ").append(cType.getName()).append(" counter"); - if (amount != 1) sb.append("s"); - sb.append(" from each valid permanent."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

removeCounterAllCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean removeCounterAllCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - //Heartmender is the only card using this, and it's from a trigger. - //If at some point, other cards use this as a spell or ability, this will need to be implemented. - return false; - } - - /** - *

removeCounterAllPlayDrawbackAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean removeCounterAllPlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) { - return removeCounterAllCanPlayAI(af, sa); - } - - /** - *

removeCounterAllResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void removeCounterAllResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - - String type = params.get("CounterType"); - int counterAmount = AbilityFactory.calculateAmount(af.getHostCard(), params.get("CounterNum"), sa); - String valid = params.get("ValidCards"); - - CardList cards = AllZoneUtil.getCardsInPlay(); - cards = cards.getValidCards(valid, sa.getSourceCard().getController(), sa.getSourceCard()); - - Target tgt = sa.getTarget(); - if (tgt != null) { - Player pl = sa.getTargetPlayer(); - cards = cards.getController(pl); - } - - for (Card tgtCard : cards) { - tgtCard.subtractCounter(Counters.valueOf(type), counterAmount); - } - } - -}//end class AbilityFactory_Counters diff --git a/src/forge/card/abilityFactory/AbilityFactory_DealDamage.java b/src/forge/card/abilityFactory/AbilityFactory_DealDamage.java deleted file mode 100644 index ade7a2a01b8..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_DealDamage.java +++ /dev/null @@ -1,986 +0,0 @@ -package forge.card.abilityFactory; - -import forge.*; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.*; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Random; - -/** - *

AbilityFactory_DealDamage class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_DealDamage { - private AbilityFactory AF = null; - - private String damage; - - /** - *

Constructor for AbilityFactory_DealDamage.

- * - * @param newAF a {@link forge.card.abilityFactory.AbilityFactory} object. - */ - public AbilityFactory_DealDamage(AbilityFactory newAF) { - AF = newAF; - - damage = AF.getMapParams().get("NumDmg"); - - // Note: TgtOpp should not be used, Please use ValidTgts$ Opponent instead - } - - // ****************************************************************************************************** - // ***************************** DAMAGE ***************************************************************** - // ****************************************************************************************************** - - /** - *

getAbility.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility getAbility() { - final SpellAbility abDamage = new Ability_Activated(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = -7560349014757367722L; - - @Override - public boolean canPlayAI() { - return doCanPlayAI(this); - } - - @Override - public String getStackDescription() { - return damageStackDescription(AF, this); - } - - @Override - public void resolve() { - doResolve(this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return damageDoTriggerAI(AF, this, mandatory); - } - };// Ability_Activated - - return abDamage; - } - - /** - *

getSpell.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility getSpell() { - final SpellAbility spDealDamage = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = 7239608350643325111L; - - @Override - public boolean canPlayAI() { - return doCanPlayAI(this); - - } - - @Override - public String getStackDescription() { - return damageStackDescription(AF, this); - } - - @Override - public void resolve() { - doResolve(this); - } - - }; // Spell - - return spDealDamage; - } - - /** - *

getDrawback.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility getDrawback() { - final SpellAbility dbDealDamage = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()) { - private static final long serialVersionUID = 7239608350643325111L; - - @Override - public boolean chkAI_Drawback() { - // Make sure there is a valid target - return damageDrawback(this); - } - - @Override - public String getStackDescription() { - return damageStackDescription(AF, this); - } - - @Override - public void resolve() { - doResolve(this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return damageDoTriggerAI(AF, this, mandatory); - } - - }; // Drawback - - return dbDealDamage; - } - - /** - *

damageStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private String damageStackDescription(AbilityFactory af, SpellAbility sa) { - // when damageStackDescription is called, just build exactly what is happening - StringBuilder sb = new StringBuilder(); - String name = af.getHostCard().toString(); - int dmg = getNumDamage(sa); - - ArrayList tgts; - if (sa.getTarget() == null) - tgts = AbilityFactory.getDefinedObjects(sa.getSourceCard(), af.getMapParams().get("Defined"), sa); - else - tgts = sa.getTarget().getTargets(); - - if (!(sa instanceof Ability_Sub)) - sb.append(name).append(" -"); - sb.append(" "); - - String conditionDesc = af.getMapParams().get("ConditionDescription"); - if (conditionDesc != null) - sb.append(conditionDesc).append(" "); - - ArrayList definedSources = AbilityFactory.getDefinedCards(sa.getSourceCard(), af.getMapParams().get("DamageSource"), sa); - Card source = definedSources.get(0); - - if (source != sa.getSourceCard()) - sb.append(source.toString()).append(" deals"); - else - sb.append("Deals"); - - sb.append(" ").append(dmg).append(" damage to "); - - for (int i = 0; i < tgts.size(); i++) { - if (i != 0) - sb.append(" "); - - Object o = tgts.get(i); - if (o instanceof Card || o instanceof Player) - sb.append(o.toString()); - } - - sb.append(". "); - - if (sa.getSubAbility() != null) { - sb.append(sa.getSubAbility().getStackDescription()); - } - - return sb.toString(); - } - - /** - *

getNumDamage.

- * - * @param saMe a {@link forge.card.spellability.SpellAbility} object. - * @return a int. - */ - private int getNumDamage(SpellAbility saMe) { - return AbilityFactory.calculateAmount(saMe.getSourceCard(), damage, saMe); - } - - /** - *

damageDrawback.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private boolean damageDrawback(SpellAbility sa) { - Card source = sa.getSourceCard(); - int dmg; - if (damage.equals("X") && source.getSVar(damage).equals("Count$xPaid")) { - // Set PayX here to maximum value. - dmg = ComputerUtil.determineLeftoverMana(sa); - source.setSVar("PayX", Integer.toString(dmg)); - } else - dmg = getNumDamage(sa); - return damageTargetAI(sa, dmg); - } - - /** - *

doCanPlayAI.

- * - * @param saMe a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private boolean doCanPlayAI(SpellAbility saMe) { - - Cost abCost = AF.getAbCost(); - Card source = saMe.getSourceCard(); - - int dmg = 0; - if (damage.equals("X") && source.getSVar(damage).equals("Count$xPaid")) { - // Set PayX here to maximum value. - dmg = ComputerUtil.determineLeftoverMana(saMe); - source.setSVar("PayX", Integer.toString(dmg)); - } else - dmg = getNumDamage(saMe); - boolean rr = AF.isSpell(); - - // temporarily disabled until better AI - if (abCost.getSacCost() && !abCost.getSacThis() && AllZone.getHumanPlayer().getLife() - dmg > 0) { - //only sacrifice something that's supposed to be sacrificed - String sacType = abCost.getSacType(); - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - typeList = typeList.getValidCards(sacType.split(","), source.getController(), source); - if (ComputerUtil.getCardPreference(source, "SacCost", typeList) == null) - return false; - } - if (AF.getAbCost().getSubCounter()) { - // +1/+1 counters only if damage from this ability would kill the human, otherwise ok - if (AllZone.getHumanPlayer().getLife() - dmg > 0 && AF.getAbCost().getCounterType().equals(Counters.P1P1)) - return false; - } - if (AF.getAbCost().getLifeCost()) { - if (AllZone.getHumanPlayer().getLife() - dmg > 0) // only if damage from this ability would kill the human - return false; - } - - if (source.getName().equals("Stuffy Doll")) { - // Now stuffy sits around for blocking - // TODO(sol): this should also happen if Stuffy is going to die - if (AllZone.getPhase().is(Constant.Phase.End_Of_Turn, AllZone.getHumanPlayer())) - return true; - else - return false; - } - - if (AF.isAbility()) { - Random r = MyRandom.random; // prevent run-away activations - if (r.nextFloat() <= Math.pow(.6667, saMe.getActivationsThisTurn())) - rr = true; - } - - boolean bFlag = damageTargetAI(saMe, dmg); - if (!bFlag) - return false; - - if (damage.equals("X") && source.getSVar(damage).equals("Count$xPaid")) { - // If I can kill my target by paying less mana, do it - Target tgt = saMe.getTarget(); - if (tgt != null) { - int actualPay = 0; - boolean noPrevention = AF.getMapParams().containsKey("NoPrevention"); - ArrayList cards = tgt.getTargetCards(); - for (Card c : cards) { - int adjDamage = c.getEnoughDamageToKill(dmg, source, false, noPrevention); - if (adjDamage > actualPay && adjDamage <= dmg) - actualPay = adjDamage; - } - source.setSVar("PayX", Integer.toString(actualPay)); - } - } - - - Ability_Sub subAb = saMe.getSubAbility(); - if (subAb != null) - rr &= subAb.chkAI_Drawback(); - return rr; - } - - /** - *

shouldTgtP.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param d a int. - * @param noPrevention a boolean. - * @return a boolean. - */ - private boolean shouldTgtP(SpellAbility sa, int d, final boolean noPrevention) { - int restDamage = d; - Player human = AllZone.getHumanPlayer(); - Player comp = AllZone.getComputerPlayer(); - - if (!noPrevention) - restDamage = human.predictDamage(restDamage, AF.getHostCard(), false); - else restDamage = human.staticReplaceDamage(restDamage, AF.getHostCard(), false); - - if (restDamage == 0) return false; - - if (!human.canLoseLife()) return false; - - CardList hand = AllZoneUtil.getPlayerHand(comp); - - if (AF.isSpell()) { - // If this is a spell, cast it instead of discarding - if ((AllZone.getPhase().is(Constant.Phase.End_Of_Turn) || AllZone.getPhase().is(Constant.Phase.Main2)) && - AllZone.getPhase().isPlayerTurn(comp) && (hand.size() > comp.getMaxHandSize())) - return true; - } - - if (human.getLife() - restDamage < 5) // if damage from this spell would drop the human to less than 5 life - return true; - - return false; - } - - /** - *

chooseTgtC.

- * - * @param d a int. - * @param noPrevention a boolean. - * @param pl a {@link forge.Player} object. - * @param mandatory a boolean. - * @return a {@link forge.Card} object. - */ - private Card chooseTgtC(final int d, final boolean noPrevention, final Player pl, final boolean mandatory) { - Target tgt = AF.getAbTgt(); - final Card source = AF.getHostCard(); - CardList hPlay = AllZoneUtil.getPlayerCardsInPlay(pl); - hPlay = hPlay.getValidCards(tgt.getValidTgts(), AllZone.getComputerPlayer(), source); - - ArrayList objects = tgt.getTargets(); - for (Object o : objects) { - if (o instanceof Card) { - Card c = (Card) o; - if (hPlay.contains(c)) - hPlay.remove(c); - } - } - hPlay = hPlay.getTargetableCards(source); - - CardList killables = hPlay.filter(new CardListFilter() { - public boolean addCard(Card c) { - return (c.getEnoughDamageToKill(d, source, false, noPrevention) <= d) - && !ComputerUtil.canRegenerate(c) - && !(c.getSVar("SacMe").length() > 0); - } - }); - - Card targetCard; - if (pl.isHuman() && killables.size() > 0) { - targetCard = CardFactoryUtil.AI_getBestCreature(killables); - - return targetCard; - } - - if (!mandatory) - return null; - - if (hPlay.size() > 0) { - if (pl.isHuman()) - targetCard = CardFactoryUtil.AI_getBestCreature(hPlay); - else - targetCard = CardFactoryUtil.AI_getWorstCreature(hPlay); - - return targetCard; - } - - return null; - } - - /** - *

damageTargetAI.

- * - * @param saMe a {@link forge.card.spellability.SpellAbility} object. - * @param dmg a int. - * @return a boolean. - */ - private boolean damageTargetAI(SpellAbility saMe, int dmg) { - Target tgt = AF.getAbTgt(); - - if (tgt == null) - return damageChooseNontargeted(saMe, dmg); - - return damageChoosingTargets(saMe, tgt, dmg, false); - } - - /** - *

damageChoosingTargets.

- * - * @param saMe a {@link forge.card.spellability.SpellAbility} object. - * @param tgt a {@link forge.card.spellability.Target} object. - * @param dmg a int. - * @param mandatory a boolean. - * @return a boolean. - */ - private boolean damageChoosingTargets(SpellAbility saMe, Target tgt, int dmg, boolean mandatory) { - boolean noPrevention = AF.getMapParams().containsKey("NoPrevention"); - - // target loop - tgt.resetTargets(); - - while (tgt.getNumTargeted() < tgt.getMaxTargets(saMe.getSourceCard(), saMe)) { - // TODO: Consider targeting the planeswalker - if (tgt.canTgtCreatureAndPlayer()) { - - if (shouldTgtP(saMe, dmg, noPrevention)) { - if (tgt.addTarget(AllZone.getHumanPlayer())) - continue; - } - - Card c = chooseTgtC(dmg, noPrevention, AllZone.getHumanPlayer(), mandatory); - if (c != null) { - tgt.addTarget(c); - continue; - } - - // When giving priority to targeting Creatures for mandatory triggers - // feel free to add the Human after we run out of good targets - - // TODO: add check here if card is about to die from something on the stack - // or from taking combat damage - boolean freePing = mandatory || AbilityFactory.playReusable(saMe); - - if (freePing && tgt.addTarget(AllZone.getHumanPlayer())) - continue; - } else if (tgt.canTgtCreature()) { - Card c = chooseTgtC(dmg, noPrevention, AllZone.getHumanPlayer(), mandatory); - if (c != null) { - tgt.addTarget(c); - continue; - } - } - - // TODO: Improve Damage, we shouldn't just target the player just because we can - else if (tgt.canTgtPlayer()) { - if (tgt.addTarget(AllZone.getHumanPlayer())) - continue; - } - // fell through all the choices, no targets left? - if ((tgt.getNumTargeted() < tgt.getMinTargets(saMe.getSourceCard(), saMe) - || tgt.getNumTargeted() == 0)) { - if (!mandatory) { - tgt.resetTargets(); - return false; - } else { - // If the trigger is mandatory, gotta choose my own stuff now - return damageChooseRequiredTargets(saMe, tgt, dmg, mandatory); - } - } else { - // TODO is this good enough? for up to amounts? - break; - } - } - return true; - } - - /** - *

damageChooseNontargeted.

- * - * @param saMe a {@link forge.card.spellability.SpellAbility} object. - * @param dmg a int. - * @return a boolean. - */ - private boolean damageChooseNontargeted(SpellAbility saMe, int dmg) { - // TODO: Improve circumstances where the Defined Damage is unwanted - ArrayList objects = AbilityFactory.getDefinedObjects(saMe.getSourceCard(), AF.getMapParams().get("Defined"), saMe); - - for (Object o : objects) { - if (o instanceof Card) { - //Card c = (Card)o; - } else if (o instanceof Player) { - Player p = (Player) o; - int restDamage = p.predictDamage(dmg, AF.getHostCard(), false); - if (p.isComputer() && p.canLoseLife() && restDamage + 3 >= p.getLife() && restDamage > 0) // Damage from this spell will kill me - return false; - if (p.isHuman() && !p.canLoseLife()) - return false; - } - } - return true; - } - - /** - *

damageChooseRequiredTargets.

- * - * @param saMe a {@link forge.card.spellability.SpellAbility} object. - * @param tgt a {@link forge.card.spellability.Target} object. - * @param dmg a int. - * @param mandatory a boolean. - * @return a boolean. - */ - private boolean damageChooseRequiredTargets(SpellAbility saMe, Target tgt, int dmg, boolean mandatory) { - // this is for Triggered targets that are mandatory - boolean noPrevention = AF.getMapParams().containsKey("NoPrevention"); - - while (tgt.getNumTargeted() < tgt.getMinTargets(saMe.getSourceCard(), saMe)) { - // TODO: Consider targeting the planeswalker - if (tgt.canTgtCreature()) { - Card c = chooseTgtC(dmg, noPrevention, AllZone.getComputerPlayer(), mandatory); - if (c != null) { - tgt.addTarget(c); - continue; - } - } - - if (tgt.canTgtPlayer()) { - if (tgt.addTarget(AllZone.getComputerPlayer())) - continue; - } - - // if we get here then there isn't enough targets, this is the only time we can return false - return false; - } - return true; - } - - /** - *

damageDoTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private boolean damageDoTriggerAI(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa) && !mandatory) - return false; - - Card source = sa.getSourceCard(); - int dmg; - if (damage.equals("X") && source.getSVar(damage).equals("Count$xPaid")) { - // Set PayX here to maximum value. - dmg = ComputerUtil.determineLeftoverMana(sa); - source.setSVar("PayX", Integer.toString(dmg)); - } else - dmg = getNumDamage(sa); - - Target tgt = sa.getTarget(); - if (tgt == null) { - // If it's not mandatory check a few things - if (!mandatory && !damageChooseNontargeted(sa, dmg)) { - return false; - } - } else { - if (!damageChoosingTargets(sa, tgt, dmg, mandatory) && !mandatory) - return false; - - if (damage.equals("X") && source.getSVar(damage).equals("Count$xPaid")) { - // If I can kill my target by paying less mana, do it - int actualPay = 0; - boolean noPrevention = AF.getMapParams().containsKey("NoPrevention"); - ArrayList cards = tgt.getTargetCards(); - for (Card c : cards) { - int adjDamage = c.getEnoughDamageToKill(dmg, source, false, noPrevention); - if (adjDamage > actualPay) - actualPay = adjDamage; - } - - source.setSVar("PayX", Integer.toString(actualPay)); - } - } - - - if (sa.getSubAbility() != null) - return sa.getSubAbility().doTrigger(mandatory); - - return true; - } - - - /** - *

doResolve.

- * - * @param saMe a {@link forge.card.spellability.SpellAbility} object. - */ - private void doResolve(SpellAbility saMe) { - HashMap params = AF.getMapParams(); - - int dmg = getNumDamage(saMe); - - boolean noPrevention = params.containsKey("NoPrevention"); - - ArrayList tgts; - if (saMe.getTarget() == null) - tgts = AbilityFactory.getDefinedObjects(saMe.getSourceCard(), params.get("Defined"), saMe); - else - tgts = saMe.getTarget().getTargets(); - - boolean targeted = (AF.getAbTgt() != null); - - ArrayList definedSources = AbilityFactory.getDefinedCards(saMe.getSourceCard(), params.get("DamageSource"), saMe); - Card source = definedSources.get(0); - - for (Object o : tgts) { - if (o instanceof Card) { - Card c = (Card) o; - if (AllZoneUtil.isCardInPlay(c) && (!targeted || CardFactoryUtil.canTarget(AF.getHostCard(), c))) { - if (noPrevention) - c.addDamageWithoutPrevention(dmg, source); - else - c.addDamage(dmg, source); - } - - } else if (o instanceof Player) { - Player p = (Player) o; - if (!targeted || p.canTarget(saMe)) { - if (noPrevention) - p.addDamageWithoutPrevention(dmg, source); - else - p.addDamage(dmg, source); - } - } - } - } - - // ****************************************************************************************************** - // ***************************** DAMAGEALL ************************************************************** - // ****************************************************************************************************** - /** - *

getAbilityDamageAll.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility getAbilityDamageAll() { - - final SpellAbility abDamageAll = new Ability_Activated(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = -1831356710492849854L; - final AbilityFactory af = AF; - - @Override - public String getStackDescription() { - return damageAllStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return damageAllCanPlayAI(af, this); - } - - @Override - public void resolve() { - damageAllResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return damageAllDoTriggerAI(AF, this, mandatory); - } - - }; - return abDamageAll; - } - - /** - *

getSpellDamageAll.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility getSpellDamageAll() { - final SpellAbility spDamageAll = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = 8004957182752984818L; - final AbilityFactory af = AF; - final HashMap params = af.getMapParams(); - - @Override - public String getStackDescription() { - if (params.containsKey("SpellDescription")) - return AF.getHostCard().getName() + " - " + params.get("SpellDescription"); - else - return damageAllStackDescription(af, this); - } - - public boolean canPlayAI() { - return damageAllCanPlayAI(af, this); - } - - @Override - public void resolve() { - damageAllResolve(af, this); - } - - }; - return spDamageAll; - } - - /** - *

getDrawbackDamageAll.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility getDrawbackDamageAll() { - final SpellAbility dbDamageAll = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()) { - private static final long serialVersionUID = -6169562107675964474L; - final AbilityFactory af = AF; - - @Override - public String getStackDescription() { - return damageAllStackDescription(af, this); - } - - @Override - public void resolve() { - damageAllResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - //check AI life before playing this drawback? - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return damageAllDoTriggerAI(AF, this, mandatory); - } - - }; - return dbDamageAll; - } - - /** - *

damageAllStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private String damageAllStackDescription(final AbilityFactory af, SpellAbility sa) { - StringBuilder sb = new StringBuilder(); - String name = af.getHostCard().getName(); - HashMap params = af.getMapParams(); - String desc = ""; - if (params.containsKey("ValidDescription")) - desc = params.get("ValidDescription"); - int dmg = getNumDamage(sa); - - sb.append(name).append(" - Deals " + dmg + " damage to " + desc); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

damageAllCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private boolean damageAllCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - // AI needs to be expanded, since this function can be pretty complex based on what the expected targets could be - Random r = MyRandom.random; - Cost abCost = sa.getPayCosts(); - final Card source = sa.getSourceCard(); - final HashMap params = af.getMapParams(); - - String validP = ""; - - int dmg; - if (damage.equals("X") && source.getSVar(damage).equals("Count$xPaid")) { - // Set PayX here to maximum value. - dmg = ComputerUtil.determineLeftoverMana(sa); - source.setSVar("PayX", Integer.toString(dmg)); - } else - dmg = getNumDamage(sa); - - if (params.containsKey("ValidPlayers")) - validP = params.get("ValidPlayers"); - - CardList humanList = getKillableCreatures(af, sa, AllZone.getHumanPlayer(), dmg); - CardList computerList = getKillableCreatures(af, sa, AllZone.getComputerPlayer(), dmg); - - Target tgt = af.getAbTgt(); - if (tgt != null) { - tgt.resetTargets(); - sa.getTarget().addTarget(AllZone.getHumanPlayer()); - computerList = new CardList(); - } - - //abCost stuff that should probably be centralized... - if (abCost != null) { - // AI currently disabled for some costs - if (abCost.getSacCost()) { - //OK - } - if (abCost.getLifeCost()) { - if (AllZone.getComputerPlayer().getLife() - abCost.getLifeAmount() < 4) - return false; - } - if (abCost.getDiscardCost()) ; //OK - - if (abCost.getSubCounter()) { - // OK - } - } - - // TODO: if damage is dependant on mana paid, maybe have X be human's max life - //Don't kill yourself - if (validP.contains("Each") - && AllZone.getComputerPlayer().getLife() <= AllZone.getComputerPlayer().predictDamage(dmg, source, false)) - return false; - - //if we can kill human, do it - if ((validP.contains("Each") || validP.contains("EachOpponent")) - && AllZone.getHumanPlayer().getLife() <= AllZone.getHumanPlayer().predictDamage(dmg, source, false)) - return true; - - // prevent run-away activations - first time will always return true - boolean chance = r.nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn()); - - int minGain = 200; //The minimum gain in destroyed creatures - if (sa.getPayCosts().isReusuableResource()) minGain = 100; - // evaluate both lists and pass only if human creatures are more valuable - if (CardFactoryUtil.evaluateCreatureList(computerList) + minGain >= CardFactoryUtil.evaluateCreatureList(humanList)) - return false; - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return ((r.nextFloat() < .6667) && chance); - } - - /** - *

getKillableCreatures.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param player a {@link forge.Player} object. - * @param dmg a int. - * @return a {@link forge.CardList} object. - */ - private CardList getKillableCreatures(final AbilityFactory af, final SpellAbility sa, Player player, final int dmg) { - final HashMap params = af.getMapParams(); - final Card source = af.getHostCard(); - - String validC = ""; - if (params.containsKey("ValidCards")) - validC = params.get("ValidCards"); - - //TODO: X may be something different than X paid - CardList list = AllZoneUtil.getPlayerCardsInPlay(player); - list = list.getValidCards(validC.split(","), source.getController(), source); - - CardListFilter filterKillable = new CardListFilter() { - public boolean addCard(Card c) { - return (c.predictDamage(dmg, source, false) >= c.getKillDamage()); - } - }; - - list = list.getNotKeyword("Indestructible"); - list = list.filter(filterKillable); - - return list; - } - - /** - *

damageAllDoTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private boolean damageAllDoTriggerAI(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa) && !mandatory) - return false; - - final Card source = sa.getSourceCard(); - final HashMap params = af.getMapParams(); - String validP = ""; - - int dmg; - if (damage.equals("X") && source.getSVar(damage).equals("Count$xPaid")) { - // Set PayX here to maximum value. - dmg = ComputerUtil.determineLeftoverMana(sa); - source.setSVar("PayX", Integer.toString(dmg)); - } else - dmg = getNumDamage(sa); - - if (params.containsKey("ValidPlayers")) - validP = params.get("ValidPlayers"); - - Target tgt = sa.getTarget(); - do { // A little trick to still check the SubAbilities, once we know we want to play it - if (tgt == null) { - // If it's not mandatory check a few things - if (mandatory) - return true; - - else { - // Don't get yourself killed - if (validP.contains("Each") - && AllZone.getComputerPlayer().getLife() <= AllZone.getComputerPlayer().predictDamage(dmg, source, false)) - return false; - - //if we can kill human, do it - if ((validP.contains("Each") || validP.contains("EachOpponent") || validP.contains("Targeted")) - && AllZone.getHumanPlayer().getLife() <= AllZone.getHumanPlayer().predictDamage(dmg, source, false)) - break; - - // Evaluate creatures getting killed - CardList humanList = getKillableCreatures(af, sa, AllZone.getHumanPlayer(), dmg); - CardList computerList = getKillableCreatures(af, sa, AllZone.getComputerPlayer(), dmg); - if (CardFactoryUtil.evaluateCreatureList(computerList) + 50 >= CardFactoryUtil.evaluateCreatureList(humanList)) - return false; - } - } else { - // DamageAll doesn't really target right now - } - } while (false); - - - if (sa.getSubAbility() != null) - return sa.getSubAbility().doTrigger(mandatory); - - return true; - } - - /** - *

damageAllResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private void damageAllResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - Card card = sa.getSourceCard(); - - int dmg = getNumDamage(sa); - - Target tgt = af.getAbTgt(); - Player targetPlayer = null; - if (tgt != null) - targetPlayer = tgt.getTargetPlayers().get(0); - - String players = ""; - - if (params.containsKey("ValidPlayers")) - players = params.get("ValidPlayers"); - - CardList list = AllZoneUtil.getCardsInPlay(); - - if (targetPlayer != null) - list = list.getController(targetPlayer); - - list = AbilityFactory.filterListByType(list, params.get("ValidCards"), sa); - - for (Card c : list) c.addDamage(dmg, card); - - if (players.equals("Each")) { - for (Player p : AllZoneUtil.getPlayersInGame()) - p.addDamage(dmg, card); - } else if (players.equals("EachOpponent")) { - for (Player p : AllZoneUtil.getOpponents(card.getController())) p.addDamage(dmg, card); - } else if (players.equals("Self")) - card.getController().addDamage(dmg, card); - else if (players.equals("Targeted")) - targetPlayer.addDamage(dmg, card); - } -} diff --git a/src/forge/card/abilityFactory/AbilityFactory_Debuff.java b/src/forge/card/abilityFactory/AbilityFactory_Debuff.java deleted file mode 100644 index 44df55fc8a9..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_Debuff.java +++ /dev/null @@ -1,729 +0,0 @@ -package forge.card.abilityFactory; - -import forge.*; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.*; - -import java.util.*; - -/** - *

AbilityFactory_Debuff class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_Debuff { - // ************************************************************************* - // ***************************** Debuff ************************************ - // ************************************************************************* - - /** - *

createAbilityDebuff.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityDebuff(final AbilityFactory af) { - final SpellAbility abDebuff = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 3536198601841771383L; - - @Override - public String getStackDescription() { - return debuffStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return debuffCanPlayAI(af, this); - } - - @Override - public void resolve() { - debuffResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return debuffTriggerAI(af, this, mandatory); - } - - }; - return abDebuff; - } - - /** - *

createSpellDebuff.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellDebuff(final AbilityFactory af) { - final SpellAbility spDebuff = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -54573740774322697L; - - @Override - public String getStackDescription() { - return debuffStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return debuffCanPlayAI(af, this); - } - - @Override - public void resolve() { - debuffResolve(af, this); - } - - }; - return spDebuff; - } - - /** - *

createDrawbackDebuff.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackDebuff(final AbilityFactory af) { - final SpellAbility dbDebuff = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = -4728590185604233229L; - - @Override - public String getStackDescription() { - return debuffStackDescription(af, this); - } - - @Override - public void resolve() { - debuffResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return debuffDrawbackAI(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return debuffTriggerAI(af, this, mandatory); - } - - }; - return dbDebuff; - } - - /** - *

getKeywords.

- * - * @param params a {@link java.util.HashMap} object. - * @return a {@link java.util.ArrayList} object. - */ - private static ArrayList getKeywords(HashMap params) { - ArrayList kws = new ArrayList(); - if (params.containsKey("Keywords")) { - kws.addAll(Arrays.asList(params.get("Keywords").split(" & "))); - } - return kws; - } - - /** - *

debuffStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String debuffStackDescription(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - Card host = af.getHostCard(); - ArrayList kws = getKeywords(params); - StringBuilder sb = new StringBuilder(); - - ArrayList tgtCards; - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else - tgtCards = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa); - - if (tgtCards.size() > 0) { - if (sa instanceof Ability_Sub) - sb.append(" "); - else - sb.append(host).append(" - "); - - Iterator it = tgtCards.iterator(); - while (it.hasNext()) { - Card tgtC = it.next(); - if (tgtC.isFaceDown()) sb.append("Morph"); - else sb.append(tgtC); - - if (it.hasNext()) sb.append(" "); - } - sb.append(" loses "); - /* - Iterator kwit = kws.iterator(); - while(it.hasNext()) { - String kw = kwit.next(); - sb.append(kw); - if(it.hasNext()) sb.append(" "); - }*/ - sb.append(kws); - if (!params.containsKey("Permanent")) { - sb.append(" until end of turn"); - } - sb.append("."); - } - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

debuffCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean debuffCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - // if there is no target and host card isn't in play, don't activate - if (af.getAbTgt() == null && !AllZoneUtil.isCardInPlay(af.getHostCard())) - return false; - - // temporarily disabled until AI is improved - if (af.getAbCost().getSacCost() && sa.getSourceCard().isCreature()) return false; - if (af.getAbCost().getLifeCost()) { - return false; - } - if (af.getAbCost().getSubCounter()) { - // instead of never removing counters, we will have a random possibility of failure. - // all the other tests still need to pass if a counter will be removed - Counters count = af.getAbCost().getCounterType(); - double chance = .66; - if (count.equals(Counters.P1P1)) { // 10% chance to remove +1/+1 to pump - chance = .1; - } else if (count.equals(Counters.CHARGE)) { // 50% chance to remove charge to pump - chance = .5; - } - Random r = MyRandom.random; - if (r.nextFloat() > chance) - return false; - } - - HashMap params = af.getMapParams(); - SpellAbility_Restriction restrict = sa.getRestrictions(); - - // Phase Restrictions - if (AllZone.getStack().size() == 0 && AllZone.getPhase().isBefore(Constant.Phase.Combat_Begin)) { - // Instant-speed pumps should not be cast outside of combat when the stack is empty - if (!AbilityFactory.isSorcerySpeed(sa)) - return false; - } - - int activations = restrict.getNumberTurnActivations(); - int sacActivations = restrict.getActivationNumberSacrifice(); - //don't risk sacrificing a creature just to pump it - if (sacActivations != -1 && activations >= (sacActivations - 1)) { - return false; - } - - if (af.getAbTgt() == null || !af.getAbTgt().doesTarget()) { - ArrayList cards = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa); - if (cards.size() == 0) - return false; - } else - return debuffTgtAI(af, sa, getKeywords(params), false); - - return false; - } - - /** - *

debuffDrawbackAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean debuffDrawbackAI(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - if (af.getAbTgt() == null || !af.getAbTgt().doesTarget()) { - //TODO - copied from AF_Pump.pumpDrawbackAI() - what should be here? - } else - return debuffTgtAI(af, sa, getKeywords(params), false); - - return true; - }//debuffDrawbackAI() - - /** - *

debuffTgtAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param kws a {@link java.util.ArrayList} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean debuffTgtAI(AbilityFactory af, SpellAbility sa, ArrayList kws, boolean mandatory) { - //this would be for evasive things like Flying, Unblockable, etc - if (!mandatory && AllZone.getPhase().isAfter(Constant.Phase.Combat_Declare_Blockers_InstantAbility)) - return false; - - Target tgt = af.getAbTgt(); - tgt.resetTargets(); - CardList list = getCurseCreatures(af, sa, kws); - list = list.getValidCards(tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getSourceCard()); - - //several uses here: - //1. make human creatures lose evasion when they are attacking - //2. make human creatures lose Flying/Horsemanship/Shadow/etc. when Comp is attacking - //3. remove Indestructible keyword so it can be destroyed? - //3a. remove Persist? - - if (list.isEmpty()) - return mandatory && debuffMandatoryTarget(af, sa, mandatory); - - while (tgt.getNumTargeted() < tgt.getMaxTargets(sa.getSourceCard(), sa)) { - Card t = null; - //boolean goodt = false; - - if (list.isEmpty()) { - if (tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa) || tgt.getNumTargeted() == 0) { - if (mandatory) - return debuffMandatoryTarget(af, sa, mandatory); - - tgt.resetTargets(); - return false; - } else { - // TODO is this good enough? for up to amounts? - break; - } - } - - t = CardFactoryUtil.AI_getBestCreature(list); - tgt.addTarget(t); - list.remove(t); - } - - return true; - }//pumpTgtAI() - - /** - *

getCurseCreatures.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param kws a {@link java.util.ArrayList} object. - * @return a {@link forge.CardList} object. - */ - private static CardList getCurseCreatures(AbilityFactory af, SpellAbility sa, final ArrayList kws) { - Card hostCard = af.getHostCard(); - CardList list = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer()); - list = list.filter(AllZoneUtil.getCanTargetFilter(hostCard)); - - if (!list.isEmpty()) { - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.hasAnyKeyword(kws); // don't add duplicate negative keywords - } - }); - } - - return list; - }//getCurseCreatures() - - /** - *

debuffMandatoryTarget.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean debuffMandatoryTarget(AbilityFactory af, SpellAbility sa, boolean mandatory) { - CardList list = AllZoneUtil.getCardsInPlay(); - Target tgt = sa.getTarget(); - list = list.getValidCards(tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getSourceCard()); - - if (list.size() < tgt.getMinTargets(sa.getSourceCard(), sa)) { - tgt.resetTargets(); - return false; - } - - // Remove anything that's already been targeted - for (Card c : tgt.getTargetCards()) - list.remove(c); - - CardList pref = list.getController(AllZone.getHumanPlayer()); - CardList forced = list.getController(AllZone.getComputerPlayer()); - Card source = sa.getSourceCard(); - - while (tgt.getNumTargeted() < tgt.getMaxTargets(source, sa)) { - if (pref.isEmpty()) - break; - - Card c; - if (pref.getNotType("Creature").size() == 0) - c = CardFactoryUtil.AI_getBestCreature(pref); - else - c = CardFactoryUtil.AI_getMostExpensivePermanent(pref, source, true); - - pref.remove(c); - - tgt.addTarget(c); - } - - while (tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) { - if (forced.isEmpty()) - break; - - //TODO - if forced targeting, just pick something without the given keyword - Card c; - if (forced.getNotType("Creature").size() == 0) - c = CardFactoryUtil.AI_getWorstCreature(forced); - else - c = CardFactoryUtil.AI_getCheapestPermanent(forced, source, true); - - forced.remove(c); - - tgt.addTarget(c); - } - - if (tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) { - tgt.resetTargets(); - return false; - } - - return true; - }//pumpMandatoryTarget() - - /** - *

debuffTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean debuffTriggerAI(final AbilityFactory af, final SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) - return false; - - HashMap params = af.getMapParams(); - - ArrayList kws = getKeywords(params); - - if (sa.getTarget() == null) { - if (mandatory) - return true; - } else { - return debuffTgtAI(af, sa, kws, mandatory); - } - - return true; - } - - /** - *

debuffResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void debuffResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - Card host = af.getHostCard(); - - ArrayList kws = getKeywords(params); - - ArrayList tgtCards; - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else - tgtCards = AbilityFactory.getDefinedCards(host, params.get("Defined"), sa); - - for (final Card tgtC : tgtCards) { - final ArrayList hadIntrinsic = new ArrayList(); - if (AllZoneUtil.isCardInPlay(tgtC) && CardFactoryUtil.canTarget(host, tgtC)) { - for (String kw : kws) { - if (tgtC.getIntrinsicKeyword().contains(kw)) hadIntrinsic.add(kw); - tgtC.removeIntrinsicKeyword(kw); - tgtC.removeExtrinsicKeyword(kw); - } - } - if (!params.containsKey("Permanent")) { - AllZone.getEndOfTurn().addUntil(new Command() { - private static final long serialVersionUID = 5387486776282932314L; - - public void execute() { - if (AllZoneUtil.isCardInPlay(tgtC)) { - for (String kw : hadIntrinsic) { - tgtC.addIntrinsicKeyword(kw); - } - } - } - }); - } - } - - }//debuffResolve - - - // ************************************************************************* - // ***************************** DebuffAll ********************************* - // ************************************************************************* - - /** - *

createAbilityDebuffAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public static SpellAbility createAbilityDebuffAll(final AbilityFactory af) { - final SpellAbility abDebuffAll = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -1977027530713097149L; - - @Override - public boolean canPlayAI() { - return debuffAllCanPlayAI(af, this); - } - - @Override - public String getStackDescription() { - return debuffAllStackDescription(af, this); - } - - @Override - public void resolve() { - debuffAllResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return debuffAllTriggerAI(af, this, mandatory); - } - - };//SpellAbility - - return abDebuffAll; - } - - /** - *

createSpellDebuffAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public static SpellAbility createSpellDebuffAll(final AbilityFactory af) { - SpellAbility spDebuffAll = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 399707924254248213L; - - @Override - public boolean canPlayAI() { - return debuffAllCanPlayAI(af, this); - } - - @Override - public String getStackDescription() { - return debuffAllStackDescription(af, this); - } - - @Override - public void resolve() { - debuffAllResolve(af, this); - } - };//SpellAbility - - return spDebuffAll; - } - - /** - *

createDrawbackDebuffAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public static SpellAbility createDrawbackDebuffAll(final AbilityFactory af) { - SpellAbility dbDebuffAll = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = 3262199296469706708L; - - @Override - public String getStackDescription() { - return debuffAllStackDescription(af, this); - } - - @Override - public void resolve() { - debuffAllResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return debuffAllChkDrawbackAI(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return debuffAllTriggerAI(af, this, mandatory); - } - };//SpellAbility - - return dbDebuffAll; - } - - /** - *

debuffAllCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean debuffAllCanPlayAI(final AbilityFactory af, SpellAbility sa) { - String valid = ""; - Random r = MyRandom.random; - final Card source = sa.getSourceCard(); - Card hostCard = af.getHostCard(); - HashMap params = af.getMapParams(); - - boolean chance = r.nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn()); //to prevent runaway activations - - if (params.containsKey("ValidCards")) { - valid = params.get("ValidCards"); - } - - CardList comp = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - comp = comp.getValidCards(valid, hostCard.getController(), hostCard); - CardList human = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - human = human.getValidCards(valid, hostCard.getController(), hostCard); - - //TODO - add blocking situations here also - - //only count creatures that can attack - human = human.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CombatUtil.canAttack(c); - } - }); - - //don't use DebuffAll after Combat_Begin until AI is improved - if (AllZone.getPhase().isAfter(Constant.Phase.Combat_Begin)) - return false; - - if (comp.size() > human.size()) - return false; - - return (r.nextFloat() < .6667) && chance; - }//debuffAllCanPlayAI() - - /** - *

debuffAllResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void debuffAllResolve(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - Card hostCard = af.getHostCard(); - ArrayList kws = getKeywords(params); - String valid = ""; - - if (params.containsKey("ValidCards")) - valid = params.get("ValidCards"); - - CardList list = AllZoneUtil.getCardsInPlay(); - list = list.getValidCards(valid.split(","), hostCard.getController(), hostCard); - - for (final Card tgtC : list) { - final ArrayList hadIntrinsic = new ArrayList(); - if (AllZoneUtil.isCardInPlay(tgtC) && CardFactoryUtil.canTarget(hostCard, tgtC)) { - for (String kw : kws) { - if (tgtC.getIntrinsicKeyword().contains(kw)) hadIntrinsic.add(kw); - tgtC.removeIntrinsicKeyword(kw); - tgtC.removeExtrinsicKeyword(kw); - } - } - if (!params.containsKey("Permanent")) { - AllZone.getEndOfTurn().addUntil(new Command() { - private static final long serialVersionUID = 7486231071095628674L; - - public void execute() { - if (AllZoneUtil.isCardInPlay(tgtC)) { - for (String kw : hadIntrinsic) { - tgtC.addIntrinsicKeyword(kw); - } - } - } - }); - } - } - }//debuffAllResolve() - - /** - *

debuffAllTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean debuffAllTriggerAI(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) - return false; - - return true; - } - - /** - *

debuffAllChkDrawbackAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean debuffAllChkDrawbackAI(AbilityFactory af, SpellAbility sa) { - return true; - } - - /** - *

debuffAllStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String debuffAllStackDescription(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - StringBuilder sb = new StringBuilder(); - - String desc = ""; - if (params.containsKey("SpellDescription")) { - desc = params.get("SpellDescription"); - } else if (params.containsKey("DebuffAllDescription")) { - desc = params.get("DebuffAllDescription"); - } - - if (sa instanceof Ability_Sub) - sb.append(" "); - else - sb.append(sa.getSourceCard()).append(" - "); - - sb.append(desc); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - }//debuffAllStackDescription() - -}//end class AbilityFactory_Debuff diff --git a/src/forge/card/abilityFactory/AbilityFactory_DelayedTrigger.java b/src/forge/card/abilityFactory/AbilityFactory_DelayedTrigger.java deleted file mode 100644 index a2ac5243c05..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_DelayedTrigger.java +++ /dev/null @@ -1,226 +0,0 @@ -package forge.card.abilityFactory; - -import forge.AllZone; -import forge.card.spellability.Ability_Activated; -import forge.card.spellability.Ability_Sub; -import forge.card.spellability.Spell; -import forge.card.spellability.SpellAbility; -import forge.card.trigger.Trigger; -import forge.card.trigger.TriggerHandler; - -import java.util.HashMap; - -/** - * Created by IntelliJ IDEA. - * User: Administrator - * Date: 5/18/11 - * Time: 8:53 PM - * To change this template use File | Settings | File Templates. - * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_DelayedTrigger { - /** Constant tempCreator */ - private static AbilityFactory tempCreator = new AbilityFactory(); - - /** - *

getAbility.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public static SpellAbility getAbility(final AbilityFactory af) { - final SpellAbility ability = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -7502962478028160305L; - - @Override - public boolean canPlayAI() { - return delTrigCanPlayAI(af, this); - } - - @Override - public void resolve() { - doResolve(af, this); - } - - @Override - public String getStackDescription() { - return delTrigStackDescription(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return doTriggerAI(af, this, mandatory); - } - }; - return ability; - } - - /** - *

getSpell.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public static SpellAbility getSpell(final AbilityFactory af) { - final SpellAbility spell = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -6981410664429186904L; - - @Override - public boolean canPlayAI() { - return delTrigCanPlayAI(af, this); - } - - @Override - public void resolve() { - doResolve(af, this); - } - - @Override - public String getStackDescription() { - return delTrigStackDescription(af, this); - } - }; - return spell; - } - - /** - *

getDrawback.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.Ability_Sub} object. - */ - public static Ability_Sub getDrawback(final AbilityFactory AF) { - final Ability_Sub drawback = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()) { - private static final long serialVersionUID = 6192972525033429820L; - - @Override - public boolean chkAI_Drawback() { - return doChkAI_Drawback(AF, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return doTriggerAI(AF, this, mandatory); - } - - @Override - public void resolve() { - doResolve(AF, this); - } - }; - - return drawback; - } - - /** - *

doChkAI_Drawback.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param SA a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean doChkAI_Drawback(final AbilityFactory AF, final SpellAbility SA) { - HashMap params = AF.getMapParams(); - String svarName = params.get("Execute"); - SpellAbility trigsa = tempCreator.getAbility(AF.getHostCard().getSVar(svarName), AF.getHostCard()); - - if (trigsa instanceof Ability_Sub) { - return ((Ability_Sub) trigsa).chkAI_Drawback(); - } else { - return trigsa.canPlayAI(); - } - } - - /** - *

doTriggerAI.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param SA a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean doTriggerAI(final AbilityFactory AF, final SpellAbility SA, boolean mandatory) { - HashMap params = AF.getMapParams(); - String svarName = params.get("Execute"); - SpellAbility trigsa = tempCreator.getAbility(AF.getHostCard().getSVar(svarName), AF.getHostCard()); - - if (!params.containsKey("OptionalDecider")) { - return trigsa.doTrigger(true); - } else { - return trigsa.doTrigger(!params.get("OptionalDecider").equals("You")); - } - } - - /** - *

delTrigCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean delTrigCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - String svarName = params.get("Execute"); - SpellAbility trigsa = tempCreator.getAbility(af.getHostCard().getSVar(svarName), af.getHostCard()); - - return trigsa.canPlayAI(); - } - - /** - *

delTrigStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static String delTrigStackDescription(AbilityFactory af, SpellAbility sa) { - HashMap mapParams = af.getMapParams(); - - StringBuilder sb = new StringBuilder(); - - if (sa instanceof Ability_Sub) - sb.append(" "); - else - sb.append(sa.getSourceCard()).append(" - "); - - - if(mapParams.containsKey("SpellDescription")) { - sb.append(mapParams.get("SpellDescription")); - } - else if(mapParams.containsKey("TriggerDescription")) { - sb.append(mapParams.get("TriggerDescription")); - } - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - - } - - /** - *

doResolve.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param SA a {@link forge.card.spellability.SpellAbility} object. - */ - private static void doResolve(AbilityFactory AF, SpellAbility SA) { - HashMap mapParams = AF.getMapParams(); - - if (mapParams.containsKey("Cost")) - mapParams.remove("Cost"); - - if (mapParams.containsKey("SpellDescription")) { - mapParams.put("TriggerDescription", mapParams.get("SpellDescription")); - mapParams.remove("SpellDescription"); - } - - Trigger delTrig = TriggerHandler.parseTrigger(mapParams, AF.getHostCard()); - - AllZone.getTriggerHandler().registerDelayedTrigger(delTrig); - } -} diff --git a/src/forge/card/abilityFactory/AbilityFactory_Destroy.java b/src/forge/card/abilityFactory/AbilityFactory_Destroy.java deleted file mode 100644 index b9afee330db..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_Destroy.java +++ /dev/null @@ -1,687 +0,0 @@ -package forge.card.abilityFactory; - -import forge.*; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.*; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Random; - -/** - *

AbilityFactory_Destroy class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_Destroy { - // An AbilityFactory subclass for destroying permanents - // ********************************************************************************* - // ************************** DESTROY ********************************************** - // ********************************************************************************* - /** - *

createAbilityDestroy.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityDestroy(final AbilityFactory af) { - final SpellAbility abDestroy = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -4153613567150919283L; - - @Override - public String getStackDescription() { - return destroyStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return destroyCanPlayAI(af, this); - } - - @Override - public void resolve() { - destroyResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return destroyDoTriggerAI(af, this, mandatory); - } - - }; - return abDestroy; - } - - /** - *

createSpellDestroy.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellDestroy(final AbilityFactory af) { - final SpellAbility spDestroy = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -317810567632846523L; - - @Override - public String getStackDescription() { - return destroyStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return destroyCanPlayAI(af, this); - } - - @Override - public void resolve() { - destroyResolve(af, this); - } - - }; - return spDestroy; - } - - /** - *

createDrawbackDestroy.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.Ability_Sub} object. - */ - public static Ability_Sub createDrawbackDestroy(final AbilityFactory af) { - final Ability_Sub dbDestroy = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = -4153613567150919283L; - - @Override - public String getStackDescription() { - return destroyStackDescription(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return false; - } - - @Override - public void resolve() { - destroyResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return destroyDoTriggerAI(af, this, mandatory); - } - }; - return dbDestroy; - } - - /** - *

destroyCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean destroyCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - // AI needs to be expanded, since this function can be pretty complex based on what the expected targets could be - Random r = MyRandom.random; - Cost abCost = sa.getPayCosts(); - Target abTgt = sa.getTarget(); - final Card source = sa.getSourceCard(); - HashMap params = af.getMapParams(); - final boolean noRegen = params.containsKey("NoRegen"); - - CardList list; - list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - list = list.getTargetableCards(source); - - if (abTgt != null) { - list = list.getValidCards(abTgt.getValidTgts(), source.getController(), source); - list = list.getNotKeyword("Indestructible"); - - // If NoRegen is not set, filter out creatures that have a regeneration shield - if (!noRegen) { - // TODO: filter out things that could regenerate in response? might be tougher? - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return (c.getShield() == 0 && !ComputerUtil.canRegenerate(c)); - } - }); - } - - if (list.size() == 0) - return false; - } - - if (abCost != null) { - // AI currently disabled for some costs - if (abCost.getSacCost() && !abCost.getSacThis()) { - //only sacrifice something that's supposed to be sacrificed - String sacType = abCost.getSacType(); - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - typeList = typeList.getValidCards(sacType.split(","), source.getController(), source); - if (ComputerUtil.getCardPreference(source, "SacCost", typeList) == null) - return false; - } - if (abCost.getLifeCost()) { - if (AllZone.getComputerPlayer().getLife() - abCost.getLifeAmount() < 4) - return false; - } - if (abCost.getDiscardCost()) return false; - - if (abCost.getSubCounter()) { - // OK - } - } - - // prevent run-away activations - first time will always return true - boolean chance = r.nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn()); - - // Targeting - if (abTgt != null) { - abTgt.resetTargets(); - // target loop - while (abTgt.getNumTargeted() < abTgt.getMaxTargets(sa.getSourceCard(), sa)) { - if (list.size() == 0) { - if (abTgt.getNumTargeted() < abTgt.getMinTargets(sa.getSourceCard(), sa) || abTgt.getNumTargeted() == 0) { - abTgt.resetTargets(); - return false; - } else { - // TODO is this good enough? for up to amounts? - break; - } - } - - Card choice = null; - if (list.getNotType("Creature").size() == 0) - choice = CardFactoryUtil.AI_getBestCreature(list); //if the targets are only creatures, take the best - else - choice = CardFactoryUtil.AI_getMostExpensivePermanent(list, af.getHostCard(), true); - - if (choice == null) { // can't find anything left - if (abTgt.getNumTargeted() < abTgt.getMinTargets(sa.getSourceCard(), sa) || abTgt.getNumTargeted() == 0) { - abTgt.resetTargets(); - return false; - } else { - // TODO is this good enough? for up to amounts? - break; - } - } - list.remove(choice); - abTgt.addTarget(choice); - } - - } else { - return false; - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return ((r.nextFloat() < .6667) && chance); - } - - /** - *

destroyDoTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean destroyDoTriggerAI(final AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) - return false; - - Target tgt = sa.getTarget(); - final Card source = sa.getSourceCard(); - HashMap params = af.getMapParams(); - final boolean noRegen = params.containsKey("NoRegen"); - - - if (tgt != null) { - CardList list; - list = AllZoneUtil.getCardsInPlay(); - list = list.getTargetableCards(source); - list = list.getValidCards(tgt.getValidTgts(), source.getController(), source); - - if (list.size() == 0 || list.size() < tgt.getMinTargets(sa.getSourceCard(), sa)) - return false; - - tgt.resetTargets(); - - CardList preferred = list.getNotKeyword("Indestructible"); - preferred = list.getController(AllZone.getHumanPlayer()); - - // If NoRegen is not set, filter out creatures that have a regeneration shield - if (!noRegen) { - // TODO: filter out things that could regenerate in response? might be tougher? - preferred = preferred.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getShield() == 0; - } - }); - } - - for (Card c : preferred) - list.remove(c); - - while (tgt.getNumTargeted() < tgt.getMaxTargets(sa.getSourceCard(), sa)) { - if (preferred.size() == 0) { - if (tgt.getNumTargeted() == 0 || tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) { - if (!mandatory) { - tgt.resetTargets(); - return false; - } else - break; - } else { - break; - } - } else { - Card c; - if (preferred.getNotType("Creature").size() == 0) { - c = CardFactoryUtil.AI_getBestCreature(preferred); - } else if (preferred.getNotType("Land").size() == 0) { - c = CardFactoryUtil.AI_getBestLand(preferred); - } else { - c = CardFactoryUtil.AI_getMostExpensivePermanent(preferred, source, false); - } - tgt.addTarget(c); - preferred.remove(c); - } - } - - while (tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) { - if (list.size() == 0) { - break; - } else { - Card c; - if (list.getNotType("Creature").size() == 0) { - c = CardFactoryUtil.AI_getWorstCreature(list); - } else { - c = CardFactoryUtil.AI_getCheapestPermanent(list, source, false); - } - tgt.addTarget(c); - list.remove(c); - } - } - - if (tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) - return false; - } else { - if (!mandatory) - return false; - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - return subAb.doTrigger(mandatory); - - return true; - } - - /** - *

destroyStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String destroyStackDescription(final AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - final boolean noRegen = params.containsKey("NoRegen"); - StringBuilder sb = new StringBuilder(); - Card host = af.getHostCard(); - - String conditionDesc = params.get("ConditionDescription"); - if (conditionDesc != null) - sb.append(conditionDesc).append(" "); - - ArrayList tgtCards; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else { - tgtCards = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa); - } - - if (sa instanceof Ability_Sub) - sb.append(" "); - else - sb.append(host).append(" - "); - - sb.append("Destroy "); - - Iterator it = tgtCards.iterator(); - while (it.hasNext()) { - Card tgtC = it.next(); - if (tgtC.isFaceDown()) sb.append("Morph ").append("(").append(tgtC.getUniqueNumber()).append(")"); - else sb.append(tgtC); - - if (it.hasNext()) sb.append(", "); - } - - if (noRegen) { - sb.append(". "); - if (tgtCards.size() == 1) - sb.append("It"); - else - sb.append("They"); - sb.append(" can't be regenerated"); - } - sb.append("."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

destroyResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void destroyResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - - final boolean noRegen = params.containsKey("NoRegen"); - Card card = sa.getSourceCard(); - - ArrayList tgtCards; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else { - tgtCards = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa); - } - - for (Card tgtC : tgtCards) { - if (AllZoneUtil.isCardInPlay(tgtC) && (tgt == null || CardFactoryUtil.canTarget(card, tgtC))) { - if (noRegen) - AllZone.getGameAction().destroyNoRegeneration(tgtC); - else - AllZone.getGameAction().destroy(tgtC); - } - } - } - - // ********************************************************************************* - // ************************ DESTROY ALL ******************************************** - // ********************************************************************************* - /** - *

createAbilityDestroyAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityDestroyAll(final AbilityFactory af) { - - final SpellAbility abDestroyAll = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -1376444173137861437L; - - final HashMap params = af.getMapParams(); - final boolean noRegen = params.containsKey("NoRegen"); - - @Override - public String getStackDescription() { - return destroyAllStackDescription(af, this, noRegen); - } - - @Override - public boolean canPlayAI() { - return destroyAllCanPlayAI(af, this, noRegen); - } - - @Override - public void resolve() { - destroyAllResolve(af, this, noRegen); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return destroyAllCanPlayAI(af, this, noRegen); - } - - }; - return abDestroyAll; - } - - /** - *

createSpellDestroyAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellDestroyAll(final AbilityFactory af) { - final SpellAbility spDestroyAll = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -3712659336576469102L; - - final HashMap params = af.getMapParams(); - final boolean noRegen = params.containsKey("NoRegen"); - - @Override - public String getStackDescription() { - if (params.containsKey("SpellDescription")) - return af.getHostCard().getName() + " - " + params.get("SpellDescription"); - else - return destroyAllStackDescription(af, this, noRegen); - } - - @Override - public boolean canPlayAI() { - return destroyAllCanPlayAI(af, this, noRegen); - } - - @Override - public void resolve() { - destroyAllResolve(af, this, noRegen); - } - - }; - return spDestroyAll; - } - - /** - *

createDrawbackDestroyAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackDestroyAll(final AbilityFactory af) { - final SpellAbility dbDestroyAll = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = -242160421677518351L; - - final HashMap params = af.getMapParams(); - final boolean noRegen = params.containsKey("NoRegen"); - - @Override - public String getStackDescription() { - if (params.containsKey("SpellDescription")) - return af.getHostCard().getName() + " - " + params.get("SpellDescription"); - else - return destroyAllStackDescription(af, this, noRegen); - } - - @Override - public void resolve() { - destroyAllResolve(af, this, noRegen); - } - - @Override - public boolean chkAI_Drawback() { - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - // TODO Auto-generated method stub - return false; - } - - }; - return dbDestroyAll; - } - - /** - *

destroyAllStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param noRegen a boolean. - * @return a {@link java.lang.String} object. - */ - private static String destroyAllStackDescription(final AbilityFactory af, SpellAbility sa, boolean noRegen) { - - StringBuilder sb = new StringBuilder(); - String name = af.getHostCard().getName(); - HashMap params = af.getMapParams(); - - String conditionDesc = params.get("ConditionDescription"); - if (conditionDesc != null) - sb.append(conditionDesc).append(" "); - - ArrayList tgtCards; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else { - tgtCards = new ArrayList(); - tgtCards.add(sa.getSourceCard()); - } - - sb.append(name).append(" - Destroy permanents."); - - if (noRegen) sb.append(" They can't be regenerated"); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

destroyAllCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param noRegen a boolean. - * @return a boolean. - */ - private static boolean destroyAllCanPlayAI(final AbilityFactory af, final SpellAbility sa, final boolean noRegen) { - // AI needs to be expanded, since this function can be pretty complex based on what the expected targets could be - Random r = MyRandom.random; - Cost abCost = sa.getPayCosts(); - final Card source = sa.getSourceCard(); - final HashMap params = af.getMapParams(); - String Valid = ""; - - if (params.containsKey("ValidCards")) - Valid = params.get("ValidCards"); - - if (Valid.contains("X") && source.getSVar("X").equals("Count$xPaid")) { - // Set PayX here to maximum value. - int xPay = ComputerUtil.determineLeftoverMana(sa); - source.setSVar("PayX", Integer.toString(xPay)); - Valid = Valid.replace("X", Integer.toString(xPay)); - } - - CardList humanlist = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - CardList computerlist = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - - humanlist = humanlist.getValidCards(Valid.split(","), source.getController(), source); - computerlist = computerlist.getValidCards(Valid.split(","), source.getController(), source); - - humanlist = humanlist.getNotKeyword("Indestructible"); - computerlist = computerlist.getNotKeyword("Indestructible"); - - if (abCost != null) { - // AI currently disabled for some costs - if (abCost.getSacCost()) { - //OK - } - if (abCost.getLifeCost()) { - if (AllZone.getComputerPlayer().getLife() - abCost.getLifeAmount() < 4) - return false; - } - if (abCost.getDiscardCost()) ;//OK - - if (abCost.getSubCounter()) { - // OK - } - } - - // prevent run-away activations - first time will always return true - boolean chance = r.nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn()); - - // if only creatures are affected evaluate both lists and pass only if human creatures are more valuable - if (humanlist.getNotType("Creature").size() == 0 && computerlist.getNotType("Creature").size() == 0) { - if (CardFactoryUtil.evaluateCreatureList(computerlist) + 200 >= CardFactoryUtil.evaluateCreatureList(humanlist)) - return false; - }//only lands involved - else if (humanlist.getNotType("Land").size() == 0 && computerlist.getNotType("Land").size() == 0) { - if (CardFactoryUtil.evaluatePermanentList(computerlist) + 1 >= CardFactoryUtil.evaluatePermanentList(humanlist)) - return false; - } // otherwise evaluate both lists by CMC and pass only if human permanents are more valuable - else if (CardFactoryUtil.evaluatePermanentList(computerlist) + 3 >= CardFactoryUtil.evaluatePermanentList(humanlist)) - return false; - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return ((r.nextFloat() < .9667) && chance); - } - - /** - *

destroyAllResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param noRegen a boolean. - */ - private static void destroyAllResolve(final AbilityFactory af, final SpellAbility sa, final boolean noRegen) { - HashMap params = af.getMapParams(); - - Card card = sa.getSourceCard(); - - String Valid = ""; - - if (params.containsKey("ValidCards")) - Valid = params.get("ValidCards"); - - // Ugh. If calculateAmount needs to be called with DestroyAll it _needs_ to use the X variable - // We really need a better solution to this - if (Valid.contains("X")) - Valid = Valid.replace("X", Integer.toString(AbilityFactory.calculateAmount(card, "X", sa))); - - CardList list = AllZoneUtil.getCardsInPlay(); - - list = AbilityFactory.filterListByType(list, Valid, sa); - - boolean remDestroyed = params.containsKey("RememberDestroyed"); - if (remDestroyed) - card.clearRemembered(); - - if (noRegen) { - for (int i = 0; i < list.size(); i++) - if (AllZone.getGameAction().destroyNoRegeneration(list.get(i)) && remDestroyed) - card.addRemembered(list.get(i)); - } else { - for (int i = 0; i < list.size(); i++) - if (AllZone.getGameAction().destroy(list.get(i)) && remDestroyed) - card.addRemembered(list.get(i)); - } - } - -}//end class AbilityFactory_Destroy diff --git a/src/forge/card/abilityFactory/AbilityFactory_Effect.java b/src/forge/card/abilityFactory/AbilityFactory_Effect.java deleted file mode 100644 index 0fc208458b1..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_Effect.java +++ /dev/null @@ -1,340 +0,0 @@ -package forge.card.abilityFactory; - -import forge.*; -import forge.card.spellability.*; -import forge.card.trigger.Trigger; -import forge.card.trigger.TriggerHandler; - -import java.util.HashMap; -import java.util.Random; - -/** - *

AbilityFactory_Effect class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_Effect { - /** - *

createAbilityEffect.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityEffect(final AbilityFactory AF) { - - final SpellAbility abEffect = new Ability_Activated(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = 8869422603616247307L; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - return effectStackDescription(af, this); - } - - public boolean canPlayAI() { - return effectCanPlayAI(af, this); - } - - @Override - public void resolve() { - effectResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return effectDoTriggerAI(af, this, mandatory); - } - - }; - return abEffect; - } - - /** - *

createSpellEffect.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellEffect(final AbilityFactory AF) { - final SpellAbility spEffect = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = 6631124959690157874L; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - return effectStackDescription(af, this); - } - - public boolean canPlayAI() { - return effectCanPlayAI(af, this); - } - - @Override - public void resolve() { - effectResolve(af, this); - } - - }; - return spEffect; - } - - /** - *

createDrawbackEffect.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackEffect(final AbilityFactory AF) { - final SpellAbility dbEffect = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()) { - private static final long serialVersionUID = 6631124959690157874L; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - return effectStackDescription(af, this); - } - - public boolean canPlayAI() { - return effectCanPlayAI(af, this); - } - - @Override - public void resolve() { - effectResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return effectDoTriggerAI(af, this, mandatory); - } - - }; - return dbEffect; - } - - /** - *

effectStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - public static String effectStackDescription(AbilityFactory af, SpellAbility sa) { - StringBuilder sb = new StringBuilder(); - - if (sa instanceof Ability_Sub) - sb.append(" "); - else - sb.append(sa.getSourceCard().getName()).append(" - "); - - sb.append(sa.getDescription()); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

effectCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - public static boolean effectCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - Random r = MyRandom.random; - - Target tgt = sa.getTarget(); - if (tgt != null) { - tgt.resetTargets(); - if (tgt.canOnlyTgtOpponent()) - tgt.addTarget(AllZone.getHumanPlayer()); - else - tgt.addTarget(AllZone.getComputerPlayer()); - } - - return ((r.nextFloat() < .6667)); - } - - /** - *

effectDoTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - public static boolean effectDoTriggerAI(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa) && !mandatory) // If there is a cost payment it's usually not mandatory - return false; - - // TODO: Add targeting effects - - // check SubAbilities DoTrigger? - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - return abSub.doTrigger(mandatory); - } - - return true; - } - - /** - *

effectResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public static void effectResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - Card card = af.getHostCard(); - - String[] effectAbilities = null; - String[] effectTriggers = null; - String[] effectSVars = null; - String[] effectKeywords = null; - String[] effectStaticAbilities = null; - String effectRemembered = null; - - if (params.containsKey("Abilities")) - effectAbilities = params.get("Abilities").split(","); - - if (params.containsKey("Triggers")) - effectTriggers = params.get("Triggers").split(","); - - if (params.containsKey("StaticAbilities")) - effectStaticAbilities = params.get("StaticAbilities").split(","); - - if (params.containsKey("SVars")) - effectSVars = params.get("SVars").split(","); - - if (params.containsKey("Keywords")) - effectKeywords = params.get("Keywords").split(","); - - if (params.containsKey("RememberCard")) - effectRemembered = params.get("RememberCard"); - - //Effect eff = new Effect(); - String name = params.get("Name"); - if (name == null) - name = sa.getSourceCard().getName() + "'s Effect"; - - //Unique Effects shouldn't be duplicated - if (params.containsKey("Unique") && AllZoneUtil.isCardInPlay(name)) - return; - - Player controller = sa.getActivatingPlayer(); - Card eff = new Card(); - eff.setName(name); - eff.addType("Effect"); // Or Emblem - eff.setToken(true); // Set token to true, so when leaving play it gets nuked - eff.setController(controller); - eff.setOwner(controller); - eff.setImageName(card.getImageName()); - eff.setColor(card.getColor()); - eff.setImmutable(true); - - // Effects should be Orange or something probably - - final Card e = eff; - - // Abilities, triggers and SVars work the same as they do for Token - //Grant abilities - if (effectAbilities != null) { - for (String s : effectAbilities) { - AbilityFactory abFactory = new AbilityFactory(); - String actualAbility = af.getHostCard().getSVar(s); - - SpellAbility grantedAbility = abFactory.getAbility(actualAbility, eff); - eff.addSpellAbility(grantedAbility); - } - } - - //Grant triggers - if (effectTriggers != null) { - for (String s : effectTriggers) { - String actualTrigger = af.getHostCard().getSVar(s); - - //Needs to do some voodoo when the effect disappears to remove the triggers at the same time. - Command LPCommand = new Command() { - - private static final long serialVersionUID = -9007707442828928732L; - - public void execute() { - AllZone.getTriggerHandler().removeAllFromCard(e); - } - - }; - eff.addLeavesPlayCommand(LPCommand); - Trigger parsedTrigger = TriggerHandler.parseTrigger(actualTrigger, eff); - eff.addTrigger(parsedTrigger); - AllZone.getTriggerHandler().registerTrigger(parsedTrigger); - } - } - - //Grant static abilities - if (effectStaticAbilities != null) { - for (String s : effectStaticAbilities) - eff.addStaticAbility(af.getHostCard().getSVar(s)); - } - - //Grant SVars - if (effectSVars != null) { - for (String s : effectSVars) { - String actualSVar = af.getHostCard().getSVar(s); - eff.setSVar(s, actualSVar); - } - } - - //Grant Keywords - if (effectKeywords != null) { - for (String s : effectKeywords) { - String actualKeyword = af.getHostCard().getSVar(s); - eff.addIntrinsicKeyword(actualKeyword); - } - } - - //Set Remembered - if(effectRemembered != null) { - for(Card c : AbilityFactory.getDefinedCards(card,effectRemembered,sa)) - { - eff.addRemembered(c); - } - } - - // Duration - String duration = params.get("Duration"); - if (duration == null || !duration.equals("Permanent")) { - final Command endEffect = new Command() { - private static final long serialVersionUID = -5861759814760561373L; - - public void execute() { - AllZone.getGameAction().exile(e); - } - }; - - if (duration == null || duration.equals("EndOfTurn")) - AllZone.getEndOfTurn().addUntil(endEffect); - } - - // TODO: Add targeting to the effect so it knows who it's dealing with - AllZone.getTriggerHandler().suppressMode("ChangesZone"); - AllZone.getGameAction().moveToPlay(eff); - AllZone.getTriggerHandler().clearSuppression("ChangesZone"); - } -} diff --git a/src/forge/card/abilityFactory/AbilityFactory_EndGameCondition.java b/src/forge/card/abilityFactory/AbilityFactory_EndGameCondition.java deleted file mode 100644 index a7986697f2c..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_EndGameCondition.java +++ /dev/null @@ -1,455 +0,0 @@ -package forge.card.abilityFactory; - -import forge.AllZone; -import forge.Card; -import forge.ComputerUtil; -import forge.Player; -import forge.card.spellability.*; - -import java.util.ArrayList; - -/** - *

AbilityFactory_EndGameCondition class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_EndGameCondition { - // *********************************************************************************************** - // ***************************************** Wins Game ******************************************* - // *********************************************************************************************** - /** - *

createAbilityWinsGame.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityWinsGame(final AbilityFactory AF) { - - final SpellAbility abWinsGame = new Ability_Activated(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = 8869422603616247307L; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - return winsGameStackDescription(af, this); - } - - public boolean canPlayAI() { - return winsGameCanPlayAI(af, this); - } - - @Override - public void resolve() { - winsGameResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return winsGameDoTriggerAI(af, this, mandatory); - } - - }; - return abWinsGame; - } - - /** - *

createSpellWinsGame.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellWinsGame(final AbilityFactory AF) { - final SpellAbility spWinsGame = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = 6631124959690157874L; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - return winsGameStackDescription(af, this); - } - - public boolean canPlayAI() { - // if X depends on abCost, the AI needs to choose which card he would sacrifice first - // then call xCount with that card to properly calculate the amount - // Or choosing how many to sacrifice - return winsGameCanPlayAI(af, this); - } - - @Override - public void resolve() { - winsGameResolve(af, this); - } - - }; - return spWinsGame; - } - - /** - *

createDrawbackWinsGame.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackWinsGame(final AbilityFactory AF) { - final SpellAbility dbWinsGame = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()) { - private static final long serialVersionUID = 6631124959690157874L; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - return winsGameStackDescription(af, this); - } - - public boolean canPlayAI() { - // if X depends on abCost, the AI needs to choose which card he would sacrifice first - // then call xCount with that card to properly calculate the amount - // Or choosing how many to sacrifice - return winsGameCanPlayAI(af, this); - } - - @Override - public void resolve() { - winsGameResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return winsGameDoTriggerAI(af, this, mandatory); - } - - }; - return dbWinsGame; - } - - /** - *

winsGameStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - public static String winsGameStackDescription(AbilityFactory af, SpellAbility sa) { - StringBuilder sb = new StringBuilder(); - - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard().getName()).append(" - "); - else - sb.append(" "); - - // Let the spell description also be the stack description - sb.append(sa.getDescription()); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

winsGameCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - public static boolean winsGameCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - if (AllZone.getComputerPlayer().cantWin()) - return false; - - // TODO: Check conditions are met on card (e.g. Coalition Victory) - - // TODO: Consider likelihood of SA getting countered - - // In general, don't return true. - // But this card wins the game, I can make an exception for that - return true; - } - - /** - *

winsGameDoTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - public static boolean winsGameDoTriggerAI(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa) && !mandatory) // If there is a cost payment it's usually not mandatory - return false; - - // WinGame abilities usually don't have subAbilities but for consistency... - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - return abSub.doTrigger(mandatory); - } - - return true; - } - - /** - *

winsGameResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public static void winsGameResolve(final AbilityFactory af, final SpellAbility sa) { - - Card card = af.getHostCard(); - - ArrayList players = AbilityFactory.getDefinedPlayers(card, af.getMapParams().get("Defined"), sa); - - for (Player p : players) - p.altWinConditionMet(card.getName()); - } - - // *********************************************************************************************** - // **************************************** Loses Game ******************************************* - // *********************************************************************************************** - - /** - *

createAbilityLosesGame.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityLosesGame(final AbilityFactory AF) { - - final SpellAbility abLosesGame = new Ability_Activated(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = 8869422603616247307L; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - return losesGameStackDescription(af, this); - } - - public boolean canPlayAI() { - return losesGameCanPlayAI(af, this); - } - - @Override - public void resolve() { - losesGameResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return losesGameDoTriggerAI(af, this, mandatory); - } - - }; - return abLosesGame; - } - - /** - *

createSpellLosesGame.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellLosesGame(final AbilityFactory AF) { - final SpellAbility spLosesGame = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = 6631124959690157874L; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - return losesGameStackDescription(af, this); - } - - public boolean canPlayAI() { - // if X depends on abCost, the AI needs to choose which card he would sacrifice first - // then call xCount with that card to properly calculate the amount - // Or choosing how many to sacrifice - return losesGameCanPlayAI(af, this); - } - - @Override - public void resolve() { - losesGameResolve(af, this); - } - - }; - return spLosesGame; - } - - /** - *

createDrawbackLosesGame.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackLosesGame(final AbilityFactory AF) { - final SpellAbility dbLosesGame = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()) { - private static final long serialVersionUID = 6631124959690157874L; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - return losesGameStackDescription(af, this); - } - - public boolean canPlayAI() { - // if X depends on abCost, the AI needs to choose which card he would sacrifice first - // then call xCount with that card to properly calculate the amount - // Or choosing how many to sacrifice - return losesGameCanPlayAI(af, this); - } - - @Override - public void resolve() { - losesGameResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return losesGameDoTriggerAI(af, this, mandatory); - } - - }; - return dbLosesGame; - } - - /** - *

losesGameStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - public static String losesGameStackDescription(AbilityFactory af, SpellAbility sa) { - StringBuilder sb = new StringBuilder(); - Card source = sa.getSourceCard(); - - if (!(sa instanceof Ability_Sub)) - sb.append(source.getName()).append(" - "); - else - sb.append(" "); - - Target tgt = sa.getTarget(); - ArrayList players = null; - if (sa.getTarget() != null) { - players = tgt.getTargetPlayers(); - } else { - players = AbilityFactory.getDefinedPlayers(source, af.getMapParams().get("Defined"), sa); - } - - for (Player p : players) { - sb.append(p.getName()).append(" "); - } - - sb.append("loses the game."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

losesGameCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - public static boolean losesGameCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - if (AllZone.getHumanPlayer().cantLose()) - return false; - - // Only one SA Lose the Game card right now, which is Door to Nothingness - - Target tgt = sa.getTarget(); - if (tgt != null) { - tgt.resetTargets(); - tgt.addTarget(AllZone.getHumanPlayer()); - } - - // In general, don't return true. - // But this card wins the game, I can make an exception for that - return true; - } - - /** - *

losesGameDoTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - public static boolean losesGameDoTriggerAI(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa) && !mandatory) // If there is a cost payment it's usually not mandatory - return false; - - // Phage the Untouchable - // (Final Fortune would need to attach it's delayed trigger to a specific turn, which can't be done yet) - - if (!mandatory && AllZone.getHumanPlayer().cantLose()) - return false; - - Target tgt = sa.getTarget(); - if (tgt != null) { - tgt.resetTargets(); - tgt.addTarget(AllZone.getHumanPlayer()); - } - - // WinGame abilities usually don't have subAbilities but for consistency... - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - return abSub.doTrigger(mandatory); - } - - return true; - } - - /** - *

losesGameResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public static void losesGameResolve(final AbilityFactory af, final SpellAbility sa) { - - Card card = af.getHostCard(); - - Target tgt = sa.getTarget(); - ArrayList players = null; - if (sa.getTarget() != null) { - players = tgt.getTargetPlayers(); - } else { - players = AbilityFactory.getDefinedPlayers(card, af.getMapParams().get("Defined"), sa); - } - - for (Player p : players) - p.altLoseConditionMet(card.getName()); - } - -} diff --git a/src/forge/card/abilityFactory/AbilityFactory_GainControl.java b/src/forge/card/abilityFactory/AbilityFactory_GainControl.java deleted file mode 100644 index df8ae0faccc..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_GainControl.java +++ /dev/null @@ -1,477 +0,0 @@ -package forge.card.abilityFactory; - -import forge.*; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.*; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; - -//AB:GainControl|ValidTgts$Creature|TgtPrompt$Select target legendary creature|LoseControl$Untap,LoseControl|SpellDescription$Gain control of target xxxxxxx - -//GainControl specific params: -// LoseControl - the lose control conditions (as a comma separated list) -// -Untap - source card becomes untapped -// -LoseControl - you lose control of source card -// -LeavesPlay - source card leaves the battlefield -// -PowerGT - (not implemented yet for Old Man of the Sea) -// AddKWs - Keywords to add to the controlled card (as a "&"-separated list; like Haste, Sacrifice CARDNAME at EOT, any standard keyword) -// OppChoice - set to True if opponent chooses creature (for Preacher) - not implemented yet -// Untap - set to True if target card should untap when control is taken -// DestroyTgt - actions upon which the tgt should be destroyed. same list as LoseControl -// NoRegen - set if destroyed creature can't be regenerated. used only with DestroyTgt - -/** - *

AbilityFactory_GainControl class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_GainControl { - - private final Card movedCards[] = new Card[1]; - - private AbilityFactory af = null; - private HashMap params = null; - private Card hostCard = null; - private ArrayList lose = null; - private ArrayList destroyOn = null; - private boolean bNoRegen = false; - private boolean bUntap = false; - private boolean bTapOnLose = false; - private ArrayList kws = null; - - /** - *

Constructor for AbilityFactory_GainControl.

- * - * @param newAF a {@link forge.card.abilityFactory.AbilityFactory} object. - */ - public AbilityFactory_GainControl(AbilityFactory newAF) { - af = newAF; - params = af.getMapParams(); - hostCard = af.getHostCard(); - if (params.containsKey("LoseControl")) { - lose = new ArrayList(Arrays.asList(params.get("LoseControl").split(","))); - } - if (params.containsKey("Untap")) { - bUntap = true; - } - if (params.containsKey("TapOnLose")) { - bTapOnLose = true; - } - if (params.containsKey("AddKWs")) { - kws = new ArrayList(Arrays.asList(params.get("AddKWs").split(" & "))); - } - if (params.containsKey("DestroyTgt")) { - destroyOn = new ArrayList(Arrays.asList(params.get("DestroyTgt").split(","))); - } - if (params.containsKey("NoRegen")) { - bNoRegen = true; - } - } - - /** - *

getSpellGainControl.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public SpellAbility getSpellGainControl() { - SpellAbility spControl = new Spell(hostCard, af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 3125489644424832311L; - - @Override - public boolean canPlayAI() { - return gainControlTgtAI(this); - } - - @Override - public void resolve() { - gainControlResolve(this); - }//resolve - - @Override - public String getStackDescription() { - return gainControlStackDescription(this); - } - };//SpellAbility - - return spControl; - } - - /** - *

getAbilityGainControl.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public SpellAbility getAbilityGainControl() { - - final SpellAbility abControl = new Ability_Activated(hostCard, af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -4384705198674678831L; - - @Override - public boolean canPlayAI() { - return gainControlTgtAI(this); - } - - @Override - public void resolve() { - gainControlResolve(this); - } - - @Override - public String getStackDescription() { - return gainControlStackDescription(this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return gainControlTgtAI(this); - } - };//Ability_Activated - - return abControl; - } - - /** - *

getDrawbackGainControl.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public SpellAbility getDrawbackGainControl() { - SpellAbility dbControl = new Ability_Sub(hostCard, af.getAbTgt()) { - private static final long serialVersionUID = -5577742598032345880L; - - @Override - public boolean canPlayAI() { - return gainControlTgtAI(this); - } - - @Override - public String getStackDescription() { - return gainControlStackDescription(this); - } - - @Override - public void resolve() { - gainControlResolve(this); - }//resolve - - @Override - public boolean chkAI_Drawback() { - return gainControlDrawbackAI(this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return gainControlTriggerAI(this, mandatory); - } - };//SpellAbility - - return dbControl; - } - - /** - *

gainControlStackDescription.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private String gainControlStackDescription(SpellAbility sa) { - StringBuilder sb = new StringBuilder(); - - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard()).append(" - "); - else - sb.append(" "); - - ArrayList tgtCards; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else { - tgtCards = AbilityFactory.getDefinedCards(hostCard, params.get("Defined"), sa); - } - - ArrayList newController = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("NewController"), sa); - if (newController.size() == 0) newController.add(sa.getActivatingPlayer()); - - sb.append(newController).append(" gains control of "); - - for (Card c : tgtCards) { - sb.append(" "); - if (c.isFaceDown()) sb.append("Morph"); - else sb.append(c); - } - sb.append("."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

gainControlTgtAI.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private boolean gainControlTgtAI(SpellAbility sa) { - boolean hasCreature = false; - boolean hasArtifact = false; - boolean hasEnchantment = false; - boolean hasLand = false; - - Target tgt = af.getAbTgt(); - - //if Defined, then don't worry about targeting - if (tgt == null) { - return true; - } - - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - list = list.getValidCards(tgt.getValidTgts(), hostCard.getController(), hostCard); - //AI won't try to grab cards that are filtered out of AI decks on purpose - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - Map vars = c.getSVars(); - return !vars.containsKey("RemAIDeck") && CardFactoryUtil.canTarget(hostCard, c); - } - }); - - if (list.isEmpty()) - return false; - - // Don't steal something if I can't Attack without, or prevent it from blocking at least - if (lose != null && lose.contains("EOT") && AllZone.getPhase().isAfter(Constant.Phase.Combat_Declare_Blockers)) - return false; - - while (tgt.getNumTargeted() < tgt.getMaxTargets(sa.getSourceCard(), sa)) { - Card t = null; - for (Card c : list) { - if (c.isCreature()) hasCreature = true; - if (c.isArtifact()) hasArtifact = true; - if (c.isLand()) hasLand = true; - if (c.isEnchantment()) hasEnchantment = true; - } - - if (list.isEmpty()) { - if (tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa) || tgt.getNumTargeted() == 0) { - tgt.resetTargets(); - return false; - } else { - // TODO is this good enough? for up to amounts? - break; - } - } - - if (hasCreature) t = CardFactoryUtil.AI_getBestCreature(list); - else if (hasArtifact) t = CardFactoryUtil.AI_getBestArtifact(list); - else if (hasLand) t = CardFactoryUtil.AI_getBestLand(list); - else if (hasEnchantment) t = CardFactoryUtil.AI_getBestEnchantment(list, sa.getSourceCard(), true); - else t = CardFactoryUtil.AI_getMostExpensivePermanent(list, sa.getSourceCard(), true); - - tgt.addTarget(t); - list.remove(t); - - hasCreature = false; - hasArtifact = false; - hasLand = false; - hasEnchantment = false; - } - - return true; - - } - - /** - *

gainControlResolve.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private void gainControlResolve(SpellAbility sa) { - ArrayList tgtCards; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else { - tgtCards = AbilityFactory.getDefinedCards(hostCard, params.get("Defined"), sa); - } - //tgtCards.add(hostCard); - - ArrayList newController = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("NewController"), sa); - if (newController.size() == 0) newController.add(sa.getActivatingPlayer()); - - int size = tgtCards.size(); - for (int j = 0; j < size; j++) { - final Card tgtC = tgtCards.get(j); - final Player originalController = tgtC.getController(); - - movedCards[j] = tgtC; - hostCard.addGainControlTarget(tgtC); - - if (AllZoneUtil.isCardInPlay(tgtC) && CardFactoryUtil.canTarget(hostCard, tgtC)) { - - AllZone.getGameAction().changeController(new CardList(tgtC), tgtC.getController(), newController.get(0)); - - if (bUntap) tgtC.untap(); - - if (null != kws) { - for (String kw : kws) { - tgtC.addExtrinsicKeyword(kw); - } - } - } - - //end copied - - if (lose != null) { - if (lose.contains("LeavesPlay")) { - hostCard.addLeavesPlayCommand(getLoseControlCommand(j, originalController)); - } - if (lose.contains("Untap")) { - hostCard.addUntapCommand(getLoseControlCommand(j, originalController)); - } - if (lose.contains("LoseControl")) { - hostCard.addChangeControllerCommand(getLoseControlCommand(j, originalController)); - } - if (lose.contains("EOT")) { - AllZone.getEndOfTurn().addAt(getLoseControlCommand(j, originalController)); - } - } - - if (destroyOn != null) { - if (destroyOn.contains("LeavesPlay")) { - hostCard.addLeavesPlayCommand(getDestroyCommand(j)); - } - if (destroyOn.contains("Untap")) { - hostCard.addUntapCommand(getDestroyCommand(j)); - } - if (destroyOn.contains("LoseControl")) { - hostCard.addChangeControllerCommand(getDestroyCommand(j)); - } - } - - //for Old Man of the Sea - 0 is hardcoded since it only allows 1 target - hostCard.clearGainControlReleaseCommands(); - hostCard.addGainControlReleaseCommand(getLoseControlCommand(0, originalController)); - - }//end foreach target - } - - /** - *

gainControlTriggerAI.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private boolean gainControlTriggerAI(SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) - return false; - - if (sa.getTarget() == null) { - if (mandatory) - return true; - } else { - return gainControlTgtAI(sa); - } - - return true; - } - - /** - *

gainControlDrawbackAI.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private boolean gainControlDrawbackAI(SpellAbility sa) { - if (af.getAbTgt() == null || !af.getAbTgt().doesTarget()) { - //all is good - } else - return gainControlTgtAI(sa); - - return true; - }//pumpDrawbackAI() - - /** - *

getDestroyCommand.

- * - * @param i a int. - * @return a {@link forge.Command} object. - */ - private Command getDestroyCommand(final int i) { - final Command destroy = new Command() { - private static final long serialVersionUID = 878543373519872418L; - - public void execute() { - final Card c = movedCards[i]; - Ability ability = new Ability(hostCard, "0") { - public void resolve() { - - if (bNoRegen) { - AllZone.getGameAction().destroyNoRegeneration(c); - } else { - AllZone.getGameAction().destroy(c); - } - } - }; - StringBuilder sb = new StringBuilder(); - sb.append(hostCard).append(" - destroy ").append(c.getName()).append("."); - if (bNoRegen) sb.append(" It can't be regenerated."); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability); - } - - }; - return destroy; - } - - /** - *

getLoseControlCommand.

- * - * @param i a int. - * @param originalController a {@link forge.Player} object. - * @return a {@link forge.Command} object. - */ - private Command getLoseControlCommand(final int i, final Player originalController) { - final Command loseControl = new Command() { - private static final long serialVersionUID = 878543373519872418L; - - public void execute() { - Card c = movedCards[i]; - //ArrayList c = hostCard.getGainControlTargets(); - if (null == c) return; - - if (AllZoneUtil.isCardInPlay(c)) { - AllZone.getGameAction().changeController(new CardList(c), c.getController(), originalController); - - if (bTapOnLose) c.tap(); - - if (null != kws) { - for (String kw : kws) { - c.removeExtrinsicKeyword(kw); - } - } - }//if - hostCard.clearGainControlTargets(); - hostCard.clearGainControlReleaseCommands(); - movedCards[i] = null; - }//execute() - }; - - return loseControl; - } - -}//end class AbilityFactory_GainControl diff --git a/src/forge/card/abilityFactory/AbilityFactory_Mana.java b/src/forge/card/abilityFactory/AbilityFactory_Mana.java deleted file mode 100644 index ce870822476..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_Mana.java +++ /dev/null @@ -1,907 +0,0 @@ -package forge.card.abilityFactory; - -import forge.*; -import forge.card.spellability.*; -import forge.gui.GuiUtils; -import forge.gui.input.Input_PayManaCostUtil; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Random; - -/** - *

AbilityFactory_Mana class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_Mana { - // ****************************** MANA ************************ - /** - *

createAbilityMana.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param produced a {@link java.lang.String} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityMana(final AbilityFactory AF, final String produced) { - final Ability_Mana abMana = new Ability_Mana(AF.getHostCard(), AF.getAbCost(), produced) { - private static final long serialVersionUID = -1933592438783630254L; - - final AbilityFactory af = AF; - - public boolean canPlayAI() { - return manaCanPlayAI(af); - } - - @Override - public void resolve() { - manaResolve(this, af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - // TODO Auto-generated method stub - return false; - } - - }; - return abMana; - } - - /** - *

createSpellMana.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param produced a {@link java.lang.String} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellMana(final AbilityFactory AF, final String produced) { - final SpellAbility spMana = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = -5141246507533353605L; - - final AbilityFactory af = AF; - // To get the mana to resolve properly, we need the spell to contain an Ability_Mana - Cost tmp = new Cost("0", AF.getHostCard().getName(), false); - Ability_Mana tmpMana = new Ability_Mana(AF.getHostCard(), tmp, produced) { - private static final long serialVersionUID = 1454043766057140491L; - - @Override - public boolean doTrigger(boolean mandatory) { - // TODO Auto-generated method stub - return false; - } - - }; - - public boolean canPlayAI() { - return manaCanPlayAI(af); - } - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - return manaStackDescription(tmpMana, af, this); - } - - @Override - public void resolve() { - manaResolve(tmpMana, af, this); - } - - }; - return spMana; - } - - // Mana never really appears as a Drawback - /** - *

createDrawbackMana.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param produced a {@link java.lang.String} object. - * @return a {@link forge.card.spellability.Ability_Sub} object. - */ - public static Ability_Sub createDrawbackMana(final AbilityFactory AF, final String produced) { - final Ability_Sub dbMana = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()) { - private static final long serialVersionUID = -5141246507533353605L; - - final AbilityFactory af = AF; - // To get the mana to resolve properly, we need the spell to contain an Ability_Mana - Cost tmp = new Cost("0", AF.getHostCard().getName(), false); - Ability_Mana tmpMana = new Ability_Mana(AF.getHostCard(), tmp, produced) { - private static final long serialVersionUID = 1454043766057140491L; - - @Override - public boolean doTrigger(boolean mandatory) { - // TODO Auto-generated method stub - return false; - } - - }; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - return manaStackDescription(tmpMana, af, this); - } - - @Override - public void resolve() { - manaResolve(tmpMana, af, this); - } - - @Override - public boolean chkAI_Drawback() { - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - // TODO Auto-generated method stub - return false; - } - - }; - return dbMana; - } - - /** - *

manaCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a boolean. - */ - public static boolean manaCanPlayAI(final AbilityFactory af) { - // AI cannot use this properly until he has a ManaPool - return false; - } - - /** - *

manaStackDescription.

- * - * @param abMana a {@link forge.card.spellability.Ability_Mana} object. - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - public static String manaStackDescription(Ability_Mana abMana, AbilityFactory af, SpellAbility sa) { - StringBuilder sb = new StringBuilder(); - - if (sa instanceof Ability_Sub) - sb.append(" "); - else - sb.append(af.getHostCard()).append(" - "); - - sb.append("Add ").append(generatedMana(abMana, af, sa)).append(" to your mana pool."); - - if (abMana.getSubAbility() != null) - sb.append(abMana.getSubAbility().getStackDescription()); - - return sb.toString(); - } - - /** - *

manaResolve.

- * - * @param abMana a {@link forge.card.spellability.Ability_Mana} object. - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public static void manaResolve(Ability_Mana abMana, AbilityFactory af, SpellAbility sa) { - // Spells are not undoable - abMana.setUndoable(af.isAbility() && abMana.isUndoable()); - - HashMap params = af.getMapParams(); - Card card = af.getHostCard(); - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - for (Player player : tgtPlayers) - abMana.produceMana(generatedMana(abMana, af, sa), player); - - // convert these to SubAbilities when appropriate - if (params.containsKey("Stuck")) { - abMana.setUndoable(false); - card.addExtrinsicKeyword("This card doesn't untap during your next untap step."); - } - - String deplete = params.get("Deplete"); - if (deplete != null) { - int num = card.getCounters(Counters.getType(deplete)); - if (num == 0) { - abMana.setUndoable(false); - AllZone.getGameAction().sacrifice(card); - } - } - - doDrawback(af, abMana, card); - } - - /** - *

generatedMana.

- * - * @param abMana a {@link forge.card.spellability.Ability_Mana} object. - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String generatedMana(Ability_Mana abMana, AbilityFactory af, SpellAbility sa) { - // Calculate generated mana here for stack description and resolving - HashMap params = af.getMapParams(); - int amount = params.containsKey("Amount") ? AbilityFactory.calculateAmount(af.getHostCard(), params.get("Amount"), sa) : 1; - - String baseMana = abMana.mana(); - - if (params.containsKey("Bonus")) { - // For mana abilities that get a bonus - // Bonus currently MULTIPLIES the base amount. Base Amounts should ALWAYS be Base - int bonus = 0; - if (params.get("Bonus").equals("UrzaLands")) { - if (hasUrzaLands(abMana.getActivatingPlayer())) - bonus = Integer.parseInt(params.get("BonusProduced")); - } - - amount += bonus; - } - - try { - if (params.get("Amount") != null && amount != Integer.parseInt(params.get("Amount"))) - abMana.setUndoable(false); - } catch (NumberFormatException n) { - abMana.setUndoable(false); - } - - StringBuilder sb = new StringBuilder(); - if (amount == 0) - sb.append("0"); - else { - try { - // if baseMana is an integer(colorless), just multiply amount and baseMana - int base = Integer.parseInt(baseMana); - sb.append(base * amount); - } catch (NumberFormatException e) { - for (int i = 0; i < amount; i++) { - if (i != 0) - sb.append(" "); - sb.append(baseMana); - } - } - } - return sb.toString(); - } - - // ****************************** MANAREFLECTED ************************ - /** - *

createAbilityManaReflected.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param produced a {@link java.lang.String} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityManaReflected(final AbilityFactory AF, final String produced) { - final Ability_Mana abMana = new Ability_Mana(AF.getHostCard(), AF.getAbCost(), produced) { - private static final long serialVersionUID = -1933592438783630254L; - - final AbilityFactory af = AF; - - public boolean canPlayAI() { - return manaReflectedCanPlayAI(af); - } - - @Override - public void resolve() { - manaReflectedResolve(this, af); - } - - @Override - public boolean doTrigger(boolean mandatory) { - // TODO Auto-generated method stub - return false; - } - - }; - abMana.setReflectedMana(true); - return abMana; - } - - /** - *

createSpellManaReflected.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param produced a {@link java.lang.String} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellManaReflected(final AbilityFactory AF, final String produced) { - // No Spell has Reflected Mana, but might as well put it in for the future - final SpellAbility spMana = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = -5141246507533353605L; - - final AbilityFactory af = AF; - // To get the mana to resolve properly, we need the spell to contain an Ability_Mana - Cost tmp = new Cost("0", AF.getHostCard().getName(), false); - Ability_Mana tmpMana = new Ability_Mana(AF.getHostCard(), tmp, produced) { - private static final long serialVersionUID = 1454043766057140491L; - - @Override - public boolean doTrigger(boolean mandatory) { - // TODO Auto-generated method stub - return false; - } - - // TODO: maybe add can produce here, so old AI code can use reflected mana? - }; - //tmpMana.setReflectedMana(true); - - public boolean canPlayAI() { - return manaReflectedCanPlayAI(af); - } - - @Override - public void resolve() { - manaReflectedResolve(tmpMana, af); - } - - }; - return spMana; - } - - /** - *

manaReflectedCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a boolean. - */ - public static boolean manaReflectedCanPlayAI(final AbilityFactory af) { - // AI cannot use this properly until he has a ManaPool - return false; - } - - /** - *

manaReflectedResolve.

- * - * @param abMana a {@link forge.card.spellability.Ability_Mana} object. - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - */ - public static void manaReflectedResolve(Ability_Mana abMana, AbilityFactory af) { - // Spells are not undoable - HashMap params = af.getMapParams(); - abMana.setUndoable(af.isAbility() && abMana.isUndoable()); - - Card card = af.getHostCard(); - - ArrayList colors = reflectableMana(abMana, af, new ArrayList(), new ArrayList()); - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(abMana.getSourceCard(), params.get("Defined"), abMana); - - for (Player player : tgtPlayers) { - String generated = generatedReflectedMana(abMana, af, colors, player); - - if (abMana.getCanceled()) { - abMana.undo(); - return; - } - - abMana.produceMana(generated, player); - } - - doDrawback(af, abMana, card); - } - - // add Colors and - /** - *

reflectableMana.

- * - * @param abMana a {@link forge.card.spellability.Ability_Mana} object. - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param colors a {@link java.util.ArrayList} object. - * @param parents a {@link java.util.ArrayList} object. - * @return a {@link java.util.ArrayList} object. - */ - private static ArrayList reflectableMana(Ability_Mana abMana, AbilityFactory af, ArrayList colors, ArrayList parents) { - // Here's the problem with reflectable Mana. If more than one is out, they need to Reflect each other, - // so we basically need to have a recursive list that send the parents so we don't infinite recurse. - HashMap params = af.getMapParams(); - Card card = af.getHostCard(); - - if (!parents.contains(card)) - parents.add(card); - - String colorOrType = params.get("ColorOrType"); // currently Color or Type, Type is colors + colorless - String validCard = params.get("Valid"); - String reflectProperty = params.get("ReflectProperty"); // Produce (Reflecting Pool) or Is (Meteor Crater) - - int maxChoices = 5; // Color is the default colorOrType - if (colorOrType.equals("Type")) - maxChoices++; - - CardList cards = null; - - // Reuse AF_Defined in a slightly different way - if (validCard.startsWith("Defined.")) { - cards = new CardList(); - for (Card c : AbilityFactory.getDefinedCards(card, validCard.replace("Defined.", ""), (SpellAbility) abMana)) - cards.add(c); - } else { - cards = AllZoneUtil.getCardsInPlay().getValidCards(validCard, abMana.getActivatingPlayer(), card); - } - - // remove anything cards that is already in parents - for (Card p : parents) - if (cards.contains(p)) - cards.remove(p); - - if (cards.size() == 0 && !reflectProperty.equals("Produced")) - return colors; - - if (reflectProperty.equals("Is")) { // Meteor Crater - colors = hasProperty(maxChoices, cards, colors); - } else if (reflectProperty.equals("Produced")) { - String producedColors = (String) abMana.getTriggeringObject("Produced"); - for (String col : Constant.Color.onlyColors) { - String s = Input_PayManaCostUtil.getShortColorString(col); - if (producedColors.contains(s) && !colors.contains(col)) - colors.add(col); - } - if (maxChoices == 6 && producedColors.contains("1") && !colors.contains(Constant.Color.Colorless)) - colors.add(Constant.Color.Colorless); - } else if (reflectProperty.equals("Produce")) { - ArrayList abilities = new ArrayList(); - for (Card c : cards) { - abilities.addAll(c.getManaAbility()); - } - // currently reflected mana will ignore other reflected mana abilities - - ArrayList reflectAbilities = new ArrayList(); - - for (Ability_Mana ab : abilities) { - if (maxChoices == colors.size()) - break; - - if (ab.isReflectedMana()) { - if (!parents.contains(ab.getSourceCard())) { - // Recursion! - reflectAbilities.add(ab); - parents.add(ab.getSourceCard()); - } - continue; - } - colors = canProduce(maxChoices, ab, colors); - if (!parents.contains(ab.getSourceCard())) - parents.add(ab.getSourceCard()); - } - - for (Ability_Mana ab : reflectAbilities) { - if (maxChoices == colors.size()) - break; - - colors = reflectableMana(ab, ab.getAbilityFactory(), colors, parents); - } - } - - return colors; - } - - /** - *

hasProperty.

- * - * @param maxChoices a int. - * @param cards a {@link forge.CardList} object. - * @param colors a {@link java.util.ArrayList} object. - * @return a {@link java.util.ArrayList} object. - */ - private static ArrayList hasProperty(int maxChoices, CardList cards, ArrayList colors) { - for (Card c : cards) { - // For each card, go through all the colors and if the card is that color, add - for (String col : Constant.Color.onlyColors) { - if (c.isColor(col) && !colors.contains(col)) { - colors.add(col); - if (colors.size() == maxChoices) - break; - } - } - } - return colors; - } - - /** - *

canProduce.

- * - * @param maxChoices a int. - * @param ab a {@link forge.card.spellability.Ability_Mana} object. - * @param colors a {@link java.util.ArrayList} object. - * @return a {@link java.util.ArrayList} object. - */ - private static ArrayList canProduce(int maxChoices, Ability_Mana ab, ArrayList colors) { - for (String col : Constant.Color.onlyColors) { - String s = Input_PayManaCostUtil.getShortColorString(col); - if (ab.canProduce(s) && !colors.contains(col)) - colors.add(col); - } - - if (maxChoices == 6 && ab.canProduce("1") && !colors.contains(Constant.Color.Colorless)) - colors.add(Constant.Color.Colorless); - - return colors; - } - - /** - *

generatedReflectedMana.

- * - * @param abMana a {@link forge.card.spellability.Ability_Mana} object. - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param colors a {@link java.util.ArrayList} object. - * @param player a {@link forge.Player} object. - * @return a {@link java.lang.String} object. - */ - private static String generatedReflectedMana(Ability_Mana abMana, AbilityFactory af, ArrayList colors, Player player) { - // Calculate generated mana here for stack description and resolving - HashMap params = af.getMapParams(); - int amount = params.containsKey("Amount") ? AbilityFactory.calculateAmount(af.getHostCard(), params.get("Amount"), abMana) : 1; - - String baseMana = ""; - - if (colors.size() == 0) - return "0"; - else if (colors.size() == 1) - baseMana = Input_PayManaCostUtil.getShortColorString(colors.get(0)); - else { - if (player.isHuman()) { - Object o = GuiUtils.getChoiceOptional("Select Mana to Produce", colors.toArray()); - if (o == null) { - // User hit cancel - abMana.setCanceled(true); - return ""; - } else { - baseMana = Input_PayManaCostUtil.getShortColorString((String) o); - } - } else { - // AI doesn't really have anything here yet - baseMana = Input_PayManaCostUtil.getShortColorString(colors.get(0)); - } - } - - StringBuilder sb = new StringBuilder(); - if (amount == 0) - sb.append("0"); - else { - try { - // if baseMana is an integer(colorless), just multiply amount and baseMana - int base = Integer.parseInt(baseMana); - sb.append(base * amount); - } catch (NumberFormatException e) { - for (int i = 0; i < amount; i++) { - if (i != 0) - sb.append(" "); - sb.append(baseMana); - } - } - } - return sb.toString(); - } - - // *************** Utility Functions ********************** - - /** - *

doDrawback.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param abMana a {@link forge.card.spellability.Ability_Mana} object. - * @param card a {@link forge.Card} object. - */ - public static void doDrawback(AbilityFactory af, Ability_Mana abMana, Card card) { - - // if mana production has any type of SubAbility, undoable=false - if (af.hasSubAbility()) { - abMana.setUndoable(false); - Ability_Sub abSub = abMana.getSubAbility(); - AbilityFactory.resolve(abSub, false); - } - } - - /** - *

hasUrzaLands.

- * - * @param p a {@link forge.Player} object. - * @return a boolean. - */ - private static boolean hasUrzaLands(Player p) { - CardList landsControlled = AllZoneUtil.getPlayerCardsInPlay(p); - - return (landsControlled.containsName("Urza's Mine") && landsControlled.containsName("Urza's Tower") && - landsControlled.containsName("Urza's Power Plant")); - } - - // **************************************** - // ************** DrainMana *************** - // **************************************** - - /** - *

createAbilityDrainMana.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public static SpellAbility createAbilityDrainMana(final AbilityFactory af) { - final SpellAbility abDrainMana = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 5669367387381350104L; - - @Override - public String getStackDescription() { - return drainManaStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return drainManaCanPlayAI(af, this); - } - - @Override - public void resolve() { - drainManaResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return drainManaTrigger(af, this, mandatory); - } - - }; - return abDrainMana; - } - - /** - *

createSpellDrainMana.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public static SpellAbility createSpellDrainMana(final AbilityFactory af) { - final SpellAbility spDrainMana = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -4294474468024747680L; - - @Override - public String getStackDescription() { - return drainManaStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return drainManaCanPlayAI(af, this); - } - - @Override - public void resolve() { - drainManaResolve(af, this); - } - - }; - return spDrainMana; - } - - /** - *

createDrawbackDrainMana.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public static SpellAbility createDrawbackDrainMana(final AbilityFactory af) { - final SpellAbility dbDrainMana = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = 1458568386420831420L; - - @Override - public String getStackDescription() { - return drainManaStackDescription(af, this); - } - - @Override - public void resolve() { - drainManaResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return drainManaPlayDrawbackAI(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return drainManaTrigger(af, this, mandatory); - } - - }; - return dbDrainMana; - } - - /** - *

drainManaStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String drainManaStackDescription(AbilityFactory af, SpellAbility sa) { - StringBuilder sb = new StringBuilder(); - - HashMap params = af.getMapParams(); - - if (sa instanceof Ability_Sub) - sb.append(" "); - else - sb.append(sa.getSourceCard()).append(" - "); - - ArrayList tgtPlayers; - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else { - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - } - - Iterator it = tgtPlayers.iterator(); - while (it.hasNext()) { - sb.append(it.next()); - if (it.hasNext()) sb.append(", "); - } - - sb.append(" empties his or her mana pool."); - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - sb.append(subAb.getStackDescription()); - - return sb.toString(); - } - - /** - *

drainManaCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean drainManaCanPlayAI(final AbilityFactory af, SpellAbility sa) { - // AI cannot use this properly until he can use SAs during Humans turn - - HashMap params = af.getMapParams(); - Target tgt = af.getAbTgt(); - Card source = sa.getSourceCard(); - - Random r = MyRandom.random; - boolean randomReturn = r.nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn()); - - if (tgt == null) { - //assume we are looking to tap human's stuff - //TODO - check for things with untap abilities, and don't tap those. - ArrayList defined = AbilityFactory.getDefinedPlayers(source, params.get("Defined"), sa); - - if (!defined.contains(AllZone.getHumanPlayer())) { - return false; - } - } else { - tgt.resetTargets(); - tgt.addTarget(AllZone.getHumanPlayer()); - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) { - randomReturn &= subAb.chkAI_Drawback(); - } - - return randomReturn; - } - - /** - *

drainManaTrigger.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean drainManaTrigger(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) - return false; - - HashMap params = af.getMapParams(); - Target tgt = sa.getTarget(); - Card source = sa.getSourceCard(); - - if (null == tgt) { - if (mandatory) { - return true; - } else { - ArrayList defined = AbilityFactory.getDefinedPlayers(source, params.get("Defined"), sa); - - if (!defined.contains(AllZone.getHumanPlayer())) { - return false; - } - } - - return true; - } else { - tgt.resetTargets(); - tgt.addTarget(AllZone.getHumanPlayer()); - } - - return true; - } - - /** - *

drainManaPlayDrawbackAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean drainManaPlayDrawbackAI(final AbilityFactory af, SpellAbility sa) { - // AI cannot use this properly until he can use SAs during Humans turn - HashMap params = af.getMapParams(); - Target tgt = af.getAbTgt(); - Card source = sa.getSourceCard(); - - boolean randomReturn = true; - - if (tgt == null) { - ArrayList defined = AbilityFactory.getDefinedPlayers(source, params.get("Defined"), sa); - - if (defined.contains(AllZone.getComputerPlayer())) { - return false; - } - } else { - tgt.resetTargets(); - tgt.addTarget(AllZone.getHumanPlayer()); - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - randomReturn &= subAb.chkAI_Drawback(); - - return randomReturn; - } - - /** - *

drainManaResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void drainManaResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - Card card = sa.getSourceCard(); - - ArrayList tgtPlayers; - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else { - tgtPlayers = AbilityFactory.getDefinedPlayers(card, params.get("Defined"), sa); - } - - for (Player p : tgtPlayers) { - if (tgt == null || p.canTarget(sa)) { - if (p.isHuman()) { - AllZone.getManaPool().clearPool(); - } else if (p.isComputer()) { - AllZone.getComputerManaPool().clearPool(); - } - } - } - } - -}//end class AbilityFactory_Mana diff --git a/src/forge/card/abilityFactory/AbilityFactory_PermanentState.java b/src/forge/card/abilityFactory/AbilityFactory_PermanentState.java deleted file mode 100644 index 7dcb523fb64..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_PermanentState.java +++ /dev/null @@ -1,1678 +0,0 @@ -package forge.card.abilityFactory; - -import forge.*; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.*; -import forge.gui.GuiUtils; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Random; - -/** - *

AbilityFactory_PermanentState class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_PermanentState { - - // **************************************** - // ************** Untap ******************* - // **************************************** - - /** - *

createAbilityUntap.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityUntap(final AbilityFactory af) { - final SpellAbility abUntap = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 5445572699000471299L; - - @Override - public String getStackDescription() { - return untapStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return untapCanPlayAI(af, this); - } - - @Override - public void resolve() { - untapResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return untapTrigger(af, this, mandatory); - } - - }; - return abUntap; - } - - /** - *

createSpellUntap.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellUntap(final AbilityFactory af) { - final SpellAbility spUntap = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -4990932993654533449L; - - @Override - public String getStackDescription() { - return untapStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return untapCanPlayAI(af, this); - } - - @Override - public void resolve() { - untapResolve(af, this); - } - - }; - return spUntap; - } - - /** - *

createDrawbackUntap.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackUntap(final AbilityFactory af) { - final SpellAbility dbUntap = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = -4990932993654533449L; - - @Override - public String getStackDescription() { - return untapStackDescription(af, this); - } - - @Override - public void resolve() { - untapResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return untapPlayDrawbackAI(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return untapTrigger(af, this, mandatory); - } - - }; - return dbUntap; - } - - /** - *

untapStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String untapStackDescription(AbilityFactory af, SpellAbility sa) { - // when getStackDesc is called, just build exactly what is happening - StringBuilder sb = new StringBuilder(); - final HashMap params = af.getMapParams(); - Card hostCard = sa.getSourceCard(); - - if (sa instanceof Ability_Sub) - sb.append(" "); - else - sb.append(sa.getSourceCard()).append(" - "); - - sb.append("Untap "); - - if (params.containsKey("UntapUpTo")) { - sb.append("up to ").append(params.get("Amount")).append(" "); - sb.append(params.get("UntapType")).append("s"); - } else { - ArrayList tgtCards; - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else { - tgtCards = AbilityFactory.getDefinedCards(hostCard, params.get("Defined"), sa); - } - - Iterator it = tgtCards.iterator(); - while (it.hasNext()) { - sb.append(it.next()); - if (it.hasNext()) - sb.append(", "); - } - } - sb.append("."); - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - sb.append(subAb.getStackDescription()); - - return sb.toString(); - } - - /** - *

untapCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean untapCanPlayAI(final AbilityFactory af, SpellAbility sa) { - // AI cannot use this properly until he can use SAs during Humans turn - - if (af.getAbCost().getAddCounter()) - if (af.getAbCost().getCounterType().equals(Counters.M1M1)) - return false; - - Target tgt = af.getAbTgt(); - Card source = sa.getSourceCard(); - - Random r = MyRandom.random; - boolean randomReturn = r.nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn() + 1); - - if (tgt == null) { - if (sa.getSourceCard().isUntapped()) - return false; - } else { - if (!untapPrefTargeting(tgt, af, sa, false)) - return false; - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - randomReturn &= subAb.chkAI_Drawback(); - - return randomReturn; - } - - /** - *

untapTrigger.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean untapTrigger(AbilityFactory af, SpellAbility sa, boolean mandatory) { - HashMap params = af.getMapParams(); - if (!ComputerUtil.canPayCost(sa)) - return false; - - Target tgt = sa.getTarget(); - - if (tgt == null) { - if (mandatory) - return true; - - // TODO: use Defined to determine, if this is an unfavorable result - ArrayList pDefined = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa); - if (pDefined != null && pDefined.get(0).isUntapped()) - return false; - - return true; - } else { - if (untapPrefTargeting(tgt, af, sa, mandatory)) { - return true; - } else if (mandatory) { - // not enough preferred targets, but mandatory so keep going: - return untapUnpreferredTargeting(af, sa, mandatory); - } - } - - return false; - } - - /** - *

untapPlayDrawbackAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean untapPlayDrawbackAI(final AbilityFactory af, SpellAbility sa) { - // AI cannot use this properly until he can use SAs during Humans turn - Target tgt = af.getAbTgt(); - - boolean randomReturn = true; - - if (tgt == null) { - // who cares if its already untapped, it's only a subability? - } else { - if (!untapPrefTargeting(tgt, af, sa, false)) - return false; - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - randomReturn &= subAb.chkAI_Drawback(); - - return randomReturn; - } - - /** - *

untapPrefTargeting.

- * - * @param tgt a {@link forge.card.spellability.Target} object. - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean untapPrefTargeting(Target tgt, AbilityFactory af, SpellAbility sa, boolean mandatory) { - Card source = sa.getSourceCard(); - - Player targetController = AllZone.getComputerPlayer(); - - if(af.isCurse()) - targetController = AllZone.getHumanPlayer(); - - CardList untapList = AllZoneUtil.getPlayerCardsInPlay(targetController); - untapList = untapList.getTargetableCards(source); - untapList = untapList.getValidCards(tgt.getValidTgts(), source.getController(), source); - - - untapList = untapList.filter(AllZoneUtil.tapped); - // filter out enchantments and planeswalkers, their tapped state doesn't matter. - String[] tappablePermanents = {"Creature", "Land", "Artifact"}; - untapList = untapList.getValidCards(tappablePermanents, source.getController(), source); - - if (untapList.size() == 0) - return false; - - while (tgt.getNumTargeted() < tgt.getMaxTargets(sa.getSourceCard(), sa)) { - Card choice = null; - - if (untapList.size() == 0) { - if (tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa) || tgt.getNumTargeted() == 0) { - tgt.resetTargets(); - return false; - } else { - // TODO is this good enough? for up to amounts? - break; - } - } - - if (untapList.getNotType("Creature").size() == 0) - choice = CardFactoryUtil.AI_getBestCreature(untapList); //if only creatures take the best - else - choice = CardFactoryUtil.AI_getMostExpensivePermanent(untapList, af.getHostCard(), false); - - if (choice == null) { // can't find anything left - if (tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa) || tgt.getNumTargeted() == 0) { - tgt.resetTargets(); - return false; - } else { - // TODO is this good enough? for up to amounts? - break; - } - } - - untapList.remove(choice); - tgt.addTarget(choice); - } - return true; - } - - /** - *

untapUnpreferredTargeting.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean untapUnpreferredTargeting(AbilityFactory af, SpellAbility sa, boolean mandatory) { - Card source = sa.getSourceCard(); - Target tgt = sa.getTarget(); - - CardList list = AllZoneUtil.getCardsInPlay(); - - list = list.getValidCards(tgt.getValidTgts(), source.getController(), source); - list = list.getTargetableCards(source); - - // filter by enchantments and planeswalkers, their tapped state doesn't matter. - String[] tappablePermanents = {"Enchantment", "Planeswalker"}; - CardList tapList = list.getValidCards(tappablePermanents, source.getController(), source); - - if (untapTargetList(source, tgt, af, sa, mandatory, tapList)) - return true; - - // try to just tap already tapped things - tapList = list.filter(AllZoneUtil.untapped); - - if (untapTargetList(source, tgt, af, sa, mandatory, tapList)) - return true; - - // just tap whatever we can - tapList = list; - - if (untapTargetList(source, tgt, af, sa, mandatory, tapList)) - return true; - - return false; - } - - /** - *

untapTargetList.

- * - * @param source a {@link forge.Card} object. - * @param tgt a {@link forge.card.spellability.Target} object. - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @param tapList a {@link forge.CardList} object. - * @return a boolean. - */ - private static boolean untapTargetList(Card source, Target tgt, AbilityFactory af, SpellAbility sa, boolean mandatory, CardList tapList) { - for (Card c : tgt.getTargetCards()) - tapList.remove(c); - - if (tapList.size() == 0) - return false; - - while (tgt.getNumTargeted() < tgt.getMaxTargets(source, sa)) { - Card choice = null; - - if (tapList.size() == 0) { - if (tgt.getNumTargeted() < tgt.getMinTargets(source, sa) || tgt.getNumTargeted() == 0) { - if (!mandatory) - tgt.resetTargets(); - return false; - } else { - // TODO is this good enough? for up to amounts? - break; - } - } - - if (tapList.getNotType("Creature").size() == 0) - choice = CardFactoryUtil.AI_getBestCreature(tapList); //if only creatures take the best - else - choice = CardFactoryUtil.AI_getMostExpensivePermanent(tapList, af.getHostCard(), false); - - if (choice == null) { // can't find anything left - if (tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa) || tgt.getNumTargeted() == 0) { - if (!mandatory) - tgt.resetTargets(); - return false; - } else { - // TODO is this good enough? for up to amounts? - break; - } - } - - tapList.remove(choice); - tgt.addTarget(choice); - } - - return true; - } - - /** - *

untapResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void untapResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - Card card = sa.getSourceCard(); - Target tgt = af.getAbTgt(); - ArrayList tgtCards = null; - - if (params.containsKey("UntapUpTo")) - untapChooseUpTo(af, sa, params); - else { - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else { - tgtCards = AbilityFactory.getDefinedCards(card, params.get("Defined"), sa); - } - - for (Card tgtC : tgtCards) { - if (AllZoneUtil.isCardInPlay(tgtC) && (tgt == null || CardFactoryUtil.canTarget(af.getHostCard(), tgtC))) - tgtC.untap(); - } - } - } - - /** - *

untapChooseUpTo.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param params a {@link java.util.HashMap} object. - */ - private static void untapChooseUpTo(AbilityFactory af, SpellAbility sa, HashMap params) { - int num = Integer.parseInt(params.get("Amount")); - String valid = params.get("UntapType"); - - ArrayList definedPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - for(Player p : definedPlayers){ - if (p.isHuman()) - AllZone.getInputControl().setInput(CardFactoryUtil.input_UntapUpToNType(num, valid)); - else { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - list = list.getType(valid); - list = list.filter(AllZoneUtil.tapped); - - int count = 0; - while (list.size() != 0 && count < num) - for (int i = 0; i < list.size() && count < num; i++) { - - Card c = CardFactoryUtil.AI_getBestLand(list); - c.untap(); - list.remove(c); - count++; - } - } - } - } - - // **************************************** - // ************** Tap ********************* - // **************************************** - - /** - *

createAbilityTap.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityTap(final AbilityFactory af) { - final SpellAbility abTap = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 5445572699000471299L; - - @Override - public String getStackDescription() { - return tapStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return tapCanPlayAI(af, this); - } - - @Override - public void resolve() { - tapResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return tapTrigger(af, this, mandatory); - } - - }; - return abTap; - } - - /** - *

createSpellTap.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellTap(final AbilityFactory af) { - final SpellAbility spTap = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -4990932993654533449L; - - @Override - public String getStackDescription() { - return tapStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return tapCanPlayAI(af, this); - } - - @Override - public void resolve() { - tapResolve(af, this); - } - - }; - return spTap; - } - - /** - *

createDrawbackTap.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackTap(final AbilityFactory af) { - final SpellAbility dbTap = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = -4990932993654533449L; - - @Override - public String getStackDescription() { - return tapStackDescription(af, this); - } - - @Override - public void resolve() { - tapResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return tapPlayDrawbackAI(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return tapTrigger(af, this, mandatory); - } - - }; - return dbTap; - } - - /** - *

tapStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String tapStackDescription(AbilityFactory af, SpellAbility sa) { - StringBuilder sb = new StringBuilder(); - final HashMap params = af.getMapParams(); - Card hostCard = sa.getSourceCard(); - - if (sa instanceof Ability_Sub) - sb.append(" "); - else - sb.append(sa.getSourceCard()).append(" - "); - - sb.append("Tap "); - - ArrayList tgtCards; - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else { - tgtCards = AbilityFactory.getDefinedCards(hostCard, params.get("Defined"), sa); - } - - Iterator it = tgtCards.iterator(); - while (it.hasNext()) { - sb.append(it.next()); - if (it.hasNext()) sb.append(", "); - } - - sb.append("."); - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - sb.append(subAb.getStackDescription()); - - return sb.toString(); - } - - /** - *

tapCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean tapCanPlayAI(final AbilityFactory af, SpellAbility sa) { - // AI cannot use this properly until he can use SAs during Humans turn - - HashMap params = af.getMapParams(); - Target tgt = af.getAbTgt(); - Card source = sa.getSourceCard(); - - Random r = MyRandom.random; - boolean randomReturn = r.nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn()); - - if (tgt == null) { - ArrayList defined = AbilityFactory.getDefinedCards(source, params.get("Defined"), sa); - - boolean bFlag = false; - for (Card c : defined) - bFlag |= c.isUntapped(); - - if (!bFlag) // All of the defined stuff is tapped, not very useful - return false; - } else { - tgt.resetTargets(); - if (!tapPrefTargeting(source, tgt, af, sa, false)) - return false; - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - randomReturn &= subAb.chkAI_Drawback(); - - return randomReturn; - } - - /** - *

tapTrigger.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean tapTrigger(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) - return false; - - Target tgt = sa.getTarget(); - Card source = sa.getSourceCard(); - - if (tgt == null) { - if (mandatory) - return true; - - // TODO: use Defined to determine, if this is an unfavorable result - - return true; - } else { - if (tapPrefTargeting(source, tgt, af, sa, mandatory)) { - return true; - } else if (mandatory) { - // not enough preferred targets, but mandatory so keep going: - return tapUnpreferredTargeting(af, sa, mandatory); - } - } - - return false; - } - - /** - *

tapPlayDrawbackAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean tapPlayDrawbackAI(final AbilityFactory af, SpellAbility sa) { - // AI cannot use this properly until he can use SAs during Humans turn - Target tgt = af.getAbTgt(); - Card source = sa.getSourceCard(); - - boolean randomReturn = true; - - if (tgt == null) { - // either self or defined, either way should be fine - } else { - // target section, maybe pull this out? - tgt.resetTargets(); - if (!tapPrefTargeting(source, tgt, af, sa, false)) - return false; - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - randomReturn &= subAb.chkAI_Drawback(); - - return randomReturn; - } - - /** - *

tapPrefTargeting.

- * - * @param source a {@link forge.Card} object. - * @param tgt a {@link forge.card.spellability.Target} object. - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean tapPrefTargeting(Card source, Target tgt, AbilityFactory af, SpellAbility sa, boolean mandatory) { - CardList tapList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - tapList = tapList.filter(AllZoneUtil.untapped); - tapList = tapList.getValidCards(tgt.getValidTgts(), source.getController(), source); - // filter out enchantments and planeswalkers, their tapped state doesn't matter. - String[] tappablePermanents = {"Creature", "Land", "Artifact"}; - tapList = tapList.getValidCards(tappablePermanents, source.getController(), source); - tapList = tapList.getTargetableCards(source); - - if (tapList.size() == 0) - return false; - - while (tgt.getNumTargeted() < tgt.getMaxTargets(source, sa)) { - Card choice = null; - - if (tapList.size() == 0) { - if (tgt.getNumTargeted() < tgt.getMinTargets(source, sa) || tgt.getNumTargeted() == 0) { - if (!mandatory) - tgt.resetTargets(); - return false; - } else { - // TODO is this good enough? for up to amounts? - break; - } - } - - if (tapList.getNotType("Creature").size() == 0) - choice = CardFactoryUtil.AI_getBestCreature(tapList); //if only creatures take the best - else - choice = CardFactoryUtil.AI_getMostExpensivePermanent(tapList, af.getHostCard(), false); - - if (choice == null) { // can't find anything left - if (tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa) || tgt.getNumTargeted() == 0) { - if (!mandatory) - tgt.resetTargets(); - return false; - } else { - // TODO is this good enough? for up to amounts? - break; - } - } - - tapList.remove(choice); - tgt.addTarget(choice); - } - - return true; - } - - /** - *

tapUnpreferredTargeting.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean tapUnpreferredTargeting(AbilityFactory af, SpellAbility sa, boolean mandatory) { - Card source = sa.getSourceCard(); - Target tgt = sa.getTarget(); - - CardList list = AllZoneUtil.getCardsInPlay(); - list = list.getValidCards(tgt.getValidTgts(), source.getController(), source); - list = list.getTargetableCards(source); - - // filter by enchantments and planeswalkers, their tapped state doesn't matter. - String[] tappablePermanents = {"Enchantment", "Planeswalker"}; - CardList tapList = list.getValidCards(tappablePermanents, source.getController(), source); - - if (tapTargetList(af, sa, tapList, mandatory)) - return true; - - // try to just tap already tapped things - tapList = list.filter(AllZoneUtil.tapped); - - if (tapTargetList(af, sa, tapList, mandatory)) - return true; - - // just tap whatever we can - tapList = list; - - if (tapTargetList(af, sa, tapList, mandatory)) - return true; - - return false; - } - - /** - *

tapTargetList.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param tapList a {@link forge.CardList} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean tapTargetList(AbilityFactory af, SpellAbility sa, CardList tapList, boolean mandatory) { - Card source = sa.getSourceCard(); - Target tgt = sa.getTarget(); - - for (Card c : tgt.getTargetCards()) - tapList.remove(c); - - if (tapList.size() == 0) - return false; - - while (tgt.getNumTargeted() < tgt.getMaxTargets(source, sa)) { - Card choice = null; - - if (tapList.size() == 0) { - if (tgt.getNumTargeted() < tgt.getMinTargets(source, sa) || tgt.getNumTargeted() == 0) { - if (!mandatory) - tgt.resetTargets(); - return false; - } else { - // TODO is this good enough? for up to amounts? - break; - } - } - - if (tapList.getNotType("Creature").size() == 0) - choice = CardFactoryUtil.AI_getBestCreature(tapList); //if only creatures take the best - else - choice = CardFactoryUtil.AI_getMostExpensivePermanent(tapList, af.getHostCard(), false); - - if (choice == null) { // can't find anything left - if (tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa) || tgt.getNumTargeted() == 0) { - if (!mandatory) - tgt.resetTargets(); - return false; - } else { - // TODO is this good enough? for up to amounts? - break; - } - } - - tapList.remove(choice); - tgt.addTarget(choice); - } - - return true; - } - - /** - *

tapResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void tapResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - Card card = sa.getSourceCard(); - - ArrayList tgtCards; - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else { - tgtCards = AbilityFactory.getDefinedCards(card, params.get("Defined"), sa); - } - - for (Card tgtC : tgtCards) { - if (AllZoneUtil.isCardInPlay(tgtC) && (tgt == null || CardFactoryUtil.canTarget(af.getHostCard(), tgtC))) - tgtC.tap(); - } - } - - // **************************************** - // ************** UntapAll ***************** - // **************************************** - /** - *

createAbilityUntapAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityUntapAll(final AbilityFactory af) { - final SpellAbility abUntap = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 8914852730903389831L; - - @Override - public String getStackDescription() { - return untapAllStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return untapAllCanPlayAI(af, this); - } - - @Override - public void resolve() { - untapAllResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return untapAllTrigger(af, this, mandatory); - } - - }; - return abUntap; - } - - /** - *

createSpellUntapAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellUntapAll(final AbilityFactory af) { - final SpellAbility spUntap = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 5713174052551899363L; - - @Override - public String getStackDescription() { - return untapAllStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return untapAllCanPlayAI(af, this); - } - - @Override - public void resolve() { - untapAllResolve(af, this); - } - - }; - return spUntap; - } - - /** - *

createDrawbackUntapAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackUntapAll(final AbilityFactory af) { - final SpellAbility dbUntapAll = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = -5187900994680626766L; - - @Override - public String getStackDescription() { - return untapAllStackDescription(af, this); - } - - @Override - public void resolve() { - untapAllResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return untapAllPlayDrawbackAI(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return untapAllPlayDrawbackAI(af, this); - } - - }; - return dbUntapAll; - } - - /** - *

untapAllPlayDrawbackAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean untapAllPlayDrawbackAI(final AbilityFactory af, SpellAbility sa) { - return true; - } - - /** - *

untapAllResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void untapAllResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - Card card = sa.getSourceCard(); - - String valid = ""; - - if (params.containsKey("ValidCards")) - valid = params.get("ValidCards"); - - CardList list = AllZoneUtil.getCardsInPlay(); - list = list.getValidCards(valid.split(","), card.getController(), card); - - for (int i = 0; i < list.size(); i++) list.get(i).untap(); - } - - /** - *

untapAllCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean untapAllCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - /* - * All cards using this currently have SVar:RemAIDeck:True - */ - return false; - } - - /** - *

untapAllTrigger.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean untapAllTrigger(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) - return false; - - if (mandatory) - return true; - - - return false; - } - - /** - *

untapAllStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String untapAllStackDescription(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - StringBuilder sb = new StringBuilder(); - - if (sa instanceof Ability_Sub) { - sb.append(" "); - sb.append("Untap all valid cards."); - } else { - sb.append(sa.getSourceCard()).append(" - "); - sb.append(params.get("SpellDescription")); - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - sb.append(subAb.getStackDescription()); - - return sb.toString(); - } - - // **************************************** - // ************** TapAll ***************** - // **************************************** - /** - *

createAbilityTapAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityTapAll(final AbilityFactory af) { - final SpellAbility abUntap = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -2095140656782946737L; - - @Override - public String getStackDescription() { - return tapAllStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return tapAllCanPlayAI(af, this); - } - - @Override - public void resolve() { - tapAllResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return tapAllTrigger(af, this, mandatory); - } - - }; - return abUntap; - } - - /** - *

createSpellTapAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellTapAll(final AbilityFactory af) { - final SpellAbility spUntap = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -62401571838950166L; - - @Override - public String getStackDescription() { - return tapAllStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return tapAllCanPlayAI(af, this); - } - - @Override - public void resolve() { - tapAllResolve(af, this); - } - - }; - return spUntap; - } - - /** - *

createDrawbackTapAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackTapAll(final AbilityFactory af) { - final SpellAbility dbTap = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = -4990932993654533449L; - - @Override - public String getStackDescription() { - return tapAllStackDescription(af, this); - } - - @Override - public void resolve() { - tapAllResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return tapAllPlayDrawbackAI(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return tapAllPlayDrawbackAI(af, this); - } - - }; - return dbTap; - } - - /** - *

tapAllResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void tapAllResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - - CardList cards = null; - - ArrayList tgtPlayers = null; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else if (params.containsKey("Defined")) // Make sure Defined exists to use it - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - if (tgtPlayers == null || tgtPlayers.isEmpty()) - cards = AllZoneUtil.getCardsInPlay(); - else - cards = AllZoneUtil.getPlayerCardsInPlay(tgtPlayers.get(0)); - - cards = AbilityFactory.filterListByType(cards, params.get("ValidCards"), sa); - - for (Card c : cards) c.tap(); - } - - /** - *

tapAllCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean tapAllCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - // If tapping all creatures do it either during declare attackers of AIs turn - // or during upkeep/begin combat? - - Card source = sa.getSourceCard(); - HashMap params = af.getMapParams(); - - if (AllZone.getPhase().isAfter(Constant.Phase.Combat_Begin)) - return false; - - String valid = ""; - if (params.containsKey("ValidCards")) - valid = params.get("ValidCards"); - - CardList validTappables = AllZoneUtil.getCardsInPlay(); - - Target tgt = sa.getTarget(); - - if (sa.getTarget() != null) { - tgt.resetTargets(); - sa.getTarget().addTarget(AllZone.getHumanPlayer()); - validTappables = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - } - - validTappables = validTappables.getValidCards(valid, source.getController(), source); - validTappables = validTappables.filter(AllZoneUtil.untapped); - - Random r = MyRandom.random; - boolean rr = false; - if (r.nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn())) - rr = true; - - if (validTappables.size() > 0) { - CardList human = validTappables.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getController().isHuman(); - } - }); - CardList compy = validTappables.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getController().isComputer(); - } - }); - if (human.size() > compy.size()) { - return rr; - } - } - return false; - } - - /** - *

getTapAllTargets.

- * - * @param valid a {@link java.lang.String} object. - * @param source a {@link forge.Card} object. - * @return a {@link forge.CardList} object. - */ - private static CardList getTapAllTargets(String valid, Card source) { - CardList tmpList = AllZoneUtil.getCardsInPlay(); - tmpList = tmpList.getValidCards(valid, source.getController(), source); - tmpList = tmpList.filter(AllZoneUtil.untapped); - return tmpList; - } - - - /** - *

tapAllStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String tapAllStackDescription(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - StringBuilder sb = new StringBuilder(); - - if (sa instanceof Ability_Sub) { - sb.append(" "); - sb.append("Tap all valid cards."); - } else { - sb.append(sa.getSourceCard()).append(" - "); - sb.append(params.get("SpellDescription")); - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - sb.append(subAb.getStackDescription()); - - return sb.toString(); - } - - /** - *

tapAllTrigger.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean tapAllTrigger(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) - return false; - - if (mandatory) - return true; - - Card source = sa.getSourceCard(); - HashMap params = af.getMapParams(); - - String valid = ""; - if (params.containsKey("ValidCards")) - valid = params.get("ValidCards"); - - CardList validTappables = getTapAllTargets(valid, source); - - Random r = MyRandom.random; - boolean rr = false; - if (r.nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn())) - rr = true; - - if (validTappables.size() > 0) { - CardList human = validTappables.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getController().isHuman(); - } - }); - CardList compy = validTappables.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getController().isHuman(); - } - }); - if (human.size() > compy.size()) { - return rr; - } - } - - return false; - } - - /** - *

tapAllPlayDrawbackAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean tapAllPlayDrawbackAI(final AbilityFactory af, SpellAbility sa) { - return true; - } - - - // **************************************** - // ************** Tap or Untap ************ - // **************************************** - - /** - *

createAbilityTapOrUntap.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityTapOrUntap(final AbilityFactory af) { - final SpellAbility abTapOrUntap = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -4713183763302932079L; - - @Override - public String getStackDescription() { - return tapOrUntapStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return tapOrUntapCanPlayAI(af, this); - } - - @Override - public void resolve() { - tapOrUntapResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return tapOrUntapTrigger(af, this, mandatory); - } - - }; - return abTapOrUntap; - } - - /** - *

createSpellTapOrUntap.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellTapOrUntap(final AbilityFactory af) { - final SpellAbility spTapOrUntap = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -8870476840484788521L; - - @Override - public String getStackDescription() { - return tapOrUntapStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return tapOrUntapCanPlayAI(af, this); - } - - @Override - public void resolve() { - tapOrUntapResolve(af, this); - } - - }; - return spTapOrUntap; - } - - /** - *

createDrawbackTapOrUntap.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackTapOrUntap(final AbilityFactory af) { - final SpellAbility dbTapOrUntap = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = -8282868583712773337L; - - @Override - public String getStackDescription() { - return tapOrUntapStackDescription(af, this); - } - - @Override - public void resolve() { - tapOrUntapResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return tapOrUntapPlayDrawbackAI(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return tapOrUntapTrigger(af, this, mandatory); - } - - }; - return dbTapOrUntap; - } - - /** - *

tapOrUntapStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String tapOrUntapStackDescription(AbilityFactory af, SpellAbility sa) { - // when getStackDesc is called, just build exactly what is happening - StringBuilder sb = new StringBuilder(); - - HashMap params = af.getMapParams(); - - if (sa instanceof Ability_Sub) - sb.append(" "); - else - sb.append(sa.getSourceCard()).append(" - "); - - sb.append("Tap or untap "); - - ArrayList tgtCards; - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else { - tgtCards = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa); - } - - Iterator it = tgtCards.iterator(); - while (it.hasNext()) { - sb.append(it.next()); - if (it.hasNext()) sb.append(", "); - } - - sb.append("."); - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - sb.append(subAb.getStackDescription()); - - return sb.toString(); - } - - /** - *

tapOrUntapCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean tapOrUntapCanPlayAI(final AbilityFactory af, SpellAbility sa) { - // AI cannot use this properly until he can use SAs during Humans turn - - HashMap params = af.getMapParams(); - Target tgt = af.getAbTgt(); - Card source = sa.getSourceCard(); - - Random r = MyRandom.random; - boolean randomReturn = r.nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn()); - - if (tgt == null) { - //assume we are looking to tap human's stuff - //TODO - check for things with untap abilities, and don't tap those. - ArrayList defined = AbilityFactory.getDefinedCards(source, params.get("Defined"), sa); - - boolean bFlag = false; - for (Card c : defined) - bFlag |= c.isUntapped(); - - if (!bFlag) // All of the defined stuff is tapped, not very useful - return false; - } else { - tgt.resetTargets(); - if (!tapPrefTargeting(source, tgt, af, sa, false)) - return false; - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - randomReturn &= subAb.chkAI_Drawback(); - - return randomReturn; - } - - /** - *

tapOrUntapTrigger.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean tapOrUntapTrigger(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) - return false; - - Target tgt = sa.getTarget(); - Card source = sa.getSourceCard(); - - if (tgt == null) { - if (mandatory) - return true; - - // TODO: use Defined to determine if this is an unfavorable result - - return true; - } else { - if (tapPrefTargeting(source, tgt, af, sa, mandatory)) { - return true; - } else if (mandatory) { - // not enough preferred targets, but mandatory so keep going: - return tapUnpreferredTargeting(af, sa, mandatory); - } - } - - return false; - } - - /** - *

tapOrUntapPlayDrawbackAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean tapOrUntapPlayDrawbackAI(final AbilityFactory af, SpellAbility sa) { - // AI cannot use this properly until he can use SAs during Humans turn - Target tgt = af.getAbTgt(); - Card source = sa.getSourceCard(); - - boolean randomReturn = true; - - if (tgt == null) { - // either self or defined, either way should be fine - } else { - // target section, maybe pull this out? - tgt.resetTargets(); - if (!tapPrefTargeting(source, tgt, af, sa, false)) - return false; - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - randomReturn &= subAb.chkAI_Drawback(); - - return randomReturn; - } - - /** - *

tapOrUntapResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void tapOrUntapResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - Card card = sa.getSourceCard(); - - ArrayList tgtCards; - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else { - tgtCards = AbilityFactory.getDefinedCards(card, params.get("Defined"), sa); - } - - for (Card tgtC : tgtCards) { - if (AllZoneUtil.isCardInPlay(tgtC) && (tgt == null || CardFactoryUtil.canTarget(af.getHostCard(), tgtC))) { - if(sa.getActivatingPlayer().isHuman()) { - String[] tapOrUntap = new String[]{"Tap", "Untap"}; - Object z = GuiUtils.getChoiceOptional("Tap or Untap " + tgtC + "?", tapOrUntap); - if (null == z) continue; - boolean tap = (z.equals("Tap")) ? true : false; - - if (tap) tgtC.tap(); - else tgtC.untap(); - } - else { - //computer - tgtC.tap(); - } - } - } - } - - //Phasing? Something else? Who knows! - -}// end of AbilityFactory_PermanentState class diff --git a/src/forge/card/abilityFactory/AbilityFactory_PreventDamage.java b/src/forge/card/abilityFactory/AbilityFactory_PreventDamage.java deleted file mode 100644 index 627d58c869f..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_PreventDamage.java +++ /dev/null @@ -1,383 +0,0 @@ -package forge.card.abilityFactory; - -import forge.*; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.*; - -import java.util.ArrayList; -import java.util.HashMap; - -/** - *

AbilityFactory_PreventDamage class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_PreventDamage { - - // Ex: A:SP$ PreventDamage | Cost$ W | Tgt$ TgtC | Amount$ 3 | SpellDescription$ Prevent the next 3 damage that would be dealt to target creature this turn. - // http://www.slightlymagic.net/wiki/Forge_AbilityFactory#PreventDamage - - /** - *

getAbilityPreventDamage.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility getAbilityPreventDamage(final AbilityFactory af) { - - final SpellAbility abRegenerate = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -6581723619801399347L; - - @Override - public boolean canPlayAI() { - return preventDamageCanPlayAI(af, this); - } - - @Override - public void resolve() { - preventDamageResolve(af, this); - } - - @Override - public String getStackDescription() { - return preventDamageStackDescription(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return doPreventDamageTriggerAI(af, this, mandatory); - } - - };//Ability_Activated - - return abRegenerate; - } - - /** - *

getSpellPreventDamage.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility getSpellPreventDamage(final AbilityFactory af) { - - final SpellAbility spRegenerate = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -3899905398102316582L; - - @Override - public boolean canPlayAI() { - return preventDamageCanPlayAI(af, this); - } - - @Override - public void resolve() { - preventDamageResolve(af, this); - } - - @Override - public String getStackDescription() { - return preventDamageStackDescription(af, this); - } - - }; // Spell - - return spRegenerate; - } - - /** - *

createDrawbackPreventDamage.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackPreventDamage(final AbilityFactory af) { - final SpellAbility dbRegen = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = -2295483806708528744L; - - @Override - public String getStackDescription() { - return preventDamageStackDescription(af, this); - } - - @Override - public void resolve() { - preventDamageResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return doPreventDamageTriggerAI(af, this, mandatory); - } - - }; - return dbRegen; - } - - /** - *

preventDamageStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String preventDamageStackDescription(AbilityFactory af, SpellAbility sa) { - final HashMap params = af.getMapParams(); - StringBuilder sb = new StringBuilder(); - Card host = af.getHostCard(); - - ArrayList tgts; - if (sa.getTarget() == null) - tgts = AbilityFactory.getDefinedObjects(sa.getSourceCard(), params.get("Defined"), sa); - else - tgts = sa.getTarget().getTargets(); - - if (sa instanceof Ability_Sub) - sb.append(" "); - else - sb.append(host).append(" - "); - - sb.append("Prevent the next "); - sb.append(params.get("Amount")); - sb.append(" that would be dealt to "); - for (int i = 0; i < tgts.size(); i++) { - if (i != 0) - sb.append(" "); - - Object o = tgts.get(i); - if (o instanceof Card) { - Card tgtC = (Card) o; - if (tgtC.isFaceDown()) sb.append("Morph"); - else sb.append(tgtC); - } else sb.append(o.toString()); - } - sb.append(" this turn."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

preventDamageCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean preventDamageCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - final HashMap params = af.getMapParams(); - final Card hostCard = af.getHostCard(); - boolean chance = false; - - // temporarily disabled until better AI - if (af.getAbCost().getSacCost()) return false; - if (af.getAbCost().getSubCounter()) - if (af.getAbCost().getCounterType().equals(Counters.P1P1)) - return false; - if (af.getAbCost().getLifeCost()) return false; - - Target tgt = af.getAbTgt(); - if (tgt == null) { - // As far as I can tell these Defined Cards will only have one of them - ArrayList objects = AbilityFactory.getDefinedObjects(sa.getSourceCard(), params.get("Defined"), sa); - - // react to threats on the stack - if (AllZone.getStack().size() > 0) { - ArrayList threatenedObjects = AbilityFactory.predictThreatenedObjects(af); - for (Object o : objects) { - if (threatenedObjects.contains(o)) - chance = true; - } - } else { - if (AllZone.getPhase().is(Constant.Phase.Combat_Declare_Blockers_InstantAbility)) { - boolean flag = false; - for (Object o : objects) { - if (o instanceof Card) { - Card c = (Card) o; - flag |= CombatUtil.combatantWouldBeDestroyed(c); - } else if (o instanceof Player) { - Player p = (Player) o; - flag |= (p.isComputer() && CombatUtil.lifeInDanger(AllZone.getCombat())); - } - } - - chance = flag; - } else { // if nothing on the stack, and it's not declare blockers. no need to regen - return false; - } - } - } //targeted - - // react to threats on the stack - else if (AllZone.getStack().size() > 0) { - tgt.resetTargets(); - // check stack for something on the stack will kill anything i control - ArrayList objects = AbilityFactory.predictThreatenedObjects(af); - - if (objects.contains(AllZone.getComputerPlayer())) - tgt.addTarget(AllZone.getComputerPlayer()); - - CardList threatenedTargets = new CardList(); - // filter AIs battlefield by what I can target - CardList targetables = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - targetables = targetables.getValidCards(tgt.getValidTgts(), AllZone.getComputerPlayer(), hostCard); - - for (Card c : targetables) { - if (objects.contains(c)) - threatenedTargets.add(c); - } - - // Choose "best" of the remaining to save - tgt.addTarget(CardFactoryUtil.AI_getBestCreature(threatenedTargets)); - chance = true; - - } // Protect combatants - else if (AllZone.getPhase().is(Constant.Phase.Combat_Declare_Blockers_InstantAbility)) { - if (tgt.canTgtPlayer() && CombatUtil.wouldLoseLife(AllZone.getCombat()) - && (CombatUtil.lifeInDanger(AllZone.getCombat()) || sa.isAbility())) { - tgt.addTarget(AllZone.getComputerPlayer()); - chance = true; - } else { - // filter AIs battlefield by what I can target - CardList targetables = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - targetables = targetables.getValidCards(tgt.getValidTgts(), AllZone.getComputerPlayer(), hostCard); - - if (targetables.size() == 0) - return false; - CardList combatants = targetables.getType("Creature"); - CardListUtil.sortByEvaluateCreature(combatants); - - for (Card c : combatants) { - if (CombatUtil.combatantWouldBeDestroyed(c)) { - tgt.addTarget(c); - chance = true; - break; - } - } - } - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return chance; - } - - /** - *

doPreventDamageTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean doPreventDamageTriggerAI(final AbilityFactory af, final SpellAbility sa, boolean mandatory) { - boolean chance = false; - - if (!ComputerUtil.canPayCost(sa)) - return false; - - Target tgt = sa.getTarget(); - if (tgt == null) { - // If there's no target on the trigger, just say yes. - chance = true; - } else { - chance = preventDamageMandatoryTarget(af, sa, mandatory); - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.doTrigger(mandatory); - - return chance; - } - - /** - *

preventDamageMandatoryTarget.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean preventDamageMandatoryTarget(AbilityFactory af, SpellAbility sa, boolean mandatory) { - final Card hostCard = af.getHostCard(); - Target tgt = sa.getTarget(); - tgt.resetTargets(); - // filter AIs battlefield by what I can target - CardList targetables = AllZoneUtil.getCardsInPlay(); - targetables = targetables.getValidCards(tgt.getValidTgts(), AllZone.getComputerPlayer(), hostCard); - CardList compTargetables = targetables.getController(AllZone.getComputerPlayer()); - - if (targetables.size() == 0) - return false; - - if (!mandatory && compTargetables.size() == 0) - return false; - - if (compTargetables.size() > 0) { - CardList combatants = compTargetables.getType("Creature"); - CardListUtil.sortByEvaluateCreature(combatants); - if (AllZone.getPhase().is(Constant.Phase.Combat_Declare_Blockers_InstantAbility)) { - for (Card c : combatants) { - if (CombatUtil.combatantWouldBeDestroyed(c)) { - tgt.addTarget(c); - return true; - } - } - } - - // TODO see if something on the stack is about to kill something i can target - - tgt.addTarget(combatants.get(0)); - return true; - } - - tgt.addTarget(CardFactoryUtil.AI_getCheapestPermanent(targetables, hostCard, true)); - return true; - } - - /** - *

preventDamageResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void preventDamageResolve(final AbilityFactory af, final SpellAbility sa) { - final HashMap params = af.getMapParams(); - int numDam = AbilityFactory.calculateAmount(af.getHostCard(), params.get("Amount"), sa); - - ArrayList tgts; - if (sa.getTarget() == null) - tgts = AbilityFactory.getDefinedObjects(sa.getSourceCard(), params.get("Defined"), sa); - else - tgts = sa.getTarget().getTargets(); - - boolean targeted = (af.getAbTgt() != null); - - for (Object o : tgts) { - if (o instanceof Card) { - Card c = (Card) o; - if (AllZoneUtil.isCardInPlay(c) && (!targeted || CardFactoryUtil.canTarget(af.getHostCard(), c))) { - c.addPreventNextDamage(numDam); - } - - } else if (o instanceof Player) { - Player p = (Player) o; - if (!targeted || p.canTarget(sa)) { - p.addPreventNextDamage(numDam); - } - } - } - }//doResolve -} diff --git a/src/forge/card/abilityFactory/AbilityFactory_Pump.java b/src/forge/card/abilityFactory/AbilityFactory_Pump.java deleted file mode 100644 index c5a3a6cbbd7..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_Pump.java +++ /dev/null @@ -1,1057 +0,0 @@ -package forge.card.abilityFactory; - -import forge.*; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.*; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Random; - -/** - *

AbilityFactory_Pump class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_Pump { - - private final ArrayList Keywords = new ArrayList(); - - private String numAttack; - private String numDefense; - - private AbilityFactory AF = null; - private HashMap params = null; - private Card hostCard = null; - - /** - *

Constructor for AbilityFactory_Pump.

- * - * @param newAF a {@link forge.card.abilityFactory.AbilityFactory} object. - */ - public AbilityFactory_Pump(AbilityFactory newAF) { - AF = newAF; - - params = AF.getMapParams(); - - hostCard = AF.getHostCard(); - - numAttack = (params.containsKey("NumAtt")) ? params.get("NumAtt") : "0"; - numDefense = (params.containsKey("NumDef")) ? params.get("NumDef") : "0"; - - // Start with + sign now optional - if (numAttack.startsWith("+")) - numAttack = numAttack.substring(1); - if (numDefense.startsWith("+")) - numDefense = numDefense.substring(1); - - if (params.containsKey("KW")) { - String tmp = params.get("KW"); - String kk[] = tmp.split(" & "); - - Keywords.clear(); - for (int i = 0; i < kk.length; i++) - Keywords.add(kk[i]); - } else - Keywords.add("none"); - } - - /** - *

getSpellPump.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility getSpellPump() { - SpellAbility spPump = new Spell(hostCard, AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = 42244224L; - - @Override - public boolean canPlayAI() { - return pumpPlayAI(this); - } - - @Override - public String getStackDescription() { - return pumpStackDescription(AF, this); - } - - @Override - public void resolve() { - pumpResolve(this); - }//resolve - };//SpellAbility - - return spPump; - } - - /** - *

getAbilityPump.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility getAbilityPump() { - final SpellAbility abPump = new Ability_Activated(hostCard, AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = -1118592153328758083L; - - @Override - public boolean canPlayAI() { - return pumpPlayAI(this); - } - - @Override - public String getStackDescription() { - return pumpStackDescription(AF, this); - } - - @Override - public void resolve() { - pumpResolve(this); - }//resolve() - - @Override - public boolean doTrigger(boolean mandatory) { - return pumpTriggerAI(AF, this, mandatory); - } - - - };//SpellAbility - - return abPump; - } - - /** - *

getDrawbackPump.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility getDrawbackPump() { - SpellAbility dbPump = new Ability_Sub(hostCard, AF.getAbTgt()) { - private static final long serialVersionUID = 42244224L; - - @Override - public boolean canPlayAI() { - return pumpPlayAI(this); - } - - @Override - public String getStackDescription() { - return pumpStackDescription(AF, this); - } - - @Override - public void resolve() { - pumpResolve(this); - }//resolve - - @Override - public boolean chkAI_Drawback() { - return pumpDrawbackAI(this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return pumpTriggerAI(AF, this, mandatory); - } - };//SpellAbility - - return dbPump; - } - - /** - *

Getter for the field numAttack.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a int. - */ - private int getNumAttack(SpellAbility sa) { - return AbilityFactory.calculateAmount(hostCard, numAttack, sa); - } - - /** - *

Getter for the field numDefense.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a int. - */ - private int getNumDefense(SpellAbility sa) { - return AbilityFactory.calculateAmount(hostCard, numDefense, sa); - } - - /** - *

getPumpCreatures.

- * - * @param defense a int. - * @param attack a int. - * @return a {@link forge.CardList} object. - */ - private CardList getPumpCreatures(final int defense, final int attack) { - - final boolean kHaste = Keywords.contains("Haste"); - final boolean evasive = (Keywords.contains("Flying") || Keywords.contains("Horsemanship") || - Keywords.contains("HIDDEN Unblockable") || Keywords.contains("Fear") || Keywords.contains("Intimidate")); - final boolean kSize = !Keywords.get(0).equals("none"); - String KWpump[] = {"none"}; - if (!Keywords.get(0).equals("none")) - KWpump = Keywords.toArray(new String[Keywords.size()]); - final String KWs[] = KWpump; - - CardList list = AllZoneUtil.getCreaturesInPlay(AllZone.getComputerPlayer()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (!CardFactoryUtil.canTarget(hostCard, c)) - return false; - - if (c.getNetDefense() + defense <= 0) //don't kill the creature - return false; - - //Don't add duplicate keywords - boolean hKW = c.hasAnyKeyword(KWs); - if (kSize && hKW) return false; - - //give haste to creatures that could attack with it - if (c.hasSickness() && kHaste && AllZone.getPhase().isPlayerTurn(AllZone.getComputerPlayer()) && CombatUtil.canAttackNextTurn(c) - && AllZone.getPhase().isBefore(Constant.Phase.Combat_Declare_Attackers)) - return true; - - //give evasive keywords to creatures that can attack - if (evasive && AllZone.getPhase().isPlayerTurn(AllZone.getComputerPlayer()) && CombatUtil.canAttack(c) - && AllZone.getPhase().isBefore(Constant.Phase.Combat_Declare_Attackers) && c.getNetCombatDamage() > 0) - return true; - - //will the creature attack (only relevant for sorcery speed)? - if (CardFactoryUtil.AI_doesCreatureAttack(c) && AllZone.getPhase().isBefore(Constant.Phase.Combat_Declare_Attackers) - && AllZone.getPhase().isPlayerTurn(AllZone.getComputerPlayer())) - return true; - - //is the creature blocking and unable to destroy the attacker or would be destroyed itself? - if (c.isBlocking() && (CombatUtil.blockerWouldBeDestroyed(c) - || !CombatUtil.attackerWouldBeDestroyed(AllZone.getCombat().getAttackerBlockedBy(c)))) - return true; - - //is the creature unblocked and the spell will pump its power? - if (AllZone.getPhase().isAfter(Constant.Phase.Combat_Declare_Blockers) && AllZone.getCombat().isAttacking(c) - && AllZone.getCombat().isUnblocked(c) && attack > 0) - return true; - - //is the creature in blocked and the blocker would survive - if (AllZone.getPhase().isAfter(Constant.Phase.Combat_Declare_Blockers) && AllZone.getCombat().isAttacking(c) - && AllZone.getCombat().isBlocked(c) - && CombatUtil.blockerWouldBeDestroyed(AllZone.getCombat().getBlockers(c).get(0))) - return true; - - //if the life of the computer is in danger, try to pump potential blockers before declaring blocks - if (CombatUtil.lifeInDanger(AllZone.getCombat()) && AllZone.getPhase().isAfter(Constant.Phase.Combat_Declare_Attackers) - && AllZone.getPhase().isBefore(Constant.Phase.Main2) - && CombatUtil.canBlock(c, AllZone.getCombat()) && AllZone.getPhase().isPlayerTurn(AllZone.getHumanPlayer())) - return true; - - return false; - } - }); - return list; - }//getPumpCreatures() - - /** - *

getCurseCreatures.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param defense a int. - * @param attack a int. - * @return a {@link forge.CardList} object. - */ - private CardList getCurseCreatures(SpellAbility sa, final int defense, int attack) { - CardList list = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer()); - list = list.filter(AllZoneUtil.getCanTargetFilter(hostCard)); - - if (defense < 0 && !list.isEmpty()) { // with spells that give -X/-X, compi will try to destroy a creature - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (c.getNetDefense() <= -defense) return true; // can kill indestructible creatures - return (c.getKillDamage() <= -defense && !c.hasKeyword("Indestructible")); - } - }); // leaves all creatures that will be destroyed - } // -X/-X end - else if (!list.isEmpty()) { - String KWpump[] = {"none"}; - if (!Keywords.get(0).equals("none")) - KWpump = Keywords.toArray(new String[Keywords.size()]); - final String KWs[] = KWpump; - final boolean addsKeywords = Keywords.size() > 0; - - if (addsKeywords) { - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return !c.hasAnyKeyword(KWs); // don't add duplicate negative keywords - } - }); - } - } - - - return list; - }//getCurseCreatures() - - /** - *

pumpPlayAI.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private boolean pumpPlayAI(SpellAbility sa) { - // if there is no target and host card isn't in play, don't activate - if (AF.getAbTgt() == null && !AllZoneUtil.isCardInPlay(hostCard)) - return false; - - // temporarily disabled until AI is improved - if (AF.getAbCost().getSacCost() && sa.getSourceCard().isCreature()) return false; - if (AF.getAbCost().getLifeCost()) { - if (!AF.isCurse()) return false; //Use life only to kill creatures - if (AllZone.getComputerPlayer().getLife() - AF.getAbCost().getLifeAmount() < 4) - return false; - } - if (AF.getAbCost().getDiscardCost() && !AF.isCurse()) { - return false; - } - if (AF.getAbCost().getSubCounter()) { - // instead of never removing counters, we will have a random possibility of failure. - // all the other tests still need to pass if a counter will be removed - Counters count = AF.getAbCost().getCounterType(); - double chance = .66; - if (count.equals(Counters.P1P1)) { // 10% chance to remove +1/+1 to pump - chance = .1; - } else if (count.equals(Counters.CHARGE)) { // 50% chance to remove charge to pump - chance = .5; - } - Random r = MyRandom.random; - if (r.nextFloat() > chance) - return false; - } - - SpellAbility_Restriction restrict = sa.getRestrictions(); - - // Phase Restrictions - if (AllZone.getStack().size() == 0 && AllZone.getPhase().isBefore(Constant.Phase.Combat_Begin)) { - // Instant-speed pumps should not be cast outside of combat when the stack is empty - if (!AF.isCurse()) { - if (!AbilityFactory.isSorcerySpeed(sa)) - return false; - } - } else if (AllZone.getStack().size() > 0) { - // TODO: pump something only if the top thing on the stack will kill it via damage - // or if top thing on stack will pump it/enchant it and I want to kill it - return false; - } - - int activations = restrict.getNumberTurnActivations(); - int sacActivations = restrict.getActivationNumberSacrifice(); - //don't risk sacrificing a creature just to pump it - if (sacActivations != -1 && activations >= (sacActivations - 1)) { - return false; - } - - Card source = sa.getSourceCard(); - if (source.getSVar("X").equals("Count$xPaid")) - source.setSVar("PayX", ""); - - int defense; - if (numDefense.contains("X") && source.getSVar("X").equals("Count$xPaid")) { - // Set PayX here to maximum value. - int xPay = ComputerUtil.determineLeftoverMana(sa); - source.setSVar("PayX", Integer.toString(xPay)); - defense = xPay; - } else - defense = getNumDefense(sa); - - int attack; - if (numAttack.contains("X") && source.getSVar("X").equals("Count$xPaid")) { - // Set PayX here to maximum value. - String toPay = source.getSVar("PayX"); - - if (toPay.equals("")) { - int xPay = ComputerUtil.determineLeftoverMana(sa); - source.setSVar("PayX", Integer.toString(xPay)); - attack = xPay; - } else - attack = Integer.parseInt(toPay); - } else - attack = getNumAttack(sa); - - if (AF.getAbTgt() == null || !AF.getAbTgt().doesTarget()) { - ArrayList cards = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa); - - if (cards.size() == 0) - return false; - - // when this happens we need to expand AI to consider if its ok for everything? - for (Card card : cards) { - // TODO: if AI doesn't control Card and Pump is a Curse, than maybe use? - if ((card.getNetDefense() + defense > 0) && (!card.hasAnyKeyword(Keywords))) { - if (card.hasSickness() && Keywords.contains("Haste")) - return true; - else if (card.hasSickness() ^ Keywords.contains("Haste")) - return false; - else if (hostCard.equals(card)) { - Random r = MyRandom.random; - if (r.nextFloat() <= Math.pow(.6667, activations)) - return CardFactoryUtil.AI_doesCreatureAttack(card) && !sa.getPayCosts().getTap(); - } else { - Random r = MyRandom.random; - return (r.nextFloat() <= Math.pow(.6667, activations)); - } - } - } - } else - return pumpTgtAI(sa, defense, attack, false); - - return false; - }//pumpPlayAI() - - /** - *

pumpTgtAI.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param defense a int. - * @param attack a int. - * @param mandatory a boolean. - * @return a boolean. - */ - private boolean pumpTgtAI(SpellAbility sa, int defense, int attack, boolean mandatory) { - if (!mandatory && AllZone.getPhase().isAfter(Constant.Phase.Combat_Declare_Blockers_InstantAbility) && !(AF.isCurse() && defense < 0)) - return false; - - Target tgt = AF.getAbTgt(); - tgt.resetTargets(); - CardList list; - if (AF.isCurse()) // Curse means spells with negative effect - list = getCurseCreatures(sa, defense, attack); - else - list = getPumpCreatures(defense, attack); - - list = list.getValidCards(tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getSourceCard()); - - if (AllZone.getStack().size() == 0) { - // If the cost is tapping, don't activate before declare attack/block - if (sa.getPayCosts() != null && sa.getPayCosts().getTap()) { - if (AllZone.getPhase().isBefore(Constant.Phase.Combat_Declare_Attackers) && AllZone.getPhase().isPlayerTurn(AllZone.getComputerPlayer())) - list.remove(sa.getSourceCard()); - if (AllZone.getPhase().isBefore(Constant.Phase.Combat_Declare_Blockers) && AllZone.getPhase().isPlayerTurn(AllZone.getHumanPlayer())) - list.remove(sa.getSourceCard()); - } - } - - if (list.isEmpty()) - return mandatory && pumpMandatoryTarget(AF, sa, mandatory); - - while (tgt.getNumTargeted() < tgt.getMaxTargets(sa.getSourceCard(), sa)) { - Card t = null; - //boolean goodt = false; - - if (list.isEmpty()) { - if (tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa) || tgt.getNumTargeted() == 0) { - if (mandatory) - return pumpMandatoryTarget(AF, sa, mandatory); - - tgt.resetTargets(); - return false; - } else { - // TODO is this good enough? for up to amounts? - break; - } - } - - /*Not needed - if (AF.isCurse()){ - t = CardFactoryUtil.AI_getBestCreature(list); - goodt = true; - } - else{ - while(!goodt && !list.isEmpty()) { - t = CardFactoryUtil.AI_getBestCreature(list); - if((t.getNetDefense() + defense) > t.getDamage()) goodt = true; - else list.remove(t); - } - }*/ - - t = CardFactoryUtil.AI_getBestCreature(list); - tgt.addTarget(t); - list.remove(t); - } - - return true; - }//pumpTgtAI() - - /** - *

pumpMandatoryTarget.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private boolean pumpMandatoryTarget(AbilityFactory af, SpellAbility sa, boolean mandatory) { - CardList list = AllZoneUtil.getCardsInPlay(); - Target tgt = sa.getTarget(); - list = list.getValidCards(tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getSourceCard()); - - if (list.size() < tgt.getMinTargets(sa.getSourceCard(), sa)) { - tgt.resetTargets(); - return false; - } - - // Remove anything that's already been targeted - for (Card c : tgt.getTargetCards()) - list.remove(c); - - CardList pref; - CardList forced; - Card source = sa.getSourceCard(); - - if (af.isCurse()) { - pref = list.getController(AllZone.getHumanPlayer()); - forced = list.getController(AllZone.getComputerPlayer()); - } else { - pref = list.getController(AllZone.getComputerPlayer()); - forced = list.getController(AllZone.getHumanPlayer()); - } - - while (tgt.getNumTargeted() < tgt.getMaxTargets(source, sa)) { - if (pref.isEmpty()) - break; - - Card c; - if (pref.getNotType("Creature").size() == 0) - c = CardFactoryUtil.AI_getBestCreature(pref); - else - c = CardFactoryUtil.AI_getMostExpensivePermanent(pref, source, true); - - pref.remove(c); - - tgt.addTarget(c); - } - - while (tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) { - if (forced.isEmpty()) - break; - - Card c; - if (forced.getNotType("Creature").size() == 0) - c = CardFactoryUtil.AI_getWorstCreature(forced); - else - c = CardFactoryUtil.AI_getCheapestPermanent(forced, source, true); - - forced.remove(c); - - tgt.addTarget(c); - } - - if (tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) { - tgt.resetTargets(); - return false; - } - - return true; - }//pumpMandatoryTarget() - - - /** - *

pumpTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private boolean pumpTriggerAI(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) - return false; - - Card source = sa.getSourceCard(); - - int defense; - if (numDefense.contains("X") && source.getSVar("X").equals("Count$xPaid")) { - // Set PayX here to maximum value. - int xPay = ComputerUtil.determineLeftoverMana(sa); - source.setSVar("PayX", Integer.toString(xPay)); - defense = xPay; - } else - defense = getNumDefense(sa); - - int attack; - if (numAttack.contains("X") && source.getSVar("X").equals("Count$xPaid")) { - // Set PayX here to maximum value. - String toPay = source.getSVar("PayX"); - - if (toPay.equals("")) { - int xPay = ComputerUtil.determineLeftoverMana(sa); - source.setSVar("PayX", Integer.toString(xPay)); - attack = xPay; - } else - attack = Integer.parseInt(toPay); - } else - attack = getNumAttack(sa); - - if (sa.getTarget() == null) { - if (mandatory) - return true; - } else { - return pumpTgtAI(sa, defense, attack, mandatory); - } - - return true; - }//pumpTriggerAI - - /** - *

pumpDrawbackAI.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private boolean pumpDrawbackAI(SpellAbility sa) { - Card source = sa.getSourceCard(); - int defense; - if (numDefense.contains("X") && source.getSVar("X").equals("Count$xPaid")) { - defense = Integer.parseInt(source.getSVar("PayX")); - } else - defense = getNumDefense(sa); - - int attack; - if (numAttack.contains("X") && source.getSVar("X").equals("Count$xPaid")) { - attack = Integer.parseInt(source.getSVar("PayX")); - } else - attack = getNumAttack(sa); - - if (AF.getAbTgt() == null || !AF.getAbTgt().doesTarget()) { - if (hostCard.isCreature()) { - if (!hostCard.hasKeyword("Indestructible") && hostCard.getNetDefense() + defense <= hostCard.getDamage()) - return false; - if (hostCard.getNetDefense() + defense <= 0) - return false; - } - } else - return pumpTgtAI(sa, defense, attack, false); - - return true; - }//pumpDrawbackAI() - - /** - *

pumpStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private String pumpStackDescription(AbilityFactory af, SpellAbility sa) { - // when damageStackDescription is called, just build exactly what is happening - StringBuilder sb = new StringBuilder(); - String name = af.getHostCard().getName(); - - ArrayList tgtCards; - Target tgt = AF.getAbTgt(); - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else - tgtCards = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa); - - if (tgtCards.size() > 0) { - - if (sa instanceof Ability_Sub) - sb.append(" "); - else - sb.append(name).append(" - "); - - for (Card c : tgtCards) - sb.append(c.getName()).append(" "); - - final int atk = getNumAttack(sa); - final int def = getNumDefense(sa); - - sb.append("gains "); - if (atk != 0 || def != 0) { - if (atk >= 0) - sb.append("+"); - sb.append(atk); - sb.append("/"); - if (def >= 0) - sb.append("+"); - sb.append(def); - sb.append(" "); - } - - for (int i = 0; i < Keywords.size(); i++) { - if (!Keywords.get(i).equals("none")) - sb.append(Keywords.get(i)).append(" "); - } - - if (!params.containsKey("Permanent")) - sb.append("until end of turn."); - } - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - }//pumpStackDescription() - - /** - *

pumpResolve.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private void pumpResolve(SpellAbility sa) { - Player activator = sa.getActivatingPlayer(); - ArrayList tgtCards; - Target tgt = AF.getAbTgt(); - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else - tgtCards = AbilityFactory.getDefinedCards(hostCard, params.get("Defined"), sa); - - int size = tgtCards.size(); - for (int j = 0; j < size; j++) { - final Card tgtC = tgtCards.get(j); - - // only pump things in play - if (!AllZoneUtil.isCardInPlay(tgtC)) - continue; - - // if pump is a target, make sure we can still target now - if (tgt != null && !CardFactoryUtil.canTarget(AF.getHostCard(), tgtC)) - continue; - - final int a = getNumAttack(sa); - final int d = getNumDefense(sa); - - tgtC.addTempAttackBoost(a); - tgtC.addTempDefenseBoost(d); - - for (int i = 0; i < Keywords.size(); i++) { - if (!Keywords.get(i).equals("none")) - tgtC.addExtrinsicKeyword(Keywords.get(i)); - } - - if (!params.containsKey("Permanent")) { - // If not Permanent, remove Pumped at EOT - final Command untilEOT = new Command() { - private static final long serialVersionUID = -42244224L; - - public void execute() { - if (AllZoneUtil.isCardInPlay(tgtC)) { - tgtC.addTempAttackBoost(-1 * a); - tgtC.addTempDefenseBoost(-1 * d); - - if (Keywords.size() > 0) { - for (int i = 0; i < Keywords.size(); i++) { - if (!Keywords.get(i).equals("none")) - tgtC.removeExtrinsicKeyword(Keywords.get(i)); - } - } - - } - } - }; - if (params.containsKey("UntilEndOfCombat")) AllZone.getEndOfCombat().addUntil(untilEOT); - else if(params.containsKey("UntilYourNextUpkeep")) AllZone.getUpkeep().addUntil(activator, untilEOT); - else AllZone.getEndOfTurn().addUntil(untilEOT); - } - } - }//pumpResolve() - - - ///////////////////////////////////// - // - // PumpAll - // - ////////////////////////////////////// - - /** - *

getAbilityPumpAll.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility getAbilityPumpAll() { - final SpellAbility abPumpAll = new Ability_Activated(hostCard, AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = -8299417521903307630L; - - @Override - public boolean canPlayAI() { - return pumpAllCanPlayAI(this); - } - - @Override - public String getStackDescription() { - return pumpAllStackDescription(AF, this); - } - - @Override - public void resolve() { - pumpAllResolve(this); - }//resolve() - - - @Override - public boolean doTrigger(boolean mandatory) { - return pumpAllTriggerAI(AF, this, mandatory); - } - - };//SpellAbility - - return abPumpAll; - } - - /** - *

getSpellPumpAll.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility getSpellPumpAll() { - SpellAbility spPumpAll = new Spell(hostCard, AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = -4055467978660824703L; - - public boolean canPlayAI() { - return pumpAllCanPlayAI(this); - } - - @Override - public String getStackDescription() { - return pumpAllStackDescription(AF, this); - } - - public void resolve() { - pumpAllResolve(this); - }//resolve - };//SpellAbility - - return spPumpAll; - } - - /** - *

getDrawbackPumpAll.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility getDrawbackPumpAll() { - SpellAbility dbPumpAll = new Ability_Sub(hostCard, AF.getAbTgt()) { - private static final long serialVersionUID = 6411531984691660342L; - - @Override - public String getStackDescription() { - return pumpAllStackDescription(AF, this); - } - - @Override - public void resolve() { - pumpAllResolve(this); - }//resolve - - @Override - public boolean chkAI_Drawback() { - return pumpAllChkDrawbackAI(this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return pumpAllTriggerAI(AF, this, mandatory); - } - };//SpellAbility - - return dbPumpAll; - } - - /** - *

pumpAllCanPlayAI.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private boolean pumpAllCanPlayAI(SpellAbility sa) { - String valid = ""; - Random r = MyRandom.random; - final Card source = sa.getSourceCard(); - params = AF.getMapParams(); - final int defense = getNumDefense(sa); - - boolean chance = r.nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn()); //to prevent runaway activations - - if (params.containsKey("ValidCards")) { - valid = params.get("ValidCards"); - } - - CardList comp = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - comp = comp.getValidCards(valid, hostCard.getController(), hostCard); - CardList human = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - human = human.getValidCards(valid, hostCard.getController(), hostCard); - - //only count creatures that can attack - human = human.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CombatUtil.canAttack(c) && !AF.isCurse(); - } - }); - - if (AF.isCurse()) { - if (defense < 0) { // try to destroy creatures - comp = comp.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (c.getNetDefense() <= -defense) return true; // can kill indestructible creatures - return (c.getKillDamage() <= -defense && !c.hasKeyword("Indestructible")); - } - }); // leaves all creatures that will be destroyed - human = human.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (c.getNetDefense() <= -defense) return true; // can kill indestructible creatures - return (c.getKillDamage() <= -defense && !c.hasKeyword("Indestructible")); - } - }); // leaves all creatures that will be destroyed - } // -X/-X end - - //evaluate both lists and pass only if human creatures are more valuable - if (CardFactoryUtil.evaluateCreatureList(comp) + 200 >= CardFactoryUtil.evaluateCreatureList(human)) - return false; - - return chance; - }//end Curse - - //don't use non curse PumpAll after Combat_Begin until AI is improved - if (AllZone.getPhase().isAfter(Constant.Phase.Combat_Begin)) - return false; - - if (comp.size() <= human.size() || comp.size() <= 1) - return false; - - return (r.nextFloat() < .6667) && chance; - }//pumpAllCanPlayAI() - - /** - *

pumpAllResolve.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private void pumpAllResolve(SpellAbility sa) { - AbilityFactory af = sa.getAbilityFactory(); - CardList list; - ArrayList tgtPlayers = null; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else if (params.containsKey("Defined")) // Make sure Defined exists to use it - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - if (tgtPlayers == null || tgtPlayers.isEmpty()) - list = AllZoneUtil.getCardsInPlay(); - else - list = AllZoneUtil.getPlayerCardsInPlay(tgtPlayers.get(0)); - - String valid = ""; - if (params.containsKey("ValidCards")) - valid = params.get("ValidCards"); - - list = list.getValidCards(valid.split(","), hostCard.getController(), hostCard); - - final int a = getNumAttack(sa); - final int d = getNumDefense(sa); - - for (Card c : list) { - final Card tgtC = c; - - // only pump things in play - if (!AllZoneUtil.isCardInPlay(tgtC)) - continue; - - tgtC.addTempAttackBoost(a); - tgtC.addTempDefenseBoost(d); - - for (int i = 0; i < Keywords.size(); i++) { - if (!Keywords.get(i).equals("none")) - tgtC.addExtrinsicKeyword(Keywords.get(i)); - } - - if (!params.containsKey("Permanent")) { - // If not Permanent, remove Pumped at EOT - final Command untilEOT = new Command() { - private static final long serialVersionUID = 5415795460189457660L; - - public void execute() { - if (AllZoneUtil.isCardInPlay(tgtC)) { - tgtC.addTempAttackBoost(-1 * a); - tgtC.addTempDefenseBoost(-1 * d); - - if (Keywords.size() > 0) { - for (int i = 0; i < Keywords.size(); i++) { - if (!Keywords.get(i).equals("none")) { - tgtC.removeExtrinsicKeyword(Keywords.get(i)); - } - } - } - } - } - }; - - AllZone.getEndOfTurn().addUntil(untilEOT); - } - } - }//pumpAllResolve() - - /** - *

pumpAllTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private boolean pumpAllTriggerAI(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) - return false; - - // TODO: add targeting consideration such as "Creatures target player controls gets" - - return true; - } - - /** - *

pumpAllChkDrawbackAI.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private boolean pumpAllChkDrawbackAI(SpellAbility sa) { - return true; - } - - /** - *

pumpAllStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private String pumpAllStackDescription(AbilityFactory af, SpellAbility sa) { - StringBuilder sb = new StringBuilder(); - - String desc = ""; - if (params.containsKey("SpellDescription")) { - desc = params.get("SpellDescription"); - } else if (params.containsKey("PumpAllDescription")) { - desc = params.get("PumpAllDescription"); - } - - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard()).append(" - "); - else - sb.append(" "); - sb.append(desc); - - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - }//pumpAllStackDescription() - -}//end class AbilityFactory_Pump diff --git a/src/forge/card/abilityFactory/AbilityFactory_Regenerate.java b/src/forge/card/abilityFactory/AbilityFactory_Regenerate.java deleted file mode 100644 index 112de4a686f..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_Regenerate.java +++ /dev/null @@ -1,660 +0,0 @@ -package forge.card.abilityFactory; - -import forge.*; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.*; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; - -/** - *

AbilityFactory_Regenerate class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_Regenerate { - - // Ex: A:SP$Regenerate | Cost$W | Tgt$TgtC | SpellDescription$Regenerate target creature. - // http://www.slightlymagic.net/wiki/Forge_AbilityFactory#Regenerate - - //************************************************************** - // ********************* Regenerate **************************** - //************************************************************** - - /** - *

getAbilityRegenerate.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility getAbilityRegenerate(final AbilityFactory af) { - - final SpellAbility abRegenerate = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -6386981911243700037L; - - @Override - public boolean canPlayAI() { - return regenerateCanPlayAI(af, this); - } - - @Override - public void resolve() { - regenerateResolve(af, this); - } - - @Override - public String getStackDescription() { - return regenerateStackDescription(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return doTriggerAI(af, this, mandatory); - } - - };//Ability_Activated - - return abRegenerate; - } - - /** - *

getSpellRegenerate.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility getSpellRegenerate(final AbilityFactory af) { - - final SpellAbility spRegenerate = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -3899905398102316582L; - - @Override - public boolean canPlayAI() { - return regenerateCanPlayAI(af, this); - } - - @Override - public void resolve() { - regenerateResolve(af, this); - } - - @Override - public String getStackDescription() { - return regenerateStackDescription(af, this); - } - - }; // Spell - - return spRegenerate; - } - - /** - *

createDrawbackRegenerate.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackRegenerate(final AbilityFactory af) { - final SpellAbility dbRegen = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = -2295483806708528744L; - - @Override - public String getStackDescription() { - return regenerateStackDescription(af, this); - } - - @Override - public void resolve() { - regenerateResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return doTriggerAI(af, this, mandatory); - } - - }; - return dbRegen; - } - - /** - *

regenerateStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String regenerateStackDescription(AbilityFactory af, SpellAbility sa) { - final HashMap params = af.getMapParams(); - StringBuilder sb = new StringBuilder(); - Card host = af.getHostCard(); - - ArrayList tgtCards; - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else - tgtCards = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa); - - if (tgtCards.size() > 0) { - if (sa instanceof Ability_Sub) - sb.append(" "); - else - sb.append(host).append(" - "); - - sb.append("Regenerate "); - Iterator it = tgtCards.iterator(); - while (it.hasNext()) { - Card tgtC = it.next(); - if (tgtC.isFaceDown()) sb.append("Morph"); - else sb.append(tgtC); - - if (it.hasNext()) sb.append(", "); - } - } - sb.append("."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

regenerateCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean regenerateCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - final HashMap params = af.getMapParams(); - final Card hostCard = af.getHostCard(); - boolean chance = false; - Cost abCost = af.getAbCost(); - if (abCost != null) { - // AI currently disabled for these costs - if (abCost.getSacCost() && !abCost.getSacThis()) { - //only sacrifice something that's supposed to be sacrificed - String type = abCost.getSacType(); - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - typeList = typeList.getValidCards(type.split(","), hostCard.getController(), hostCard); - if (ComputerUtil.getCardPreference(hostCard, "SacCost", typeList) == null) - return false; - } - if (abCost.getLifeCost()) { - if (AllZone.getComputerPlayer().getLife() - abCost.getLifeAmount() < 4) - return false; - } - } - - Target tgt = sa.getTarget(); - if (tgt == null) { - // As far as I can tell these Defined Cards will only have one of them - ArrayList list = AbilityFactory.getDefinedCards(hostCard, params.get("Defined"), sa); - - if (AllZone.getStack().size() > 0) { - ArrayList objects = AbilityFactory.predictThreatenedObjects(af); - - for (Card c : list) { - if (objects.contains(c)) - chance = true; - } - } else { - if (AllZone.getPhase().is(Constant.Phase.Combat_Declare_Blockers_InstantAbility)) { - boolean flag = false; - - for (Card c : list) { - if (c.getShield() == 0) - flag |= CombatUtil.combatantWouldBeDestroyed(c); - } - - chance = flag; - } else { // if nothing on the stack, and it's not declare blockers. no need to regen - return false; - } - } - } else { - tgt.resetTargets(); - // filter AIs battlefield by what I can target - CardList targetables = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - targetables = targetables.getValidCards(tgt.getValidTgts(), AllZone.getComputerPlayer(), hostCard); - - if (targetables.size() == 0) - return false; - - if (AllZone.getStack().size() > 0) { - // check stack for something on the stack will kill anything i control - ArrayList objects = AbilityFactory.predictThreatenedObjects(af); - - CardList threatenedTargets = new CardList(); - - for (Card c : targetables) { - if (objects.contains(c) && c.getShield() == 0) - threatenedTargets.add(c); - } - - if (!threatenedTargets.isEmpty()) { - // Choose "best" of the remaining to regenerate - tgt.addTarget(CardFactoryUtil.AI_getBestCreature(threatenedTargets)); - chance = true; - } - } else { - if (AllZone.getPhase().is(Constant.Phase.Combat_Declare_Blockers_InstantAbility)) { - CardList combatants = targetables.getType("Creature"); - CardListUtil.sortByEvaluateCreature(combatants); - - for (Card c : combatants) { - if (c.getShield() == 0 && CombatUtil.combatantWouldBeDestroyed(c)) { - tgt.addTarget(c); - chance = true; - break; - } - } - } - } - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return chance; - }//regenerateCanPlayAI - - /** - *

doTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean doTriggerAI(final AbilityFactory af, final SpellAbility sa, boolean mandatory) { - boolean chance = false; - - if (!ComputerUtil.canPayCost(sa)) - return false; - - Target tgt = sa.getTarget(); - if (tgt == null) { - // If there's no target on the trigger, just say yes. - chance = true; - } else { - chance = regenMandatoryTarget(af, sa, mandatory); - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.doTrigger(mandatory); - - return chance; - } - - /** - *

regenMandatoryTarget.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean regenMandatoryTarget(AbilityFactory af, SpellAbility sa, boolean mandatory) { - final Card hostCard = af.getHostCard(); - Target tgt = sa.getTarget(); - tgt.resetTargets(); - // filter AIs battlefield by what I can target - CardList targetables = AllZoneUtil.getCardsInPlay(); - targetables = targetables.getValidCards(tgt.getValidTgts(), AllZone.getComputerPlayer(), hostCard); - CardList compTargetables = targetables.getController(AllZone.getComputerPlayer()); - - if (targetables.size() == 0) - return false; - - if (!mandatory && compTargetables.size() == 0) - return false; - - if (compTargetables.size() > 0) { - CardList combatants = compTargetables.getType("Creature"); - CardListUtil.sortByEvaluateCreature(combatants); - if (AllZone.getPhase().is(Constant.Phase.Combat_Declare_Blockers_InstantAbility)) { - for (Card c : combatants) { - if (c.getShield() == 0 && CombatUtil.combatantWouldBeDestroyed(c)) { - tgt.addTarget(c); - return true; - } - } - } - - // TODO see if something on the stack is about to kill something i can target - - // choose my best X without regen - if (compTargetables.getNotType("Creature").size() == 0) { - for (Card c : combatants) { - if (c.getShield() == 0) { - tgt.addTarget(c); - return true; - } - } - tgt.addTarget(combatants.get(0)); - return true; - } else { - CardListUtil.sortByMostExpensive(compTargetables); - for (Card c : compTargetables) { - if (c.getShield() == 0) { - tgt.addTarget(c); - return true; - } - } - tgt.addTarget(compTargetables.get(0)); - return true; - } - } - - tgt.addTarget(CardFactoryUtil.AI_getCheapestPermanent(targetables, hostCard, true)); - return true; - } - - /** - *

regenerateResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void regenerateResolve(final AbilityFactory af, final SpellAbility sa) { - Card hostCard = af.getHostCard(); - final HashMap params = af.getMapParams(); - - ArrayList tgtCards; - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtCards = tgt.getTargetCards(); - else - tgtCards = AbilityFactory.getDefinedCards(hostCard, params.get("Defined"), sa); - - for (final Card tgtC : tgtCards) { - final Command untilEOT = new Command() { - private static final long serialVersionUID = 1922050611313909200L; - - public void execute() { - tgtC.resetShield(); - } - }; - - if (AllZoneUtil.isCardInPlay(tgtC) && (tgt == null || CardFactoryUtil.canTarget(hostCard, tgtC))) { - tgtC.addShield(); - AllZone.getEndOfTurn().addUntil(untilEOT); - } - } - }//regenerateResolve - - //************************************************************** - // ********************* RegenerateAll ************************* - //************************************************************** - - /** - *

getAbilityRegenerateAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility getAbilityRegenerateAll(final AbilityFactory af) { - - final SpellAbility abRegenerateAll = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -3001272997209059394L; - - @Override - public boolean canPlayAI() { - return regenerateAllCanPlayAI(af, this); - } - - @Override - public void resolve() { - regenerateAllResolve(af, this); - } - - @Override - public String getStackDescription() { - return regenerateAllStackDescription(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return regenerateAllDoTriggerAI(af, this, mandatory); - } - - };//Ability_Activated - - return abRegenerateAll; - } - - /** - *

getSpellRegenerateAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility getSpellRegenerateAll(final AbilityFactory af) { - - final SpellAbility spRegenerateAll = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -4185454527676705881L; - - @Override - public boolean canPlayAI() { - return regenerateAllCanPlayAI(af, this); - } - - @Override - public void resolve() { - regenerateAllResolve(af, this); - } - - @Override - public String getStackDescription() { - return regenerateAllStackDescription(af, this); - } - - }; // Spell - - return spRegenerateAll; - } - - /** - *

createDrawbackRegenerateAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackRegenerateAll(final AbilityFactory af) { - final SpellAbility dbRegenAll = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = 4777861790603705572L; - - @Override - public String getStackDescription() { - return regenerateAllStackDescription(af, this); - } - - @Override - public void resolve() { - regenerateAllResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return regenerateAllDoTriggerAI(af, this, mandatory); - } - - }; - return dbRegenAll; - } - - /** - *

regenerateAllStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String regenerateAllStackDescription(AbilityFactory af, SpellAbility sa) { - final HashMap params = af.getMapParams(); - StringBuilder sb = new StringBuilder(); - Card host = af.getHostCard(); - - if (sa instanceof Ability_Sub) - sb.append(" "); - else - sb.append(host).append(" - "); - - String desc = ""; - if (params.containsKey("SpellDescription")) { - desc = params.get("SpellDescription"); - } else { - desc = "Regenerate all valid cards."; - } - - sb.append(desc); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

regenerateAllCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean regenerateAllCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - final HashMap params = af.getMapParams(); - final Card hostCard = af.getHostCard(); - boolean chance = false; - Cost abCost = af.getAbCost(); - if (abCost != null) { - // AI currently disabled for these costs - if (abCost.getSacCost() && !abCost.getSacThis()) { - //only sacrifice something that's supposed to be sacrificed - String type = abCost.getSacType(); - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - typeList = typeList.getValidCards(type.split(","), hostCard.getController(), hostCard); - if (ComputerUtil.getCardPreference(hostCard, "SacCost", typeList) == null) - return false; - } - if (abCost.getLifeCost()) { - if (AllZone.getComputerPlayer().getLife() - abCost.getLifeAmount() < 4) - return false; - } - } - - // filter AIs battlefield by what I can target - String valid = ""; - - if (params.containsKey("ValidCards")) - valid = params.get("ValidCards"); - - CardList list = AllZoneUtil.getCardsInPlay(); - list = list.getValidCards(valid.split(","), hostCard.getController(), hostCard); - - if (list.size() == 0) - return false; - - int numSaved = 0; - if (AllZone.getStack().size() > 0) { - //TODO - check stack for something on the stack will kill anything i control - } else { - - if (AllZone.getPhase().is(Constant.Phase.Combat_Declare_Blockers_InstantAbility)) { - CardList combatants = list.getType("Creature"); - - for (Card c : combatants) { - if (c.getShield() == 0 && CombatUtil.combatantWouldBeDestroyed(c)) { - numSaved++; - } - } - } - } - - if (numSaved > 1) { - chance = true; - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return chance; - } - - /** - *

regenerateAllDoTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean regenerateAllDoTriggerAI(final AbilityFactory af, final SpellAbility sa, boolean mandatory) { - boolean chance = true; - - if (!ComputerUtil.canPayCost(sa)) - return false; - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.doTrigger(mandatory); - - return chance; - } - - /** - *

regenerateAllResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void regenerateAllResolve(final AbilityFactory af, final SpellAbility sa) { - Card hostCard = af.getHostCard(); - final HashMap params = af.getMapParams(); - String valid = ""; - - if (params.containsKey("ValidCards")) - valid = params.get("ValidCards"); - - CardList list = AllZoneUtil.getCardsInPlay(); - list = list.getValidCards(valid.split(","), hostCard.getController(), hostCard); - - for (final Card c : list) { - final Command untilEOT = new Command() { - private static final long serialVersionUID = 259368227093961103L; - - public void execute() { - c.resetShield(); - } - }; - - if (AllZoneUtil.isCardInPlay(c)) { - c.addShield(); - AllZone.getEndOfTurn().addUntil(untilEOT); - } - } - }//regenerateAllResolve - -}//end class AbilityFactory_Regenerate diff --git a/src/forge/card/abilityFactory/AbilityFactory_Reveal.java b/src/forge/card/abilityFactory/AbilityFactory_Reveal.java deleted file mode 100644 index 5276bfcce65..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_Reveal.java +++ /dev/null @@ -1,1229 +0,0 @@ -package forge.card.abilityFactory; - -import forge.*; -import forge.card.spellability.*; -import forge.gui.GuiUtils; - -import javax.swing.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Random; - -/** - *

AbilityFactory_Reveal class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_Reveal { - - // ************************************************************************* - // ************************* Dig ******************************************* - // ************************************************************************* - - /** - *

createAbilityDig.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityDig(final AbilityFactory af) { - - final SpellAbility abDig = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 4239474096624403497L; - - @Override - public String getStackDescription() { - return digStackDescription(af, this); - } - - public boolean canPlayAI() { - return digCanPlayAI(af, this); - } - - @Override - public void resolve() { - digResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return digTriggerAI(af, this, mandatory); - } - - }; - return abDig; - } - - /** - *

createSpellDig.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellDig(final AbilityFactory af) { - final SpellAbility spDig = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 3389143507816474146L; - - @Override - public String getStackDescription() { - return digStackDescription(af, this); - } - - public boolean canPlayAI() { - return digCanPlayAI(af, this); - } - - @Override - public void resolve() { - digResolve(af, this); - } - - }; - return spDig; - } - - /** - *

createDrawbackDig.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackDig(final AbilityFactory af) { - final SpellAbility dbDig = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = -3372788479421357024L; - - @Override - public String getStackDescription() { - return digStackDescription(af, this); - } - - @Override - public void resolve() { - digResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return digTriggerAI(af, this, mandatory); - } - - }; - return dbDig; - } - - /** - *

digStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String digStackDescription(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - Card host = af.getHostCard(); - StringBuilder sb = new StringBuilder(); - int numToDig = AbilityFactory.calculateAmount(af.getHostCard(), params.get("DigNum"), sa); - - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard()).append(" - "); - else - sb.append(" "); - - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - sb.append(host.getController()).append(" looks at the top ").append(numToDig); - sb.append(" card"); - if (numToDig != 1) sb.append("s"); - sb.append(" of "); - if (tgtPlayers.contains(host.getController())) { - sb.append("his or her "); - } else { - for (Player p : tgtPlayers) { - sb.append(p).append("'s "); - } - } - sb.append("library."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

digCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean digCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - - double chance = .4; // 40 percent chance with instant speed stuff - if (AbilityFactory.isSorcerySpeed(sa)) - chance = .667; // 66.7% chance for sorcery speed (since it will never activate EOT) - Random r = MyRandom.random; - boolean randomReturn = r.nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1); - - Target tgt = sa.getTarget(); - Player libraryOwner = AllZone.getComputerPlayer(); - - if (sa.getTarget() != null) { - tgt.resetTargets(); - if (!AllZone.getHumanPlayer().canTarget(sa)) - return false; - else - sa.getTarget().addTarget(AllZone.getHumanPlayer()); - libraryOwner = AllZone.getHumanPlayer(); - } - - //return false if nothing to dig into - if (AllZoneUtil.getCardsInZone(Constant.Zone.Library, libraryOwner).isEmpty()) - return false; - - if (AbilityFactory.playReusable(sa)) - randomReturn = true; - - if (af.hasSubAbility()) { - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - return randomReturn && abSub.chkAI_Drawback(); - } - } - - return randomReturn; - } - - /** - *

digTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean digTriggerAI(final AbilityFactory af, final SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) - return false; - - Target tgt = sa.getTarget(); - - if (sa.getTarget() != null) { - tgt.resetTargets(); - sa.getTarget().addTarget(AllZone.getComputerPlayer()); - } - - return true; - } - - /** - *

digResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void digResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - Card host = af.getHostCard(); - Player player = sa.getActivatingPlayer(); - int numToDig = AbilityFactory.calculateAmount(af.getHostCard(), params.get("DigNum"), sa); - String destZone1 = params.containsKey("DestinationZone") ? params.get("DestinationZone") : "Hand"; - int libraryPosition = params.containsKey("LibraryPosition") ? Integer.parseInt(params.get("LibraryPosition")) : -1; - int destZone1ChangeNum = 1; - boolean mitosis = params.containsKey("Mitosis"); - String changeValid = params.containsKey("ChangeValid") ? params.get("ChangeValid") : ""; - boolean anyNumber = params.containsKey("AnyNumber"); - String destZone2 = params.containsKey("DestinationZone2") ? params.get("DestinationZone2") : "Library"; - int libraryPosition2 = params.containsKey("LibraryPosition2") ? Integer.parseInt(params.get("LibraryPosition2")) : -1; - boolean optional = params.containsKey("Optional"); - boolean noMove = params.containsKey("NoMove"); - boolean changeAll = false; - ArrayList keywords = new ArrayList(); - if (params.containsKey("Keywords")) { - keywords.addAll(Arrays.asList(params.get("Keywords").split(" & "))); - } - - if (params.containsKey("ChangeNum")) { - if (params.get("ChangeNum").equalsIgnoreCase("All")) changeAll = true; - else destZone1ChangeNum = Integer.parseInt(params.get("ChangeNum")); - } - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - for (Player p : tgtPlayers) { - if (tgt == null || p.canTarget(sa)) { - - CardList top = new CardList(); - CardList valid = new CardList(); - CardList rest = new CardList(); - PlayerZone library = AllZone.getZone(Constant.Zone.Library, p); - - numToDig = Math.min(numToDig, library.size()); - for (int i = 0; i < numToDig; i++) { - top.add(library.get(i)); - } - - if (top.size() > 0) { - Card dummy = new Card(); - dummy.setName("[No valid cards]"); - - if (params.containsKey("Reveal")) { - GuiUtils.getChoice("Revealing cards from library", top.toArray()); - //AllZone.getGameAction().revealToCopmuter(top.toArray()); - for when it exists - } else if (player.isHuman()) { - //show the user the revealed cards - GuiUtils.getChoice("Looking at cards from library", top.toArray()); - } - - if (!noMove) { - if (mitosis) { - valid = sharesNameWithCardOnBattlefield(top); - for (Card c : top) { - if (!valid.contains(c)) rest.add(c); - } - } else if (!changeValid.equals("")) { - if (changeValid.contains("ChosenType")) { - changeValid = changeValid.replace("ChosenType", host.getChosenType()); - } - valid = top.getValidCards(changeValid.split(","), host.getController(), host); - for (Card c : top) { - if (!valid.contains(c)) rest.add(c); - } - if (valid.isEmpty()) { - valid.add(dummy); - } - } else { - valid = top; - } - - if (changeAll) { - for (Card c : valid) { - if (c.equals(dummy)) continue; - PlayerZone zone = AllZone.getZone(destZone1, c.getOwner()); - if (zone.is("Library")) { - AllZone.getGameAction().moveToLibrary(c, libraryPosition); - } else { - AllZone.getGameAction().moveTo(zone, c); - } - } - } else { - int j = 0; - if (player.isHuman()) { - while (j < destZone1ChangeNum || (anyNumber && j < numToDig)) { - //let user get choice - Card chosen = null; - String prompt = "Choose a card to put into the "; - if (destZone1.equals("Library") && libraryPosition == -1) - prompt = "Put the rest on the bottom of the "; - if (destZone1.equals("Library") && libraryPosition == 0) - prompt = "Put the rest on top of the "; - if (anyNumber || optional) { - chosen = GuiUtils.getChoiceOptional(prompt + destZone1, valid.toArray()); - } else { - chosen = GuiUtils.getChoice(prompt + destZone1, valid.toArray()); - } - if (chosen == null || chosen.getName().equals("[No valid cards]")) break; - valid.remove(chosen); - PlayerZone zone = AllZone.getZone(destZone1, chosen.getOwner()); - if (zone.is("Library")) { - //System.out.println("Moving to lib position: "+libraryPosition); - AllZone.getGameAction().moveToLibrary(chosen, libraryPosition); - } else { - Card c = AllZone.getGameAction().moveTo(zone, chosen); - if (destZone1.equals("Battlefield") && !keywords.isEmpty()) - for (String kw : keywords) c.addExtrinsicKeyword(kw); - } - //AllZone.getGameAction().revealToComputer() - for when this exists - j++; - } - }//human - else { //computer (pick the first cards) - int changeNum = Math.min(destZone1ChangeNum, valid.size()); - if (anyNumber) changeNum = valid.size();//always take all - for (j = 0; j < changeNum; j++) { - Card chosen = valid.get(0); - if (chosen.equals(dummy)) break; - PlayerZone zone = AllZone.getZone(destZone1, chosen.getOwner()); - if (zone.is("Library")) { - AllZone.getGameAction().moveToLibrary(chosen, libraryPosition); - } else { - AllZone.getGameAction().moveTo(zone, chosen); - if (destZone1.equals("Battlefield") && !keywords.isEmpty()) - for (String kw : keywords) chosen.addExtrinsicKeyword(kw); - } - if (changeValid.length() > 0) - GuiUtils.getChoice("Computer picked: ", chosen); - valid.remove(chosen); - } - } - } - - //dump anything not selected from valid back into the rest - if (!changeAll) rest.addAll(valid); - if (rest.contains(dummy)) rest.remove(dummy); - - //now, move the rest to destZone2 - if (destZone2.equals("Library")) { - if(player.isHuman()) { - //put them in any order - while (rest.size() > 0) { - Card chosen; - if (rest.size() > 1) { - String prompt = "Put the rest on top of the library in any order"; - if (libraryPosition2 == -1) - prompt = "Put the rest on the bottom of the library in any order"; - chosen = GuiUtils.getChoice(prompt, rest.toArray()); - } else { - chosen = rest.get(0); - } - AllZone.getGameAction().moveToLibrary(chosen, libraryPosition2); - rest.remove(chosen); - } - } else { //Computer - for (int i = 0; i < rest.size(); i++) { - AllZone.getGameAction().moveToLibrary(rest.get(i), libraryPosition2); - } - } - } else { - //just move them randomly - for (int i = 0; i < rest.size(); i++) { - Card c = rest.get(i); - PlayerZone toZone = AllZone.getZone(destZone2, c.getOwner()); - c = AllZone.getGameAction().moveTo(toZone, c); - if (destZone2.equals("Battlefield") && !keywords.isEmpty()) { - for (String kw : keywords) c.addExtrinsicKeyword(kw); - } - } - - } - } - }//end if canTarget - }//end foreach player - } - }//end resolve - - //returns a CardList that is a subset of list with cards that share a name with a permanent on the battlefield - /** - *

sharesNameWithCardOnBattlefield.

- * - * @param list a {@link forge.CardList} object. - * @return a {@link forge.CardList} object. - */ - private static CardList sharesNameWithCardOnBattlefield(CardList list) { - CardList toReturn = new CardList(); - CardList play = AllZoneUtil.getCardsInPlay(); - for (Card c : list) { - for (Card p : play) { - if (p.getName().equals(c.getName())) toReturn.add(c); - } - } - return toReturn; - } - - //********************************************************************** - //******************************* RevealHand *************************** - //********************************************************************** - - /** - *

createAbilityRevealHand.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityRevealHand(final AbilityFactory af) { - final SpellAbility abRevealHand = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 2785654059206102004L; - - @Override - public String getStackDescription() { - return revealHandStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return revealHandCanPlayAI(af, this); - } - - @Override - public void resolve() { - revealHandResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return revealHandTrigger(af, this, mandatory); - } - - }; - return abRevealHand; - } - - /** - *

createSpellRevealHand.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellRevealHand(final AbilityFactory af) { - final SpellAbility spRevealHand = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -668943560971904791L; - - @Override - public String getStackDescription() { - return revealHandStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return revealHandCanPlayAI(af, this); - } - - @Override - public void resolve() { - revealHandResolve(af, this); - } - - }; - return spRevealHand; - } - - /** - *

createDrawbackRevealHand.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackRevealHand(final AbilityFactory af) { - final SpellAbility dbRevealHand = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = -6079668770576878801L; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - return revealHandStackDescription(af, this); - } - - @Override - public void resolve() { - revealHandResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return revealHandTargetAI(af, this, false, false); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return revealHandTrigger(af, this, mandatory); - } - - }; - return dbRevealHand; - } - - /** - *

revealHandStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String revealHandStackDescription(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - StringBuilder sb = new StringBuilder(); - - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard()).append(" - "); - else - sb.append(" "); - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - sb.append(sa.getActivatingPlayer()).append(" looks at "); - - if (tgtPlayers.size() > 0) { - for (Player p : tgtPlayers) - sb.append(p.toString()).append("'s "); - } else { - sb.append("Error - no target players for RevealHand. "); - } - sb.append("hand."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

revealHandCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean revealHandCanPlayAI(final AbilityFactory af, SpellAbility sa) { - // AI cannot use this properly until he can use SAs during Humans turn - Cost abCost = af.getAbCost(); - - if (abCost != null) { - // AI currently disabled for these costs - if (abCost.getSacCost()) { - return false; - } - if (abCost.getLifeCost()) { - if (AllZone.getComputerPlayer().getLife() - abCost.getLifeAmount() < 4) - return false; - } - if (abCost.getDiscardCost()) return false; - - if (abCost.getSubCounter()) { - if (abCost.getCounterType().equals(Counters.P1P1)) return false; // Other counters should be used - } - - } - - boolean bFlag = revealHandTargetAI(af, sa, true, false); - - if (!bFlag) - return false; - - Random r = MyRandom.random; - boolean randomReturn = r.nextFloat() <= Math.pow(.667, sa.getActivationsThisTurn() + 1); - - if (AbilityFactory.playReusable(sa)) - randomReturn = true; - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - randomReturn &= subAb.chkAI_Drawback(); - return randomReturn; - } - - /** - *

revealHandTargetAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param primarySA a boolean. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean revealHandTargetAI(AbilityFactory af, SpellAbility sa, boolean primarySA, boolean mandatory) { - Target tgt = af.getAbTgt(); - - int humanHandSize = AllZoneUtil.getPlayerHand(AllZone.getHumanPlayer()).size(); - - if (tgt != null) { - // ability is targeted - tgt.resetTargets(); - - boolean canTgtHuman = AllZone.getHumanPlayer().canTarget(sa); - - if (!canTgtHuman || humanHandSize == 0) - return false; - else - tgt.addTarget(AllZone.getHumanPlayer()); - } else { - //if it's just defined, no big deal - } - - return true; - }// revealHandTargetAI() - - /** - *

revealHandTrigger.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean revealHandTrigger(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) // If there is a cost payment - return false; - - if (!revealHandTargetAI(af, sa, false, mandatory)) - return false; - - // check SubAbilities DoTrigger? - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - return abSub.doTrigger(mandatory); - } - - return true; - } - - /** - *

revealHandResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void revealHandResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - for (Player p : tgtPlayers) { - if (tgt == null || p.canTarget(sa)) { - CardList hand = AllZoneUtil.getPlayerHand(p); - if (sa.getActivatingPlayer().isHuman()) { - if (hand.size() > 0) { - GuiUtils.getChoice(p + "'s hand", hand.toArray()); - } else { - StringBuilder sb = new StringBuilder(); - sb.append(p).append("'s hand is empty!"); - javax.swing.JOptionPane.showMessageDialog(null, sb.toString(), p + "'s hand", JOptionPane.INFORMATION_MESSAGE); - } - } else { - //reveal to Computer (when computer can keep track of seen cards...) - } - - } - } - } - - //********************************************************************** - //******************************* SCRY ********************************* - //********************************************************************** - - /** - *

createAbilityScry.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityScry(final AbilityFactory af) { - final SpellAbility abScry = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 2631175859655699419L; - - @Override - public String getStackDescription() { - return scryStackDescription(af, this); - } - - public boolean canPlayAI() { - return scryCanPlayAI(af, this); - } - - @Override - public void resolve() { - scryResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return scryTriggerAI(af, this); - } - - }; - return abScry; - } - - /** - *

createSpellScry.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellScry(final AbilityFactory af) { - final SpellAbility spScry = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 6273876397392154403L; - - @Override - public String getStackDescription() { - return scryStackDescription(af, this); - } - - public boolean canPlayAI() { - return scryCanPlayAI(af, this); - } - - @Override - public void resolve() { - scryResolve(af, this); - } - - }; - return spScry; - } - - /** - *

createDrawbackScry.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackScry(final AbilityFactory AF) { - final SpellAbility dbScry = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()) { - private static final long serialVersionUID = 7763043327497404630L; - final AbilityFactory af = AF; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - return scryStackDescription(af, this); - } - - @Override - public void resolve() { - scryResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return scryTargetAI(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return scryTriggerAI(af, this); - } - - }; - return dbScry; - } - - /** - *

scryResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void scryResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - - int num = 1; - if (params.containsKey("ScryNum")) - num = AbilityFactory.calculateAmount(sa.getSourceCard(), params.get("ScryNum"), sa); - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - for (Player p : tgtPlayers) { - if (tgt == null || p.canTarget(sa)) { - p.scry(num); - } - } - } - - /** - *

scryTargetAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean scryTargetAI(AbilityFactory af, SpellAbility sa) { - Target tgt = af.getAbTgt(); - - if (tgt != null) { // It doesn't appear that Scry ever targets - // ability is targeted - tgt.resetTargets(); - - tgt.addTarget(AllZone.getComputerPlayer()); - } - - return true; - }// scryTargetAI() - - /** - *

scryTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean scryTriggerAI(AbilityFactory af, SpellAbility sa) { - if (!ComputerUtil.canPayCost(sa)) - return false; - - return scryTargetAI(af, sa); - }// scryTargetAI() - - /** - *

scryStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String scryStackDescription(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - StringBuilder sb = new StringBuilder(); - - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard().getName()).append(" - "); - else - sb.append(" "); - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - for (Player p : tgtPlayers) - sb.append(p.toString()).append(" "); - - int num = 1; - if (params.containsKey("ScryNum")) - num = AbilityFactory.calculateAmount(sa.getSourceCard(), params.get("ScryNum"), sa); - - sb.append("scrys (").append(num).append(")."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

scryCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean scryCanPlayAI(final AbilityFactory af, SpellAbility sa) { - Card source = sa.getSourceCard(); - - double chance = .4; // 40 percent chance of milling with instant speed stuff - if (AbilityFactory.isSorcerySpeed(sa)) - chance = .667; // 66.7% chance for sorcery speed (since it will never activate EOT) - Random r = MyRandom.random; - boolean randomReturn = r.nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1); - - if (AbilityFactory.playReusable(sa)) - randomReturn = true; - - if (af.hasSubAbility()) { - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - return randomReturn && abSub.chkAI_Drawback(); - } - } - return randomReturn; - } - - //********************************************************************** - //*********************** REARRANGETOPOFLIBRARY ************************ - //********************************************************************** - - /** - *

createRearrangeTopOfLibraryAbility.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createRearrangeTopOfLibraryAbility(final AbilityFactory AF) { - final SpellAbility RTOLAbility = new Ability_Activated(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = -548494891203983219L; - - @Override - public String getStackDescription() { - return rearrangeTopOfLibraryStackDescription(AF, this); - } - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return rearrangeTopOfLibraryTrigger(AF, this, mandatory); - } - - @Override - public void resolve() { - rearrangeTopOfLibraryResolve(AF, this); - } - - }; - - return RTOLAbility; - } - - /** - *

createRearrangeTopOfLibrarySpell.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createRearrangeTopOfLibrarySpell(final AbilityFactory AF) { - final SpellAbility RTOLSpell = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = 6977502611509431864L; - - @Override - public String getStackDescription() { - return rearrangeTopOfLibraryStackDescription(AF, this); - } - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return rearrangeTopOfLibraryTrigger(AF, this, mandatory); - } - - @Override - public void resolve() { - rearrangeTopOfLibraryResolve(AF, this); - } - - }; - - return RTOLSpell; - } - - /** - *

createRearrangeTopOfLibraryDrawback.

- * - * @param AF a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createRearrangeTopOfLibraryDrawback(final AbilityFactory AF) { - final SpellAbility dbDraw = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()) { - private static final long serialVersionUID = -777856059960750319L; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - return rearrangeTopOfLibraryStackDescription(AF, this); - } - - @Override - public void resolve() { - rearrangeTopOfLibraryResolve(AF, this); - } - - @Override - public boolean chkAI_Drawback() { - return false; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return rearrangeTopOfLibraryTrigger(AF, this, mandatory); - } - - }; - return dbDraw; - } - - /** - *

rearrangeTopOfLibraryStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String rearrangeTopOfLibraryStackDescription(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - int numCards = 0; - ArrayList tgtPlayers; - boolean shuffle = false; - - Target tgt = af.getAbTgt(); - if (tgt != null && !params.containsKey("Defined")) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - numCards = AbilityFactory.calculateAmount(af.getHostCard(), params.get("NumCards"), sa); - shuffle = params.containsKey("MayShuffle") ? true : false; - - StringBuilder ret = new StringBuilder(); - if (!(sa instanceof Ability_Sub)) { - ret.append(af.getHostCard().getName()); - ret.append(" - "); - } - ret.append("Look at the top "); - ret.append(numCards); - ret.append(" cards of "); - for (Player p : tgtPlayers) { - ret.append(p.getName()); - ret.append("s"); - ret.append(" & "); - } - ret.delete(ret.length() - 3, ret.length()); - - ret.append(" library. Then put them back in any order."); - - if (shuffle) { - ret.append("You may have "); - if (tgtPlayers.size() > 1) { - ret.append("those"); - } else { - ret.append("that"); - } - - ret.append(" player shuffle his or her library."); - } - - return ret.toString(); - } - - /** - *

rearrangeTopOfLibraryTrigger.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean rearrangeTopOfLibraryTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - - Target tgt = af.getAbTgt(); - - if (tgt != null) { - // ability is targeted - tgt.resetTargets(); - - boolean canTgtHuman = AllZone.getHumanPlayer().canTarget(sa); - - if (!canTgtHuman) - return false; - else - tgt.addTarget(AllZone.getHumanPlayer()); - } else { - //if it's just defined, no big deal - } - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - return abSub.doTrigger(mandatory); - } - - return false; - } - - /** - *

rearrangeTopOfLibraryResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void rearrangeTopOfLibraryResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - int numCards = 0; - ArrayList tgtPlayers = new ArrayList(); - boolean shuffle = false; - - if (sa.getActivatingPlayer().isHuman()) { - Target tgt = af.getAbTgt(); - if (tgt != null && !params.containsKey("Defined")) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - numCards = AbilityFactory.calculateAmount(af.getHostCard(), params.get("NumCards"), sa); - shuffle = params.containsKey("MayShuffle") ? true : false; - - for (Player p : tgtPlayers) - if (tgt == null || p.canTarget(sa)) - rearrangeTopOfLibrary(af.getHostCard(), p, numCards, shuffle); - } - } - - /** - * use this when Human needs to rearrange the top X cards in a player's library. You - * may also specify a shuffle when done - * - * @param src the source card - * @param player the player to target - * @param numCards the number of cards from the top to rearrange - * @param mayshuffle a boolean. - */ - private static void rearrangeTopOfLibrary(final Card src, final Player player, final int numCards, boolean mayshuffle) { - PlayerZone lib = AllZone.getZone(Constant.Zone.Library, player); - int maxCards = lib.size(); - maxCards = Math.min(maxCards, numCards); - if (maxCards == 0) return; - CardList topCards = new CardList(); - //show top n cards: - for (int j = 0; j < maxCards; j++) { - topCards.add(lib.get(j)); - } - for (int i = 1; i <= maxCards; i++) { - String suffix = ""; - switch (i) { - case 1: - suffix = "st"; - break; - case 2: - suffix = "nd"; - break; - case 3: - suffix = "rd"; - break; - default: - suffix = "th"; - } - String title = "Put " + i + suffix + " from the top: "; - Object o = GuiUtils.getChoiceOptional(title, topCards.toArray()); - if (o == null) break; - Card c_1 = (Card) o; - topCards.remove(c_1); - AllZone.getGameAction().moveToLibrary(c_1, i - 1); - } - if (mayshuffle) { - if (GameActionUtil.showYesNoDialog(src, "Do you want to shuffle the library?")) { - player.shuffle(); - } - } - } - -}//end class AbilityFactory_Reveal diff --git a/src/forge/card/abilityFactory/AbilityFactory_Sacrifice.java b/src/forge/card/abilityFactory/AbilityFactory_Sacrifice.java deleted file mode 100644 index c06832f6548..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_Sacrifice.java +++ /dev/null @@ -1,661 +0,0 @@ -package forge.card.abilityFactory; - -import forge.*; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.*; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Random; - -/** - *

AbilityFactory_Sacrifice class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_Sacrifice { - //************************************************************** - // *************************** Sacrifice *********************** - //************************************************************** - - /** - *

createAbilitySacrifice.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilitySacrifice(final AbilityFactory af) { - final SpellAbility abSacrifice = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -1933592438783630254L; - - @Override - public boolean canPlayAI() { - return sacrificeCanPlayAI(af, this); - } - - @Override - public void resolve() { - sacrificeResolve(af, this); - } - - @Override - public String getStackDescription() { - return sacrificeDescription(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return sacrificeTriggerAI(af, this, mandatory); - } - }; - return abSacrifice; - } - - /** - *

createSpellSacrifice.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellSacrifice(final AbilityFactory af) { - final SpellAbility spSacrifice = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -5141246507533353605L; - - @Override - public boolean canPlayAI() { - return sacrificeCanPlayAI(af, this); - } - - @Override - public void resolve() { - sacrificeResolve(af, this); - } - - @Override - public String getStackDescription() { - return sacrificeDescription(af, this); - } - }; - return spSacrifice; - } - - /** - *

createDrawbackSacrifice.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackSacrifice(final AbilityFactory af) { - final SpellAbility dbSacrifice = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = -5141246507533353605L; - - @Override - public void resolve() { - sacrificeResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return sacrificePlayDrawbackAI(af, this); - } - - @Override - public String getStackDescription() { - return sacrificeDescription(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return sacrificeTriggerAI(af, this, mandatory); - } - }; - return dbSacrifice; - } - - /** - *

sacrificeDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - public static String sacrificeDescription(final AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - StringBuilder sb = new StringBuilder(); - - if (sa instanceof Ability_Sub) - sb.append(" "); - else - sb.append(sa.getSourceCard().getName()).append(" - "); - - String conditionDesc = params.get("ConditionDescription"); - if (conditionDesc != null) - sb.append(conditionDesc).append(" "); - - Target tgt = af.getAbTgt(); - ArrayList tgts; - if (tgt != null) - tgts = tgt.getTargetPlayers(); - else - tgts = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - String valid = params.get("SacValid"); - if (valid == null) - valid = "Self"; - - String num = params.get("Amount"); - num = (num == null) ? "1" : num; - int amount = AbilityFactory.calculateAmount(sa.getSourceCard(), num, sa); - - if (valid.equals("Self")) - sb.append("Sacrifice ").append(sa.getSourceCard().toString()); - else if (valid.equals("Card.AttachedBy")) { - Card toSac = sa.getSourceCard().getEnchantingCard(); - sb.append(toSac.getController()).append(" sacrifices ").append(toSac).append("."); - } else { - for (Player p : tgts) - sb.append(p.getName()).append(" "); - - String msg = params.get("SacMessage"); - if (msg == null) - msg = valid; - - sb.append("Sacrifices ").append(amount).append(" ").append(msg).append("."); - } - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) - sb.append(abSub.getStackDescription()); - - return sb.toString(); - } - - /** - *

sacrificeCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - public static boolean sacrificeCanPlayAI(final AbilityFactory af, SpellAbility sa) { - - HashMap params = af.getMapParams(); - boolean chance = sacrificeTgtAI(af, sa); - - // Some additional checks based on what is being sacrificed, and who is sacrificing - Target tgt = af.getAbTgt(); - if (tgt != null) { - String valid = params.get("SacValid"); - String num = params.get("Amount"); - num = (num == null) ? "1" : num; - int amount = AbilityFactory.calculateAmount(sa.getSourceCard(), num, sa); - - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - list = list.getValidCards(valid.split(","), sa.getActivatingPlayer(), sa.getSourceCard()); - - if (list.size() == 0) - return false; - - Card source = sa.getSourceCard(); - if (num.equals("X") && source.getSVar(num).equals("Count$xPaid")) { - // Set PayX here to maximum value. - int xPay = Math.min(ComputerUtil.determineLeftoverMana(sa), amount); - source.setSVar("PayX", Integer.toString(xPay)); - } - - int half = amount / 2 + amount % 2; // Half of amount rounded up - - // If the Human has at least half rounded up of the amount to be sacrificed, cast the spell - if (list.size() < half) - return false; - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return chance; - } - - /** - *

sacrificePlayDrawbackAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - public static boolean sacrificePlayDrawbackAI(final AbilityFactory af, SpellAbility sa) { - // AI should only activate this during Human's turn - boolean chance = sacrificeTgtAI(af, sa); - - // TODO: restrict the subAbility a bit - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return chance; - } - - /** - *

sacrificeTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - public static boolean sacrificeTriggerAI(final AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) // If there is a cost payment - return false; - - // AI should only activate this during Human's turn - boolean chance = sacrificeTgtAI(af, sa); - - // Improve AI for triggers. If source is a creature with: - // When ETB, sacrifice a creature. Check to see if the AI has something to sacrifice - - // Eventually, we can call the trigger of ETB abilities with not mandatory as part of the checks to cast something - - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return chance || mandatory; - } - - /** - *

sacrificeTgtAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - public static boolean sacrificeTgtAI(AbilityFactory af, SpellAbility sa) { - - HashMap params = af.getMapParams(); - Card card = sa.getSourceCard(); - Target tgt = af.getAbTgt(); - - if (tgt != null) { - tgt.resetTargets(); - if (AllZone.getHumanPlayer().canTarget(sa)) - tgt.addTarget(AllZone.getHumanPlayer()); - else - return false; - } else { - String defined = params.get("Defined"); - if (defined == null) { - // Self Sacrifice. - } else if (defined.equals("Each")) { - // If Sacrifice hits both players: - // Only cast it if Human has the full amount of valid - // Only cast it if AI doesn't have the full amount of Valid - // TODO: Cast if the type is favorable: my "worst" valid is worse than his "worst" valid - String valid = params.get("SacValid"); - String num = params.containsKey("Amount") ? params.get("Amount") : "1"; - int amount = AbilityFactory.calculateAmount(card, num, sa); - - Card source = sa.getSourceCard(); - if (num.equals("X") && source.getSVar(num).equals("Count$xPaid")) { - // Set PayX here to maximum value. - amount = Math.min(ComputerUtil.determineLeftoverMana(sa), amount); - } - - CardList humanList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - humanList = humanList.getValidCards(valid.split(","), sa.getActivatingPlayer(), sa.getSourceCard()); - CardList computerList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - computerList = computerList.getValidCards(valid.split(","), sa.getActivatingPlayer(), sa.getSourceCard()); - - //Since all of the cards have remAIDeck:True, I enabled 1 for 1 (or X for X) trades for special decks - if (humanList.size() < amount /*|| computerList.size() >= amount */) return false; - } - } - - return true; - } - - /** - *

sacrificeResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public static void sacrificeResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - Card card = sa.getSourceCard(); - - // Expand Sacrifice keyword here depending on what we need out of it. - String num = params.containsKey("Amount") ? params.get("Amount") : "1"; - int amount = AbilityFactory.calculateAmount(card, num, sa); - - Target tgt = af.getAbTgt(); - ArrayList tgts; - if (tgt != null) - tgts = tgt.getTargetPlayers(); - else - tgts = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - String valid = params.get("SacValid"); - if (valid == null) - valid = "Self"; - - String msg = params.get("SacMessage"); - if (msg == null) - msg = valid; - - msg = "Sacrifice a " + msg; - - if (valid.equals("Self")) { - if (AllZone.getZone(sa.getSourceCard()).is(Constant.Zone.Battlefield)) - AllZone.getGameAction().sacrifice(sa.getSourceCard()); - } - //TODO - maybe this can be done smarter... - else if (valid.equals("Card.AttachedBy")) { - Card toSac = sa.getSourceCard().getEnchantingCard(); - if (AllZone.getZone(sa.getSourceCard()).is(Constant.Zone.Battlefield) && AllZoneUtil.isCardInPlay(toSac)) { - AllZone.getGameAction().sacrifice(toSac); - } - } else if (valid.equals("TriggeredCard")) { - Card equipee = (Card) sa.getTriggeringObject("Card"); - if (tgts.contains(card.getController()) && AllZoneUtil.isCardInPlay(equipee)) { - AllZone.getGameAction().sacrifice(equipee); - } - } else { - for (Player p : tgts) { - - if (p.isComputer()) - sacrificeAI(p, amount, valid, sa); - else - sacrificeHuman(p, amount, valid, sa, msg); - } - } - } - - - /** - *

sacrificeAI.

- * - * @param p a {@link forge.Player} object. - * @param amount a int. - * @param valid a {@link java.lang.String} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void sacrificeAI(Player p, int amount, String valid, SpellAbility sa) { - CardList list = AllZoneUtil.getPlayerCardsInPlay(p); - list = list.getValidCards(valid.split(","), sa.getActivatingPlayer(), sa.getSourceCard()); - - ComputerUtil.sacrificePermanents(amount, list); - } - - /** - *

sacrificeHuman.

- * - * @param p a {@link forge.Player} object. - * @param amount a int. - * @param valid a {@link java.lang.String} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param message a {@link java.lang.String} object. - */ - private static void sacrificeHuman(Player p, int amount, String valid, SpellAbility sa, String message) { - CardList list = AllZoneUtil.getPlayerCardsInPlay(p); - list = list.getValidCards(valid.split(","), sa.getActivatingPlayer(), sa.getSourceCard()); - - // TODO: Wait for Input to finish before moving on with the rest of Resolution - AllZone.getInputControl().setInput(PlayerUtil.input_sacrificePermanentsFromList(amount, list, message), true); - } - - - //************************************************************** - //*********************** SacrificeAll ************************* - //************************************************************** - - /** - *

createAbilitySacrificeAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public static SpellAbility createAbilitySacrificeAll(final AbilityFactory af) { - final SpellAbility abSacrifice = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -1933592438783630254L; - - @Override - public boolean canPlayAI() { - return sacrificeAllCanPlayAI(af, this); - } - - @Override - public void resolve() { - sacrificeAllResolve(af, this); - } - - @Override - public String getStackDescription() { - return sacrificeAllStackDescription(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return sacrificeAllCanPlayAI(af, this); - } - }; - return abSacrifice; - } - - /** - *

createSpellSacrificeAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public static SpellAbility createSpellSacrificeAll(final AbilityFactory af) { - final SpellAbility spSacrifice = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -5141246507533353605L; - - @Override - public boolean canPlayAI() { - return sacrificeAllCanPlayAI(af, this); - } - - @Override - public void resolve() { - sacrificeAllResolve(af, this); - } - - @Override - public String getStackDescription() { - return sacrificeAllStackDescription(af, this); - } - }; - return spSacrifice; - } - - /** - *

createDrawbackSacrificeAll.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public static SpellAbility createDrawbackSacrificeAll(final AbilityFactory af) { - final SpellAbility dbSacrifice = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = -5141246507533353605L; - - @Override - public void resolve() { - sacrificeAllResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return true; - } - - @Override - public String getStackDescription() { - return sacrificeAllStackDescription(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return sacrificeAllCanPlayAI(af, this); - } - }; - return dbSacrifice; - } - - /** - *

sacrificeAllStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - * @since 1.0.15 - */ - public static String sacrificeAllStackDescription(final AbilityFactory af, SpellAbility sa) { - // when getStackDesc is called, just build exactly what is happening - - StringBuilder sb = new StringBuilder(); - Card host = af.getHostCard(); - HashMap params = af.getMapParams(); - - if (sa instanceof Ability_Sub) - sb.append(" "); - else - sb.append(host).append(" - "); - - String conditionDesc = params.get("ConditionDescription"); - if (conditionDesc != null) - sb.append(conditionDesc).append(" "); - - /* This is not currently targeted - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - */ - - sb.append("Sacrifice permanents."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

sacrificeAllCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - * @since 1.0.15 - */ - public static boolean sacrificeAllCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - // AI needs to be expanded, since this function can be pretty complex based on what the expected targets could be - Random r = MyRandom.random; - Cost abCost = sa.getPayCosts(); - final Card source = sa.getSourceCard(); - final HashMap params = af.getMapParams(); - String Valid = ""; - - if (params.containsKey("ValidCards")) - Valid = params.get("ValidCards"); - - if (Valid.contains("X") && source.getSVar("X").equals("Count$xPaid")) { - // Set PayX here to maximum value. - int xPay = ComputerUtil.determineLeftoverMana(sa); - source.setSVar("PayX", Integer.toString(xPay)); - Valid = Valid.replace("X", Integer.toString(xPay)); - } - - CardList humanlist = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - CardList computerlist = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - - humanlist = humanlist.getValidCards(Valid.split(","), source.getController(), source); - computerlist = computerlist.getValidCards(Valid.split(","), source.getController(), source); - - if (abCost != null) { - // AI currently disabled for some costs - if (abCost.getSacCost()) { - //OK - } - if (abCost.getLifeCost()) { - if (AllZone.getComputerPlayer().getLife() - abCost.getLifeAmount() < 4) - return false; - } - if (abCost.getDiscardCost()) ;//OK - - if (abCost.getSubCounter()) { - // OK - } - } - - // prevent run-away activations - first time will always return true - boolean chance = r.nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn()); - - // if only creatures are affected evaluate both lists and pass only if human creatures are more valuable - if (humanlist.getNotType("Creature").size() == 0 && computerlist.getNotType("Creature").size() == 0) { - if (CardFactoryUtil.evaluateCreatureList(computerlist) + 200 >= CardFactoryUtil.evaluateCreatureList(humanlist)) - return false; - }//only lands involved - else if (humanlist.getNotType("Land").size() == 0 && computerlist.getNotType("Land").size() == 0) { - if (CardFactoryUtil.evaluatePermanentList(computerlist) + 1 >= CardFactoryUtil.evaluatePermanentList(humanlist)) - return false; - } // otherwise evaluate both lists by CMC and pass only if human permanents are more valuable - else if (CardFactoryUtil.evaluatePermanentList(computerlist) + 3 >= CardFactoryUtil.evaluatePermanentList(humanlist)) - return false; - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return ((r.nextFloat() < .9667) && chance); - } - - /** - *

sacrificeAllResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public static void sacrificeAllResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - - Card card = sa.getSourceCard(); - - String Valid = ""; - - if (params.containsKey("ValidCards")) - Valid = params.get("ValidCards"); - - // Ugh. If calculateAmount needs to be called with DestroyAll it _needs_ to use the X variable - // We really need a better solution to this - if (Valid.contains("X")) - Valid = Valid.replace("X", Integer.toString(AbilityFactory.calculateAmount(card, "X", sa))); - - CardList list = AllZoneUtil.getCardsInPlay(); - - boolean remSacrificed = params.containsKey("RememberSacrificed"); - if (remSacrificed) - card.clearRemembered(); - - list = list.getValidCards(Valid.split(","), card.getController(), card); - - for (int i = 0; i < list.size(); i++) - if (AllZone.getGameAction().sacrifice(list.get(i)) && remSacrificed) - card.addRemembered(list.get(i)); - } - -}//end class AbilityFactory_Sacrifice diff --git a/src/forge/card/abilityFactory/AbilityFactory_Token.java b/src/forge/card/abilityFactory/AbilityFactory_Token.java deleted file mode 100644 index 4cf67ecb5f4..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_Token.java +++ /dev/null @@ -1,471 +0,0 @@ -package forge.card.abilityFactory; - -import forge.*; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.*; -import forge.card.trigger.Trigger; -import forge.card.trigger.TriggerHandler; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Random; - -/** - *

AbilityFactory_Token class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_Token extends AbilityFactory { - private AbilityFactory AF = null; - - private String tokenAmount; - private String tokenName; - private String[] tokenTypes; - private String tokenOwner; - private String[] tokenColors; - private String[] tokenKeywords; - private String tokenPower; - private String tokenToughness; - private String tokenImage; - private String[] tokenAbilities; - private String[] tokenTriggers; - private String[] tokenSVars; - private String[] tokenStaticAbilities; - private boolean tokenTapped; - private boolean tokenAttacking; - - /** - *

Constructor for AbilityFactory_Token.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - */ - public AbilityFactory_Token(final AbilityFactory af) { - AF = af; - - HashMap mapParams = af.getMapParams(); - String image; - String[] keywords; - - if (mapParams.containsKey("TokenKeywords")) { - // TODO: Change this Split to a semicolon or something else - keywords = mapParams.get("TokenKeywords").split("<>"); - } else { - keywords = new String[0]; - } - - if (mapParams.containsKey("TokenImage")) { - image = mapParams.get("TokenImage"); - } else { - image = ""; - } - - if (mapParams.containsKey("TokenTapped")) { - tokenTapped = mapParams.get("TokenTapped").equals("True"); - } else { - tokenTapped = false; - } - if (mapParams.containsKey("TokenAttacking")) { - tokenAttacking = mapParams.get("TokenAttacking").equals("True"); - } else { - tokenAttacking = false; - } - - if (mapParams.containsKey("TokenAbilities")) { - tokenAbilities = mapParams.get("TokenAbilities").split(","); - } else { - tokenAbilities = null; - } - if (mapParams.containsKey("TokenTriggers")) { - tokenTriggers = mapParams.get("TokenTriggers").split(","); - } else { - tokenTriggers = null; - } - if (mapParams.containsKey("TokenSVars")) { - tokenSVars = mapParams.get("TokenSVars").split(","); - } else { - tokenSVars = null; - } - if (mapParams.containsKey("TokenStaticAbilities")) { - tokenStaticAbilities = mapParams.get("TokenStaticAbilities").split(","); - } else { - tokenStaticAbilities = null; - } - - tokenAmount = mapParams.get("TokenAmount"); - tokenPower = mapParams.get("TokenPower"); - tokenToughness = mapParams.get("TokenToughness"); - tokenName = mapParams.get("TokenName"); - tokenTypes = mapParams.get("TokenTypes").split(","); - tokenColors = mapParams.get("TokenColors").split(","); - tokenKeywords = keywords; - tokenImage = image; - if (mapParams.containsKey("TokenOwner")) - tokenOwner = mapParams.get("TokenOwner"); - else tokenOwner = "You"; - } - - /** - *

getAbility.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility getAbility() { - - - final SpellAbility abToken = new Ability_Activated(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = 8460074843405764620L; - - @Override - public boolean canPlayAI() { - return tokenCanPlayAI(this); - } - - @Override - public void resolve() { - doResolve(this); - } - - @Override - public String getStackDescription() { - return doStackDescription(this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return tokenDoTriggerAI(this, mandatory); - } - }; - - return abToken; - } - - /** - *

getSpell.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility getSpell() { - final SpellAbility spToken = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = -8041427947613029670L; - - @Override - public boolean canPlayAI() { - return tokenCanPlayAI(this); - } - - @Override - public void resolve() { - doResolve(this); - } - - @Override - public String getStackDescription() { - return doStackDescription(this); - } - }; - - return spToken; - } - - /** - *

getDrawback.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility getDrawback() { - final SpellAbility dbDealDamage = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()) { - private static final long serialVersionUID = 7239608350643325111L; - - @Override - public boolean chkAI_Drawback() { - return true; - } - - @Override - public String getStackDescription() { - return doStackDescription(this); - } - - @Override - public void resolve() { - doResolve(this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return tokenDoTriggerAI(this, mandatory); - } - - }; // Spell - - return dbDealDamage; - } - - /** - *

tokenCanPlayAI.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private boolean tokenCanPlayAI(SpellAbility sa) { - Cost cost = sa.getPayCosts(); - - for (String type : tokenTypes) { - if (type.equals("Legendary")) { - // Don't kill AIs Legendary tokens - if (AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer(), tokenName).size() > 0) - return false; - } - } - - boolean haste = false; - boolean oneShot = false; - for (String kw : tokenKeywords) { - if (kw.equals("Haste")) haste = true; - if (kw.equals("At the beginning of the end step, exile CARDNAME.") - || kw.equals("At the beginning of the end step, sacrifice CARDNAME.")) oneShot = true; - } - - //Don't generate tokens without haste before main 2 if possible - if (AllZone.getPhase().isBefore(Constant.Phase.Main2) && AllZone.getPhase().isPlayerTurn(AllZone.getComputerPlayer()) && !haste) - return false; - if ((AllZone.getPhase().isAfter(Constant.Phase.Combat_Begin) || AllZone.getPhase().isPlayerTurn(AllZone.getHumanPlayer())) && oneShot) - return false; - - // TODO: if i don't have enough blockers and my token can block one of the unblocked creatures - // create it after attackers are declared - //if (AllZone.getPhase().is(Constant.Phase.Combat_Declare_Attackers_InstantAbility, AllZone.getHumanPlayer())) - // return true; - - // prevent run-away activations - first time will always return true - Random r = MyRandom.random; - final Card source = sa.getSourceCard(); - boolean chance = r.nextFloat() <= Math.pow(.9, sa.getActivationsThisTurn()); - - Target tgt = sa.getTarget(); - if (tgt != null) { - tgt.resetTargets(); - if (tgt.canOnlyTgtOpponent()) - tgt.addTarget(AllZone.getHumanPlayer()); - else - tgt.addTarget(AllZone.getComputerPlayer()); - } - - if (cost != null) { - if (cost.getSacCost() && !cost.getSacThis()) { - //only sacrifice something that's supposed to be sacrificed - String type = cost.getSacType(); - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - typeList = typeList.getValidCards(type.split(","), source.getController(), source); - if (ComputerUtil.getCardPreference(source, "SacCost", typeList) == null) - return false; - } - if (cost.getSubCounter()) { - if (cost.getCounterType().equals(Counters.P1P1)) { - // A card has a 25% chance per counter to be able to pass through here - // 4+ counters will always pass. 0 counters will never - int currentNum = source.getCounters(cost.getCounterType()); - double percent = .25 * (currentNum / cost.getCounterNum()); - if (percent <= r.nextFloat()) - return false; - } - } - if (cost.getLifeCost()) { - if (AllZone.getComputerPlayer().getLife() - cost.getLifeAmount() < 4) - return false; - } - } - - if (tokenAmount.equals("X")) { - if (source.getSVar(tokenAmount).equals("Count$xPaid")) { - // Set PayX here to maximum value. - int xPay = ComputerUtil.determineLeftoverMana(sa); - source.setSVar("PayX", Integer.toString(xPay)); - } - if (AbilityFactory.calculateAmount(AF.getHostCard(), tokenAmount, sa) <= 0) - return false; - } - - if (AbilityFactory.playReusable(sa)) - return chance; - - if (sa.isAbility()) - return (r.nextFloat() < .9 && chance); - - return (r.nextFloat() < .6667 && chance); - } - - /** - *

tokenDoTriggerAI.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private boolean tokenDoTriggerAI(SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) - return false; - - return true; - } - - /** - *

doStackDescription.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private String doStackDescription(SpellAbility sa) { - - int finalPower = AbilityFactory.calculateAmount(AF.getHostCard(), tokenPower, sa); - - int finalToughness = AbilityFactory.calculateAmount(AF.getHostCard(), tokenToughness, sa); - - int finalAmount = AbilityFactory.calculateAmount(AF.getHostCard(), tokenAmount, sa); - - StringBuilder sb = new StringBuilder(); - - if (sa instanceof Ability_Sub) - sb.append(" "); - else - sb.append(AF.getHostCard().getName()).append(" - "); - - sb.append("Put (").append(finalAmount).append(") ").append(finalPower).append("/").append(finalToughness); - sb.append(" ").append(tokenName).append(" token"); - if (finalAmount != 1) sb.append("s"); - sb.append(" onto the battlefield"); - - if (tokenOwner.equals("Opponent")) { - sb.append(" under your opponent's control."); - } else { - sb.append("."); - } - - if (sa.getSubAbility() != null) { - sb.append(sa.getSubAbility().getStackDescription()); - } - - return sb.toString(); - } - - /** - *

doResolve.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private void doResolve(SpellAbility sa) { - String imageName = ""; - Player controller; - String cost = ""; - //Construct colors - String colorDesc = ""; - for (String col : tokenColors) { - if (col.equals("White")) { - colorDesc += "W"; - } else if (col.equals("Blue")) { - colorDesc += "U"; - } else if (col.equals("Black")) { - colorDesc += "B"; - } else if (col.equals("Red")) { - colorDesc += "R"; - } else if (col.equals("Green")) { - colorDesc += "G"; - } else if (col.equals("Colorless")) { - colorDesc = "C"; - } - } - if (tokenImage.equals("")) { - - imageName += colorDesc + " " + tokenPower + " " + tokenToughness + " " + tokenName; - } else { - imageName = tokenImage; - } - System.out.println("AF_Token imageName = " + imageName); - - for (char c : colorDesc.toCharArray()) { - cost += c + ' '; - } - - cost = colorDesc.replace('C', '1').trim(); - - controller = AbilityFactory.getDefinedPlayers(AF.getHostCard(), tokenOwner, sa).get(0); - - int finalPower = AbilityFactory.calculateAmount(AF.getHostCard(), tokenPower, sa); - int finalToughness = AbilityFactory.calculateAmount(AF.getHostCard(), tokenToughness, sa); - int finalAmount = AbilityFactory.calculateAmount(AF.getHostCard(), tokenAmount, sa); - - for (int i = 0; i < finalAmount; i++) { - CardList tokens = CardFactoryUtil.makeToken(tokenName, imageName, controller, cost, tokenTypes, finalPower, finalToughness, tokenKeywords); - - //Grant abilities - if (tokenAbilities != null) { - AbilityFactory af = new AbilityFactory(); - for (String s : tokenAbilities) { - String actualAbility = AF.getHostCard().getSVar(s); - for (Card c : tokens) { - SpellAbility grantedAbility = af.getAbility(actualAbility, c); - c.addSpellAbility(grantedAbility); - } - } - } - - //Grant triggers - if (tokenTriggers != null) { - - for (String s : tokenTriggers) { - String actualTrigger = AF.getHostCard().getSVar(s); - - for (final Card c : tokens) { - //Needs to do some voodoo when the token disappears to remove the triggers at the same time. - Command LPCommand = new Command() { - - private static final long serialVersionUID = -9007707442828928732L; - - public void execute() { - AllZone.getTriggerHandler().removeAllFromCard(c); - } - - }; - c.addLeavesPlayCommand(LPCommand); - Trigger parsedTrigger = TriggerHandler.parseTrigger(actualTrigger, c); - String ability = AF.getHostCard().getSVar(parsedTrigger.getMapParams().get("Execute")); - parsedTrigger.setOverridingAbility(new AbilityFactory().getAbility(ability, c)); - c.addTrigger(parsedTrigger); - AllZone.getTriggerHandler().registerTrigger(parsedTrigger); - } - } - } - - //Grant SVars - if (tokenSVars != null) { - for (String s : tokenSVars) { - String actualSVar = AF.getHostCard().getSVar(s); - for (Card c : tokens) { - c.setSVar(s, actualSVar); - } - } - } - - //Grant static abilities - if (tokenStaticAbilities != null) { - for (String s : tokenStaticAbilities) { - String actualAbility = AF.getHostCard().getSVar(s); - for (Card c : tokens) { - c.addStaticAbility(actualAbility); - } - } - } - - for (Card c : tokens) { - if (tokenTapped) { - c.tap(); - } - if (tokenAttacking) { - AllZone.getCombat().addAttacker(c); - } - } - } - } -} diff --git a/src/forge/card/abilityFactory/AbilityFactory_Turns.java b/src/forge/card/abilityFactory/AbilityFactory_Turns.java deleted file mode 100644 index 46274d76697..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_Turns.java +++ /dev/null @@ -1,232 +0,0 @@ -package forge.card.abilityFactory; - -import forge.AllZone; -import forge.ComputerUtil; -import forge.Player; -import forge.card.spellability.*; - -import java.util.ArrayList; -import java.util.HashMap; - -/** - *

AbilityFactory_Turns class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_Turns { - - // ************************************************************************* - // ************************* ADD TURN ************************************** - // ************************************************************************* - - /** - *

createAbilityAddTurn.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityAddTurn(final AbilityFactory af) { - - final SpellAbility abAddTurn = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -3526200766738015688L; - - @Override - public String getStackDescription() { - return addTurnStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return addTurnCanPlayAI(af, this); - } - - @Override - public void resolve() { - addTurnResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return addTurnTriggerAI(af, this, mandatory); - } - - }; - return abAddTurn; - } - - /** - *

createSpellAddTurn.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellAddTurn(final AbilityFactory af) { - final SpellAbility spAddTurn = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -3921131887560356006L; - - @Override - public String getStackDescription() { - return addTurnStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return addTurnCanPlayAI(af, this); - } - - @Override - public void resolve() { - addTurnResolve(af, this); - } - - }; - return spAddTurn; - } - - /** - *

createDrawbackAddTurn.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackAddTurn(final AbilityFactory af) { - final SpellAbility dbAddTurn = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = -562517287448810951L; - - @Override - public String getStackDescription() { - return addTurnStackDescription(af, this); - } - - @Override - public void resolve() { - addTurnResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return true; - } - - @Override - public boolean doTrigger(boolean mandatory) { - return addTurnTriggerAI(af, this, mandatory); - } - - }; - return dbAddTurn; - } - - /** - *

addTurnStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String addTurnStackDescription(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - StringBuilder sb = new StringBuilder(); - int numTurns = AbilityFactory.calculateAmount(af.getHostCard(), params.get("NumTurns"), sa); - - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard()).append(" - "); - else - sb.append(" "); - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - for (Player player : tgtPlayers) - sb.append(player).append(" "); - - sb.append("takes "); - if (numTurns > 1) { - sb.append(numTurns); - } else { - sb.append("an"); - } - sb.append(" extra turn"); - if (numTurns > 1) sb.append("s"); - sb.append(" after this one."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

addTurnCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean addTurnCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - return addTurnTriggerAI(af, sa, false); - } - - /** - *

addTurnTriggerAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean addTurnTriggerAI(final AbilityFactory af, final SpellAbility sa, boolean mandatory) { - - HashMap params = af.getMapParams(); - - Target tgt = sa.getTarget(); - - if (sa.getTarget() != null) { - tgt.resetTargets(); - sa.getTarget().addTarget(AllZone.getComputerPlayer()); - } else { - ArrayList tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - for (Player p : tgtPlayers) - if (p.isHuman() && !mandatory) - return false; - // not sure if the AI should be playing with cards that give the Human more turns. - } - return true; - } - - /** - *

addTurnResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void addTurnResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - int numTurns = AbilityFactory.calculateAmount(af.getHostCard(), params.get("NumTurns"), sa); - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - for (Player p : tgtPlayers) { - if (tgt == null || p.canTarget(sa)) { - for (int i = 0; i < numTurns; i++) { - AllZone.getPhase().addExtraTurn(p); - } - } - } - } - -}//end class AbilityFactory_Turns diff --git a/src/forge/card/abilityFactory/AbilityFactory_ZoneAffecting.java b/src/forge/card/abilityFactory/AbilityFactory_ZoneAffecting.java deleted file mode 100644 index 676de1b6c2e..00000000000 --- a/src/forge/card/abilityFactory/AbilityFactory_ZoneAffecting.java +++ /dev/null @@ -1,1501 +0,0 @@ -package forge.card.abilityFactory; - -import forge.*; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.*; -import forge.gui.GuiUtils; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Random; - -/** - *

AbilityFactory_ZoneAffecting class.

- * - * @author Forge - * @version $Id: $ - */ -public class AbilityFactory_ZoneAffecting { - - //********************************************************************** - //******************************* DRAW ********************************* - //********************************************************************** - /** - *

createAbilityDraw.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityDraw(final AbilityFactory af) { - final SpellAbility abDraw = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 5445572699000471299L; - - @Override - public String getStackDescription() { - return drawStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return drawCanPlayAI(af, this); - } - - @Override - public void resolve() { - drawResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return drawTrigger(af, this, mandatory); - } - - }; - return abDraw; - } - - /** - *

createSpellDraw.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellDraw(final AbilityFactory af) { - final SpellAbility spDraw = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -4990932993654533449L; - - @Override - public String getStackDescription() { - return drawStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return drawCanPlayAI(af, this); - } - - @Override - public void resolve() { - drawResolve(af, this); - } - - }; - return spDraw; - } - - /** - *

createDrawbackDraw.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackDraw(final AbilityFactory af) { - final SpellAbility dbDraw = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = -4990932993654533449L; - - @Override - public String getStackDescription() { - return drawStackDescription(af, this); - } - - @Override - public void resolve() { - drawResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return drawTargetAI(af, this, false, false); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return drawTrigger(af, this, mandatory); - } - - }; - return dbDraw; - } - - /** - *

drawStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String drawStackDescription(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - StringBuilder sb = new StringBuilder(); - - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard().getName()).append(" - "); - else - sb.append(" "); - - String conditionDesc = params.get("ConditionDescription"); - if (conditionDesc != null) - sb.append(conditionDesc).append(" "); - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - if (tgtPlayers.size() > 0) { - Iterator it = tgtPlayers.iterator(); - while(it.hasNext()) { - sb.append(it.next().toString()); - if(it.hasNext()) sb.append(" and "); - } - - int numCards = 1; - if (params.containsKey("NumCards")) - numCards = AbilityFactory.calculateAmount(sa.getSourceCard(), params.get("NumCards"), sa); - - if(tgtPlayers.size() > 1) sb.append(" each"); - sb.append(" draw"); - if(tgtPlayers.size() == 1) sb.append("s"); - sb.append(" (").append(numCards).append(")"); - - if (params.containsKey("NextUpkeep")) - sb.append(" at the beginning of the next upkeep"); - - sb.append("."); - } - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

drawCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean drawCanPlayAI(final AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - - Target tgt = af.getAbTgt(); - Card source = sa.getSourceCard(); - Cost abCost = af.getAbCost(); - - if (abCost != null) { - // AI currently disabled for these costs - if (abCost.getSacCost() && source.isCreature()) { - return false; - } - if (abCost.getLifeCost()) { - if (AllZone.getComputerPlayer().getLife() - abCost.getLifeAmount() < 4) - return false; - } - if (abCost.getDiscardCost()) return false; - - if (abCost.getSubCounter()) { - if (abCost.getCounterType().equals(Counters.P1P1)) return false; // Other counters should be used - } - - } - - boolean bFlag = drawTargetAI(af, sa, true, false); - - if (!bFlag) - return false; - - if (tgt != null) { - ArrayList players = tgt.getTargetPlayers(); - if (players.size() > 0 && players.get(0).isHuman()) - return true; - } - - //Don't use draw abilities before main 2 if possible - if (AllZone.getPhase().isBefore(Constant.Phase.Main2) && !params.containsKey("ActivatingPhases")) - return false; - - //Don't tap creatures that may be able to block - if (AbilityFactory.waitForBlocking(sa)) - return false; - - double chance = .4; // 40 percent chance of drawing with instant speed stuff - if (AbilityFactory.isSorcerySpeed(sa)) - chance = .667; // 66.7% chance for sorcery speed - if ((AllZone.getPhase().is(Constant.Phase.End_Of_Turn) && AllZone.getPhase().isNextTurn(AllZone.getComputerPlayer()))) - chance = .9; // 90% for end of opponents turn - Random r = MyRandom.random; - boolean randomReturn = r.nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1); - - if (AbilityFactory.playReusable(sa)) - randomReturn = true; - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - randomReturn &= subAb.chkAI_Drawback(); - return randomReturn; - } - - /** - *

drawTargetAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param primarySA a boolean. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean drawTargetAI(AbilityFactory af, SpellAbility sa, boolean primarySA, boolean mandatory) { - Target tgt = af.getAbTgt(); - HashMap params = af.getMapParams(); - Card source = sa.getSourceCard(); - - int computerHandSize = AllZoneUtil.getCardsInZone(Constant.Zone.Hand, AllZone.getComputerPlayer()).size(); - int humanLibrarySize = AllZoneUtil.getCardsInZone(Constant.Zone.Library, AllZone.getHumanPlayer()).size(); - int computerLibrarySize = AllZoneUtil.getCardsInZone(Constant.Zone.Library, AllZone.getComputerPlayer()).size(); - int computerMaxHandSize = AllZone.getComputerPlayer().getMaxHandSize(); - - int numCards = 1; - if (params.containsKey("NumCards")) - numCards = AbilityFactory.calculateAmount(sa.getSourceCard(), params.get("NumCards"), sa); - - boolean xPaid = false; - String num = params.get("NumCards"); - if (num != null && num.equals("X") && source.getSVar(num).equals("Count$xPaid")) { - // Set PayX here to maximum value. - if (sa instanceof Ability_Sub) - numCards = Integer.parseInt(source.getSVar("PayX")); - else { - numCards = ComputerUtil.determineLeftoverMana(sa); - source.setSVar("PayX", Integer.toString(numCards)); - } - xPaid = true; - } - - // TODO: if xPaid and one of the below reasons would fail, instead of bailing - // reduce toPay amount to acceptable level - - if (tgt != null) { - // ability is targeted - tgt.resetTargets(); - - boolean canTgtHuman = AllZone.getHumanPlayer().canTarget(sa); - boolean canTgtComp = AllZone.getComputerPlayer().canTarget(sa); - boolean tgtHuman = false; - - if (!canTgtHuman && !canTgtComp) - return false; - - if (canTgtHuman && !AllZone.getHumanPlayer().cantLose() && numCards >= humanLibrarySize) { - // Deck the Human? DO IT! - tgt.addTarget(AllZone.getHumanPlayer()); - return true; - } - - if (numCards >= computerLibrarySize) { - if (xPaid) { - numCards = computerLibrarySize - 1; - source.setSVar("PayX", Integer.toString(numCards)); - } else { - // Don't deck your self - if (!mandatory) - return false; - tgtHuman = true; - } - } - - if (computerHandSize + numCards > computerMaxHandSize && AllZone.getPhase().getPlayerTurn().isComputer()) { - if (xPaid) { - numCards = computerMaxHandSize - computerHandSize; - source.setSVar("PayX", Integer.toString(numCards)); - } else { - // Don't draw too many cards and then risk discarding cards at EOT - if (!(params.containsKey("NextUpkeep") || sa instanceof Ability_Sub) && !mandatory) - return false; - } - } - - if (numCards == 0) - return false; - - if ((!tgtHuman || !canTgtHuman) && canTgtComp) - tgt.addTarget(AllZone.getComputerPlayer()); - else - tgt.addTarget(AllZone.getHumanPlayer()); - } else { - // TODO: consider if human is the defined player - - // ability is not targeted - if (numCards >= computerLibrarySize) { - // Don't deck yourself - if (!mandatory) - return false; - } - - if (computerHandSize + numCards > computerMaxHandSize && AllZone.getPhase().getPlayerTurn().isComputer()) { - // Don't draw too many cards and then risk discarding cards at EOT - if (!(params.containsKey("NextUpkeep") || sa instanceof Ability_Sub) && !mandatory) - return false; - } - } - return true; - }// drawTargetAI() - - /** - *

drawTrigger.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean drawTrigger(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) // If there is a cost payment - return false; - - if (!drawTargetAI(af, sa, false, mandatory)) - return false; - - // check SubAbilities DoTrigger? - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - return abSub.doTrigger(mandatory); - } - - return true; - } - - /** - *

drawResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void drawResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - - Card source = sa.getSourceCard(); - int numCards = 1; - if (params.containsKey("NumCards")) - numCards = AbilityFactory.calculateAmount(sa.getSourceCard(), params.get("NumCards"), sa); - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(source, params.get("Defined"), sa); - - boolean optional = params.containsKey("OptionalDecider"); - boolean slowDraw = params.containsKey("NextUpkeep"); - - for (Player p : tgtPlayers) { - if (tgt == null || p.canTarget(sa)) { - if (optional) { - if (p.isComputer()) { - if (numCards >= AllZoneUtil.getPlayerCardsInLibrary(p).size()) { - // AI shouldn't itself - continue; - } - } else { - StringBuilder sb = new StringBuilder(); - sb.append("Do you want to draw ").append(numCards).append(" cards(s)"); - - if (slowDraw) - sb.append(" next upkeep"); - - sb.append("?"); - - if (!GameActionUtil.showYesNoDialog(sa.getSourceCard(), sb.toString())) - continue; - } - } - - if (slowDraw) - for (int i = 0; i < numCards; i++) - p.addSlowtripList(source); - else - p.drawCards(numCards); - - } - } - }//drawResolve() - - //********************************************************************** - //******************************* MILL ********************************* - //********************************************************************** - - /** - *

createAbilityMill.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityMill(final AbilityFactory af) { - final SpellAbility abMill = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 5445572699000471299L; - - @Override - public String getStackDescription() { - return millStackDescription(this, af); - } - - @Override - public boolean canPlayAI() { - return millCanPlayAI(af, this); - } - - @Override - public void resolve() { - millResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return millCanPlayAI(af, this); - } - - }; - return abMill; - } - - /** - *

createSpellMill.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellMill(final AbilityFactory af) { - final SpellAbility spMill = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -4990932993654533449L; - - @Override - public String getStackDescription() { - return millStackDescription(this, af); - } - - @Override - public boolean canPlayAI() { - return millCanPlayAI(af, this); - } - - @Override - public void resolve() { - millResolve(af, this); - } - - }; - return spMill; - } - - /** - *

createDrawbackMill.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackMill(final AbilityFactory af) { - final SpellAbility dbMill = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = -4990932993654533449L; - - @Override - public String getStackDescription() { - return millStackDescription(this, af); - } - - @Override - public void resolve() { - millResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return millDrawback(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return millTrigger(af, this, mandatory); - } - - }; - return dbMill; - } - - /** - *

millStackDescription.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link java.lang.String} object. - */ - private static String millStackDescription(SpellAbility sa, AbilityFactory af) { - HashMap params = af.getMapParams(); - StringBuilder sb = new StringBuilder(); - int numCards = AbilityFactory.calculateAmount(sa.getSourceCard(), params.get("NumCards"), sa); - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard().getName()).append(" - "); - else - sb.append(" "); - - String conditionDesc = params.get("ConditionDescription"); - if (conditionDesc != null) - sb.append(conditionDesc).append(" "); - - for (Player p : tgtPlayers) - sb.append(p.toString()).append(" "); - - String destination = params.get("Destination"); - if (destination == null || destination.equals(Constant.Zone.Graveyard)) - sb.append("mills "); - else if (destination.equals(Constant.Zone.Exile)) - sb.append("exiles "); - sb.append(numCards); - sb.append(" card"); - if (numCards != 1) sb.append("s"); - sb.append(" from his or her library."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

millCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean millCanPlayAI(final AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - - Card source = sa.getSourceCard(); - Cost abCost = af.getAbCost(); - - if (abCost != null) { - // AI currently disabled for these costs - if (abCost.getSacCost()) { - return false; - } - if (abCost.getLifeCost()) { - if (AllZone.getComputerPlayer().getLife() - abCost.getLifeAmount() < 4) - return false; - } - if (abCost.getDiscardCost()) return false; - - if (abCost.getSubCounter()) { - if (abCost.getCounterType().equals(Counters.P1P1)) return false; // Other counters should be used - } - - } - - if (!millTargetAI(af, sa, false)) - return false; - - Random r = MyRandom.random; - - //Don't use draw abilities before main 2 if possible - if (AllZone.getPhase().isBefore(Constant.Phase.Main2) && !params.containsKey("ActivatingPhases")) - return false; - - //Don't tap creatures that may be able to block - if (AbilityFactory.waitForBlocking(sa)) - return false; - - double chance = .4; // 40 percent chance of milling with instant speed stuff - if (AbilityFactory.isSorcerySpeed(sa)) - chance = .667; // 66.7% chance for sorcery speed - - if ((AllZone.getPhase().is(Constant.Phase.End_Of_Turn) && AllZone.getPhase().isNextTurn(AllZone.getComputerPlayer()))) - chance = .9; // 90% for end of opponents turn - - boolean randomReturn = r.nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1); - - if (AbilityFactory.playReusable(sa)) - randomReturn = true; - // some other variables here, like deck size, and phase and other fun stuff - - if (params.get("NumCards").equals("X") && source.getSVar("X").equals("Count$xPaid")) { - // Set PayX here to maximum value. - int cardsToDiscard = Math.min(ComputerUtil.determineLeftoverMana(sa), - AllZoneUtil.getCardsInZone(Constant.Zone.Library, AllZone.getHumanPlayer()).size()); - source.setSVar("PayX", Integer.toString(cardsToDiscard)); - } - - return randomReturn; - } - - /** - *

millTargetAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean millTargetAI(AbilityFactory af, SpellAbility sa, boolean mandatory) { - Target tgt = af.getAbTgt(); - HashMap params = af.getMapParams(); - - if (tgt != null) { - tgt.resetTargets(); - if (!AllZone.getHumanPlayer().canTarget(sa)) { - if (mandatory && AllZone.getComputerPlayer().canTarget(sa)) { - tgt.addTarget(AllZone.getComputerPlayer()); - return true; - } - return false; - } - - int numCards = AbilityFactory.calculateAmount(sa.getSourceCard(), params.get("NumCards"), sa); - - CardList pLibrary = AllZoneUtil.getCardsInZone(Constant.Zone.Library, AllZone.getHumanPlayer()); - - if (pLibrary.size() == 0) { // deck already empty, no need to mill - if (!mandatory) - return false; - - tgt.addTarget(AllZone.getHumanPlayer()); - return true; - } - - if (numCards >= pLibrary.size()) { - // Can Mill out Human's deck? Do it! - tgt.addTarget(AllZone.getHumanPlayer()); - return true; - } - - // Obscure case when you know what your top card is so you might? want to mill yourself here - // if (AI wants to mill self) - // tgt.addTarget(AllZone.getComputerPlayer()); - // else - tgt.addTarget(AllZone.getHumanPlayer()); - } - return true; - } - - /** - *

millDrawback.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean millDrawback(AbilityFactory af, SpellAbility sa) { - if (!millTargetAI(af, sa, true)) - return false; - - // check SubAbilities DoTrigger? - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - return abSub.chkAI_Drawback(); - } - - return true; - } - - private static boolean millTrigger(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) // If there is a cost payment - return false; - - if (!millTargetAI(af, sa, mandatory)) - return false; - - HashMap params = af.getMapParams(); - - Card source = sa.getSourceCard(); - if (params.get("NumCards").equals("X") && source.getSVar("X").equals("Count$xPaid")){ - // Set PayX here to maximum value. - int cardsToDiscard = Math.min(ComputerUtil.determineLeftoverMana(sa), - AllZoneUtil.getCardsInZone(Constant.Zone.Library, AllZone.getHumanPlayer()).size()); - source.setSVar("PayX", Integer.toString(cardsToDiscard)); - } - - // check SubAbilities DoTrigger? - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - return abSub.doTrigger(mandatory); - } - - return true; - } - - /** - *

millResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void millResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - Card source = sa.getSourceCard(); - int numCards = AbilityFactory.calculateAmount(sa.getSourceCard(), params.get("NumCards"), sa); - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - String destination = params.get("Destination"); - if (destination == null) - destination = Constant.Zone.Graveyard; - - for (Player p : tgtPlayers){ - if (tgt == null || p.canTarget(sa)){ - CardList milled = p.mill(numCards, destination); - if (params.containsKey("RememberMilled")){ - for(Card c : milled) - source.addRemembered(c); - } - } - } - } - - ////////////////////// - // - //Discard stuff - // - ////////////////////// - - //NumCards - the number of cards to be discarded (may be integer or X) - //Mode - the mode of discard - should match spDiscard - // -Random - // -TgtChoose - // -RevealYouChoose - // -RevealOppChoose - // -RevealDiscardAll (defaults to Card if DiscardValid is missing) - // -Hand - //DiscardValid - a ValidCards syntax for acceptable cards to discard - //UnlessType - a ValidCards expression for "discard x unless you discard a ..." - - //Examples: - //A:SP$Discard | Cost$B | Tgt$TgtP | NumCards$2 | Mode$Random | SpellDescription$<...> - //A:AB$Discard | Cost$U | ValidTgts$ Opponent | Mode$RevealYouChoose | NumCards$X | SpellDescription$<...> - - /** - *

createAbilityDiscard.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityDiscard(final AbilityFactory af) { - final SpellAbility abDiscard = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 4348585353456736817L; - - @Override - public String getStackDescription() { - return discardStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return discardCanPlayAI(af, this); - } - - @Override - public void resolve() { - discardResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return discardTrigger(af, this, mandatory); - } - - }; - return abDiscard; - } - - /** - *

createSpellDiscard.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellDiscard(final AbilityFactory af) { - final SpellAbility spDiscard = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 4348585353456736817L; - - @Override - public String getStackDescription() { - return discardStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return discardCanPlayAI(af, this); - } - - @Override - public void resolve() { - discardResolve(af, this); - } - - }; - return spDiscard; - } - - /** - *

createDrawbackDiscard.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackDiscard(final AbilityFactory af) { - final SpellAbility dbDiscard = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = 4348585353456736817L; - - @Override - public String getStackDescription() { - return discardStackDescription(af, this); - } - - @Override - public void resolve() { - discardResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return discardCheckDrawbackAI(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return discardTrigger(af, this, mandatory); - } - - }; - return dbDiscard; - } - - /** - *

discardResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void discardResolve(final AbilityFactory af, final SpellAbility sa) { - Card source = sa.getSourceCard(); - HashMap params = af.getMapParams(); - - String mode = params.get("Mode"); - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - for (Player p : tgtPlayers) { - if (tgt == null || p.canTarget(sa)) { - if (mode.equals("Hand")) { - p.discardHand(sa); - continue; - } - - int numCards = 1; - if (params.containsKey("NumCards")) - numCards = AbilityFactory.calculateAmount(sa.getSourceCard(), params.get("NumCards"), sa); - - if (mode.equals("Random")) { - p.discardRandom(numCards, sa); - } else if (mode.equals("TgtChoose")) { - if (params.containsKey("UnlessType")) { - p.discardUnless(numCards, params.get("UnlessType"), sa); - } else p.discard(numCards, sa, true); - } else if (mode.equals("RevealDiscardAll")) { - // Reveal - CardList dPHand = AllZoneUtil.getPlayerHand(p); - - if (p.isHuman()) { - // "reveal to computer" for information gathering - } else { - GuiUtils.getChoiceOptional("Revealed computer hand", dPHand.toArray()); - } - - String valid = params.get("DiscardValid"); - if (valid == null) - valid = "Card"; - - if (valid.contains("X")) - valid = valid.replace("X", Integer.toString(AbilityFactory.calculateAmount(source, "X", sa))); - - CardList dPChHand = dPHand.getValidCards(valid.split(","), source.getController(), source); - - // Reveal cards that will be discarded? - for (Card c : dPChHand) { - p.discard(c, sa); - } - } else if (mode.equals("RevealYouChoose") || mode.equals("RevealOppChoose")) { - // Is Reveal you choose right? I think the wrong player is being used? - CardList dPHand = AllZoneUtil.getPlayerHand(p); - if (dPHand.size() != 0) { - CardList dPChHand = new CardList(dPHand.toArray()); - - if (params.containsKey("DiscardValid")) { // Restrict card choices - String[] dValid = params.get("DiscardValid").split(","); - dPChHand = dPHand.getValidCards(dValid, source.getController(), source); - } - Player chooser = null; - if (mode.equals("RevealYouChoose")) - chooser = source.getController(); - else chooser = source.getController().getOpponent(); - - - if (chooser.isComputer()) { - //AI - for (int i = 0; i < numCards; i++) { - if (dPChHand.size() > 0) { - CardList dChoices = new CardList(); - if (params.containsKey("DiscardValid")) { - String dValid = params.get("DiscardValid"); - if (dValid.contains("Creature") && !dValid.contains("nonCreature")) { - Card c = CardFactoryUtil.AI_getBestCreature(dPChHand); - if (c != null) - dChoices.add(CardFactoryUtil.AI_getBestCreature(dPChHand)); - } - } - - - CardListUtil.sortByTextLen(dPChHand); - dChoices.add(dPChHand.get(0)); - - CardListUtil.sortCMC(dPChHand); - dChoices.add(dPChHand.get(0)); - - Card dC = dChoices.get(CardUtil.getRandomIndex(dChoices)); - dPChHand.remove(dC); - - CardList dCs = new CardList(); - dCs.add(dC); - GuiUtils.getChoiceOptional("Computer has chosen", dCs.toArray()); - - AllZone.getComputerPlayer().discard(dC, sa); // is this right? - } - } - } else { - //human - GuiUtils.getChoiceOptional("Revealed computer hand", dPHand.toArray()); - - for (int i = 0; i < numCards; i++) { - if (dPChHand.size() > 0) { - Card dC = GuiUtils.getChoice("Choose a card to be discarded", dPChHand.toArray()); - - dPChHand.remove(dC); - AllZone.getHumanPlayer().discard(dC, sa); // is this right? - } - } - } - } - } - } - } - }//discardResolve() - - /** - *

discardStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String discardStackDescription(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - String mode = params.get("Mode"); - StringBuilder sb = new StringBuilder(); - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard().getName()).append(" - "); - else - sb.append(" "); - - String conditionDesc = params.get("ConditionDescription"); - if (conditionDesc != null) - sb.append(conditionDesc).append(" "); - - if (tgtPlayers.size() > 0) { - - for (Player p : tgtPlayers) - sb.append(p.toString()).append(" "); - - if (mode.equals("RevealYouChoose")) - sb.append("reveals his or her hand.").append(" You choose ("); - else if (mode.equals("RevealDiscardAll")) - sb.append("reveals his or her hand. Discard ("); - else - sb.append("discards ("); - - int numCards = 1; - if (params.containsKey("NumCards")) - numCards = AbilityFactory.calculateAmount(sa.getSourceCard(), params.get("NumCards"), sa); - - if (mode.equals("Hand")) - sb.append("his or her hand"); - else if (mode.equals("RevealDiscardAll")) - sb.append("All"); - else - sb.append(numCards); - - sb.append(")"); - - if (mode.equals("RevealYouChoose")) - sb.append(" to discard"); - else if (mode.equals("RevealDiscardAll")) { - String valid = params.get("DiscardValid"); - if (valid == null) - valid = "Card"; - sb.append(" of type: ").append(valid); - } - - if (mode.equals("Random")) - sb.append(" at random."); - else - sb.append("."); - } - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) - sb.append(abSub.getStackDescription()); - - return sb.toString(); - }//discardStackDescription() - - /** - *

discardCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean discardCanPlayAI(final AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - - Target tgt = af.getAbTgt(); - Card source = sa.getSourceCard(); - Cost abCost = af.getAbCost(); - - if (abCost != null) { - // AI currently disabled for these costs - if (abCost.getSacCost()) { - return false; - } - if (abCost.getLifeCost()) { - if (AllZone.getComputerPlayer().getLife() - abCost.getLifeAmount() < 4) - return false; - } - if (abCost.getDiscardCost()) return false; - - if (abCost.getSubCounter()) { - if (abCost.getCounterType().equals(Counters.P1P1)) return false; // Other counters should be used - } - - } - - boolean humanHasHand = AllZoneUtil.getCardsInZone(Constant.Zone.Hand, AllZone.getHumanPlayer()).size() > 0; - - if (tgt != null) { - if (!humanHasHand) - return false; - discardTargetAI(af, sa); - } else { - // TODO: Add appropriate restrictions - ArrayList players = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - if (players.size() == 1) { - if (players.get(0).isComputer()) { - // the ai should only be using something like this if he has few cards in hand, - // cards like this better have a good drawback to be in the AIs deck - } else { - // defined to the human, so that's fine as long the human has cards - if (!humanHasHand) - return false; - } - } else { - // Both players discard, any restrictions? - } - } - - if (!params.get("Mode").equals("Hand") && !params.get("Mode").equals("RevealDiscardAll")) { - if (params.get("NumCards").equals("X") && source.getSVar("X").equals("Count$xPaid")) { - // Set PayX here to maximum value. - int cardsToDiscard = Math.min(ComputerUtil.determineLeftoverMana(sa), - AllZoneUtil.getCardsInZone(Constant.Zone.Hand, AllZone.getHumanPlayer()).size()); - source.setSVar("PayX", Integer.toString(cardsToDiscard)); - } - } - - //Don't use draw abilities before main 2 if possible - if (AllZone.getPhase().isBefore(Constant.Phase.Main2) && !params.containsKey("ActivatingPhases")) - return false; - - //Don't tap creatures that may be able to block - if (AbilityFactory.waitForBlocking(sa)) - return false; - - double chance = .5; // 50 percent chance of discarding with instant speed stuff - if (AbilityFactory.isSorcerySpeed(sa)) - chance = .75; // 75% chance for sorcery speed - - if ((AllZone.getPhase().is(Constant.Phase.End_Of_Turn) && AllZone.getPhase().isNextTurn(AllZone.getComputerPlayer()))) - chance = .9; // 90% for end of opponents turn - - Random r = MyRandom.random; - boolean randomReturn = r.nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1); - - if (AbilityFactory.playReusable(sa)) - randomReturn = true; - - // some other variables here, like handsize vs. maxHandSize - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - randomReturn &= subAb.chkAI_Drawback(); - return randomReturn; - }//discardCanPlayAI() - - /** - *

discardTargetAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa TODO - * @return a boolean. - */ - private static boolean discardTargetAI(AbilityFactory af, SpellAbility sa) { - Target tgt = af.getAbTgt(); - if (tgt != null) { - if (AllZone.getHumanPlayer().canTarget(sa)) { - tgt.addTarget(AllZone.getHumanPlayer()); - return true; - } - } - return false; - }// discardTargetAI() - - - /** - *

discardTrigger.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean discardTrigger(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) - return false; - - Target tgt = af.getAbTgt(); - if (tgt != null) { - if (!discardTargetAI(af, sa)) { - if (mandatory && AllZone.getComputerPlayer().canTarget(sa)) - tgt.addTarget(AllZone.getComputerPlayer()); - else - return false; - } - } - - return true; - }// discardTrigger() - - /** - *

discardCheckDrawbackAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param subAb a {@link forge.card.spellability.Ability_Sub} object. - * @return a boolean. - */ - private static boolean discardCheckDrawbackAI(AbilityFactory af, Ability_Sub subAb) { - // Drawback AI improvements - // if parent draws cards, make sure cards in hand + cards drawn > 0 - Target tgt = af.getAbTgt(); - if (tgt != null) { - discardTargetAI(af, subAb); - } - // TODO: check for some extra things - return true; - }// discardCheckDrawbackAI() - - //********************************************************************** - //******************************* Shuffle ****************************** - //********************************************************************** - - /** - *

createAbilityShuffle.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityShuffle(final AbilityFactory af) { - final SpellAbility abShuffle = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -1245185178904838198L; - - @Override - public String getStackDescription() { - return shuffleStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return shuffleCanPlayAI(af, this); - } - - @Override - public void resolve() { - shuffleResolve(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return shuffleTrigger(af, this, mandatory); - } - - }; - return abShuffle; - } - - /** - *

createSpellShuffle.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellShuffle(final AbilityFactory af) { - final SpellAbility spShuffle = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 589035800601547559L; - - @Override - public String getStackDescription() { - return shuffleStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return shuffleCanPlayAI(af, this); - } - - @Override - public void resolve() { - shuffleResolve(af, this); - } - - }; - return spShuffle; - } - - /** - *

createDrawbackShuffle.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackShuffle(final AbilityFactory af) { - final SpellAbility dbShuffle = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { - private static final long serialVersionUID = 5974307947494280639L; - - @Override - public String getStackDescription() { - return shuffleStackDescription(af, this); - } - - @Override - public void resolve() { - shuffleResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return shuffleTargetAI(af, this, false, false); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return shuffleTrigger(af, this, mandatory); - } - - }; - return dbShuffle; - } - - /** - *

shuffleStackDescription.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String shuffleStackDescription(AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - StringBuilder sb = new StringBuilder(); - - if (!(sa instanceof Ability_Sub)) - sb.append(sa.getSourceCard().getName()).append(" - "); - else - sb.append(" "); - - String conditionDesc = params.get("ConditionDescription"); - if (conditionDesc != null) - sb.append(conditionDesc).append(" "); - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - if (tgtPlayers.size() > 0) { - Iterator it = tgtPlayers.iterator(); - while (it.hasNext()) { - sb.append(it.next().getName()); - if (it.hasNext()) sb.append(" and "); - } - } else { - sb.append("Error - no target players for Shuffle. "); - } - sb.append(" shuffle"); - if (tgtPlayers.size() > 1) sb.append(" their libraries"); - else sb.append("s his or her library"); - sb.append("."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - /** - *

shuffleCanPlayAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean shuffleCanPlayAI(final AbilityFactory af, SpellAbility sa) { - //not really sure when the compy would use this; maybe only after a human - // deliberately put a card on top of their library - return false; - /* - if (!ComputerUtil.canPayCost(sa)) - return false; - - Card source = sa.getSourceCard(); - - Random r = MyRandom.random; - boolean randomReturn = r.nextFloat() <= Math.pow(.667, sa.getActivationsThisTurn()+1); - - if (AbilityFactory.playReusable(sa)) - randomReturn = true; - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - randomReturn &= subAb.chkAI_Drawback(); - return randomReturn; - */ - } - - /** - *

shuffleTargetAI.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param primarySA a boolean. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean shuffleTargetAI(AbilityFactory af, SpellAbility sa, boolean primarySA, boolean mandatory) { - return false; - }// shuffleTargetAI() - - /** - *

shuffleTrigger.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory a boolean. - * @return a boolean. - */ - private static boolean shuffleTrigger(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) // If there is a cost payment - return false; - - if (!shuffleTargetAI(af, sa, false, mandatory)) - return false; - - // check SubAbilities DoTrigger? - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - return abSub.doTrigger(mandatory); - } - - return true; - } - - /** - *

shuffleResolve.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - private static void shuffleResolve(final AbilityFactory af, final SpellAbility sa) { - Card host = af.getHostCard(); - HashMap params = af.getMapParams(); - boolean optional = params.containsKey("Optional"); - - ArrayList tgtPlayers; - - Target tgt = af.getAbTgt(); - if (tgt != null) - tgtPlayers = tgt.getTargetPlayers(); - else - tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); - - for (Player p : tgtPlayers) { - if (tgt == null || p.canTarget(sa)) { - if (optional && sa.getActivatingPlayer().isHuman() && !GameActionUtil.showYesNoDialog(host, "Have " + p + " shuffle?")) { - ; //do nothing - } else { - p.shuffle(); - } - } - } - } - -}//end class AbilityFactory_ZoneAffecting diff --git a/src/forge/card/cardFactory/CardFactoryUtil.java b/src/forge/card/cardFactory/CardFactoryUtil.java deleted file mode 100644 index 23dc0335fa1..00000000000 --- a/src/forge/card/cardFactory/CardFactoryUtil.java +++ /dev/null @@ -1,4338 +0,0 @@ -package forge.card.cardFactory; - - -import com.esotericsoftware.minlog.Log; -import forge.*; -import forge.card.mana.ManaCost; -import forge.card.spellability.*; -import forge.gui.GuiUtils; -import forge.gui.input.Input; -import forge.gui.input.Input_PayManaCost; -import forge.gui.input.Input_PayManaCostUtil; - -import java.util.*; -import java.util.Map.Entry; - - -/** - *

CardFactoryUtil class.

- * - * @author Forge - * @version $Id: $ - */ -public class CardFactoryUtil { - private static Random random = MyRandom.random; - - /** - *

AI_getMostExpensivePermanent.

- * - * @param list a {@link forge.CardList} object. - * @param spell a {@link forge.Card} object. - * @param targeted a boolean. - * @return a {@link forge.Card} object. - */ - public static Card AI_getMostExpensivePermanent(CardList list, final Card spell, boolean targeted) { - CardList all = list; - if (targeted) { - all = all.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CardFactoryUtil.canTarget(spell, c); - } - }); - } - - return AI_getMostExpensivePermanent(all); - } - - public static Card AI_getMostExpensivePermanent(CardList all){ - if (all.size() == 0) return null; - Card biggest = null; - biggest = all.get(0); - - int bigCMC = 0; - for (int i = 0; i < all.size(); i++) { - Card card = all.get(i); - int curCMC = card.getCMC(); - - //Add all cost of all auras with the same controller - CardList auras = new CardList(card.getEnchantedBy().toArray()); - auras.getController(card.getController()); - curCMC += auras.getTotalConvertedManaCost() + auras.size(); - - if (curCMC >= bigCMC) { - bigCMC = curCMC; - biggest = all.get(i); - } - } - - return biggest; - } - - //for Sarkhan the Mad - /** - *

AI_getCheapestCreature.

- * - * @param list a {@link forge.CardList} object. - * @param spell a {@link forge.Card} object. - * @param targeted a boolean. - * @return a {@link forge.Card} object. - */ - public static Card AI_getCheapestCreature(CardList list, final Card spell, boolean targeted) { - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isCreature(); - } - }); - return AI_getCheapestPermanent(list, spell, targeted); - } - - /** - *

AI_getCheapestPermanent.

- * - * @param list a {@link forge.CardList} object. - * @param spell a {@link forge.Card} object. - * @param targeted a boolean. - * @return a {@link forge.Card} object. - */ - public static Card AI_getCheapestPermanent(CardList list, final Card spell, boolean targeted) { - CardList all = list; - if (targeted) { - all = all.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CardFactoryUtil.canTarget(spell, c); - } - }); - } - if (all.size() == 0) return null; - - //get cheapest card: - Card cheapest = null; - cheapest = all.get(0); - - for (int i = 0; i < all.size(); i++) { - if (CardUtil.getConvertedManaCost(cheapest.getManaCost()) <= CardUtil.getConvertedManaCost(cheapest.getManaCost())) { - cheapest = all.get(i); - } - } - - return cheapest; - - } - - /** - *

AI_getBestLand.

- * - * @param list a {@link forge.CardList} object. - * @return a {@link forge.Card} object. - */ - public static Card AI_getBestLand(CardList list) { - CardList land = list.getType("Land"); - if (!(land.size() > 0)) return null; - - CardList nbLand = land.filter(new CardListFilter() // prefer to target non basic lands - { - public boolean addCard(Card c) { - return (!c.isBasicLand()); - } - }); - - if (nbLand.size() > 0) { - //TODO: Rank non basics? - - Random r = MyRandom.random; - return nbLand.get(r.nextInt(nbLand.size())); - } - - // if no non-basic lands, target the least represented basic land type - String names[] = {"Plains", "Island", "Swamp", "Mountain", "Forest"}; - String sminBL = ""; - int iminBL = 20000; // hopefully no one will ever have more than 20000 lands of one type.... - int n = 0; - for (int i = 0; i < 5; i++) { - n = land.getType(names[i]).size(); - if (n < iminBL && n > 0) // if two or more are tied, only the first one checked will be used - { - iminBL = n; - sminBL = names[i]; - } - } - if (iminBL == 20000) return null; // no basic land was a minimum - - CardList BLand = land.getType(sminBL); - for (int i = 0; i < BLand.size(); i++) - if (!BLand.get(i).isTapped()) // prefer untapped lands - return BLand.get(i); - - Random r = MyRandom.random; - return BLand.get(r.nextInt(BLand.size())); // random tapped land of least represented type - } - - - //The AI doesn't really pick the best enchantment, just the most expensive. - /** - *

AI_getBestEnchantment.

- * - * @param list a {@link forge.CardList} object. - * @param spell a {@link forge.Card} object. - * @param targeted a boolean. - * @return a {@link forge.Card} object. - */ - public static Card AI_getBestEnchantment(CardList list, final Card spell, boolean targeted) { - CardList all = list; - all = all.getType("Enchantment"); - if (targeted) { - all = all.filter(new CardListFilter() { - - public boolean addCard(Card c) { - return CardFactoryUtil.canTarget(spell, c); - } - }); - } - if (all.size() == 0) { - return null; - } - - //get biggest Enchantment - Card biggest = null; - biggest = all.get(0); - - int bigCMC = 0; - for (int i = 0; i < all.size(); i++) { - int curCMC = CardUtil.getConvertedManaCost(all.get(i).getManaCost()); - - if (curCMC > bigCMC) { - bigCMC = curCMC; - biggest = all.get(i); - } - } - - return biggest; - } - - - //The AI doesn't really pick the best artifact, just the most expensive. - /** - *

AI_getBestArtifact.

- * - * @param list a {@link forge.CardList} object. - * @return a {@link forge.Card} object. - */ - public static Card AI_getBestArtifact(CardList list) { - CardList all = list; - all = all.getType("Artifact"); - if (all.size() == 0) { - return null; - } - - //get biggest Artifact - Card biggest = null; - biggest = all.get(0); - - int bigCMC = 0; - for (int i = 0; i < all.size(); i++) { - int curCMC = CardUtil.getConvertedManaCost(all.get(i).getManaCost()); - - if (curCMC > bigCMC) { - bigCMC = curCMC; - biggest = all.get(i); - } - } - - return biggest; - } - - /** - *

AI_getHumanArtifact.

- * - * @param spell a {@link forge.Card} object. - * @param targeted a boolean. - * @return a {@link forge.CardList} object. - */ - public static CardList AI_getHumanArtifact(final Card spell, boolean targeted) { - CardList artifact = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - artifact = artifact.getType("Artifact"); - if (targeted) { - artifact = artifact.filter(new CardListFilter() { - public boolean addCard(Card c) { - return canTarget(spell, c); - } - }); - } - return artifact; - } - - /** - *

AI_doesCreatureAttack.

- * - * @param card a {@link forge.Card} object. - * @return a boolean. - */ - public static boolean AI_doesCreatureAttack(Card card) { - Combat combat = ComputerUtil.getAttackers(); - Card[] att = combat.getAttackers(); - for (int i = 0; i < att.length; i++) - if (att[i].equals(card)) return true; - - return false; - } - - /** - *

evaluateCreatureList.

- * - * @param list a {@link forge.CardList} object. - * @return a int. - */ - public static int evaluateCreatureList(CardList list) { - int value = 0; - for (int i = 0; i < list.size(); i++) value += evaluateCreature(list.get(i)); - - return value; - } - - /** - *

evaluatePermanentList.

- * - * @param list a {@link forge.CardList} object. - * @return a int. - */ - public static int evaluatePermanentList(CardList list) { - int value = 0; - for (int i = 0; i < list.size(); i++) value += list.get(i).getCMC() + 1; - - return value; - } - - /** - *

evaluateCreature.

- * - * @param c a {@link forge.Card} object. - * @return a int. - */ - public static int evaluateCreature(Card c) { - - int value = 100; - if (c.isToken()) value = 80; //tokens should be worth less than actual cards - int power = c.getNetAttack(); - int toughness = c.getNetDefense(); - - //Doran - if (AllZoneUtil.isCardInPlay("Doran, the Siege Tower")) power = toughness; - - if (c.hasKeyword("Prevent all combat damage that would be dealt by CARDNAME.") - || c.hasKeyword("Prevent all damage that would be dealt by CARDNAME.") - || c.hasKeyword("Prevent all combat damage that would be dealt to and dealt by CARDNAME.") - || c.hasKeyword("Prevent all damage that would be dealt to and dealt by CARDNAME.")) - power = 0; - - value += power * 15; - value += toughness * 10; - value += c.getCMC() * 5; - - //Evasion keywords - if (c.hasKeyword("Flying")) value += power * 10; - if (c.hasKeyword("Horsemanship")) value += power * 10; - if (c.hasKeyword("Unblockable")) value += power * 10; - if (c.hasKeyword("Fear")) value += power * 6; - if (c.hasKeyword("Intimidate")) value += power * 6; - if (c.hasStartOfKeyword("CARDNAME can't be blocked except by")) value += power * 5; - if (c.hasStartOfKeyword("CARDNAME can't be blocked by")) value += power * 2; - - //Battle stats increasing keywords - if (c.hasKeyword("Double Strike")) value += 10 + power * 15; - value += c.getKeywordMagnitude("Bushido") * 16; - value += c.getAmountOfKeyword("Flanking") * 15; - - //Other good keywords - if (c.hasKeyword("Deathtouch") && power > 0) value += 25; - value += c.getAmountOfKeyword("Exalted") * 15; - if (c.hasKeyword("First Strike") && !c.hasKeyword("Double Strike") && power > 0) value += 10 + power * 5; - if (c.hasKeyword("Lifelink")) value += power * 10; - if (c.hasKeyword("Trample") && power > 1) value += power * 3; - if (c.hasKeyword("Vigilance")) value += power * 5 + toughness * 5; - if (c.hasKeyword("Wither")) value += power * 10; - value += c.getKeywordMagnitude("Rampage"); - value += c.getKeywordMagnitude("Annihilator") * 50; - if (c.hasKeyword("Changeling")) value += 5; - if (c.hasKeyword("Whenever a creature dealt damage by CARDNAME this turn is put into a graveyard, put a +1/+1 counter on CARDNAME.") - && power > 0) value += 2; - if (c.hasKeyword("Whenever a creature dealt damage by CARDNAME this turn is put into a graveyard, put a +2/+2 counter on CARDNAME.") - && power > 0) value += 4; - if (c.hasKeyword("Whenever CARDNAME is dealt damage, put a +1/+1 counter on it.")) value += 10; - - //Defensive Keywords - if (c.hasKeyword("Reach")) value += 5; - if (c.hasKeyword("CARDNAME can block creatures with shadow as though they didn't have shadow.")) value += 3; - - //Protection - if (c.hasKeyword("Indestructible")) value += 70; - if (c.hasKeyword("Prevent all damage that would be dealt to CARDNAME.")) value += 60; - if (c.hasKeyword("Prevent all combat damage that would be dealt to CARDNAME.")) value += 50; - if (c.hasKeyword("Shroud")) value += 30; - if (c.hasKeyword("Hexproof")) value += 35; - if (c.hasStartOfKeyword("Protection")) value += 20; - if (c.hasStartOfKeyword("PreventAllDamageBy")) value += 10; - value += c.getKeywordMagnitude("Absorb") * 11; - - //Activated Abilities - if (c.hasStartOfKeyword("ab")) value += 10; - - //Bad keywords - if (c.hasKeyword("Defender") || c.hasKeyword("CARDNAME can't attack.")) value -= power * 9 + 40; - if (c.hasKeyword("CARDNAME can't block.")) value -= 10; - if (c.hasKeyword("CARDNAME attacks each turn if able.")) value -= 10; - if (c.hasKeyword("CARDNAME can block only creatures with flying.")) value -= toughness * 5; - - if (c.hasStartOfKeyword("When CARDNAME is dealt damage, destroy it.")) value -= (toughness - 1) * 9; - - if (c.hasKeyword("CARDNAME can't attack or block.")) value = 50 + c.getCMC() * 5; //reset everything - useless - if (c.hasKeyword("At the beginning of the end step, destroy CARDNAME.")) value -= 50; - if (c.hasKeyword("At the beginning of the end step, exile CARDNAME.")) value -= 50; - if (c.hasKeyword("At the beginning of the end step, sacrifice CARDNAME.")) value -= 50; - if (c.hasStartOfKeyword("At the beginning of your upkeep, CARDNAME deals")) value -= 20; - if (c.hasStartOfKeyword("At the beginning of your upkeep, destroy CARDNAME unless you pay")) value -= 20; - if (c.hasStartOfKeyword("At the beginning of your upkeep, sacrifice CARDNAME unless you pay")) value -= 20; - if (c.hasStartOfKeyword("Upkeep:")) value -= 20; - if (c.hasStartOfKeyword("Cumulative upkeep")) value -= 30; - if (c.hasStartOfKeyword("(Echo unpaid)")) value -= 10; - if (c.hasStartOfKeyword("Fading")) value -= 20; //not used atm - if (c.hasStartOfKeyword("Vanishing")) value -= 20; //not used atm - - if (c.isUntapped()) value += 1; - - return value; - - } //evaluateCreature - - //returns null if list.size() == 0 - /** - *

AI_getBestCreature.

- * - * @param list a {@link forge.CardList} object. - * @return a {@link forge.Card} object. - */ - - public static Card AI_getBest(CardList list) { - // Get Best will filter by appropriate getBest list if ALL of the list is of that type - if (list.getNotType("Creature").size() == 0) - return AI_getBestCreature(list); - - if (list.getNotType("Land").size() == 0) - return AI_getBestLand(list); - - // TODO: Once we get an EvaluatePermanent this should call getBestPermanent() - return AI_getMostExpensivePermanent(list); - } - - public static Card AI_getBestCreature(CardList list) { - CardList all = list; - all = all.getType("Creature"); - Card biggest = null; - - if (all.size() != 0) { - biggest = all.get(0); - - for (int i = 0; i < all.size(); i++) - if (evaluateCreature(biggest) < evaluateCreature(all.get(i))) biggest = all.get(i); - } - return biggest; - } - - //This selection rates tokens higher - /** - *

AI_getBestCreatureToBounce.

- * - * @param list a {@link forge.CardList} object. - * @return a {@link forge.Card} object. - */ - public static Card AI_getBestCreatureToBounce(CardList list) { - int tokenBonus = 40; - CardList all = list; - all = all.getType("Creature"); - Card biggest = null; //returns null if list.size() == 0 - int biggestvalue = 0; - int newvalue = 0; - - if (all.size() != 0) { - biggest = all.get(0); - - for (int i = 0; i < all.size(); i++) { - biggestvalue = evaluateCreature(biggest); - if (biggest.isToken()) biggestvalue += tokenBonus; // raise the value of tokens - newvalue = evaluateCreature(all.get(i)); - if (all.get(i).isToken()) newvalue += tokenBonus; // raise the value of tokens - if (biggestvalue < newvalue) biggest = all.get(i); - } - } - return biggest; - } - - //returns null if list.size() == 0 - /** - *

AI_getWorstCreature.

- * - * @param list a {@link forge.CardList} object. - * @return a {@link forge.Card} object. - */ - public static Card AI_getWorstCreature(CardList list) { - CardList all = list; - all = all.getType("Creature"); - //get smallest creature - Card smallest = null; - - if (all.size() != 0) { - smallest = all.get(0); - - for (int i = 0; i < all.size(); i++) - if (evaluateCreature(smallest) > evaluateCreature(all.get(i))) smallest = all.get(i); - } - return smallest; - } - - /** - *

AI_getWorstPermanent.

- * - * @param list a {@link forge.CardList} object. - * @param biasEnch a boolean. - * @param biasLand a boolean. - * @param biasArt a boolean. - * @param biasCreature a boolean. - * @return a {@link forge.Card} object. - */ - public static Card AI_getWorstPermanent(final CardList list, boolean biasEnch, boolean biasLand, boolean biasArt, boolean biasCreature) { - if (list.size() == 0) return null; - - if (biasEnch && list.getType("Enchantment").size() > 0) { - return AI_getCheapestPermanent(list.getType("Enchantment"), null, false); - } - - if (biasArt && list.getType("Artifact").size() > 0) { - return AI_getCheapestPermanent(list.getType("Artifact"), null, false); - } - - if (biasLand && list.getType("Land").size() > 0) { - return getWorstLand(list.getType("Land")); - } - - if (biasCreature && list.getType("Creature").size() > 0) { - return AI_getWorstCreature(list.getType("Creature")); - } - - if (list.getType("Land").size() > 6) { - return getWorstLand(list.getType("Land")); - } - - if (list.getType("Artifact").size() > 0 || list.getType("Enchantment").size() > 0) { - return AI_getCheapestPermanent(list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isArtifact() || c.isEnchantment(); - } - }), null, false); - } - - if (list.getType("Creature").size() > 0) { - return AI_getWorstCreature(list.getType("Creature")); - } - - //Planeswalkers fall through to here, lands will fall through if there aren't very many - return AI_getCheapestPermanent(list, null, false); - } - - /** - *

input_Spell.

- * - * @param spell a {@link forge.card.spellability.SpellAbility} object. - * @param choices a {@link forge.CardList} object. - * @param free a boolean. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input input_Spell(final SpellAbility spell, final CardList choices, final boolean free) { - Input target = new Input() { - private static final long serialVersionUID = 2781418414287281005L; - - @Override - public void showMessage() { - if (choices.size() == 0) stop(); - if (spell.getTargetCard() != null) stop(); - AllZone.getDisplay().showMessage("Select target Spell: "); - Card choice = GuiUtils.getChoiceOptional("Choose a Spell", choices.toArray()); - if (choice != null) { - spell.setTargetCard(choice); - done(); - } else stop(); - - } - - @Override - public void selectButtonCancel() { - stop(); - } - - void done() { - choices.clear(); - if (spell.getManaCost().equals("0") || this.isFree()) { - if (spell.getTargetCard() != null) AllZone.getStack().add(spell); - stop(); - } else stopSetNext(new Input_PayManaCost(spell)); - } - }; - return target; - }//input_targetSpell() - - /** - *

input_destroyNoRegeneration.

- * - * @param choices a {@link forge.CardList} object. - * @param message a {@link java.lang.String} object. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input input_destroyNoRegeneration(final CardList choices, final String message) { - Input target = new Input() { - private static final long serialVersionUID = -6637588517573573232L; - - @Override - public void showMessage() { - AllZone.getDisplay().showMessage(message); - ButtonUtil.disableAll(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (choices.contains(card)) { - AllZone.getGameAction().destroyNoRegeneration(card); - stop(); - } - } - }; - return target; - }//input_destroyNoRegeneration() - - /** - *

ability_Flashback.

- * - * @param sourceCard a {@link forge.Card} object. - * @param cost a {@link java.lang.String} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility ability_Flashback(final Card sourceCard, String cost) { - Cost fbCost = new Cost(cost, sourceCard.getName(), true); - final SpellAbility flashback = new Spell(sourceCard) { - - private static final long serialVersionUID = -4196027546564209412L; - - @Override - public void resolve() { - SpellAbility[] sa = sourceCard.getSpellAbility(); - AllZone.getGameAction().moveToStack(sourceCard); - SpellAbility flash = sa[0]; - flash.setFlashBackAbility(true); - AllZone.getStack().add(flash); - } - - @Override - public boolean canPlayAI() { - return ComputerUtil.canPayCost(this); - } - - @Override - public boolean canPlay() { - Card sourceCard = this.getSourceCard(); - - return AllZoneUtil.isCardInPlayerGraveyard(sourceCard.getController(), sourceCard) - && (sourceCard.isInstant() || Phase.canCastSorcery(sourceCard.getController())); - - } - - }; - - flashback.setPayCosts(fbCost); - - String costString = fbCost.toString().replace(":", "."); - - StringBuilder sbDesc = new StringBuilder(); - sbDesc.append("Flashback: ").append(costString); - flashback.setDescription(sbDesc.toString()); - // possibly add Flashback into here? - - StringBuilder sbStack = new StringBuilder(); - sbStack.append("Flashback: ").append(sourceCard.getName()); - flashback.setStackDescription(sbStack.toString()); - - return flashback; - - }//ability_Flashback() - - /** - *

ability_Unearth.

- * - * @param sourceCard a {@link forge.Card} object. - * @param manaCost a {@link java.lang.String} object. - * @return a {@link forge.card.spellability.Ability_Activated} object. - */ - public static Ability_Activated ability_Unearth(final Card sourceCard, String manaCost) { - - Cost cost = new Cost(manaCost, sourceCard.getName(), true); - final Ability_Activated unearth = new Ability_Activated(sourceCard, cost, null) { - private static final long serialVersionUID = -5633945565395478009L; - - @Override - public void resolve() { - Card card = AllZone.getGameAction().moveToPlay(sourceCard); - - card.addIntrinsicKeyword("At the beginning of the end step, exile CARDNAME."); - card.addIntrinsicKeyword("Haste"); - card.setUnearthed(true); - } - - @Override - public boolean canPlayAI() { - if (AllZone.getPhase().isAfter(Constant.Phase.Main1) || AllZone.getPhase().isPlayerTurn(AllZone.getHumanPlayer())) - return false; - return ComputerUtil.canPayCost(this); - } - }; - SpellAbility_Restriction restrict = new SpellAbility_Restriction(); - restrict.setZone("Graveyard"); - restrict.setSorcerySpeed(true); - unearth.setRestrictions(restrict); - - StringBuilder sbStack = new StringBuilder(); - sbStack.append("Unearth: ").append(sourceCard.getName()); - unearth.setStackDescription(sbStack.toString()); - - return unearth; - }//ability_Unearth() - - /** - *

ability_Morph_Down.

- * - * @param sourceCard a {@link forge.Card} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility ability_Morph_Down(final Card sourceCard) { - final SpellAbility morph_down = new Spell(sourceCard) { - private static final long serialVersionUID = -1438810964807867610L; - - @Override - public void resolve() { - //card.setName("Morph"); - sourceCard.setIsFaceDown(true); - sourceCard.setManaCost(""); - sourceCard.setColor(new ArrayList()); //remove all colors - sourceCard.addColor("0"); - sourceCard.setBaseAttack(2); - sourceCard.setBaseDefense(2); - sourceCard.comesIntoPlay(); - sourceCard.setIntrinsicKeyword(new ArrayList()); //remove all keywords - sourceCard.setType(new ArrayList()); //remove all types - sourceCard.addType("Creature"); - - AllZone.getGameAction().moveToPlay(sourceCard); - } - - @Override - public boolean canPlay() { - return Phase.canCastSorcery(sourceCard.getController()) - && !AllZoneUtil.isCardInPlay(sourceCard); - } - - }; - - morph_down.setManaCost("3"); - morph_down.setDescription("(You may cast this face down as a 2/2 creature for 3.)"); - morph_down.setStackDescription("Morph - Creature 2/2"); - - return morph_down; - } - - /** - *

ability_Morph_Up.

- * - * @param sourceCard a {@link forge.Card} object. - * @param cost a {@link forge.card.spellability.Cost} object. - * @param orgManaCost a {@link java.lang.String} object. - * @param a a int. - * @param d a int. - * @return a {@link forge.card.spellability.Ability_Activated} object. - */ - public static Ability_Activated ability_Morph_Up(final Card sourceCard, Cost cost, String orgManaCost, int a, int d) { - //final String player = sourceCard.getController(); - //final String manaCost = cost; - final int attack = a; - final int defense = d; - final String origManaCost = orgManaCost; - final Ability_Activated morph_up = new Ability_Activated(sourceCard, cost, null) { - private static final long serialVersionUID = -3663857013937085953L; - - @Override - public void resolve() { - //card.setName("Morph"); - sourceCard.setIsFaceDown(false); - sourceCard.setManaCost(origManaCost); - sourceCard.addColor(origManaCost); - sourceCard.setBaseAttack(attack); - sourceCard.setBaseDefense(defense); - sourceCard.setIntrinsicKeyword(sourceCard.getPrevIntrinsicKeyword()); - sourceCard.setType(sourceCard.getPrevType()); - sourceCard.turnFaceUp(); - } - - @Override - public boolean canPlay() { - // unMorphing a card is a Special Action, and not affected by Linvala - return sourceCard.getController().equals(this.getActivatingPlayer()) && sourceCard.isFaceDown() - && AllZoneUtil.isCardInPlay(sourceCard); - } - - };//morph_up - - //morph_up.setManaCost(cost); - String costDesc = cost.toString(); - //get rid of the ": " at the end - costDesc = costDesc.substring(0, costDesc.length() - 2); - StringBuilder sb = new StringBuilder(); - sb.append("Morph"); - if (!cost.isOnlyManaCost()) sb.append(" -"); - sb.append(" ").append(costDesc).append(" (Turn this face up any time for its morph cost.)"); - morph_up.setDescription(sb.toString()); - - StringBuilder sbStack = new StringBuilder(); - sbStack.append(sourceCard.getName()).append(" - turn this card face up."); - morph_up.setStackDescription(sbStack.toString()); - - return morph_up; - } - - /** - *

ability_cycle.

- * - * @param sourceCard a {@link forge.Card} object. - * @param cycleCost a {@link java.lang.String} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility ability_cycle(final Card sourceCard, String cycleCost) { - cycleCost += " Discard<1/CARDNAME>"; - Cost abCost = new Cost(cycleCost, sourceCard.getName(), true); - - final SpellAbility cycle = new Ability_Activated(sourceCard, abCost, null) { - private static final long serialVersionUID = -4960704261761785512L; - - @Override - public boolean canPlayAI() { - - if(AllZone.getPhase().isBefore(Constant.Phase.Main2)) - return false; - - //The AI should cycle lands if it has 6 already and no cards in hand with higher CMC - CardList hand = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); - CardList lands = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - lands.addAll(hand); - lands = lands.getType("Land"); - - if (sourceCard.isLand() && lands.size() >= Math.max(hand.getHighestConvertedManaCost(), 6)) - return true; - - //TODO: When else should AI Cycle? - return false; - } - - @Override - public boolean canPlay() { - if (AllZoneUtil.isCardInPlay("Stabilizer")) return false; - return super.canPlay(); - } - - @Override - public void resolve() { - sourceCard.getController().drawCard(); - sourceCard.cycle(); - } - }; - cycle.setIsCycling(true); - StringBuilder sbDesc = new StringBuilder(); - sbDesc.append("Cycling ").append(cycle.getManaCost()).append(" (").append(abCost.toString()).append(" Draw a card.)"); - cycle.setDescription(sbDesc.toString()); - - StringBuilder sbStack = new StringBuilder(); - sbStack.append(sourceCard).append(" Cycling: Draw a card"); - cycle.setStackDescription(sbStack.toString()); - - cycle.getRestrictions().setZone(Constant.Zone.Hand); - return cycle; - }//ability_cycle() - - /** - *

ability_typecycle.

- * - * @param sourceCard a {@link forge.Card} object. - * @param cycleCost a {@link java.lang.String} object. - * @param type a {@link java.lang.String} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility ability_typecycle(final Card sourceCard, String cycleCost, final String type) { - String description; - cycleCost += " Discard<1/CARDNAME>"; - Cost abCost = new Cost(cycleCost, sourceCard.getName(), true); - - final SpellAbility cycle = new Ability_Activated(sourceCard, abCost, null) { - private static final long serialVersionUID = -4960704261761785512L; - - @Override - public boolean canPlayAI() { - return false; - } - - // some AI code could be added (certain colored mana needs analyze method maybe) - - @Override - public boolean canPlay() { - if (AllZoneUtil.isCardInPlay("Stabilizer")) return false; - return super.canPlay(); - } - - @Override - public void resolve() { - CardList cards = AllZoneUtil.getPlayerCardsInLibrary(sourceCard.getController()); - CardList sameType = new CardList(); - - for (int i = 0; i < cards.size(); i++) { - if (cards.get(i).isType(type)) { - sameType.add(cards.get(i)); - } - } - - if (sameType.size() == 0) { - sourceCard.getController().discard(sourceCard, this); - return; - } - - Object o = GuiUtils.getChoiceOptional("Select a card", sameType.toArray()); - if (o != null) { - //ability.setTargetCard((Card)o); - - sourceCard.getController().discard(sourceCard, this); - Card c1 = (Card) o; - AllZone.getGameAction().moveToHand(c1); - - } - sourceCard.getController().shuffle(); - } - }; - if (type.contains("Basic")) description = "Basic land"; - else description = type; - - cycle.setIsCycling(true); - StringBuilder sbDesc = new StringBuilder(); - sbDesc.append(description).append("cycling (").append(abCost.toString()).append(" Search your library for a "); - sbDesc.append(description).append(" card, reveal it, and put it into your hand. Then shuffle your library.)"); - cycle.setDescription(sbDesc.toString()); - - StringBuilder sbStack = new StringBuilder(); - sbStack.append(sourceCard).append(" ").append(description); - sbStack.append("cycling: Search your library for a ").append(description).append(" card.)"); - cycle.setStackDescription(sbStack.toString()); - - cycle.getRestrictions().setZone(Constant.Zone.Hand); - - return cycle; - }//ability_typecycle() - - - /** - *

ability_transmute.

- * - * @param sourceCard a {@link forge.Card} object. - * @param transmuteCost a {@link java.lang.String} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility ability_transmute(final Card sourceCard, String transmuteCost) { - transmuteCost += " Discard<1/CARDNAME>"; - Cost abCost = new Cost(transmuteCost, sourceCard.getName(), true); - - final SpellAbility transmute = new Ability_Activated(sourceCard, abCost, null) { - private static final long serialVersionUID = -4960704261761785512L; - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public boolean canPlay() { - return super.canPlay() && Phase.canCastSorcery(sourceCard.getController()); - } - - @Override - public void resolve() { - CardList cards = AllZoneUtil.getPlayerCardsInLibrary(sourceCard.getController()); - CardList sameCost = new CardList(); - - for (int i = 0; i < cards.size(); i++) { - if (CardUtil.getConvertedManaCost(cards.get(i).getManaCost()) == CardUtil.getConvertedManaCost(sourceCard.getManaCost())) { - sameCost.add(cards.get(i)); - } - } - - - if (sameCost.size() == 0) return; - - - Object o = GuiUtils.getChoiceOptional("Select a card", sameCost.toArray()); - if (o != null) { - //ability.setTargetCard((Card)o); - - sourceCard.getController().discard(sourceCard, this); - Card c1 = (Card) o; - - AllZone.getGameAction().moveToHand(c1); - - } - sourceCard.getController().shuffle(); - } - - }; - StringBuilder sbDesc = new StringBuilder(); - sbDesc.append("Transmute (").append(abCost.toString()); - sbDesc.append("Search your library for a card with the same converted mana cost as this card, reveal it, "); - sbDesc.append("and put it into your hand. Then shuffle your library. Transmute only as a sorcery.)"); - transmute.setDescription(sbDesc.toString()); - - StringBuilder sbStack = new StringBuilder(); - sbStack.append(sourceCard).append(" Transmute: Search your library for a card with the same converted mana cost.)"); - transmute.setStackDescription(sbStack.toString()); - - transmute.getRestrictions().setZone(Constant.Zone.Hand); - return transmute; - }//ability_transmute() - - /** - *

ability_suspend.

- * - * @param sourceCard a {@link forge.Card} object. - * @param suspendCost a {@link java.lang.String} object. - * @param suspendCounters a int. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility ability_suspend(final Card sourceCard, final String suspendCost, final int suspendCounters) { - // be careful with Suspend ability, it will not hit the stack - final SpellAbility suspend = new Ability_Static(sourceCard, suspendCost) { - @SuppressWarnings("unused") - private static final long serialVersionUID = 21625903128384507L; - - @Override - public boolean canPlay() { - if (!(getRestrictions().canPlay(sourceCard, this))) - return false; - - if (sourceCard.isInstant()) - return true; - - return Phase.canCastSorcery(sourceCard.getOwner()); - } - - @Override - public boolean canPlayAI() { - return false; - // Suspend currently not functional for the AI, - // seems to be an issue with regaining Priority after Suspension - } - - @Override - public void resolve() { - Card c = AllZone.getGameAction().exile(sourceCard); - c.addCounter(Counters.TIME, suspendCounters); - } - }; - StringBuilder sbDesc = new StringBuilder(); - sbDesc.append("Suspend ").append(suspendCounters).append(": ").append(suspendCost); - suspend.setDescription(sbDesc.toString()); - - StringBuilder sbStack = new StringBuilder(); - sbStack.append(sourceCard.getName()).append(" suspending for ").append(suspendCounters).append(" turns.)"); - suspend.setStackDescription(sbStack.toString()); - - suspend.getRestrictions().setZone(Constant.Zone.Hand); - return suspend; - }//ability_suspend() - - /** - *

eqPump_Equip.

- * - * @param sourceCard a {@link forge.Card} object. - * @param Power a int. - * @param Tough a int. - * @param extrinsicKeywords an array of {@link java.lang.String} objects. - * @param abCost a {@link forge.card.spellability.Cost} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility eqPump_Equip(final Card sourceCard, final int Power, final int Tough, final String[] extrinsicKeywords, final Cost abCost) { - Target target = new Target(sourceCard, "Select target creature you control", "Creature.YouCtrl".split(",")); - final SpellAbility equip = new Ability_Activated(sourceCard, abCost, target) { - private static final long serialVersionUID = -4960704261761785512L; - - @Override - public void resolve() { - Card targetCard = getTargetCard(); - if (AllZoneUtil.isCardInPlay(targetCard) - && CardFactoryUtil.canTarget(sourceCard, targetCard)) { - - if (sourceCard.isEquipping()) { - Card crd = sourceCard.getEquipping().get(0); - if (crd.equals(targetCard)) return; - - sourceCard.unEquipCard(crd); - } - sourceCard.equipCard(targetCard); - } - } - - // An animated artifact equipmemt can't equip a creature - @Override - public boolean canPlay() { - return AllZone.getZone(sourceCard).is(Constant.Zone.Battlefield) - && !sourceCard.isCreature() - && Phase.canCastSorcery(sourceCard.getController()); - } - - @Override - public boolean canPlayAI() { - return getCreature().size() != 0 - && !sourceCard.isEquipping(); - } - - @Override - public void chooseTargetAI() { - Card target = CardFactoryUtil.AI_getBestCreature(getCreature()); - setTargetCard(target); - } - - CardList getCreature() { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isCreature() - && (CombatUtil.canAttack(c) || (CombatUtil.canAttackNextTurn(c) && AllZone.getPhase().is(Constant.Phase.Main2))) - && CardFactoryUtil.canTarget(sourceCard, c) - && (c.getNetDefense() + Tough > 0 || sourceCard.getName().equals("Skullclamp")); - } - }); - - // Is there at least 1 Loxodon Punisher and/or Goblin Gaveleer to target - CardList equipMagnetList = list; - equipMagnetList = equipMagnetList.getEquipMagnets(); - - if (!equipMagnetList.isEmpty() && Tough >= 0) { - return equipMagnetList; - } - - // This equipment is keyword only - if (Power == 0 && Tough == 0) { - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - ArrayList extKeywords = new ArrayList(Arrays.asList(extrinsicKeywords)); - for (String s : extKeywords) { - - // We want to give a new keyword - if (!c.hasKeyword(s)) - return true; - } - //no new keywords: - return false; - } - }); - } - - return list; - }//getCreature() - };//equip ability - - String costDesc = abCost.toString(); - //get rid of the ": " at the end - costDesc = costDesc.substring(0, costDesc.length() - 2); - - StringBuilder sbDesc = new StringBuilder(); - sbDesc.append("Equip"); - if (!abCost.isOnlyManaCost()) sbDesc.append(" -"); - sbDesc.append(" ").append(costDesc); - equip.setDescription(sbDesc.toString()); - - return equip; - }//eqPump_Equip() ( was vanila_equip() ) - - /** - *

eqPump_onEquip.

- * - * @param sourceCard a {@link forge.Card} object. - * @param Power a int. - * @param Tough a int. - * @param extrinsicKeywords an array of {@link java.lang.String} objects. - * @param abCost a {@link forge.card.spellability.Cost} object. - * @return a {@link forge.Command} object. - */ - public static Command eqPump_onEquip(final Card sourceCard, final int Power, final int Tough, final String[] extrinsicKeywords, final Cost abCost) { - - Command onEquip = new Command() { - - private static final long serialVersionUID = 8130682765214560887L; - - public void execute() { - if (sourceCard.isEquipping()) { - Card crd = sourceCard.getEquipping().get(0); - - for (int i = 0; i < extrinsicKeywords.length; i++) { - if (!(extrinsicKeywords[i].equals("none")) - && (!crd.hasKeyword(extrinsicKeywords[i]))) // prevent Flying, Flying - crd.addExtrinsicKeyword(extrinsicKeywords[i]); - } - - crd.addSemiPermanentAttackBoost(Power); - crd.addSemiPermanentDefenseBoost(Tough); - } - }//execute() - };//Command - - - return onEquip; - }//eqPump_onEquip ( was vanila_onequip() ) - - /** - *

eqPump_unEquip.

- * - * @param sourceCard a {@link forge.Card} object. - * @param Power a int. - * @param Tough a int. - * @param extrinsicKeywords an array of {@link java.lang.String} objects. - * @param abCost a {@link forge.card.spellability.Cost} object. - * @return a {@link forge.Command} object. - */ - public static Command eqPump_unEquip(final Card sourceCard, final int Power, final int Tough, final String[] extrinsicKeywords, final Cost abCost) { - - Command onUnEquip = new Command() { - - private static final long serialVersionUID = 5783423127748320501L; - - public void execute() { - if (sourceCard.isEquipping()) { - Card crd = sourceCard.getEquipping().get(0); - - for (int i = 0; i < extrinsicKeywords.length; i++) { - crd.removeExtrinsicKeyword(extrinsicKeywords[i]); - } - - crd.addSemiPermanentAttackBoost(-1 * Power); - crd.addSemiPermanentDefenseBoost(-1 * Tough); - - } - - }//execute() - };//Command - - return onUnEquip; - }//eqPump_unEquip ( was vanila_unequip() ) - - - /** - *

getEldraziSpawnAbility.

- * - * @param c a {@link forge.Card} object. - * @return a {@link forge.card.spellability.Ability_Mana} object. - */ - public static Ability_Mana getEldraziSpawnAbility(final Card c) { - Cost cost = new Cost("Sac<1/CARDNAME>", c.getName(), true); - Ability_Mana mana = new Ability_Mana(c, cost, "1") { - private static final long serialVersionUID = -2478676548112738019L; - }; - mana.setDescription("Sacrifice CARDNAME: Add 1 to your mana pool."); - return mana; - } - - - /** - *

entersBattleFieldWithCounters.

- * - * @param c a {@link forge.Card} object. - * @param type a {@link forge.Counters} object. - * @param n a int. - * @return a {@link forge.Command} object. - */ - public static Command entersBattleFieldWithCounters(final Card c, final Counters type, final int n) { - Command addCounters = new Command() { - private static final long serialVersionUID = 4825430555490333062L; - - public void execute() { - c.addCounter(type, n); - } - }; - return addCounters; - } - - /** - *

fading.

- * - * @param sourceCard a {@link forge.Card} object. - * @param Power a int. - * @return a {@link forge.Command} object. - */ - public static Command fading(final Card sourceCard, final int Power) { - Command fade = new Command() { - private static final long serialVersionUID = 431920157968451817L; - public boolean firstTime = true; - - public void execute() { - - //testAndSet - only needed when enters the battlefield. - if (firstTime) { - sourceCard.addCounter(Counters.FADE, Power); - } - firstTime = false; - } - }; - return fade; - } // fading - - /** - *

vanishing.

- * - * @param sourceCard a {@link forge.Card} object. - * @param Power a int. - * @return a {@link forge.Command} object. - */ - public static Command vanishing(final Card sourceCard, final int Power) { - Command age = new Command() { - private static final long serialVersionUID = 431920157968451817L; - public boolean firstTime = true; - - public void execute() { - - //testAndSet - only needed when enters the battlefield - if (firstTime) { - sourceCard.addCounter(Counters.TIME, Power); - } - firstTime = false; - } - }; - return age; - } // vanishing - - /** - *

ability_Soulshift.

- * - * @param sourceCard a {@link forge.Card} object. - * @param Manacost a {@link java.lang.String} object. - * @return a {@link forge.Command} object. - */ - public static Command ability_Soulshift(final Card sourceCard, final String Manacost) { - final Command Soulshift = new Command() { - private static final long serialVersionUID = -4960704261761785512L; - - public void execute() { - AllZone.getStack().add(soulshiftTrigger(sourceCard, Manacost)); - } - - }; - - return Soulshift; - }//ability_Soulshift() - - /** - *

soulshiftTrigger.

- * - * @param sourceCard a {@link forge.Card} object. - * @param Manacost a {@link java.lang.String} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility soulshiftTrigger(final Card sourceCard, final String Manacost) { - final SpellAbility desc = new Ability(sourceCard, "0") { - @SuppressWarnings("unused") - private static final long serialVersionUID = -4960704261761785512L; - - @Override - public void resolve() { - CardList cards = AllZoneUtil.getPlayerGraveyard(sourceCard.getController()); - CardList sameCost = new CardList(); - int Cost = CardUtil.getConvertedManaCost(Manacost); - for (int i = 0; i < cards.size(); i++) { - if ((CardUtil.getConvertedManaCost(cards.get(i).getManaCost()) <= Cost) - && cards.get(i).isType("Spirit")) { - sameCost.add(cards.get(i)); - } - } - - if (sameCost.size() == 0) return; - - if (sourceCard.getController().isHuman()) { - StringBuilder question = new StringBuilder(); - question.append("Return target Spirit card with converted mana cost "); - question.append(Manacost).append(" or less from your graveyard to your hand?"); - - if (GameActionUtil.showYesNoDialog(sourceCard, question.toString())) { - Object o = GuiUtils.getChoiceOptional("Select a card", sameCost.toArray()); - if (o != null) { - - Card c1 = (Card) o; - AllZone.getGameAction().moveToHand(c1); - } - } - } else { - //Wiser choice should be here - Card choice = null; - sameCost.shuffle(); - choice = sameCost.getCard(0); - - if (!(choice == null)) { - AllZone.getGameAction().moveToHand(choice); - } - } - }// resolve() - };// SpellAbility desc - - // The spell description below fails to appear in the card detail panel - StringBuilder sbDesc = new StringBuilder(); - sbDesc.append("Soulshift ").append(Manacost); - sbDesc.append(" - When this permanent is put into a graveyard from play, you may return target Spirit card with converted mana cost "); - sbDesc.append(Manacost).append(" or less from your graveyard to your hand."); - desc.setDescription(sbDesc.toString()); - - StringBuilder sbStack = new StringBuilder(); - sbStack.append(sourceCard.getName()).append(" - Soulshift ").append(Manacost); - desc.setStackDescription(sbStack.toString()); - - return desc; - }//soul_desc() - - //CardList choices are the only cards the user can successful select - /** - *

input_targetSpecific.

- * - * @param spell a {@link forge.card.spellability.SpellAbility} object. - * @param choices a {@link forge.CardList} object. - * @param message a {@link java.lang.String} object. - * @param targeted a boolean. - * @param free a boolean. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input input_targetSpecific(final SpellAbility spell, final CardList choices, final String message, final boolean targeted, final boolean free) { - return input_targetSpecific(spell, choices, message, Command.Blank, targeted, free); - } - - //CardList choices are the only cards the user can successful select - /** - *

input_targetSpecific.

- * - * @param spell a {@link forge.card.spellability.SpellAbility} object. - * @param choices a {@link forge.CardList} object. - * @param message a {@link java.lang.String} object. - * @param paid a {@link forge.Command} object. - * @param targeted a boolean. - * @param free a boolean. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input input_targetSpecific(final SpellAbility spell, final CardList choices, final String message, final Command paid, final boolean targeted, final boolean free) { - Input target = new Input() { - private static final long serialVersionUID = -1779224307654698954L; - - @Override - public void showMessage() { - AllZone.getDisplay().showMessage(message); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - stop(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (targeted && !canTarget(spell, card)) { - AllZone.getDisplay().showMessage("Cannot target this card (Shroud? Protection?)."); - } else if (choices.contains(card)) { - spell.setTargetCard(card); - if (spell.getManaCost().equals("0") || free) { - this.setFree(false); - AllZone.getStack().add(spell); - stop(); - } else stopSetNext(new Input_PayManaCost(spell)); - - paid.execute(); - } - }//selectCard() - }; - return target; - }//input_targetSpecific() - - //CardList choices are the only cards the user can successful select - /** - *

input_targetChampionSac.

- * - * @param crd a {@link forge.Card} object. - * @param spell a {@link forge.card.spellability.SpellAbility} object. - * @param choices a {@link forge.CardList} object. - * @param message a {@link java.lang.String} object. - * @param targeted a boolean. - * @param free a boolean. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input input_targetChampionSac(final Card crd, final SpellAbility spell, final CardList choices, final String message, final boolean targeted, final boolean free) { - Input target = new Input() { - private static final long serialVersionUID = -3320425330743678663L; - - @Override - public void showMessage() { - AllZone.getDisplay().showMessage(message); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - AllZone.getGameAction().sacrifice(crd); - stop(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (choices.contains(card)) { - if (card == spell.getSourceCard()) { - AllZone.getGameAction().sacrifice(spell.getSourceCard()); - stop(); - } else { - spell.getSourceCard().setChampionedCard(card); - AllZone.getGameAction().exile(card); - - stop(); - - //Run triggers - HashMap runParams = new HashMap(); - runParams.put("Card", spell.getSourceCard()); - runParams.put("Championed", card); - AllZone.getTriggerHandler().runTrigger("Championed", runParams); - } - } - }//selectCard() - }; - return target; - }//input_targetSpecific() - - /** - *

input_equipCreature.

- * - * @param equip a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input input_equipCreature(final SpellAbility equip) { - Input runtime = new Input() { - private static final long serialVersionUID = 2029801495067540196L; - - @Override - public void showMessage() { - //get all creatures you control - CardList list = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer()); - - stopSetNext(input_targetSpecific(equip, list, - "Select target creature to equip", true, false)); - } - };//Input - return runtime; - } - - /** - * custom input method only for use in Recall - * - * @param numCards a int. - * @param recall a {@link forge.Card} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return input - */ - public static Input input_discardRecall(final int numCards, final Card recall, final SpellAbility sa) { - Input target = new Input() { - private static final long serialVersionUID = 1942999595292561944L; - int n = 0; - - @Override - public void showMessage() { - if (AllZone.getHumanHand().size() == 0) stop(); - - AllZone.getDisplay().showMessage("Select a card to discard"); - ButtonUtil.disableAll(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (zone.is(Constant.Zone.Hand)) { - card.getController().discard(card, sa); - n++; - - //in case no more cards in hand - if (n == numCards || AllZone.getHumanHand().size() == 0) done(); - else - showMessage(); - } - } - - void done() { - AllZone.getDisplay().showMessage("Returning cards to hand."); - AllZone.getGameAction().exile(recall); - CardList grave = AllZoneUtil.getPlayerGraveyard(AllZone.getHumanPlayer()); - for (int i = 1; i <= n; i++) { - String title = "Return card from grave to hand"; - Object o = GuiUtils.getChoice(title, grave.toArray()); - if (o == null) break; - Card toHand = (Card) o; - grave.remove(toHand); - AllZone.getGameAction().moveToHand(toHand); - } - stop(); - } - }; - return target; - }//input_discardRecall() - - /** - *

MasteroftheWildHunt_input_targetCreature.

- * - * @param spell a {@link forge.card.spellability.SpellAbility} object. - * @param choices a {@link forge.CardList} object. - * @param paid a {@link forge.Command} object. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input MasteroftheWildHunt_input_targetCreature(final SpellAbility spell, final CardList choices, final Command paid) { - Input target = new Input() { - private static final long serialVersionUID = -1779224307654698954L; - - @Override - public void showMessage() { - AllZone.getDisplay().showMessage("Select target wolf to damage for " + spell.getSourceCard()); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - stop(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (choices.size() == 0) stop(); - if (choices.contains(card)) { - spell.setTargetCard(card); - paid.execute(); - stop(); - } - }//selectCard() - }; - return target; - }//input_MasteroftheWildHunt_input_targetCreature() - - /** - *

modularInput.

- * - * @param ability a {@link forge.card.spellability.SpellAbility} object. - * @param card a {@link forge.Card} object. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input modularInput(final SpellAbility ability, final Card card) { - Input modularInput = new Input() { - - private static final long serialVersionUID = 2322926875771867901L; - - @Override - public void showMessage() { - AllZone.getDisplay().showMessage("Select target artifact creature"); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - stop(); - } - - @Override - public void selectCard(Card card2, PlayerZone zone) { - if (card2.isCreature() && card2.isArtifact() && zone.is(Constant.Zone.Battlefield) - && CardFactoryUtil.canTarget(ability, card)) { - ability.setTargetCard(card2); - ability.setStackDescription("Put " + card.getCounters(Counters.P1P1) - + " +1/+1 counter/s from " + card + " on " + card2); - AllZone.getStack().add(ability); - stop(); - } - } - }; - return modularInput; - } - - /** - *

AI_getHumanCreature.

- * - * @param spell a {@link forge.Card} object. - * @param targeted a boolean. - * @return a {@link forge.CardList} object. - */ - public static CardList AI_getHumanCreature(final Card spell, boolean targeted) { - CardList creature = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer()); - if (targeted) { - creature = creature.filter(AllZoneUtil.getCanTargetFilter(spell)); - } - return creature; - } - - /** - *

AI_getHumanCreature.

- * - * @param keyword a {@link java.lang.String} object. - * @param spell a {@link forge.Card} object. - * @param targeted a boolean. - * @return a {@link forge.CardList} object. - */ - public static CardList AI_getHumanCreature(final String keyword, final Card spell, final boolean targeted) { - CardList creature = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - creature = creature.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (targeted) - return c.isCreature() - && c.hasKeyword(keyword) - && canTarget(spell, c); - else - return c.isCreature() - && c.hasKeyword(keyword); - } - }); - return creature; - }//AI_getHumanCreature() - - /** - *

AI_getHumanCreature.

- * - * @param toughness a int. - * @param spell a {@link forge.Card} object. - * @param targeted a boolean. - * @return a {@link forge.CardList} object. - */ - public static CardList AI_getHumanCreature(final int toughness, final Card spell, final boolean targeted) { - CardList creature = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - creature = creature.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (targeted) return c.isCreature() && (c.getNetDefense() <= toughness) && canTarget(spell, c); - else return c.isCreature() && (c.getNetDefense() <= toughness); - } - }); - return creature; - }//AI_getHumanCreature() - - /** - *

AI_targetHuman.

- * - * @return a {@link forge.CommandArgs} object. - */ - public static CommandArgs AI_targetHuman() { - return new CommandArgs() { - private static final long serialVersionUID = 8406907523134006697L; - - public void execute(Object o) { - SpellAbility sa = (SpellAbility) o; - sa.setTargetPlayer(AllZone.getHumanPlayer()); - } - }; - }//targetHuman() - - /** - *

getNumberOfPermanentsByColor.

- * - * @param color a {@link java.lang.String} object. - * @return a int. - */ - public static int getNumberOfPermanentsByColor(String color) { - CardList cards = AllZoneUtil.getCardsInPlay(); - - CardList coloredPerms = new CardList(); - - for (int i = 0; i < cards.size(); i++) { - if (CardUtil.getColors(cards.get(i)).contains(color)) coloredPerms.add(cards.get(i)); - } - return coloredPerms.size(); - } - - /** - *

multipleControlled.

- * - * @param c a {@link forge.Card} object. - * @return a boolean. - */ - public static boolean multipleControlled(Card c) { - CardList list = AllZoneUtil.getPlayerCardsInPlay(c.getController()); - list.remove(c); - - return list.containsName(c.getName()); - } - - /** - *

oppHasKismet.

- * - * @param player a {@link forge.Player} object. - * @return a boolean. - */ - public static boolean oppHasKismet(Player player) { - Player opp = player.getOpponent(); - CardList list = AllZoneUtil.getPlayerCardsInPlay(opp); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getName().equals("Kismet") || c.getName().equals("Frozen AEther") - || c.getName().equals("Loxodon Gatekeeper"); - } - }); - return list.size() > 0; - } - - /** - *

getNumberOfManaSymbolsControlledByColor.

- * - * @param colorAbb a {@link java.lang.String} object. - * @param player a {@link forge.Player} object. - * @return a int. - */ - public static int getNumberOfManaSymbolsControlledByColor(String colorAbb, Player player) { - CardList cards = AllZoneUtil.getPlayerCardsInPlay(player); - return getNumberOfManaSymbolsByColor(colorAbb, cards); - } - - /** - *

getNumberOfManaSymbolsByColor.

- * - * @param colorAbb a {@link java.lang.String} object. - * @param cards a {@link forge.CardList} object. - * @return a int. - */ - public static int getNumberOfManaSymbolsByColor(String colorAbb, CardList cards) { - int count = 0; - for (int i = 0; i < cards.size(); i++) { - Card c = cards.get(i); - if (!c.isToken()) { - String manaCost = c.getManaCost(); - manaCost = manaCost.trim(); - count += countOccurrences(manaCost, colorAbb); - } - } - return count; - } - - /** - *

multiplyManaCost.

- * - * @param manacost a {@link java.lang.String} object. - * @param multiplier a int. - * @return a {@link java.lang.String} object. - */ - public static String multiplyManaCost(String manacost, int multiplier) { - if (multiplier == 0) return ""; - if (multiplier == 1) return manacost; - - String tokenized[] = manacost.split("\\s"); - StringBuilder sb = new StringBuilder(); - - if (Character.isDigit(tokenized[0].charAt(0))) //manacost starts with "colorless" number cost - { - int cost = Integer.parseInt(tokenized[0]); - cost = multiplier * cost; - tokenized[0] = "" + cost; - sb.append(tokenized[0]); - } else { - for (int i = 0; i < multiplier; i++) { - //tokenized[0] = tokenized[0] + " " + tokenized[0]; - sb.append((" ")); - sb.append(tokenized[0]); - } - } - - for (int i = 1; i < tokenized.length; i++) { - for (int j = 0; j < multiplier; j++) { - //tokenized[i] = tokenized[i] + " " + tokenized[i]; - sb.append((" ")); - sb.append(tokenized[i]); - - } - } - - String result = sb.toString(); - System.out.println("result: " + result); - result = result.trim(); - return result; - } - - /** - *

isTargetStillValid.

- * - * @param ability a {@link forge.card.spellability.SpellAbility} object. - * @param target a {@link forge.Card} object. - * @return a boolean. - */ - public static boolean isTargetStillValid(SpellAbility ability, Card target) { - - if (AllZone.getZone(target) == null) return false; // for tokens that disappeared - - Card source = ability.getSourceCard(); - Target tgt = ability.getTarget(); - if (tgt != null) { - // Reconfirm the Validity of a TgtValid, or if the Creature is still a Creature - if (tgt.doesTarget() && !target.isValidCard(tgt.getValidTgts(), ability.getActivatingPlayer(), ability.getSourceCard())) - return false; - - // Check if the target is in the zone it needs to be in to be targeted - if (!AllZone.getZone(target).is(tgt.getZone())) - return false; - } else { - // If an Aura's target is removed before it resolves, the Aura fizzles - if (source.isAura() && !AllZone.getZone(target).is(Constant.Zone.Battlefield)) - return false; - } - - // Make sure it's still targetable as well - return canTarget(source, target); - } - - /** - *

canTarget.

- * - * @param ability a {@link forge.card.spellability.SpellAbility} object. - * @param target a {@link forge.Card} object. - * @return a boolean. - */ - public static boolean canTarget(SpellAbility ability, Card target) { - return canTarget(ability.getSourceCard(), target); - } - - /** - *

isColored.

- * - * @param c a {@link forge.Card} object. - * @return a boolean. - */ - public static boolean isColored(Card c) { - return c.isWhite() || c.isBlue() || c.isBlack() || c.isRed() || c.isGreen(); - } - - /** - *

canTarget.

- * - * @param spell a {@link forge.Card} object. - * @param target a {@link forge.Card} object. - * @return a boolean. - */ - public static boolean canTarget(Card spell, Card target) { - if (target == null) return true; - //System.out.println("Target:" + target); - - if (target.isImmutable()) - return false; - - PlayerZone zone = AllZone.getZone(target); - // if zone is null, it means its on the stack - if (zone == null || !zone.is(Constant.Zone.Battlefield)) { - // targets not in play, can normally be targeted - return true; - } - - if (AllZoneUtil.isCardInPlay("Spellbane Centaur", target.getController()) && target.isCreature() - && spell.isBlue()) return false; - - if (target.getName().equals("Gaea's Revenge") && !spell.isGreen()) return false; - - if (hasProtectionFrom(spell, target)) return false; - - if (target.getKeyword() != null) { - ArrayList list = target.getKeyword(); - - String kw = ""; - for (int i = 0; i < list.size(); i++) { - kw = list.get(i); - if (kw.equals("Shroud")) return false; - - if (kw.equals("Hexproof")) { - if (!spell.getController().equals(target.getController())) return false; - } - - if (kw.equals("CARDNAME can't be the target of Aura spells.")) { - if (spell.isAura() && spell.isSpell()) return false; - } - - if (kw.equals("CARDNAME can't be the target of red spells or abilities from red sources.")) { - if (spell.isRed()) return false; - } - - if (kw.equals("CARDNAME can't be the target of black spells.")) { - if (spell.isBlack() && spell.isSpell()) return false; - } - - if (kw.equals("CARDNAME can't be the target of blue spells.")) { - if (spell.isBlue() && spell.isSpell()) return false; - } - - if (kw.equals("CARDNAME can't be the target of spells.")) { - if (spell.isSpell()) return false; - } - } - } - return true; - } - - //does "target" have protection from "card"? - /** - *

hasProtectionFrom.

- * - * @param card a {@link forge.Card} object. - * @param target a {@link forge.Card} object. - * @return a boolean. - */ - public static boolean hasProtectionFrom(Card card, Card target) { - if (target == null) return false; - - if (target.isImmutable()) - return true; - - if (target.getKeyword() != null) { - ArrayList list = target.getKeyword(); - - String kw = ""; - for (int i = 0; i < list.size(); i++) { - kw = list.get(i); - - if (kw.equals("Protection from white") - && card.isWhite() - && !card.getName().contains("White Ward")) return true; - if (kw.equals("Protection from blue") - && card.isBlue() - && !card.getName().contains("Blue Ward")) return true; - if (kw.equals("Protection from black") - && card.isBlack() - && !card.getName().contains("Black Ward")) return true; - if (kw.equals("Protection from red") - && card.isRed() - && !card.getName().contains("Red Ward")) return true; - if (kw.equals("Protection from green") - && card.isGreen() - && !card.getName().contains("Green Ward")) return true; - - if (kw.equals("Protection from creatures") - && card.isCreature()) return true; - - if (kw.equals("Protection from artifacts") - && card.isArtifact()) return true; - - if (kw.equals("Protection from enchantments") - && card.isEnchantment() - && !card.getName().contains("Tattoo Ward")) return true; - - if (kw.equals("Protection from everything")) return true; - - if (kw.equals("Protection from colored spells") - && (card.isInstant() || card.isSorcery() || card.isAura()) - && isColored(card)) return true; - - if (kw.equals("Protection from Dragons") - && card.isType("Dragon")) return true; - if (kw.equals("Protection from Demons") - && card.isType("Demon")) return true; - if (kw.equals("Protection from Goblins") - && card.isType("Goblin")) return true; - if (kw.equals("Protection from Clerics") - && card.isType("Cleric")) return true; - if (kw.equals("Protection from Gorgons") - && card.isType("Gorgon")) return true; - - if (kw.startsWith("Protection:")) { //uses isValidCard - String characteristic = kw.split(":")[1]; - String characteristics[] = characteristic.split(","); - if (card.isValidCard(characteristics, card.getController(), card)) return true; - } - - } - } - return false; - } - - /** - *

isCounterable.

- * - * @param c a {@link forge.Card} object. - * @return a boolean. - */ - public static boolean isCounterable(Card c) { - if (!c.hasKeyword("CARDNAME can't be countered.")) return true; - else return false; - } - - - //returns the number of equipments named "e" card c is equipped by - /** - *

hasNumberEquipments.

- * - * @param c a {@link forge.Card} object. - * @param e a {@link java.lang.String} object. - * @return a int. - */ - public static int hasNumberEquipments(Card c, String e) { - if (!c.isEquipped()) return 0; - - final String equipmentName = e; - CardList list = new CardList(c.getEquippedBy().toArray()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getName().equals(equipmentName); - } - - }); - - return list.size(); - - } - - /** - *

getGraveyardActivationCards.

- * - * @param player a {@link forge.Player} object. - * @return a {@link forge.CardList} object. - */ - public static CardList getExternalZoneActivationCards(final Player player) { - - StringBuilder sb = new StringBuilder(); - sb.append(Constant.Zone.Graveyard).append(","); - sb.append(Constant.Zone.Exile).append(","); - sb.append(Constant.Zone.Command).append(","); - sb.append(Constant.Zone.Stack).append(","); - CardList cl = AllZoneUtil.getCardsInZone(sb.toString(), player); - cl = cl.filter(new CardListFilter() { - public boolean addCard(Card c) { - return activateFromExternalZones(c, player); - } - }); - return cl; - } - - /** - *

activateFromGrave.

- * - * @param c a {@link forge.Card} object. - * @param player a {@link forge.Player} object. - * @return a boolean. - */ - public static boolean activateFromExternalZones(Card c, Player player) { - PlayerZone zone = AllZone.getZone(c); - if (zone.is(Constant.Zone.Graveyard)){ - if (c.hasFlashback() || c.hasUnearth()) - return true; - - } - - if (c.isLand() && !zone.is(Constant.Zone.Battlefield) && c.hasKeyword("May be played")) - return true; - - for (SpellAbility sa : c.getSpellAbility()) { - if (AllZone.getZone(c).is(sa.getRestrictions().getZone())) - return true; - - // TODO: Yawgmoth's Will check here, lots of testing before adding this though - //if (!zone.is(Constant.Zone.Battlefield) && c.hasKeyword("May be played") && sa.isSpell()) - // return true; - } - - return false; - } - - /** - *

countOccurrences.

- * - * @param arg1 a {@link java.lang.String} object. - * @param arg2 a {@link java.lang.String} object. - * @return a int. - */ - public static int countOccurrences(String arg1, String arg2) { - - int count = 0; - int index = 0; - while ((index = arg1.indexOf(arg2, index)) != -1) { - ++index; - ++count; - } - return count; - } - - /** - *

parseMath.

- * - * @param l an array of {@link java.lang.String} objects. - * @return an array of {@link java.lang.String} objects. - */ - public static String[] parseMath(String[] l) { - String[] m = {"none"}; - if (l.length > 1) m[0] = l[1]; - - return m; - } - - - //parser for player targeted X variables - /** - *

playerXCount.

- * - * @param players a {@link java.util.ArrayList} object. - * @param s a {@link java.lang.String} object. - * @param source a {@link forge.Card} object. - * @return a int. - */ - public static int playerXCount(ArrayList players, String s, Card source) { - if (players.size() == 0) return 0; - - final String[] l = s.split("/"); - final String[] m = parseMath(l); - - int n = 0; - - // count valid cards on the battlefield - if (l[0].contains("Valid")) { - String restrictions = l[0].replace("Valid ", ""); - final String rest[] = restrictions.split(","); - CardList cardsonbattlefield = AllZoneUtil.getCardsInPlay(); - cardsonbattlefield = cardsonbattlefield.getValidCards(rest, players.get(0), source); - - n = cardsonbattlefield.size(); - - return doXMath(n, m, source); - } - - - final String[] sq; - sq = l[0].split("\\."); - - if (sq[0].contains("CardsInHand")) { - if (players.size() > 0) { - return doXMath(AllZoneUtil.getPlayerHand(players.get(0)).size(), m, source); - } - } - - if (sq[0].contains("CardsInLibrary")) { - if (players.size() > 0) { - return doXMath(AllZoneUtil.getPlayerCardsInLibrary(players.get(0)).size(), m, source); - } - } - - if (sq[0].contains("CardsInGraveyard")) { - if (players.size() > 0) { - return doXMath(AllZoneUtil.getPlayerGraveyard(players.get(0)).size(), m, source); - } - } - if (sq[0].contains("LandsInGraveyard")) - if (players.size() > 0) { - return doXMath(AllZoneUtil.getPlayerTypeInGraveyard(players.get(0), "Land").size(), m, source); - } - - if (sq[0].contains("CreaturesInPlay")) { - if (players.size() > 0) { - return doXMath(AllZoneUtil.getCreaturesInPlay(players.get(0)).size(), m, source); - } - } - - if (sq[0].contains("CardsInPlay")) { - if (players.size() > 0) { - return doXMath(AllZoneUtil.getPlayerCardsInPlay(players.get(0)).size(), m, source); - } - } - - if (sq[0].contains("LifeTotal")) { - if (players.size() > 0) { - return doXMath(players.get(0).getLife(), m, source); - } - } - - if (sq[0].contains("TopOfLibraryCMC")) { - if (players.size() > 0) { - return doXMath(AllZoneUtil.getPlayerCardsInLibrary(players.get(0), 1).getTotalConvertedManaCost(), m, source); - } - } - - return doXMath(n, m, source); - } - - public static int parseSVar(Card hostCard, String amount){ - int num = 0; - if (amount == null) - return num; - - try{ - num = Integer.valueOf(amount); - } - catch(NumberFormatException e){ - num = xCount(hostCard, hostCard.getSVar(amount).split("\\$")[1]); - } - - return num; - } - - //parser for non-mana X variables - /** - *

xCount.

- * - * @param c a {@link forge.Card} object. - * @param s a {@link java.lang.String} object. - * @return a int. - */ - public static int xCount(Card c, String s) { - int n = 0; - - Player cardController = c.getController(); - Player oppController = cardController.getOpponent(); - - final String[] l = s.split("/"); - final String[] m = parseMath(l); - - //accept straight numbers - if (l[0].contains("Number$")) { - String number = l[0].replace("Number$", ""); - return doXMath(Integer.parseInt(number), m, c); - } - - //Manapool - if (l[0].contains("ManaPool")) { - String color = l[0].split(":")[1]; - return AllZone.getManaPool().getAmountOfColor(color); - } - - // count valid cards on the battlefield - if (l[0].contains("Valid")) { - String restrictions = l[0].replace("Valid ", ""); - restrictions = restrictions.replace("Count$", ""); - final String rest[] = restrictions.split(","); - CardList cardsonbattlefield = AllZoneUtil.getCardsInPlay(); - cardsonbattlefield = cardsonbattlefield.getValidCards(rest, cardController, c); - - n = cardsonbattlefield.size(); - - return doXMath(n, m, c); - } - - if (l[0].contains("ImprintedCardPower")) { - if (c.getImprinted().size() > 0) { - return c.getImprinted().get(0).getNetAttack(); - } - } - if (l[0].contains("ImprintedCardToughness")) { - if (c.getImprinted().size() > 0) { - return c.getImprinted().get(0).getNetDefense(); - } - } - - if(l[0].contains("GreatestPowerYouControl")) { - CardList list = AllZoneUtil.getCreaturesInPlay(c.getController()); - int highest = 0; - for (Card crd : list) { - if (crd.getNetAttack() > highest) highest = crd.getNetAttack(); - } - return highest; - } - - final String[] sq; - sq = l[0].split("\\."); - - if (sq[0].contains("xPaid")) { - return c.getXManaCostPaid(); - } - - if (sq[0].contains("xLifePaid")) { - if (c.getController().isHuman()) { - return c.getXLifePaid(); - } else { - //copied for xPaid - //not implemented for Compy - //int dam = ComputerUtil.getAvailableMana().size()- CardUtil.getConvertedManaCost(c); - //if (dam < 0) dam = 0; - //return dam; - return 0; - } - } - - CardList someCards = new CardList(); - - //Complex counting methods - - //TriggeringObjects - if (sq[0].startsWith("Triggered")) { - return doXMath((Integer) c.getTriggeringObject(sq[0].substring(9)), m, c); - } - - // Count$Domain - if (sq[0].contains("Domain")) { - someCards.addAll(AllZoneUtil.getPlayerCardsInPlay(cardController)); - String basic[] = {"Forest", "Plains", "Mountain", "Island", "Swamp"}; - - for (int i = 0; i < basic.length; i++) - if (!someCards.getType(basic[i]).isEmpty()) n++; - - return doXMath(n, m, c); - } - - // Count$YourLifeTotal - if (sq[0].contains("YourLifeTotal")) { - if (cardController.isComputer()) return doXMath(AllZone.getComputerPlayer().getLife(), m, c); - else if (cardController.isHuman()) return doXMath(AllZone.getHumanPlayer().getLife(), m, c); - - return 0; - } - - // Count$OppLifeTotal - if (sq[0].contains("OppLifeTotal")) { - if (oppController.isComputer()) return doXMath(AllZone.getComputerPlayer().getLife(), m, c); - else if (oppController.isHuman()) return doXMath(AllZone.getHumanPlayer().getLife(), m, c); - - return 0; - } - - // Count$YourPoisonCounters - if (sq[0].contains("YourPoisonCounters")) { - if (cardController.isComputer()) return doXMath(AllZone.getComputerPlayer().getPoisonCounters(), m, c); - else if (cardController.isHuman()) return doXMath(AllZone.getHumanPlayer().getPoisonCounters(), m, c); - - return 0; - } - - // Count$OppPoisonCounters - if (sq[0].contains("OppPoisonCounters")) { - if (oppController.isComputer()) return doXMath(AllZone.getComputerPlayer().getPoisonCounters(), m, c); - else if (oppController.isHuman()) return doXMath(AllZone.getHumanPlayer().getPoisonCounters(), m, c); - - return 0; - } - - // Count$HighestLifeTotal - if (sq[0].contains("HighestLifeTotal")) { - return Math.max(AllZone.getHumanPlayer().getLife(), AllZone.getComputerPlayer().getLife()); - } - - // Count$LowestLifeTotal - if (sq[0].contains("LowestLifeTotal")) { - return Math.min(AllZone.getHumanPlayer().getLife(), AllZone.getComputerPlayer().getLife()); - } - - // Count$TopOfLibraryCMC - if (sq[0].contains("TopOfLibraryCMC")) { - CardList topcard = AllZoneUtil.getPlayerCardsInLibrary(cardController, 1); - return doXMath(topcard.getTotalConvertedManaCost(), m, c); - } - - // Count$EnchantedControllerCreatures - if (sq[0].contains("EnchantedControllerCreatures")) { - CardList EnchantedControllerInPlay = AllZoneUtil.getPlayerCardsInPlay(c.getEnchantingCard().getController()); - EnchantedControllerInPlay = EnchantedControllerInPlay.getType("Creature"); - return EnchantedControllerInPlay.size(); - } - - // Count$LowestLibrary - if (sq[0].contains("LowestLibrary")) { - return Math.min(AllZone.getHumanLibrary().size(),AllZone.getComputerLibrary().size()); - } - - // Count$Chroma. - if (sq[0].contains("Chroma")) return doXMath( - getNumberOfManaSymbolsControlledByColor(sq[1], cardController), m, c); - - // Count$Hellbent.. - if (sq[0].contains("Hellbent")) { - if (cardController.hasHellbent()) - return doXMath(Integer.parseInt(sq[1]), m, c); // Hellbent - else - return doXMath(Integer.parseInt(sq[2]), m, c); // not Hellbent - } - - //Count$Metalcraft.. - if (sq[0].contains("Metalcraft")) { - if (cardController.hasMetalcraft()) - return doXMath(Integer.parseInt(sq[1]), m, c); - else - return doXMath(Integer.parseInt(sq[2]), m, c); - } - - if (sq[0].contains("Threshold")) { - if (cardController.hasThreshold()) - return doXMath(Integer.parseInt(sq[1]), m, c); // Have Threshold - else - return doXMath(Integer.parseInt(sq[2]), m, c); // not Threshold - } - - if (sq[0].contains("Landfall")) { - if (cardController.hasLandfall()) - return doXMath(Integer.parseInt(sq[1]), m, c); // Have Landfall - else - return doXMath(Integer.parseInt(sq[2]), m, c); // not Landfall - } - - if (sq[0].contains("GraveyardWithGE20Cards")) { - if (Math.max(AllZone.getHumanGraveyard().size(),AllZone.getComputerGraveyard().size()) >= 20) - return doXMath(Integer.parseInt(sq[1]), m, c); - else - return doXMath(Integer.parseInt(sq[2]), m, c); - } - - if (sq[0].startsWith("Devoured")) { - final String validDevoured = l[0].split(" ")[1]; - final Card csource = c; - CardList cl = c.getDevoured(); - - cl = cl.filter(new CardListFilter() { - public boolean addCard(Card cdev) - { - return cdev.isValidCard(validDevoured.split(","),csource.getController(),csource); - } - }); - - return doXMath(cl.size(),m,c); - } - - // Count$CardPower - if (sq[0].contains("CardPower")) return doXMath(c.getNetAttack(), m, c); - // Count$CardToughness - if (sq[0].contains("CardToughness")) return doXMath(c.getNetDefense(), m, c); - // Count$CardPowerPlusToughness - if (sq[0].contains("CardSumPT")) return doXMath((c.getNetAttack() + c.getNetDefense()), m, c); - // Count$CardManaCost - if (sq[0].contains("CardManaCost")) return doXMath(CardUtil.getConvertedManaCost(c), m, c); - // Count$CardCounters. - if (sq[0].contains("CardCounters")) - return doXMath(c.getCounters(Counters.getType(sq[1])), m, c); - // Count$TimesKicked - if (sq[0].contains("TimesKicked")) - return doXMath(c.getMultiKickerMagnitude(), m, c); - if (sq[0].contains("NumCounters")) { - int num = c.getCounters(Counters.getType(sq[1])); - return doXMath(num, m, c); - } - if (sq[0].contains("NumBlockingMe")) - return doXMath(AllZone.getCombat().getBlockers(c).size(), m, c); - - //Count$IfMainPhase.. // 7/10 - if (sq[0].contains("IfMainPhase")) { - String cPhase = AllZone.getPhase().getPhase(); - if ((cPhase.equals(Constant.Phase.Main1) || - cPhase.equals(Constant.Phase.Main2)) && - AllZone.getPhase().getPlayerTurn().equals(cardController)) - return doXMath(Integer.parseInt(sq[1]), m, c); - else - return doXMath(Integer.parseInt(sq[2]), m, c); // not Main Phase - } - - //Count$ThisTurnEntered - //or - //Count$ThisTurnEntered - if (sq[0].startsWith("ThisTurnEntered")) { - String[] workingCopy = l[0].split(" "); - String destination, origin, validFilter; - - destination = workingCopy[1]; - if (workingCopy[2].equals("from")) { - origin = workingCopy[3]; - validFilter = workingCopy[4]; - } else { - origin = "Any"; - validFilter = workingCopy[2]; - } - - final String[] valid = validFilter.split(","); - final Card csource = c; - CardList res = ((DefaultPlayerZone) AllZone.getZone(destination, AllZone.getHumanPlayer())).getCardsAddedThisTurn(origin); - res.addAll(((DefaultPlayerZone) AllZone.getZone(destination, AllZone.getComputerPlayer())).getCardsAddedThisTurn(origin)); - - res = res.filter(new CardListFilter() { - public boolean addCard(Card csubject) { - return csubject.isValidCard(valid, csource.getController(), csource); - } - }); - - - return doXMath(res.size(), m, c); - } - - //Generic Zone-based counting - // Count$QualityAndZones.Subquality - - // build a list of cards in each possible specified zone - - // if a card was ever written to count two different zones, - // make sure they don't get added twice. - boolean MF = false, MY = false, MH = false; - boolean OF = false, OY = false, OH = false; - - if (sq[0].contains("YouCtrl")) if (MF == false) { - someCards.addAll(AllZoneUtil.getPlayerCardsInPlay(cardController)); - MF = true; - } - - if (sq[0].contains("InYourYard")) if (MY == false) { - someCards.addAll(AllZoneUtil.getPlayerGraveyard(cardController)); - MY = true; - } - - if (sq[0].contains("InYourLibrary")) if (MY == false) { - someCards.addAll(AllZoneUtil.getPlayerCardsInLibrary(cardController)); - MY = true; - } - - if (sq[0].contains("InYourHand")) if (MH == false) { - someCards.addAll(AllZoneUtil.getPlayerHand(cardController)); - MH = true; - } - - if (sq[0].contains("OppCtrl")) if (OF == false) { - someCards.addAll(AllZoneUtil.getPlayerCardsInPlay(oppController)); - OF = true; - } - - if (sq[0].contains("InOppYard")) if (OY == false) { - someCards.addAll(AllZoneUtil.getPlayerGraveyard(oppController)); - OY = true; - } - - if (sq[0].contains("InOppHand")) if (OH == false) { - someCards.addAll(AllZoneUtil.getPlayerHand(oppController)); - OH = true; - } - - if (sq[0].contains("OnBattlefield")) { - if (MF == false) someCards.addAll(AllZoneUtil.getPlayerCardsInPlay(cardController)); - if (OF == false) someCards.addAll(AllZoneUtil.getPlayerCardsInPlay(oppController)); - } - - if (sq[0].contains("InAllYards")) { - if (MY == false) someCards.addAll(AllZoneUtil.getPlayerGraveyard(cardController)); - if (OY == false) someCards.addAll(AllZoneUtil.getPlayerGraveyard(oppController)); - } - - if (sq[0].contains("InAllHands")) { - if (MH == false) someCards.addAll(AllZoneUtil.getPlayerHand(cardController)); - if (OH == false) someCards.addAll(AllZoneUtil.getPlayerHand(oppController)); - } - - // filter lists based on the specified quality - - - // "Clerics you control" - Count$TypeYouCtrl.Cleric - if (sq[0].contains("Type")) { - someCards = someCards.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (c.isType(sq[1])) return true; - - return false; - } - }); - } - - // "Named in all graveyards" - Count$NamedAllYards. - - if (sq[0].contains("Named")) { - if (sq[1].equals("CARDNAME")) - sq[1] = c.getName(); - - someCards = someCards.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (c.getName().equals(sq[1])) return true; - - return false; - } - }); - } - - // Refined qualities - - // "Untapped Lands" - Count$UntappedTypeYouCtrl.Land - if (sq[0].contains("Untapped")) { - someCards = someCards.filter(new CardListFilter() { - public boolean addCard(Card c) { - return !c.isTapped(); - } - }); - } - - if (sq[0].contains("Tapped")) { - someCards = someCards.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isTapped(); - } - }); - } - - // "White Creatures" - Count$WhiteTypeYouCtrl.Creature - if (sq[0].contains("White")) { - someCards = someCards.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CardUtil.isColor(c, Constant.Color.White); - } - }); - } - - if (sq[0].contains("Blue")) { - someCards = someCards.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CardUtil.isColor(c, Constant.Color.Blue); - } - }); - } - - if (sq[0].contains("Black")) { - someCards = someCards.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CardUtil.isColor(c, Constant.Color.Black); - } - }); - } - - if (sq[0].contains("Red")) { - someCards = someCards.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CardUtil.isColor(c, Constant.Color.Red); - } - }); - } - - if (sq[0].contains("Green")) { - someCards = someCards.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CardUtil.isColor(c, Constant.Color.Green); - } - }); - } - - if (sq[0].contains("Multicolor")) someCards = someCards.filter(new CardListFilter() { - public boolean addCard(Card c) { - return (CardUtil.getColors(c).size() > 1); - } - }); - - if (sq[0].contains("Monocolor")) someCards = someCards.filter(new CardListFilter() { - public boolean addCard(Card c) { - return (CardUtil.getColors(c).size() == 1); - } - }); - - //Count$CardMulticolor.. - if (sq[0].contains("CardMulticolor")) { - if (CardUtil.getColors(c).size() > 1) - return doXMath(Integer.parseInt(sq[1]), m, c); - else - return doXMath(Integer.parseInt(sq[2]), m, c); - } - - // 1/10 - Count$MaxCMCYouCtrl - if (sq[0].contains("MaxCMC")) { - int mmc = 0; - int cmc = 0; - for (int i = 0; i < someCards.size(); i++) { - cmc = CardUtil.getConvertedManaCost(someCards.getCard(i).getManaCost()); - if (cmc > mmc) mmc = cmc; - } - - return doXMath(mmc, m, c); - } - - n = someCards.size(); - - return doXMath(n, m, c); - } - - private static int doXMath(int num, String m, Card c) { - if (m.equals("none")) return num; - - String[] s = m.split("\\."); - int secondaryNum = 0; - - try { - if (s.length == 2) { - secondaryNum = Integer.parseInt(s[1]); - } - } catch (Exception e) { - secondaryNum = xCount(c, c.getSVar(s[1])); - } - - if (s[0].contains("Plus")) return num + secondaryNum; - else if (s[0].contains("NMinus")) return secondaryNum - num; - else if (s[0].contains("Minus")) return num - secondaryNum; - else if (s[0].contains("Twice")) return num * 2; - else if (s[0].contains("HalfUp")) return (int) (Math.ceil(num / 2.0)); - else if (s[0].contains("HalfDown")) return (int) (Math.floor(num / 2.0)); - else if (s[0].contains("ThirdUp")) return (int) (Math.ceil(num / 3.0)); - else if (s[0].contains("ThirdDown")) return (int) (Math.floor(num / 3.0)); - else if (s[0].contains("Negative")) return num * -1; - else if (s[0].contains("Times")) return num * secondaryNum; - else return num; - } - - /** - *

doXMath.

- * - * @param num a int. - * @param m an array of {@link java.lang.String} objects. - * @param c a {@link forge.Card} object. - * @return a int. - */ - public static int doXMath(int num, String[] m, Card c) { - if (m.length == 0) - return num; - - return doXMath(num, m[0], c); - } - - /** - *

handlePaid.

- * - * @param paidList a {@link forge.CardList} object. - * @param string a {@link java.lang.String} object. - * @param source a {@link forge.Card} object. - * @return a int. - */ - public static int handlePaid(CardList paidList, String string, Card source) { - if (paidList == null || paidList.size() == 0) - return 0; - - if (string.startsWith("Amount")) { - if (string.contains(".")) { - String[] splitString = string.split("\\.", 2); - return doXMath(paidList.size(), splitString[1], source); - } else - return paidList.size(); - - } - if (string.contains("Valid")) { - final String m[] = {"none"}; - - String valid = string.replace("Valid ", ""); - final String[] l; - l = valid.split("/"); // separate the specification from any math - valid = l[0]; - if (l.length > 1) m[0] = l[1]; - CardList list = paidList.getValidCards(valid, source.getController(), source); - return doXMath(list.size(), m, source); - } - - int tot = 0; - for (Card c : paidList) - tot += xCount(c, string); - - return tot; - } - - - /** - *

getNumberOfMostProminentCreatureType.

- * - * @param list a {@link forge.CardList} object. - * @param type a {@link java.lang.String} object. - * @return a int. - */ - public static int getNumberOfMostProminentCreatureType(CardList list, String type) { - list = list.getType(type); - return list.size(); - } - - /** - *

input_UntapUpToNType.

- * - * @param n a int. - * @param type a {@link java.lang.String} object. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input input_UntapUpToNType(final int n, final String type) { - Input untap = new Input() { - private static final long serialVersionUID = -2167059918040912025L; - - int stop = n; - int count = 0; - - @Override - public void showMessage() { - AllZone.getDisplay().showMessage("Select a " + type + " to untap"); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - stop(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (card.isType(type) && zone.is(Constant.Zone.Battlefield)) { - card.untap(); - count++; - if (count == stop) stop(); - } - }//selectCard() - }; - - return untap; - } - - /** - *

getMostProminentCreatureType.

- * - * @param list a {@link forge.CardList} object. - * @return a {@link java.lang.String} object. - */ - public static String getMostProminentCreatureType(CardList list) { - - if (list.size() == 0) return ""; - - Map map = new HashMap(); - - for (Card c : list) { - ArrayList typeList = c.getType(); - - for (String var : typeList) { - if (CardUtil.isACreatureType(var)) { - if (!map.containsKey(var)) map.put(var, 1); - else map.put(var, map.get(var) + 1); - } - } - }//for - - int max = 0; - String maxType = ""; - - for (Entry entry : map.entrySet()) { - String type = entry.getKey(); - //Log.debug(type + " - " + entry.getValue()); - - if (max < entry.getValue()) { - max = entry.getValue(); - maxType = type; - } - } - - return maxType; - } - - /** - *

getMostProminentColor.

- * - * @param list a {@link forge.CardList} object. - * @return a {@link java.lang.String} object. - */ - public static String getMostProminentColor(CardList list) { - - Map map = new HashMap(); - - for (Card c : list) { - ArrayList colorList = CardUtil.getColors(c); - - for (String color : colorList) { - if (color.equals("colorless")) ; - else if (!map.containsKey(color)) map.put(color, 1); - else { - map.put(color, map.get(color) + 1); - } - } - }//for - - int max = 0; - String maxColor = ""; - - for (Entry entry : map.entrySet()) { - String color = entry.getKey(); - Log.debug(color + " - " + entry.getValue()); - - if (max < entry.getValue()) { - max = entry.getValue(); - maxColor = color; - } - } - - return maxColor; - } - - - /** - *

chooseCreatureTypeAI.

- * - * @param c a {@link forge.Card} object. - * @return a {@link java.lang.String} object. - */ - /*public static String chooseCreatureTypeAI(Card c) { - String s = ""; - //TODO, take into account what human has - - CardList humanPlay = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - CardList humanLib = AllZoneUtil.getPlayerCardsInLibrary(AllZone.getHumanPlayer()); - - CardList compPlay = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - CardList compHand = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); - CardList compLib = AllZoneUtil.getPlayerCardsInLibrary(AllZone.getComputerPlayer()); - CardList compAll = new CardList(); - compAll.addAll(compLib); - compAll.addAll(compHand); - compAll.addAll(compPlay); - - humanPlay = humanPlay.getType("Creature"); - humanLib = humanLib.getType("Creature"); - - compPlay = compPlay.getType("Creature"); - compHand = compHand.getType("Creature"); - compAll = compAll.getType("Creature"); - - //Buffs - if (c.getName().equals("Conspiracy")) { - - String type = ""; - int number = 0; - - type = getMostProminentCreatureType(compAll); - number = getNumberOfMostProminentCreatureType(compAll, type); - if (number >= 5) s = type; - - if ((c.getName().equals("Conspiracy")) && compAll.size() > 1) { - CardList turnTimber = compAll; - turnTimber = turnTimber.getName("Turntimber Ranger"); - if (c.getName().equals("Conspiracy") && turnTimber.size() > 0) s = "Ally"; - } - - } - return s; - }*/ - - /** - *

countBasicLandTypes.

- * - * @param player a {@link forge.Player} object. - * @return a int. - */ - public static int countBasicLandTypes(Player player) { - String basic[] = {"Forest", "Plains", "Mountain", "Island", "Swamp"}; - CardList list = AllZoneUtil.getPlayerCardsInPlay(player); - int count = 0; - - for (int i = 0; i < basic.length; i++) - if (!list.getType(basic[i]).isEmpty()) count++; - - return count; - } - - //total cost to pay for an attacker c, cards like Propaganda, Ghostly Prison, Collective Restraint, ... - /** - *

getPropagandaCost.

- * - * @param c a {@link forge.Card} object. - * @return a {@link java.lang.String} object. - */ - public static String getPropagandaCost(Card c) { - int cost = 0; - - CardList list = AllZoneUtil.getCardsInPlay(); - for (Card card : list) { - if (card.hasStartOfKeyword("Creatures can't attack unless their controller pays")) { - int KeywordPosition = card.getKeywordPosition("Creatures can't attack unless their controller pays"); - String parse = card.getKeyword().get(KeywordPosition).toString(); - String k[] = parse.split(":"); - - String restrictions[] = k[1].split(","); - if (!c.isValidCard(restrictions, card.getController(), card)) - continue; - - String costString = k[2]; - if (costString.equals("X")) - cost += CardFactoryUtil.xCount(card, card.getSVar("X")); - else if (costString.equals("Y")) - cost += CardFactoryUtil.xCount(card, card.getSVar("Y")); - else - cost += Integer.parseInt(k[2]); - } - } - - String s = Integer.toString(cost); - - return s; - } - - /** - *

getUsableManaSources.

- * - * @param player a {@link forge.Player} object. - * @return a int. - */ - public static int getUsableManaSources(Player player) { - CardList list = AllZoneUtil.getPlayerCardsInPlay(player); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - for (Ability_Mana am : c.getAIPlayableMana()) - if (am.canPlay()) return true; - return false; - } - }); - - return list.size(); - } - - /** - *

getTopCard.

- * - * @param c a {@link forge.Card} object. - * @return a {@link forge.Card} object. - */ - public static Card getTopCard(Card c) { - PlayerZone lib = AllZone.getZone(Constant.Zone.Library, c.getController()); - if (lib.size() > 0) - return lib.get(0); - else - return null; - } - - /** - *

makeTokenSaproling.

- * - * @param controller a {@link forge.Player} object. - * @return a {@link forge.CardList} object. - */ - public static CardList makeTokenSaproling(Player controller) { - return makeToken("Saproling", "G 1 1 Saproling", controller, "G", new String[]{"Creature", "Saproling"}, 1, 1, new String[]{""}); - } - - /** - *

makeToken.

- * - * @param name a {@link java.lang.String} object. - * @param imageName a {@link java.lang.String} object. - * @param controller a {@link forge.Player} object. - * @param manaCost a {@link java.lang.String} object. - * @param types an array of {@link java.lang.String} objects. - * @param baseAttack a int. - * @param baseDefense a int. - * @param intrinsicKeywords an array of {@link java.lang.String} objects. - * @return a {@link forge.CardList} object. - */ - public static CardList makeToken(String name, String imageName, Player controller, String manaCost, String[] types, int baseAttack, int baseDefense, String[] intrinsicKeywords) { - CardList list = new CardList(); - Card c = new Card(); - c.setName(name); - c.setImageName(imageName); - - //c.setController(controller); - //c.setOwner(controller); - - // TODO: most tokens mana cost is 0, this needs to be fixed - //c.setManaCost(manaCost); - c.addColor(manaCost); - c.setToken(true); - - for (String t : types) - c.addType(t); - - c.setBaseAttack(baseAttack); - c.setBaseDefense(baseDefense); - - for (String kw : intrinsicKeywords) - if (kw.startsWith("HIDDEN")) - c.addExtrinsicKeyword(kw); - else c.addIntrinsicKeyword(kw); - - int multiplier = AllZoneUtil.getDoublingSeasonMagnitude(controller); - // TODO: does this need to set PlayerZone_ComesIntoPlay.SimultaneousEntry like Rite of Replication does? - for (int i = 0; i < multiplier; i++) { - Card temp = CardFactoryUtil.copyStats(c); - temp.setController(controller); - temp.setOwner(controller); - temp.setToken(true); - CardFactoryUtil.parseKeywords(temp, temp.getName()); - temp = CardFactoryUtil.postFactoryKeywords(temp); - AllZone.getGameAction().moveToPlay(temp); - list.add(temp); - } - return list; - } - - /** - *

copyTokens.

- * - * @param tokenList a {@link forge.CardList} object. - * @return a {@link forge.CardList} object. - */ - public static CardList copyTokens(CardList tokenList) { - CardList list = new CardList(); - - for (int tokenAdd = 0; tokenAdd < tokenList.size(); tokenAdd++) { - Card thisToken = tokenList.getCard(tokenAdd); - - ArrayList tal = thisToken.getType(); - String tokenTypes[] = new String[tal.size()]; - tal.toArray(tokenTypes); - - ArrayList kal = thisToken.getIntrinsicKeyword(); - String tokenKeywords[] = new String[kal.size()]; - kal.toArray(tokenKeywords); - CardList tokens = makeToken(thisToken.getName(), thisToken.getImageName(), thisToken.getController(), thisToken.getManaCost(), tokenTypes, thisToken.getBaseAttack(), thisToken.getBaseDefense(), tokenKeywords); - - for (Card token : tokens) - token.setColor(thisToken.getColor()); - - list.addAll(tokens); - } - - return list; - } - - /** - *

getBushidoEffects.

- * - * @param c a {@link forge.Card} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getBushidoEffects(Card c) { - ArrayList keywords = c.getKeyword(); - ArrayList list = new ArrayList(); - - final Card crd = c; - - for (String kw : keywords) { - if (kw.contains("Bushido")) { - String[] parse = kw.split(" "); - String s = parse[1]; - final int magnitude = Integer.parseInt(s); - - - Ability ability = new Ability(c, "0") { - @Override - public void resolve() { - final Command untilEOT = new Command() { - - private static final long serialVersionUID = 3014846051064254493L; - - public void execute() { - if (AllZoneUtil.isCardInPlay(crd)) { - crd.addTempAttackBoost(-1 * magnitude); - crd.addTempDefenseBoost(-1 * magnitude); - } - } - }; - - AllZone.getEndOfTurn().addUntil(untilEOT); - - crd.addTempAttackBoost(magnitude); - crd.addTempDefenseBoost(magnitude); - } - }; - StringBuilder sb = new StringBuilder(); - sb.append(c); - sb.append(" - (Bushido) gets +"); - sb.append(magnitude); - sb.append("/+"); - sb.append(magnitude); - sb.append(" until end of turn."); - ability.setStackDescription(sb.toString()); - - list.add(ability); - } - } - return list; - } - - /** - *

getNeededXDamage.

- * - * @param ability a {@link forge.card.spellability.SpellAbility} object. - * @return a int. - */ - static public int getNeededXDamage(SpellAbility ability) { - //when targeting a creature, make sure the AI won't overkill on X damage - Card target = ability.getTargetCard(); - int neededDamage = -1; - - Card c = ability.getSourceCard(); - - if (target != null && c.getText().contains("deals X damage to target") && !c.getName().equals("Death Grasp")) - neededDamage = target.getNetDefense() - target.getDamage(); - - return neededDamage; - } - - /** - * getWorstLand(String) - *

- * This function finds the worst land a player has in play based on: - * worst - * 1. tapped, basic land - * 2. tapped, non-basic land - * 3. untapped, basic land - * 4. untapped, non-basic land - * best - *

- * This is useful when the AI needs to find one of its lands to sacrifice - * - * @param player - AllZone.getHumanPlayer() or AllZone.getComputerPlayer() - * @return the worst land found based on the description above - */ - public static Card getWorstLand(Player player) { - CardList lands = AllZoneUtil.getPlayerLandsInPlay(player); - return getWorstLand(lands); - }//end getWorstLand - - /** - *

getWorstLand.

- * - * @param lands a {@link forge.CardList} object. - * @return a {@link forge.Card} object. - */ - public static Card getWorstLand(CardList lands) { - Card worstLand = null; - //first, check for tapped, basic lands - for (int i = 0; i < lands.size(); i++) { - Card tmp = lands.get(i); - if (tmp.isTapped() && tmp.isBasicLand()) { - worstLand = tmp; - } - } - //next, check for tapped, non-basic lands - if (worstLand == null) { - for (int i = 0; i < lands.size(); i++) { - Card tmp = lands.get(i); - if (tmp.isTapped()) { - worstLand = tmp; - } - } - } - //next, untapped, basic lands - if (worstLand == null) { - for (int i = 0; i < lands.size(); i++) { - Card tmp = lands.get(i); - if (tmp.isUntapped() && tmp.isBasicLand()) { - worstLand = tmp; - } - } - } - //next, untapped, non-basic lands - if (worstLand == null) { - for (int i = 0; i < lands.size(); i++) { - Card tmp = lands.get(i); - if (tmp.isUntapped()) { - worstLand = tmp; - } - } - } - return worstLand; - }//end getWorstLand - - //may return null - /** - *

getRandomCard.

- * - * @param list a {@link forge.CardList} object. - * @return a {@link forge.Card} object. - */ - static public Card getRandomCard(CardList list) { - if (list.size() == 0) return null; - - int index = random.nextInt(list.size()); - return list.get(index); - } - - /** - *

revertManland.

- * - * @param c a {@link forge.Card} object. - * @param cost a {@link java.lang.String} object. - * @param timeStamp a long. - * @param removeTypes an array of {@link java.lang.String} objects. - * @param removeKeywords an array of {@link java.lang.String} objects. - */ - public static void revertManland(Card c, String[] removeTypes, String[] removeKeywords, String cost, long timeStamp) { - c.setBaseAttack(0); - c.setBaseDefense(0); - for (String r : removeTypes) - c.removeType(r); - - for (String k : removeKeywords) - c.removeIntrinsicKeyword(k); - - //c.setManaCost(cost); - c.removeColor(cost, c, false, timeStamp); - c.unEquipAllCards(); - } - - /** - *

activateManland.

- * - * @param c a {@link forge.Card} object. - * @param cost a {@link java.lang.String} object. - * @return a long. - * @param attack a int. - * @param defense a int. - * @param addTypes an array of {@link java.lang.String} objects. - * @param addKeywords an array of {@link java.lang.String} objects. - */ - public static long activateManland(Card c, int attack, int defense, String[] addTypes, String[] addKeywords, String cost) { - c.setBaseAttack(attack); - c.setBaseDefense(defense); - - for (String r : addTypes) { - // if the card doesn't have that type, add it - if (!c.isType(r)) - c.addType(r); - } - for (String k : addKeywords) { - // if the card doesn't have that keyword, add it (careful about stackable keywords) - if (!c.getIntrinsicKeyword().contains(k)) - c.addIntrinsicKeyword(k); - } - - //c.setManaCost(cost); - if (cost.equals("")) - cost = "0"; - - long timestamp = c.addColor(cost, c, false, true); - return timestamp; - } - - /** - *

playLandEffects.

- * - * @param c a {@link forge.Card} object. - */ - public static void playLandEffects(Card c) { - final Player player = c.getController(); - - // > 0 because land amount isn't incremented until after playLandEffects - boolean extraLand = player.getNumLandsPlayed() > 0; - - if (extraLand) { - CardList fastbonds = AllZoneUtil.getPlayerCardsInPlay(player, "Fastbond"); - for (final Card f : fastbonds) { - SpellAbility ability = new Ability(f, "0") { - @Override - public void resolve() { - f.getController().addDamage(1, f); - } - }; - ability.setStackDescription("Fastbond - Deals 1 damage to you."); - - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - } - } - - - /** - *

isNegativeCounter.

- * - * @param c a {@link forge.Counters} object. - * @return a boolean. - */ - public static boolean isNegativeCounter(Counters c) { - return c == Counters.AGE || c == Counters.BLAZE || c == Counters.BRIBERY || c == Counters.DOOM || c == Counters.ICE || - c == Counters.M1M1 || c == Counters.M0M2 || c == Counters.M0M1 || c == Counters.TIME; - } - - /** - *

checkEmblemKeyword.

- * - * @param c a {@link forge.Card} object. - * @return a {@link java.lang.String} object. - */ - public static String checkEmblemKeyword(Card c) { - if (c.hasKeyword("Artifacts, creatures, enchantments, and lands you control are indestructible.")) - return "Elspeth_Emblem"; - - if (c.hasKeyword("Mountains you control have 'tap: This land deals 1 damage to target creature or player.'")) - return "Koth_Emblem"; - - return ""; - } - /* - //whenever CARDNAME becomes the target of a spell or ability, ... : - public static void checkTargetingEffects(SpellAbility sa, final Card c) - { - - //if (AllZoneUtil.isCardInPlay(c)) - //{ - if (c.hasKeyword("When CARDNAME becomes the target of a spell or ability, return CARDNAME to its owner's hand.") ) { // || (c.isCreature() && AllZoneUtil.isCardInPlay("Cowardice")) - SpellAbility ability = new Ability(c, "0") - { - public void resolve() - { - AllZone.getGameAction().moveToHand(c); - } - }; - StringBuilder sb = new StringBuilder(); - sb.append(c).append(" - return CARDNAME to its owner's hand."); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().add(ability); - } - if (c.hasKeyword("When CARDNAME becomes the target of a spell or ability, destroy CARDNAME.") - || AllZoneUtil.isCardInPlay("Horobi, Death's Wail")) { - - SpellAbility ability = new Ability(c, "0") - { - public void resolve() - { - AllZone.getGameAction().destroy(c); - } - }; - StringBuilder sb = new StringBuilder(); - sb.append(c).append(" - destroy CARDNAME."); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().add(ability); - } - if (c.hasKeyword("When CARDNAME becomes the target of a spell or ability, sacrifice it.")) { - SpellAbility ability = new Ability(c, "0") - { - public void resolve() - { - AllZone.getGameAction().sacrifice(c); - } - }; - StringBuilder sb = new StringBuilder(); - sb.append(c).append(" - sacrifice CARDNAME."); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().add(ability); - } - - //When enchanted creature becomes the target of a spell or ability, . (It can't be regenerated.) - ArrayList auras = c.getEnchantedBy(); - for(int a=0;a keywords = aura.getKeyword(); - for(int i=0;icopyStats.

- * - * @param o a {@link java.lang.Object} object. - * @return a {@link forge.Card} object. - */ - public static Card copyStats(Object o) { - Card sim = (Card) o; - Card c = new Card(); - - c.setBaseAttack(sim.getBaseAttack()); - c.setBaseDefense(sim.getBaseDefense()); - c.setBaseLoyalty(sim.getBaseLoyalty()); - c.setBaseAttackString(sim.getBaseAttackString()); - c.setBaseDefenseString(sim.getBaseDefenseString()); - c.setIntrinsicKeyword(sim.getKeyword()); - c.setName(sim.getName()); - c.setImageName(sim.getImageName()); - c.setType(sim.getType()); - c.setText(sim.getSpellText()); - c.setManaCost(sim.getManaCost()); - c.setColor(sim.getColor()); - c.setSVars(sim.getSVars()); - c.setSets(sim.getSets()); - c.setIntrinsicAbilities(sim.getIntrinsicAbilities()); - c.setCurSetCode(sim.getCurSetCode()); - c.setImageFilename(sim.getImageFilename()); - c.setTriggers(sim.getTriggers()); - c.setStaticAbilityStrings(sim.getStaticAbilityStrings()); - - return c; - }// copyStats() - - /** - *

postFactoryKeywords.

- * - * @param card a {@link forge.Card} object. - * @return a {@link forge.Card} object. - */ - public static Card postFactoryKeywords(final Card card) { - // this function should handle any keywords that need to be added after a spell goes through the factory - // Cards with Cycling abilities - // -1 means keyword "Cycling" not found - - // TODO: certain cards have two different kicker types, kicker will need to be written differently to handle this - // TODO: kicker costs can only be mana right now i think? - // TODO: this kicker only works for pemanents. maybe we can create an optional cost class for buyback, kicker, that type of thing - int kicker = CardFactoryUtil.hasKeyword(card, "Kicker"); - if (kicker != -1) { - final SpellAbility kickedSpell = new Spell(card) { - private static final long serialVersionUID = -1598664196463358630L; - - @Override - public void resolve() { - card.setKicked(true); - AllZone.getGameAction().moveToPlay(card); - } - }; - String parse = card.getKeyword().get(kicker).toString(); - card.removeIntrinsicKeyword(parse); - - String k[] = parse.split(":"); - final String kickerCost = k[1]; - - ManaCost mc = new ManaCost(card.getManaCost()); - mc.combineManaCost(kickerCost); - - kickedSpell.setKickerAbility(true); - kickedSpell.setManaCost(mc.toString()); - kickedSpell.setAdditionalManaCost(kickerCost); - - StringBuilder desc = new StringBuilder(); - desc.append("Kicker ").append(kickerCost).append(" (You may pay an additional "); - desc.append(kickerCost).append(" as you cast this spell.)"); - - kickedSpell.setDescription(desc.toString()); - - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" (Kicked)"); - kickedSpell.setStackDescription(sb.toString()); - - card.addSpellAbility(kickedSpell); - } - - if (CardFactoryUtil.hasKeyword(card, "Multikicker") != -1) { - int n = CardFactoryUtil.hasKeyword(card, "Multikicker"); - if (n != -1) { - String parse = card.getKeyword().get(n).toString(); - String k[] = parse.split("kicker "); - - SpellAbility sa = card.getSpellAbility()[0]; - sa.setIsMultiKicker(true); - sa.setMultiKickerManaCost(k[1]); - } - } - - if (CardFactoryUtil.hasKeyword(card, "Replicate") != -1) { - int n = CardFactoryUtil.hasKeyword(card, "Replicate"); - if (n != -1) { - String parse = card.getKeyword().get(n).toString(); - String k[] = parse.split("cate "); - - SpellAbility sa = card.getSpellAbility()[0]; - sa.setIsReplicate(true); - sa.setReplicateManaCost(k[1]); - } - } - - int evokeKeyword = CardFactoryUtil.hasKeyword(card, "Evoke"); - if (evokeKeyword != -1) { - final SpellAbility evokedSpell = new Spell(card) { - private static final long serialVersionUID = -1598664196463358630L; - - @Override - public void resolve() { - card.setEvoked(true); - AllZone.getGameAction().moveToPlay(card); - } - - @Override - public boolean canPlayAI() { - if (!Spell_Permanent.checkETBEffects(card, this, null)) - return false; - return super.canPlayAI(); - } - }; - String parse = card.getKeyword().get(evokeKeyword).toString(); - card.removeIntrinsicKeyword(parse); - - String k[] = parse.split(":"); - final String evokedCost = k[1]; - - evokedSpell.setManaCost(evokedCost); - - StringBuilder desc = new StringBuilder(); - desc.append("Evoke ").append(evokedCost); - desc.append(" (You may cast this spell for its evoke cost. If you do, when it enters the battlefield, sacrifice it.)"); - - evokedSpell.setDescription(desc.toString()); - - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" (Evoked)"); - evokedSpell.setStackDescription(sb.toString()); - - card.addSpellAbility(evokedSpell); - } - - if (CardFactoryUtil.hasKeyword(card, "Cycling") != -1) { - int n = CardFactoryUtil.hasKeyword(card, "Cycling"); - if (n != -1) { - String parse = card.getKeyword().get(n).toString(); - card.removeIntrinsicKeyword(parse); - - String k[] = parse.split(":"); - final String manacost = k[1]; - - card.addSpellAbility(ability_cycle(card, manacost)); - } - }//Cycling - - while (CardFactoryUtil.hasKeyword(card, "TypeCycling") != -1) { - int n = CardFactoryUtil.hasKeyword(card, "TypeCycling"); - if (n != -1) { - String parse = card.getKeyword().get(n).toString(); - card.removeIntrinsicKeyword(parse); - - String k[] = parse.split(":"); - final String type = k[1]; - final String manacost = k[2]; - - card.addSpellAbility(ability_typecycle(card, manacost, type)); - } - }//TypeCycling - - if (CardFactoryUtil.hasKeyword(card, "Flashback") != -1) { - int n = CardFactoryUtil.hasKeyword(card, "Flashback"); - if (n != -1) { - String parse = card.getKeyword().get(n).toString(); - //card.removeIntrinsicKeyword(parse); - - String k[] = parse.split(":"); - - card.setFlashback(true); - card.addSpellAbility(ability_Flashback(card, k[1])); - } - }//flashback - - if (CardFactoryUtil.hasKeyword(card, "Transmute") != -1) { - int n = CardFactoryUtil.hasKeyword(card, "Transmute"); - if (n != -1) { - String parse = card.getKeyword().get(n).toString(); - card.removeIntrinsicKeyword(parse); - - String k[] = parse.split(":"); - final String manacost = k[1]; - - card.addSpellAbility(ability_transmute(card, manacost)); - } - }//transmute - - // Sol's Soulshift fix - int shiftPos = CardFactoryUtil.hasKeyword(card, "Soulshift"); - while (shiftPos != -1) { - int n = shiftPos; - String parse = card.getKeyword().get(n).toString(); - - String k[] = parse.split(":"); - final String manacost = k[1]; - - card.addDestroyCommand(ability_Soulshift(card, manacost)); - shiftPos = CardFactoryUtil.hasKeyword(card, "Soulshift", n + 1); - }//Soulshift - - if (CardFactoryUtil.hasKeyword(card, "Echo") != -1) { - int n = CardFactoryUtil.hasKeyword(card, "Echo"); - if (n != -1) { - String parse = card.getKeyword().get(n).toString(); - //card.removeIntrinsicKeyword(parse); - - String k[] = parse.split(":"); - final String manacost = k[1]; - - card.setEchoCost(manacost); - - final Command intoPlay = new Command() { - - private static final long serialVersionUID = -7913835645603984242L; - - public void execute() { - card.addIntrinsicKeyword("(Echo unpaid)"); - } - }; - card.addComesIntoPlayCommand(intoPlay); - - } - }//echo - - if (CardFactoryUtil.hasKeyword(card, "HandSize") != -1) { - String toParse = card.getKeyword().get(CardFactoryUtil.hasKeyword(card, "HandSize")); - card.removeIntrinsicKeyword(toParse); - - String parts[] = toParse.split(" "); - final String Mode = parts[1]; - final int Amount; - if (parts[2].equals("INF")) { - Amount = -1; - } else { - Amount = Integer.parseInt(parts[2]); - } - final String Target = parts[3]; - - final Command entersPlay, leavesPlay, controllerChanges; - - entersPlay = new Command() { - private static final long serialVersionUID = 98743547743456L; - - public void execute() { - card.setSVar("HSStamp", "" + Player.getHandSizeStamp()); - if (Target.equals("Self") || Target.equals("All")) { - card.getController().addHandSizeOperation(new HandSizeOp(Mode, Amount, Integer.parseInt(card.getSVar("HSStamp")))); - } - if (Target.equals("Opponent") || Target.equals("All")) { - card.getController().getOpponent().addHandSizeOperation(new HandSizeOp(Mode, Amount, Integer.parseInt(card.getSVar("HSStamp")))); - } - } - }; - - leavesPlay = new Command() { - private static final long serialVersionUID = -6843545358873L; - - public void execute() { - if (Target.equals("Self") || Target.equals("All")) { - card.getController().removeHandSizeOperation(Integer.parseInt(card.getSVar("HSStamp"))); - } - if (Target.equals("Opponent") || Target.equals("All")) { - card.getController().getOpponent().removeHandSizeOperation(Integer.parseInt(card.getSVar("HSStamp"))); - } - } - }; - - controllerChanges = new Command() { - private static final long serialVersionUID = 778987998465463L; - - public void execute() { - Log.debug("HandSize", "Control changed: " + card.getController()); - if (card.getController().isHuman()) { - AllZone.getHumanPlayer().removeHandSizeOperation(Integer.parseInt(card.getSVar("HSStamp"))); - AllZone.getComputerPlayer().addHandSizeOperation(new HandSizeOp(Mode, Amount, Integer.parseInt(card.getSVar("HSStamp")))); - - AllZone.getComputerPlayer().sortHandSizeOperations(); - } else if (card.getController().isComputer()) { - AllZone.getComputerPlayer().removeHandSizeOperation(Integer.parseInt(card.getSVar("HSStamp"))); - AllZone.getHumanPlayer().addHandSizeOperation(new HandSizeOp(Mode, Amount, Integer.parseInt(card.getSVar("HSStamp")))); - - AllZone.getHumanPlayer().sortHandSizeOperations(); - } - } - }; - - card.addComesIntoPlayCommand(entersPlay); - card.addLeavesPlayCommand(leavesPlay); - card.addChangeControllerCommand(controllerChanges); - } //HandSize - - if (CardFactoryUtil.hasKeyword(card, "Suspend") != -1) { - // Suspend:: - int n = CardFactoryUtil.hasKeyword(card, "Suspend"); - if (n != -1) { - String parse = card.getKeyword().get(n).toString(); - card.removeIntrinsicKeyword(parse); - card.setSuspend(true); - String k[] = parse.split(":"); - - final int timeCounters = Integer.parseInt(k[1]); - final String cost = k[2]; - card.addSpellAbility(ability_suspend(card, cost, timeCounters)); - } - }//Suspend - - if (card.getManaCost().contains("X")) { - SpellAbility sa = card.getSpellAbility()[0]; - sa.setIsXCost(true); - - if (card.getManaCost().startsWith("X X")) - sa.setXManaCost("2"); - else if (card.getManaCost().startsWith("X")) - sa.setXManaCost("1"); - }//X - - int cardnameSpot = CardFactoryUtil.hasKeyword(card, "CARDNAME is "); - if (cardnameSpot != -1) { - String color = "1"; - while (cardnameSpot != -1) { - if (cardnameSpot != -1) { - String parse = card.getKeyword().get(cardnameSpot).toString(); - card.removeIntrinsicKeyword(parse); - color += " " + Input_PayManaCostUtil.getShortColorString(parse.replace("CARDNAME is ", "").replace(".", "")); - cardnameSpot = CardFactoryUtil.hasKeyword(card, "CARDNAME is "); - } - } - card.addColor(color); - } - - if (CardFactoryUtil.hasKeyword(card, "Fading") != -1) { - int n = CardFactoryUtil.hasKeyword(card, "Fading"); - if (n != -1) { - String parse = card.getKeyword().get(n).toString(); - - String k[] = parse.split(":"); - final int power = Integer.parseInt(k[1]); - - card.addComesIntoPlayCommand(fading(card, power)); - } - }//Fading - - if (CardFactoryUtil.hasKeyword(card, "Vanishing") != -1) { - int n = CardFactoryUtil.hasKeyword(card, "Vanishing"); - if (n != -1) { - String parse = card.getKeyword().get(n).toString(); - - String k[] = parse.split(":"); - final int power = Integer.parseInt(k[1]); - - card.addComesIntoPlayCommand(vanishing(card, power)); - } - }//Vanishing - - // AltCost - SpellAbility[] abilities = card.getSpellAbility(); - if (abilities.length > 0) { - String altCost = card.getSVar("AltCost"); - String altCostDescription = ""; - String[] altCosts = altCost.split("\\$"); - - if (altCosts.length > 1) { - altCostDescription = altCosts[1]; - altCost = altCosts[0]; - } - - SpellAbility sa = abilities[0]; - if (!altCost.equals("") && sa.isSpell()) { - SpellAbility altCostSA = sa.copy(); - - Cost abCost = new Cost(altCost, card.getName(), altCostSA.isAbility()); - altCostSA.setPayCosts(abCost); - - StringBuilder sb = new StringBuilder(); - - if (altCosts.length > 1) { - sb.append(altCostDescription); - } else { - sb.append("You may ").append(abCost.toStringAlt()); - sb.append(" rather than pay ").append(card.getName()).append("'s mana cost."); - } - - altCostSA.setDescription(sb.toString()); - - card.addSpellAbility(altCostSA); - } - } - return card; - } - - /** - *

hasKeyword.

- * - * @param c a {@link forge.Card} object. - * @param k a {@link java.lang.String} object. - * @return a int. - */ - public final static int hasKeyword(Card c, String k) { - ArrayList a = c.getKeyword(); - for (int i = 0; i < a.size(); i++) - if (a.get(i).toString().startsWith(k)) return i; - - return -1; - } - - // Sol's Soulshift fix - /** - *

hasKeyword.

- * - * @param c a {@link forge.Card} object. - * @param k a {@link java.lang.String} object. - * @param startPos a int. - * @return a int. - */ - final static int hasKeyword(Card c, String k, int startPos) { - ArrayList a = c.getKeyword(); - for (int i = startPos; i < a.size(); i++) - if (a.get(i).toString().startsWith(k)) return i; - - return -1; - } - - /** - *

parseKeywords.

- * Pulling out the parsing of keywords so it can be used by the token generator - * @param card a {@link forge.Card} object. - * @param cardName a {@link java.lang.String} object. - * - */ - final static public void parseKeywords(final Card card, final String cardName){ - if (card.hasKeyword("CARDNAME enters the battlefield tapped.")) { - card.addComesIntoPlayCommand(new Command() { - private static final long serialVersionUID = 203335252453049234L; - - public void execute() { - //System.out.println("Executing previous keyword"); - card.tap(); - } - }); - }//if "Comes into play tapped." - if (card.hasKeyword("CARDNAME enters the battlefield tapped unless you control two or fewer other lands.")) { - card.addComesIntoPlayCommand(new Command() { - private static final long serialVersionUID = 6436821515525468682L; - - public void execute() { - CardList lands = AllZoneUtil.getPlayerLandsInPlay(card.getController()); - lands.remove(card); - if (!(lands.size() <= 2)) { - card.tap(); - } - } - }); - } - if (hasKeyword(card, "CARDNAME enters the battlefield tapped unless you control a") != -1) { - int n = hasKeyword(card, "CARDNAME enters the battlefield tapped unless you control a"); - String parse = card.getKeyword().get(n).toString(); - - String splitString; - if (parse.contains(" or a ")) - splitString = " or a "; - else - splitString = " or an "; - - final String types[] = parse.substring(60, parse.length() - 1).split(splitString); - - card.addComesIntoPlayCommand(new Command() { - private static final long serialVersionUID = 403635232455049834L; - - public void execute() { - CardList clICtrl = AllZoneUtil.getPlayerCardsInPlay(card.getOwner()); - - boolean fnd = false; - - for (int i = 0; i < clICtrl.size(); i++) { - Card c = clICtrl.get(i); - for (int j = 0; j < types.length; j++) - if (c.isType(types[j].trim())) - fnd = true; - } - - if (!fnd) - card.tap(); - } - }); - } - if (hasKeyword(card, "Sunburst") != -1) { - Command sunburstCIP = new Command() { - private static final long serialVersionUID = 1489845860231758299L; - - public void execute() { - if (card.isCreature()) { - card.addCounter(Counters.P1P1, card.getSunburstValue()); - } else { - card.addCounter(Counters.CHARGE, card.getSunburstValue()); - } - - } - }; - - Command sunburstLP = new Command() { - private static final long serialVersionUID = -7564420917490677427L; - - public void execute() { - card.setSunburstValue(0); - } - }; - - card.addComesIntoPlayCommand(sunburstCIP); - card.addLeavesPlayCommand(sunburstLP); - } - - if (card.isType("World")) // Enforce the "World rule" - { - Command intoPlay = new Command() { - private static final long serialVersionUID = 6536398032388958127L; - - public void execute() { - CardList CardsinPlay = AllZoneUtil.getTypeInPlay("World"); - CardsinPlay.remove(card); - for (int i = 0; i < CardsinPlay.size(); i++) - AllZone.getGameAction().sacrificeDestroy(CardsinPlay.get(i)); - }//execute() - };//Command - card.addComesIntoPlayCommand(intoPlay); - } - - if (hasKeyword(card, "Morph") != -1) { - int n = hasKeyword(card, "Morph"); - if (n != -1) { - card.setPrevIntrinsicKeyword(card.getIntrinsicKeyword()); - card.setPrevType(card.getType()); - - String parse = card.getKeyword().get(n).toString(); - card.removeIntrinsicKeyword(parse); - - String k[] = parse.split(":"); - final Cost cost = new Cost(k[1], cardName, true); - - int attack = card.getBaseAttack(); - int defense = card.getBaseDefense(); - - String orgManaCost = card.getManaCost(); - - card.addSpellAbility(ability_Morph_Up(card, cost, orgManaCost, attack, defense)); - card.addSpellAbility(ability_Morph_Down(card)); - } - }//Morph - - if (hasKeyword(card, "Unearth") != -1) { - int n = hasKeyword(card, "Unearth"); - if (n != -1) { - String parse = card.getKeyword().get(n).toString(); - //card.removeIntrinsicKeyword(parse); - - String k[] = parse.split(":"); - - final String manacost = k[1]; - - card.addSpellAbility(ability_Unearth(card, manacost)); - card.setUnearth(true); - } - }//unearth - - if (hasKeyword(card, "Madness") != -1) { - int n = hasKeyword(card, "Madness"); - if (n != -1) { - String parse = card.getKeyword().get(n).toString(); - //card.removeIntrinsicKeyword(parse); - - String k[] = parse.split(":"); - - card.setMadness(true); - card.setMadnessCost(k[1]); - } - }//madness - - if (hasKeyword(card, "Devour") != -1) { - int n = hasKeyword(card, "Devour"); - if (n != -1) { - - String parse = card.getKeyword().get(n).toString(); - // card.removeIntrinsicKeyword(parse); - - String k[] = parse.split(":"); - final String magnitude = k[1]; - - - final int multiplier = Integer.parseInt(magnitude); - //final String player = card.getController(); - final int[] numCreatures = new int[1]; - - Command intoPlay = new Command() { - private static final long serialVersionUID = -7530312713496897814L; - - public void execute() { - CardList creats = AllZoneUtil.getCreaturesInPlay(card.getController()); - creats.remove(card); - //System.out.println("Creats size: " + creats.size()); - - card.clearDevoured(); - if (card.getController().isHuman()) { - if (creats.size() > 0) { - List selection = GuiUtils.getChoicesOptional("Select creatures to sacrifice", creats.toArray()); - - numCreatures[0] = selection.size(); - for (int m = 0; m < selection.size(); m++) { - card.addDevoured(selection.get(m)); - AllZone.getGameAction().sacrifice(selection.get(m)); - } - } - - }//human - else { - int count = 0; - for (int i = 0; i < creats.size(); i++) { - Card c = creats.get(i); - if (c.getNetAttack() <= 1 && c.getNetAttack() + c.getNetDefense() <= 3) { - card.addDevoured(c); - AllZone.getGameAction().sacrifice(c); - count++; - } - //is this needed? - AllZone.getComputerBattlefield().updateObservers(); - } - numCreatures[0] = count; - } - int totalCounters = numCreatures[0] * multiplier; - - card.addCounter(Counters.P1P1, totalCounters); - - } - }; - card.addComesIntoPlayCommand(intoPlay); - } - }//Devour - - if (hasKeyword(card, "Modular") != -1) { - int n = hasKeyword(card, "Modular"); - if (n != -1) { - String parse = card.getKeyword().get(n).toString(); - - final int m = Integer.parseInt(parse.substring(8)); - - card.addComesIntoPlayCommand(new Command() { - private static final long serialVersionUID = 339412525059881775L; - - public void execute() { - card.addCounter(Counters.P1P1, m); - } - }); - - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() { - Card card2 = this.getTargetCard(); - card2.addCounter(Counters.P1P1, getSourceCard().getCounters(Counters.P1P1)); - }//resolve() - }; - - card.addDestroyCommand(new Command() { - private static final long serialVersionUID = 304026662487997331L; - - public void execute() { - // Target as Modular is Destroyed - if (card.getController().isComputer()) { - CardList choices = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - choices = choices.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isCreature() && c.isArtifact(); - } - }); - if (choices.size() != 0) { - ability.setTargetCard(AI_getBestCreature(choices)); - - if (ability.getTargetCard() != null) { - ability.setStackDescription("Put " + card.getCounters(Counters.P1P1) - + " +1/+1 counter/s from " + card + " on " + ability.getTargetCard()); - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - } - } else { - AllZone.getInputControl().setInput(modularInput(ability, card)); - } - } - }); - - } - - }//while shouldModular - - int etbCounter = hasKeyword(card, "etbCounter"); // etbCounter:CounterType:CounterAmount:Condition:Description - // enters the battlefield with CounterAmount of CounterType - if (etbCounter != -1) { - String parse = card.getKeyword().get(etbCounter).toString(); - card.removeIntrinsicKeyword(parse); - - String p[] = parse.split(":"); - final Counters counter = Counters.valueOf(p[1]); - final String numCounters = p[2]; - final String condition = p.length > 3 ? p[3] : ""; - - StringBuilder sb = new StringBuilder(card.getSpellText()); - if (sb.length() != 0) - sb.append("\n"); - if (p.length > 4) - sb.append(p[4]); - else { - sb.append(card.getName()); - sb.append(" enters the battlefield with "); - sb.append(numCounters); - sb.append(" "); - sb.append(counter.getName()); - sb.append(" counter"); - if ("1" != numCounters) sb.append("s"); - sb.append(" on it."); - } - - card.setText(sb.toString()); - - card.addComesIntoPlayCommand(new Command() { - private static final long serialVersionUID = -2292898970576123040L; - - public void execute() { - if (GameActionUtil.specialConditionsMet(card, condition)) { - int toAdd = -1; - if (numCounters.equals("X")) { - toAdd = xCount(card, card.getSVar("X")); - } else { - toAdd = Integer.parseInt(numCounters); - } - - card.addCounter(counter, toAdd); - } - - } - });//ComesIntoPlayCommand - } // if etbCounter - - int bloodthirst = hasKeyword(card, "Bloodthirst"); - if (bloodthirst != -1) { - final int count = Integer.parseInt(card.getKeyword().get(bloodthirst).split(" ")[1]); - - card.addComesIntoPlayCommand(new Command() { - private static final long serialVersionUID = -1849308549161972508L; - - public void execute() { - if (card.getController().getOpponent().getAssignedDamage() > 0) { - - card.addCounter(Counters.P1P1, count); - - } - } - - }); - }//bloodthirst - } -} diff --git a/src/forge/card/cardFactory/CardFactory_Auras.java b/src/forge/card/cardFactory/CardFactory_Auras.java deleted file mode 100644 index c92786aa842..00000000000 --- a/src/forge/card/cardFactory/CardFactory_Auras.java +++ /dev/null @@ -1,598 +0,0 @@ -package forge.card.cardFactory; - - -import com.esotericsoftware.minlog.Log; -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.CardListFilter; -import forge.CardListUtil; -import forge.CardUtil; -import forge.Command; -import forge.Constant; -import forge.Player; -import forge.PlayerZone; -import forge.card.spellability.Ability; -import forge.card.spellability.Cost; -import forge.card.spellability.Spell; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.Spell_Permanent; -import forge.card.spellability.Target; -import forge.gui.GuiUtils; -import forge.gui.input.Input; - -import java.util.ArrayList; -import java.util.HashMap; - - -/** - *

CardFactory_Auras class.

- * - * @author Forge - * @version $Id: $ - */ -class CardFactory_Auras { - - /** - *

shouldCycle.

- * - * @param c a {@link forge.Card} object. - * @return a int. - */ - public final static int shouldCycle(Card c) { - ArrayList a = c.getKeyword(); - for (int i = 0; i < a.size(); i++) { - if (a.get(i).toString().startsWith("Cycling")) { - return i; - } - } - return -1; - } - - /** - *

getCard.

- * - * @param card a {@link forge.Card} object. - * @param cardName a {@link java.lang.String} object. - * @param owner a {@link forge.Player} object. - * @return a {@link forge.Card} object. - */ - public static Card getCard(final Card card, final String cardName, final Player owner) { - - //*************** START *********** START ************************** - if (cardName.equals("Convincing Mirage") || cardName.equals("Phantasmal Terrain") - || cardName.equals("Spreading Seas") || cardName.equals("Evil Presence") - || cardName.equals("Lingering Mirage") || cardName.equals("Sea's Claim") - || cardName.equals("Tainted Well")) { - - final String[] newType = new String[1]; - final SpellAbility spell = new Spell(card) { - - private static final long serialVersionUID = 53941812202244498L; - - @Override - public boolean canPlayAI() { - - if (!super.canPlayAI()) { - return false; - } - - if (card.getName().equals("Spreading Seas") - || card.getName().equals("Lingering Mirage") - || card.getName().equals("Sea's Claim") - || card.getName().equals("Phantasmal Terrain")) { - newType[0] = "Island"; - } else if (card.getName().equals("Evil Presence") - || card.getName().equals("Tainted Well")) { - newType[0] = "Swamp"; - } else if (card.getName().equals("Convincing Mirage") - || card.getName().equals("Phantasmal Terrain")) { - String[] landTypes = new String[]{"Plains", "Island", "Swamp", "Mountain", "Forest"}; - HashMap humanLandCount = new HashMap(); - CardList humanlands = AllZoneUtil.getPlayerLandsInPlay(AllZone.getHumanPlayer()); - - for (int i = 0; i < landTypes.length; i++) { - humanLandCount.put(landTypes[i], 0); - } - - for (Card c : humanlands) { - for (String singleType : c.getType()) { - if (CardUtil.isABasicLandType(singleType)) { - humanLandCount.put(singleType, humanLandCount.get(singleType) + 1); - } - } - } - - int minAt = 0; - int minVal = Integer.MAX_VALUE; - for (int i = 0; i < landTypes.length; i++) { - if (getTargetCard().isType(landTypes[i])) { - continue; - } - - if (humanLandCount.get(landTypes[i]) < minVal) { - minVal = humanLandCount.get(landTypes[i]); - minAt = i; - } - } - - newType[0] = landTypes[minAt]; - } - CardList list = AllZoneUtil.getPlayerLandsInPlay(AllZone.getHumanPlayer()); - list = list.getNotType(newType[0]); // Don't enchant lands that already have the type - if (list.isEmpty()) { - return false; - } - setTargetCard(list.get(0)); - return true; - }//canPlayAI() - - @Override - public void resolve() { - if (card.getName().equals("Spreading Seas") - || card.getName().equals("Lingering Mirage") - || card.getName().equals("Sea's Claim")) { - newType[0] = "Island"; - } else if (card.getName().equals("Evil Presence") - || card.getName().equals("Tainted Well")) { - newType[0] = "Swamp"; - } else if (card.getName().equals("Convincing Mirage") - || card.getName().equals("Phantasmal Terrain")) { - //Only query player, AI will have decided already. - if (card.getController().isHuman()) { - newType[0] = GuiUtils.getChoice("Select land type.", "Plains", "Island", "Swamp", "Mountain", "Forest"); - } - } - AllZone.getGameAction().moveToPlay(card); - - Card c = getTargetCard(); - - if (AllZoneUtil.isCardInPlay(c) - && CardFactoryUtil.canTarget(card, c)) { - card.enchantCard(c); - } - - }//resolve() - };//SpellAbility - - - spell.setDescription(""); - card.addSpellAbility(spell); - - // Need to set the spell description for Lingering Mirage since it has cycling ability. - if (card.getName().equals("Lingering Mirage")) { - spell.setDescription("Enchanted land is an Island."); - } - - Command onEnchant = new Command() { - - private static final long serialVersionUID = 3528675112863241126L; - - public void execute() { - if (card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - ArrayList seas = crd.getEnchantedBy(); - int count = 0; - for (int i = 0; i < seas.size(); i++) { - if (seas.get(i).getName().equals(card.getName())) { - count = count + 1; - } - } - if (count == 1) { - crd.removeType("Swamp"); - crd.removeType("Forest"); - crd.removeType("Island"); - crd.removeType("Plains"); - crd.removeType("Mountain"); - crd.removeType("Locus"); - crd.removeType("Lair"); - - crd.addType(newType[0]); - } else { - Card Other_Seas = null; - for (int i = 0; i < seas.size(); i++) { - if (seas.get(i) != card) { - Other_Seas = seas.get(i); - } - } - SpellAbility[] Abilities = Other_Seas.getSpellAbility(); - for (int i = 0; i < Abilities.length; i++) { - card.addSpellAbility(Abilities[i]); - } - } - } - }//execute() - };//Command - - Command onUnEnchant = new Command() { - private static final long serialVersionUID = -202144631191180334L; - - public void execute() { - if (card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - ArrayList seas = crd.getEnchantedBy(); - int count = 0; - for (int i = 0; i < seas.size(); i++) { - if (seas.get(i).getName().equals(card.getName())) { - count = count + 1; - } - } - if (count == 1) { - crd.removeType(newType[0]); - crd.removeType("Land"); - crd.removeType("Basic"); - crd.removeType("Snow"); - crd.removeType("Legendary"); - SpellAbility[] Card_Abilities = crd.getSpellAbility(); - for (int i = 0; i < Card_Abilities.length; i++) { - if (Card_Abilities[i].isIntrinsic()) { - crd.removeSpellAbility(Card_Abilities[i]); - } - } - Card c = AllZone.getCardFactory().copyCard(crd); - ArrayList types = c.getType(); - SpellAbility[] Abilities = card.getSpellAbility(); - for (int i = 0; i < types.size(); i++) { - crd.addType(types.get(i)); - } - for (int i = 0; i < Abilities.length; i++) { - crd.addSpellAbility(Abilities[i]); - } - } - } - }//execute() - };//Command - - Command onLeavesPlay = new Command() { - - private static final long serialVersionUID = -45433022112460839L; - - public void execute() { - if (card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - card.unEnchantCard(crd); - } - } - }; - - card.addEnchantCommand(onEnchant); - card.addUnEnchantCommand(onUnEnchant); - card.addLeavesPlayCommand(onLeavesPlay); - - Input runtime = new Input() { - - private static final long serialVersionUID = -62372711146079880L; - - @Override - public void showMessage() { - CardList land = AllZoneUtil.getLandsInPlay(); - stopSetNext(CardFactoryUtil.input_targetSpecific(spell, land, "Select target land", true, - false)); - } - }; - spell.setBeforePayMana(runtime); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Earthbind")) { - Cost cost = new Cost(card.getManaCost(), cardName, false); - Target tgt = new Target(card, "C"); - final SpellAbility spell = new Spell_Permanent(card, cost, tgt) { - - private static final long serialVersionUID = 142389375702113977L; - - @Override - public boolean canPlayAI() { - CardList list = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer()); - list = list.getKeyword("Flying"); - if (list.isEmpty()) { - return false; - } - - CardListFilter f = new CardListFilter() { - public final boolean addCard(Card c) { - return c.getNetDefense() - c.getDamage() <= 2; - } - }; - if (!list.filter(f).isEmpty()) { - list = list.filter(f); - } - CardListUtil.sortAttack(list); - - for (int i = 0; i < list.size(); i++) { - if (CardFactoryUtil.canTarget(card, list.get(i))) { - setTargetCard(list.get(i)); - return super.canPlayAI(); - } - } - return false; - }//canPlayAI() - - @Override - public void resolve() { - AllZone.getGameAction().moveToPlay(card); - - Card c = getTargetCard(); - - if (AllZoneUtil.isCardInPlay(c) - && CardFactoryUtil.canTarget(card, c)) { - card.enchantCard(c); - Log.debug("Enchanted: " + getTargetCard()); - } - }//resolve() - };//SpellAbility - - card.addSpellAbility(spell); - - final boolean[] badTarget = {true}; - Command onEnchant = new Command() { - - private static final long serialVersionUID = -5302506578307993978L; - - public void execute() { - if (card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - if (crd.hasKeyword("Flying")) { - badTarget[0] = false; - crd.addDamage(2, card); - crd.removeIntrinsicKeyword("Flying"); - crd.removeExtrinsicKeyword("Flying"); - } else { - badTarget[0] = true; - } - } - }//execute() - };//Command - - Command onUnEnchant = new Command() { - - private static final long serialVersionUID = -6908757692588823391L; - - public void execute() { - if (card.isEnchanting() - && !badTarget[0]) { - Card crd = card.getEnchanting().get(0); - crd.addIntrinsicKeyword("Flying"); - } - }//execute() - };//Command - - Command onLeavesPlay = new Command() { - - private static final long serialVersionUID = -7833240882415702940L; - - public void execute() { - if (card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - card.unEnchantCard(crd); - } - } - }; - - card.addEnchantCommand(onEnchant); - card.addUnEnchantCommand(onUnEnchant); - card.addLeavesPlayCommand(onLeavesPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Guilty Conscience")) { - Cost cost = new Cost(card.getManaCost(), cardName, false); - Target tgt = new Target(card, "C"); - final SpellAbility spell = new Spell_Permanent(card, cost, tgt) { - - private static final long serialVersionUID = 1169151960692309514L; - - @Override - public boolean canPlayAI() { - - CardList stuffy = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer(), "Stuffy Doll"); - - if (stuffy.size() > 0) { - setTargetCard(stuffy.get(0)); - return true; - } else { - CardList list = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer()); - - if (list.isEmpty()) { - return false; - } - - //else - CardListUtil.sortAttack(list); - CardListUtil.sortFlying(list); - - for (int i = 0; i < list.size(); i++) { - if (CardFactoryUtil.canTarget(card, list.get(i)) - && (list.get(i).getNetAttack() >= list.get(i).getNetDefense()) - && list.get(i).getNetAttack() >= 3) { - setTargetCard(list.get(i)); - return super.canPlayAI(); - } - } - } - return false; - - }//canPlayAI() - - @Override - public void resolve() { - Card aura = AllZone.getGameAction().moveToPlay(card); - - Card c = getTargetCard(); - - if (AllZoneUtil.isCardInPlay(c) - && CardFactoryUtil.canTarget(aura, c)) { - aura.enchantCard(c); - } - }//resolve() - };//SpellAbility - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Animate Dead") || cardName.equals("Dance of the Dead")) { - final Card[] targetC = new Card[1]; - // need to override what happens when this is cast. - final Spell_Permanent animate = new Spell_Permanent(card) { - private static final long serialVersionUID = 7126615291288065344L; - - public CardList getCreturesInGrave() { - // This includes creatures Animate Dead can't enchant once in play. - // The human may try to Animate them, the AI will not. - CardList cList = AllZoneUtil.getCardsInGraveyard(); - cList = cList.getType("Creature"); - return cList; - } - - public boolean canPlay() { - return super.canPlay() && getCreturesInGrave().size() != 0; - } - - @Override - public boolean canPlayAI() { - CardList cList = getCreturesInGrave(); - // AI will only target something that will stick in play. - cList = cList.filter(new CardListFilter() { - public final boolean addCard(Card crd) { - return CardFactoryUtil.canTarget(card, crd) && !CardFactoryUtil.hasProtectionFrom(card, crd); - } - }); - if (cList.size() == 0) { - return false; - } - - Card c = CardFactoryUtil.AI_getBestCreature(cList); - - setTargetCard(c); - boolean playable = 2 < c.getNetAttack() && 2 < c.getNetDefense() && super.canPlayAI(); - return playable; - }//canPlayAI - - @Override - public void resolve() { - targetC[0] = getTargetCard(); - super.resolve(); - } - - };//addSpellAbility - - // Target AbCost and Restriction are set here to get this working as expected - Target tgt = new Target(card, "Select a creature in a graveyard", "Creature".split(",")); - tgt.setZone(Constant.Zone.Graveyard); - animate.setTarget(tgt); - - Cost cost = new Cost("1 B", cardName, false); - animate.setPayCosts(cost); - - animate.getRestrictions().setZone(Constant.Zone.Hand); - - final Ability attach = new Ability(card, "0") { - private static final long serialVersionUID = 222308932796127795L; - - @Override - public void resolve() { - PlayerZone play = AllZone.getZone(Constant.Zone.Battlefield, card.getController()); - - // Animate Dead got destroyed before its ability resolved - if (!AllZoneUtil.isCardInZone(play, card)) { - return; - } - - Card animated = targetC[0]; - PlayerZone grave = AllZone.getZone(animated); - - if (!grave.is(Constant.Zone.Graveyard)) { - // Animated Creature got removed before ability resolved - AllZone.getGameAction().sacrifice(card); - return; - } - - // Bring creature onto the battlefield under your control (should trigger etb Abilities) - animated.setController(card.getController()); - AllZone.getGameAction().moveToPlay(animated, card.getController()); - if (cardName.equals("Dance of the Dead")) { - animated.tap(); - } - card.enchantCard(animated); // Attach before Targeting so detach Command will trigger - - if (CardFactoryUtil.hasProtectionFrom(card, animated)) { - // Animated a creature with protection - AllZone.getGameAction().sacrifice(card); - return; - } - - // Everything worked out perfectly. - } - };//Ability - - final Command attachCmd = new Command() { - private static final long serialVersionUID = 3595188622377350327L; - - public void execute() { - AllZone.getStack().addSimultaneousStackEntry(attach); - - } - }; - - final Ability detach = new Ability(card, "0") { - - @Override - public void resolve() { - Card c = targetC[0]; - - PlayerZone play = AllZone.getZone(Constant.Zone.Battlefield, card.getController()); - - if (AllZoneUtil.isCardInZone(play, c)) { - AllZone.getGameAction().sacrifice(c); - } - } - };//Detach - - final Command detachCmd = new Command() { - private static final long serialVersionUID = 2425333033834543422L; - - public void execute() { - Card c = targetC[0]; - - PlayerZone play = AllZone.getZone(Constant.Zone.Battlefield, card.getController()); - - if (AllZoneUtil.isCardInZone(play, c)) { - AllZone.getStack().addSimultaneousStackEntry(detach); - } - - } - }; - - card.addSpellAbility(animate); - - attach.setStackDescription("Attaching " + cardName + " to creature in graveyard."); - card.addComesIntoPlayCommand(attachCmd); - detach.setStackDescription(cardName + " left play. Sacrificing creature if still around."); - card.addLeavesPlayCommand(detachCmd); - card.addUnEnchantCommand(detachCmd); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (CardFactoryUtil.hasKeyword(card, "enchant") != -1) { - int n = CardFactoryUtil.hasKeyword(card, "enchant"); - if (n != -1) { - String parse = card.getKeyword().get(n).toString(); - String k[] = parse.split(":"); - - SpellAbility sa = card.getSpellAbility()[0]; - sa.setIsMultiKicker(true); - sa.setMultiKickerManaCost(k[1]); - } - } - - - return card; - } - -} diff --git a/src/forge/card/cardFactory/CardFactory_Creatures.java b/src/forge/card/cardFactory/CardFactory_Creatures.java deleted file mode 100644 index dd50415312e..00000000000 --- a/src/forge/card/cardFactory/CardFactory_Creatures.java +++ /dev/null @@ -1,3285 +0,0 @@ -package forge.card.cardFactory; - - -import com.esotericsoftware.minlog.Log; -import forge.*; -import forge.card.abilityFactory.AbilityFactory; -import forge.card.spellability.*; -import forge.card.trigger.Trigger; -import forge.card.trigger.TriggerHandler; -import forge.gui.GuiUtils; -import forge.gui.input.Input; -import forge.gui.input.Input_PayManaCost; - -import javax.swing.*; -import java.util.ArrayList; -import java.util.List; -import java.util.Stack; - -/** - *

CardFactory_Creatures class.

- * - * @author Forge - * @version $Id: $ - */ -public class CardFactory_Creatures { - - /** - *

hasKeyword.

- * - * @param c a {@link forge.Card} object. - * @param k a {@link java.lang.String} object. - * @return a int. - */ - private static final int hasKeyword(Card c, String k) { - ArrayList a = c.getKeyword(); - for (int i = 0; i < a.size(); i++) - if (a.get(i).toString().startsWith(k)) return i; - - return -1; - } - - /** - *

shouldCycle.

- * - * @param c a {@link forge.Card} object. - * @return a int. - */ - public static int shouldCycle(Card c) { - ArrayList a = c.getKeyword(); - for (int i = 0; i < a.size(); i++) - if (a.get(i).toString().startsWith("Cycling")) return i; - - return -1; - } - - /** - *

shouldTypeCycle.

- * - * @param c a {@link forge.Card} object. - * @return a int. - */ - public static int shouldTypeCycle(Card c) { - ArrayList a = c.getKeyword(); - for (int i = 0; i < a.size(); i++) - if (a.get(i).toString().startsWith("TypeCycling")) return i; - - return -1; - } - - /** - *

shouldTransmute.

- * - * @param c a {@link forge.Card} object. - * @return a int. - */ - public static int shouldTransmute(Card c) { - ArrayList a = c.getKeyword(); - for (int i = 0; i < a.size(); i++) - if (a.get(i).toString().startsWith("Transmute")) return i; - - return -1; - } - - /** - *

shouldSoulshift.

- * - * @param c a {@link forge.Card} object. - * @return a int. - */ - public static int shouldSoulshift(Card c) { - ArrayList a = c.getKeyword(); - for (int i = 0; i < a.size(); i++) - if (a.get(i).toString().startsWith("Soulshift")) return i; - - return -1; - } - - - /** - *

getCard.

- * - * @param card a {@link forge.Card} object. - * @param cardName a {@link java.lang.String} object. - * @param owner a {@link forge.Player} object. - * @param cf a {@link forge.card.cardFactory.CardFactoryInterface} object. - * @return a {@link forge.Card} object. - */ - public static Card getCard(final Card card, final String cardName, Player owner, CardFactoryInterface cf) { - - //*************** START *********** START ************************** - if (cardName.equals("Force of Savagery")) { - SpellAbility spell = new Spell_Permanent(card) { - private static final long serialVersionUID = 1603238129819160467L; - - @Override - public boolean canPlayAI() { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - - return list.containsName("Glorious Anthem") || list.containsName("Gaea's Anthem"); - } - }; - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpell(); - card.addSpellAbility(spell); - } - //*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Gilder Bairn")) { - Cost abCost = new Cost("2 GU Untap", cardName, true); - Target tgt = new Target(card, "Select target permanent.", new String[]{"Permanent"}); - final Ability_Activated a1 = new Ability_Activated(card, abCost, tgt) { - private static final long serialVersionUID = -1847685865277129366L; - - @Override - public void resolve() { - Card c = getTargetCard(); - - if (c.sumAllCounters() == 0) return; - else if (AllZoneUtil.isCardInPlay(c) && CardFactoryUtil.canTarget(card, c)) { - //zerker clean up: - for (Counters c_1 : Counters.values()) - if (c.getCounters(c_1) > 0) c.addCounter(c_1, c.getCounters(c_1)); - } - } - - @Override - public void chooseTargetAI() { - CardList perms = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - perms = perms.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.sumAllCounters() > 0 && CardFactoryUtil.canTarget(card, c); - } - }); - perms.shuffle(); - setTargetCard(perms.get(0)); //TODO: improve this. - } - - @Override - public boolean canPlayAI() { - CardList perms = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - perms = perms.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.sumAllCounters() > 0 && CardFactoryUtil.canTarget(card, c); - } - }); - return perms.size() > 0; - } - };//SpellAbility - - card.addSpellAbility(a1); - a1.setDescription(abCost + "For each counter on target permanent, put another of those counters on that permanent."); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Primal Plasma") || cardName.equals("Primal Clay")) { - card.setBaseAttack(3); - card.setBaseDefense(3); - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() { - String choice = ""; - String choices[] = {"3/3", "2/2 with flying", "1/6 with defender"}; - - if (card.getController().isHuman()) { - choice = GuiUtils.getChoice("Choose one", choices); - } else choice = choices[MyRandom.random.nextInt(3)]; - - if (choice.equals("2/2 with flying")) { - card.setBaseAttack(2); - card.setBaseDefense(2); - card.addIntrinsicKeyword("Flying"); - } - if (choice.equals("1/6 with defender")) { - card.setBaseAttack(1); - card.setBaseDefense(6); - card.addIntrinsicKeyword("Defender"); - card.addType("Wall"); - } - - }//resolve() - };//SpellAbility - Command intoPlay = new Command() { - private static final long serialVersionUID = 8957338395786245312L; - - public void execute() { - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - choose: 3/3, 2/2 flying, 1/6 defender"); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - }; - card.addComesIntoPlayCommand(intoPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Oracle of Mul Daya")) { - final SpellAbility ability = new Ability(card, "0") { - private static final long serialVersionUID = 2902408812353813L; - - @Override - public void resolve() { - // TODO: change to static ability? - CardList library = AllZoneUtil.getPlayerCardsInLibrary(card.getController()); - if (library.size() == 0) - return; - - Card top = library.get(0); - if (top.isLand()) - card.getController().playLand(top); - }//resolve() - - @Override - public boolean canPlay() { - CardList library = AllZoneUtil.getPlayerCardsInLibrary(card.getController()); - if (library.size() == 0) return false; - PlayerZone play = AllZone.getZone(Constant.Zone.Battlefield, card.getController()); - boolean canPlayLand = card.getController().canPlayLand(); - - return (AllZoneUtil.isCardInZone(play, card) && library.get(0).isLand() && canPlayLand); - } - };//SpellAbility - - StringBuilder sb = new StringBuilder(); - sb.append(card.getController()).append(" - plays land from top of library."); - ability.setStackDescription(sb.toString()); - card.addSpellAbility(ability); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Drekavac")) { - final Input discard = new Input() { - private static final long serialVersionUID = -6392468000100283596L; - - @Override - public void showMessage() { - AllZone.getDisplay().showMessage("Select a noncreature card to discard"); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectCard(Card c, PlayerZone zone) { - if (zone.is(Constant.Zone.Hand) && !c.isCreature()) { - c.getController().discard(c, null); - stop(); - } - } - - @Override - public void selectButtonCancel() { - AllZone.getGameAction().sacrifice(card); - stop(); - } - };//Input - - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() { - if (card.getController().isHuman()) { - if (AllZoneUtil.getPlayerHand(AllZone.getHumanPlayer()).size() == 0) - AllZone.getGameAction().sacrifice(card); - else AllZone.getInputControl().setInput(discard); - } else { - CardList list = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return (!c.isCreature()); - } - }); - list.get(0).getController().discard(list.get(0), this); - }//else - }//resolve() - };//SpellAbility - - Command intoPlay = new Command() { - private static final long serialVersionUID = 9202753910259054021L; - - public void execute() { - StringBuilder sb = new StringBuilder(); - sb.append(card.getController()).append(" sacrifices Drekavac unless he discards a noncreature card"); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - }; - - SpellAbility spell = new Spell_Permanent(card) { - private static final long serialVersionUID = -2940969025405788931L; - - //could never get the AI to work correctly - //it always played the same card 2 or 3 times - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public boolean canPlay() { - CardList list = AllZoneUtil.getPlayerHand(card.getController()); - list.remove(card); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return (!c.isCreature()); - } - }); - return list.size() != 0; - }//canPlay() - }; - card.addComesIntoPlayCommand(intoPlay); - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpell(); - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Minotaur Explorer") || cardName.equals("Balduvian Horde") || - cardName.equals("Pillaging Horde")) { - - final SpellAbility creature = new Spell_Permanent(card) { - private static final long serialVersionUID = -7326018877172328480L; - - @Override - public boolean canPlayAI() { - int reqHand = 1; - if (AllZone.getZone(card).is(Constant.Zone.Hand)) - reqHand++; - - // Don't play if it would sacrifice as soon as it comes into play - return AllZoneUtil.getCardsInZone(Constant.Zone.Hand, AllZone.getComputerPlayer()).size() > reqHand; - } - }; - card.clearFirstSpell(); - card.addFirstSpellAbility(creature); - - final SpellAbility ability = new Ability(card, "0") { - - @Override - public void resolve() { - CardList hand = AllZoneUtil.getPlayerHand(card.getController()); - if (hand.size() == 0) - AllZone.getGameAction().sacrifice(card); - else - card.getController().discardRandom(this); - } - };//SpellAbility - - Command intoPlay = new Command() { - private static final long serialVersionUID = 4986114285467649619L; - - public void execute() { - StringBuilder sb = new StringBuilder(); - sb.append(card.getController()).append(" - discards at random or sacrifices ").append(cardName); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - }; - card.addComesIntoPlayCommand(intoPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Sleeper Agent")) { - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() { - // TODO: this need to be targeted - AllZone.getGameAction().changeController(new CardList(card), card.getController(), card.getController().getOpponent()); - } - }; - - ability.setStackDescription("When Sleeper Agent enters the battlefield, target opponent gains control of it."); - Command intoPlay = new Command() { - private static final long serialVersionUID = -3934471871041458847L; - - public void execute() { - AllZone.getStack().addSimultaneousStackEntry(ability); - - }//execute() - }; - card.addComesIntoPlayCommand(intoPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Phylactery Lich")) { - final CommandReturn getArt = new CommandReturn() { - //get target card, may be null - public Object execute() { - CardList art = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - art = art.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isArtifact(); - } - }); - - CardList list = new CardList(art.toArray()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getIntrinsicKeyword().contains("Indestructible"); - } - }); - - Card target = null; - if (!list.isEmpty()) - target = list.get(0); - else if (!art.isEmpty()) - target = art.get(0); - - return target; - }//execute() - };//CommandReturn - - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() { - Card c = getTargetCard(); - - if (AllZoneUtil.isCardInPlay(c) && c.isArtifact()) { - c.addCounter(Counters.PHYLACTERY, 1); - card.setFinishedEnteringBF(true); - } - }//resolve() - };//SpellAbility - Command intoPlay = new Command() { - private static final long serialVersionUID = -1601957445498569156L; - - public void execute() { - Input target = new Input() { - - private static final long serialVersionUID = -806140334868210520L; - - @Override - public void showMessage() { - AllZone.getDisplay().showMessage("Select target artifact you control"); - ButtonUtil.disableAll(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (card.isArtifact() && zone.is(Constant.Zone.Battlefield) && card.getController().isHuman()) { - ability.setTargetCard(card); - AllZone.getStack().add(ability); - stop(); - } - } - };//Input target - - - if (card.getController().isHuman()) { - CardList artifacts = AllZoneUtil.getPlayerTypeInPlay(AllZone.getHumanPlayer(), "Artifact"); - - if (artifacts.size() != 0) AllZone.getInputControl().setInput(target); - - } else { //computer - Object o = getArt.execute(); - if (o != null)//should never happen, but just in case - { - ability.setTargetCard((Card) o); - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - }//else - }//execute() - }; - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpell(); - card.addSpellAbility(new Spell_Permanent(card) { - - private static final long serialVersionUID = -1506199222879057809L; - - @Override - public boolean canPlayAI() { - Object o = getArt.execute(); - return (o != null) && AllZone.getZone(getSourceCard()).is(Constant.Zone.Hand); - } - }); - card.addComesIntoPlayCommand(intoPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Sky Swallower")) { - final SpellAbility ability = new Ability(card, "0") { - - @Override - public void resolve() { - //TODO - this needs to be targeted - Player opp = card.getController().getOpponent(); - - CardList list = AllZoneUtil.getCardsInPlay(); - list = list.getValidCards("Card.Other+YouCtrl".split(","), card.getController(), card); - - AllZone.getGameAction().changeController(list, card.getController(), opp); - }//resolve() - };//SpellAbility - - Command intoPlay = new Command() { - private static final long serialVersionUID = -453410206437839334L; - - public void execute() { - StringBuilder sb = new StringBuilder(); - sb.append(card.getController().getOpponent()); - sb.append(" gains control of all other permanents you control"); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - }; - card.addComesIntoPlayCommand(intoPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Jhoira of the Ghitu")) { - final Stack chosen = new Stack(); - final SpellAbility ability = new Ability(card, "2") { - private static final long serialVersionUID = 4414609319033894302L; - - @Override - public boolean canPlay() { - CardList possible = AllZoneUtil.getPlayerHand(card.getController()); - possible = possible.filter(AllZoneUtil.nonlands); - return !possible.isEmpty() && super.canPlay(); - } - - public boolean canPlayAI() { - return false; - } - - @Override - public void resolve() { - Card c = chosen.pop(); - c.addCounter(Counters.TIME, 4); - c.setSuspend(true); - } - }; - - ability.setAfterPayMana(new Input() { - private static final long serialVersionUID = -1647181037510967127L; - - @Override - public void showMessage() { - ButtonUtil.disableAll(); - AllZone.getDisplay().showMessage("Exile a nonland card from your hand."); - } - - @Override - public void selectCard(Card c, PlayerZone zone) { - if (zone.is(Constant.Zone.Hand) && !c.isLand()) { - AllZone.getGameAction().exile(c); - chosen.push(c); - ability.setStackDescription(card.toString() + " - Suspending " + c.toString()); - AllZone.getStack().add(ability); - stop(); - } - } - }); - - card.addSpellAbility(ability); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Hermit Druid")) { - Cost abCost = new Cost("G T", cardName, true); - final Ability_Activated ability = new Ability_Activated(card, abCost, null) { - private static final long serialVersionUID = 5884624727757154056L; - - @Override - public boolean canPlayAI() { - //Use the ability if there is still a forest in the library - CardList library = AllZoneUtil.getPlayerCardsInLibrary(card.getController()); - return !library.getName("Forest").isEmpty(); - } - - @Override - public void resolve() { - CardList library = AllZoneUtil.getPlayerCardsInLibrary(card.getController()); - if (library.size() == 0) return; // maybe provide some notification that library is empty? - - CardList revealed = new CardList(); - - Card basicGrab = null; - - int count = 0; - // reveal top card until library runs out or hit a basic land - while (basicGrab == null) { - Card top = library.get(count); - count++; - revealed.add(top); - - if (top.isBasicLand()) - basicGrab = top; - - if (count == library.size()) - break; - }//while - GuiUtils.getChoiceOptional("Revealed cards:", revealed.toArray()); - - if (basicGrab != null) { - // put basic in hand - AllZone.getGameAction().moveToHand(basicGrab); - revealed.remove(basicGrab); - } - // place revealed cards in graveyard (TODO: player should choose order) - for (Card c : revealed) { - AllZone.getGameAction().moveToGraveyard(c); - } - } - }; - ability.setStackDescription(abCost + "Reveal cards from the top of your library until you reveal a basic land card." + - " Put that card into your hand and all other cards revealed this way into your graveyard."); - card.addSpellAbility(ability); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Vedalken Plotter")) { - final Card[] target = new Card[2]; - final int[] index = new int[1]; - - final Ability ability = new Ability(card, "") { - - private static final long serialVersionUID = -3075569295823682336L; - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public void resolve() { - Card crd0 = target[0]; - Card crd1 = target[1]; - - if (crd0 != null && crd1 != null) { - Player p0 = crd0.getController(); - Player p1 = crd1.getController(); - AllZone.getGameAction().changeController(new CardList(crd0), p0, p1); - AllZone.getGameAction().changeController(new CardList(crd1), p1, p0); - } - - }//resolve() - };//SpellAbility - - - final Input input = new Input() { - - private static final long serialVersionUID = -7143706716256752987L; - - @Override - public void showMessage() { - if (index[0] == 0) AllZone.getDisplay().showMessage("Select target land you control."); - else AllZone.getDisplay().showMessage("Select target land opponent controls."); - - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - stop(); - } - - @Override - public void selectCard(Card c, PlayerZone zone) { - //must target creature you control - if (index[0] == 0 && !c.getController().equals(card.getController())) return; - - //must target creature you don't control - if (index[0] == 1 && c.getController().equals(card.getController())) return; - - - if (c.isLand() && zone.is(Constant.Zone.Battlefield) && CardFactoryUtil.canTarget(card, c)) { - //System.out.println("c is: " +c); - target[index[0]] = c; - index[0]++; - showMessage(); - - if (index[0] == target.length) { - AllZone.getStack().add(ability); - stop(); - } - } - }//selectCard() - };//Input - - Command comesIntoPlay = new Command() { - private static final long serialVersionUID = 6513203926272187582L; - - public void execute() { - index[0] = 0; - if (card.getController().isHuman()) AllZone.getInputControl().setInput(input); - } - }; - - StringBuilder sb = new StringBuilder(); - sb.append(cardName).append(" - Exchange control of target land you control and target land an opponent controls."); - ability.setStackDescription(sb.toString()); - - card.addComesIntoPlayCommand(comesIntoPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Wojek Embermage")) { - Cost abCost = new Cost("T", cardName, true); - Target tgt = new Target(card, "TgtC"); - final Ability_Activated ability = new Ability_Activated(card, abCost, tgt) { - private static final long serialVersionUID = -1208482961653326721L; - - @Override - public boolean canPlayAI() { - return (CardFactoryUtil.AI_getHumanCreature(1, card, true).size() != 0) - && (AllZone.getPhase().getPhase().equals(Constant.Phase.Main2)); - } - - @Override - public void chooseTargetAI() { - CardList list = CardFactoryUtil.AI_getHumanCreature(1, card, true); - list.shuffle(); - setTargetCard(list.get(0)); - } - - @Override - public void resolve() { - if (AllZoneUtil.isCardInPlay(getTargetCard()) - && CardFactoryUtil.canTarget(card, getTargetCard())) { - CardList list = getRadiance(getTargetCard()); - for (int i = 0; i < list.size(); i++) { - list.get(i).addDamage(1, card); - } - } - }//resolve() - - //parameter Card c, is included in CardList - //no multi-colored cards - CardList getRadiance(Card c) { - if (CardUtil.getColors(c).contains(Constant.Color.Colorless)) { - CardList list = new CardList(); - list.add(c); - return list; - } - - CardList sameColor = new CardList(); - CardList list = AllZoneUtil.getCreaturesInPlay(); - - for (int i = 0; i < list.size(); i++) - if (list.get(i).sharesColorWith(c)) sameColor.add(list.get(i)); - - return sameColor; - } - - };//SpellAbility - card.addSpellAbility(ability); - ability.setDescription("Radiance - " + abCost + cardName + " deals 1 damage to target creature and each other creature that shares a color with it."); - - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Adarkar Valkyrie")) { - //tap ability - no cost - target creature - EOT - - final Card[] target = new Card[1]; - - final Command destroy = new Command() { - private static final long serialVersionUID = -2433442359225521472L; - - public void execute() { - - AllZone.getStack().addSimultaneousStackEntry(new Ability(card, "0", "Adarkar Valkyrie - Return " + target[0] + " from graveyard to the battlefield") { - @Override - public void resolve() { - PlayerZone grave = AllZone.getZone(target[0]); - //checks to see if card is still in the graveyard - - if (grave != null && AllZoneUtil.isCardInZone(grave, target[0])) { - PlayerZone play = AllZone.getZone(Constant.Zone.Battlefield, card.getController()); - target[0].setController(card.getController()); - AllZone.getGameAction().moveTo(play, target[0]); - } - } - }); - }//execute() - }; - - final Command untilEOT = new Command() { - private static final long serialVersionUID = 2777978927867867610L; - - public void execute() { - //resets the Card destroy Command - target[0].removeDestroyCommand(destroy); - } - }; - - Cost abCost = new Cost("T", cardName, true); - Target tgt = new Target(card, "Target creature other than " + cardName, "Creature.Other".split(",")); - final Ability_Activated ability = new Ability_Activated(card, abCost, tgt) { - private static final long serialVersionUID = -8454685126878522607L; - - @Override - public void resolve() { - if (AllZoneUtil.isCardInPlay(getTargetCard())) { - target[0] = getTargetCard(); - - if (!target[0].isToken()) { // not necessary, but will help speed up stack resolution - AllZone.getEndOfTurn().addUntil(untilEOT); - target[0].addDestroyCommand(destroy); - } - }//if - }//resolve() - - @Override - public boolean canPlayAI() { - return false; - } - };//SpellAbility - - card.addSpellAbility(ability); - - StringBuilder sb = new StringBuilder(); - sb.append("tap: When target creature other than Adarkar Valkyrie is put into a "); - sb.append("graveyard this turn, return that card to the battlefield under your control."); - ability.setDescription(sb.toString()); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Painter's Servant")) { - final long[] timeStamp = new long[1]; - final String[] color = new String[1]; - - Command comesIntoPlay = new Command() { - private static final long serialVersionUID = 333134223161L; - - public void execute() { - if (card.getController().isHuman()) { - String[] colors = Constant.Color.onlyColors; - - Object o = GuiUtils.getChoice("Choose color", colors); - color[0] = (String) o; - card.setChosenColor(color[0]); - } else { - // AI chooses the color that appears in the keywords of the most cards in its deck, hand and on battlefield - CardList list = new CardList(); - list.addAll(AllZoneUtil.getPlayerCardsInLibrary(AllZone.getComputerPlayer())); - list.addAll(AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer())); - list.addAll(AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer())); - - color[0] = Constant.Color.White; - int max = list.getKeywordsContain(color[0]).size(); - - String[] colors = {Constant.Color.Blue, Constant.Color.Black, Constant.Color.Red, Constant.Color.Green}; - for (String c : colors) { - int cmp = list.getKeywordsContain(c).size(); - if (cmp > max) { - max = cmp; - color[0] = c; - } - } - card.setChosenColor(color[0]); - } - - String s = CardUtil.getShortColor(color[0]); - timeStamp[0] = AllZone.getGameInfo().addColorChanges(s, card, true, true); - } - };//Command - - Command leavesBattlefield = new Command() { - private static final long serialVersionUID = 2559212590399132459L; - - public void execute() { - String s = CardUtil.getShortColor(color[0]); - AllZone.getGameInfo().removeColorChanges(s, card, true, timeStamp[0]); - } - }; - - card.addComesIntoPlayCommand(comesIntoPlay); - card.addLeavesPlayCommand(leavesBattlefield); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Stangg")) { - - final Ability ability = new Ability(card, "0") { - @Override - public void resolve() { - CardList cl = CardFactoryUtil.makeToken("Stangg Twin", "RG 3 4 Stangg Twin", card.getController(), "R G", - new String[]{"Legendary", "Creature", "Human", "Warrior"}, 3, 4, new String[]{""}); - - cl.get(0).addLeavesPlayCommand(new Command() { - private static final long serialVersionUID = 3367390368512271319L; - - public void execute() { - if (AllZoneUtil.isCardInPlay(card)) AllZone.getGameAction().sacrifice(card); - } - }); - } - }; - ability.setStackDescription("When Stangg enters the battlefield, if Stangg is on the battlefield, put a legendary 3/4 red and green Human Warrior creature token named Stangg Twin onto the battlefield."); - - card.addComesIntoPlayCommand(new Command() { - private static final long serialVersionUID = 6667896040611028600L; - - public void execute() { - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - }); - - card.addLeavesPlayCommand(new Command() { - private static final long serialVersionUID = 1786900359843939456L; - - public void execute() { - CardList list = AllZoneUtil.getCardsInPlay("Stangg Twin"); - - if (list.size() == 1) AllZone.getGameAction().exile(list.get(0)); - } - }); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Horde of Notions")) { - final Ability ability = new Ability(card, "W U B R G") { - @Override - public void resolve() { - Card c = null; - if (card.getController().isHuman()) { - Object o = GuiUtils.getChoiceOptional("Select Elemental", getCreatures()); - c = (Card) o; - - } else { - c = getAIElemental(); - } - - if (AllZoneUtil.isCardInPlayerGraveyard(card.getController(), c)) { - PlayerZone play = AllZone.getZone(Constant.Zone.Battlefield, c.getController()); - AllZone.getGameAction().moveTo(play, c); - } - }//resolve() - - @Override - public boolean canPlay() { - return getCreatures().size() != 0 && AllZoneUtil.isCardInPlay(card) && super.canPlay(); - } - - public CardList getCreatures() { - CardList creatures = AllZoneUtil.getPlayerTypeInGraveyard(card.getController(), "Elemental"); - return creatures; - } - - public Card getAIElemental() { - CardList c = getCreatures(); - Card biggest = c.get(0); - for (int i = 0; i < c.size(); i++) - if (biggest.getNetAttack() < c.get(i).getNetAttack()) biggest = c.get(i); - - return biggest; - } - };//SpellAbility - card.addSpellAbility(ability); - - ability.setDescription("W U B R G: You may play target Elemental card from your graveyard without paying its mana cost."); - ability.setStackDescription("Horde of Notions - play Elemental card from graveyard without paying its mana cost."); - ability.setBeforePayMana(new Input_PayManaCost(ability)); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Rhys the Redeemed")) { - - Cost abCost = new Cost("4 GW GW T", card.getName(), true); - final Ability_Activated copyTokens1 = new Ability_Activated(card, abCost, null) { - private static final long serialVersionUID = 6297992502069547478L; - - @Override - public void resolve() { - CardList allTokens = AllZoneUtil.getCreaturesInPlay(card.getController()); - allTokens = allTokens.filter(AllZoneUtil.token); - - int multiplier = AllZoneUtil.getDoublingSeasonMagnitude(card.getController()); - - for (int i = 0; i < allTokens.size(); i++) { - Card c = allTokens.get(i); - for (int j = 0; j < multiplier; j++) - copyToken(c); - } - } - - public void copyToken(Card token) { - Card copy = new Card(); - copy.setName(token.getName()); - copy.setImageName(token.getImageName()); - - copy.setOwner(token.getController()); - copy.setController(token.getController()); - copy.setManaCost(token.getManaCost()); - copy.setColor(token.getColor()); - copy.setToken(true); - copy.setType(token.getType()); - copy.setBaseAttack(token.getBaseAttack()); - copy.setBaseDefense(token.getBaseDefense()); - - AllZone.getGameAction().moveToPlay(copy); - } - - @Override - public boolean canPlayAI() { - CardList allTokens = AllZoneUtil.getCreaturesInPlay(AllZone.getComputerPlayer()); - allTokens = allTokens.filter(AllZoneUtil.token); - - return allTokens.size() >= 2; - } - }; - - card.addSpellAbility(copyTokens1); - copyTokens1.setDescription(abCost + "For each creature token you control, put a token that's a copy of that creature onto the battlefield."); - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - For each creature token you control, put a token that's a copy of that creature onto the battlefield."); - copyTokens1.setStackDescription(sb.toString()); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Treva, the Renewer")) { - final Player player = card.getController(); - - final Ability ability2 = new Ability(card, "2 W") { - @Override - public void resolve() { - int lifeGain = 0; - if (card.getController().isHuman()) { - String choices[] = {"white", "blue", "black", "red", "green"}; - Object o = GuiUtils.getChoiceOptional("Select Color: ", choices); - Log.debug("Treva, the Renewer", "Color:" + o); - lifeGain = CardFactoryUtil.getNumberOfPermanentsByColor((String) o); - - } else { - CardList list = AllZoneUtil.getCardsInPlay(); - String color = CardFactoryUtil.getMostProminentColor(list); - lifeGain = CardFactoryUtil.getNumberOfPermanentsByColor(color); - } - - card.getController().gainLife(lifeGain, card); - } - - @Override - public boolean canPlay() { - //this is set to false, since it should only TRIGGER - return false; - } - };// ability2 - //card.clearSpellAbility(); - card.addSpellAbility(ability2); - - StringBuilder sb2 = new StringBuilder(); - sb2.append(card.getName()).append(" - ").append(player); - sb2.append(" gains life equal to permanents of the chosen color."); - ability2.setStackDescription(sb2.toString()); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Rith, the Awakener")) { - final Player player = card.getController(); - - final Ability ability2 = new Ability(card, "2 G") { - @Override - public void resolve() { - int numberTokens = 0; - if (card.getController().isHuman()) { - String choices[] = {"white", "blue", "black", "red", "green"}; - Object o = GuiUtils.getChoiceOptional("Select Color: ", choices); - //System.out.println("Color:" + o); - numberTokens = CardFactoryUtil.getNumberOfPermanentsByColor((String) o); - } else { - CardList list = AllZoneUtil.getCardsInPlay(); - String color = CardFactoryUtil.getMostProminentColor(list); - numberTokens = CardFactoryUtil.getNumberOfPermanentsByColor(color); - } - - for (int i = 0; i < numberTokens; i++) { - CardFactoryUtil.makeTokenSaproling(card.getController()); - } - } - - @Override - public boolean canPlay() { - //this is set to false, since it should only TRIGGER - return false; - } - };// ability2 - //card.clearSpellAbility(); - card.addSpellAbility(ability2); - - StringBuilder sb2 = new StringBuilder(); - sb2.append(card.getName()).append(" - ").append(player); - sb2.append(" puts a 1/1 green Saproling creature token onto the battlefield for each permanent of the chosen color"); - ability2.setStackDescription(sb2.toString()); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Sphinx of Jwar Isle")) { - final SpellAbility ability1 = new Ability(card, "0") { - @Override - public void resolve() { - Player player = card.getController(); - PlayerZone lib = AllZone.getZone(Constant.Zone.Library, player); - - if (lib.size() < 1) return; - - CardList cl = new CardList(); - cl.add(lib.get(0)); - - GuiUtils.getChoiceOptional("Top card", cl.toArray()); - } - - @Override - public boolean canPlayAI() { - return false; - } - };//SpellAbility - - StringBuilder sb1 = new StringBuilder(); - sb1.append(card.getName()).append(" - look at top card of library."); - ability1.setStackDescription(sb1.toString()); - - ability1.setDescription("You may look at the top card of your library."); - card.addSpellAbility(ability1); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Master of the Wild Hunt")) { - - final Cost abCost = new Cost("T", cardName, true); - final Target abTgt = new Target(card, "Target a creature to Hunt", "Creature".split(",")); - final Ability_Activated ability = new Ability_Activated(card, abCost, abTgt) { - private static final long serialVersionUID = 35050145102566898L; - - @Override - public boolean canPlayAI() { - CardList wolves = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - wolves = wolves.getType("Wolf"); - - wolves = wolves.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isUntapped() && c.isCreature(); - } - }); - int power = 0; - for (int i = 0; i < wolves.size(); i++) - power += wolves.get(i).getNetAttack(); - - if (power == 0) - return false; - - final int totalPower = power; - - CardList targetables = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - - targetables = targetables.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CardFactoryUtil.canTarget(card, c) && c.isCreature() && c.getNetDefense() <= totalPower; - } - }); - - if (targetables.size() == 0) - return false; - - getTarget().resetTargets(); - setTargetCard(CardFactoryUtil.AI_getBestCreature(targetables)); - - return true; - } - - @Override - public void resolve() { - CardList wolves = AllZoneUtil.getPlayerCardsInPlay(card.getController()); - wolves = wolves.getType("Wolf"); - - wolves = wolves.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isUntapped() && c.isCreature(); - } - }); - - final Card target = getTargetCard(); - - if (wolves.size() == 0) - return; - - if (!(CardFactoryUtil.canTarget(card, target) && AllZoneUtil.isCardInPlay(target))) - return; - - for (Card c : wolves) { - c.tap(); - target.addDamage(c.getNetAttack(), c); - } - - if (target.getController().isHuman()) { // Human choose spread damage - for (int x = 0; x < target.getNetAttack(); x++) { - AllZone.getInputControl().setInput(CardFactoryUtil.MasteroftheWildHunt_input_targetCreature(this, wolves, new Command() { - private static final long serialVersionUID = -328305150127775L; - - public void execute() { - getTargetCard().addDamage(1, target); - AllZone.getGameAction().checkStateEffects(); - } - })); - } - } else { // AI Choose spread Damage - CardList damageableWolves = wolves.filter(new CardListFilter() { - public boolean addCard(Card c) { - return (c.predictDamage(target.getNetAttack(), target, false) > 0); - } - }); - - if (damageableWolves.size() == 0) // don't bother if I can't damage anything - return; - - CardList wolvesLeft = damageableWolves.filter(new CardListFilter() { - public boolean addCard(Card c) { - return !c.hasKeyword("Indestructible"); - } - }); - - for (int i = 0; i < target.getNetAttack(); i++) { - wolvesLeft = wolvesLeft.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getKillDamage() > 0 && (c.getKillDamage() <= target.getNetAttack() - || target.hasKeyword("Deathtouch")); - } - }); - - // Kill Wolves that can be killed first - if (wolvesLeft.size() > 0) { - Card best = CardFactoryUtil.AI_getBestCreature(wolvesLeft); - best.addDamage(1, target); - if (best.getKillDamage() <= 0 || target.hasKeyword("Deathtouch")) { - wolvesLeft.remove(best); - } - } else { - // Add -1/-1s to Random Indestructibles - if (target.hasKeyword("Infect") || target.hasKeyword("Wither")) { - CardList indestructibles = damageableWolves.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.hasKeyword("Indestructible"); - } - }); - indestructibles.shuffle(); - indestructibles.get(0).addDamage(1, target); - } - - // Then just add Damage randomnly - - else { - damageableWolves.shuffle(); - wolves.get(0).addDamage(1, target); - } - } - } - } - }//resolve() - };//SpellAbility - - StringBuilder sb = new StringBuilder(); - sb.append("Tap: Tap all untapped Wolf creatures you control. Each Wolf tapped "); - sb.append("this way deals damage equal to its power to target creature. That creature deals "); - sb.append("damage equal to its power divided as its controller chooses among any number of those Wolves."); - ability.setDescription(sb.toString()); - - card.addSpellAbility(ability); - }//*************** END ************ END ************************** - -/* - //*************** START *********** START ************************** - else if (cardName.equals("Figure of Destiny")) { - Ability ability1 = new Ability(card, "RW") { - @Override - public void resolve() { - boolean artifact = false; - card.setBaseAttack(2); - card.setBaseDefense(2); - - card.removeIntrinsicKeyword("Flying"); - card.removeIntrinsicKeyword("First Strike"); - - if (card.isArtifact()) artifact = true; - - card.setType(new ArrayList()); - if (artifact) card.addType("Artifact"); - card.addType("Creature"); - card.addType("Kithkin"); - card.addType("Spirit"); - } - - @Override - public boolean canPlayAI() { - return !card.isType("Spirit") - && super.canPlayAI(); - } - - };// ability1 - - ability1.setDescription("RW: Figure of Destiny becomes a 2/2 Kithkin Spirit."); - ability1.setStackDescription("Figure of Destiny becomes a 2/2 Kithkin Spirit."); - card.addSpellAbility(ability1); - - - Ability ability2 = new Ability(card, "RW RW RW") { - @Override - public void resolve() { - if (card.isType("Spirit")) { - boolean artifact = false; - card.setBaseAttack(4); - card.setBaseDefense(4); - - card.removeIntrinsicKeyword("Flying"); - card.removeIntrinsicKeyword("First Strike"); - - if (card.isArtifact()) artifact = true; - - card.setType(new ArrayList()); - if (artifact) card.addType("Artifact"); - card.addType("Creature"); - card.addType("Kithkin"); - card.addType("Spirit"); - card.addType("Warrior"); - } - } - - @Override - public boolean canPlay() { - return card.isType("Spirit") - && super.canPlay(); - } - - @Override - public boolean canPlayAI() { - return !card.isType("Warrior") - && super.canPlayAI(); - } - - };// ability2 - - ability2.setDescription("RW RW RW: If Figure of Destiny is a Spirit, it becomes a 4/4 Kithkin Spirit Warrior."); - ability2.setStackDescription("Figure of Destiny becomes a 4/4 Kithkin Spirit Warrior."); - card.addSpellAbility(ability2); - - - Ability ability3 = new Ability(card, "RW RW RW RW RW RW") { - @Override - public void resolve() { - if (card.isType("Warrior")) { - boolean artifact = false; - card.setBaseAttack(8); - card.setBaseDefense(8); - - card.addIntrinsicKeyword("Flying"); - card.addIntrinsicKeyword("First Strike"); - - if (card.isArtifact()) artifact = true; - - card.setType(new ArrayList()); - if (artifact) card.addType("Artifact"); - card.addType("Creature"); - card.addType("Kithkin"); - card.addType("Spirit"); - card.addType("Warrior"); - card.addType("Avatar"); - } - } - - @Override - public boolean canPlay() { - return card.isType("Warrior") - && super.canPlay(); - } - - @Override - public boolean canPlayAI() { - return !card.isType("Avatar") - && super.canPlayAI(); - } - };// ability3 - - StringBuilder sbDesc = new StringBuilder(); - sbDesc.append("RW RW RW RW RW RW: If Figure of Destiny is a Warrior, it becomes "); - sbDesc.append("an 8/8 Kithkin Spirit Warrior Avatar with flying and first strike."); - ability3.setDescription(sbDesc.toString()); - - ability3.setStackDescription("Figure of Destiny becomes an 8/8 Kithkin Spirit Warrior Avatar with flying and first strike."); - card.addSpellAbility(ability3); - }//*************** END ************ END ************************** - -*/ - //*************** START *********** START ************************** - else if (cardName.equals("Cantivore")) { - SpellAbility spell = new Spell_Permanent(card) { - private static final long serialVersionUID = 7254358703158629514L; - - @Override - public boolean canPlayAI() { - CardList list = AllZoneUtil.getPlayerGraveyard(AllZone.getComputerPlayer()); - list.addAll(AllZoneUtil.getPlayerGraveyard(AllZone.getHumanPlayer())); - list = list.getType("Enchantment"); - return super.canPlayAI() && list.size() > 0; - } - }; - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpell(); - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Terravore")) { - SpellAbility spell = new Spell_Permanent(card) { - private static final long serialVersionUID = 7316190829288665283L; - - @Override - public boolean canPlayAI() { - CardList list = AllZoneUtil.getPlayerGraveyard(AllZone.getComputerPlayer()); - list.addAll(AllZoneUtil.getPlayerGraveyard(AllZone.getHumanPlayer())); - list = list.getType("Land"); - return super.canPlayAI() && list.size() > 0; - } - }; - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpell(); - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Mortivore")) { - SpellAbility spell = new Spell_Permanent(card) { - private static final long serialVersionUID = -7118801410173525870L; - - @Override - public boolean canPlayAI() { - CardList list = AllZoneUtil.getPlayerGraveyard(AllZone.getComputerPlayer()); - list.addAll(AllZoneUtil.getPlayerGraveyard(AllZone.getHumanPlayer())); - list = list.getType("Creature"); - return super.canPlayAI() && list.size() > 0; - } - }; - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpell(); - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Cognivore")) { - SpellAbility spell = new Spell_Permanent(card) { - private static final long serialVersionUID = -2216181341715046786L; - - @Override - public boolean canPlayAI() { - CardList list = AllZoneUtil.getPlayerGraveyard(AllZone.getComputerPlayer()); - list.addAll(AllZoneUtil.getPlayerGraveyard(AllZone.getHumanPlayer())); - list = list.getType("Instant"); - return super.canPlayAI() && list.size() > 0; - } - }; - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpell(); - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Magnivore")) { - SpellAbility spell = new Spell_Permanent(card) { - private static final long serialVersionUID = -2252263708643462897L; - - @Override - public boolean canPlayAI() { - CardList list = AllZoneUtil.getPlayerGraveyard(AllZone.getComputerPlayer()); - list.addAll(AllZoneUtil.getPlayerGraveyard(AllZone.getHumanPlayer())); - list = list.getType("Sorcery"); - return super.canPlayAI() && list.size() > 0; - } - }; - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpell(); - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Shifting Wall") || cardName.equals("Maga, Traitor to Mortals") || cardName.equals("Feral Hydra") - || cardName.equals("Krakilin") || cardName.equals("Ivy Elemental") || cardName.equals("Lightning Serpent")) { - - SpellAbility spell = new Spell_Permanent(card) { - private static final long serialVersionUID = 7708945715867177172L; - - @Override - public boolean canPlayAI() { - return super.canPlay() && 4 <= ComputerUtil.getAvailableMana().size() - CardUtil.getConvertedManaCost(card.getManaCost()); - } - }; - card.clearFirstSpell(); - card.addFirstSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Apocalypse Hydra")) { - SpellAbility spell = new Spell_Permanent(card) { - private static final long serialVersionUID = -11489323313L; - - @Override - public boolean canPlayAI() { - return super.canPlay() && 5 <= ComputerUtil.getAvailableMana().size() - 2; - } - - @Override - public void resolve() { - int XCounters = card.getXManaCostPaid(); - Card c = AllZone.getGameAction().moveToPlay(getSourceCard()); - - if (XCounters >= 5) XCounters = 2 * XCounters; - c.addCounter(Counters.P1P1, XCounters); - } - }; - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpell(); - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Molten Hydra")) { - Target target = new Target(card, "TgtCP"); - Cost abCost = new Cost("T", cardName, true); - final Ability_Activated ability2 = new Ability_Activated(card, abCost, target) { - private static final long serialVersionUID = 2626619319289064289L; - - @Override - public boolean canPlay() { - return card.getCounters(Counters.P1P1) > 0 && super.canPlay(); - } - - @Override - public boolean canPlayAI() { - return getCreature().size() != 0; - } - - @Override - public void chooseTargetAI() { - if (AllZone.getHumanPlayer().getLife() < card.getCounters(Counters.P1P1)) - setTargetPlayer(AllZone.getHumanPlayer()); - else { - CardList list = getCreature(); - list.shuffle(); - setTargetCard(list.get(0)); - } - }//chooseTargetAI() - - CardList getCreature() { - - //toughness of 1 - CardList list = CardFactoryUtil.AI_getHumanCreature(card.getCounters(Counters.P1P1), card, true); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - int total = card.getCounters(Counters.P1P1); - return (total >= c.getKillDamage()); - } - }); - return list; - }//getCreature() - - @Override - public void resolve() { - int total = card.getCounters(Counters.P1P1); - if (getTargetCard() != null) { - if (AllZoneUtil.isCardInPlay(getTargetCard()) - && CardFactoryUtil.canTarget(card, getTargetCard())) getTargetCard().addDamage(total, - card); - } else getTargetPlayer().addDamage(total, card); - card.subtractCounter(Counters.P1P1, total); - }//resolve() - };//SpellAbility - - card.addSpellAbility(ability2); - - StringBuilder sb = new StringBuilder(); - sb.append(abCost + "Remove all +1/+1 counters from " + cardName + ": " + cardName); - sb.append(" deals damage to target creature or player equal to the number of +1/+1 counters removed this way."); - ability2.setDescription(sb.toString()); - - ability2.setStackDescription("Molten Hydra deals damage to number of +1/+1 counters on it to target creature or player."); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Academy Rector") || cardName.equals("Lost Auramancers")) { - final SpellAbility ability = new Ability(card, "0") { - - @Override - public void resolve() { - - if (card.getController().isHuman()) { - StringBuilder question = new StringBuilder(); - if (card.getName().equals("Academy Rector")) { - question.append("Exile ").append(card.getName()).append(" and place "); - } else { - question.append("Place "); - } - question.append("an enchantment from your library onto the battlefield?"); - - if (GameActionUtil.showYesNoDialog(card, question.toString())) { - if (card.getName().equals("Academy Rector")) { - AllZone.getGameAction().exile(card); - } - CardList list = AllZoneUtil.getPlayerCardsInLibrary(AllZone.getHumanPlayer()); - list = list.getType("Enchantment"); - - if (list.size() > 0) { - Object objectSelected = GuiUtils.getChoiceOptional("Choose an enchantment", list.toArray()); - - if (objectSelected != null) { - - final Card c = (Card) objectSelected; - AllZone.getGameAction().moveToPlay(c); - - if (c.isAura()) { - - String enchantThisType[] = {""}; - String message[] = {""}; - - // The type following "Enchant" maybe upercase or lowercase, cardsfolder has both - // Note that I am being overly cautious. - - if (c.hasKeyword("Enchant creature without flying") - || c.hasKeyword("Enchant Creature without flying")) { - enchantThisType[0] = "Creature.withoutFlying"; - message[0] = "Select a creature without flying"; - } else if (c.hasKeyword("Enchant creature with converted mana cost 2 or less") - || c.hasKeyword("Enchant Creature with converted mana cost 2 or less")) { - enchantThisType[0] = "Creature.cmcLE2"; - message[0] = "Select a creature with converted mana cost 2 or less"; - } else if (c.hasKeyword("Enchant red or green creature")) { - enchantThisType[0] = "Creature.Red,Creature.Green"; - message[0] = "Select a red or green creature"; - } else if (c.hasKeyword("Enchant tapped creature")) { - enchantThisType[0] = "Creature.tapped"; - message[0] = "Select a tapped creature"; - } else if (c.hasKeyword("Enchant creature") - || c.hasKeyword("Enchant Creature")) { - enchantThisType[0] = "Creature"; - message[0] = "Select a creature"; - } else if (c.hasKeyword("Enchant wall") - || c.hasKeyword("Enchant Wall")) { - enchantThisType[0] = "Wall"; - message[0] = "Select a Wall"; - } else if (c.hasKeyword("Enchant land you control") - || c.hasKeyword("Enchant Land you control")) { - enchantThisType[0] = "Land.YouCtrl"; - message[0] = "Select a land you control"; - } else if (c.hasKeyword("Enchant land") - || c.hasKeyword("Enchant Land")) { - enchantThisType[0] = "Land"; - message[0] = "Select a land"; - } else if (c.hasKeyword("Enchant artifact") - || c.hasKeyword("Enchant Artifact")) { - enchantThisType[0] = "Artifact"; - message[0] = "Select an artifact"; - } else if (c.hasKeyword("Enchant enchantment") - || c.hasKeyword("Enchant Enchantment")) { - enchantThisType[0] = "Enchantment"; - message[0] = "Select an enchantment"; - } - - CardList allCards = AllZoneUtil.getCardsInPlay(); - - // Make sure that we were able to match the selected aura with our list of criteria - - if (enchantThisType[0] != "" && message[0] != "") { - - final CardList choices = allCards.getValidCards(enchantThisType[0], card.getController(), card); - final String msg = message[0]; - - AllZone.getInputControl().setInput(new Input() { - private static final long serialVersionUID = -6271957194091955059L; - - @Override - public void showMessage() { - AllZone.getDisplay().showMessage(msg); - ButtonUtil.enableOnlyOK(); - } - - @Override - public void selectButtonOK() { - stop(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (choices.contains(card)) { - - if (AllZoneUtil.isCardInPlay(card)) { - c.enchantCard(card); - stop(); - } - } - }//selectCard() - });// Input() - - }// if we were able to match the selected aura with our list of criteria - }// If enchantment selected is an aura - }// If an enchantment is selected - }// If there are enchantments in library - - card.getController().shuffle(); - }// If answered yes to may exile - }// If player is human - - // player is the computer - else { - CardList list = AllZoneUtil.getPlayerCardsInLibrary(AllZone.getComputerPlayer()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isEnchantment() && !c.isAura(); - } - }); - - if (list.size() > 0) { - Card c = CardFactoryUtil.AI_getBestEnchantment(list, card, false); - - AllZone.getGameAction().moveToPlay(c); - if (card.getName().equals("Academy Rector")) { - AllZone.getGameAction().exile(card); - } - card.getController().shuffle(); - } - }// player is the computer - }// resolve() - };// ability - - StringBuilder sb = new StringBuilder(); - if (card.getName().equals("Academy Rector")) { - sb.append("Academy Rector - ").append(card.getController()); - sb.append(" may exile this card and place an enchantment from his library onto the battlefield."); - } else { - sb.append("Lost Auramancers - ").append(card.getController()); - sb.append(" may place an enchantment from his library onto the battlefield."); - } - ability.setStackDescription(sb.toString()); - - final Command destroy = new Command() { - private static final long serialVersionUID = -4352349741511065318L; - - public void execute() { - - if (card.getName().equals("Lost Auramancers") - && card.getCounters(Counters.TIME) <= 0) { - AllZone.getStack().addSimultaneousStackEntry(ability); - - } else if (card.getName().equals("Academy Rector")) { - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - - }// execute() - };// Command destroy - - card.addDestroyCommand(destroy); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Deadly Grub")) { - final Command destroy = new Command() { - private static final long serialVersionUID = -4352349741511065318L; - - public void execute() { - if (card.getCounters(Counters.TIME) <= 0) CardFactoryUtil.makeToken("Insect", "G 6 1 Insect", - card.getController(), "G", new String[]{"Creature", "Insect"}, 6, 1, new String[]{"Shroud"}); - } - }; - - card.addDestroyCommand(destroy); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Meddling Mage")) { - final String[] input = new String[1]; - final Ability ability = new Ability(card, "0") { - @Override - public void resolve() { - if (card.getController().isHuman()) { - input[0] = JOptionPane.showInputDialog(null, "Which card?", "Pick card", - JOptionPane.QUESTION_MESSAGE); - card.setNamedCard(input[0]); - } else { - String s = "Ancestral Recall"; - - CardList list = new CardList(); - list.addAll(AllZoneUtil.getPlayerHand(AllZone.getHumanPlayer())); - list.addAll(AllZoneUtil.getPlayerCardsInLibrary(AllZone.getHumanPlayer())); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return !c.isLand() && !c.isUnCastable(); - } - }); - - if (list.size() > 0) { - CardList rare; - rare = list; - rare = rare.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getRarity().equals("Rare"); - } - }); - - if (rare.size() > 0) { - s = rare.get(CardUtil.getRandomIndex(rare)).getName(); - } else { - Card c = list.get(CardUtil.getRandomIndex(list)); - //System.out.println(c + " - " + c.getRarity()); - s = c.getName(); - } - } - - card.setNamedCard(s); - - } - - } - }; - Command comesIntoPlay = new Command() { - private static final long serialVersionUID = 8485080996453793968L; - - public void execute() { - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - };//Command - ability.setStackDescription("As Meddling Mage enters the battlefield, name a nonland card."); - card.addComesIntoPlayCommand(comesIntoPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Iona, Shield of Emeria")) { - Command comesIntoPlay = new Command() { - private static final long serialVersionUID = 3331342605626623161L; - - public void execute() { - if (card.getController().isHuman()) { - - String color = ""; - String[] colors = Constant.Color.Colors; - colors[colors.length - 1] = null; - - Object o = GuiUtils.getChoice("Choose color", colors); - color = (String) o; - card.setChosenColor(color); - } else { - CardList list = new CardList(); - list.addAll(AllZoneUtil.getPlayerCardsInLibrary(AllZone.getHumanPlayer())); - list.addAll(AllZoneUtil.getPlayerHand(AllZone.getHumanPlayer())); - - if (list.size() > 0) { - String color = CardFactoryUtil.getMostProminentColor(list); - if (!color.equals("")) card.setChosenColor(color); - else card.setChosenColor("black"); - } else { - card.setChosenColor("black"); - } - } - } - };//Command - card.addComesIntoPlayCommand(comesIntoPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Singe-Mind Ogre")) { - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() { - Player opponent = card.getController().getOpponent(); - CardList handChoices = AllZoneUtil.getPlayerHand(opponent); - if (handChoices.size() > 0) { - Card random = CardUtil.getRandom(handChoices.toArray()); - CardList reveal = new CardList(random); - GuiUtils.getChoice("Random card", reveal); - opponent.loseLife(CardUtil.getConvertedManaCost(random.getManaCost()), card); - } - }//resolve() - }; - Command intoPlay = new Command() { - - private static final long serialVersionUID = -4833144157620224716L; - - public void execute() { - ability.setStackDescription("When CARDNAME enters the battlefield, target player reveals a card at random from his or her hand, then loses life equal to that card's converted mana cost."); - AllZone.getStack().addSimultaneousStackEntry(ability); - } - }; - card.addComesIntoPlayCommand(intoPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Kinsbaile Borderguard")) { - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() { - card.addCounter(Counters.P1P1, countKithkin()); - //System.out.println("all counters: " +card.sumAllCounters()); - }//resolve() - - public int countKithkin() { - CardList kithkin = AllZoneUtil.getPlayerCardsInPlay(card.getController()); - kithkin = kithkin.filter(new CardListFilter() { - - public boolean addCard(Card c) { - return (c.isType("Kithkin") || c.hasKeyword("Changeling")) - && !c.equals(card); - } - - }); - return kithkin.size(); - - } - }; - Command intoPlay = new Command() { - private static final long serialVersionUID = -7067218066522935060L; - - public void execute() { - ability.setStackDescription("Kinsbaile Borderguard enters the battlefield with a +1/+1 counter on it for each other Kithkin you control."); - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - }; - - final SpellAbility ability2 = new Ability(card, "0") { - @Override - public void resolve() { - for (int i = 0; i < card.sumAllCounters(); i++) { - makeToken(); - } - }//resolve() - - public void makeToken() { - CardFactoryUtil.makeToken("Kithkin Soldier", "W 1 1 Kithkin Soldier", card.getController(), "W", new String[]{ - "Creature", "Kithkin", "Soldier"}, 1, 1, new String[]{""}); - } - }; - - Command destroy = new Command() { - private static final long serialVersionUID = 304026662487997331L; - - public void execute() { - ability2.setStackDescription("When Kinsbaile Borderguard is put into a graveyard from play, put a 1/1 white " + - "Kithkin Soldier creature token onto the battlefield for each counter on it."); - AllZone.getStack().addSimultaneousStackEntry(ability2); - - } - }; - - card.addComesIntoPlayCommand(intoPlay); - card.addDestroyCommand(destroy); - - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Arctic Nishoba")) { - final Ability ability = new Ability(card, "0") { - @Override - public void resolve() { - int lifeGain = card.getCounters(Counters.AGE) * 2; - card.getController().gainLife(lifeGain, card); - } - }; - - Command destroy = new Command() { - private static final long serialVersionUID = 1863551466234257411L; - - public void execute() { - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - gain 2 life for each age counter on it."); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - };//command - - card.addDestroyCommand(destroy); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Kavu Titan")) { - final SpellAbility kicker = new Spell(card) { - private static final long serialVersionUID = -1598664196463358630L; - - @Override - public void resolve() { - card.setKicked(true); - AllZone.getGameAction().moveToPlay(card); - } - - @Override - public boolean canPlay() { - return super.canPlay() && AllZone.getPhase().getPlayerTurn().equals(card.getController()) - && !AllZone.getPhase().getPhase().equals("End of Turn") - && !AllZoneUtil.isCardInPlay(card); - } - - }; - kicker.setKickerAbility(true); - kicker.setManaCost("3 G G"); - kicker.setAdditionalManaCost("2 G"); - kicker.setDescription("Kicker 2 G"); - - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - Creature 5/5 (Kicked)"); - kicker.setStackDescription(sb.toString()); - - card.addSpellAbility(kicker); - - final Ability ability = new Ability(card, "0") { - @Override - public void resolve() { - card.addCounter(Counters.P1P1, 3); - card.addIntrinsicKeyword("Trample"); - - card.setKicked(false); - } - }; - - Command commandComes = new Command() { - private static final long serialVersionUID = -2622859088591798773L; - - public void execute() { - if (card.isKicked()) { - ability.setStackDescription("Kavu Titan gets 3 +1/+1 counters and gains trample."); - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - }//execute() - };//CommandComes - - card.addComesIntoPlayCommand(commandComes); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Gnarlid Pack") || cardName.equals("Apex Hawks") || cardName.equals("Enclave Elite") || - cardName.equals("Quag Vampires") || cardName.equals("Skitter of Lizards") || - cardName.equals("Joraga Warcaller")) { - final Ability_Static ability = new Ability_Static(card, "0") { - @Override - public void resolve() { - card.addCounter(Counters.P1P1, card.getMultiKickerMagnitude()); - card.setMultiKickerMagnitude(0); - } - }; - StringBuilder sb = new StringBuilder(); - sb.append(cardName); - sb.append(" enters the battlefield with a +1/+1 counter on it for each time it was kicked."); - ability.setStackDescription(sb.toString()); - - final Command comesIntoPlay = new Command() { - private static final long serialVersionUID = 4245563898487609274L; - - public void execute() { - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - }; - card.addComesIntoPlayCommand(comesIntoPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Storm Entity")) { - final SpellAbility intoPlay = new Ability(card, "0") { - - @Override - public boolean canPlayAI() { - CardList human = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer()); - CardListUtil.sortAttack(human); - return (human.get(0).getNetAttack() < Phase.getStormCount() && Phase.getStormCount() > 1); - } - - @Override - public void resolve() { - for (int i = 0; i < Phase.getStormCount() - 1; i++) { - card.addCounter(Counters.P1P1, 1); - } - } - };//SpellAbility - - Command comesIntoPlay = new Command() { - private static final long serialVersionUID = -3734151854295L; - - public void execute() { - AllZone.getStack().addSimultaneousStackEntry(intoPlay); - - } - }; - - StringBuilder sb = new StringBuilder(); - sb.append(cardName).append(" - enters the battlefield with a +1/+1 counter on it for each other spell played this turn."); - intoPlay.setStackDescription(sb.toString()); - - card.addComesIntoPlayCommand(comesIntoPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Vampire Hexmage")) { - /* - * Sacrifice Vampire Hexmage: Remove all counters from target permanent. - */ - - Cost cost = new Cost("Sac<1/CARDNAME>", cardName, true); - final Target tgt = new Target(card, "Select a permanent", "Permanent".split(",")); - final SpellAbility ability = new Ability_Activated(card, cost, tgt) { - private static final long serialVersionUID = -5084369399105353155L; - - @Override - public boolean canPlayAI() { - - //Dark Depths: - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer(), "Dark Depths"); - list = list.filter(new CardListFilter() { - public boolean addCard(Card crd) { - return crd.getCounters(Counters.ICE) >= 3; - } - }); - - if (list.size() > 0) { - tgt.addTarget(list.get(0)); - return true; - } - - //Get rid of Planeswalkers: - list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card crd) { - return crd.isPlaneswalker() && crd.getCounters(Counters.LOYALTY) >= 5; - } - }); - - if (list.size() > 0) { - tgt.addTarget(list.get(0)); - return true; - } - - return false; - } - - @Override - public void resolve() { - final Card c = getTargetCard(); - for (Counters counter : Counters.values()) { - if (c.getCounters(counter) > 0) { - c.setCounter(counter, 0, false); - } - } - } - }; - card.addSpellAbility(ability); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Sutured Ghoul")) { - final int[] numCreatures = new int[1]; - final int[] sumPower = new int[1]; - final int[] sumToughness = new int[1]; - - Command intoPlay = new Command() { - private static final long serialVersionUID = -75234586897814L; - - public void execute() { - int intermSumPower, intermSumToughness; - intermSumPower = intermSumToughness = 0; - CardList creats = AllZoneUtil.getPlayerGraveyard(card.getController()); - creats = creats.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isCreature() && !c.equals(card); - } - }); - - if (card.getController().isHuman()) { - if (creats.size() > 0) { - List selection = GuiUtils.getChoicesOptional("Select creatures to sacrifice", creats.toArray()); - - numCreatures[0] = selection.size(); - for (int m = 0; m < selection.size(); m++) { - intermSumPower += selection.get(m).getBaseAttack(); - intermSumToughness += selection.get(m).getBaseDefense(); - AllZone.getGameAction().exile(selection.get(m)); - } - } - - }//human - else { - int count = 0; - for (int i = 0; i < creats.size(); i++) { - Card c = creats.get(i); - if (c.getNetAttack() <= 2 && c.getNetDefense() <= 3) { - intermSumPower += c.getBaseAttack(); - intermSumToughness += c.getBaseDefense(); - AllZone.getGameAction().exile(c); - count++; - } - //is this needed? - AllZone.getComputerBattlefield().updateObservers(); - } - numCreatures[0] = count; - } - sumPower[0] = intermSumPower; - sumToughness[0] = intermSumToughness; - card.setBaseAttack(sumPower[0]); - card.setBaseDefense(sumToughness[0]); - } - }; - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpell(); - card.addComesIntoPlayCommand(intoPlay); - card.addSpellAbility(new Spell_Permanent(card) { - private static final long serialVersionUID = 304885517082977723L; - - @Override - public boolean canPlayAI() { - //get all creatures - CardList list = AllZoneUtil.getPlayerGraveyard(AllZone.getComputerPlayer()); - list = list.filter(AllZoneUtil.creatures); - return 0 < list.size(); - } - }); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Nameless Race")) { - /* - * As Nameless Race enters the battlefield, pay any amount of life. - * The amount you pay can't be more than the total number of white - * nontoken permanents your opponents control plus the total number - * of white cards in their graveyards. - * Nameless Race's power and toughness are each equal to the life - * paid as it entered the battlefield. - */ - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() { - Player player = card.getController(); - Player opp = player.getOpponent(); - int max = 0; - CardList play = AllZoneUtil.getPlayerCardsInPlay(opp); - play = play.filter(AllZoneUtil.nonToken); - play = play.filter(AllZoneUtil.white); - max += play.size(); - - CardList grave = AllZoneUtil.getPlayerGraveyard(opp); - grave = grave.filter(AllZoneUtil.white); - max += grave.size(); - - String[] life = new String[max + 1]; - for (int i = 0; i <= max; i++) { - life[i] = String.valueOf(i); - } - - Object o = GuiUtils.getChoice("Nameless Race - pay X life", life); - String answer = (String) o; - int loseLife = 0; - try { - loseLife = Integer.parseInt(answer.trim()); - } catch (NumberFormatException nfe) { - System.out.println(card.getName() + " - NumberFormatException: " + nfe.getMessage()); - } - - card.setBaseAttack(loseLife); - card.setBaseDefense(loseLife); - - player.loseLife(loseLife, card); - }//resolve() - };//SpellAbility - - Command intoPlay = new Command() { - private static final long serialVersionUID = 931101364538995898L; - - public void execute() { - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - }; - - StringBuilder sb = new StringBuilder(); - sb.append(cardName).append(" - pay any amount of life."); - ability.setStackDescription(sb.toString()); - - card.addComesIntoPlayCommand(intoPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Banshee")) { - /* - * X, Tap: Banshee deals half X damage, rounded down, to target creature or - * player, and half X damage, rounded up, to you. - */ - - Cost abCost = new Cost("X T", cardName, true); - Target tgt = new Target(card, "TgtCP"); - - final Ability_Activated ability = new Ability_Activated(card, abCost, tgt) { - private static final long serialVersionUID = 2755743211116192949L; - - @Override - public void resolve() { - int x = card.getXManaCostPaid(); - if (getTargetPlayer() == null) { - getTargetCard().addDamage((int) Math.floor(x / 2.0), card); - } else { - getTargetPlayer().addDamage((int) Math.floor(x / 2.0), card); - } - card.getController().addDamage((int) Math.ceil(x / 2.0), card); - card.setXManaCostPaid(0); - }//resolve() - - @Override - public boolean canPlayAI() { - return false; - } - - };//SpellAbility - - ability.setDescription("X, tap: " + "Banshee deals half X damage, rounded down, to target creature or player, and half X damage, rounded up, to you."); - ability.setStackDescription(card.getName() + " - Banshee deals half X damage, rounded down, to target creature or player, and half X damage, rounded up, to you."); - card.addSpellAbility(ability); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Shapeshifter")) { - Command intoPlay = new Command() { - private static final long serialVersionUID = 5447692676152380940L; - - public void execute() { - if (!card.isToken()) { //ugly hack to get around tokens created by Crib Swap - int num = 0; - if (card.getController().isHuman()) { - String[] choices = new String[7]; - for (int j = 0; j < 7; j++) { - choices[j] = "" + j; - } - String answer = (String) (GuiUtils.getChoiceOptional( - card.getName() + " - Choose a number", choices)); - num = Integer.parseInt(answer); - } else { - num = 3; - } - card.setBaseAttack(num); - card.setBaseDefense(7 - num); - } - } - }; - - card.addComesIntoPlayCommand(intoPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Metalworker")) { - final Cost abCost = new Cost("T", card.getName(), true); - - final SpellAbility ability = new Ability_Activated(card, abCost, null) { - private static final long serialVersionUID = 6661308920885136284L; - - @Override - public boolean canPlayAI() { - //compy doesn't have a manapool - return false; - }//canPlayAI() - - @Override - public void resolve() { - AllZone.getInputControl().setInput(new Input() { - private static final long serialVersionUID = 6150236529653275947L; - CardList revealed = new CardList(); - - @Override - public void showMessage() { - //in case hand is empty, don't do anything - if (AllZoneUtil.getPlayerHand(card.getController()).size() == 0) stop(); - - AllZone.getDisplay().showMessage(card.getName() + " - Reveal an artifact. Revealed " + revealed.size() + " so far. Click OK when done."); - ButtonUtil.enableOnlyOK(); - } - - @Override - public void selectCard(Card c, PlayerZone zone) { - if (zone.is(Constant.Zone.Hand) && c.isArtifact() && !revealed.contains(c)) { - revealed.add(c); - - //in case no more cards in hand to reveal - if (revealed.size() == AllZoneUtil.getPlayerHand(card.getController()).size()) done(); - else - showMessage(); - } - } - - @Override - public void selectButtonOK() { - done(); - } - - void done() { - StringBuilder sb = new StringBuilder(); - for (Card reveal : revealed) sb.append(reveal.getName() + "\n"); - JOptionPane.showMessageDialog(null, "Revealed Cards:\n" + sb.toString(), card.getName(), JOptionPane.PLAIN_MESSAGE); - //adding mana - - Ability_Mana abMana = new Ability_Mana(card, "0", "1", 2 * revealed.size()) { - private static final long serialVersionUID = -2182129023960978132L; - }; - abMana.setUndoable(false); - abMana.produceMana(); - - stop(); - } - }); - }//resolve() - };//SpellAbility - - ability.setDescription(abCost + "Reveal any number of artifact cards in your hand. Add 2 to your mana pool for each card revealed this way."); - ability.setStackDescription(cardName + " - Reveal any number of artifact cards in your hand."); - card.addSpellAbility(ability); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Necratog")) { - final Command untilEOT = new Command() { - private static final long serialVersionUID = 6743592637334556854L; - - public void execute() { - if (AllZoneUtil.isCardInPlay(card)) { - card.addTempAttackBoost(-2); - card.addTempDefenseBoost(-2); - } - } - }; - - final SpellAbility ability = new Ability(card, "0") { - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public boolean canPlay() { - CardList grave = AllZoneUtil.getPlayerGraveyard(card.getController()); - grave = grave.filter(AllZoneUtil.creatures); - return super.canPlay() && grave.size() > 0; - } - - @Override - public void resolve() { - if (AllZoneUtil.isCardInPlay(card)) { - card.addTempAttackBoost(2); - card.addTempDefenseBoost(2); - AllZone.getEndOfTurn().addUntil(untilEOT); - } - } - }; - - Input runtime = new Input() { - private static final long serialVersionUID = 63327418012595048L; - Card topCreature = null; - - public void showMessage() { - - PlayerZone grave = AllZone.getZone(Constant.Zone.Graveyard, card.getController()); - for (int i = grave.size() - 1; i >= 0; i--) { - Card c = grave.get(i); - if (c.isCreature()) { - topCreature = c; - break; - } - } - AllZone.getDisplay().showMessage(card.getName() + " - Select OK to exile " + topCreature + "."); - ButtonUtil.enableAll(); - } - - public void selectButtonOK() { - AllZone.getGameAction().exile(topCreature); - AllZone.getStack().add(ability); - stop(); - } - - public void selectButtonCancel() { - stop(); - } - }; - - - ability.setDescription("Exile the top creature card of your graveyard: CARDNAME gets +2/+2 until end of turn."); - - StringBuilder sb = new StringBuilder(); - sb.append(card).append(" gets +2/+2 until end of turn."); - ability.setStackDescription(sb.toString()); - ability.setBeforePayMana(runtime); - card.addSpellAbility(ability); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Phyrexian Scuta")) { - Cost abCost = new Cost("3 B PayLife<3>", cardName, false); - final SpellAbility kicker = new Spell(card, abCost, null) { - private static final long serialVersionUID = -6420757044982294960L; - - @Override - public void resolve() { - card.setKicked(true); - AllZone.getGameAction().moveToPlay(card); - card.addCounterFromNonEffect(Counters.P1P1, 2); - } - - @Override - public boolean canPlay() { - return super.canPlay() && card.getController().getLife() >= 3; - } - - }; - kicker.setKickerAbility(true); - kicker.setManaCost("3 B"); - kicker.setDescription("Kicker - Pay 3 life."); - - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - Creature 3/3 (Kicked)"); - kicker.setStackDescription(sb.toString()); - - card.addSpellAbility(kicker); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Yosei, the Morning Star")) { - final CardList targetPerms = new CardList(); - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() { - Player p = getTargetPlayer(); - if (p.canTarget(this)) { - p.setSkipNextUntap(true); - for (Card c : targetPerms) { - if (AllZoneUtil.isCardInPlay(c) && CardFactoryUtil.canTarget(card, c)) { - c.tap(); - } - } - } - targetPerms.clear(); - }//resolve() - }; - - final Input targetInput = new Input() { - private static final long serialVersionUID = -8727869672234802473L; - - @Override - public void showMessage() { - if (targetPerms.size() == 5) done(); - AllZone.getDisplay().showMessage("Select up to 5 target permanents. Selected (" + targetPerms.size() + ") so far. Click OK when done."); - ButtonUtil.enableOnlyOK(); - } - - @Override - public void selectButtonOK() { - done(); - } - - private void done() { - //here, we add the ability to the stack since it's triggered. - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - tap up to 5 permanents target player controls. Target player skips his or her next untap step."); - ability.setStackDescription(sb.toString()); - AllZone.getStack().add(ability); - stop(); - } - - @Override - public void selectCard(Card c, PlayerZone zone) { - if (zone.is(Constant.Zone.Battlefield, ability.getTargetPlayer()) && !targetPerms.contains(c)) { - if (CardFactoryUtil.canTarget(card, c)) { - targetPerms.add(c); - } - } - showMessage(); - } - };//Input - - final Input playerInput = new Input() { - private static final long serialVersionUID = 4765535692144126496L; - - @Override - public void showMessage() { - AllZone.getDisplay().showMessage(card.getName() + " - Select target player"); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectPlayer(Player p) { - if (p.canTarget(ability)) { - ability.setTargetPlayer(p); - stopSetNext(targetInput); - } - } - - @Override - public void selectButtonCancel() { - stop(); - } - }; - - Command destroy = new Command() { - private static final long serialVersionUID = -3868616119471172026L; - - public void execute() { - Player player = card.getController(); - CardList list = CardFactoryUtil.AI_getHumanCreature(card, true); - - if (player.isHuman()) AllZone.getInputControl().setInput(playerInput); - else if (list.size() != 0) { - Card target = CardFactoryUtil.AI_getBestCreature(list); - ability.setTargetCard(target); - AllZone.getStack().addSimultaneousStackEntry(ability); - - } - }//execute() - }; - card.addDestroyCommand(destroy); - } - //*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Phyrexian Dreadnought")) { - final Player player = card.getController(); - final CardList toSac = new CardList(); - - final Ability sacOrSac = new Ability(card, "") { - @Override - public void resolve() { - if (player.isHuman()) { - Input target = new Input() { - private static final long serialVersionUID = 2698036349873486664L; - - @Override - public void showMessage() { - String toDisplay = cardName + " - Select any number of creatures to sacrifice. "; - toDisplay += "Currently, (" + toSac.size() + ") selected with a total power of: " + getTotalPower(); - toDisplay += " Click OK when Done."; - AllZone.getDisplay().showMessage(toDisplay); - ButtonUtil.enableAll(); - } - - @Override - public void selectButtonOK() { - done(); - } - - @Override - public void selectButtonCancel() { - toSac.clear(); - AllZone.getGameAction().sacrifice(card); - stop(); - } - - @Override - public void selectCard(Card c, PlayerZone zone) { - if (c.isCreature() && zone.is(Constant.Zone.Battlefield, AllZone.getHumanPlayer()) - && !toSac.contains(c)) { - toSac.add(c); - } - showMessage(); - }//selectCard() - - private void done() { - if (getTotalPower() >= 12) { - for (Card sac : toSac) AllZone.getGameAction().sacrifice(sac); - } else { - AllZone.getGameAction().sacrifice(card); - } - toSac.clear(); - stop(); - } - };//Input - AllZone.getInputControl().setInput(target); - } - }//end resolve - - private int getTotalPower() { - int sum = 0; - for (Card c : toSac) { - sum += c.getNetAttack(); - } - return sum; - } - };// end sacOrSac - - final Command comesIntoPlay = new Command() { - private static final long serialVersionUID = 7680692311339496770L; - - public void execute() { - sacOrSac.setStackDescription("When " + cardName + " enters the battlefield, sacrifice it unless you sacrifice any number of creatures with total power 12 or greater."); - AllZone.getStack().addSimultaneousStackEntry(sacOrSac); - - } - }; - - card.addComesIntoPlayCommand(comesIntoPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Clone") || cardName.equals("Vesuvan Doppelganger") - || cardName.equals("Quicksilver Gargantuan") - || cardName.equals("Jwari Shapeshifter") - || cardName.equals("Phyrexian Metamorph")) { - final CardFactoryInterface cfact = cf; - final Card[] copyTarget = new Card[1]; - final Card[] cloned = new Card[1]; - - final Command leaves = new Command() { - private static final long serialVersionUID = 8590474793502538215L; - - public void execute() { - //Slight hack if the cloner copies a card with triggers - AllZone.getTriggerHandler().removeAllFromCard(cloned[0]); - - Card orig = cfact.getCard(card.getName(), card.getController()); - PlayerZone dest = AllZone.getZone(card.getCurrentlyCloningCard()); - AllZone.getGameAction().moveTo(dest, orig); - dest.remove(card.getCurrentlyCloningCard()); - - } - }; - - final SpellAbility copy = new Spell(card) { - private static final long serialVersionUID = 4496978456522751302L; - - @Override - public void resolve() { - if (card.getController().isComputer()) { - CardList creatures = AllZoneUtil.getCreaturesInPlay(); - if (!creatures.isEmpty()) { - copyTarget[0] = CardFactoryUtil.AI_getBestCreature(creatures); - } - } - - if (copyTarget[0] != null) { - /* - * This cannot just be copyStats with an addSpellAbility loop from copyTarget[0]. - * Unless we get a copySpellAbility. Adding the SpellAbility from the - * source card causes many weird and Bad Things to happen. - */ - try { - cloned[0] = cfact.getCard(copyTarget[0].getName(), card.getController()); - } - catch(RuntimeException re) { - //the copyTarget was not found in CardFactory - cloned[0] = CardFactoryUtil.copyStats(copyTarget[0]); - } - cloned[0].setOwner(card.getController()); - cloned[0].setController(card.getController()); - if (cardName.equals("Phyrexian Metamorph")) cloned[0].addType("Artifact"); - cloned[0].setCloneOrigin(card); - cloned[0].addLeavesPlayCommand(leaves); - cloned[0].setCloneLeavesPlayCommand(leaves); - cloned[0].setCurSetCode(copyTarget[0].getCurSetCode()); - cloned[0].setImageFilename(copyTarget[0].getImageFilename()); - if (cardName.equals("Vesuvan Doppelganger")) { - cloned[0].addExtrinsicKeyword("At the beginning of your upkeep, you may have this creature become a copy of target creature except it doesn't copy that creature's color. If you do, this creature gains this ability."); - cloned[0].addColor("U", cloned[0], false, true); - } else if (cardName.equals("Quicksilver Gargantuan")) { - cloned[0].setBaseDefense(7); - cloned[0].setBaseAttack(7); - } - - //Slight hack in case the cloner copies a card with triggers - for (Trigger t : cloned[0].getTriggers()) { - AllZone.getTriggerHandler().registerTrigger(t); - } - - AllZone.getGameAction().moveToPlayFromHand(cloned[0]); - card.setCurrentlyCloningCard(cloned[0]); - } - } - };//SpellAbility - - Input runtime = new Input() { - private static final long serialVersionUID = 7615038074569687330L; - - @Override - public void showMessage() { - String message = "Select a creature "; - if (cardName.equals("Phyrexian Metamorph")) message += "or artifact "; - message += "on the battlefield"; - AllZone.getDisplay().showMessage(cardName + " - " + message); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - stop(); - } - - @Override - public void selectCard(Card c, PlayerZone z) { - if (z.is(Constant.Zone.Battlefield) && - (c.isCreature() || (cardName.equals("Phyrexian Metamorph") && c.isArtifact()))) { - if (cardName.equals("Jwari Shapeshifter") && !c.isType("Ally")) { - return; - } - copyTarget[0] = c; - stopSetNext(new Input_PayManaCost(copy)); - } - } - }; - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpell(); - card.addSpellAbility(copy); - copy.setStackDescription(cardName + " - enters the battlefield as a copy of selected card."); - copy.setBeforePayMana(runtime); - }//*************** END ************ END ************************** - - - //*************** START ************ START ************************** - else if (cardName.equals("Nebuchadnezzar")) { - /* - * X, T: Name a card. Target opponent reveals X cards at random from his or her hand. - * Then that player discards all cards with that name revealed this way. - * Activate this ability only during your turn. - */ - Cost abCost = new Cost("X T", cardName, true); - Target target = new Target(card, "Select target opponent", "Opponent".split(",")); - Ability_Activated discard = new Ability_Activated(card, abCost, target) { - private static final long serialVersionUID = 4839778470534392198L; - - @Override - public void resolve() { - //name a card - String choice = JOptionPane.showInputDialog(null, "Name a card", cardName, JOptionPane.QUESTION_MESSAGE); - CardList hand = AllZoneUtil.getPlayerHand(getTargetPlayer()); - int numCards = card.getXManaCostPaid(); - numCards = Math.min(hand.size(), numCards); - - CardList revealed = new CardList(); - for (int i = 0; i < numCards; i++) { - Card random = CardUtil.getRandom(hand.toArray()); - revealed.add(random); - hand.remove(random); - } - if (!revealed.isEmpty()) { - GuiUtils.getChoice("Revealed at random", revealed.toArray()); - } else { - GuiUtils.getChoice("Revealed at random", new String[]{"Nothing to reveal"}); - } - - for (Card c : revealed) { - if (c.getName().equals(choice)) c.getController().discard(c, this); - } - } - - @Override - public boolean canPlayAI() { - return false; - } - }; - - discard.getRestrictions().setPlayerTurn(true); - - StringBuilder sbDesc = new StringBuilder(); - sbDesc.append(abCost).append("Name a card. Target opponent reveals X cards at random from his or her hand. "); - sbDesc.append("Then that player discards all cards with that name revealed this way. "); - sbDesc.append("Activate this ability only during your turn."); - discard.setDescription(sbDesc.toString()); - - StringBuilder sbStack = new StringBuilder(); - sbStack.append(cardName).append(" - name a card."); - discard.setStackDescription(sbStack.toString()); - - card.addSpellAbility(discard); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Brass Squire")) { - - Target t2 = new Target(card, "Select target creature you control", "Creature.YouCtrl".split(",")); - final Ability_Sub sub = new Ability_Sub(card, t2) { - private static final long serialVersionUID = -8926850792424930054L; - - @Override - public boolean chkAI_Drawback() { - return false; - } - - @Override - public void resolve() { - Card equipment = this.getParent().getTargetCard(); - Card creature = getTargetCard(); - if (AllZoneUtil.isCardInPlay(equipment) && AllZoneUtil.isCardInPlay(creature)) { - if (CardFactoryUtil.canTarget(card, equipment) && CardFactoryUtil.canTarget(card, creature)) { - if (equipment.isEquipping()) { - Card equipped = equipment.getEquipping().get(0); - if (!equipped.equals(creature)) { - equipment.unEquipCard(equipped); - equipment.equipCard(creature); - } - } else { - equipment.equipCard(getTargetCard()); - } - } - } - } - - @Override - public boolean doTrigger(boolean b) { - return false; - } - }; - - Cost abCost = new Cost("T", cardName, true); - Target t1 = new Target(card, "Select target equipment you control", "Equipment.YouCtrl".split(",")); - final Ability_Activated ability = new Ability_Activated(card, abCost, t1) { - private static final long serialVersionUID = 3818559481920103914L; - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public void resolve() { - sub.resolve(); - } - }; - ability.setSubAbility(sub); - ability.setStackDescription(cardName + " - Attach target Equipment you control to target creature you control."); - card.addSpellAbility(ability); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Gore Vassal")) { - Cost abCost = new Cost("Sac<1/CARDNAME>", cardName, true); - final Ability_Activated ability = new Ability_Activated(card, abCost, new Target(card, "TgtC")) { - private static final long serialVersionUID = 3689290210743241201L; - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public void resolve() { - final Card target = getTargetCard(); - - if (AllZoneUtil.isCardInPlay(target) && CardFactoryUtil.canTarget(card, target)) { - target.addCounter(Counters.M1M1, 1); - if (target.getNetDefense() >= 1) { - target.addShield(); - AllZone.getEndOfTurn().addUntil(new Command() { - private static final long serialVersionUID = -3332692040606224591L; - - public void execute() { - target.resetShield(); - } - }); - } - } - }//resolve() - };//SpellAbility - - card.addSpellAbility(ability); - ability.setDescription(abCost + "Put a -1/-1 counter on target creature. Then if that creature's toughness is 1 or greater, regenerate it."); - - StringBuilder sb = new StringBuilder(); - sb.append(cardName).append(" put a -1/-1 counter on target creature."); - ability.setStackDescription(sb.toString()); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Orcish Captain")) { - Cost abCost = new Cost("1", cardName, true); - Target target = new Target(card, "Select target Orc creature", "Creature.Orc".split(",")); - final Ability_Activated ability = new Ability_Activated(card, abCost, target) { - private static final long serialVersionUID = 6724781940648179318L; - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public void resolve() { - final Card tgt = getTargetCard(); - final boolean[] win = new boolean[1]; - if (AllZoneUtil.isCardInPlay(tgt) && CardFactoryUtil.canTarget(card, tgt)) { - if (GameActionUtil.flipACoin(card.getController(), card)) { - tgt.addTempAttackBoost(2); - win[0] = true; - } else { - tgt.addTempDefenseBoost(-2); - win[0] = false; - } - - final Command EOT = new Command() { - private static final long serialVersionUID = -7905540871887278236L; - - public void execute() { - if (AllZoneUtil.isCardInPlay(tgt)) { - if (win[0]) { - tgt.addTempAttackBoost(-2); - } else { - tgt.addTempDefenseBoost(2); - } - } - } - }; - AllZone.getEndOfTurn().addUntil(EOT); - - }//if (card is in play) - }//resolve() - };//SpellAbility - card.addSpellAbility(ability); - ability.setDescription(abCost + "Flip a coin. If you win the flip, target Orc creature gets +2/+0 until end of turn. If you lose the flip, it gets -0/-2 until end of turn."); - }//*************** END ************ END ************************** - -/* - //*************** START *********** START ************************** - else if (cardName.equals("Orcish Spy")) { - Target target = new Target(card, "Select target player", new String[]{"Player"}); - Cost abCost = new Cost("T", cardName, true); - final Ability_Activated ability = new Ability_Activated(card, abCost, target) { - private static final long serialVersionUID = -7781215422160018196L; - - @Override - public void resolve() { - final Player player = getTargetPlayer(); - CardList lib = AllZoneUtil.getPlayerCardsInLibrary(player); - CardList toDisplay = new CardList(); - for (int i = 0; i < 3 && i < lib.size(); i++) { - toDisplay.add(lib.get(i)); - } - if (lib.size() > 0) { - GuiUtils.getChoice("Top three cards of " + player + "'s library", toDisplay.toArray()); - } else { - StringBuilder sb = new StringBuilder(); - sb.append(getTargetPlayer()).append("'s library is empty!"); - javax.swing.JOptionPane.showMessageDialog(null, sb.toString(), "Target player's library", JOptionPane.INFORMATION_MESSAGE); - } - }//resolve() - - @Override - public boolean canPlayAI() { - return false; - } - - };//SpellAbility - - ability.setDescription(abCost + "Look at the top three cards of target player's library."); - card.addSpellAbility(ability); - }//*************** END ************ END ************************** -*/ - - //*************** START *********** START ************************** - else if (cardName.equals("Awakener Druid")) { - final long[] timeStamp = {0}; - - Trigger myTrig = TriggerHandler.parseTrigger("Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | TriggerDescription$ When CARDNAME enters the battlefield, target Forest becomes a 4/5 green Treefolk creature for as long as CARDNAME is on the battlefield. It's still a land.", card); - Target myTarget = new Target(card, "Choose target forest.", "Land.Forest".split(","), "1", "1"); - final SpellAbility awaken = new Ability(card, "0") { - @Override - public void resolve() { - if (!AllZone.getZone(card).is("Battlefield") || getTarget().getTargetCards().size() == 0) - return; - final Card c = getTarget().getTargetCards().get(0); - String[] types = {"Creature", "Treefolk"}; - String[] keywords = {}; - timeStamp[0] = CardFactoryUtil.activateManland(c, 4, 5, types, keywords, "G"); - - final Command onleave = new Command() { - private static final long serialVersionUID = -6004932214386L; - long stamp = timeStamp[0]; - Card tgt = c; - - public void execute() { - String[] types = {"Creature", "Treefolk"}; - String[] keywords = {""}; - CardFactoryUtil.revertManland(tgt, types, keywords, "G", stamp); - } - }; - card.addLeavesPlayCommand(onleave); - } - };//SpellAbility - awaken.setTarget(myTarget); - - myTrig.setOverridingAbility(awaken); - card.addTrigger(myTrig); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Duct Crawler") || cardName.equals("Shrewd Hatchling") || cardName.equals("Spin Engine")) { - String theCost = "0"; - if (cardName.equals("Duct Crawler")) - theCost = "1 R"; - else if (cardName.equals("Shrewd Hatchling")) - theCost = "UR"; - else if (cardName.equals("Spin Engine")) - theCost = "R"; - - StringBuilder keywordBuilder = new StringBuilder("HIDDEN CARDNAME can't block "); - keywordBuilder.append(card.getName()).append(" (").append(card.getUniqueNumber()).append(")"); - - AbilityFactory createAb = new AbilityFactory(); - StringBuilder abilityBuilder = new StringBuilder("AB$Pump | Cost$ "); - abilityBuilder.append(theCost); - abilityBuilder.append(" | Tgt$ TgtC | IsCurse$ True | KW$ "); - abilityBuilder.append(keywordBuilder.toString()); - abilityBuilder.append(" | SpellDescription$ Target creature can't block CARDNAME this turn."); - SpellAbility myAb = createAb.getAbility(abilityBuilder.toString(), card); - - card.addSpellAbility(myAb); - - - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Krovikan Sorcerer")) { - Cost abCost = new Cost("T Discard<1/Card.Black>", cardName, true); - final Ability_Activated ability = new Ability_Activated(card, abCost, null) { - private static final long serialVersionUID = 3689290210743241201L; - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public void resolve() { - final Player player = card.getController(); - if (player.isHuman()) { - final CardList n = player.drawCards(2); - - AllZone.getInputControl().setInput(new Input() { - private static final long serialVersionUID = -1411038851955251074L; - - @Override - public void showMessage() { - if(n.isEmpty()) stop(); - AllZone.getDisplay().showMessage(card+" - discard one of the cards drawn."); - ButtonUtil.disableAll(); - } - - @Override - public void selectCard(Card c, PlayerZone zone) { - if (zone.is(Constant.Zone.Hand) && n.contains(c)) { - player.discard(c, null); - stop(); - } - } - });//end Input - } - }//resolve() - };//SpellAbility - - card.addSpellAbility(ability); - ability.setDescription("Tap, Discard a black card: " + "Draw two cards, then discard one of them."); - - StringBuilder sb = new StringBuilder(); - sb.append(card).append(" - Draw two cards, then discard one of them."); - ability.setStackDescription(sb.toString()); - }//*************** END ************ END ************************** - - - //*************************************************** - // end of card specific code - //*************************************************** - - if (hasKeyword(card, "Level up") != -1 && hasKeyword(card, "maxLevel") != -1) { - int n = hasKeyword(card, "Level up"); - int m = hasKeyword(card, "maxLevel"); - if (n != -1) { - String parse = card.getKeyword().get(n).toString(); - String parseMax = card.getKeyword().get(m).toString(); - - card.removeIntrinsicKeyword(parse); - card.removeIntrinsicKeyword(parseMax); - - - String k[] = parse.split(":"); - final String manacost = k[1]; - - String l[] = parseMax.split(":"); - final int maxLevel = Integer.parseInt(l[1]); - - final SpellAbility levelUp = new Ability_Activated(card, manacost) { - private static final long serialVersionUID = 3998280279949548652L; - - public void resolve() { - card.addCounter(Counters.LEVEL, 1); - } - - public boolean canPlayAI() { - // Todo: Improve Level up code - return card.getCounters(Counters.LEVEL) < maxLevel; - } - - }; - levelUp.getRestrictions().setSorcerySpeed(true); - card.addSpellAbility(levelUp); - - StringBuilder sbDesc = new StringBuilder(); - sbDesc.append("Level up ").append(manacost).append(" (").append(manacost); - sbDesc.append(": Put a level counter on this. Level up only as a sorcery.)"); - levelUp.setDescription(sbDesc.toString()); - - StringBuilder sbStack = new StringBuilder(); - sbStack.append(card).append(" - put a level counter on this."); - levelUp.setStackDescription(sbStack.toString()); - - card.setLevelUp(true); - - } - }//level up - - return card; - } -} diff --git a/src/forge/card/cardFactory/CardFactory_Equipment.java b/src/forge/card/cardFactory/CardFactory_Equipment.java deleted file mode 100644 index 425d861e342..00000000000 --- a/src/forge/card/cardFactory/CardFactory_Equipment.java +++ /dev/null @@ -1,429 +0,0 @@ -package forge.card.cardFactory; - - -import forge.*; -import forge.card.spellability.*; -import forge.card.trigger.Trigger; -import forge.card.trigger.TriggerHandler; -import forge.gui.input.Input; - -import java.util.ArrayList; - - -/** - *

CardFactory_Equipment class.

- * - * @author Forge - * @version $Id: $ - */ -class CardFactory_Equipment { - - /** - *

shouldEquip.

- * - * @param c a {@link forge.Card} object. - * @return a int. - */ - public static int shouldEquip(Card c) { - ArrayList a = c.getKeyword(); - for (int i = 0; i < a.size(); i++) { - - // Keyword renamed to eqPump, was VanillaEquipment - if (a.get(i).toString().startsWith("eqPump")) { - return i; - } - } - return -1; - } - - - /** - *

getCard.

- * - * @param card a {@link forge.Card} object. - * @param cardName a {@link java.lang.String} object. - * @param owner a {@link forge.Player} object. - * @return a {@link forge.Card} object. - */ - public static Card getCard(final Card card, String cardName, Player owner) { - - //*************** START *********** START ************************** - if (cardName.equals("Umbral Mantle")) { - Cost abCost = new Cost("0", cardName, true); - Target target = new Target(card, "Select target creature you control", "Creature.YouCtrl".split(",")); - final Ability_Activated equip = new Ability_Activated(card, abCost, target) { - private static final long serialVersionUID = -6122939616068165612L; - - @Override - public void resolve() { - if (AllZoneUtil.isCardInPlay(getTargetCard()) - && CardFactoryUtil.canTarget(card, getTargetCard())) { - - if (card.isEquipping()) { - Card crd = card.getEquipping().get(0); - if (crd.equals(getTargetCard())) { - return; - } - - card.unEquipCard(crd); - } - - card.equipCard(getTargetCard()); - } - } - - @Override - public boolean canPlayAI() { - return false; - } - };//equip ability - - equip.setType("Extrinsic"); - - final Ability untapboost = new Ability(card, "3") { - Command EOT(final Card c) { - return new Command() { - private static final long serialVersionUID = -8840812331316327448L; - - public void execute() { - if (AllZoneUtil.isCardInPlay(getSourceCard())) { - c.addTempAttackBoost(-2); - c.addTempDefenseBoost(-2); - } - - } - }; - } - - @Override - public void resolve() { - getSourceCard().addTempAttackBoost(2); - getSourceCard().addTempDefenseBoost(2); - AllZone.getEndOfTurn().addUntil(EOT(getSourceCard())); - } - - @Override - public boolean canPlay() { - return (getSourceCard().isTapped() - && !getSourceCard().hasSickness() - && super.canPlay()); - } - };//equiped creature's ability - untapboost.makeUntapAbility(); - Command onEquip = new Command() { - - private static final long serialVersionUID = -4784079305541955698L; - - public void execute() { - if (card.isEquipping()) { - Card crd = card.getEquipping().get(0); - - StringBuilder sbDesc = new StringBuilder(); - sbDesc.append("3, Untap: ").append(crd).append(" gets +2/+2 until end of turn"); - untapboost.setDescription(sbDesc.toString()); - - StringBuilder sbStack = new StringBuilder(); - sbStack.append(crd).append(" - +2/+2 until EOT"); - untapboost.setStackDescription(sbStack.toString()); - - crd.addSpellAbility(untapboost); - } - }//execute() - };//Command - - - Command onUnEquip = new Command() { - private static final long serialVersionUID = -3427116314295067303L; - - public void execute() { - if (card.isEquipping()) { - Card crd = card.getEquipping().get(0); - crd.removeSpellAbility(untapboost); - } - - }//execute() - };//Command - - equip.setBeforePayMana(CardFactoryUtil.input_equipCreature(equip)); - equip.getRestrictions().setSorcerySpeed(true); - - - equip.setDescription("Equip: 0"); - card.addSpellAbility(equip); - - card.addEquipCommand(onEquip); - card.addUnEquipCommand(onUnEquip); - } //*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Hedron Matrix")) { - /* - * Equipped creature gets +X/+X, where X is its converted mana cost. - */ - final Ability equip = new Ability(card, "4") { - - //not changed - @Override - public void resolve() { - if (AllZoneUtil.isCardInPlay(getTargetCard()) - && CardFactoryUtil.canTarget(card, getTargetCard())) { - - if (card.isEquipping()) { - Card crd = card.getEquipping().get(0); - if (crd.equals(getTargetCard())) { - return; - } - - card.unEquipCard(crd); - } - card.equipCard(getTargetCard()); - } - } - - //not changed - @Override - public boolean canPlay() { - return AllZone.getZone(card).is(Constant.Zone.Battlefield) - && Phase.canCastSorcery(card.getController()) - && super.canPlay(); - } - - //not changed - @Override - public boolean canPlayAI() { - return getCreature().size() != 0 - && !card.isEquipping() - && super.canPlayAI(); - } - - //not changed - @Override - public void chooseTargetAI() { - Card target = CardFactoryUtil.AI_getBestCreature(getCreature()); - setTargetCard(target); - } - - //not changed - CardList getCreature() { - CardList list = AllZoneUtil.getCreaturesInPlay(AllZone.getComputerPlayer()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CardFactoryUtil.AI_doesCreatureAttack(c) - && CardFactoryUtil.canTarget(card, c) - && (!c.hasKeyword("Defender")); - } - }); - - // Is there at least 1 Loxodon Punisher and/or Goblin Gaveleer to target - CardList equipMagnetList = list; - equipMagnetList = equipMagnetList.getEquipMagnets(); - - if (equipMagnetList.size() != 0) { - return equipMagnetList; - } - - return list; - }//getCreature() - };//equip ability - - Command onEquip = new Command() { - private static final long serialVersionUID = -5356474407155702171L; - - public void execute() { - if (card.isEquipping()) { - Card crd = card.getEquipping().get(0); - int pump = CardUtil.getConvertedManaCost(crd.getManaCost()); - crd.addSemiPermanentAttackBoost(pump); - crd.addSemiPermanentDefenseBoost(pump); - } - }//execute() - };//Command - - Command onUnEquip = new Command() { - private static final long serialVersionUID = 5196262972986079207L; - - public void execute() { - if (card.isEquipping()) { - Card crd = card.getEquipping().get(0); - int pump = CardUtil.getConvertedManaCost(crd.getManaCost()); - crd.addSemiPermanentAttackBoost(-pump); - crd.addSemiPermanentDefenseBoost(-pump); - - } - - }//execute() - };//Command - - equip.setBeforePayMana(CardFactoryUtil.input_equipCreature(equip)); - - equip.setDescription("Equip: 4"); - card.addSpellAbility(equip); - - card.addEquipCommand(onEquip); - card.addUnEquipCommand(onUnEquip); - - } //*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Blade of the Bloodchief")) { - final Ability triggeredAbility = new Ability(card, "0") { - @Override - public void resolve() { - if (card.getEquipping().size() != 0) { - Card equipping = card.getEquipping().get(0); - if (equipping.isType("Vampire")) { - equipping.addCounter(Counters.P1P1, 2); - } else { - equipping.addCounter(Counters.P1P1, 1); - } - } - } - }; - - final Trigger myTrigger = TriggerHandler.parseTrigger("Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigOverride | TriggerDescription$ Whenever a creature is put into a graveyard from the battlefield, put a +1/+1 counter on equipped creature. If equipped creature is a Vampire, put two +1/+1 counters on it instead.", card); - myTrigger.setOverridingAbility(triggeredAbility); - - card.addTrigger(myTrigger); - } //*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Piston Sledge")) { - - final Input in = new Input() { - private static final long serialVersionUID = 1782826197612459365L; - - @Override - public void showMessage() { - CardList list = AllZoneUtil.getCreaturesInPlay(card.getController()); - list = list.filter(AllZoneUtil.getCanTargetFilter(card)); - AllZone.getDisplay().showMessage(card + " - Select target creature you control to attach"); - ButtonUtil.disableAll(); - if (list.size() == 0) { - stop(); - } - } - - @Override - public void selectCard(Card c, PlayerZone z) { - if (z.is(Constant.Zone.Battlefield, card.getController()) && c.isCreature() - && CardFactoryUtil.canTarget(card, c)) { - card.equipCard(c); - stop(); - } - } - - }; - - final SpellAbility comesIntoPlayAbility = new Ability(card, "0") { - @Override - public void resolve() { - AllZone.getInputControl().setInput(in); - }//resolve() - }; //comesIntoPlayAbility - - Command intoPlay = new Command() { - private static final long serialVersionUID = 2985015252466920757L; - - public void execute() { - - StringBuilder sb = new StringBuilder(); - sb.append("When Piston Sledge enters the battlefield, attach it to target creature you control."); - comesIntoPlayAbility.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(comesIntoPlayAbility); - - } - }; - - card.addComesIntoPlayCommand(intoPlay); - }//*************** END ************ END ************************** - - - if (shouldEquip(card) != -1) { - int n = shouldEquip(card); - if (n != -1) { - String parse = card.getKeyword().get(n).toString(); - card.removeIntrinsicKeyword(parse); - - String k[] = parse.split(":"); - String tmpCost; - tmpCost = k[0].substring(6); - String keywordsUnsplit = ""; - String extrinsicKeywords[] = {"none"}; // for equips with no keywords to add - - //final String manaCost = tmpCost.trim(); - final Cost abCost = new Cost(tmpCost.trim(), card.getName(), true); - int power = 0; - int tough = 0; - - String ptk[] = k[1].split("/"); - - if (ptk.length == 1) // keywords in first cell - { - keywordsUnsplit = ptk[0]; - } else // parse the power/toughness boosts in first two cells - { - for (int i = 0; i < 2; i++) { - if (ptk[i].matches("[\\+\\-][0-9]")) { - ptk[i] = ptk[i].replace("+", ""); - } - } - - power = Integer.parseInt(ptk[0].trim()); - tough = Integer.parseInt(ptk[1].trim()); - - - if (ptk.length > 2) { // keywords in third cell - keywordsUnsplit = ptk[2]; - } - } - - if (keywordsUnsplit.length() > 0) // then there is at least one extrinsic keyword to assign - { - String tempKwds[] = keywordsUnsplit.split("&"); - extrinsicKeywords = new String[tempKwds.length]; - - for (int i = 0; i < tempKwds.length; i++) { - extrinsicKeywords[i] = tempKwds[i].trim(); - } - } - - card.addSpellAbility(CardFactoryUtil.eqPump_Equip(card, power, tough, extrinsicKeywords, abCost)); - card.addEquipCommand(CardFactoryUtil.eqPump_onEquip(card, power, tough, extrinsicKeywords, abCost)); - card.addUnEquipCommand(CardFactoryUtil.eqPump_unEquip(card, power, tough, extrinsicKeywords, abCost)); - - } - }// eqPump (was VanillaEquipment) - - if (card.hasKeyword("Living Weapon")) { - card.removeIntrinsicKeyword("Living Weapon"); - final Ability etbAbility = new Ability(card, "0") { - - @Override - public void resolve() { - String[] types = new String[]{"Creature", "Germ"}; - String[] keywords = new String[0]; - CardList germs = CardFactoryUtil.makeToken("Germ", "B 0 0 Germ", card.getController(), "B", types, 1, 1, keywords); - - card.equipCard(germs.get(0)); - - for (Card c : germs) { - c.setBaseAttack(0); - c.setBaseDefense(0); - } - } - - }; - - final Trigger etbTrigger = TriggerHandler.parseTrigger("Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigOverriding | TriggerDescription$ Living Weapon (When this Equipment enters the battlefield, put a 0/0 black Germ creature token onto the battlefield, then attach this to it.)", card); - etbTrigger.setOverridingAbility(etbAbility); - - card.addTrigger(etbTrigger); - } - - return card; - } -} diff --git a/src/forge/card/cardFactory/CardFactory_Instants.java b/src/forge/card/cardFactory/CardFactory_Instants.java deleted file mode 100644 index 1d0a12cc5a7..00000000000 --- a/src/forge/card/cardFactory/CardFactory_Instants.java +++ /dev/null @@ -1,1573 +0,0 @@ -package forge.card.cardFactory; - -import forge.*; -import forge.card.spellability.*; -import forge.gui.GuiUtils; -import forge.gui.input.Input; -import forge.gui.input.Input_PayManaCost; - -import javax.swing.*; -import java.util.ArrayList; - - -/** - *

CardFactory_Instants class.

- * - * @author Forge - * @version $Id: $ - */ -public class CardFactory_Instants { - - /** - *

getCard.

- * - * @param card a {@link forge.Card} object. - * @param cardName a {@link java.lang.String} object. - * @param owner a {@link forge.Player} object. - * @return a {@link forge.Card} object. - */ - public static Card getCard(final Card card, final String cardName, Player owner) { - - - //*************** START *********** START ************************** - if (cardName.equals("Brave the Elements")) { - /** - * This card now works slightly better than it did before the spAllPump - * keyword was created. The AI is too simple and needs some work. - */ - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = -7998437920995642451L; - - @Override - public boolean canPlayAI() { - return getAttacker() != null; - } - - public Card getAttacker() { - // target creatures that is going to attack - Combat c = ComputerUtil.getAttackers(); - Card[] att = c.getAttackers(); - - // Effect best used on at least a couple creatures - if (att.length > 1) { - return att[0]; - } else return null; - }//getAttacker() - - String getKeywordBoost() { - String theColor = getChosenColor(); - return "Protection from " + theColor; - }//getKeywordBoost() - - String getChosenColor() { - // Choose color for protection in Brave the Elements - String color = ""; - if (card.getController().isHuman()) { - - // String[] colors = Constant.Color.Colors; - // colors[colors.length-1] = null; - - // You can no longer choose to gain "protection from null". - String[] colors = Constant.Color.onlyColors; - - Object o = GuiUtils.getChoice("Choose color", colors); - color = (String) o; - } else { - CardList list = new CardList(); - list.addAll(AllZoneUtil.getPlayerCardsInLibrary(AllZone.getHumanPlayer())); - list.addAll(AllZoneUtil.getPlayerHand(AllZone.getHumanPlayer())); - - if (list.size() > 0) { - String mpcolor = CardFactoryUtil.getMostProminentColor(list); - if (!mpcolor.equals("")) - color = mpcolor; - else - color = "black"; - } else { - color = "black"; - } - } - return color; - } // getChosenColor - - @Override - public void resolve() { - final String kboost = getKeywordBoost(); - - CardList list = AllZoneUtil.getPlayerCardsInPlay(card.getController()); - list = list.filter(AllZoneUtil.white); - - for (int i = 0; i < list.size(); i++) { - final Card[] target = new Card[1]; - target[0] = list.get(i); - - final Command untilEOT = new Command() { - private static final long serialVersionUID = 6308754740309909072L; - - public void execute() { - if (AllZoneUtil.isCardInPlay(target[0])) { - target[0].removeExtrinsicKeyword(kboost); - } - } - };//Command - - if (AllZoneUtil.isCardInPlay(target[0]) - && !target[0].hasKeyword(kboost)) { - target[0].addExtrinsicKeyword(kboost); - - AllZone.getEndOfTurn().addUntil(untilEOT); - }//if - }//for - }//resolve - };//SpellAbility - - card.setSVar("PlayMain1", "TRUE"); - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Sprout Swarm")) { - final SpellAbility spell_one = new Spell(card) { - private static final long serialVersionUID = -609007714604161377L; - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public void resolve() { - CardFactoryUtil.makeTokenSaproling(card.getController()); - } - };//SpellAbility - - final SpellAbility spell_two = new Spell(card) { - private static final long serialVersionUID = -1387385820860395676L; - - @Override - public void resolve() { - CardFactoryUtil.makeTokenSaproling(card.getController()); - //return card to the hand - PlayerZone hand = AllZone.getZone(Constant.Zone.Hand, card.getController()); - AllZone.getGameAction().moveTo(hand, card); - } - };//SpellAbility - - spell_one.setManaCost("1 G"); - spell_two.setManaCost("4 G"); - spell_two.setAdditionalManaCost("3"); - - spell_one.setDescription("Put a 1/1 green Saproling token onto the battlefield."); - spell_two.setDescription("Buyback 3 (You may pay an additional 3 as you cast this spell. If you do, put this card into your hand as it resolves.)"); - - spell_one.setStackDescription("Sprout Swarm - Put a 1/1 green Saproling token onto the battlefield"); - spell_two.setStackDescription("Sprout Swarm - Buyback, Put a 1/1 green Saproling token onto the battlefield"); - - spell_two.setIsBuyBackAbility(true); - - - - card.addSpellAbility(spell_one); - card.addSpellAbility(spell_two); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Fact or Fiction")) { - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = 1481112451519L; - - @Override - public void resolve() { - - Card choice = null; - - //check for no cards in hand on resolve - PlayerZone Library = AllZone.getZone(Constant.Zone.Library, card.getController()); - PlayerZone Hand = AllZone.getZone(Constant.Zone.Hand, card.getController()); - //PlayerZone Grave = AllZone.getZone(Constant.Zone.Graveyard, card.getController()); - CardList cards = new CardList(); - - if (Library.size() == 0) { - JOptionPane.showMessageDialog(null, "No more cards in library.", "", JOptionPane.INFORMATION_MESSAGE); - return; - } - int Count = 5; - if (Library.size() < 5) Count = Library.size(); - for (int i = 0; i < Count; i++) cards.add(Library.get(i)); - CardList Pile1 = new CardList(); - CardList Pile2 = new CardList(); - boolean stop = false; - int Pile1CMC = 0; - int Pile2CMC = 0; - - - GuiUtils.getChoice("Revealing top " + Count + " cards of library: ", cards.toArray()); - //Human chooses - if (card.getController().isComputer()) { - for (int i = 0; i < Count; i++) { - if (stop == false) { - choice = GuiUtils.getChoiceOptional("Choose cards to put into the first pile: ", cards.toArray()); - if (choice != null) { - Pile1.add(choice); - cards.remove(choice); - Pile1CMC = Pile1CMC + CardUtil.getConvertedManaCost(choice); - } else stop = true; - } - } - for (int i = 0; i < Count; i++) { - if (!Pile1.contains(Library.get(i))) { - Pile2.add(Library.get(i)); - Pile2CMC = Pile2CMC + CardUtil.getConvertedManaCost(Library.get(i)); - } - } - StringBuilder sb = new StringBuilder(); - sb.append("You have spilt the cards into the following piles" + "\r\n" + "\r\n"); - sb.append("Pile 1: " + "\r\n"); - for (int i = 0; i < Pile1.size(); i++) sb.append(Pile1.get(i).getName() + "\r\n"); - sb.append("\r\n" + "Pile 2: " + "\r\n"); - for (int i = 0; i < Pile2.size(); i++) sb.append(Pile2.get(i).getName() + "\r\n"); - JOptionPane.showMessageDialog(null, sb, "", JOptionPane.INFORMATION_MESSAGE); - if (Pile1CMC >= Pile2CMC) { - JOptionPane.showMessageDialog(null, "Computer adds the first pile to its hand and puts the second pile into the graveyard", "", JOptionPane.INFORMATION_MESSAGE); - for (int i = 0; i < Pile1.size(); i++) AllZone.getGameAction().moveTo(Hand, Pile1.get(i)); - for (int i = 0; i < Pile2.size(); i++) - AllZone.getGameAction().moveToGraveyard(Pile2.get(i)); - } else { - JOptionPane.showMessageDialog(null, "Computer adds the second pile to its hand and puts the first pile into the graveyard", "", JOptionPane.INFORMATION_MESSAGE); - for (int i = 0; i < Pile2.size(); i++) AllZone.getGameAction().moveTo(Hand, Pile2.get(i)); - for (int i = 0; i < Pile1.size(); i++) - AllZone.getGameAction().moveToGraveyard(Pile1.get(i)); - } - - } else//Computer chooses (It picks the highest converted mana cost card and 1 random card.) - { - Card biggest = null; - biggest = Library.get(0); - - for (int i = 0; i < Count; i++) { - if (CardUtil.getConvertedManaCost(biggest.getManaCost()) >= CardUtil.getConvertedManaCost(biggest.getManaCost())) { - biggest = cards.get(i); - } - } - Pile1.add(biggest); - cards.remove(biggest); - if (cards.size() > 0) { - Card Random = CardUtil.getRandom(cards.toArray()); - Pile1.add(Random); - } - for (int i = 0; i < Count; i++) if (!Pile1.contains(Library.get(i))) Pile2.add(Library.get(i)); - StringBuilder sb = new StringBuilder(); - sb.append("Choose a pile to add to your hand: " + "\r\n" + "\r\n"); - sb.append("Pile 1: " + "\r\n"); - for (int i = 0; i < Pile1.size(); i++) sb.append(Pile1.get(i).getName() + "\r\n"); - sb.append("\r\n" + "Pile 2: " + "\r\n"); - for (int i = 0; i < Pile2.size(); i++) sb.append(Pile2.get(i).getName() + "\r\n"); - Object[] possibleValues = {"Pile 1", "Pile 2"}; - Object q = JOptionPane.showOptionDialog(null, sb, "Fact or Fiction", - JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, - null, possibleValues, possibleValues[0]); - if (q.equals(0)) { - for (int i = 0; i < Pile1.size(); i++) AllZone.getGameAction().moveTo(Hand, Pile1.get(i)); - for (int i = 0; i < Pile2.size(); i++) - AllZone.getGameAction().moveToGraveyard(Pile2.get(i)); - } else { - for (int i = 0; i < Pile2.size(); i++) AllZone.getGameAction().moveTo(Hand, Pile2.get(i)); - for (int i = 0; i < Pile1.size(); i++) - AllZone.getGameAction().moveToGraveyard(Pile1.get(i)); - } - } - Pile1.clear(); - Pile2.clear(); - }//resolve() - - @Override - public boolean canPlayAI() { - CardList cards = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - return cards.size() >= 10; - } - };//SpellAbility - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Echoing Decay")) { - Cost cost = new Cost(card.getManaCost(), cardName, false); - Target tgt = new Target(card, "C"); - final SpellAbility spell = new Spell(card, cost, tgt) { - private static final long serialVersionUID = 3154935854257358023L; - - @Override - public boolean canPlayAI() { - CardList c = getCreature(); - if (c.isEmpty()) return false; - else { - setTargetCard(c.get(0)); - return true; - } - }//canPlayAI() - - CardList getCreature() { - CardList out = new CardList(); - CardList list = CardFactoryUtil.AI_getHumanCreature("Flying", card, true); - list.shuffle(); - - for (int i = 0; i < list.size(); i++) - if ((list.get(i).getNetAttack() >= 2) && (list.get(i).getNetDefense() <= 2)) - out.add(list.get(i)); - - //in case human player only has a few creatures in play, target anything - if (out.isEmpty() && 0 < CardFactoryUtil.AI_getHumanCreature(2, card, true).size() - && 3 > CardFactoryUtil.AI_getHumanCreature(card, true).size()) { - out.addAll(CardFactoryUtil.AI_getHumanCreature(2, card, true)); - CardListUtil.sortFlying(out); - } - return out; - }//getCreature() - - - @Override - public void resolve() { - if (AllZoneUtil.isCardInPlay(getTargetCard()) - && CardFactoryUtil.canTarget(card, getTargetCard())) { - final Card c = getTargetCard(); - - c.addTempAttackBoost(-2); - c.addTempDefenseBoost(-2); - - AllZone.getEndOfTurn().addUntil(new Command() { - private static final long serialVersionUID = 1327455269456577020L; - - public void execute() { - c.addTempAttackBoost(2); - c.addTempDefenseBoost(2); - } - }); - - //get all creatures - CardList list = AllZoneUtil.getCardsInPlay(); - - list = list.getName(getTargetCard().getName()); - list.remove(getTargetCard()); - - if (!getTargetCard().isFaceDown()) for (int i = 0; i < list.size(); i++) { - final Card crd = list.get(i); - - crd.addTempAttackBoost(-2); - crd.addTempDefenseBoost(-2); - - AllZone.getEndOfTurn().addUntil(new Command() { - private static final long serialVersionUID = 5151337777143949221L; - - public void execute() { - crd.addTempAttackBoost(2); - crd.addTempDefenseBoost(2); - } - }); - } - - }//in play? - }//resolve() - };//SpellAbility - - - - card.addSpellAbility(spell); - - card.setSVar("PlayMain1", "TRUE"); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Hidetsugu's Second Rite")) { - Target t = new Target(card, "Select target player", "Player"); - Cost cost = new Cost("3 R", cardName, false); - final SpellAbility spell = new Spell(card, cost, t) { - private static final long serialVersionUID = 176857775451818523L; - - @Override - public void resolve() { - if (getTargetPlayer().getLife() == 10) { - getTargetPlayer().addDamage(10, card); - } - } - - @Override - public boolean canPlayAI() { - return AllZone.getHumanPlayer().getLife() == 10; - } - - }; - spell.setChooseTargetAI(CardFactoryUtil.AI_targetHuman()); - - - - card.addSpellAbility(spell); - - card.setSVar("PlayMain1", "TRUE"); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Echoing Truth")) { - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = 563933533543239220L; - - @Override - public boolean canPlayAI() { - CardList human = CardFactoryUtil.AI_getHumanCreature(card, true); - return 4 < AllZone.getPhase().getTurn() && 0 < human.size(); - } - - @Override - public void chooseTargetAI() { - CardList human = CardFactoryUtil.AI_getHumanCreature(card, true); - setTargetCard(CardFactoryUtil.AI_getBestCreature(human)); - } - - @Override - public void resolve() { - //if target card is not in play, just quit - if (!AllZoneUtil.isCardInPlay(getTargetCard()) - || !CardFactoryUtil.canTarget(card, getTargetCard())) return; - - //get all permanents - CardList all = AllZoneUtil.getCardsInPlay(); - - CardList sameName = all.getName(getTargetCard().getName()); - sameName = sameName.filter(new CardListFilter() { - public boolean addCard(Card c) { - return !c.isFaceDown(); - } - }); - - if (!getTargetCard().isFaceDown()) { - //bounce all permanents with the same name - for (int i = 0; i < sameName.size(); i++) { - if (sameName.get(i).isToken()) AllZone.getGameAction().exile(sameName.get(i)); - else { - PlayerZone hand = AllZone.getZone(Constant.Zone.Hand, sameName.get(i).getOwner()); - AllZone.getGameAction().moveTo(hand, sameName.get(i)); - } - }//for - }//if (!isFaceDown()) - else { - PlayerZone hand = AllZone.getZone(Constant.Zone.Hand, getTargetCard().getOwner()); - AllZone.getGameAction().moveTo(hand, getTargetCard()); - } - }//resolve() - };//SpellAbility - Input target = new Input() { - private static final long serialVersionUID = -3978705328511825933L; - - @Override - public void showMessage() { - AllZone.getDisplay().showMessage("Select target nonland permanent for " + spell.getSourceCard()); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - stop(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (!card.isLand() && zone.is(Constant.Zone.Battlefield) && CardFactoryUtil.canTarget(spell, card)) { - spell.setTargetCard(card); - if (this.isFree()) { - this.setFree(false); - AllZone.getStack().add(spell); - stop(); - } else - stopSetNext(new Input_PayManaCost(spell)); - } - } - };//Input - - card.setSVar("PlayMain1", "TRUE"); - - spell.setBeforePayMana(target); - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - /* - //*************** START *********** START ************************** - else if (cardName.equals("Banishing Knack")) { - Cost cost = new Cost(card.getManaCost(), cardName, false); - Target tgt = new Target(card, "C"); - final SpellAbility spell = new Spell(card, cost, tgt) { - private static final long serialVersionUID = 6518824567946786581L; - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public void resolve() { - final Card creature = getTargetCard(); - Cost abCost = new Cost("T", creature.getName(), true); - Target tgt = new Target(card, "Select target nonland permanent", new String[]{"Permanent.nonLand"}); - final Ability_Activated tBanish = new Ability_Activated(creature, abCost, tgt) { - private static final long serialVersionUID = -1008113001678623984L; - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public void resolve() { - StringBuilder sb = new StringBuilder(); - sb.append(creature).append(" - Return").append(getTargetCard()).append("to its owner's hand"); - setStackDescription(sb.toString()); - - final Card target = getTargetCard(); - if (AllZoneUtil.isCardInPlay(target) - && CardFactoryUtil.canTarget(creature, target)) { - AllZone.getGameAction().moveToHand(target); - } - }//resolve() - };//tBanish; - tBanish.setDescription(abCost + "Return target nonland permanent to its owner's hand."); - creature.addSpellAbility(tBanish); - AllZone.getEndOfTurn().addUntil(new Command() { - private static final long serialVersionUID = -7819140065166374666L; - - public void execute() { - creature.removeSpellAbility(tBanish); - } - }); - } - };//SpellAbility - - card.addSpellAbility(spell); - spell.setDescription("Until end of turn, target creature gains \"tap: Return target nonland permanent to its owner's hand.\""); - spell.setStackDescription("Target creature gains \"tap: Return target nonland permanent to its owner's hand.\""); - }//*************** END ************ END ************************** - */ - - //*************** START *********** START ************************** - else if (cardName.equals("Intuition")) { - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = 8282597086298330698L; - - @Override - public void resolve() { - Player player = card.getController(); - if (player.isHuman()) humanResolve(); - else computerResolve(); - player.shuffle(); - } - - public void humanResolve() { - CardList libraryList = AllZoneUtil.getPlayerCardsInLibrary(AllZone.getHumanPlayer()); - CardList selectedCards = new CardList(); - - Object o = GuiUtils.getChoiceOptional("Select first card", libraryList.toArray()); - if (o != null) { - Card c1 = (Card) o; - libraryList.remove(c1); - selectedCards.add(c1); - } else { - return; - } - o = GuiUtils.getChoiceOptional("Select second card", libraryList.toArray()); - if (o != null) { - Card c2 = (Card) o; - libraryList.remove(c2); - selectedCards.add(c2); - } else { - return; - } - o = GuiUtils.getChoiceOptional("Select third card", libraryList.toArray()); - if (o != null) { - Card c3 = (Card) o; - libraryList.remove(c3); - selectedCards.add(c3); - } else { - return; - } - - Card choice = selectedCards.get(MyRandom.random.nextInt(2)); //comp randomly selects one of the three cards - - selectedCards.remove(choice); - AllZone.getGameAction().moveToHand(choice); - - for (Card trash : selectedCards) - AllZone.getGameAction().moveToGraveyard(trash); - } - - public void computerResolve() { - CardList list = AllZoneUtil.getPlayerCardsInLibrary(AllZone.getComputerPlayer()); - CardList selectedCards = new CardList(); - - //pick best creature - Card c = CardFactoryUtil.AI_getBestCreature(list); - if (c == null) { - c = list.get(0); - } - list.remove(c); - selectedCards.add(c); - - c = CardFactoryUtil.AI_getBestCreature(list); - if (c == null) { - c = list.get(0); - } - list.remove(c); - selectedCards.add(c); - - c = CardFactoryUtil.AI_getBestCreature(list); - if (c == null) { - c = list.get(0); - } - list.remove(c); - selectedCards.add(c); - - // NOTE: Using getChoiceOptional() results in a null error when you click on Cancel. - Object o = GuiUtils.getChoice("Select card to give to computer", selectedCards.toArray()); - - Card choice = (Card) o; - - selectedCards.remove(choice); - AllZone.getGameAction().moveToHand(choice); - - for (Card trash : selectedCards) - AllZone.getGameAction().moveToGraveyard(trash); - } - - @Override - public boolean canPlay() { - CardList library = AllZoneUtil.getPlayerCardsInLibrary(card.getController()); - return library.size() >= 3; - } - - @Override - public boolean canPlayAI() { - CardList creature = AllZoneUtil.getPlayerCardsInLibrary(AllZone.getComputerPlayer()); - creature = creature.getType("Creature"); - return creature.size() >= 3; - } - };//SpellAbility - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Echoing Courage")) { - Cost cost = new Cost(card.getManaCost(), cardName, false); - Target tgt = new Target(card, "C"); - final SpellAbility spell = new Spell(card, cost, tgt) { - private static final long serialVersionUID = -8649611733196156346L; - - public boolean canPlayAI() { - CardList list = AllZoneUtil.getCreaturesInPlay(AllZone.getComputerPlayer()); - if (list.isEmpty()) - return false; - else { - setTargetCard(CardFactoryUtil.AI_getBestCreature(list)); - return true; - } - }//canPlayAI() - - public void resolve() { - if (AllZoneUtil.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard())) { - final Card c = getTargetCard(); - - c.addTempAttackBoost(2); - c.addTempDefenseBoost(2); - - AllZone.getEndOfTurn().addUntil(new Command() { - private static final long serialVersionUID = 1327455269456577020L; - - public void execute() { - c.addTempAttackBoost(-2); - c.addTempDefenseBoost(-2); - } - }); - - //get all creatures - CardList list = AllZoneUtil.getCardsInPlay(getTargetCard().getName()); - list.remove(getTargetCard()); - - if (!getTargetCard().isFaceDown()) - for (int i = 0; i < list.size(); i++) { - final Card crd = list.get(i); - - crd.addTempAttackBoost(2); - crd.addTempDefenseBoost(2); - - AllZone.getEndOfTurn().addUntil(new Command() { - private static final long serialVersionUID = 5151337777143949221L; - - public void execute() { - crd.addTempAttackBoost(-2); - crd.addTempDefenseBoost(-2); - } - }); - } - - }//in play? - }//resolve() - };//SpellAbility - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Hurkyl's Recall")) { - /* - * Return all artifacts target player owns to his or her hand. - */ - Target t = new Target(card, "Select target player", "Player"); - Cost cost = new Cost("1 U", cardName, false); - - SpellAbility spell = new Spell(card, cost, t) { - private static final long serialVersionUID = -4098702062413878046L; - - @Override - public boolean canPlayAI() { - CardList humanArts = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - humanArts = humanArts.getType("Artifact"); - return humanArts.size() > 0; - }//canPlayAI - - @Override - public void chooseTargetAI() { - setTargetPlayer(AllZone.getHumanPlayer()); - }//chooseTargetAI() - - @Override - public void resolve() { - Player player = getTargetPlayer(); - CardList artifacts = AllZoneUtil.getCardsInPlay(); - artifacts = artifacts.getType("Artifact"); - - for (int i = 0; i < artifacts.size(); i++) { - Card thisArtifact = artifacts.get(i); - if (thisArtifact.getOwner().equals(player)) { - //moveToHand handles tokens - AllZone.getGameAction().moveToHand(thisArtifact); - } - } - }//resolve() - }; - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Suffer the Past")) { - Cost cost = new Cost("X B", cardName, false); - Target tgt = new Target(card, "Select a Player", "Player"); - final SpellAbility spell = new Spell(card, cost, tgt) { - private static final long serialVersionUID = 1168802375190293222L; - - @Override - public void resolve() { - Player tPlayer = getTargetPlayer(); - Player player = card.getController(); - final int max = card.getXManaCostPaid(); - - CardList graveList = AllZoneUtil.getPlayerGraveyard(tPlayer); - int X = Math.min(max, graveList.size()); - - if (player.isHuman()) { - for (int i = 0; i < X; i++) { - Object o = GuiUtils.getChoice("Remove from game", graveList.toArray()); - if (o == null) break; - Card c_1 = (Card) o; - graveList.remove(c_1); //remove from the display list - AllZone.getGameAction().exile(c_1); - } - } else { //Computer - //Random random = MyRandom.random; - for (int j = 0; j < X; j++) { - //int index = random.nextInt(X-j); - AllZone.getGameAction().exile(graveList.get(j)); - } - } - - tPlayer.loseLife(X, card); - player.gainLife(X, card); - card.setXManaCostPaid(0); - } - - @Override - public void chooseTargetAI() { - setTargetPlayer(AllZone.getHumanPlayer()); - }//chooseTargetAI() - - @Override - public boolean canPlayAI() { - CardList graveList = AllZoneUtil.getPlayerGraveyard(AllZone.getHumanPlayer()); - - final int maxX = ComputerUtil.getAvailableMana().size() - 1; - return (maxX >= 3) && (graveList.size() > 0); - } - }; - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Demonic Consultation")) { - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = 1481101852928051519L; - - @Override - public void resolve() { - Player player = card.getController(); - CardList libList = AllZoneUtil.getPlayerCardsInLibrary(player); - final String[] input = new String[1]; - input[0] = JOptionPane.showInputDialog(null, "Which card?", "Pick card", JOptionPane.QUESTION_MESSAGE); - - for (int i = 0; i < 7; i++) { - Card c = libList.get(i); - AllZone.getGameAction().exile(c); - } - - int max = libList.size(); - int stop = 0; - for (int i = 0; i < max; i++) { - Card c = libList.get(i); - if (c.getName().equals(input[0])) { - if (stop == 0) { - AllZone.getGameAction().moveToHand(c); - stop = 1; - } - - } else if (stop == 0) { - AllZone.getGameAction().exile(c); - } - } - } - - @Override - public boolean canPlay() { - CardList libList = AllZoneUtil.getPlayerCardsInLibrary(card.getController()); - return libList.size() > 6 && super.canPlay(); - } - - @Override - public boolean canPlayAI() { - return false; - } - };//SpellAbility - - - - - spell.setStackDescription("Name a card. Exile the top six cards of your library, then reveal cards from the top of your library until you reveal the named card. Put that card into your hand and exile all other cards revealed this way"); - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Siren's Call")) { - /* - * Creatures the active player controls attack this turn if able. - * - * At the beginning of the next end step, destroy all non-Wall creatures - * that player controls that didn't attack this turn. Ignore this effect - * for each creature the player didn't control continuously since the - * beginning of the turn. - */ - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = -5746330758531799264L; - - @Override - public boolean canPlay() { - return PhaseUtil.isBeforeAttackersAreDeclared() && AllZone.getPhase().isPlayerTurn(card.getController().getOpponent()); - }//canPlay - - @Override - public boolean canPlayAI() { - return false; - }//canPlayAI - - @Override - public void resolve() { - //this needs to get a list of opponents creatures and set the siren flag - Player player = card.getController(); - Player opponent = player.getOpponent(); - CardList creatures = AllZoneUtil.getCreaturesInPlay(opponent); - for (Card creature : creatures) { - //skip walls, skip creatures with summoning sickness - //also skip creatures with haste if they came onto the battlefield this turn - if ((!creature.isWall() - && !creature.hasSickness()) - || (creature.hasKeyword("Haste") && creature.getTurnInZone() != 1)) { - creature.setSirenAttackOrDestroy(true); - //System.out.println("Siren's Call - setting flag for "+creature.getName()); - } - } - final SpellAbility destroy = new Ability(card, "0") { - @Override - public void resolve() { - Player player = card.getController(); - Player opponent = player.getOpponent(); - CardList creatures = AllZoneUtil.getCreaturesInPlay(opponent); - - for (Card creature : creatures) { - //System.out.println("Siren's Call - EOT - "+creature.getName() +" flag: "+creature.getSirenAttackOrDestroy()); - //System.out.println("Siren's Call - EOT - "+creature.getName() +" attacked?: "+creature.getCreatureAttackedThisCombat()); - if (creature.getSirenAttackOrDestroy() && !creature.getCreatureAttackedThisTurn()) { - if (AllZoneUtil.isCardInPlay(creature)) { - //System.out.println("Siren's Call - destroying "+creature.getName()); - //this should probably go on the stack - AllZone.getGameAction().destroy(creature); - } - } - creature.setSirenAttackOrDestroy(false); - } - } - }; - Command atEOT = new Command() { - private static final long serialVersionUID = 5369528776959445848L; - - public void execute() { - StringBuilder sb = new StringBuilder(); - sb.append(card).append(" - At the beginning of the next end step, destroy all non-Wall creatures that player controls that didn't attack this turn. "); - sb.append("Ignore this effect for each creature the player didn't control continuously since the beginning of the turn."); - destroy.setDescription(sb.toString()); - destroy.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(destroy); - }//execute - };//Command - AllZone.getEndOfTurn().addAt(atEOT); - }//resolve - };//SpellAbility - - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - All creatures that can attack must do so or be destroyed."); - spell.setStackDescription(sb.toString()); - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Telling Time")) { - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = 2626878556107707854L; - String[] prompt = new String[]{ - "Put a card into your hand", - "Put a card on top of library", - "Put a card on bottom of library" - }; - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public void resolve() { - PlayerZone lib = AllZone.getZone(Constant.Zone.Library, card.getController()); - CardList choices = new CardList(); - for (int i = 0; i < 3 && lib.size() > 0; i++) { - choices.add(lib.get(i)); - } - - for (int i = 0; i < 3 && !choices.isEmpty(); i++) { - Object o = GuiUtils.getChoice(prompt[i], choices.toArray()); - Card c1 = (Card) o; - if (i == 0) AllZone.getGameAction().moveToHand(c1); - else if (i == 1) AllZone.getGameAction().moveToLibrary(c1); - else if (i == 2) AllZone.getGameAction().moveToBottomOfLibrary(c1); - - choices.remove(c1); - } - } - }; - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Vengeful Dreams")) { - final CardList targets = new CardList(); - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = 1593405082929818055L; - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public void resolve() { - for (Card c : targets) { - if (AllZoneUtil.isCardInPlay(c) && CardFactoryUtil.canTarget(card, c)) { - AllZone.getGameAction().exile(c); - }//if isCardInPlay - } - targets.clear(); - } - }; - - Input runtime = new Input() { - private static final long serialVersionUID = 4656252051002867111L; - int max = 0; - - @Override - public void showMessage() { - PlayerZone hand = AllZone.getZone(Constant.Zone.Hand, AllZone.getHumanPlayer()); - AllZone.getGameAction().moveToStack(card); - hand.updateObservers(); - max = AllZoneUtil.getPlayerHand(card.getController()).size(); - if (max == targets.size()) done(); - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - Select target attacking creatures. Currently, ("); - sb.append(targets.size()).append(") selected."); - sb.append(" Press OK when done."); - AllZone.getDisplay().showMessage(sb.toString()); - ButtonUtil.enableAll(); - } - - @Override - public void selectButtonCancel() { - targets.clear(); - AllZone.getGameAction().moveToHand(card); - stop(); - } - - @Override - public void selectCard(Card c, PlayerZone zone) { - if (zone.is(Constant.Zone.Battlefield) && !targets.contains(c) - && CardFactoryUtil.canTarget(card, c) && c.isAttacking()) { - targets.add(c); - showMessage(); - } - } - - @Override - public void selectButtonOK() { - done(); - } - - private void done() { - if (targets.size() > AllZoneUtil.getPlayerHand(card.getController()).size()) stop(); - else { - card.getController().discard(targets.size(), spell, false); - stopSetNext(new Input_PayManaCost(spell)); - } - - } - }; - spell.setStackDescription(cardName + " - exile X attacking creatures."); - spell.setBeforePayMana(runtime); - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Firestorm")) { - final ArrayList targets = new ArrayList(); - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = -3763504534745192451L; - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public void resolve() { - int dmg = targets.size(); - for (Object o : targets) { - if (o instanceof Player) { - if (((Player) o).canTarget(this)) { - ((Player) o).addDamage(dmg, card); - } - } else if (o instanceof Card) { - if (AllZoneUtil.isCardInPlay((Card) o) && CardFactoryUtil.canTarget(card, (Card) o)) { - ((Card) o).addDamage(dmg, card); - }//if isCardInPlay - } - } - targets.clear(); - } - }; - - Input runtime = new Input() { - private static final long serialVersionUID = 5261183989797221059L; - - @Override - public void showMessage() { - PlayerZone hand = AllZone.getZone(Constant.Zone.Hand, AllZone.getHumanPlayer()); - AllZone.getGameAction().moveToStack(card); - hand.updateObservers(); - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - Select target creatures, players, and/or planeswalkers. Currently, ("); - sb.append(targets.size()).append(") selected."); - sb.append(" Press OK when done."); - AllZone.getDisplay().showMessage(sb.toString()); - ButtonUtil.enableAll(); - } - - @Override - public void selectButtonCancel() { - targets.clear(); - AllZone.getGameAction().moveToHand(card); - stop(); - } - - @Override - public void selectCard(Card c, PlayerZone zone) { - if (zone.is(Constant.Zone.Battlefield) && !targets.contains(c) - && CardFactoryUtil.canTarget(card, c) && - (c.isCreature() || c.isPlaneswalker())) { - targets.add(c); - showMessage(); - } - } - - @Override - public void selectPlayer(Player p) { - if (p.canTarget(spell) && !targets.contains(p)) { - targets.add(p); - showMessage(); - } - } - - @Override - public void selectButtonOK() { - done(); - } - - private void done() { - if (targets.size() > AllZoneUtil.getPlayerHand(card.getController()).size()) stop(); - else { - card.getController().discard(targets.size(), spell, true); - stopSetNext(new Input_PayManaCost(spell)); - } - - } - }; - spell.setStackDescription(cardName + " - deals X damage to each of X target creatures and/or players."); - spell.setBeforePayMana(runtime); - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Cryptic Command")) { - final SpellAbility[] m_spell = new SpellAbility[1]; - final Card[] m_perm = new Card[1]; - - final ArrayList userChoice = new ArrayList(); - - final String[] cardChoice = { - "Counter target spell", - "Return target permanent to its owner's hand", - "Tap all creatures your opponents control", - "Draw a card"}; - - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = 9178547049760990376L; - - @Override - public void resolve() { - - //"Counter target spell", - for (int i = 0; i < card.getChoices().size(); i++) { - if (card.getChoice(i).equals(cardChoice[0])) { - if (AllZone.getStack().size() > 0) { - SpellAbility sa = AllZone.getStack().peekAbility(); - if (sa.isSpell()) { - AllZone.getStack().pop(); - AllZone.getGameAction().moveToGraveyard(sa.getSourceCard()); - } - } - } - } - - //"Return target Permanent to its owner's hand", - if (userChoice.contains(cardChoice[1]) || card.getChoices().contains(cardChoice[1])) { - if (AllZoneUtil.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard())) { - AllZone.getGameAction().moveToHand(getTargetCard()); - } - } - - //"Tap all creatures your opponents control", - for (int i = 0; i < card.getChoices().size(); i++) { - if (card.getChoice(i).equals(cardChoice[2])) { - CardList creatures = AllZoneUtil.getCreaturesInPlay(card.getController().getOpponent()); - for (Card c : creatures) c.tap(); - } - } - - //"Draw a card" - if (userChoice.contains(cardChoice[3]) || card.getChoices().contains(cardChoice[3])) { - card.getController().drawCard(); - } - }//resolve() - - @Override - public boolean canPlayAI() { - return false; - } - };//SpellAbility - - final Command setStackDescription = new Command() { - - private static final long serialVersionUID = -4833850318955216009L; - - public void execute() { - ArrayList a = new ArrayList(); - if (userChoice.contains(cardChoice[0]) || card.getChoices().contains(cardChoice[0])) - a.add("counter target spell"); - if (userChoice.contains(cardChoice[1]) || card.getChoices().contains(cardChoice[1])) - a.add("return target permanent to its owner's hand"); - if (userChoice.contains(cardChoice[2]) || card.getChoices().contains(cardChoice[2])) - a.add("tap all creatures your opponents control"); - if (userChoice.contains(cardChoice[3]) || card.getChoices().contains(cardChoice[3])) - a.add(" Draw a card."); - - String s = a.get(0) + ", " + a.get(1); - spell.setStackDescription(card.getName() + " - " + s); - } - };//Command - - - final Input returnTarget = new Input() { - private static final long serialVersionUID = 2736368243448655071L; - - @Override - public void showMessage() { - AllZone.getDisplay().showMessage("Select target permanent"); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - stop(); - } - - @Override - public void selectCard(Card c, PlayerZone zone) { - if (c.isPermanent() && zone.is(Constant.Zone.Battlefield) && CardFactoryUtil.canTarget(card, c)) { - if (card.isCopiedSpell()) card.getChoiceTargets().remove(0); - m_perm[0] = c; - spell.setTargetCard(c); - card.setSpellChoiceTarget(String.valueOf(c.getUniqueNumber())); - setStackDescription.execute(); - stopSetNext(new Input_PayManaCost(spell)); - }//if - }//selectCard() - };//Input targetLand - - Input chooseTwoInput = new Input() { - private static final long serialVersionUID = -4200213000203960667L; - - @Override - public void showMessage() { - if (card.isCopiedSpell()) { - if (card.getChoices().contains(cardChoice[1])) stopSetNext(returnTarget); - else { - setStackDescription.execute(); - - stopSetNext(new Input_PayManaCost(spell)); - } - } else { - //reset variables - m_spell[0] = null; - m_perm[0] = null; - card.getChoices().clear(); - card.getChoiceTargets().clear(); - userChoice.clear(); - - ArrayList display = new ArrayList(); - - //get all - CardList list = AllZoneUtil.getCardsInPlay(); - - if (AllZone.getStack().size() > 0) display.add("Counter target spell"); - if (list.size() > 0) display.add("Return target permanent to its owner's hand"); - display.add("Tap all creatures your opponents control"); - display.add("Draw a card"); - - ArrayList a = chooseTwo(display); - //everything stops here if user cancelled - if (a == null) { - stop(); - return; - } - - userChoice.addAll(a); - - if (userChoice.contains(cardChoice[1])) stopSetNext(returnTarget); - else { - setStackDescription.execute(); - stopSetNext(new Input_PayManaCost(spell)); - } - } - }//showMessage() - - ArrayList chooseTwo(ArrayList choices) { - ArrayList out = new ArrayList(); - Object o = GuiUtils.getChoiceOptional("Choose Two", choices.toArray()); - if (o == null) return null; - - out.add((String) o); - card.addSpellChoice((String) o); - choices.remove(out.get(0)); - o = GuiUtils.getChoiceOptional("Choose Two", choices.toArray()); - if (o == null) return null; - - out.add((String) o); - card.addSpellChoice((String) o); - return out; - }//chooseTwo() - };//Input chooseTwoInput - - - - card.addSpellAbility(spell); - - card.setSpellWithChoices(true); - spell.setBeforePayMana(chooseTwoInput); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Remove Enchantments")) { - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = -7324132132222075031L; - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public void resolve() { - final Player you = card.getController(); - CardList ens = AllZoneUtil.getTypeInPlay("Enchantment"); - CardList toReturn = ens.filter(new CardListFilter() { - public boolean addCard(Card c) { - return (c.getOwner().isPlayer(you) && c.getController().isPlayer(you)) || - (c.isAura() && c.getEnchanting().get(0).getController().isPlayer(you)) || - (c.isAura() && c.getEnchanting().get(0).isAttacking() && - c.getEnchanting().get(0).getController().isPlayer(you.getOpponent())); - } - }); - for (Card c : toReturn) AllZone.getGameAction().moveToHand(c); - - for (Card c : ens) { - if (!toReturn.contains(c)) AllZone.getGameAction().destroy(c); - } - } - }; - - spell.setStackDescription(card + " - destroy/return enchantments."); - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Burn the Impure")) { - /* - * Burn the Impure deals 3 damage to target creature. If that - * creature has infect, Burn the Impure deals 3 damage to that - * creature's controller. - */ - Cost abCost = new Cost("1 R", cardName, false); - final SpellAbility spell = new Spell(card, abCost, new Target(card, "TgtC")) { - private static final long serialVersionUID = -3069135027502686218L; - int damage = 3; - - @Override - public void chooseTargetAI() { - - CardList creatures = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer()); - creatures = creatures.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getNetAttack() <= damage - && !c.hasKeyword("Indestructible"); - } - }); - CardList infect = creatures.filter(AllZoneUtil.getKeywordFilter("Infect")); - if (infect.size() > 0) { - Card c = CardFactoryUtil.AI_getBestCreature(infect); - setTargetCard(c); - } else { - Card c = CardFactoryUtil.AI_getBestCreature(creatures); - setTargetCard(c); - } - - }//chooseTargetAI() - - @Override - public boolean canPlayAI() { - CardList creatures = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer()); - creatures = creatures.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getNetAttack() <= damage - && !c.hasKeyword("Indestructible"); - } - }); - return creatures.size() > 0; - } - - @Override - public void resolve() { - if (AllZoneUtil.isCardInPlay(getTargetCard()) - && CardFactoryUtil.canTarget(card, getTargetCard())) { - Card c = getTargetCard(); - c.addDamage(damage, card); - if (c.hasKeyword("Infect")) c.getController().addDamage(3, card); - } - } - };//SpellAbility - - StringBuilder sb = new StringBuilder(); - sb.append(cardName); - sb.append(" deals 3 damage to target creature. If that creature has infect, "); - sb.append(cardName); - sb.append(" deals 3 damage to that creature's controller."); - spell.setDescription(sb.toString()); - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Turnabout")) { - /* - * Choose artifact, creature, or land. Tap all untapped permanents of the chosen - * type target player controls, or untap all tapped permanents of that type that - * player controls. - */ - Cost abCost = new Cost("2 U U", cardName, false); - Target target = new Target(card, "Select target player", "Player".split(",")); - final SpellAbility spell = new Spell(card, abCost, target) { - private static final long serialVersionUID = -2175586347805121896L; - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public void resolve() { - String[] choices = new String[]{"Artifact", "Creature", "Land"}; - Object o = GuiUtils.getChoice("Select permanent type", choices); - String cardType = (String) o; - CardList list = AllZoneUtil.getPlayerTypeInPlay(getTargetPlayer(), cardType); - - String[] tapOrUntap = new String[]{"Tap", "Untap"}; - Object z = GuiUtils.getChoice("Tap or Untap?", tapOrUntap); - boolean tap = (z.equals("Tap")) ? true : false; - - for (Card c : list) { - if (tap) c.tap(); - else c.untap(); - } - }//resolve() - };//SpellAbility - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Wing Puncture")) { - - Target t2 = new Target(card, "Select target creature with flying", "Creature.withFlying".split(",")); - final Ability_Sub sub = new Ability_Sub(card, t2) { - private static final long serialVersionUID = 4618047889975691050L; - - @Override - public boolean chkAI_Drawback() { - return false; - } - - @Override - public void resolve() { - Card myc = this.getParent().getTargetCard(); - Card tgt = getTargetCard(); - if (AllZoneUtil.isCardInPlay(myc) && AllZoneUtil.isCardInPlay(tgt)) { - if (CardFactoryUtil.canTarget(card, myc) && CardFactoryUtil.canTarget(card, tgt)) { - tgt.addDamage(myc.getNetAttack(), myc); - } - } - } - - @Override - public boolean doTrigger(boolean b) { - return false; - } - }; - - Cost abCost = new Cost("G", cardName, false); - Target t1 = new Target(card, "Select target creature you control", "Creature.YouCtrl".split(",")); - final SpellAbility spell = new Spell(card, abCost, t1) { - private static final long serialVersionUID = 8964235807056739219L; - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public void resolve() { - sub.resolve(); - } - }; - spell.setSubAbility(sub); - spell.setDescription("Target creature you control deals damage equal to its power to target creature with flying."); - spell.setStackDescription(card + " - Creature you control deals damage equal to its power to creature with flying."); - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - return card; - }//getCard -} diff --git a/src/forge/card/cardFactory/CardFactory_Lands.java b/src/forge/card/cardFactory/CardFactory_Lands.java deleted file mode 100644 index a09cb383ffb..00000000000 --- a/src/forge/card/cardFactory/CardFactory_Lands.java +++ /dev/null @@ -1,988 +0,0 @@ -package forge.card.cardFactory; - -import forge.*; -import forge.card.spellability.*; -import forge.gui.GuiUtils; -import forge.gui.input.Input; - -import javax.swing.*; - -/** - *

CardFactory_Lands class.

- * - * @author Forge - * @version $Id: $ - */ -class CardFactory_Lands { - - /** - *

getCard.

- * - * @param card a {@link forge.Card} object. - * @param cardName a {@link java.lang.String} object. - * @param owner a {@link forge.Player} object. - * @param cf a {@link forge.card.cardFactory.CardFactoryInterface} object. - * @return a {@link forge.Card} object. - */ - public static Card getCard(final Card card, final String cardName, Player owner, CardFactoryInterface cf) { - - - //*************** START *********** START ************************** - //Ravinca Dual Lands - if (cardName.equals("Blood Crypt") || cardName.equals("Breeding Pool") - || cardName.equals("Godless Shrine") || cardName.equals("Hallowed Fountain") - || cardName.equals("Overgrown Tomb") || cardName.equals("Sacred Foundry") - || cardName.equals("Steam Vents") || cardName.equals("Stomping Ground") - || cardName.equals("Temple Garden") || cardName.equals("Watery Grave")) { - //if this isn't done, computer plays more than 1 copy - //card.clearSpellAbility(); - card.clearSpellKeepManaAbility(); - - card.addComesIntoPlayCommand(new Command() { - private static final long serialVersionUID = 7352127748114888255L; - - public void execute() { - if (card.getController().isHuman()) { - humanExecute(); - } - else { - computerExecute(); - } - } - - public void computerExecute() { - boolean pay = false; - - if (AllZone.getComputerPlayer().getLife() > 9) { - pay = MyRandom.random.nextBoolean(); - } - - if (pay) { - AllZone.getComputerPlayer().loseLife(2, card); - } - else { - card.tap(); - } - } - - public void humanExecute() { - int life = card.getController().getLife(); - if (2 < life) { - - StringBuilder question = new StringBuilder(); - question.append("Pay 2 life? If you don't, ").append(card.getName()); - question.append(" enters the battlefield tapped."); - - if (GameActionUtil.showYesNoDialog(card, question.toString())) { - AllZone.getHumanPlayer().loseLife(2, card); - } else { - tapCard(); - } - - }//if - else { - tapCard(); - } - }//execute() - - private void tapCard() { - card.tap(); - } - }); - }//*************** END ************ END ************************** - - - /* - //*************** START *********** START ************************** - else if (cardName.equals("Sejiri Steppe")) { - final HashMap creatureMap = new HashMap(); - final SpellAbility[] a = new SpellAbility[1]; - final Command eot1 = new Command() { - private static final long serialVersionUID = 5106629534549783845L; - - public void execute() { - Card c = a[0].getTargetCard(); - if (AllZoneUtil.isCardInPlay(c)) { - String[] colors = creatureMap.get(c); - for (String col : colors) { - c.removeExtrinsicKeyword("Protection from " + col); - } - } - } - - ; - }; - - a[0] = new Ability(card, "0") { - @Override - public void resolve() { - String Color = ""; - - if (card.getController().isHuman()) { - if (AllZoneUtil.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard())) { - Object o = GuiUtils.getChoice("Choose mana color", Constant.Color.onlyColors); - Color = (String) o; - } - - } else { - CardList creature = AllZoneUtil.getCreaturesInPlay(AllZone.getComputerPlayer()); - creature = creature.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CardFactoryUtil.canTarget(a[0], c) && !c.hasKeyword("Defender"); - } - }); - Card biggest = null; - if (creature.size() > 0) { - biggest = creature.get(0); - - for (int i = 0; i < creature.size(); i++) { - if (biggest.getNetAttack() < creature.get(i).getNetAttack()) biggest = creature.get(i); - } - setTargetCard(biggest); - - } - CardList creature2 = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer()); - creature2 = creature2.filter(new CardListFilter() { - public boolean addCard(Card c) { - return (!c.isTapped() && !CardUtil.getColors(c).contains(Constant.Color.Colorless)); - } - }); - Card biggest2 = null; - if (creature2.size() > 0) { - biggest2 = creature2.get(0); - for (int i = 0; i < creature2.size(); i++) { - if (biggest2.getNetAttack() < creature2.get(i).getNetAttack()) - biggest2 = creature2.get(i); - } - if (biggest2 != null) { - if (biggest2.isGreen()) Color = "green"; - if (biggest2.isBlue()) Color = "blue"; - if (biggest2.isWhite()) Color = "white"; - if (biggest2.isRed()) Color = "red"; - if (biggest2.isBlack()) Color = "black"; - } else { - Color = "black"; - } - - } else { - Color = "black"; - } - } - Card Target = getTargetCard(); - if (Color != "" && Target != null) Target.addExtrinsicKeyword("Protection from " + Color); - ; - if (creatureMap.containsKey(Target)) { - int size = creatureMap.get(Target).length; - String[] newString = new String[size + 1]; - - for (int i = 0; i < size; i++) { - newString[i] = creatureMap.get(Target)[i]; - } - newString[size] = Color; - creatureMap.put(Target, newString); - } else creatureMap.put(Target, new String[]{Color}); - AllZone.getEndOfTurn().addUntil(eot1); - } - }; - - Command intoPlay = new Command() { - private static final long serialVersionUID = 5055232386220487221L; - - public void execute() { - CardList creats = AllZoneUtil.getCreaturesInPlay(card.getController()); - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - target creature you control gains protection from the color of your choice until end of turn"); - a[0].setStackDescription(sb.toString()); - if (card.getController().isHuman()) { - AllZone.getInputControl().setInput(CardFactoryUtil.input_targetSpecific(a[0], creats, "Select target creature you control", false, false)); - } else { - AllZone.getStack().addSimultaneousStackEntry(a[0]); - - } - } - }; - card.addComesIntoPlayCommand(intoPlay); - }//*************** END ************ END ************************** - */ - - - //*************** START *********** START ************************** - else if (cardName.equals("Dark Depths")) { - - card.addComesIntoPlayCommand(CardFactoryUtil.entersBattleFieldWithCounters(card, Counters.ICE, 10)); - - final SpellAbility ability = new Ability(card, "3") { - @Override - public boolean canPlay() { - for (int i = 0; i < AllZone.getStack().size(); i++) { - if (AllZone.getStack().peekInstance(i).getSourceCard().equals(card)) { - return false; - } - } - - if (card.getCounters(Counters.ICE) > 0 - && AllZoneUtil.isCardInPlay(card) - && super.canPlay()) { - return true; - } - else { - return false; - } - } - - @Override - public boolean canPlayAI() { - String phase = AllZone.getPhase().getPhase(); - return phase.equals(Constant.Phase.Main2) && super.canPlayAI(); - } - - @Override - public void resolve() { - card.subtractCounter(Counters.ICE, 1); - - if (card.getCounters(Counters.ICE) == 0) { - CardFactoryUtil.makeToken("Marit Lage", - "B 20 20 Marit Lage", card.getController(), "B", new String[]{"Legendary", "Creature", "Avatar"}, 20, - 20, new String[]{"Flying", "Indestructible"}); - AllZone.getGameAction().sacrifice(card); - } - } - }; - final SpellAbility sacrifice = new Ability(card, "0") { - //TODO - this should probably be a state effect - @Override - public boolean canPlay() { - return card.getCounters(Counters.ICE) == 0 && AllZoneUtil.isCardInPlay(card) && super.canPlay(); - } - - @Override - public boolean canPlayAI() { - return canPlay() && super.canPlayAI(); - } - - @Override - public void resolve() { - if (card.getCounters(Counters.ICE) == 0) { - CardFactoryUtil.makeToken("Marit Lage", - "B 20 20 Marit Lage", card.getController(), "B", new String[]{"Legendary", "Creature", "Avatar"}, 20, - 20, new String[]{"Flying", "Indestructible"}); - } - AllZone.getGameAction().sacrifice(card); - } - }; - //ability.setDescription("Dark Depths enters the battlefield with ten ice counters on it.\r\n\r\n3: Remove an ice counter from Dark Depths.\r\n\r\nWhen Dark Depths has no ice counters on it, sacrifice it. If you do, put an indestructible legendary 20/20 black Avatar creature token with flying named Marit Lage onto the battlefield."); - ability.setDescription("3: remove an Ice Counter."); - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - remove an ice counter."); - ability.setStackDescription(sb.toString()); - - card.addSpellAbility(ability); - sacrifice.setStackDescription("Sacrifice " + card.getName()); - card.addSpellAbility(sacrifice); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Novijen, Heart of Progress")) { - card.clearSpellKeepManaAbility(); - - final CardListFilter targets = new CardListFilter() { - - public boolean addCard(Card c) { - return AllZoneUtil.isCardInPlay(c) && c.isCreature() - && c.getTurnInZone() == AllZone.getPhase().getTurn(); - } - }; - - Cost abCost = new Cost("G U T", cardName, true); - Ability_Activated ability = new Ability_Activated(card, abCost, null) { - private static final long serialVersionUID = 1416258136308898492L; - - CardList inPlay = new CardList(); - - @Override - public boolean canPlayAI() { - if (!(AllZone.getPhase().getPhase().equals(Constant.Phase.Main1) - && AllZone.getPhase().getPlayerTurn().isComputer())) { - return false; - } - inPlay.clear(); - inPlay.addAll(AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer())); - return (inPlay.filter(targets).size() > 1) && super.canPlayAI(); - } - - @Override - public void resolve() { - inPlay.clear(); - inPlay.addAll(AllZoneUtil.getCardsInPlay()); - for (Card targ : inPlay.filter(targets)) { - targ.addCounter(Counters.P1P1, 1); - } - } - }; - ability.setDescription(abCost + "Put a +1/+1 counter on each creature that entered the battlefield this turn."); - ability.setStackDescription(cardName + " - Put a +1/+1 counter on each creature that entered the battlefield this turn."); - card.addSpellAbility(ability); - } - //*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Lotus Vale")) { - /* - * If Lotus Vale would enter the battlefield, sacrifice two untapped - * lands instead. If you do, put Lotus Vale onto the battlefield. - * If you don't, put it into its owner's graveyard. - */ - final Command comesIntoPlay = new Command() { - private static final long serialVersionUID = -194247993330560188L; - - final Player player = card.getController(); - - public void execute() { - if (player.isHuman()) { - final int[] paid = {0}; - - Input target = new Input() { - private static final long serialVersionUID = -7835834281866473546L; - - public void showMessage() { - AllZone.getDisplay().showMessage(cardName + " - Select an untapped land to sacrifice"); - ButtonUtil.enableOnlyCancel(); - } - - public void selectButtonCancel() { - AllZone.getGameAction().sacrifice(card); - stop(); - } - - public void selectCard(Card c, PlayerZone zone) { - if (c.isLand() && zone.is(Constant.Zone.Battlefield) && c.isUntapped()) { - AllZone.getGameAction().sacrifice(c); - if (paid[0] < 1) { - paid[0]++; - AllZone.getDisplay().showMessage(cardName + " - Select an untapped land to sacrifice"); - } else { - stop(); - } - } - }//selectCard() - };//Input - if ((AllZoneUtil.getPlayerLandsInPlay(AllZone.getHumanPlayer()).filter(AllZoneUtil.untapped).size() < 2)) { - AllZone.getGameAction().sacrifice(card); - return; - } else { - AllZone.getInputControl().setInput(target); - } - } else { - //compy can't play this card because it has no mana pool - } - } - }; - - card.addComesIntoPlayCommand(comesIntoPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Kjeldoran Outpost") || cardName.equals("Balduvian Trading Post") - || cardName.equals("Heart of Yavimaya") || cardName.equals("Lake of the Dead") - || cardName.equals("Soldevi Excavations")) { - - final String[] type = new String[1]; - if (cardName.equals("Kjeldoran Outpost")) { - type[0] = "Plains"; - } - else if (cardName.equals("Balduvian Trading Post")) { - type[0] = "Mountain.untapped"; - } - else if (cardName.equals("Heart of Yavimaya")) { - type[0] = "Forest"; - } - else if (cardName.equals("Lake of the Dead")) { - type[0] = "Swamp"; - } - else if (cardName.equals("Soldevi Excavations")) { - type[0] = "Island.untapped"; - } - - final Command comesIntoPlay = new Command() { - private static final long serialVersionUID = 6175830918425915833L; - final Player player = card.getController(); - - public void execute() { - final CardList land = AllZoneUtil.getPlayerCardsInPlay(player).getValidCards(type[0], player, card); - - if (player.isComputer()) { - if (land.size() > 0) { - CardList tappedLand = new CardList(land.toArray()); - tappedLand = tappedLand.filter(AllZoneUtil.tapped); - //if any are tapped, sacrifice it - //else sacrifice random - if (tappedLand.size() > 0) { - AllZone.getGameAction().sacrifice(tappedLand.get(0)); - } else { - AllZone.getGameAction().sacrifice(land.get(0)); - } - } else { - AllZone.getGameAction().sacrifice(card); - } - } else { //this is the human resolution - Input target = new Input() { - private static final long serialVersionUID = 6653677835621129465L; - - public void showMessage() { - AllZone.getDisplay().showMessage(cardName + " - Select one " + type[0] + " to sacrifice"); - ButtonUtil.enableOnlyCancel(); - } - - public void selectButtonCancel() { - AllZone.getGameAction().sacrifice(card); - stop(); - } - - public void selectCard(Card c, PlayerZone zone) { - if (c.isLand() && zone.is(Constant.Zone.Battlefield) && land.contains(c)) { - AllZone.getGameAction().sacrifice(c); - stop(); - } - }//selectCard() - };//Input - AllZone.getInputControl().setInput(target); - } - } - }; - - card.addComesIntoPlayCommand(comesIntoPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Sheltered Valley")) { - - final Command comesIntoPlay = new Command() { - private static final long serialVersionUID = 685604326470832887L; - - public void execute() { - final Player player = card.getController(); - CardList land = AllZoneUtil.getPlayerCardsInPlay(player, "Sheltered Valley"); - land.remove(card); - - if (land.size() > 0) { - for (Card c : land) { - AllZone.getGameAction().sacrifice(c); - } - } - } - }; - - card.addComesIntoPlayCommand(comesIntoPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Scorched Ruins")) { - final Command comesIntoPlay = new Command() { - private static final long serialVersionUID = 6175830918425915833L; - final Player player = card.getController(); - - public void execute() { - CardList plains = AllZoneUtil.getPlayerLandsInPlay(card.getController()); - plains = plains.filter(AllZoneUtil.untapped); - - if (player.isComputer()) { - if (plains.size() > 1) { - CardList tappedPlains = new CardList(plains.toArray()); - tappedPlains = tappedPlains.getType("Basic"); - for (Card c : tappedPlains) { - AllZone.getGameAction().sacrifice(c); - } - for (int i = 0; i < tappedPlains.size(); i++) { - AllZone.getGameAction().sacrifice(plains.get(i)); - } - //if any are tapped, sacrifice it - //else sacrifice random - } else { - AllZone.getGameAction().sacrifice(card); - } - } else { //this is the human resolution - final int[] paid = {0}; - if ((AllZoneUtil.getPlayerLandsInPlay(AllZone.getHumanPlayer()).filter(AllZoneUtil.untapped).size() < 2)) { - AllZone.getGameAction().sacrifice(card); - return; - } - Input target = new Input() { - private static final long serialVersionUID = 6653677835621129465L; - - public void showMessage() { - AllZone.getDisplay().showMessage("Scorched Ruins - Select an untapped land to sacrifice"); - ButtonUtil.enableOnlyCancel(); - } - - public void selectButtonCancel() { - AllZone.getGameAction().sacrifice(card); - stop(); - } - - public void selectCard(Card c, PlayerZone zone) { - if (c.isLand() && zone.is(Constant.Zone.Battlefield) && c.isUntapped()) { - AllZone.getGameAction().sacrifice(c); - if (paid[0] < 1) { - paid[0]++; - AllZone.getDisplay().showMessage("Scorched Ruins - Select an untapped land to sacrifice"); - } else { - stop(); - } - } - }//selectCard() - };//Input - AllZone.getInputControl().setInput(target); - } - } - }; - - card.addComesIntoPlayCommand(comesIntoPlay); - }//*************** END ************ END ************************** - - - //*************** START ************ START ************************** - else if (cardName.equals("Bottomless Vault") || cardName.equals("Dwarven Hold") - || cardName.equals("Hollow Trees") || cardName.equals("Icatian Store") - || cardName.equals("Sand Silos")) { - final int[] num = new int[1]; - String shortTemp = ""; - if (cardName.equals("Bottomless Vault")) { - shortTemp = "B"; - } - if (cardName.equals("Dwarven Hold")) { - shortTemp = "R"; - } - if (cardName.equals("Hollow Trees")) { - shortTemp = "G"; - } - if (cardName.equals("Icatian Store")) { - shortTemp = "W"; - } - if (cardName.equals("Sand Silos")) { - shortTemp = "U"; - } - - final String shortString = shortTemp; - StringBuilder desc = new StringBuilder(); - desc.append("tap, Remove any number of storage counters from ").append(cardName); - desc.append(": Add ").append(shortString); - desc.append(" to your mana pool for each charge counter removed this way."); - - final Ability_Mana abMana = new Ability_Mana(card, "0", shortString) { - private static final long serialVersionUID = -4506828762302357781L; - - @Override - public boolean canPlay() { - return false; - } - }; - abMana.setUndoable(false); - - final Ability addMana = new Ability(card, "0", desc.toString()) { - private static final long serialVersionUID = -7805885635696245285L; - - //@Override - public String mana() { - StringBuilder mana = new StringBuilder(); - if (num[0] == 0) { - mana.append("0"); - } - else { - for (int i = 0; i < num[0]; i++) { - mana.append(shortString).append(" "); - } - } - return mana.toString().trim(); - } - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public void resolve() { - abMana.produceMana(mana(), card.getController()); - } - }; - - Input runtime = new Input() { - private static final long serialVersionUID = -4990369861806627183L; - - @Override - public void showMessage() { - num[0] = card.getCounters(Counters.STORAGE); - String[] choices = new String[num[0] + 1]; - for (int j = 0; j <= num[0]; j++) { - choices[j] = "" + j; - } - String answer = (String) (GuiUtils.getChoiceOptional("Storage counters to remove", choices)); - if (null != answer && !answer.equals("")) { - num[0] = Integer.parseInt(answer); - card.tap(); - card.subtractCounter(Counters.STORAGE, num[0]); - stop(); - AllZone.getStack().add(addMana); - return; - } - stop(); - } - }; - - addMana.setDescription(desc.toString()); - addMana.setBeforePayMana(runtime); - card.addSpellAbility(addMana); - card.addSpellAbility(abMana); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - //Lorwyn Dual Lands, and a couple Morningtide... - else if (cardName.equals("Ancient Amphitheater") || cardName.equals("Auntie's Hovel") - || cardName.equals("Gilt-Leaf Palace") || cardName.equals("Secluded Glen") - || cardName.equals("Wanderwine Hub") - || cardName.equals("Rustic Clachan") || cardName.equals("Murmuring Bosk")) { - - String shortTemp = ""; - if (cardName.equals("Ancient Amphitheater")) { - shortTemp = "Giant"; - } - if (cardName.equals("Auntie's Hovel")) { - shortTemp = "Goblin"; - } - if (cardName.equals("Gilt-Leaf Palace")) { - shortTemp = "Elf"; - } - if (cardName.equals("Secluded Glen")) { - shortTemp = "Faerie"; - } - if (cardName.equals("Wanderwine Hub")) { - shortTemp = "Merfolk"; - } - if (cardName.equals("Rustic Clachan")) { - shortTemp = "Kithkin"; - } - if (cardName.equals("Murmuring Bosk")) { - shortTemp = "Treefolk"; - } - - final String type = shortTemp; - - - card.addComesIntoPlayCommand(new Command() { - private static final long serialVersionUID = -5646344170306812481L; - - public void execute() { - if (card.getController().isHuman()) { - humanExecute(); - } - else { - computerExecute(); - } - } - - public void computerExecute() { - CardList hand = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); - hand = hand.filter(AllZoneUtil.getTypeFilter(type)); - if (hand.size() > 0) { - revealCard(hand.get(0)); - } - else { - card.tap(); - } - } - - public void humanExecute() { - AllZone.getInputControl().setInput(new Input() { - private static final long serialVersionUID = -2774066137824255680L; - - @Override - public void showMessage() { - AllZone.getDisplay().showMessage(card.getName() + " - Reveal a card."); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectCard(Card c, PlayerZone zone) { - if (zone.is(Constant.Zone.Hand) && c.isType(type)) { - JOptionPane.showMessageDialog(null, "Revealed card: " + c.getName(), card.getName(), JOptionPane.PLAIN_MESSAGE); - stop(); - } - } - - @Override - public void selectButtonCancel() { - card.tap(); - stop(); - } - }); - }//execute() - - private void revealCard(Card c) { - JOptionPane.showMessageDialog(null, c.getController() + " reveals " + c.getName(), card.getName(), JOptionPane.PLAIN_MESSAGE); - } - }); - }//*************** END ************ END ************************** - - - //*************** START ************ START ************************** - else if (cardName.equals("Calciform Pools") || cardName.equals("Dreadship Reef") - || cardName.equals("Fungal Reaches") || cardName.equals("Molten Slagheap") - || cardName.equals("Saltcrusted Steppe")) { - /* - * tap, Remove X storage counters from Calciform Pools: Add X mana in any combination of W and/or U to your mana pool. - */ - final int[] num = new int[1]; - final int[] split = new int[1]; - - String pTemp = ""; - String sTemp = ""; - if (cardName.equals("Calciform Pools")) { - pTemp = "W"; - sTemp = "U"; - } - if (cardName.equals("Dreadship Reef")) { - pTemp = "U"; - sTemp = "B"; - } - if (cardName.equals("Fungal Reaches")) { - pTemp = "R"; - sTemp = "G"; - } - if (cardName.equals("Molten Slagheap")) { - pTemp = "B"; - sTemp = "R"; - } - if (cardName.equals("Saltcrusted Steppe")) { - pTemp = "G"; - sTemp = "W"; - } - - final String primary = pTemp; - final String secondary = sTemp; - - StringBuilder description = new StringBuilder(); - description.append("1, Remove X storage counters from ").append(cardName); - description.append(": Add X mana in any combination of ").append(primary); - description.append(" and/or ").append(secondary).append(" to your mana pool."); - - // This dummy AbMana is for Reflecting and for having an abMana produce mana - final Ability_Mana abMana = new Ability_Mana(card, "0", primary + " " + secondary) { - private static final long serialVersionUID = -4506828762302357781L; - - @Override - public boolean canPlay() { - return false; - } - }; - abMana.setUndoable(false); - - final Ability addMana = new Ability(card, "1", description.toString()) { - private static final long serialVersionUID = 7177960799748450242L; - - //@Override - public String mana() { - StringBuilder mana = new StringBuilder(); - for (int i = 0; i < split[0]; i++) { - mana.append(primary).append(" "); - } - for (int j = 0; j < num[0] - split[0]; j++) { - mana.append(secondary).append(" "); - } - return mana.toString().trim(); - } - - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public void resolve() { - abMana.setUndoable(false); - abMana.produceMana(mana(), card.getController()); - } - }; - - Input runtime = new Input() { - private static final long serialVersionUID = -8808673510875540608L; - - @Override - public void showMessage() { - num[0] = card.getCounters(Counters.STORAGE); - String[] choices = new String[num[0] + 1]; - for (int j = 0; j <= num[0]; j++) { - choices[j] = "" + j; - } - String answer = (String) (GuiUtils.getChoiceOptional( - "Storage counters to remove", choices)); - if (answer == null) { - stop(); - return; - } - - num[0] = Integer.parseInt(answer); - - String splitNum = (String) (GuiUtils.getChoiceOptional( - "Number of " + primary + " to add", choices)); - if (splitNum == null) { - stop(); - return; - } - - split[0] = Integer.parseInt(splitNum); - if (num[0] > 0 || split[0] > 0) { - card.subtractCounter(Counters.STORAGE, num[0]); - stop(); - AllZone.getStack().add(addMana); - return; - } - stop(); - } - }; - addMana.setDescription(description.toString()); - addMana.setAfterPayMana(runtime); - card.addSpellAbility(addMana); - card.addSpellAbility(abMana); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Crosis's Catacombs") || cardName.equals("Darigaaz's Caldera") - || cardName.equals("Dromar's Cavern") || cardName.equals("Rith's Grove") - || cardName.equals("Treva's Ruins")) { - final Command comesIntoPlay = new Command() { - private static final long serialVersionUID = 7813334062721799674L; - - public void execute() { - final Player player = card.getController(); - CardList land = AllZoneUtil.getPlayerLandsInPlay(player); - land = land.getNotType("Lair"); - - if (player.isComputer()) { - if (land.size() > 0) { - CardList tappedLand = new CardList(land.toArray()); - tappedLand = tappedLand.filter(AllZoneUtil.tapped); - if (tappedLand.size() > 0) { - AllZone.getGameAction().moveToHand(CardFactoryUtil.getWorstLand(tappedLand)); - } else { - AllZone.getGameAction().moveToHand(CardFactoryUtil.getWorstLand(land)); - } - } else { - AllZone.getGameAction().sacrifice(card); - } - } else { //this is the human resolution - Input target = new Input() { - private static final long serialVersionUID = 7944127258985401036L; - - public void showMessage() { - AllZone.getDisplay().showMessage(cardName + " - Select one non-Lair land to return to your hand"); - ButtonUtil.enableOnlyCancel(); - } - - public void selectButtonCancel() { - AllZone.getGameAction().sacrifice(card); - stop(); - } - - public void selectCard(Card c, PlayerZone zone) { - if (c.isLand() - && zone.is(Constant.Zone.Battlefield, AllZone.getHumanPlayer()) - && !c.isType("Lair")) { - AllZone.getGameAction().moveToHand(c); - stop(); - } - }//selectCard() - };//Input - AllZone.getInputControl().setInput(target); - } - } - }; - - card.addComesIntoPlayCommand(comesIntoPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Coral Atoll") || cardName.equals("Dormant Volcano") - || cardName.equals("Everglades") || cardName.equals("Jungle Basin") - || cardName.equals("Karoo")) { - - final String[] type = new String[1]; - if (cardName.equals("Coral Atoll")) { - type[0] = "Island"; - } - else if (cardName.equals("Dormant Volcano")) { - type[0] = "Mountain"; - } - else if (cardName.equals("Everglades")) { - type[0] = "Swamp"; - } - else if (cardName.equals("Jungle Basin")) { - type[0] = "Forest"; - } - else if (cardName.equals("Karoo")) { - type[0] = "Plains"; - } - - final SpellAbility sacOrNo = new Ability(card, "") { - @Override - public void resolve() { - final Player player = card.getController(); - final CardList land = AllZoneUtil.getPlayerCardsInPlay(player).getValidCards(type[0] + ".untapped", player, card); - - if (player.isComputer()) { - if (land.size() > 0) { - Card c = CardFactoryUtil.getWorstLand(land); - AllZone.getGameAction().moveToHand(c); - } else { - AllZone.getGameAction().sacrifice(card); - } - } else { //this is the human resolution - Input target = new Input() { - private static final long serialVersionUID = -7886610643693087790L; - - public void showMessage() { - AllZone.getDisplay().showMessage(card + " - Select one untapped " + type[0] + " to return"); - ButtonUtil.enableOnlyCancel(); - } - - public void selectButtonCancel() { - AllZone.getGameAction().sacrifice(card); - stop(); - } - - public void selectCard(Card c, PlayerZone zone) { - if (zone.is(Constant.Zone.Battlefield) && land.contains(c)) { - AllZone.getGameAction().moveToHand(c); - stop(); - } - }//selectCard() - };//Input - AllZone.getInputControl().setInput(target); - } - } - }; - sacOrNo.setStackDescription("When CARDNAME enters the battlefield, sacrifice it unless you return an untapped " + type[0] + " you control to its owner's hand."); - - final Command comesIntoPlay = new Command() { - private static final long serialVersionUID = -5777499632266148456L; - - public void execute() { - AllZone.getStack().addSimultaneousStackEntry(sacOrNo); - } - }; - - card.addComesIntoPlayCommand(comesIntoPlay); - }//*************** END ************ END ************************** - - return card; - } - -}//end class CardFactory_Lands diff --git a/src/forge/card/cardFactory/CardFactory_Planeswalkers.java b/src/forge/card/cardFactory/CardFactory_Planeswalkers.java deleted file mode 100644 index b25d328416f..00000000000 --- a/src/forge/card/cardFactory/CardFactory_Planeswalkers.java +++ /dev/null @@ -1,1754 +0,0 @@ -package forge.card.cardFactory; - - -import com.esotericsoftware.minlog.Log; -import forge.*; -import forge.card.spellability.*; -import forge.gui.GuiUtils; -import forge.gui.input.Input; - -import java.util.HashMap; - - -/** - *

CardFactory_Planeswalkers class.

- * - * @author Forge - * @version $Id: $ - */ -public class CardFactory_Planeswalkers { - /** - *

getCard.

- * - * @param card a {@link forge.Card} object. - * @param cardName a {@link java.lang.String} object. - * @param owner a {@link forge.Player} object. - * @return a {@link forge.Card} object. - */ - public static Card getCard(final Card card, String cardName, Player owner) { - // All Planeswalkers set their loyality in the beginning - if (card.getBaseLoyalty() > 0) - card.addComesIntoPlayCommand(CardFactoryUtil.entersBattleFieldWithCounters(card, Counters.LOYALTY, card.getBaseLoyalty())); - - //*************** START *********** START ************************** - if (cardName.equals("Elspeth, Knight-Errant")) { - //computer only plays ability 1 and 3, put 1/1 Soldier in play and make everything indestructible - final int turn[] = new int[1]; - turn[0] = -1; - - //ability2: target creature gets +3/+3 and flying until EOT - Target target2 = new Target(card, "TgtC"); - Cost cost2 = new Cost("AddCounter<1/LOYALTY>", cardName, true); - final SpellAbility ability2 = new Ability_Activated(card, cost2, target2) { - private static final long serialVersionUID = 6624768423224398603L; - - @Override - public void resolve() { - turn[0] = AllZone.getPhase().getTurn(); - final Card c = getTargetCard(); - - final Command eot = new Command() { - private static final long serialVersionUID = 94488363210770877L; - - public void execute() { - if (AllZoneUtil.isCardInPlay(c)) { - c.addTempAttackBoost(-3); - c.addTempDefenseBoost(-3); - c.removeExtrinsicKeyword("Flying"); - } - }//execute() - };//Command - if (AllZoneUtil.isCardInPlay(c) && CardFactoryUtil.canTarget(card, c)) { - c.addTempAttackBoost(3); - c.addTempDefenseBoost(3); - c.addExtrinsicKeyword("Flying"); - - AllZone.getEndOfTurn().addUntil(eot); - } - }//resolve() - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public boolean canPlay() { - - return 0 < card.getCounters(Counters.LOYALTY) - && AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.getPhase().getTurn() - && Phase.canCastSorcery(card.getController()); - - - }//canPlay() - };//SpellAbility ability2 - - //ability3 - Cost cost3 = new Cost("SubCounter<8/LOYALTY>", cardName, true); - final SpellAbility ability3 = new Ability_Activated(card, cost3, null) { - private static final long serialVersionUID = -830373718591602944L; - - @Override - public void resolve() { - turn[0] = AllZone.getPhase().getTurn(); - - Card emblem = new Card(); - //should we even name this permanent? - //emblem.setName("Elspeth Emblem"); - emblem.addIntrinsicKeyword("Indestructible"); - emblem.addIntrinsicKeyword("Shroud"); - emblem.addIntrinsicKeyword("Artifacts, creatures, enchantments, and lands you control are indestructible."); - emblem.setImmutable(true); - emblem.addType("Emblem"); - emblem.setController(card.getController()); - emblem.setOwner(card.getController()); - - AllZone.getGameAction().moveToPlay(emblem); - - //AllZone.getGameAction().checkStateEffects(); - AllZone.getStaticEffects().rePopulateStateBasedList(); - for (String effect : AllZone.getStaticEffects().getStateBasedMap().keySet()) { - Command com = GameActionUtil.commands.get(effect); - com.execute(); - } - } - - @Override - public boolean canPlay() { - return 8 <= card.getCounters(Counters.LOYALTY) - && AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.getPhase().getTurn() - && Phase.canCastSorcery(card.getController()); - }//canPlay() - - @Override - public boolean canPlayAI() { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isEmblem() - && c.hasKeyword("Artifacts, creatures, enchantments, and lands you control are indestructible."); - } - }); - return list.size() == 0 && card.getCounters(Counters.LOYALTY) > 8; - } - }; - - //ability 1: create white 1/1 token - Cost cost1 = new Cost("AddCounter<1/LOYALTY>", cardName, true); - final SpellAbility ability1 = new Ability_Activated(card, cost1, null) { - private static final long serialVersionUID = -6766888113766637596L; - - @Override - public void resolve() { - turn[0] = AllZone.getPhase().getTurn(); - - CardFactoryUtil.makeToken("Soldier", "W 1 1 Soldier", card.getController(), "W", new String[]{ - "Creature", "Soldier"}, 1, 1, new String[]{""}); - } - - @Override - public boolean canPlayAI() { - if (ability3.canPlay() && ability3.canPlayAI()) { - return false; - } else { - return true; - } - } - - @Override - public boolean canPlay() { - return 0 < card.getCounters(Counters.LOYALTY) - && AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.getPhase().getTurn() - && Phase.canCastSorcery(card.getController()); - }//canPlay() - };//SpellAbility ability1 - - ability1.setDescription("+1: Put a 1/1 white Soldier creature token onto the battlefield."); - ability1.setStackDescription(card + " - put a 1/1 white Soldier creature token onto the battlefield."); - card.addSpellAbility(ability1); - - ability2.setDescription("+1: Target creature gets +3/+3 and gains flying until end of turn."); - ability2.setStackDescription(card + " - creature gets +3/+3 and gains flying until EOT."); - - card.addSpellAbility(ability2); - - ability3.setDescription("-8: You get an emblem with \"Artifacts, creatures, enchantments, and lands you control are indestructible.\""); - ability3.setStackDescription(card + " - You get an emblem with \"Artifacts, creatures, enchantments, and lands you control are indestructible.\""); - card.addSpellAbility(ability3); - - card.setSVars(card.getSVars()); - card.setSets(card.getSets()); - - return card; - } - //*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Ajani Goldmane")) { - //computer only plays ability 1 and 3, gain life and put X/X token onto battlefield - final int turn[] = new int[1]; - turn[0] = -1; - - //ability2: Put a +1/+1 counter on each creature you control. Those creatures gain vigilance until end of turn. - final SpellAbility ability2 = new Ability(card, "0") { - final Command untilEOT = new Command() { - private static final long serialVersionUID = -5436621445704076988L; - - public void execute() { - Player player = card.getController(); - CardList creatures = AllZoneUtil.getCreaturesInPlay(player); - - for (int i = 0; i < creatures.size(); i++) { - Card card = creatures.get(i); - card.removeExtrinsicKeyword("Vigilance"); - } - } - }; - - @Override - public void resolve() { - card.subtractCounter(Counters.LOYALTY, 1); - turn[0] = AllZone.getPhase().getTurn(); - - Player player = card.getController(); - CardList creatures = AllZoneUtil.getCreaturesInPlay(player); - - for (int i = 0; i < creatures.size(); i++) { - Card card = creatures.get(i); - card.addCounter(Counters.P1P1, 1); - card.addExtrinsicKeyword("Vigilance"); - } - - AllZone.getEndOfTurn().addUntil(untilEOT); - } - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public boolean canPlay() { - - return 0 < card.getCounters(Counters.LOYALTY) - && AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.getPhase().getTurn() - && Phase.canCastSorcery(card.getController()); - - }//canPlay() - };//SpellAbility ability2 - - ability2.setBeforePayMana(new Input() { - private static final long serialVersionUID = 6373573398967821630L; - int check = -1; - - @Override - public void showMessage() { - if (check != AllZone.getPhase().getTurn()) { - check = AllZone.getPhase().getTurn(); - turn[0] = AllZone.getPhase().getTurn(); - AllZone.getStack().add(ability2); - } - stop(); - }//showMessage() - }); - - //ability3 - final SpellAbility ability3 = new Ability(card, "0") { - @Override - public void resolve() { - card.subtractCounter(Counters.LOYALTY, 6); - turn[0] = AllZone.getPhase().getTurn(); - - //Create token - int n = card.getController().getLife(); - CardFactoryUtil.makeToken("Avatar", "W N N Avatar", card.getController(), "W", new String[]{ - "Creature", "Avatar"}, n, n, - new String[]{"This creature's power and toughness are each equal to your life total"}); - } - - @Override - public boolean canPlay() { - return 6 <= card.getCounters(Counters.LOYALTY) - && AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.getPhase().getTurn() - && Phase.canCastSorcery(card.getController()); - }//canPlay() - - @Override - public boolean canPlayAI() { - // may be it's better to put only if you have less than 5 life - return true; - } - }; - ability3.setBeforePayMana(new Input() { - private static final long serialVersionUID = 7530960428366291386L; - - int check = -1; - - @Override - public void showMessage() { - if (check != AllZone.getPhase().getTurn()) { - check = AllZone.getPhase().getTurn(); - turn[0] = AllZone.getPhase().getTurn(); - AllZone.getStack().add(ability3); - } - stop(); - }//showMessage() - }); - - //ability 1: gain 2 life - final SpellAbility ability1 = new Ability(card, "0") { - @Override - public void resolve() { - card.addCounterFromNonEffect(Counters.LOYALTY, 1); - turn[0] = AllZone.getPhase().getTurn(); - - - card.getController().gainLife(2, card); - Log.debug("Ajani Goldmane", "current phase: " + AllZone.getPhase().getPhase()); - } - - @Override - public boolean canPlayAI() { - if (ability3.canPlay() && ability3.canPlayAI()) { - return false; - } else { - return true; - } - } - - @Override - public boolean canPlay() { - return 0 < card.getCounters(Counters.LOYALTY) - && AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.getPhase().getTurn() - && Phase.canCastSorcery(card.getController()); - }//canPlay() - };//SpellAbility ability1 - - ability1.setBeforePayMana(new Input() { - private static final long serialVersionUID = -7969603493514210825L; - - int check = -1; - - @Override - public void showMessage() { - if (check != AllZone.getPhase().getTurn()) { - check = AllZone.getPhase().getTurn(); - turn[0] = AllZone.getPhase().getTurn(); - AllZone.getStack().add(ability1); - } - stop(); - }//showMessage() - }); - - ability1.setDescription("+1: You gain 2 life."); - StringBuilder stack1 = new StringBuilder(); - stack1.append("Ajani Goldmane - ").append(card.getController()).append(" gains 2 life"); - ability1.setStackDescription(stack1.toString()); - // ability1.setStackDescription("Ajani Goldmane - " + card.getController() + " gains 2 life"); - card.addSpellAbility(ability1); - - ability2.setDescription("-1: Put a +1/+1 counter on each creature you control. Those creatures gain vigilance until end of turn."); - ability2.setStackDescription("Ajani Goldmane - Put a +1/+1 counter on each creature you control. They get vigilance."); - card.addSpellAbility(ability2); - - ability3.setDescription("-6: Put a white Avatar creature token onto the battlefield. It has \"This creature's power and toughness are each equal to your life total.\""); - ability3.setStackDescription("Ajani Goldmane - Put a X/X white Avatar creature token onto the battlefield."); - card.addSpellAbility(ability3); - - card.setSVars(card.getSVars()); - card.setSets(card.getSets()); - - return card; - } - //*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Chandra Nalaar")) { - //computer only plays ability 1 and 3, discard and return creature from graveyard to play - final int turn[] = new int[1]; - turn[0] = -1; - - //ability 1 - final SpellAbility ability1 = new Ability(card, "0") { - @Override - public void resolve() { - card.addCounterFromNonEffect(Counters.LOYALTY, 1); - turn[0] = AllZone.getPhase().getTurn(); - - if (getTargetCard() != null) { - if (AllZoneUtil.isCardInPlay(getTargetCard()) - && CardFactoryUtil.canTarget(card, getTargetCard())) { - Card c = getTargetCard(); - c.addDamage(1, card); - } - } else { - getTargetPlayer().addDamage(1, card); - } - } - - @Override - public boolean canPlay() { - for (int i = 0; i < AllZone.getStack().size(); i++) { - if (AllZone.getStack().peekInstance(i).getSourceCard().equals(card)) return false; - } - - return AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.getPhase().getTurn() - && Phase.canCastSorcery(card.getController()); - } - - @Override - public boolean canPlayAI() { - setTargetPlayer(AllZone.getHumanPlayer()); - setStackDescription("Chandra Nalaar - deals 1 damage to " + AllZone.getHumanPlayer()); - return card.getCounters(Counters.LOYALTY) < 8; - } - };//SpellAbility ability1 - - Input target1 = new Input() { - private static final long serialVersionUID = 5263705146686766284L; - - @Override - public void showMessage() { - AllZone.getDisplay().showMessage("Select target Player or Planeswalker"); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - stop(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (card.isPlaneswalker() && zone.is(Constant.Zone.Battlefield) && - CardFactoryUtil.canTarget(card, card)) { - ability1.setTargetCard(card); - //stopSetNext(new Input_PayManaCost(ability1)); - AllZone.getStack().add(ability1); - stop(); - } - }//selectCard() - - @Override - public void selectPlayer(Player player) { - ability1.setTargetPlayer(player); - //stopSetNext(new Input_PayManaCost(ability1)); - AllZone.getStack().add(ability1); - stop(); - } - }; - ability1.setBeforePayMana(target1); - ability1.setDescription("+1: Chandra Nalaar deals 1 damage to target player."); - card.addSpellAbility(ability1); - //end ability1 - - //ability 2 - final int damage2[] = new int[1]; - - final SpellAbility ability2 = new Ability(card, "0") { - @Override - public void resolve() { - turn[0] = AllZone.getPhase().getTurn(); - - card.subtractCounter(Counters.LOYALTY, damage2[0]); - getTargetCard().addDamage(damage2[0], card); - - damage2[0] = 0; - }//resolve() - - @Override - public boolean canPlay() { - for (int i = 0; i < AllZone.getStack().size(); i++) { - if (AllZone.getStack().peekInstance(i).getSourceCard().equals(card)) return false; - } - - return AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.getPhase().getTurn() - && Phase.canCastSorcery(card.getController()); - } - - @Override - public boolean canPlayAI() { - return false; - } - };//SpellAbility ability2 - - Input target2 = new Input() { - private static final long serialVersionUID = -2160464080456452897L; - - @Override - public void showMessage() { - AllZone.getDisplay().showMessage("Select target creature"); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - stop(); - } - - @Override - public void selectCard(Card c, PlayerZone zone) { - if (!CardFactoryUtil.canTarget(card, c)) { - AllZone.getDisplay().showMessage("Cannot target this card (Shroud? Protection?)."); - } else if (c.isCreature()) { - turn[0] = AllZone.getPhase().getTurn(); - - - damage2[0] = getDamage(); - - ability2.setTargetCard(c); - ability2.setStackDescription("Chandra Nalaar - deals damage to " + c); - - AllZone.getStack().add(ability2); - stop(); - } - }//selectCard() - - int getDamage() { - int size = card.getCounters(Counters.LOYALTY); - Object choice[] = new Object[size]; - - for (int i = 0; i < choice.length; i++) - choice[i] = Integer.valueOf(i + 1); - - Integer damage = (Integer) GuiUtils.getChoice("Select X", choice); - return damage.intValue(); - } - };//Input target - ability2.setBeforePayMana(target2); - ability2.setDescription("-X: Chandra Nalaar deals X damage to target creature."); - card.addSpellAbility(ability2); - //end ability2 - - - //ability 3 - final SpellAbility ability3 = new Ability(card, "0") { - @Override - public void resolve() { - card.subtractCounter(Counters.LOYALTY, 8); - turn[0] = AllZone.getPhase().getTurn(); - - getTargetPlayer().addDamage(10, card); - - CardList list = AllZoneUtil.getCreaturesInPlay(getTargetPlayer()); - - for (int i = 0; i < list.size(); i++) - list.get(i).addDamage(10, card); - }//resolve() - - @Override - public boolean canPlay() { - for (int i = 0; i < AllZone.getStack().size(); i++) { - if (AllZone.getStack().peekInstance(i).getSourceCard().equals(card)) return false; - } - - return AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.getPhase().getTurn() - && 7 < card.getCounters(Counters.LOYALTY) - && Phase.canCastSorcery(card.getController()); - } - - @Override - public boolean canPlayAI() { - setTargetPlayer(AllZone.getHumanPlayer()); - StringBuilder sb = new StringBuilder(); - sb.append("Chandra Nalaar - deals 10 damage to ").append(AllZone.getHumanPlayer()); - sb.append(" and each creature he or she controls."); - setStackDescription(sb.toString()); - //setStackDescription("Chandra Nalaar - deals 10 damage to " + AllZone.getHumanPlayer() - // + " and each creature he or she controls."); - return true; - } - };//SpellAbility ability3 - - Input target3 = new Input() { - private static final long serialVersionUID = -3014450919506364666L; - - @Override - public void showMessage() { - AllZone.getDisplay().showMessage("Select target player"); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - stop(); - } - - @Override - public void selectPlayer(Player player) { - turn[0] = AllZone.getPhase().getTurn(); - - ability3.setTargetPlayer(player); - - StringBuilder stack3 = new StringBuilder(); - stack3.append("Chandra Nalaar - deals 10 damage to ").append(player); - stack3.append(" and each creature he or she controls."); - ability3.setStackDescription(stack3.toString()); - //ability3.setStackDescription("Chandra Nalaar - deals 10 damage to " + player - // + " and each creature he or she controls."); - - AllZone.getStack().add(ability3); - stop(); - } - };//Input target - ability3.setBeforePayMana(target3); - ability3.setDescription("-8: Chandra Nalaar deals 10 damage to target player and each creature he or she controls."); - card.addSpellAbility(ability3); - //end ability3 - - card.setSVars(card.getSVars()); - card.setSets(card.getSets()); - - return card; - } - //*************** END ************ END ************************** - - //*************** START *********** START ************************** - else if (cardName.equals("Ajani Vengeant")) { - - //ability3 - Cost cost = new Cost("SubCounter<7/LOYALTY>", cardName, true); - final SpellAbility ability3 = new Ability_Activated(card, cost, new Target(card, "P")) { - private static final long serialVersionUID = -1200172251117224702L; - - @Override - public void resolve() { - Player player = getTargetPlayer(); - CardList land = AllZoneUtil.getPlayerCardsInPlay(player); - land = land.getType("Land"); - - for (Card c : land) { - AllZone.getGameAction().destroy(c); - } - }//resolve() - - @Override - public boolean canPlayAI() { - Player player = AllZone.getHumanPlayer(); - CardList land = AllZoneUtil.getPlayerCardsInPlay(player); - land = land.getType("Land"); - - setTargetPlayer(player); - return card.getCounters(Counters.LOYALTY) >= 8 && land.size() >= 3; - } - }; - ability3.setDescription("-7: Destroy all lands target player controls."); - ability3.getRestrictions().setPlaneswalker(true); - - card.addSpellAbility(ability3); - - return card; - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Tezzeret the Seeker")) { - final int turn[] = new int[1]; - turn[0] = -1; - - //ability1 - final SpellAbility ability1 = new Ability(card, "0") { - @Override - public void resolve() { - card.addCounterFromNonEffect(Counters.LOYALTY, 1); - - turn[0] = AllZone.getPhase().getTurn(); - - //only computer uses the stack - CardList tapped = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - tapped = tapped.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isArtifact() && c.isTapped() && CardFactoryUtil.canTarget(card, c); - } - }); - - for (int i = 0; i < 2 && i < tapped.size(); i++) - tapped.get(i).untap(); - }//resolve() - - @Override - public boolean canPlayAI() { - return card.getCounters(Counters.LOYALTY) <= 6 - && AllZone.getPhase().getPhase().equals(Constant.Phase.Main2); - } - - @Override - public boolean canPlay() { - return AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.getPhase().getTurn() - && Phase.canCastSorcery(card.getController()); - }//canPlay() - }; - final Input targetArtifact = new Input() { - - private static final long serialVersionUID = -7915255038817192835L; - private int count; - - @Override - public void showMessage() { - AllZone.getDisplay().showMessage("Select an artifact to untap"); - ButtonUtil.disableAll(); - } - - @Override - public void selectCard(Card c, PlayerZone zone) { - if (c.isArtifact() && zone.is(Constant.Zone.Battlefield) && CardFactoryUtil.canTarget(card, c)) { - count++; - c.untap(); - } - - //doesn't use the stack, its just easier this way - if (count == 2) { - count = 0; - turn[0] = AllZone.getPhase().getTurn(); - card.addCounterFromNonEffect(Counters.LOYALTY, 1); - stop(); - } - }//selectCard() - };//Input - - Input runtime1 = new Input() { - private static final long serialVersionUID = 871304623687370615L; - - @Override - public void showMessage() { - stopSetNext(targetArtifact); - } - };//Input - ability1.setDescription("+1: Untap up to two target artifacts."); - ability1.setStackDescription("Tezzeret the Seeker - Untap two target artifacts."); - - ability1.setBeforePayMana(runtime1); - card.addSpellAbility(ability1); - //end ability 1 - - - //ability 2 - final SpellAbility ability2 = new Ability(card, "0") { - @Override - public void resolve() { - turn[0] = AllZone.getPhase().getTurn(); - - int size = card.getCounters(Counters.LOYALTY) + 1; - Object choice[] = new Object[size]; - - for (int i = 0; i < choice.length; i++) - choice[i] = Integer.valueOf(i); - - Integer damage = (Integer) GuiUtils.getChoice("Select X", choice); - final int dam = damage.intValue(); - - card.subtractCounter(Counters.LOYALTY, dam); - - CardList list = AllZoneUtil.getPlayerCardsInLibrary(card.getController()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isArtifact() && CardUtil.getConvertedManaCost(c.getManaCost()) <= dam; - } - }); - - if (list.size() > 0) { - Object o = GuiUtils.getChoiceOptional("Select artifact", list); - if (o != null) { - Card c = (Card) o; - if (list.contains(c)) { - AllZone.getGameAction().moveToPlay(c); - } - } - } - }//resolve() - - @Override - public boolean canPlay() { - for (int i = 0; i < AllZone.getStack().size(); i++) { - if (AllZone.getStack().peekInstance(i).getSourceCard().equals(card)) return false; - } - - return AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.getPhase().getTurn() - && Phase.canCastSorcery(card.getController()); - } - - @Override - public boolean canPlayAI() { - return false; - } - };//SpellAbility ability2 - ability2.setDescription("-X: Search your library for an artifact card with converted mana cost X or less and put it onto the battlefield. Then shuffle your library."); - StringBuilder stack2 = new StringBuilder(); - stack2.append(card.getName()); - stack2.append(" - Search your library for an artifact card with converted mana cost X or less and put it onto the battlefield. Then shuffle your library."); - ability2.setStackDescription(stack2.toString()); - card.addSpellAbility(ability2); - - - final SpellAbility ability3 = new Ability(card, "0") { - @Override - public void resolve() { - - card.subtractCounter(Counters.LOYALTY, 5); - - turn[0] = AllZone.getPhase().getTurn(); - - CardList list = AllZoneUtil.getPlayerCardsInPlay(card.getController()); - list = list.getType("Artifact"); - CardList creatures = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isCreature(); - } - }); - - final HashMap tempCardMap = new HashMap(); - - for (Card creatureCard : creatures) { - Card crd = copyStats(creatureCard); - tempCardMap.put(creatureCard.getUniqueNumber(), crd); - //System.out.println("Just added:" + crd); - } - - for (Card c : list) { - final Card[] art = new Card[1]; - art[0] = c; - if (AllZoneUtil.isCardInPlay(art[0])) { - if (c.isCreature()) { - //Card crd = copyStats(art[0]); - //tempCards[c.getUniqueNumber()] = crd; - - final Command creatureUntilEOT = new Command() { - private static final long serialVersionUID = 5063161656920609389L; - - public void execute() { - final int id = art[0].getUniqueNumber(); - - Card tempCard = tempCardMap.get(id); - art[0].setBaseAttack(tempCard.getBaseAttack()); - art[0].setBaseDefense(tempCard.getBaseDefense()); - - } - };//Command - - art[0].setBaseAttack(5); - art[0].setBaseDefense(5); - - AllZone.getEndOfTurn().addUntil(creatureUntilEOT); - } else { - final Command nonCreatureUntilEOT = new Command() { - private static final long serialVersionUID = 248122386218960073L; - - public void execute() { - art[0].removeType("Creature"); - art[0].setBaseAttack(0); - art[0].setBaseDefense(0); - } - };//Command - - art[0].addType("Creature"); - art[0].setBaseAttack(5); - art[0].setBaseDefense(5); - - AllZone.getEndOfTurn().addUntil(nonCreatureUntilEOT); - }//noncreature artifact - - } - }//for - }//resolve - - @Override - public boolean canPlay() { - return AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.getPhase().getTurn() - && card.getCounters(Counters.LOYALTY) >= 5 - && Phase.canCastSorcery(card.getController()); - }//canPlay() - - @Override - public boolean canPlayAI() { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isArtifact() - && (!c.isCreature() || (c.isCreature() && c.getBaseAttack() < 4)) - && !c.hasSickness(); - } - }); - return list.size() > 4 && AllZone.getPhase().getPhase().equals("Main1") - && card.getCounters(Counters.LOYALTY) > 5; - } - }; - ability3.setDescription("-5: Artifacts you control become 5/5 artifact creatures until end of turn."); - StringBuilder stack3 = new StringBuilder(); - stack3.append(card.getName()).append(" - Artifacts you control become 5/5 artifact creatures until end of turn."); - ability3.setStackDescription(stack3.toString()); - card.addSpellAbility(ability3); - - card.setSVars(card.getSVars()); - card.setSets(card.getSets()); - - return card; - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Jace, the Mind Sculptor")) { - final int turn[] = new int[1]; - turn[0] = -1; - - Target t1 = new Target(card, "Select target player", "Player"); - Cost cost1 = new Cost("AddCounter<2/LOYALTY>", cardName, true); - - final SpellAbility ability1 = new Ability_Activated(card, cost1, t1) { - private static final long serialVersionUID = -986543400626807336L; - - @Override - public void resolve() { - turn[0] = AllZone.getPhase().getTurn(); - //card.addCounterFromNonEffect(Counters.LOYALTY, 2); - Player targetPlayer = getTargetPlayer(); - - PlayerZone lib = AllZone.getZone(Constant.Zone.Library, targetPlayer); - - if (lib.size() == 0) return; - - Card c = lib.get(0); - - if (card.getController().isHuman()) { - StringBuilder question = new StringBuilder(); - question.append("Put the card ").append(c).append(" on the bottom of the "); - question.append(c.getController()).append("'s library?"); - - if (GameActionUtil.showYesNoDialog(card, question.toString())) { - AllZone.getGameAction().moveToBottomOfLibrary(c); - } - - } else //compy - { - CardList land = AllZoneUtil.getPlayerLandsInPlay(AllZone.getHumanPlayer()); - - //TODO: improve this: - if (land.size() > 4 && c.isLand()) ; - else { - AllZone.getGameAction().moveToBottomOfLibrary(c); - } - } - } - - @Override - public boolean canPlayAI() { - return card.getCounters(Counters.LOYALTY) < 12 && AllZone.getHumanLibrary().size() > 2; - } - - @Override - public boolean canPlay() { - return AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.getPhase().getTurn() - && Phase.canCastSorcery(card.getController()); - }//canPlay() - }; - ability1.setDescription("+2: Look at the top card of target player's library. You may put that card on the bottom of that player's library."); - StringBuilder stack1 = new StringBuilder(); - stack1.append(card.getName()).append(" - Look at the top card of target player's library. You may put that card on the bottom of that player's library."); - ability1.setStackDescription(stack1.toString()); - - ability1.setChooseTargetAI(CardFactoryUtil.AI_targetHuman()); - card.addSpellAbility(ability1); - - final Ability ability2 = new Ability(card, "0") { - @Override - public void resolve() { - turn[0] = AllZone.getPhase().getTurn(); - card.getController().drawCards(3); - - Player player = card.getController(); - if (player.isHuman()) humanResolve(); - //else - // computerResolve(); - } - - public void humanResolve() { - CardList putOnTop = AllZoneUtil.getPlayerHand(AllZone.getHumanPlayer()); - - if (putOnTop.size() > 0) { - Object o = GuiUtils.getChoice("First card to put on top: ", putOnTop.toArray()); - if (o != null) { - Card c1 = (Card) o; - putOnTop.remove(c1); - AllZone.getGameAction().moveToLibrary(c1); - } - } - - putOnTop = AllZoneUtil.getPlayerHand(AllZone.getHumanPlayer()); - - if (putOnTop.size() > 0) { - Object o = GuiUtils.getChoice("Second card to put on top: ", putOnTop.toArray()); - if (o != null) { - Card c2 = (Card) o; - putOnTop.remove(c2); - AllZone.getGameAction().moveToLibrary(c2); - } - } - } - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public boolean canPlay() { - return AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.getPhase().getTurn() - && Phase.canCastSorcery(card.getController()); - }//canPlay() - }; - ability2.setDescription("0: Draw three cards, then put two cards from your hand on top of your library in any order."); - StringBuilder stack2 = new StringBuilder(); - stack2.append(card.getName()).append(" - Draw three cards, then put two cards from your hand on top of your library in any order."); - ability2.setStackDescription(stack2.toString()); - card.addSpellAbility(ability2); - - Cost cost = new Cost("SubCounter<1/LOYALTY>", cardName, true); - Target target = new Target(card, "TgtC"); - - final SpellAbility ability3 = new Ability_Activated(card, cost, target) { - private static final long serialVersionUID = -1113077473448818423L; - - @Override - public void resolve() { - turn[0] = AllZone.getPhase().getTurn(); - //card.subtractCounter(Counters.LOYALTY, 1); - - if (AllZoneUtil.isCardInPlay(getTargetCard()) - && CardFactoryUtil.canTarget(card, getTargetCard())) { - AllZone.getGameAction().moveToHand(getTargetCard()); - }//if - }//resolve() - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public boolean canPlay() { - return card.getCounters(Counters.LOYALTY) >= 1 - && AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.getPhase().getTurn() - && Phase.canCastSorcery(card.getController()); - } - }; - ability3.setDescription("-1: Return target creature to its owner's hand."); - StringBuilder stack3 = new StringBuilder(); - stack3.append(card.getName()).append(" - Return target creature to its owner's hand."); - ability3.setStackDescription(stack3.toString()); - card.addSpellAbility(ability3); - - Target target4 = new Target(card, "Select target player", "Player"); - Cost cost4 = new Cost("SubCounter<12/LOYALTY>", cardName, true); - final SpellAbility ability4 = new Ability_Activated(card, cost4, target4) { - private static final long serialVersionUID = 5512803971603404142L; - - @Override - public void resolve() { - turn[0] = AllZone.getPhase().getTurn(); - //card.subtractCounter(Counters.LOYALTY, 12); - - Player player = getTargetPlayer(); - - CardList libList = AllZoneUtil.getPlayerCardsInLibrary(player); - CardList handList = AllZoneUtil.getPlayerHand(player); - - for (Card c : libList) - AllZone.getGameAction().exile(c); - - for (Card c : handList) { - AllZone.getGameAction().moveToLibrary(c); - } - player.shuffle(); - } - - @Override - public boolean canPlayAI() { - int libSize = AllZone.getHumanLibrary().size(); - int handSize = AllZone.getHumanHand().size(); - return libSize > 0 && (libSize >= handSize); - } - - @Override - public boolean canPlay() { - return card.getCounters(Counters.LOYALTY) >= 12 - && AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.getPhase().getTurn() - && Phase.canCastSorcery(card.getController()); - } - }; - ability4.setDescription("-12: Exile all cards from target player's library, then that player shuffles his or her hand into his or her library."); - StringBuilder stack4 = new StringBuilder(); - stack4.append(card.getName()).append(" - Exile all cards from target player's library, then that player shuffles his or her hand into his or her library."); - ability4.setStackDescription(stack4.toString()); - ability4.setChooseTargetAI(CardFactoryUtil.AI_targetHuman()); - card.addSpellAbility(ability4); - - card.setSVars(card.getSVars()); - card.setSets(card.getSets()); - - return card; - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Sarkhan the Mad")) { - - //Planeswalker book-keeping - final int turn[] = new int[1]; - turn[0] = -1; - - //ability1 - /* - * 0: Reveal the top card of your library and put it into your hand. Sarkhan - * the Mad deals damage to himself equal to that card's converted mana cost. - */ - final SpellAbility ability1 = new Ability(card, "0") { - @Override - public void resolve() { - card.addCounterFromNonEffect(Counters.LOYALTY, 0); - turn[0] = AllZone.getPhase().getTurn(); - - final Player player = card.getController(); - PlayerZone lib = AllZone.getZone(Constant.Zone.Library, player); - - Card topCard = lib.get(0); - int convertedManaTopCard = CardUtil.getConvertedManaCost(topCard.getManaCost()); - CardList showTop = new CardList(); - showTop.add(topCard); - GuiUtils.getChoiceOptional("Revealed top card: ", showTop.toArray()); - - //now, move it to player's hand - AllZone.getGameAction().moveToHand(topCard); - - //now, do X damage to Sarkhan - card.addDamage(convertedManaTopCard, card); - - }//resolve() - - @Override - public boolean canPlayAI() { - //the computer isn't really smart enough to play this effectively, and it doesn't really - //help unless there are no cards in his hand - return false; - } - - @Override - public boolean canPlay() { - //looks like standard Planeswalker stuff... - //maybe should check if library is empty, or 1 card? - return AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.getPhase().getTurn() - && Phase.canCastSorcery(card.getController()); - }//canPlay() - }; - ability1.setDescription("0: Reveal the top card of your library and put it into your hand. Sarkhan the Mad deals damage to himself equal to that card's converted mana cost."); - StringBuilder stack1 = new StringBuilder(); - stack1.append(card.getName()).append(" - Reveal top card and do damage."); - ability1.setStackDescription(stack1.toString()); - - //ability2 - /* - * -2: Target creature's controller sacrifices it, then that player puts a 5/5 red Dragon - * creature token with flying onto the battlefield. - */ - Target target2 = new Target(card, "TgtC"); - Cost cost2 = new Cost("SubCounter<2/LOYALTY>", cardName, true); - final SpellAbility ability2 = new Ability_Activated(card, cost2, target2) { - private static final long serialVersionUID = 4322453486268967722L; - - @Override - public void resolve() { - //card.subtractCounter(Counters.LOYALTY, 2); - turn[0] = AllZone.getPhase().getTurn(); - - Card target = getTargetCard(); - AllZone.getGameAction().sacrifice(target); - //in makeToken, use target for source, so it goes into the correct Zone - CardFactoryUtil.makeToken("Dragon", "R 5 5 Dragon", target.getController(), "R", new String[]{"Creature", "Dragon"}, 5, 5, new String[]{"Flying"}); - - }//resolve() - - @Override - public boolean canPlayAI() { - CardList creatures = AllZoneUtil.getCreaturesInPlay(AllZone.getComputerPlayer()); - creatures = creatures.filter(new CardListFilter() { - public boolean addCard(Card c) { - return !(c.isToken() && c.isType("Dragon")); - } - }); - return creatures.size() >= 1; - } - - @Override - public void chooseTargetAI() { - CardList cards = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - //avoid targeting the dragon tokens we just put in play... - cards = cards.filter(new CardListFilter() { - public boolean addCard(Card c) { - return !(c.isToken() && c.isType("Dragon")); - } - }); - setTargetCard(CardFactoryUtil.AI_getCheapestCreature(cards, card, true)); - Log.debug("Sarkhan the Mad", "Sarkhan the Mad caused sacrifice of: " + - CardFactoryUtil.AI_getCheapestCreature(cards, card, true)); - } - - @Override - public boolean canPlay() { - return AllZone.getZone(card).is(Constant.Zone.Battlefield) - && card.getCounters(Counters.LOYALTY) >= 2 - && turn[0] != AllZone.getPhase().getTurn() - && Phase.canCastSorcery(card.getController()); - }//canPlay() - }; - ability2.setDescription("-2: Target creature's controller sacrifices it, then that player puts a 5/5 red Dragon creature token with flying onto the battlefield."); - - //ability3 - /* - * -4: Each Dragon creature you control deals damage equal to its - * power to target player. - */ - Target target3 = new Target(card, "Select target player", "Player"); - Cost cost3 = new Cost("SubCounter<4/LOYALTY>", cardName, true); - final SpellAbility ability3 = new Ability_Activated(card, cost3, target3) { - private static final long serialVersionUID = -5488579738767048060L; - - @Override - public void resolve() { - //card.subtractCounter(Counters.LOYALTY, 4); - turn[0] = AllZone.getPhase().getTurn(); - - final Player target = getTargetPlayer(); - final Player player = card.getController(); - CardList dragons = AllZoneUtil.getPlayerTypeInPlay(player, "Dragon"); - for (int i = 0; i < dragons.size(); i++) { - Card dragon = dragons.get(i); - int damage = dragon.getNetAttack(); - target.addDamage(damage, dragon); - } - - }//resolve() - - @Override - public boolean canPlayAI() { - setTargetPlayer(AllZone.getHumanPlayer()); - CardList dragons = AllZoneUtil.getPlayerTypeInPlay(AllZone.getComputerPlayer(), "Dragon"); - return card.getCounters(Counters.LOYALTY) >= 4 && dragons.size() >= 1; - } - - @Override - public boolean canPlay() { - return AllZone.getZone(card).is(Constant.Zone.Battlefield) - && card.getCounters(Counters.LOYALTY) >= 4 - && turn[0] != AllZone.getPhase().getTurn() - && Phase.canCastSorcery(card.getController()); - }//canPlay() - }; - ability3.setDescription("-4: Each Dragon creature you control deals damage equal to its power to target player."); - - card.addSpellAbility(ability1); - card.addSpellAbility(ability2); - card.addSpellAbility(ability3); - - card.setSVars(card.getSVars()); - card.setSets(card.getSets()); - - return card; - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Koth of the Hammer")) { - //computer only plays ability 1 and 3, put 1/1 Soldier in play and make everything indestructible - final int turn[] = new int[1]; - turn[0] = -1; - - //ability2: add R for each mountain - final SpellAbility ability2 = new Ability(card, "0") { - - @Override - public void resolve() { - - card.subtractCounter(Counters.LOYALTY, 2); - - turn[0] = AllZone.getPhase().getTurn(); - - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card crd) { - return crd.isType("Mountain"); - } - }); - - Ability_Mana abMana = new Ability_Mana(card, "0", "R", list.size()) { - private static final long serialVersionUID = -2182129023960978132L; - }; - abMana.setUndoable(false); - abMana.produceMana(); - - }//resolve() - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public boolean canPlay() { - - return 0 < card.getCounters(Counters.LOYALTY) - && AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.getPhase().getTurn() - && Phase.canCastSorcery(card.getController()); - - }//canPlay() - };//SpellAbility ability2 - - //ability3 - final SpellAbility ability3 = new Ability(card, "0") { - @Override - public void resolve() { - card.subtractCounter(Counters.LOYALTY, 5); - turn[0] = AllZone.getPhase().getTurn(); - - Card emblem = new Card(); - - emblem.addIntrinsicKeyword("Indestructible"); - emblem.addIntrinsicKeyword("Shroud"); - emblem.addIntrinsicKeyword("Mountains you control have 'tap: This land deals 1 damage to target creature or player.'"); - emblem.setImmutable(true); - emblem.addType("Emblem"); - emblem.setController(card.getController()); - emblem.setOwner(card.getOwner()); - - // TODO: Emblems live in the command zone - AllZone.getGameAction().moveToPlay(emblem); - - //AllZone.getGameAction().checkStateEffects(); - AllZone.getStaticEffects().rePopulateStateBasedList(); - for (String effect : AllZone.getStaticEffects().getStateBasedMap().keySet()) { - Command com = GameActionUtil.commands.get(effect); - com.execute(); - } - } - - @Override - public boolean canPlay() { - return 5 <= card.getCounters(Counters.LOYALTY) - && AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.getPhase().getTurn() - && Phase.canCastSorcery(card.getController()); - }//canPlay() - - @Override - public boolean canPlayAI() { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isEmblem() - && c.hasKeyword("Mountains you control have 'tap: This land deals 1 damage to target creature or player.'"); - } - }); - return list.size() == 0 && card.getCounters(Counters.LOYALTY) > 5; - } - }; - ability3.setBeforePayMana(new Input() { - private static final long serialVersionUID = -2054686425541429389L; - - int check = -1; - - @Override - public void showMessage() { - if (check != AllZone.getPhase().getTurn()) { - check = AllZone.getPhase().getTurn(); - turn[0] = AllZone.getPhase().getTurn(); - AllZone.getStack().add(ability3); - } - stop(); - }//showMessage() - }); - - //ability 1: make 4/4 out of moutain - final SpellAbility ability1 = new Ability(card, "0") { - @Override - public void resolve() { - card.addCounterFromNonEffect(Counters.LOYALTY, 1); - turn[0] = AllZone.getPhase().getTurn(); - - final Card card[] = new Card[1]; - card[0] = getTargetCard(); - - final int[] oldAttack = new int[1]; - final int[] oldDefense = new int[1]; - - oldAttack[0] = card[0].getBaseAttack(); - oldDefense[0] = card[0].getBaseDefense(); - - if (card[0].isType("Mountain")) { - card[0].untap(); - - card[0].setBaseAttack(4); - card[0].setBaseDefense(4); - card[0].addType("Creature"); - card[0].addType("Elemental"); - - //EOT - final Command untilEOT = new Command() { - - private static final long serialVersionUID = 6426615528873039915L; - - public void execute() { - card[0].setBaseAttack(oldAttack[0]); - card[0].setBaseDefense(oldDefense[0]); - - card[0].removeType("Creature"); - card[0].removeType("Elemental"); - } - }; - AllZone.getEndOfTurn().addUntil(untilEOT); - } - } - - @Override - public boolean canPlayAI() { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card crd) { - return crd.isEmblem() - && crd.hasKeyword("Mountains you control have 'tap: This land deals 1 damage to target creature or player.'"); - } - }); - - CardList mountains = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - mountains = mountains.filter(new CardListFilter() { - public boolean addCard(Card crd) { - return crd.isType("Mountain") - && CardFactoryUtil.canTarget(card, crd); - } - }); - CardListUtil.sortByTapped(mountains); - - if (mountains.size() == 0) - return false; - - if (ability3.canPlay() && ability3.canPlayAI() && list.size() == 0) { - return false; - } else { - setTargetCard(mountains.get(0)); - return true; - } - } - - @Override - public boolean canPlay() { - return 0 < card.getCounters(Counters.LOYALTY) - && AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.getPhase().getTurn() - && Phase.canCastSorcery(card.getController()); - }//canPlay() - };//SpellAbility ability1 - - Input runtime = new Input() { - private static final long serialVersionUID = -7823269301012427007L; - - @Override - public void showMessage() { - CardList lands = AllZoneUtil.getPlayerTypeInPlay(card.getController(), "Mountain"); - - stopSetNext(CardFactoryUtil.input_targetSpecific(ability1, lands, "Select target Mountain", - true, false)); - }//showMessage() - };//Input - - ability1.setBeforePayMana(runtime); - - ability1.setDescription("+1: Untap target Mountain. It becomes a 4/4 red Elemental creature until end of turn. It's still a land."); - //ability1.setStackDescription(""); - card.addSpellAbility(ability1); - - ability2.setDescription("-2: Add R to your mana pool for each Mountain you control."); - ability2.setStackDescription("Koth of the Hammer - Add R to your mana pool for each Mountain you control."); - card.addSpellAbility(ability2); - - ability3.setDescription("-5: You get an emblem with \"Mountains you control have 'tap: This land deals 1 damage to target creature or player.'\""); - ability3.setStackDescription("Koth of the Hammer - You get an emblem with \"Mountains you control have 'tap: This land deals 1 damage to target creature or player.'\""); - card.addSpellAbility(ability3); - - card.setSVars(card.getSVars()); - card.setSets(card.getSets()); - - return card; - } - //*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Venser, the Sojourner")) { - - final int turn[] = new int[1]; - turn[0] = -1; - - final SpellAbility ability1 = new Ability(card, "0") { - @Override - public void resolve() { - final Card c = getTargetCard(); - - if (c != null && AllZoneUtil.isCardInPlay(c)) { - final Command eot = new Command() { - - private static final long serialVersionUID = -947355314271308770L; - - public void execute() { - if (AllZoneUtil.isCardExiled(c)) { - PlayerZone play = AllZone.getZone(Constant.Zone.Battlefield, c.getOwner()); - AllZone.getGameAction().moveTo(play, AllZoneUtil.getCardState(c)); - } - }//execute() - };//Command - - card.addCounterFromNonEffect(Counters.LOYALTY, 2); - turn[0] = AllZone.getPhase().getTurn(); - - AllZone.getGameAction().exile(c); - AllZone.getEndOfTurn().addAt(eot); - } - - } - - @Override - public boolean canPlayAI() { - CardList list = AllZoneUtil.getCardsInPlay(); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CardFactoryUtil.canTarget(card, c) && c.getOwner().isComputer() && - !c.equals(card); - } - }); - if (list.size() > 0) { - - CardList bestCards = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getName().equals("Venerated Teacher") - || c.getName().equals("Stoneforge Mystic") - || c.getName().equals("Sun Titan") - || c.isType("Ally"); - } - }); - - if (bestCards.size() > 0) { - bestCards.shuffle(); - setTargetCard(bestCards.get(0)); - } - setTargetCard(list.get(0)); - } - - return card.getCounters(Counters.LOYALTY) < 8 && list.size() > 0 && - AllZone.getPhase().getPhase().equals("Main2"); - } - - @Override - public boolean canPlay() { - for (int i = 0; i < AllZone.getStack().size(); i++) { - if (AllZone.getStack().peekInstance(i).getSourceCard().equals(card)) return false; - } - return 0 < card.getCounters(Counters.LOYALTY) - && AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.getPhase().getTurn() - && Phase.canCastSorcery(card.getController()); - }//canPlay() - - };//SpellAbility ability1 - - Input runtime = new Input() { - private static final long serialVersionUID = 8609211991425118222L; - - @Override - public void showMessage() { - CardList list = AllZoneUtil.getCardsInPlay(); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isPermanent() && c.getOwner().isHuman() - && CardFactoryUtil.canTarget(card, c); - } - }); - - stopSetNext(CardFactoryUtil.input_targetSpecific(ability1, list, - "Select target permanent you own", true, false)); - }//showMessage() - };//Input - - - final SpellAbility ability2 = new Ability(card, "0") { - @Override - public void resolve() { - card.subtractCounter(Counters.LOYALTY, 1); - turn[0] = AllZone.getPhase().getTurn(); - - CardList list = AllZoneUtil.getCardsInPlay(); - list = list.getType("Creature"); - - for (int i = 0; i < list.size(); i++) { - final Card[] target = new Card[1]; - target[0] = list.get(i); - - final Command untilEOT = new Command() { - private static final long serialVersionUID = -7291011871465745495L; - - public void execute() { - if (AllZoneUtil.isCardInPlay(target[0])) { - target[0].removeExtrinsicKeyword("Unblockable"); - } - } - };//Command - - if (AllZoneUtil.isCardInPlay(target[0])) { - target[0].addExtrinsicKeyword("Unblockable"); - AllZone.getEndOfTurn().addUntil(untilEOT); - }//if - }//for - - }//resolve() - - @Override - public boolean canPlay() { - return AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.getPhase().getTurn() - && card.getCounters(Counters.LOYALTY) >= 1 - && Phase.canCastSorcery(card.getController()); - }//canPlay() - - @Override - public boolean canPlayAI() { - - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card crd) { - return crd.isEmblem() - && crd.hasKeyword("Whenever you cast a spell, exile target permanent."); - } - }); - - CardList creatList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - creatList = creatList.filter(new CardListFilter() { - public boolean addCard(Card crd) { - return CombatUtil.canAttack(crd); - } - }); - - return list.size() >= 1 - && card.getCounters(Counters.LOYALTY) > 2 - && creatList.size() >= 3 - && AllZone.getPhase().getPhase().equals("Main1"); - - } - };//SpellAbility ability2 - - - //ability3 - final SpellAbility ability3 = new Ability(card, "0") { - @Override - public void resolve() { - card.subtractCounter(Counters.LOYALTY, 8); - turn[0] = AllZone.getPhase().getTurn(); - - Card emblem = new Card(); - //should we even name this permanent? - //emblem.setName("Elspeth Emblem"); - emblem.addIntrinsicKeyword("Indestructible"); - emblem.addIntrinsicKeyword("Shroud"); - emblem.addIntrinsicKeyword("Whenever you cast a spell, exile target permanent."); - emblem.setImmutable(true); - emblem.addType("Emblem"); - emblem.setController(card.getController()); - emblem.setOwner(card.getOwner()); - - AllZone.getGameAction().moveToPlay(emblem); - } - - @Override - public boolean canPlay() { - return 8 <= card.getCounters(Counters.LOYALTY) - && AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.getPhase().getTurn() - && Phase.canCastSorcery(card.getController()); - }//canPlay() - - @Override - public boolean canPlayAI() { - //multiple venser emblems are NOT redundant - /* - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - list = list.filter(new CardListFilter(){ - public boolean addCard(Card c) - { - return c.isEmblem() - && c.hasKeyword("Whenever you cast a spell, exile target permanent."); - } - }); - */ - return card.getCounters(Counters.LOYALTY) > 8; - } - }; - - ability1.setBeforePayMana(runtime); - ability1.setDescription("+2: Exile target permanent you own. Return it to the battlefield under your control at the beginning of the next end step."); - card.addSpellAbility(ability1); - - ability2.setDescription("-1: Creatures are unblockable this turn."); - ability2.setStackDescription("Creatures are unblockable this turn."); - card.addSpellAbility(ability2); - - ability3.setDescription("-8: You get an emblem with \"Whenever you cast a spell, exile target permanent.\""); - StringBuilder stack3 = new StringBuilder(); - stack3.append(card.getName()).append("You get an emblem with \"Whenever you cast a spell, exile target permanent.\""); - ability3.setStackDescription(stack3.toString()); - card.addSpellAbility(ability3); - - card.setSVars(card.getSVars()); - card.setSets(card.getSets()); - - return card; - }//*************** END ************ END ************************** - - return card; - } - - - // copies stats like attack, defense, etc.. - /** - *

copyStats.

- * - * @param o a {@link java.lang.Object} object. - * @return a {@link forge.Card} object. - */ - private static Card copyStats(Object o) { - Card sim = (Card) o; - Card c = new Card(); - - c.setBaseAttack(sim.getBaseAttack()); - c.setBaseDefense(sim.getBaseDefense()); - c.setIntrinsicKeyword(sim.getKeyword()); - c.setName(sim.getName()); - c.setType(sim.getType()); - c.setText(sim.getSpellText()); - c.setManaCost(sim.getManaCost()); - - return c; - }// copyStats() -} diff --git a/src/forge/card/cardFactory/CardFactory_Sorceries.java b/src/forge/card/cardFactory/CardFactory_Sorceries.java deleted file mode 100644 index 87c71fc0c44..00000000000 --- a/src/forge/card/cardFactory/CardFactory_Sorceries.java +++ /dev/null @@ -1,3203 +0,0 @@ -package forge.card.cardFactory; - -import com.esotericsoftware.minlog.Log; -import forge.*; -import forge.card.spellability.*; -import forge.gui.GuiUtils; -import forge.gui.input.Input; -import forge.gui.input.Input_PayManaCost; - -import javax.swing.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map.Entry; -import java.util.Vector; - -/** - *

CardFactory_Sorceries class.

- * - * @author Forge - * @version $Id: $ - */ -public class CardFactory_Sorceries { - - /** - *

getCard.

- * - * @param card a {@link forge.Card} object. - * @param cardName a {@link java.lang.String} object. - * @param owner a {@link forge.Player} object. - * @return a {@link forge.Card} object. - */ - public static Card getCard(final Card card, final String cardName, Player owner) { - - //*************** START *********** START ************************** - if (cardName.equals("Political Trickery")) { - final Card[] target = new Card[2]; - final int[] index = new int[1]; - - final SpellAbility spell = new Spell(card) { - - private static final long serialVersionUID = -3075569295823682336L; - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public void resolve() { - - Card crd0 = target[0]; - Card crd1 = target[1]; - - if (crd0 != null && crd1 != null) { - Player p0 = crd0.getController(); - Player p1 = crd1.getController(); - AllZone.getGameAction().changeController(new CardList(crd0), p0, p1); - AllZone.getGameAction().changeController(new CardList(crd1), p1, p0); - } - - }//resolve() - };//SpellAbility - - - final Input input = new Input() { - - private static final long serialVersionUID = -1017253686774265770L; - - @Override - public void showMessage() { - if (index[0] == 0) AllZone.getDisplay().showMessage("Select target land you control."); - else AllZone.getDisplay().showMessage("Select target land opponent controls."); - - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - stop(); - } - - @Override - public void selectCard(Card c, PlayerZone zone) { - //must target creature you control - if (index[0] == 0 && !c.getController().equals(card.getController())) return; - - //must target creature you don't control - if (index[0] == 1 && c.getController().equals(card.getController())) return; - - - if (c.isLand() && zone.is(Constant.Zone.Battlefield) && CardFactoryUtil.canTarget(card, c)) { - target[index[0]] = c; - index[0]++; - showMessage(); - - if (index[0] == target.length) { - if (this.isFree()) { - this.setFree(false); - AllZone.getStack().add(spell); - stop(); - } else stopSetNext(new Input_PayManaCost(spell)); - } - } - }//selectCard() - };//Input - - Input runtime = new Input() { - - private static final long serialVersionUID = 4003351872990899418L; - - @Override - public void showMessage() { - index[0] = 0; - stopSetNext(input); - } - };//Input - - - - card.addSpellAbility(spell); - spell.setBeforePayMana(runtime); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Do or Die")) { - // TODO: Please please please, someone fix this card - Cost cost = new Cost("1 B", cardName, false); - Target tgt = new Target(card, "Select a Player", "Player"); - final SpellAbility spell = new Spell(card, cost, tgt) { - private static final long serialVersionUID = 8241241003478388362L; - - @Override - public boolean canPlayAI() { - return 4 <= CardFactoryUtil.AI_getHumanCreature(card, true).size(); - } - - @Override - public void resolve() { - CardList list = AllZoneUtil.getCreaturesInPlay(getTargetPlayer()); - - list.shuffle(); - - for (int i = 0; i < list.size() / 2; i++) - AllZone.getGameAction().destroyNoRegeneration(list.get(i)); - } - };//SpellAbility - spell.setChooseTargetAI(CardFactoryUtil.AI_targetHuman()); - - card.setSVar("PlayMain1", "TRUE"); - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Insurrection")) { - /* - * Untap all creatures and gain control of them until end of - * turn. They gain haste until end of turn. - */ - final ArrayList orig = new ArrayList(); - final PlayerZone[] newZone = new PlayerZone[1]; - final ArrayList controllerEOT = new ArrayList(); - final ArrayList targets = new ArrayList(); - - final Command untilEOT = new Command() { - private static final long serialVersionUID = -5809548350739536763L; - - public void execute() { - int i = 0; - for (Card target : targets) { - //if card isn't in play, do nothing - if (!AllZoneUtil.isCardInPlay(target)) continue; - - AllZone.getGameAction().changeController(new CardList(target), card.getController(), controllerEOT.get(i)); - - target.removeExtrinsicKeyword("Haste"); - - i++; - } - }//execute() - };//Command - - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = -532862769235091780L; - - @Override - public void resolve() { - CardList creatures = AllZoneUtil.getCreaturesInPlay(); - newZone[0] = AllZone.getZone(Constant.Zone.Battlefield, card.getController()); - ; - int i = 0; - for (Card target : creatures) { - if (AllZoneUtil.isCardInPlay(target)) { - orig.add(i, AllZone.getZone(target)); - controllerEOT.add(i, target.getController()); - targets.add(i, target); - - AllZone.getGameAction().changeController(new CardList(target), target.getController(), card.getController()); - - target.untap(); - target.addExtrinsicKeyword("Haste"); - }//is card in play? - }//end for - AllZone.getEndOfTurn().addUntil(untilEOT); - }//resolve() - - @Override - public boolean canPlayAI() { - CardList creatures = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer()); - return creatures.size() > 0 && AllZone.getPhase().getPhase().equals(Constant.Phase.Main1); - }//canPlayAI() - - };//SpellAbility - - - - card.addSpellAbility(spell); - card.setSVar("PlayMain1", "TRUE"); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Ignite Memories")) { - Target t = new Target(card, "Select target player", "Player"); - Cost cost = new Cost("4 R", cardName, false); - - SpellAbility spell = new Spell(card, cost, t) { - private static final long serialVersionUID = 143904782338241969L; - - @Override - public boolean canPlayAI() { - return AllZone.getPhase().getPhase().equals(Constant.Phase.Main2); - } - - @Override - public void resolve() { - Player player = getTargetPlayer(); - CardList handChoices = AllZoneUtil.getPlayerHand(player); - if (handChoices.size() > 0) { - Card choice = CardUtil.getRandom(handChoices.toArray()); - GuiUtils.getChoice("Random card", new CardList(choice)); - player.addDamage(CardUtil.getConvertedManaCost(choice.getManaCost()), card); - } - }//resolve() - }; - spell.setChooseTargetAI(CardFactoryUtil.AI_targetHuman()); - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Mind's Desire")) { - final Spell PlayCreature = new Spell(card) { - private static final long serialVersionUID = 53838791023456795L; - - @Override - public void resolve() { - Player player = card.getController(); - PlayerZone play = AllZone.getZone(Constant.Zone.Battlefield, player); - PlayerZone RFG = AllZone.getZone(Constant.Zone.Exile, player); - Card[] Attached = card.getAttachedCards(); - RFG.remove(Attached[0]); - play.add(Attached[0]); - card.unattachCard(Attached[0]); - }//resolve() - };//SpellAbility - - final Ability freeCast = new Ability(card, "0") { - private static final long serialVersionUID = 4455819149429678456L; - - @Override - public void resolve() { - Card target = null; - Card c = null; - Player player = card.getController(); - if (player.isHuman()) { - Card[] Attached = getSourceCard().getAttachedCards(); - Card[] Choices = new Card[Attached.length]; - boolean SystemsGo = true; - if (AllZone.getStack().size() > 0) { - CardList Config = new CardList(); - for (int i = 0; i < Attached.length; i++) { - if (Attached[i].isInstant() == true || Attached[i].hasKeyword("Flash") == true) - Config.add(Attached[i]); - } - for (int i = 0; i < Config.size(); i++) { - Card crd = Config.get(i); - Choices[i] = crd; - } - if (Config.size() == 0) SystemsGo = false; - } else { - for (int i = 0; i < Attached.length; i++) { - Choices[i] = Attached[i]; - } - } - Object check = null; - if (SystemsGo == true) { - check = GuiUtils.getChoiceOptional("Select Card to play for free", Choices); - if (check != null) { - target = ((Card) check); - } - if (target != null) c = AllZone.getCardFactory().copyCard(target); - - if (c != null) { - if (c.isLand()) { - if (player.canPlayLand()) { - player.playLand(c); - } else { - JOptionPane.showMessageDialog(null, "You can't play any more lands this turn.", "", JOptionPane.INFORMATION_MESSAGE); - } - } else if (c.isPermanent() == true && c.isAura() == false) { - c.removeIntrinsicKeyword("Flash"); // Stops the player from re-casting the flash spell. - - StringBuilder sb = new StringBuilder(); - sb.append(c.getName()).append(" - Copied from Mind's Desire"); - PlayCreature.setStackDescription(sb.toString()); - - Card[] ReAttach = new Card[Attached.length]; - ReAttach[0] = c; - int ReAttach_Count = 0; - for (int i = 0; i < Attached.length; i++) { - if (Attached[i] != target) { - ReAttach_Count = ReAttach_Count + 1; - ReAttach[ReAttach_Count] = Attached[i]; - } - } - // Clear Attached List - for (int i = 0; i < Attached.length; i++) { - card.unattachCard(Attached[i]); - } - // Re-add - for (int i = 0; i < ReAttach.length; i++) { - if (ReAttach[i] != null) card.attachCard(ReAttach[i]); - } - target.addSpellAbility(PlayCreature); - AllZone.getStack().add(PlayCreature); - } else { - AllZone.getGameAction().playCardNoCost(c); - card.unattachCard(c); - } - } else - JOptionPane.showMessageDialog(null, "Player cancelled or there is no more cards available on Mind's Desire.", "", JOptionPane.INFORMATION_MESSAGE); - } else - JOptionPane.showMessageDialog(null, "You can only play an instant at this point in time, but none are attached to Mind's Desire.", "", JOptionPane.INFORMATION_MESSAGE); - } - } - - public boolean canPlayAI() { - return false; - } - - }; - freeCast.setStackDescription("Mind's Desire - play card without paying its mana cost."); - - Command intoPlay = new Command() { - private static final long serialVersionUID = 920148510259054021L; - - public void execute() { - Player player = AllZone.getPhase().getPlayerTurn(); - PlayerZone Play = AllZone.getZone(Constant.Zone.Battlefield, player); - Card Minds_D = card; - if (player.isHuman()) card.getController().shuffle(); - CardList MindsList = AllZoneUtil.getPlayerCardsInPlay(player); - MindsList = MindsList.getName("Mind's Desire"); - MindsList.remove(card); - if (MindsList.size() > 0) { - Play.remove(card); - Minds_D = MindsList.get(0); - } else - JOptionPane.showMessageDialog(null, "Click Mind's Desire to see the available cards to play without paying its mana cost.", "", JOptionPane.INFORMATION_MESSAGE); - CardList libList = AllZoneUtil.getPlayerCardsInLibrary(player); - Card c = null; - if (libList.size() > 0) { - c = libList.get(0); - PlayerZone RFG = AllZone.getZone(Constant.Zone.Exile, player); - AllZone.getGameAction().moveTo(RFG, c); - Minds_D.attachCard(c); - } - final Card Minds = card; - // AllZone.getGameAction().exile(Minds); - Minds.setImmutable(true); - Command untilEOT = new Command() { - private static final long serialVersionUID = -28032591440730370L; - - public void execute() { - Player player = AllZone.getPhase().getPlayerTurn(); - PlayerZone play = AllZone.getZone(Constant.Zone.Battlefield, player); - play.remove(Minds); - } - }; - AllZone.getEndOfTurn().addUntil(untilEOT); - } - - }; - SpellAbility spell = new Spell_Permanent(card) { - private static final long serialVersionUID = -2940969025405788931L; - - @Override - public boolean canPlayAI() { - return false; - } - }; - - card.addComesIntoPlayCommand(intoPlay); - - - - card.addSpellAbility(spell); - card.addSpellAbility(freeCast); - spell.setDescription(""); - } - //*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Brilliant Ultimatum")) { - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = 1481112451519L; - - @Override - public void resolve() { - - Card choice = null; - - //check for no cards in hand on resolve - CardList lib = AllZoneUtil.getPlayerCardsInLibrary(card.getController()); - CardList cards = new CardList(); - CardList exiled = new CardList(); - if (lib.size() == 0) { - JOptionPane.showMessageDialog(null, "No more cards in library.", "", JOptionPane.INFORMATION_MESSAGE); - return; - } - int Count = 5; - if (lib.size() < 5) Count = lib.size(); - for (int i = 0; i < Count; i++) cards.add(lib.get(i)); - for (int i = 0; i < Count; i++) { - exiled.add(lib.get(i)); - AllZone.getGameAction().exile(lib.get(i)); - } - CardList Pile1 = new CardList(); - CardList Pile2 = new CardList(); - boolean stop = false; - int Pile1CMC = 0; - int Pile2CMC = 0; - - - GuiUtils.getChoice("Revealing top " + Count + " cards of library: ", cards.toArray()); - //Human chooses - if (card.getController().isComputer()) { - for (int i = 0; i < Count; i++) { - if (stop == false) { - choice = GuiUtils.getChoiceOptional("Choose cards to put into the first pile: ", cards.toArray()); - if (choice != null) { - Pile1.add(choice); - cards.remove(choice); - Pile1CMC = Pile1CMC + CardUtil.getConvertedManaCost(choice); - } else stop = true; - } - } - for (int i = 0; i < Count; i++) { - if (!Pile1.contains(exiled.get(i))) { - Pile2.add(exiled.get(i)); - Pile2CMC = Pile2CMC + CardUtil.getConvertedManaCost(exiled.get(i)); - } - } - StringBuilder sb = new StringBuilder(); - sb.append("You have spilt the cards into the following piles" + "\r\n" + "\r\n"); - sb.append("Pile 1: " + "\r\n"); - for (int i = 0; i < Pile1.size(); i++) sb.append(Pile1.get(i).getName() + "\r\n"); - sb.append("\r\n" + "Pile 2: " + "\r\n"); - for (int i = 0; i < Pile2.size(); i++) sb.append(Pile2.get(i).getName() + "\r\n"); - JOptionPane.showMessageDialog(null, sb, "", JOptionPane.INFORMATION_MESSAGE); - if (Pile1CMC >= Pile2CMC) { - JOptionPane.showMessageDialog(null, "Computer chooses the Pile 1", "", JOptionPane.INFORMATION_MESSAGE); - for (int i = 0; i < Pile1.size(); i++) { - ArrayList choices = Pile1.get(i).getBasicSpells(); - - for (SpellAbility sa : choices) { - if (sa.canPlayAI()) { - ComputerUtil.playStackFree(sa); - if (Pile1.get(i).isPermanent()) exiled.remove(Pile1.get(i)); - break; - } - } - } - } else { - JOptionPane.showMessageDialog(null, "Computer chooses the Pile 2", "", JOptionPane.INFORMATION_MESSAGE); - for (int i = 0; i < Pile2.size(); i++) { - ArrayList choices = Pile2.get(i).getBasicSpells(); - - for (SpellAbility sa : choices) { - if (sa.canPlayAI()) { - ComputerUtil.playStackFree(sa); - if (Pile2.get(i).isPermanent()) exiled.remove(Pile2.get(i)); - break; - } - } - } - } - - } else {//Computer chooses (It picks the highest converted mana cost card and 1 random card.) - Card biggest = exiled.get(0); - - for (Card c : exiled) - if (CardUtil.getConvertedManaCost(biggest.getManaCost()) < CardUtil.getConvertedManaCost(c.getManaCost())) - biggest = c; - - Pile1.add(biggest); - cards.remove(biggest); - if (cards.size() > 2) { - Card Random = CardUtil.getRandom(cards.toArray()); - Pile1.add(Random); - } - for (int i = 0; i < Count; i++) if (!Pile1.contains(exiled.get(i))) Pile2.add(exiled.get(i)); - StringBuilder sb = new StringBuilder(); - sb.append("Choose a pile to add to your hand: " + "\r\n" + "\r\n"); - sb.append("Pile 1: " + "\r\n"); - for (int i = 0; i < Pile1.size(); i++) sb.append(Pile1.get(i).getName() + "\r\n"); - sb.append("\r\n" + "Pile 2: " + "\r\n"); - for (int i = 0; i < Pile2.size(); i++) sb.append(Pile2.get(i).getName() + "\r\n"); - Object[] possibleValues = {"Pile 1", "Pile 2"}; - Object q = JOptionPane.showOptionDialog(null, sb, "Brilliant Ultimatum", - JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, - null, possibleValues, possibleValues[0]); - - CardList chosen; - if (q.equals(0)) - chosen = Pile1; - else - chosen = Pile2; - - int numChosen = chosen.size(); - for (int i = 0; i < numChosen; i++) { - Object check = GuiUtils.getChoiceOptional("Select spells to play in reverse order: ", chosen.toArray()); - if (check == null) - break; - - Card playing = (Card) check; - if (playing.isLand()) { - if (card.getController().canPlayLand()) { - card.getController().playLand(playing); - } else { - JOptionPane.showMessageDialog(null, "You can't play any more lands this turn.", "", JOptionPane.INFORMATION_MESSAGE); - } - } else { - AllZone.getGameAction().playCardNoCost(playing); - } - chosen.remove(playing); - } - - } - Pile1.clear(); - Pile2.clear(); - }//resolve() - - - @Override - public boolean canPlayAI() { - CardList cards = AllZoneUtil.getPlayerCardsInLibrary(AllZone.getComputerPlayer()); - return cards.size() >= 8; - } - };//SpellAbility - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Cranial Extraction")) { - Cost cost = new Cost("3 B", cardName, false); - Target tgt = new Target(card, "Select a Player", "Player"); - final SpellAbility spell = new Spell(card, cost, tgt) { - private static final long serialVersionUID = 8127696608769903507L; - - @Override - public void resolve() { - Player target = getTargetPlayer(); - String choice = null; - - //human chooses - if (card.getController().isHuman()) { - choice = JOptionPane.showInputDialog(null, "Name a nonland card", cardName, JOptionPane.QUESTION_MESSAGE); - - CardList showLibrary = AllZoneUtil.getPlayerCardsInLibrary(target); - GuiUtils.getChoiceOptional("Target Player's Library", showLibrary.toArray()); - - CardList showHand = AllZoneUtil.getPlayerHand(target); - GuiUtils.getChoiceOptional("Target Player's Hand", showHand.toArray()); - }//if - else //computer chooses - { - //the computer cheats by choosing a creature in the human players library or hand - CardList all = AllZoneUtil.getPlayerHand(target); - all.addAll(AllZoneUtil.getPlayerCardsInLibrary(target)); - - CardList four = all.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (c.isLand()) return false; - - return 3 < CardUtil.getConvertedManaCost(c.getManaCost()); - } - }); - if (!four.isEmpty()) choice = CardUtil.getRandom(four.toArray()).getName(); - else choice = CardUtil.getRandom(all.toArray()).getName(); - - }//else - remove(choice, target); - target.shuffle(); - }//resolve() - - void remove(String name, Player player) { - CardList all = AllZoneUtil.getPlayerHand(player); - all.addAll(AllZoneUtil.getPlayerGraveyard(player)); - all.addAll(AllZoneUtil.getPlayerCardsInLibrary(player)); - - for (int i = 0; i < all.size(); i++) { - if (all.get(i).getName().equals(name)) { - if (!all.get(i).isLand()) AllZone.getGameAction().exile(all.get(i)); - } - } - }//remove() - - @Override - public boolean canPlayAI() { - CardList c = AllZoneUtil.getPlayerCardsInLibrary(AllZone.getHumanPlayer()); - c = c.filter(AllZoneUtil.nonlands); - return c.size() > 0; - } - };//SpellAbility spell - - spell.setChooseTargetAI(CardFactoryUtil.AI_targetHuman()); - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Maelstrom Pulse")) { - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = -4050843868789582138L; - - @Override - public boolean canPlayAI() { - CardList c = getCreature(); - if (c.isEmpty()) return false; - else { - setTargetCard(c.get(0)); - return true; - } - }//canPlayAI() - - CardList getCreature() { - CardList out = new CardList(); - CardList list = CardFactoryUtil.AI_getHumanCreature("Flying", card, true); - list.shuffle(); - - for (int i = 0; i < list.size(); i++) - if ((list.get(i).getNetAttack() >= 2) && (list.get(i).getNetDefense() <= 2)) - out.add(list.get(i)); - - //in case human player only has a few creatures in play, target anything - if (out.isEmpty() && 0 < CardFactoryUtil.AI_getHumanCreature(2, card, true).size() - && 3 > CardFactoryUtil.AI_getHumanCreature(card, true).size()) { - out.addAll(CardFactoryUtil.AI_getHumanCreature(2, card, true)); - CardListUtil.sortFlying(out); - } - return out; - }//getCreature() - - - @Override - public void resolve() { - if (AllZoneUtil.isCardInPlay(getTargetCard()) - && CardFactoryUtil.canTarget(card, getTargetCard())) { - - AllZone.getGameAction().destroy(getTargetCard()); - - if (!getTargetCard().isFaceDown()) { - //get all creatures - CardList list = AllZoneUtil.getCardsInPlay(); - - list = list.getName(getTargetCard().getName()); - list.remove(getTargetCard()); - - if (!getTargetCard().isFaceDown()) for (int i = 0; i < list.size(); i++) - AllZone.getGameAction().destroy(list.get(i)); - }//is token? - }//in play? - }//resolve() - };//SpellAbility - - - - card.addSpellAbility(spell); - - Input target = new Input() { - private static final long serialVersionUID = -4947592326270275532L; - - @Override - public void showMessage() { - AllZone.getDisplay().showMessage("Select target nonland permanent for " + spell.getSourceCard()); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - stop(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (zone.is(Constant.Zone.Battlefield) && !card.isLand()) { - spell.setTargetCard(card); - if (this.isFree()) { - this.setFree(false); - AllZone.getStack().add(spell); - stop(); - } else stopSetNext(new Input_PayManaCost(spell)); - } - } - };//Input - - spell.setBeforePayMana(target); - }//*************** END ************ END *************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Erratic Explosion")) { - Cost cost = new Cost(card.getManaCost(), cardName, false); - Target tgt = new Target(card, "CP"); - final SpellAbility spell = new Spell(card, cost, tgt) { - private static final long serialVersionUID = -6003403347798646257L; - - int damage = 3; - Card check; - - @Override - public boolean canPlayAI() { - if (AllZone.getHumanPlayer().getLife() <= damage) return true; - - check = getFlying(); - return check != null; - } - - @Override - public void chooseTargetAI() { - if (AllZone.getHumanPlayer().getLife() <= damage) { - setTargetPlayer(AllZone.getHumanPlayer()); - return; - } - - Card c = getFlying(); - if ((c == null) || (!check.equals(c))) throw new RuntimeException(card - + " error in chooseTargetAI() - Card c is " + c + ", Card check is " + check); - - setTargetCard(c); - }//chooseTargetAI() - - //uses "damage" variable - Card getFlying() { - CardList flying = CardFactoryUtil.AI_getHumanCreature("Flying", card, true); - for (int i = 0; i < flying.size(); i++) - if (flying.get(i).getNetDefense() <= damage) return flying.get(i); - - return null; - } - - @Override - public void resolve() { - int damage = getDamage(); - - if (getTargetCard() != null) { - if (AllZoneUtil.isCardInPlay(getTargetCard()) - && CardFactoryUtil.canTarget(card, getTargetCard())) { - javax.swing.JOptionPane.showMessageDialog(null, "Erratic Explosion causes " + damage - + " to " + getTargetCard()); - - Card c = getTargetCard(); - c.addDamage(damage, card); - } - } else { - javax.swing.JOptionPane.showMessageDialog(null, "Erratic Explosion causes " + damage - + " to " + getTargetPlayer()); - getTargetPlayer().addDamage(damage, card); - } - } - - //randomly choose a nonland card - int getDamage() { - CardList notLand = AllZoneUtil.getPlayerCardsInLibrary(card.getController()); - notLand = notLand.filter(AllZoneUtil.nonlands); - notLand.shuffle(); - - if (notLand.isEmpty()) return 0; - - Card card = notLand.get(0); - return CardUtil.getConvertedManaCost(card.getSpellAbility()[0]); - } - };//SpellAbility - - - - - card.addSpellAbility(spell); - - card.setSVar("PlayMain1", "TRUE"); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Martial Coup")) { - - Cost cost = new Cost(card.getManaCost(), cardName, false); - SpellAbility spell = new Spell(card, cost, null) { - - private static final long serialVersionUID = -29101524966207L; - - @Override - public void resolve() { - CardList all = AllZoneUtil.getCardsInPlay(); - int Soldiers = card.getXManaCostPaid(); - for (int i = 0; i < Soldiers; i++) { - CardFactoryUtil.makeToken("Soldier", "W 1 1 Soldier", card.getController(), "W", new String[]{ - "Creature", "Soldier"}, 1, 1, new String[]{""}); - } - if (Soldiers >= 5) { - for (int i = 0; i < all.size(); i++) { - Card c = all.get(i); - if (c.isCreature()) AllZone.getGameAction().destroy(c); - } - } - }// resolve() - - @Override - public boolean canPlayAI() { - CardList human = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer()); - CardList computer = AllZoneUtil.getCreaturesInPlay(AllZone.getComputerPlayer()); - - // the computer will at least destroy 2 more human creatures - return (computer.size() < human.size() - 1 - || (AllZone.getComputerPlayer().getLife() < 7 && !human.isEmpty())) && ComputerUtil.getAvailableMana().size() >= 7; - } - };// SpellAbility - - - - card.addSpellAbility(spell); - }// *************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Incendiary Command")) { - //not sure what to call variables, so I just made up something - final Player[] m_player = new Player[1]; - final Card[] m_land = new Card[1]; - - final ArrayList userChoice = new ArrayList(); - - final String[] cardChoice = { - "Incendiary Command deals 4 damage to target player", - "Incendiary Command deals 2 damage to each creature", "Destroy target nonbasic land", - "Each player discards all cards in his or her hand, then draws that many cards"}; - - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = 9178547049760990376L; - - @Override - public void resolve() { - //System.out.println(userChoice); - //System.out.println(m_land[0]); - //System.out.println(m_player[0]); - - //"Incendiary Command deals 4 damage to target player", - for (int i = 0; i < card.getChoices().size(); i++) { - if (card.getChoice(i).equals(cardChoice[0])) { - if (card.getChoiceTarget(0).equals(AllZone.getHumanPlayer().getName())) { - setTargetPlayer(AllZone.getHumanPlayer()); - } else { - setTargetPlayer(AllZone.getComputerPlayer()); - } - getTargetPlayer().addDamage(4, card); - } - } - - //"Incendiary Command deals 2 damage to each creature", - if (userChoice.contains(cardChoice[1]) || card.getChoices().contains(cardChoice[1])) { - CardList list = AllZoneUtil.getCreaturesInPlay(); - - for (int i = 0; i < list.size(); i++) { - list.get(i).addDamage(2, card); - } - } - - //"Destroy target nonbasic land", - for (int i = 0; i < card.getChoices().size(); i++) { - if (card.getChoice(i).equals(cardChoice[2])) { - CardList all = AllZoneUtil.getCardsInPlay(); - for (int i2 = 0; i2 < all.size(); i2++) { - if (String.valueOf(all.get(i2).getUniqueNumber()).equals(card.getChoiceTarget(card.getChoices().size() - 1))) { - setTargetCard(all.get(i2)); - AllZone.getGameAction().destroy(getTargetCard()); - } - } - } - } - - //"Each player discards all cards in his or her hand, then draws that many cards" - if (userChoice.contains(cardChoice[3]) || card.getChoices().contains(cardChoice[3])) { - discardDraw(AllZone.getComputerPlayer()); - discardDraw(AllZone.getHumanPlayer()); - } - }//resolve() - - void discardDraw(Player player) { - CardList hand = AllZoneUtil.getPlayerHand(player); - int n = hand.size(); - - //technically should let the user discard one card at a time - //in case graveyard order matters - player.discard(n, this, true); - - player.drawCards(n); - } - - @Override - public boolean canPlayAI() { - return false; - } - };//SpellAbility - - final Command setStackDescription = new Command() { - - private static final long serialVersionUID = -4833850318955216009L; - - public void execute() { - ArrayList a = new ArrayList(); - if (userChoice.contains(cardChoice[0]) || card.getChoices().contains(cardChoice[0])) - a.add("deals 4 damage to " + m_player[0]); - - if (userChoice.contains(cardChoice[1]) || card.getChoices().contains(cardChoice[1])) - a.add("deals 2 damage to each creature"); - - if (userChoice.contains(cardChoice[2]) || card.getChoices().contains(cardChoice[2])) - a.add("destroy " + m_land[0]); - - if (userChoice.contains(cardChoice[3]) || card.getChoices().contains(cardChoice[3])) - a.add("each player discards all cards in his or her hand, then draws that many cards"); - - String s = a.get(0) + ", " + a.get(1); - spell.setStackDescription(card.getName() + " - " + s); - } - };//Command - - - final Input targetLand = new Input() { - private static final long serialVersionUID = 1485276539154359495L; - - @Override - public void showMessage() { - AllZone.getDisplay().showMessage("Select target nonbasic land"); - ButtonUtil.enableOnlyCancel(); - - } - - @Override - public void selectButtonCancel() { - stop(); - } - - @Override - public void selectCard(Card c, PlayerZone zone) { - if (c.isLand() - && zone.is(Constant.Zone.Battlefield) - && !c.isBasicLand()) { - if (card.isCopiedSpell()) card.getChoiceTargets().remove(0); - m_land[0] = c; - spell.setTargetCard(c); - card.setSpellChoiceTarget(String.valueOf(c.getUniqueNumber())); - setStackDescription.execute(); - stopSetNext(new Input_PayManaCost(spell)); - }//if - }//selectCard() - };//Input targetLand - - final Input targetPlayer = new Input() { - private static final long serialVersionUID = -2636869617248434242L; - - @Override - public void showMessage() { - AllZone.getDisplay().showMessage("Select target player"); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - stop(); - } - - @Override - public void selectPlayer(Player player) { - if (card.isCopiedSpell()) card.getChoiceTargets().remove(0); - m_player[0] = player; - spell.setTargetPlayer(player); - card.setSpellChoiceTarget(player.toString()); - setStackDescription.execute(); - //if user needs to target nonbasic land - if (userChoice.contains(cardChoice[2]) || card.getChoices().contains(cardChoice[2])) - stopSetNext(targetLand); - else { - stopSetNext(new Input_PayManaCost(spell)); - } - }//selectPlayer() - };//Input targetPlayer - - - Input chooseTwoInput = new Input() { - private static final long serialVersionUID = 5625588008756700226L; - - @Override - public void showMessage() { - if (card.isCopiedSpell()) { - if (card.getChoices().contains(cardChoice[0])) stopSetNext(targetPlayer); - else if (card.getChoices().contains(cardChoice[2])) stopSetNext(targetLand); - else { - setStackDescription.execute(); - - stopSetNext(new Input_PayManaCost(spell)); - } - } else { - //reset variables - m_player[0] = null; - m_land[0] = null; - card.getChoices().clear(); - card.getChoiceTargets().clear(); - userChoice.clear(); - - ArrayList display = new ArrayList(); - - //get all - CardList list = AllZoneUtil.getCardsInPlay(); - - CardList land = list.getType("Land"); - CardList basicLand = list.getType("Basic"); - - display.add("Incendiary Command deals 4 damage to target player"); - display.add("Incendiary Command deals 2 damage to each creature"); - if (land.size() != basicLand.size()) display.add("Destroy target nonbasic land"); - display.add("Each player discards all cards in his or her hand, then draws that many cards"); - - ArrayList a = chooseTwo(display); - //everything stops here if user cancelled - if (a == null) { - stop(); - return; - } - - userChoice.addAll(a); - - if (userChoice.contains(cardChoice[0])) stopSetNext(targetPlayer); - else if (userChoice.contains(cardChoice[2])) stopSetNext(targetLand); - else { - setStackDescription.execute(); - - stopSetNext(new Input_PayManaCost(spell)); - } - } - }//showMessage() - - ArrayList chooseTwo(ArrayList choices) { - ArrayList out = new ArrayList(); - Object o = GuiUtils.getChoiceOptional("Choose Two", choices.toArray()); - if (o == null) return null; - - out.add((String) o); - card.addSpellChoice((String) o); - choices.remove(out.get(0)); - o = GuiUtils.getChoiceOptional("Choose Two", choices.toArray()); - if (o == null) return null; - - out.add((String) o); - card.addSpellChoice((String) o); - return out; - }//chooseTwo() - };//Input chooseTwoInput - - - - card.addSpellAbility(spell); - - card.setSpellWithChoices(true); - spell.setBeforePayMana(chooseTwoInput); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Parallel Evolution")) { - SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = 3456160935845779623L; - - @Override - public boolean canPlayAI() { - CardList humTokenCreats = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer()); - humTokenCreats = humTokenCreats.filter(AllZoneUtil.token); - - CardList compTokenCreats = AllZoneUtil.getCreaturesInPlay(AllZone.getComputerPlayer()); - compTokenCreats = compTokenCreats.filter(AllZoneUtil.token); - - return compTokenCreats.size() > humTokenCreats.size(); - }//canPlayAI() - - @Override - public void resolve() { - CardList tokens = AllZoneUtil.getCreaturesInPlay(); - tokens = tokens.filter(AllZoneUtil.token); - - CardFactoryUtil.copyTokens(tokens); - - }//resolve() - };//SpellAbility - - spell.setDescription("For each creature token on the battlefield, its controller puts a token that's a copy of that creature onto the battlefield."); - spell.setStackDescription("Parallel Evolution - For each creature token on the battlefield, its controller puts a token that's a copy of that creature onto the battlefield."); - - card.setFlashback(true); - - - - card.addSpellAbility(spell); - card.addSpellAbility(CardFactoryUtil.ability_Flashback(card, "4 G G G")); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Global Ruin")) { - final CardList target = new CardList(); - final CardList saveList = new CardList(); - //need to use arrays so we can declare them final and still set the values in the input and runtime classes. This is a hack. - final int[] index = new int[1]; - final int[] countBase = new int[1]; - final Vector humanBasic = new Vector(); - - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = 5739127258598357186L; - - @Override - public boolean canPlayAI() { - return false; - //should check if computer has land in hand, or if computer has more basic land types than human. - } - - @Override - public void resolve() { - //add computer's lands to target - - //int computerCountBase = 0; - //Vector computerBasic = new Vector(); - - //figure out which basic land types the computer has - CardList land = AllZoneUtil.getPlayerLandsInPlay(AllZone.getComputerPlayer()); - String basic[] = {"Forest", "Plains", "Mountain", "Island", "Swamp"}; - - for (int i = 0; i < basic.length; i++) { - CardList cl = land.getType(basic[i]); - if (!cl.isEmpty()) { - //remove one land of this basic type from this list - //the computer AI should really jump in here and select the land which is the best. - //to determine the best look at which lands have enchantments, which lands are tapped - cl.remove(cl.get(0)); - //add the rest of the lands of this basic type to the target list, this is the list which will be sacrificed. - target.addAll(cl); - } - } - - //need to sacrifice the other non-basic land types - land = land.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (c.getName().contains("Dryad Arbor")) return true; - else if (!(c.isType("Forest") - || c.isType("Plains") - || c.isType("Mountain") - || c.isType("Island") - || c.isType("Swamp"))) return true; - else return false; - } - }); - target.addAll(land); - - //when this spell resolves all basic lands which were not selected are sacrificed. - for (int i = 0; i < target.size(); i++) - if (AllZoneUtil.isCardInPlay(target.get(i)) && !saveList.contains(target.get(i))) - AllZone.getGameAction().sacrifice(target.get(i)); - }//resolve() - };//SpellAbility - - - final Input input = new Input() { - private static final long serialVersionUID = 1739423591445361917L; - private int count; - - @Override - public void showMessage() { //count is the current index we are on. - //countBase[0] is the total number of basic land types the human has - //index[0] is the number to offset the index by - count = countBase[0] - index[0] - 1; //subtract by one since humanBasic is 0 indexed. - if (count < 0) { - //need to reset the variables in case they cancel this spell and it stays in hand. - humanBasic.clear(); - countBase[0] = 0; - index[0] = 0; - stop(); - } else { - AllZone.getDisplay().showMessage("Select target " + humanBasic.get(count) - + " land to not sacrifice"); - ButtonUtil.enableOnlyCancel(); - } - } - - @Override - public void selectButtonCancel() { - stop(); - } - - @Override - public void selectCard(Card c, PlayerZone zone) { - if (c.isLand() && zone.is(Constant.Zone.Battlefield) - && c.getController().isHuman() - /*&& c.getName().equals(humanBasic.get(count))*/ - && c.isType(humanBasic.get(count)) - /*&& !saveList.contains(c) */) { - //get all other basic[count] lands human player controls and add them to target - CardList land = AllZoneUtil.getPlayerLandsInPlay(AllZone.getHumanPlayer()); - CardList cl = land.getType(humanBasic.get(count)); - cl = cl.filter(new CardListFilter() { - public boolean addCard(Card crd) { - return !saveList.contains(crd); - } - }); - - if (!c.getName().contains("Dryad Arbor")) { - cl.remove(c); - saveList.add(c); - } - target.addAll(cl); - - index[0]++; - showMessage(); - - if (index[0] >= humanBasic.size()) stopSetNext(new Input_PayManaCost(spell)); - - //need to sacrifice the other non-basic land types - land = land.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (c.getName().contains("Dryad Arbor")) return true; - else if (!(c.isType("Forest") - || c.isType("Plains") - || c.isType("Mountain") - || c.isType("Island") - || c.isType("Swamp"))) return true; - else return false; - } - }); - target.addAll(land); - - } - }//selectCard() - };//Input - - Input runtime = new Input() { - private static final long serialVersionUID = -122635387376995855L; - - @Override - public void showMessage() { - countBase[0] = 0; - //figure out which basic land types the human has - //put those in an set to use later - CardList land = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - String basic[] = {"Forest", "Plains", "Mountain", "Island", "Swamp"}; - - for (int i = 0; i < basic.length; i++) { - CardList c = land.getType(basic[i]); - if (!c.isEmpty()) { - humanBasic.add(basic[i]); - countBase[0]++; - } - } - if (countBase[0] == 0) { - //human has no basic land, so don't prompt to select one. - stop(); - } else { - index[0] = 0; - target.clear(); - stopSetNext(input); - } - } - };//Input - - - - card.addSpellAbility(spell); - spell.setBeforePayMana(runtime); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Gerrard's Verdict")) { - SpellAbility spell = new Spell(card) { - - private static final long serialVersionUID = 4734024742326763385L; - - @Override - public boolean canPlayAI() { - PlayerZone humanHand = AllZone.getZone(Constant.Zone.Hand, AllZone.getHumanPlayer()); - if (humanHand.size() >= 2) return true; - else return false; - } - - @Override - public void resolve() { - Player player = card.getController(); - if (player.isHuman()) humanResolve(); - else computerResolve(); - } - - public void humanResolve() { - CardList list = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); - list.shuffle(); - - if (list.size() == 0) return; - - Card c1 = list.get(0); - list.remove(c1); - c1.getController().discard(c1, null); - - if (list.size() == 0) return; - - Card c2 = list.get(0); - list.remove(c2); - - c2.getController().discard(c2, null); - - if (c1.isLand()) { - AllZone.getHumanPlayer().gainLife(3, card); - } - - if (c2.isLand()) { - AllZone.getHumanPlayer().gainLife(3, card); - } - - - }//resolve() - - public void computerResolve() { - CardList list = AllZoneUtil.getPlayerHand(AllZone.getHumanPlayer()); - - if (list.size() > 0) { - - Object o = GuiUtils.getChoiceOptional("First card to discard", list.toArray()); - - Card c = (Card) o; - list.remove(c); - - c.getController().discard(c, null); - - if (c.isLand()) { - AllZone.getComputerPlayer().gainLife(3, card); - } - - if (list.size() > 0) { - Object o2 = GuiUtils.getChoiceOptional("Second card to discard", list.toArray()); - - Card c2 = (Card) o2; - list.remove(c2); - - c2.getController().discard(c2, null); - - if (c2.isLand()) { - AllZone.getComputerPlayer().gainLife(3, card); - } - } - } - } - }; - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Mind Funeral")) { - Cost cost = new Cost("1 U B", cardName, false); - Target tgt = new Target(card, "Select a Player", "Player"); - final SpellAbility spell = new Spell(card, cost, tgt) { - private static final long serialVersionUID = 42470566751344693L; - - @Override - public boolean canPlayAI() { - setTargetPlayer(AllZone.getHumanPlayer()); - CardList libList = AllZoneUtil.getPlayerCardsInLibrary(AllZone.getHumanPlayer()); - return libList.size() > 0; - } - - @Override - public void resolve() { - Player player = getTargetPlayer(); - - CardList libList = AllZoneUtil.getPlayerCardsInLibrary(player); - - int numLands = libList.getType("Land").size(); - - int total = 0; - if (numLands > 3) { // if only 3 or less lands in the deck everything is going - int landCount = 0; - - for (Card c : libList) { - total++; - if (c.isLand()) { - landCount++; - if (landCount == 4) - break; - } - } - } else { - total = libList.size(); - } - player.mill(total); - } - };//SpellAbility - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Haunting Echoes")) { - Cost cost = new Cost("3 B B", cardName, false); - Target tgt = new Target(card, "Select a Player", "Player"); - final SpellAbility spell = new Spell(card, cost, tgt) { - private static final long serialVersionUID = 42470566751344693L; - - @Override - public boolean canPlayAI() { - // Haunting Echoes shouldn't be cast if only basic land in graveyard or library is empty - CardList graveyard = AllZoneUtil.getPlayerGraveyard(AllZone.getHumanPlayer()); - CardList library = AllZoneUtil.getPlayerCardsInLibrary(AllZone.getHumanPlayer()); - int graveCount = graveyard.size(); - graveyard = graveyard.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isBasicLand(); - } - }); - - setTargetPlayer(AllZone.getHumanPlayer()); - - return ((graveCount - graveyard.size() > 0) && library.size() > 0); - } - - @Override - public void resolve() { - Player player = getTargetPlayer(); - - CardList grave = AllZoneUtil.getPlayerGraveyard(player); - grave = grave.getNotType("Basic"); - - CardList lib = AllZoneUtil.getPlayerCardsInLibrary(player); - - for (Card c : grave) { - CardList remLib = lib.getName(c.getName()); - for (Card rem : remLib) { - AllZone.getGameAction().exile(rem); - lib.remove(rem); - } - AllZone.getGameAction().exile(c); - } - } - };//SpellAbility - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - - //*************** START *********** START ************************** - else if (cardName.equals("Donate")) { - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = 782912579034503349L; - - @Override - public void resolve() { - Card c = getTargetCard(); - - if (c != null && AllZoneUtil.isCardInPlay(c) && CardFactoryUtil.canTarget(card, c)) { - // Donate should target both the player and the creature - if (!c.isAura()) { - AllZone.getGameAction().changeController(new CardList(c), c.getController(), c.getController().getOpponent()); - - } else //Aura - { - c.setController(card.getController().getOpponent()); - } - } - } - - @Override - public boolean canPlayAI() { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer(), "Illusions of Grandeur"); - - if (list.size() > 0) { - setTargetCard(list.get(0)); - return true; - } - return false; - } - }; - - Input runtime = new Input() { - private static final long serialVersionUID = -7823269301012427007L; - - @Override - public void showMessage() { - CardList perms = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - perms = perms.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isPermanent() && !c.getName().equals("Mana Pool"); - } - }); - - boolean free = false; - if (this.isFree()) free = true; - - stopSetNext(CardFactoryUtil.input_targetSpecific(spell, perms, - "Select a permanent you control", true, free)); - - }//showMessage() - };//Input - - spell.setBeforePayMana(runtime); - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - /* - //********************Start********Start*********************** - else if(cardName.equals("Living Death")) - { - final SpellAbility spell = new Spell(card) - { - private static final long serialVersionUID = -7657135492744579098L; - - public void resolve() - { //grab make 4 creature lists: human_play, human_graveyard, computer_play, computer_graveyard - CardList human_play = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer()); - - CardList human_graveyard = AllZoneUtil.getPlayerGraveyard(AllZone.getHumanPlayer()); - human_graveyard = human_graveyard.filter(AllZoneUtil.creatures); - - CardList computer_play = AllZoneUtil.getCreaturesInPlay(AllZone.getComputerPlayer()); - - CardList computer_graveyard = AllZoneUtil.getPlayerGraveyard(AllZone.getComputerPlayer()); - computer_graveyard = computer_graveyard.filter(AllZoneUtil.creatures); - - //TODO - the following code doesn't look like it's doing what it should to me... - Card c = new Card(); - Iterator it = human_play.iterator(); - while(it.hasNext()) - { - c = it.next(); - AllZone.getGameAction().moveTo(AllZone.getHumanBattlefield(),c); - AllZone.getGameAction().moveTo(AllZone.getHumanGraveyard(),c); - } - - it = human_graveyard.iterator(); - while(it.hasNext()) - { - c = it.next(); - AllZone.getGameAction().moveTo(AllZone.getHumanGraveyard(),c); - AllZone.getGameAction().moveTo(AllZone.getHumanBattlefield(),c); - } - - it = computer_play.iterator(); - while(it.hasNext()) - { - c = it.next(); - AllZone.getGameAction().moveTo(AllZone.getComputerBattlefield(),c); - AllZone.getGameAction().moveTo(AllZone.getComputerGraveyard(),c); - } - - it = computer_graveyard.iterator(); - while(it.hasNext()) - { - c = it.next(); - AllZone.getGameAction().moveTo(AllZone.getComputerGraveyard(),c); - AllZone.getGameAction().moveTo(AllZone.getComputerBattlefield(),c); - } - - }//resolve - };//spellability - - - - card.addSpellAbility(spell); - }//*********************END**********END*********************** - */ - - //*************** START *********** START ************************** - else if (cardName.equals("Balance")) { - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = -5941893280103164961L; - - public void resolve() { - //Lands: - CardList humLand = AllZoneUtil.getPlayerLandsInPlay(AllZone.getHumanPlayer()); - CardList compLand = AllZoneUtil.getPlayerLandsInPlay(AllZone.getComputerPlayer()); - - if (compLand.size() > humLand.size()) { - compLand.shuffle(); - for (int i = 0; i < compLand.size() - humLand.size(); i++) - AllZone.getGameAction().sacrifice(compLand.get(i)); - } else if (humLand.size() > compLand.size()) { - int diff = humLand.size() - compLand.size(); - AllZone.getInputControl().setInput(PlayerUtil.input_sacrificePermanents(diff, "Land")); - } - - //Hand - CardList humHand = AllZoneUtil.getPlayerHand(AllZone.getHumanPlayer()); - CardList compHand = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); - int handDiff = Math.abs(humHand.size() - compHand.size()); - - if (compHand.size() > humHand.size()) { - AllZone.getComputerPlayer().discard(handDiff, this, false); - } else if (humHand.size() > compHand.size()) { - AllZone.getHumanPlayer().discard(handDiff, this, false); - } - - //Creatures: - CardList humCreats = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer()); - CardList compCreats = AllZoneUtil.getCreaturesInPlay(AllZone.getComputerPlayer()); - - if (compCreats.size() > humCreats.size()) { - CardListUtil.sortAttackLowFirst(compCreats); - CardListUtil.sortCMC(compCreats); - compCreats.reverse(); - for (int i = 0; i < compCreats.size() - humCreats.size(); i++) - AllZone.getGameAction().sacrifice(compCreats.get(i)); - } else if (humCreats.size() > compCreats.size()) { - int diff = humCreats.size() - compCreats.size(); - AllZone.getInputControl().setInput(PlayerUtil.input_sacrificePermanents(diff, "Creature")); - } - } - - public boolean canPlayAI() { - int diff = 0; - CardList humLand = AllZoneUtil.getPlayerLandsInPlay(AllZone.getHumanPlayer()); - CardList compLand = AllZoneUtil.getPlayerLandsInPlay(AllZone.getComputerPlayer()); - diff += humLand.size() - compLand.size(); - - CardList humCreats = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer()); - CardList compCreats = AllZoneUtil.getCreaturesInPlay(AllZone.getComputerPlayer()); - compCreats = compCreats.getType("Creature"); - diff += 1.5 * (humCreats.size() - compCreats.size()); - - CardList humHand = AllZoneUtil.getPlayerHand(AllZone.getHumanPlayer()); - CardList compHand = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); - diff += 0.5 * (humHand.size() - compHand.size()); - - return diff > 2; - } - }; - - - - card.addSpellAbility(spell); - } - //*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Summer Bloom")) { - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = 5559004016728325736L; - - public boolean canPlayAI() { - // The computer should only play this card if it has at least - // one land in its hand. Because of the way the computer turn - // is structured, it will already have played land to it's limit - - CardList hand = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); - hand = hand.getType("Land"); - return hand.size() > 0; - } - - public void resolve() { - final Player thePlayer = card.getController(); - thePlayer.addMaxLandsToPlay(3); - - Command untilEOT = new Command() { - private static final long serialVersionUID = 1665720009691293263L; - - public void execute() { - thePlayer.addMaxLandsToPlay(-3); - } - }; - AllZone.getEndOfTurn().addUntil(untilEOT); - } - }; - - - - card.addSpellAbility(spell); - - card.setSVar("PlayMain1", "TRUE"); - } //*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Explore")) { - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = 8377957584738695517L; - - public boolean canPlayAI() { - // The computer should only play this card if it has at least - // one land in its hand. Because of the way the computer turn - // is structured, it will already have played its first land. - CardList list = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); - - list = list.getType("Land"); - if (list.size() > 0) - return true; - else - return false; - } - - public void resolve() { - final Player thePlayer = card.getController(); - thePlayer.addMaxLandsToPlay(1); - - Command untilEOT = new Command() { - private static final long serialVersionUID = -2618916698575607634L; - - public void execute() { - thePlayer.addMaxLandsToPlay(-1); - } - }; - AllZone.getEndOfTurn().addUntil(untilEOT); - - thePlayer.drawCard(); - } - }; - - - - card.addSpellAbility(spell); - - card.setSVar("PlayMain1", "TRUE"); - } //*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Haunting Misery")) { - Cost cost = new Cost("1 B B", cardName, false); - Target tgt = new Target(card, "Select a Player", "Player"); - final SpellAbility spell = new Spell(card, cost, tgt) { - private static final long serialVersionUID = 6867051257656060195L; - - @Override - public void resolve() { - Player player = card.getController(); - Player tPlayer = getTargetPlayer(); - CardList graveList = AllZoneUtil.getPlayerTypeInGraveyard(player, "Creature"); - - int size = graveList.size(); - int damage = 0; - - if (player.isHuman()) { - for (int i = 0; i < size; i++) { - Object o = GuiUtils.getChoice("Exile from graveyard", graveList.toArray()); - if (o == null) break; - damage++; // tally up how many cards removed - Card c_1 = (Card) o; - graveList.remove(c_1); //remove from the display list - AllZone.getGameAction().exile(c_1); - } - } else { //Computer - // it would be nice if the computer chose vanilla creatures over - for (int j = 0; j < size; j++) { - AllZone.getGameAction().exile(graveList.get(j)); - } - } - tPlayer.addDamage(damage, card); - } - - @Override - public void chooseTargetAI() { - setTargetPlayer(AllZone.getHumanPlayer()); - }//chooseTargetAI() - - @Override - public boolean canPlayAI() { - CardList graveList = AllZoneUtil.getPlayerTypeInGraveyard(AllZone.getHumanPlayer(), "Creature"); - int humanLife = AllZone.getHumanPlayer().getLife(); - - return (graveList.size() > 5 || graveList.size() > humanLife); - } - }; - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Brood Birthing")) { - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = -8303724057068847270L; - - public void resolve() { - int times = 1; - CardList cl; - if (AllZoneUtil.getPlayerCardsInPlay(card.getController(), "Eldrazi Spawn").size() > 0) - times = 3; - for (int i = 0; i < times; i++) { - cl = CardFactoryUtil.makeToken("Eldrazi Spawn", "C 0 1 Eldrazi Spawn", card.getController(), "", new String[]{ - "Creature", "Eldrazi", "Spawn"}, 0, 1, new String[]{}); - for (Card crd : cl) - crd.addSpellAbility(CardFactoryUtil.getEldraziSpawnAbility(crd)); - } - } - }; - StringBuilder sb = new StringBuilder(); - sb.append(cardName).append(" - ").append(card.getController()); - sb.append(" puts one or three 0/1 Eldrazi Spawn creature tokens onto the battlefield."); - spell.setStackDescription(sb.toString()); - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Explosive Revelation")) { - /* - * Choose target creature or player. Reveal cards from the top of - * your library until you reveal a nonland card. Explosive Revelation - * deals damage equal to that card's converted mana cost to that - * creature or player. Put the nonland card into your hand and the - * rest on the bottom of your library in any order. - */ - Cost cost = new Cost(card.getManaCost(), cardName, false); - Target tgt = new Target(card, "CP"); - final SpellAbility spell = new Spell(card, cost, tgt) { - private static final long serialVersionUID = -3234630801871872940L; - - int damage = 3; - Card check; - - @Override - public boolean canPlayAI() { - if (AllZone.getHumanPlayer().getLife() <= damage) return true; - - check = getFlying(); - return check != null; - } - - @Override - public void chooseTargetAI() { - if (AllZone.getHumanPlayer().getLife() <= damage) { - setTargetPlayer(AllZone.getHumanPlayer()); - return; - } - - Card c = getFlying(); - if ((c == null) || (!check.equals(c))) throw new RuntimeException(card - + " error in chooseTargetAI() - Card c is " + c + ", Card check is " + check); - - setTargetCard(c); - }//chooseTargetAI() - - //uses "damage" variable - Card getFlying() { - CardList flying = CardFactoryUtil.AI_getHumanCreature("Flying", card, true); - for (int i = 0; i < flying.size(); i++) - if (flying.get(i).getNetDefense() <= damage) return flying.get(i); - - return null; - } - - @Override - public void resolve() { - - int damage = getDamage(); - - if (getTargetCard() != null) { - if (AllZoneUtil.isCardInPlay(getTargetCard()) - && CardFactoryUtil.canTarget(card, getTargetCard())) { - javax.swing.JOptionPane.showMessageDialog(null, cardName + " causes " + damage - + " to " + getTargetCard()); - - Card c = getTargetCard(); - c.addDamage(damage, card); - } - } else { - javax.swing.JOptionPane.showMessageDialog(null, cardName + " causes " + damage - + " to " + getTargetPlayer()); - getTargetPlayer().addDamage(damage, card); - } - //System.out.println("Library after: "+AllZoneUtil.getPlayerCardsInLibrary(card.getController())); - } - - int getDamage() { - /* - * Reveal cards from the top of - * your library until you reveal a nonland card. - */ - CardList lib = AllZoneUtil.getPlayerCardsInLibrary(card.getController()); - Log.debug("Explosive Revelation", "Library before: " + lib); - CardList revealed = new CardList(); - if (lib.size() > 0) { - int index = 0; - Card top; - do { - top = lib.get(index); - //System.out.println("Got from top of library:"+top); - index += 1; - revealed.add(top); - } while (index < lib.size() && top.isLand()); - //Display the revealed cards - GuiUtils.getChoice("Revealed cards:", revealed.toArray()); - //non-land card into hand - AllZone.getGameAction().moveToHand(revealed.get(revealed.size() - 1)); - //put the rest of the cards on the bottom of library - for (int j = 0; j < revealed.size() - 1; j++) { - AllZone.getGameAction().moveToBottomOfLibrary(revealed.get(j)); - } - //return the damage - - //System.out.println("Explosive Revelation does "+CardUtil.getConvertedManaCost(top)+" from: "+top); - return CardUtil.getConvertedManaCost(top); - } - return 0; - } - };//SpellAbility - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Fireball")) { - /* - * Fireball deals X damage divided evenly, rounded down, among - * any number of target creatures and/or players. - * Fireball costs 1 more to cast for each target beyond the first. - */ - final CardList targets = new CardList(); - final ArrayList targetPlayers = new ArrayList(); - - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = -6293612568525319357L; - - @Override - public boolean canPlayAI() { - final int maxX = ComputerUtil.getAvailableMana().size() - 1; - int humanLife = AllZone.getHumanPlayer().getLife(); - if (maxX >= humanLife) { - targetPlayers.add(AllZone.getHumanPlayer()); - return true; - } - return false; - } - - @Override - public void resolve() { - int damage = (card.getXManaCostPaid() - getNumTargets() + 1) / getNumTargets(); - //add that much damage to each creature - //DEBUG - Log.debug("Fireball", "Fireball - damage to each target: " + damage); - Log.debug("Fireball", "Fireball - card targets: "); - printCardTargets(); - Log.debug("Fireball", "Fireball - player targets: "); - printPlayerTargets(); - if (card.getController().isComputer()) { - StringBuilder sb = new StringBuilder(); - sb.append(cardName + " - Computer causes " + damage + " to:\n\n"); - for (int i = 0; i < targets.size(); i++) { - Card target = targets.get(i); - if (AllZoneUtil.isCardInPlay(target) && CardFactoryUtil.canTarget(card, target)) { - sb.append(target + "\n"); - } - } - for (int i = 0; i < targetPlayers.size(); i++) { - Player p = targetPlayers.get(i); - if (p.canTarget(this)) { - sb.append(p + "\n"); - } - } - javax.swing.JOptionPane.showMessageDialog(null, sb.toString()); - } - for (int i = 0; i < targets.size(); i++) { - Card target = targets.get(i); - if (AllZoneUtil.isCardInPlay(target) && CardFactoryUtil.canTarget(card, target)) { - //DEBUG - Log.debug("Fireball", "Fireball does " + damage + " to: " + target); - target.addDamage(damage, card); - } - } - for (int i = 0; i < targetPlayers.size(); i++) { - Player p = targetPlayers.get(i); - if (p.canTarget(this)) { - //DEBUG - Log.debug("Fireball", "Fireball does " + damage + " to: " + p); - p.addDamage(damage, card); - } - } - }//resolve() - - //DEBUG - private void printCardTargets() { - StringBuilder sb = new StringBuilder("["); - for (Card target : targets) { - sb.append(target).append(","); - } - sb.append("]"); - Log.debug("Fireball", sb.toString()); - } - - //DEBUG - private void printPlayerTargets() { - StringBuilder sb = new StringBuilder("["); - for (Player p : targetPlayers) { - sb.append(p).append(","); - } - sb.append("]"); - Log.debug("Fireball", sb.toString()); - } - - private int getNumTargets() { - int numTargets = 0; - numTargets += targets.size(); - numTargets += targetPlayers.size(); - return numTargets; - } - - };//SpellAbility - - final Input input = new Input() { - private static final long serialVersionUID = 1099272655273322957L; - - @Override - public void showMessage() { - AllZone.getDisplay().showMessage("Select target creatures and/or players. Currently, " + getNumTargets() + " targets. Click OK when done."); - } - - private int getNumTargets() { - int numTargets = 0; - numTargets += targets.size(); - numTargets += targetPlayers.size(); - //DEBUG - Log.debug("Fireball", "Fireball - numTargets = " + numTargets); - return numTargets; - } - - @Override - public void selectButtonCancel() { - targets.clear(); - targetPlayers.clear(); - stop(); - } - - @Override - public void selectButtonOK() { - spell.setStackDescription(cardName + " deals X damage to " + getNumTargets() + " target(s)."); - stopSetNext(new Input_PayManaCost(spell)); - } - - @Override - public void selectCard(Card c, PlayerZone zone) { - if (!CardFactoryUtil.canTarget(card, c)) { - AllZone.getDisplay().showMessage("Cannot target this card."); - return; //cannot target - } - if (targets.contains(c)) { - AllZone.getDisplay().showMessage("You have already selected this target."); - return; //cannot target the same creature twice. - } - - if (c.isCreature() && zone.is(Constant.Zone.Battlefield)) { - targets.add(c); - showMessage(); - } - }//selectCard() - - @Override - public void selectPlayer(Player player) { - if (!player.canTarget(spell)) { - AllZone.getDisplay().showMessage("Cannot target this card."); - return; //cannot target - } - if (targetPlayers.contains(player)) { - AllZone.getDisplay().showMessage("You have already selected this player."); - return; //cannot target the same player twice. - } - targetPlayers.add(player); - showMessage(); - } - };//Input - - - - card.addSpellAbility(spell); - spell.setBeforePayMana(input); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Recall")) { - /* - * Discard X cards, then return a card from your graveyard to your - * hand for each card discarded this way. Exile Recall. - */ - Cost cost = new Cost(card.getManaCost(), cardName, false); - final SpellAbility spell = new Spell(card, cost, null) { - private static final long serialVersionUID = -3935814273439962834L; - - @Override - public boolean canPlayAI() { - //for compy to play this wisely, it should check hand, and if there - //are no spells that canPlayAI(), then use recall. maybe. - return false; - } - - @Override - public void resolve() { - int numCards = card.getXManaCostPaid(); - final Player player = card.getController(); - int maxCards = AllZoneUtil.getPlayerHand(player).size(); - if (numCards != 0) { - numCards = Math.min(numCards, maxCards); - if (player.isHuman()) { - AllZone.getInputControl().setInput(CardFactoryUtil.input_discardRecall(numCards, card, this)); - } - } - /*else { //computer - card.getControler().discardRandom(numCards); - AllZone.getGameAction().exile(card); - CardList grave = AllZoneUtil.getPlayerGraveyard(card.getController()); - for(int i = 1; i <= numCards; i ++) { - Card t1 = CardFactoryUtil.AI_getBestCreature(grave); - if(null != t1) { - t1 = grave.get(0); - grave.remove(t1); - AllZone.getGameAction().moveToHand(t1); - } - } - }*/ - }//resolve() - };//SpellAbility - - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - discard X cards and return X cards to your hand."); - spell.setStackDescription(sb.toString()); - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Windfall")) { - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = -7707012960887790709L; - - @Override - public boolean canPlayAI() { - /* - * We want compy to have less cards in hand than the human - */ - CardList Hhand = AllZoneUtil.getPlayerHand(AllZone.getHumanPlayer()); - CardList Chand = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); - return Chand.size() < Hhand.size(); - } - - @Override - public void resolve() { - CardList Hhand = AllZoneUtil.getPlayerHand(AllZone.getHumanPlayer()); - CardList Chand = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); - - int num = Math.max(Hhand.size(), Chand.size()); - - discardDraw(AllZone.getHumanPlayer(), num); - discardDraw(AllZone.getComputerPlayer(), num); - }//resolve() - - void discardDraw(Player player, int num) { - player.discardHand(this); - player.drawCards(num); - } - };//SpellAbility - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Stitch Together")) { - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = -57996914115026814L; - - @Override - public void resolve() { - CardList threshold = AllZoneUtil.getPlayerGraveyard(card.getController()); - Card c = getTargetCard(); - - if (threshold.size() >= 7) { - if (AllZoneUtil.isCardInPlayerGraveyard(card.getController(), c)) { - PlayerZone play = AllZone.getZone(Constant.Zone.Battlefield, card.getController()); - AllZone.getGameAction().moveTo(play, c); - } - } else { - if (AllZoneUtil.isCardInPlayerGraveyard(card.getController(), c)) { - PlayerZone hand = AllZone.getZone(Constant.Zone.Hand, card.getController()); - AllZone.getGameAction().moveTo(hand, c); - } - } - }//resolve() - - @Override - public boolean canPlay() { - return getCreatures().length != 0; - } - - public boolean canPlayAI() { - CardList check = AllZoneUtil.getPlayerGraveyard(card.getController()); - return getCreaturesAI().length != 0 || check.size() >= 7; - } - - public Card[] getCreatures() { - CardList creature = AllZoneUtil.getPlayerTypeInGraveyard(card.getController(), "Creature"); - return creature.toArray(); - } - - public Card[] getCreaturesAI() { - CardList creature = AllZoneUtil.getPlayerTypeInGraveyard(card.getController(), "Creature"); - creature = creature.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getNetAttack() > 4; - } - }); - return creature.toArray(); - } - - @Override - public void chooseTargetAI() { - Card c[] = getCreatures(); - Card biggest = c[0]; - for (int i = 0; i < c.length; i++) - if (biggest.getNetAttack() < c[i].getNetAttack()) biggest = c[i]; - - setTargetCard(biggest); - } - };//SpellAbility - - - - card.addSpellAbility(spell); - - Input target = new Input() { - private static final long serialVersionUID = -3717723884199321767L; - - @Override - public void showMessage() { - CardList creature = AllZoneUtil.getPlayerTypeInGraveyard(card.getController(), "Creature"); - Object check = GuiUtils.getChoiceOptional("Select creature", creature); - if (check != null) { - spell.setTargetCard((Card) check); - stopSetNext(new Input_PayManaCost(spell)); - } else stop(); - }//showMessage() - };//Input - spell.setBeforePayMana(target); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Patriarch's Bidding")) { - final String[] input = new String[2]; - - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = -2182173662547136798L; - - @Override - public void resolve() { - input[0] = ""; - while (input[0] == "") { - input[0] = JOptionPane.showInputDialog(null, "Which creature type?", "Pick type", - JOptionPane.QUESTION_MESSAGE); - if (input[0] == null) break; - if (!CardUtil.isACreatureType(input[0])) input[0] = ""; - //TODO: some more input validation, case-sensitivity, etc. - - input[0] = input[0].trim(); //this is to prevent "cheating", and selecting multiple creature types,eg "Goblin Soldier" - } - - if (input[0] == null) input[0] = ""; - - HashMap countInGraveyard = new HashMap(); - CardList allGrave = AllZoneUtil.getPlayerGraveyard(AllZone.getComputerPlayer()); - allGrave.getType("Creature"); - for (Card c : allGrave) { - for (String type : c.getType()) { - if (CardUtil.isACreatureType(type)) { - if (countInGraveyard.containsKey(type)) { - countInGraveyard.put(type, countInGraveyard.get(type) + 1); - } else { - countInGraveyard.put(type, 1); - } - } - } - } - String maxKey = ""; - int maxCount = -1; - for (Entry entry : countInGraveyard.entrySet()) { - if (entry.getValue() > maxCount) { - maxKey = entry.getKey(); - maxCount = entry.getValue(); - } - } - if (!maxKey.equals("")) input[1] = maxKey; - else input[1] = "Sliver"; - - //Actually put everything on the battlefield - CardList bidded = AllZoneUtil.getCardsInGraveyard(); - bidded = bidded.getType("Creature"); - for (Card c : bidded) { - if (c.isType(input[1]) || (!input[0].equals("") && c.isType(input[0]))) - AllZone.getGameAction().moveToPlay(c); - } - }//resolve() - };//SpellAbility - - - - card.addSpellAbility(spell); - - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - choose a creature type."); - spell.setStackDescription(sb.toString()); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Leeches")) { - /* - * Target player loses all poison counters. - * Leeches deals that much damage to that player. - */ - final Target tgt = new Target(card, "Select target player", "Player"); - Cost cost = new Cost("1 W W", cardName, false); - SpellAbility spell = new Spell(card, cost, tgt) { - private static final long serialVersionUID = 8555498267738686288L; - - @Override - public void resolve() { - Player p = tgt.getTargetPlayers().get(0); - int counters = p.getPoisonCounters(); - p.addDamage(counters, card); - p.subtractPoisonCounters(counters); - }// resolve() - - @Override - public boolean canPlayAI() { - int humanPoison = AllZone.getHumanPlayer().getPoisonCounters(); - int compPoison = AllZone.getComputerPlayer().getPoisonCounters(); - - if (AllZone.getHumanPlayer().getLife() <= humanPoison) { - tgt.addTarget(AllZone.getHumanPlayer()); - return true; - } - - if ((2 * (11 - compPoison) < AllZone.getComputerPlayer().getLife() || compPoison > 7) && compPoison < AllZone.getComputerPlayer().getLife() - 2) { - tgt.addTarget(AllZone.getComputerPlayer()); - return true; - } - - return false; - } - };// SpellAbility - - - - card.addSpellAbility(spell); - }// *************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Cerebral Eruption")) { - /* - * Target opponent reveals the top card of his or her library. - * Cerebral Eruption deals damage equal to the revealed card's - * converted mana cost to that player and each creature he or - * she controls. If a land card is revealed this way, return - * Cerebral Eruption to its owner's hand. - */ - SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = -1365692178841929046L; - - @Override - public void resolve() { - Player player = card.getController(); - Player opponent = player.getOpponent(); - CardList lib = AllZoneUtil.getPlayerCardsInLibrary(opponent); - if (lib.size() > 0) { - final Card topCard = lib.get(0); - int damage = CardUtil.getConvertedManaCost(topCard); - - GuiUtils.getChoiceOptional(card + " - Revealed card", new Card[]{topCard}); - - //deal damage to player - opponent.addDamage(damage, card); - - //deal damage to all opponent's creatures - CardList creatures = AllZoneUtil.getCreaturesInPlay(opponent); - for (Card creature : creatures) { - creature.addDamage(damage, card); - } - - card.addReplaceMoveToGraveyardCommand(new Command() { - private static final long serialVersionUID = -5912663572746146726L; - - public void execute() { - if (null != topCard && topCard.isLand()) { - AllZone.getGameAction().moveToHand(card); - } else AllZone.getGameAction().moveToGraveyard(card); - } - }); - } - }// resolve() - - @Override - public boolean canPlayAI() { - return AllZoneUtil.getPlayerCardsInLibrary(AllZone.getHumanPlayer()).size() > 0; - } - - };// SpellAbility - - - - card.addSpellAbility(spell); - }// *************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Sanity Grinding")) { - /* - * Chroma - Reveal the top ten cards of your library. For each blue - * mana symbol in the mana costs of the revealed cards, target opponent - * puts the top card of his or her library into his or her graveyard. - * Then put the cards you revealed this way on the bottom of your - * library in any order. - */ - SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = 4475834103787262421L; - - @Override - public void resolve() { - Player player = card.getController(); - Player opp = player.getOpponent(); - PlayerZone lib = AllZone.getZone(Constant.Zone.Library, card.getController()); - int maxCards = lib.size(); - maxCards = Math.min(maxCards, 10); - if (maxCards == 0) return; - CardList topCards = new CardList(); - //show top n cards: - for (int j = 0; j < maxCards; j++) { - topCards.add(lib.get(j)); - } - final int num = CardFactoryUtil.getNumberOfManaSymbolsByColor("U", topCards); - GuiUtils.getChoiceOptional("Revealed cards - " + num + " U mana symbols", topCards.toArray()); - - //opponent moves this many cards to graveyard - opp.mill(num); - - //then, move revealed cards to bottom of library - for (Card c : topCards) { - AllZone.getGameAction().moveToBottomOfLibrary(c); - } - }// resolve() - - @Override - public boolean canPlayAI() { - return AllZoneUtil.getPlayerCardsInLibrary(AllZone.getComputerPlayer()).size() > 0; - } - - };// SpellAbility - - - - card.addSpellAbility(spell); - }// *************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Winds of Change")) { - /* - * Each player shuffles the cards from his or her hand into - * his or her library, then draws that many cards. - */ - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = 1137557863607126794L; - - @Override - public void resolve() { - discardDrawX(AllZone.getHumanPlayer()); - discardDrawX(AllZone.getComputerPlayer()); - }//resolve() - - void discardDrawX(Player player) { - CardList hand = AllZoneUtil.getPlayerHand(player); - - for (Card c : hand) - AllZone.getGameAction().moveToLibrary(c); - - // Shuffle library - player.shuffle(); - - player.drawCards(hand.size()); - } - - // Simple, If computer has two or less playable cards remaining in hand play Winds of Change - @Override - public boolean canPlayAI() { - CardList c = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - c = c.filter(AllZoneUtil.nonlands); - return 2 >= c.size(); - } - - };//SpellAbility - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Molten Psyche")) { - /* - * Each player shuffles the cards from his or her hand into his - * or her library, then draws that many cards. - * Metalcraft - If you control three or more artifacts, Molten - * Psyche deals damage to each opponent equal to the number of - * cards that player has drawn this turn. - */ - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = -1276674329039279896L; - - @Override - public void resolve() { - Player player = card.getController(); - Player opp = player.getOpponent(); - discardDraw(AllZone.getHumanPlayer()); - discardDraw(AllZone.getComputerPlayer()); - - if (player.hasMetalcraft()) { - opp.addDamage(opp.getNumDrawnThisTurn(), card); - } - }//resolve() - - void discardDraw(Player player) { - CardList hand = AllZoneUtil.getPlayerHand(player); - int numDraw = hand.size(); - - //move hand to library - for (Card c : hand) { - AllZone.getGameAction().moveToLibrary(c); - } - - // Shuffle library - player.shuffle(); - - // Draw X cards - player.drawCards(numDraw); - } - - // Simple, If computer has two or less playable cards remaining in hand play CARDNAME - @Override - public boolean canPlayAI() { - CardList c = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); - c = c.filter(AllZoneUtil.nonlands); - return 2 >= c.size() || - (AllZone.getComputerPlayer().hasMetalcraft() && AllZone.getHumanPlayer().getLife() <= 3); - } - - };//SpellAbility - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Austere Command")) { - final ArrayList userChoice = new ArrayList(); - - final String[] cardChoices = { - "Destroy all artifacts", - "Destroy all enchantments", - "Destroy all creatures with converted mana cost 3 or less", - "Destroy all creatures with converted mana cost 4 or more" - }; - - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = -8501457363981482513L; - - @Override - public void resolve() { - - //"Destroy all artifacts", - if (userChoice.contains(cardChoices[0])) { - CardList cards = AllZoneUtil.getCardsInPlay().filter(AllZoneUtil.artifacts); - for (Card c : cards) AllZone.getGameAction().destroy(c); - } - - //"Destroy all enchantments", - if (userChoice.contains(cardChoices[1])) { - CardList cards = AllZoneUtil.getCardsInPlay().filter(AllZoneUtil.enchantments); - for (Card c : cards) AllZone.getGameAction().destroy(c); - } - - //"Destroy all creatures with converted mana cost 3 or less", - if (userChoice.contains(cardChoices[2])) { - CardList cards = AllZoneUtil.getCreaturesInPlay(); - cards = cards.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CardUtil.getConvertedManaCost(c) <= 3; - } - }); - for (Card c : cards) AllZone.getGameAction().destroy(c); - } - - //"Destroy all creatures with converted mana cost 4 or more"}; - if (userChoice.contains(cardChoices[3])) { - CardList cards = AllZoneUtil.getCreaturesInPlay(); - cards = cards.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CardUtil.getConvertedManaCost(c) >= 4; - } - }); - for (Card c : cards) AllZone.getGameAction().destroy(c); - } - }//resolve() - - @Override - public boolean canPlayAI() { - return false; - } - };//SpellAbility - - final Command setStackDescription = new Command() { - private static final long serialVersionUID = -635710110379729475L; - - public void execute() { - ArrayList a = new ArrayList(); - if (userChoice.contains(cardChoices[0])) a.add("destroy all artifacts"); - if (userChoice.contains(cardChoices[1])) a.add("destroy all enchantments"); - if (userChoice.contains(cardChoices[2])) a.add("destroy all creatures with CMC <= 3"); - if (userChoice.contains(cardChoices[3])) a.add("destroy all creatures with CMC >= 4"); - - String s = a.get(0) + ", " + a.get(1); - spell.setStackDescription(card.getName() + " - " + s); - } - };//Command - - Input chooseTwoInput = new Input() { - private static final long serialVersionUID = 2352497236500922820L; - - @Override - public void showMessage() { - if (card.isCopiedSpell()) { - setStackDescription.execute(); - stopSetNext(new Input_PayManaCost(spell)); - } else { - //reset variables - userChoice.clear(); - - ArrayList display = new ArrayList(Arrays.asList(cardChoices)); - - ArrayList a = chooseTwo(display); - //everything stops here if user cancelled - if (a == null) { - stop(); - return; - } - - userChoice.addAll(a); - - setStackDescription.execute(); - stopSetNext(new Input_PayManaCost(spell)); - } - }//showMessage() - - ArrayList chooseTwo(ArrayList choices) { - ArrayList out = new ArrayList(); - Object o = GuiUtils.getChoiceOptional("Choose Two", choices.toArray()); - if (o == null) return null; - - out.add((String) o); - choices.remove(out.get(0)); - o = GuiUtils.getChoiceOptional("Choose Two", choices.toArray()); - if (o == null) return null; - - out.add((String) o); - - return out; - }//chooseTwo() - };//Input chooseTwoInput - - - - card.addSpellAbility(spell); - spell.setBeforePayMana(chooseTwoInput); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Praetor's Counsel")) { - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = 2208683667850222369L; - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public void resolve() { - Player player = card.getController(); - CardList grave = AllZoneUtil.getPlayerGraveyard(player); - for (Card c : grave) AllZone.getGameAction().moveToHand(c); - - AllZone.getGameAction().exile(card); - - card.setSVar("HSStamp", "" + Player.getHandSizeStamp()); - player.addHandSizeOperation(new HandSizeOp("=", -1, Integer.parseInt(card.getSVar("HSStamp")))); - } - };//SpellAbility - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Profane Command")) { - //not sure what to call variables, so I just made up something - final Player[] ab0player = new Player[1]; - final Card[] ab1card = new Card[1]; - final Card[] ab2card = new Card[1]; - final ArrayList ab3cards = new ArrayList(); - final int x[] = new int[1]; - - final ArrayList userChoice = new ArrayList(); - - final String[] cardChoice = { - "Target player loses X life", - "Return target creature card with converted mana cost X or less from your graveyard to the battlefield", - "Target creature gets -X/-X until end of turn", - "Up to X target creatures gain fear until end of turn" - }; - - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = -2924301460675657126L; - - @Override - public void resolve() { - //System.out.println(userChoice); - //System.out.println("0: "+ab0player[0]); - //System.out.println("1: "+ab1card[0]); - //System.out.println("2: "+ab2card[0]); - //System.out.println("3: "+ab3cards); - - //"Target player loses X life", - for (int i = 0; i < card.getChoices().size(); i++) { - if (card.getChoice(i).equals(cardChoice[0])) { - if (ab0player[0] != null) { - setTargetPlayer(ab0player[0]); - if (getTargetPlayer().canTarget(this)) { - getTargetPlayer().addDamage(x[0], card); - } - } - } - } - - //"Return target creature card with converted mana cost X or less from your graveyard to the battlefield", - if (userChoice.contains(cardChoice[1]) || card.getChoices().contains(cardChoice[1])) { - Card c = ab1card[0]; - if (c != null) { - if (AllZoneUtil.isCardInPlayerGraveyard(card.getController(), c) && CardFactoryUtil.canTarget(card, c)) { - AllZone.getGameAction().moveToPlay(c); - } - } - } - - //"Target creature gets -X/-X until end of turn", - for (int i = 0; i < card.getChoices().size(); i++) { - if (card.getChoice(i).equals(cardChoice[2])) { - final Card c = ab2card[0]; - if (c != null) { - if (AllZoneUtil.isCardInPlay(c) && CardFactoryUtil.canTarget(card, c)) { - final int boost = x[0] * -1; - c.addTempAttackBoost(boost); - c.addTempDefenseBoost(boost); - final Command untilEOT = new Command() { - private static final long serialVersionUID = -6010783402521993651L; - - public void execute() { - if (AllZoneUtil.isCardInPlay(c)) { - c.addTempAttackBoost(-1 * boost); - c.addTempDefenseBoost(-1 * boost); - - } - } - }; - AllZone.getEndOfTurn().addUntil(untilEOT); - } - } - } - }//end ab[2] - - //"Up to X target creatures gain fear until end of turn" - if (userChoice.contains(cardChoice[3]) || card.getChoices().contains(cardChoice[3])) { - ArrayList cs = new ArrayList(); - cs.addAll(ab3cards); - for (final Card c : cs) { - if (AllZoneUtil.isCardInPlay(c) && CardFactoryUtil.canTarget(card, c)) { - c.addExtrinsicKeyword("Fear"); - final Command untilEOT = new Command() { - private static final long serialVersionUID = 986259855862338866L; - - public void execute() { - if (AllZoneUtil.isCardInPlay(c)) { - c.removeExtrinsicKeyword("Fear"); - } - } - }; - AllZone.getEndOfTurn().addUntil(untilEOT); - } - } - }//end ab[3] - }//resolve() - - @Override - public boolean canPlayAI() { - return false; - } - };//SpellAbility - - final Command setStackDescription = new Command() { - private static final long serialVersionUID = 5840471361149632482L; - - public void execute() { - ArrayList a = new ArrayList(); - if (userChoice.contains(cardChoice[0]) || card.getChoices().contains(cardChoice[0])) - a.add(ab0player[0] + " loses X life"); - if (userChoice.contains(cardChoice[1]) || card.getChoices().contains(cardChoice[1])) - a.add("return " + ab1card[0] + " from graveyard to play"); - if (userChoice.contains(cardChoice[2]) || card.getChoices().contains(cardChoice[2])) - a.add(ab2card[0] + " gets -X/-X until end of turn"); - if (userChoice.contains(cardChoice[3]) || card.getChoices().contains(cardChoice[3])) - a.add("up to X target creatures gain Fear until end of turn"); - - String s = a.get(0) + ", " + a.get(1); - spell.setStackDescription(card.getName() + " - " + s); - } - };//Command - - //for ab[3] - X creatures gain fear until EOT - final Input targetXCreatures = new Input() { - private static final long serialVersionUID = 2584765431286321048L; - - int stop = 0; - int count = 0; - - @Override - public void showMessage() { - if (count == 0) stop = x[0]; - AllZone.getDisplay().showMessage(cardName + " - Select a target creature to gain Fear (up to " + (stop - count) + " more)"); - ButtonUtil.enableAll(); - } - - @Override - public void selectButtonCancel() { - stop(); - } - - @Override - public void selectButtonOK() { - done(); - } - - @Override - public void selectCard(Card c, PlayerZone zone) { - if (c.isCreature() && zone.is(Constant.Zone.Battlefield) && CardFactoryUtil.canTarget(card, c) && - !ab3cards.contains(c)) { - ab3cards.add(c); - count++; - if (count == stop) done(); - else showMessage(); - } - }//selectCard() - - private void done() { - setStackDescription.execute(); - stopSetNext(new Input_PayManaCost(spell)); - } - }; - - //for ab[2] target creature gets -X/-X - final Input targetCreature = new Input() { - private static final long serialVersionUID = -6879692803780014943L; - - @Override - public void showMessage() { - AllZone.getDisplay().showMessage(cardName + " - Select target creature to get -X/-X"); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - stop(); - } - - @Override - public void selectCard(Card c, PlayerZone zone) { - if (c.isCreature() && zone.is(Constant.Zone.Battlefield) && CardFactoryUtil.canTarget(card, c)) { - if (card.isCopiedSpell()) card.getChoiceTargets().remove(0); - ab2card[0] = c; - //spell.setTargetCard(c); - card.setSpellChoiceTarget(String.valueOf(c.getUniqueNumber())); - setStackDescription.execute(); - - if (userChoice.contains(cardChoice[3]) || card.getChoices().contains(cardChoice[3])) - stopSetNext(targetXCreatures); - else { - System.out.println("Input_PayManaCost for spell is getting: " + spell.getManaCost()); - stopSetNext(new Input_PayManaCost(spell)); - } - }//if - }//selectCard() - };//Input targetCreature - - //for ab[1] - return creature from grave to the battlefield - final Input targetGraveCreature = new Input() { - private static final long serialVersionUID = -7558252187229252725L; - - @Override - public void showMessage() { - CardList grave = AllZoneUtil.getPlayerGraveyard(card.getController()); - grave = grave.filter(AllZoneUtil.creatures); - grave = grave.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getCMC() <= x[0]; - } - }); - - Object check = GuiUtils.getChoiceOptional("Select target creature with CMC < X", grave.toArray()); - if (check != null) { - Card c = (Card) check; - if (CardFactoryUtil.canTarget(card, c)) { - ab1card[0] = c; - } - } else - stop(); - - done(); - }//showMessage() - - public void done() { - if (userChoice.contains(cardChoice[2]) || card.getChoices().contains(cardChoice[2])) - stopSetNext(targetCreature); - else if (userChoice.contains(cardChoice[3]) || card.getChoices().contains(cardChoice[3])) - stopSetNext(targetXCreatures); - else { - stopSetNext(new Input_PayManaCost(spell)); - } - } - };//Input - - //for ab[0] - target player loses X life - final Input targetPlayer = new Input() { - private static final long serialVersionUID = 9101387253945650303L; - - @Override - public void showMessage() { - AllZone.getDisplay().showMessage(cardName + " - Select target player to lose life"); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - stop(); - } - - @Override - public void selectPlayer(Player player) { - if (player.canTarget(spell)) { - if (card.isCopiedSpell()) card.getChoiceTargets().remove(0); - ab0player[0] = player; - //spell.setTargetPlayer(player); - card.setSpellChoiceTarget(player.toString()); - setStackDescription.execute(); - - if (userChoice.contains(cardChoice[1]) || card.getChoices().contains(cardChoice[1])) - stopSetNext(targetGraveCreature); - else if (userChoice.contains(cardChoice[2]) || card.getChoices().contains(cardChoice[2])) - stopSetNext(targetCreature); - else if (userChoice.contains(cardChoice[3]) || card.getChoices().contains(cardChoice[3])) - stopSetNext(targetXCreatures); - else { - stopSetNext(new Input_PayManaCost(spell)); - } - } - }//selectPlayer() - };//Input targetPlayer - - final Input chooseX = new Input() { - private static final long serialVersionUID = 5625588008756700226L; - - @Override - public void showMessage() { - if (card.isCopiedSpell()) { - x[0] = 0; - if (userChoice.contains(cardChoice[0])) stopSetNext(targetPlayer); - else if (userChoice.contains(cardChoice[1])) stopSetNext(targetGraveCreature); - else if (userChoice.contains(cardChoice[2])) stopSetNext(targetCreature); - else if (userChoice.contains(cardChoice[3])) stopSetNext(targetXCreatures); - else { - throw new RuntimeException("Something in if(isCopiedSpell()) in Profane Command selection is FUBAR."); - } - } else { - ArrayList choices = new ArrayList(); - for (int i = 0; i <= card.getController().getLife(); i++) { - choices.add("" + i); - } - Object o = GuiUtils.getChoice("Choose X", choices.toArray()); - //everything stops here if user cancelled - if (o == null) { - stop(); - return; - } - - String answer = (String) o; - - x[0] = Integer.parseInt(answer); - spell.setManaCost(x[0] + " B B"); - spell.setIsXCost(false); - - if (userChoice.contains(cardChoice[0])) stopSetNext(targetPlayer); - else if (userChoice.contains(cardChoice[1])) stopSetNext(targetGraveCreature); - else if (userChoice.contains(cardChoice[2])) stopSetNext(targetCreature); - else if (userChoice.contains(cardChoice[3])) stopSetNext(targetXCreatures); - else { - throw new RuntimeException("Something in Profane Command selection is FUBAR."); - } - } - }//showMessage() - };//Input chooseX - - Input chooseTwoInput = new Input() { - private static final long serialVersionUID = 5625588008756700226L; - - @Override - public void showMessage() { - if (card.isCopiedSpell()) { - if (userChoice.contains(cardChoice[0])) stopSetNext(targetPlayer); - else if (userChoice.contains(cardChoice[1])) stopSetNext(targetGraveCreature); - else if (userChoice.contains(cardChoice[2])) stopSetNext(targetCreature); - else if (userChoice.contains(cardChoice[3])) stopSetNext(targetXCreatures); - else { - throw new RuntimeException("Something in if(isCopiedSpell()) in Profane Command selection is FUBAR."); - } - } else { - //reset variables - ab0player[0] = null; - ab1card[0] = null; - ab2card[0] = null; - ab3cards.clear(); - card.getChoices().clear(); - card.getChoiceTargets().clear(); - userChoice.clear(); - - ArrayList display = new ArrayList(); - - //get all - CardList creatures = AllZoneUtil.getCreaturesInPlay(); - CardList grave = AllZoneUtil.getPlayerGraveyard(card.getController()); - grave = grave.filter(AllZoneUtil.creatures); - - if (AllZone.getHumanPlayer().canTarget(spell) || AllZone.getComputerPlayer().canTarget(spell)) - display.add("Target player loses X life"); - if (grave.size() > 0) - display.add("Return target creature card with converted mana cost X or less from your graveyard to the battlefield"); - if (creatures.size() > 0) display.add("Target creature gets -X/-X until end of turn"); - display.add("Up to X target creatures gain fear until end of turn"); - - ArrayList a = chooseTwo(display); - //everything stops here if user cancelled - if (a == null) { - stop(); - return; - } - userChoice.addAll(a); - - stopSetNext(chooseX); - } - }//showMessage() - - private ArrayList chooseTwo(ArrayList choices) { - ArrayList out = new ArrayList(); - Object o = GuiUtils.getChoiceOptional("Choose Two", choices.toArray()); - if (o == null) return null; - - out.add((String) o); - card.addSpellChoice((String) o); - choices.remove(out.get(0)); - o = GuiUtils.getChoiceOptional("Choose Two", choices.toArray()); - if (o == null) return null; - - out.add((String) o); - card.addSpellChoice((String) o); - return out; - }//chooseTwo() - };//Input chooseTwoInput - - - - card.addSpellAbility(spell); - - card.setSpellWithChoices(true); - spell.setBeforePayMana(chooseTwoInput); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Turn to Slag")) { - Cost abCost = new Cost("3 R R", cardName, false); - Target target = new Target(card, "Select target creature", "Creature".split(",")); - final SpellAbility spell = new Spell(card, abCost, target) { - private static final long serialVersionUID = 3848014348910653252L; - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public void resolve() { - Card tgt = getTargetCard(); - if (AllZoneUtil.isCardInPlay(tgt) && CardFactoryUtil.canTarget(card, tgt)) { - tgt.addDamage(5, card); - CardList equipment = new CardList(tgt.getEquippedBy()); - for (Card eq : equipment) AllZone.getGameAction().destroy(eq); - } - }//resolve() - };//SpellAbility - - spell.setDescription(cardName + " deals 5 damage to target creature. Destroy all Equipment attached to that creature."); - - - - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - return card; - }//getCard -} diff --git a/src/forge/card/mana/Mana.java b/src/forge/card/mana/Mana.java deleted file mode 100644 index 535e093ca64..00000000000 --- a/src/forge/card/mana/Mana.java +++ /dev/null @@ -1,187 +0,0 @@ -package forge.card.mana; - -import forge.Card; -import forge.Constant; -import forge.gui.input.Input_PayManaCostUtil; - -/** - *

Mana class.

- * - * @author Forge - * @version $Id: $ - */ -public class Mana { - private String color; - private int amount = 0; - private Card sourceCard = null; - - /** - *

Constructor for Mana.

- * - * @param col a {@link java.lang.String} object. - * @param amt a int. - * @param source a {@link forge.Card} object. - */ - public Mana(String col, int amt, Card source) { - color = col; - amount = amt; - if (source == null) - return; - - sourceCard = source; - } - - /** - *

toString.

- * - * @return a {@link java.lang.String} object. - */ - public String toString() { - if (color.equals(Constant.Color.Colorless)) - return Integer.toString(amount); - - String manaString = ""; - StringBuilder sbMana = new StringBuilder(); - - manaString = Input_PayManaCostUtil.getShortColorString(color); - - for (int i = 0; i < amount; i++) - sbMana.append(manaString); - return sbMana.toString(); - } - - /** - *

toDescriptiveString.

- * - * @return a {@link java.lang.String} object. - */ - public String toDescriptiveString() { - // this will be used for advanced choice box - if (color.equals(Constant.Color.Colorless)) - return Integer.toString(amount); - - String manaString = ""; - StringBuilder sbMana = new StringBuilder(); - - manaString = Input_PayManaCostUtil.getShortColorString(color); - - for (int i = 0; i < amount; i++) - sbMana.append(manaString); - - if (isSnow()) - sbMana.append("(S)"); - - sbMana.append(" From "); - sbMana.append(sourceCard.getName()); - - return sbMana.toString(); - } - - /** - *

toSingleArray.

- * - * @return an array of {@link forge.card.mana.Mana} objects. - */ - public Mana[] toSingleArray() { - Mana[] normalize = new Mana[amount]; - for (int i = 0; i < normalize.length; i++) { - normalize[i] = new Mana(this.color, 1, this.sourceCard); - } - return normalize; - } - - /** - *

isSnow.

- * - * @return a boolean. - */ - public boolean isSnow() { - return sourceCard.isSnow(); - } - - /** - *

fromBasicLand.

- * - * @return a boolean. - */ - public boolean fromBasicLand() { - return sourceCard.isBasicLand(); - } // for Imperiosaur - - /** - *

getColorlessAmount.

- * - * @return a int. - */ - public int getColorlessAmount() { - return color.equals(Constant.Color.Colorless) ? amount : 0; - } - - /** - *

Getter for the field amount.

- * - * @return a int. - */ - public int getAmount() { - return amount; - } - - /** - *

isColor.

- * - * @param col a {@link java.lang.String} object. - * @return a boolean. - */ - public boolean isColor(String col) { - return color.equals(col); - } - - /** - *

isColor.

- * - * @param colors an array of {@link java.lang.String} objects. - * @return a boolean. - */ - public boolean isColor(String[] colors) { - for (String col : colors) - if (color.equals(col)) - return true; - - return false; - } - - /** - *

Getter for the field color.

- * - * @return a {@link java.lang.String} object. - */ - public String getColor() { - return color; - } - - /** - *

Getter for the field sourceCard.

- * - * @return a {@link forge.Card} object. - */ - public Card getSourceCard() { - return sourceCard; - } - - /** - *

fromSourceCard.

- * - * @param c a {@link forge.Card} object. - * @return a boolean. - */ - public boolean fromSourceCard(Card c) { - return sourceCard.equals(c); - } - - /** - *

decrementAmount.

- */ - public void decrementAmount() { - amount--; - } -} diff --git a/src/forge/card/mana/ManaCost.java b/src/forge/card/mana/ManaCost.java deleted file mode 100644 index a874d368b91..00000000000 --- a/src/forge/card/mana/ManaCost.java +++ /dev/null @@ -1,485 +0,0 @@ -package forge.card.mana; - -import forge.Constant; -import forge.gui.input.Input_PayManaCostUtil; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.StringTokenizer; - -/** - *

ManaCost class.

- * - * @author Forge - * @version $Id: $ - */ -public class ManaCost { - //holds Mana_Part objects - //ManaPartColor is stored before ManaPartColorless - private ArrayList manaPart; - private HashMap sunburstMap = new HashMap(); - private int xcounter = 0; - -//manaCost can be like "0", "3", "G", "GW", "10", "3 GW", "10 GW" - //or "split hybrid mana" like "2/G 2/G", "2/B 2/B 2/B" - //"GW" can be paid with either G or W - - /** - *

Constructor for ManaCost.

- * - * @param manaCost a {@link java.lang.String} object. - */ - public ManaCost(String manaCost) { - if (manaCost.equals("")) - manaCost = "0"; - - while (manaCost.contains("X")) { - if (manaCost.length() < 2) - manaCost = "0"; - else - manaCost = manaCost.replaceFirst("X ", ""); - setXcounter(getXcounter() + 1); - } - manaPart = split(manaCost); - } - - /** - *

getSunburst.

- * - * @return a int. - */ - public int getSunburst() { - int ret = sunburstMap.size(); - sunburstMap.clear(); - return ret; - } - - /** - *

getColorsPaid.

- * - * @return a String. - */ - public String getColorsPaid() { - String s = ""; - for (String key: sunburstMap.keySet()) { - if(key.equals("black")) s+= "B"; - if(key.equals("blue")) s+= "U"; - if(key.equals("green")) s+= "G"; - if(key.equals("red")) s+= "R"; - if(key.equals("white")) s+= "W"; - } - return s; - } - - /** - *

getUnpaidPhyrexianMana.

- * - * @return a {@link java.util.ArrayList} object. - */ - private ArrayList getUnpaidPhyrexianMana() { - ArrayList res = new ArrayList(); - for (Object o : manaPart) { - if (o instanceof Mana_PartPhyrexian) { - Mana_PartPhyrexian phy = (Mana_PartPhyrexian) o; - - if (!phy.isPaid()) - res.add(phy); - } - } - - return res; - } - - /** - *

containsPhyrexianMana.

- * - * @return a boolean. - */ - public boolean containsPhyrexianMana() { - for (Object o : manaPart) { - if (o instanceof Mana_PartPhyrexian) { - return true; - } - } - - return false; - } - - /** - *

payPhyrexian.

- * - * @return a boolean. - */ - public boolean payPhyrexian() { - ArrayList Phy = getUnpaidPhyrexianMana(); - - if (Phy.size() > 0) { - Phy.get(0).payLife(); - - return true; - } - - return false; - } - - // takes a Short Color and returns true if it exists in the mana cost. Easier for split costs - /** - *

isColor.

- * - * @param color a {@link java.lang.String} object. - * @return a boolean. - */ - public boolean isColor(String color) { - for (Object s : manaPart) { - if (s.toString().contains(color)) - return true; - } - return false; - } - - // isNeeded(String) still used by the Computer, might have problems activating Snow abilities - /** - *

isNeeded.

- * - * @param mana a {@link java.lang.String} object. - * @return a boolean. - */ - public boolean isNeeded(String mana) { - if (mana.length() > 1) - mana = Input_PayManaCostUtil.getShortColorString(mana); - Mana_Part m; - for (int i = 0; i < manaPart.size(); i++) { - m = (Mana_Part) manaPart.get(i); - if (m.isNeeded(mana)) return true; - } - return false; - } - - /** - *

isNeeded.

- * - * @param mana a {@link forge.card.mana.Mana} object. - * @return a boolean. - */ - public boolean isNeeded(Mana mana) { - Mana_Part m; - for (int i = 0; i < manaPart.size(); i++) { - m = (Mana_Part) manaPart.get(i); - if (m.isNeeded(mana)) return true; - if (m instanceof Mana_PartSnow && mana.isSnow()) return true; - } - return false; - } - - /** - *

isPaid.

- * - * @return a boolean. - */ - public boolean isPaid() { - Mana_Part m; - for (int i = 0; i < manaPart.size(); i++) { - m = (Mana_Part) manaPart.get(i); - if (!m.isPaid()) return false; - } - return true; - }//isPaid() - - /** - *

payMana.

- * - * @param mana a {@link forge.card.mana.Mana} object. - * @return a boolean. - */ - public boolean payMana(Mana mana) { - return addMana(mana); - } - - /** - *

payMana.

- * - * @param color a {@link java.lang.String} object. - * @return a boolean. - */ - public boolean payMana(String color) { - color = Input_PayManaCostUtil.getShortColorString(color); - return addMana(color); - } - - /** - *

increaseColorlessMana.

- * - * @param manaToAdd a int. - */ - public void increaseColorlessMana(int manaToAdd) { - if (manaToAdd <= 0) - return; - - Mana_Part m; - for (int i = 0; i < manaPart.size(); i++) { - m = (Mana_Part) manaPart.get(i); - if (m instanceof Mana_PartColorless) { - ((Mana_PartColorless) m).addToManaNeeded(manaToAdd); - return; - } - } - manaPart.add(new Mana_PartColorless(manaToAdd)); - } - - /** - *

addMana.

- * - * @param mana a {@link java.lang.String} object. - * @return a boolean. - */ - public boolean addMana(String mana) { - if (!isNeeded(mana)) throw new RuntimeException("ManaCost : addMana() error, mana not needed - " + mana); - - Mana_Part choice = null; - - for (int i = 0; i < manaPart.size(); i++) { - Mana_Part m = (Mana_Part) manaPart.get(i); - if (m.isNeeded(mana)) { - // if m is a better to pay than choice - if (choice == null) { - choice = m; - continue; - } - if (m.isColor(mana) && choice.isEasierToPay(m)) { - choice = m; - } - } - }//for - if (choice == null) - return false; - - choice.reduce(mana); - if (!mana.equals(Constant.Color.Colorless)) { - if (sunburstMap.containsKey(mana)) - sunburstMap.put(mana, sunburstMap.get(mana) + 1); - else - sunburstMap.put(mana, 1); - } - return true; - } - - /** - *

addMana.

- * - * @param mana a {@link forge.card.mana.Mana} object. - * @return a boolean. - */ - public boolean addMana(Mana mana) { - if (!isNeeded(mana)) throw new RuntimeException("ManaCost : addMana() error, mana not needed - " + mana); - - Mana_Part choice = null; - - for (int i = 0; i < manaPart.size(); i++) { - Mana_Part m = (Mana_Part) manaPart.get(i); - if (m.isNeeded(mana)) { - // if m is a better to pay than choice - if (choice == null) { - choice = m; - continue; - } - if (m.isColor(mana) && choice.isEasierToPay(m)) { - choice = m; - } - } - }//for - if (choice == null) - return false; - - choice.reduce(mana); - if (!mana.isColor(Constant.Color.Colorless)) { - if (sunburstMap.containsKey(mana.getColor())) - sunburstMap.put(mana.getColor(), sunburstMap.get(mana.getColor()) + 1); - else - sunburstMap.put(mana.getColor(), 1); - } - return true; - } - - /** - *

combineManaCost.

- * - * @param extra a {@link java.lang.String} object. - */ - public void combineManaCost(String extra) { - ArrayList extraParts = split(extra); - - Mana_PartColorless part = null; - for (int i = 0; i < manaPart.size(); i++) { - Object o = manaPart.get(i); - if (o instanceof Mana_PartColorless) - part = (Mana_PartColorless) o; - } - if (part != null) { - manaPart.remove(part); - } - - while (extraParts.size() > 0) { - Object o = extraParts.get(0); - if (o instanceof Mana_PartColorless) { - if (part == null) - part = (Mana_PartColorless) o; - else { - part.addToManaNeeded(((Mana_PartColorless) o).getManaNeeded()); - } - } else { - manaPart.add(o); - } - extraParts.remove(o); - } - if (part != null) - manaPart.add(part); - } - - /** {@inheritDoc} */ - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - ArrayList list = new ArrayList(manaPart); - //need to reverse everything since the colored mana is stored first - Collections.reverse(list); - - for (int i = 0; i < getXcounter(); i++) - sb.append(" ").append("X"); - - for (int i = 0; i < list.size(); i++) { - sb.append(" "); - sb.append(list.get(i).toString()); - } - - return sb.toString().trim(); - } - - /** - *

getConvertedManaCost.

- * - * @return a int. - */ - public int getConvertedManaCost() { - int cmc = 0; - for (Object s : manaPart) { - cmc += ((Mana_Part) s).getConvertedManaCost(); - } - return cmc; - } - - /** - * Returns Mana cost, adjusted slightly to make colored mana parts more significant. - * Should only be used for comparison purposes; using this method allows the sort: - * 2 < X 2 < 1 U < U U == UR U < X U U < X X U U - * - * @return The converted cost + 0.0001* the number of colored mana in the cost + 0.00001 * - * the number of X's in the cost - */ - public double getWeightedManaCost() { - double cmc = 0; - for (Object s : manaPart) { - cmc += ((Mana_Part) s).getConvertedManaCost(); - if (s instanceof Mana_PartColor) { - cmc += 0.0001; - } - } - - cmc += 0.00001 * getXcounter(); - return cmc; - } - - /** - *

split.

- * - * @param cost a {@link java.lang.String} object. - * @return a {@link java.util.ArrayList} object. - */ - private ArrayList split(String cost) { - ArrayList list = new ArrayList(); - - //handles costs like "3", "G", "GW", "10", "S" - if (cost.length() == 1 || cost.length() == 2) { - if (Character.isDigit(cost.charAt(0))) list.add(new Mana_PartColorless(cost)); - else if (cost.charAt(0) == 'S') list.add(new Mana_PartSnow()); - else if (cost.charAt(0) == 'P') list.add(new Mana_PartPhyrexian(cost)); - else list.add(new Mana_PartColor(cost)); - } else//handles "3 GW", "10 GW", "1 G G", "G G", "S 1" - { - //all costs that have a length greater than 2 have a space - StringTokenizer tok = new StringTokenizer(cost); - - while (tok.hasMoreTokens()) - list.add(getManaPart(tok.nextToken())); - - //ManaPartColorless needs to be added AFTER the colored mana - //in order for isNeeded() and addMana() to work correctly - Object o = list.get(0); - if (o instanceof Mana_PartSnow) { - //move snow cost to the end of the list - list.remove(0); - list.add(o); - } - o = list.get(0); - - if (o instanceof Mana_PartColorless) { - //move colorless cost to the end of the list - list.remove(0); - list.add(o); - } - }//else - - return list; - }//split() - - /** - *

Getter for the field manaPart.

- * - * @param partCost a {@link java.lang.String} object. - * @return a {@link forge.card.mana.Mana_Part} object. - */ - private Mana_Part getManaPart(String partCost) { - if (partCost.length() == 3) { - return new Mana_PartSplit(partCost); - } else if (Character.isDigit(partCost.charAt(0))) { - return new Mana_PartColorless(partCost); - } else if (partCost.equals("S")) { - return new Mana_PartSnow(); - } else if (partCost.startsWith("P")) { - return new Mana_PartPhyrexian(partCost); - } else { - return new Mana_PartColor(partCost); - } - } - - /** - *

Setter for the field xcounter.

- * - * @param xcounter a int. - */ - public void setXcounter(int xcounter) { - this.xcounter = xcounter; - } - - /** - *

Getter for the field xcounter.

- * - * @return a int. - */ - public int getXcounter() { - return xcounter; - } - - /** - *

removeColorlessMana.

- * - * @since 1.0.15 - */ - public void removeColorlessMana() { - - for (int i = 0; i < manaPart.size(); i++) { - if (manaPart.get(i) instanceof Mana_PartColorless) - manaPart.remove(manaPart.get(i)); - } - } -} diff --git a/src/forge/card/mana/ManaPool.java b/src/forge/card/mana/ManaPool.java deleted file mode 100644 index 55b2101c63d..00000000000 --- a/src/forge/card/mana/ManaPool.java +++ /dev/null @@ -1,855 +0,0 @@ -package forge.card.mana; - -import forge.*; -import forge.card.spellability.Ability_Mana; -import forge.card.spellability.SpellAbility; -import forge.gui.GuiUtils; -import forge.gui.input.Input_PayManaCostUtil; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - - -/** - *

ManaPool class.

- * - * @author Forge - * @version $Id: $ - */ -public class ManaPool extends Card { - // current paying moved to SpellAbility - - private ArrayList floatingMana = new ArrayList(); - private int[] floatingTotals = new int[7]; // WUBRGCS - /** Constant map */ - private final static Map map = new HashMap(); - - /** Constant colors="WUBRG" */ - public final static String colors = "WUBRG"; - /** Constant mcolors="1WUBRG" */ - public final static String mcolors = "1WUBRG"; - private Player owner; - - /** - *

Constructor for ManaPool.

- * - * @param player a {@link forge.Player} object. - */ - public ManaPool(Player player) { - super(); - updateObservers(); - owner = player; - this.setController(player); - setName("Mana Pool"); - addIntrinsicKeyword("Shroud"); - addIntrinsicKeyword("Indestructible"); - setImmutable(true); - clearPool(); - map.put(Constant.Color.White, 0); - map.put(Constant.Color.Blue, 1); - map.put(Constant.Color.Black, 2); - map.put(Constant.Color.Red, 3); - map.put(Constant.Color.Green, 4); - map.put(Constant.Color.Colorless, 5); - map.put(Constant.Color.Snow, 6); - } - - - /** - *

getManaList.

- * - * @return a {@link java.lang.String} object. - */ - public String getManaList() { - Mana[] pool = floatingMana.toArray(new Mana[floatingMana.size()]); - - int[] normalMana = {0, 0, 0, 0, 0, 0}; - int[] snowMana = {0, 0, 0, 0, 0, 0}; - String[] manaStrings = {Constant.Color.White, Constant.Color.Blue, Constant.Color.Black, Constant.Color.Red, Constant.Color.Green, Constant.Color.Colorless}; - - for (Mana m : pool) { - if (m.isSnow()) - snowMana[map.get(m.getColor())] += m.getAmount(); - else - normalMana[map.get(m.getColor())] += m.getAmount(); - } - - StringBuilder sbNormal = new StringBuilder(""); - StringBuilder sbSnow = new StringBuilder(""); - if (!isEmpty()) { - for (int i = 0; i < 6; i++) { - if (i == 5) { - if (normalMana[i] > 0) - sbNormal.append(normalMana[i] + " "); - if (snowMana[i] > 0) - sbSnow.append(snowMana[i] + " "); - } else { - if (normalMana[i] > 0) - for (int j = 0; j < normalMana[i]; j++) - sbNormal.append(CardUtil.getShortColor(manaStrings[i])).append(" "); - if (snowMana[i] > 0) - for (int j = 0; j < snowMana[i]; j++) - sbSnow.append(CardUtil.getShortColor(manaStrings[i])).append(" "); - } - - sbNormal.append("|"); - sbSnow.append("|"); - } - } else - return ("|||||||||||"); - - return sbNormal.append(sbSnow).toString(); - - } - - /** {@inheritDoc} */ - @Override - public String getText() { - Mana[] pool = floatingMana.toArray(new Mana[floatingMana.size()]); - - int[] normalMana = {0, 0, 0, 0, 0, 0}; - int[] snowMana = {0, 0, 0, 0, 0, 0}; - String[] manaStrings = {Constant.Color.White, Constant.Color.Blue, Constant.Color.Black, Constant.Color.Red, Constant.Color.Green, Constant.Color.Colorless}; - - for (Mana m : pool) { - if (m.isSnow()) - snowMana[map.get(m.getColor())] += m.getAmount(); - else - normalMana[map.get(m.getColor())] += m.getAmount(); - } - - StringBuilder sbNormal = new StringBuilder(); - StringBuilder sbSnow = new StringBuilder(); - if (!isEmpty()) { - for (int i = 0; i < 6; i++) { - if (i == 5) { - // Put colorless first - if (normalMana[i] > 0) - sbNormal.insert(0, normalMana[i] + " "); - if (snowMana[i] > 0) - sbSnow.insert(0, snowMana[i] + " "); - } else { - if (normalMana[i] > 0) - sbNormal.append(CardUtil.getShortColor(manaStrings[i])).append("(").append(normalMana[i]).append(") "); - if (snowMana[i] > 0) - sbSnow.append(CardUtil.getShortColor(manaStrings[i])).append("(").append(snowMana[i]).append(") "); - } - } - } - - sbNormal.insert(0, "Mana Available:\n"); - sbSnow.insert(0, "Snow Mana Available:\n"); - - return sbNormal.append("\n").append(sbSnow).toString(); - } - - /** - *

getAmountOfColor.

- * - * @param color a {@link java.lang.String} object. - * @return a int. - */ - public int getAmountOfColor(String color) { - return floatingTotals[map.get(color)]; - } - - /** - *

getAmountOfColor.

- * - * @param color a char. - * @return a int. - */ - public int getAmountOfColor(char color) { - return getAmountOfColor(Character.toString(color)); - } - - /** - *

isEmpty.

- * - * @return a boolean. - */ - public boolean isEmpty() { - return floatingMana.size() == 0; - } - - /** - *

oraclize.

- * - * @param manaCost a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public static String oraclize(String manaCost) { - // converts RB to (R/B) - String[] parts = manaCost.split(" "); - StringBuilder res = new StringBuilder(); - for (String s : parts) { - if (s.length() == 2 && colors.contains(s.charAt(1) + "")) s = s.charAt(0) + "/" + s.charAt(1); - if (s.length() == 3) s = "(" + s + ")"; - if (s.equals("S")) s = "(S)";//for if/when we implement snow mana - if (s.equals("X")) s = "(X)";//X costs? - res.append(s); - } - return res.toString(); - } - - /** - *

addManaToPool.

- * - * @param pool a {@link java.util.ArrayList} object. - * @param mana a {@link forge.card.mana.Mana} object. - */ - public void addManaToPool(ArrayList pool, Mana mana) { - pool.add(mana); - if (pool.equals(floatingMana)) { - floatingTotals[map.get(mana.getColor())] += mana.getAmount(); - if (mana.isSnow()) - floatingTotals[map.get(Constant.Color.Snow)] += mana.getAmount(); - } - } - - /** - *

addManaToFloating.

- * - * @param manaStr a {@link java.lang.String} object. - * @param card a {@link forge.Card} object. - */ - public void addManaToFloating(String manaStr, Card card) { - ArrayList manaList = convertStringToMana(manaStr, card); - for (Mana m : manaList) { - addManaToPool(floatingMana, m); - } - AllZone.getGameAction().checkStateEffects(); - } - - /** - *

convertStringToMana.

- * - * @param manaStr a {@link java.lang.String} object. - * @param card a {@link forge.Card} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList convertStringToMana(String manaStr, Card card) { - ArrayList manaList = new ArrayList(); - manaStr = manaStr.trim(); - String[] manaArr = manaStr.split(" "); - - String color = ""; - int total = 0; - int genericTotal = 0; - - for (String c : manaArr) { - String longStr = Input_PayManaCostUtil.getLongColorString(c); - if (longStr.equals(Constant.Color.Colorless)) - genericTotal += Integer.parseInt(c); - else if (color.equals("")) { - color = longStr; - total = 1; - } else if (color.equals(longStr)) { - total++; - } else { // more than one color generated - // add aggregate color - manaList.add(new Mana(color, total, card)); - - color = longStr; - total = 1; - } - } - if (total > 0) - manaList.add(new Mana(color, total, card)); - if (genericTotal > 0) - manaList.add(new Mana(Constant.Color.Colorless, genericTotal, card)); - - return manaList; - } - - /** - *

clearPool.

- */ - public void clearPool() { - if (floatingMana.size() == 0) return; - - if (AllZoneUtil.isCardInPlay("Omnath, Locus of Mana", owner)) { - // Omnath in play, clear all non-green mana - int i = 0; - while (i < floatingMana.size()) { - if (floatingMana.get(i).isColor(Constant.Color.Green)) { - i++; - continue; - } - floatingMana.remove(i); - } - } else - floatingMana.clear(); - } - - /** - *

getManaFrom.

- * - * @param pool a {@link java.util.ArrayList} object. - * @param manaStr a {@link java.lang.String} object. - * @return a {@link forge.card.mana.Mana} object. - */ - public Mana getManaFrom(ArrayList pool, String manaStr) { - String[] colors = manaStr.split("/"); - boolean wantSnow = false; - for (int i = 0; i < colors.length; i++) { - colors[i] = Input_PayManaCostUtil.getLongColorString(colors[i]); - if (colors[i].equals(Constant.Color.Snow)) - wantSnow = true; - } - - Mana choice = null; - ArrayList manaChoices = new ArrayList(); - - for (Mana mana : pool) { - if (mana.isColor(colors)) { - if (choice == null) - choice = mana; - else if (choice.isSnow() && !mana.isSnow()) - choice = mana; - } else if (wantSnow && mana.isSnow()) { - if (choice == null) - choice = mana; - else if (choice.isColor(Constant.Color.Colorless)) { - // do nothing Snow Colorless should be used first to pay for Snow mana - } else if (mana.isColor(Constant.Color.Colorless)) { - // give preference to Colorless Snow mana over Colored snow mana - choice = mana; - } else if (floatingTotals[map.get(mana.getColor())] > floatingTotals[map.get(choice.getColor())]) { - // give preference to Colored mana that there is more of to pay Snow costs - choice = mana; - } - } else if (colors[0].equals(Constant.Color.Colorless)) { // colorless - if (choice == null && mana.isColor(Constant.Color.Colorless)) - choice = mana; // Colorless fits the bill nicely - else if (choice == null) { - manaChoices.add(mana); - } else if (choice.isSnow() && !mana.isSnow()) { // nonSnow colorless is better to spend than Snow colorless - choice = mana; - } - } - } - - if (choice != null) - return choice; - - if (colors[0].equals(Constant.Color.Colorless)) { - if (manaChoices.size() == 1) - choice = manaChoices.get(0); - else if (manaChoices.size() > 1) { - int[] normalMana = {0, 0, 0, 0, 0, 0}; - int[] snowMana = {0, 0, 0, 0, 0, 0}; - String[] manaStrings = {Constant.Color.White, Constant.Color.Blue, Constant.Color.Black, Constant.Color.Red, Constant.Color.Green, Constant.Color.Colorless}; - - // loop through manaChoices adding - for (Mana m : manaChoices) { - if (m.isSnow()) - snowMana[map.get(m.getColor())] += m.getAmount(); - else - normalMana[map.get(m.getColor())] += m.getAmount(); - } - - int totalMana = 0; - ArrayList alChoice = new ArrayList(); - for (int i = 0; i < normalMana.length; i++) { - totalMana += normalMana[i]; - totalMana += snowMana[i]; - if (normalMana[i] > 0) { - alChoice.add(manaStrings[i] + "(" + normalMana[i] + ")"); - } - if (snowMana[i] > 0) { - alChoice.add("{S}" + manaStrings[i] + "(" + snowMana[i] + ")"); - } - } - - if (alChoice.size() == 1) { - choice = manaChoices.get(0); - return choice; - } - - int numColorless = Integer.parseInt(manaStr); - if (numColorless >= totalMana) { - choice = manaChoices.get(0); - return choice; - } - - Object o; - - if (owner.isHuman()) - o = GuiUtils.getChoiceOptional("Pay Mana from Mana Pool", alChoice.toArray()); - else o = alChoice.get(0); //owner is computer - - if (o != null) { - String ch = o.toString(); - boolean grabSnow = ch.startsWith("{S}"); - ch = ch.replace("{S}", ""); - - ch = ch.substring(0, ch.indexOf("(")); - - for (Mana m : manaChoices) { - if (m.isColor(ch) && (!grabSnow || (grabSnow && m.isSnow()))) { - if (choice == null) - choice = m; - else if (choice.isSnow() && !m.isSnow()) - choice = m; - } - } - } - } - } - - return choice; - } - - /** - *

removeManaFromFloating.

- * - * @param mc a {@link forge.card.mana.ManaCost} object. - * @param c a {@link forge.Card} object. - */ - public void removeManaFromFloating(ManaCost mc, Card c) { - removeManaFrom(floatingMana, mc, c); - } - - /** - *

removeManaFrom.

- * - * @param pool a {@link java.util.ArrayList} object. - * @param mc a {@link forge.card.mana.ManaCost} object. - * @param c a {@link forge.Card} object. - */ - public void removeManaFrom(ArrayList pool, ManaCost mc, Card c) { - int i = 0; - Mana choice = null; - boolean flag = false; - while (i < pool.size()) { - Mana mana = pool.get(i); - if (flag) c = this; - if (c == this && mc.isNeeded(mana)) { - c = mana.getSourceCard(); - flag = true; - } - if (mana.fromSourceCard(c)) { - choice = mana; - } - i++; - } - removeManaFrom(pool, choice); - } - - /** - *

findAndRemoveFrom.

- * - * @param pool a {@link java.util.ArrayList} object. - * @param mana a {@link forge.card.mana.Mana} object. - */ - public void findAndRemoveFrom(ArrayList pool, Mana mana) { - Mana set = null; - for (Mana m : pool) { - if (m.getSourceCard().equals(mana.getSourceCard()) && m.getColor().equals(mana.getColor())) { - set = m; - break; - } - } - removeManaFrom(pool, set); - } - - /** - *

removeManaFrom.

- * - * @param pool a {@link java.util.ArrayList} object. - * @param choice a {@link forge.card.mana.Mana} object. - */ - public void removeManaFrom(ArrayList pool, Mana choice) { - if (choice != null) { - if (choice.getAmount() == 1) - pool.remove(choice); - else - choice.decrementAmount(); - if (pool.equals(floatingMana)) { - floatingTotals[map.get(choice.getColor())] -= choice.getAmount(); - if (choice.isSnow()) - floatingTotals[map.get(Constant.Color.Snow)] -= choice.getAmount(); - } - } - } - - - /** - *

formatMana.

- * - * @param manaAbility a {@link forge.card.spellability.Ability_Mana} object. - * @return an array of {@link java.lang.String} objects. - */ - public static String[] formatMana(Ability_Mana manaAbility) { - return formatMana(manaAbility.mana(), true); - }//wrapper - - /** - *

formatMana.

- * - * @param Mana_2 a {@link java.lang.String} object. - * @return an array of {@link java.lang.String} objects. - */ - public static String[] formatMana(String Mana_2) { - //turns "G G" -> {"G","G"}, "2 UG"->"{"2","U/G"}, "B W U R G" -> {"B","W","U","R","G"}, etc. - return formatMana(Mana_2, false); - } - - /** - *

formatMana.

- * - * @param Mana_2 a {@link java.lang.String} object. - * @param parsed a boolean. - * @return an array of {@link java.lang.String} objects. - */ - public static String[] formatMana(String Mana_2, boolean parsed) { - String Mana = Mana_2; - //if (Mana.isEmpty()) return null; - if (Mana.trim().equals("")) return null; - if (!parsed) - Mana = oraclize(Mana); - try { - String[] Colorless = {Integer.toString(Integer.parseInt(Mana))}; - return Colorless; - } catch (NumberFormatException ex) { - } - - ArrayList res = new ArrayList(); - int Colorless = 0; - String clessString = ""; - boolean parentheses = false; - String current = ""; - - for (int i = 0; i < Mana.length(); i++) { - char c = Mana.charAt(i); - if (c == '(') { - parentheses = true; - continue; - }//Split cost handling ("(" + + "/" + + ")") - else if (parentheses) { - if (c != ')') { - current += c; - continue; - } else { - parentheses = false; - res.add(current); - current = ""; - continue; - } - } - String s = c + ""; - if (colors.contains(s)) { - res.add(s); - if (clessString.trim().equals("")) continue; - try { - Colorless += Integer.parseInt(clessString.trim()); - } catch (NumberFormatException ex) { - throw new RuntimeException( - "Mana_Pool.getManaParts : Error, sum of noncolor mana parts is not a number - " - + clessString); - } - clessString = ""; - } else clessString += s; - } - for (int i = 0; i < Colorless; i++) - res.add("1"); - - return res.toArray(new String[0]); - } - - /** - *

subtractMultiple.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param cost an array of {@link java.lang.String} objects. - * @param m a {@link forge.card.mana.ManaCost} object. - * @return a {@link forge.card.mana.ManaCost} object. - */ - private ManaCost subtractMultiple(SpellAbility sa, String[] cost, ManaCost m) { - for (String s : cost) { - if (isEmpty()) - break; - - int num = 1; - try { - num = Integer.parseInt(s); - } catch (NumberFormatException e) { - // Not an integer, that's fine - } - - for (int i = 0; i < num; i++) { - if (isEmpty()) - break; - - m = subtractOne(sa, m, s); - } - } - return m; - } - - /** - *

subtractMana.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param m a {@link forge.card.mana.ManaCost} object. - * @param mAbilities a {@link forge.card.spellability.Ability_Mana} object. - * @return a {@link forge.card.mana.ManaCost} object. - */ - public ManaCost subtractMana(SpellAbility sa, ManaCost m, Ability_Mana... mAbilities) { - ArrayList paidAbs = sa.getPayingManaAbilities(); - - if (mAbilities.length == 0) { - // paying from Mana Pool - if (m.isPaid() || isEmpty()) return m; - - String[] cost = formatMana(m.toString()); - return subtractMultiple(sa, cost, m); - } - - // paying via Mana Abilities - for (Ability_Mana mability : mAbilities) { - paidAbs.add(mability); - String[] cost = formatMana(mability); - m = subtractMultiple(sa, cost, m); - } - - return m; - } - - /** - *

subtractOne.

- * - * @param manaStr a {@link java.lang.String} object. - */ - public void subtractOne(String manaStr) { - // Just subtract from floating, used by removeExtrinsicKeyword - ManaCost manaCost = new ManaCost(manaStr); - if (manaStr.trim().equals("") || manaCost.isPaid()) return; - - // get a mana of this type from floating, bail if none available - Mana mana = getManaFrom(floatingMana, manaStr); - if (mana == null) return; // no matching mana in the pool - - Mana[] manaArray = mana.toSingleArray(); - - for (int i = 0; i < manaArray.length; i++) { - Mana m = manaArray[i]; - if (manaCost.isNeeded(m)) { - manaCost.payMana(m); - findAndRemoveFrom(floatingMana, m); - } else - break; - } - } - - /** - *

subtractOne.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param manaCost a {@link forge.card.mana.ManaCost} object. - * @param manaStr a {@link java.lang.String} object. - * @return a {@link forge.card.mana.ManaCost} object. - */ - public ManaCost subtractOne(SpellAbility sa, ManaCost manaCost, String manaStr) { - if (manaStr.trim().equals("") || manaCost.isPaid()) return manaCost; - - ArrayList payMana = sa.getPayingMana(); - - // get a mana of this type from floating, bail if none available - Mana mana = getManaFrom(floatingMana, manaStr); - if (mana == null) return manaCost; // no matching mana in the pool - - Mana[] manaArray = mana.toSingleArray(); - - for (int i = 0; i < manaArray.length; i++) { - Mana m = manaArray[i]; - if (manaCost.isNeeded(m)) { - manaCost.payMana(m); - payMana.add(m); - findAndRemoveFrom(floatingMana, m); - } else - break; - } - return manaCost; - } - - /** - *

totalMana.

- * - * @return a int. - */ - public int totalMana() { - int total = 0; - for (Mana c : floatingMana) - total += c.getAmount(); - return total; - } - - /** - *

clearPay.

- * - * @param ability a {@link forge.card.spellability.SpellAbility} object. - * @param refund a boolean. - */ - public void clearPay(SpellAbility ability, boolean refund) { - ArrayList payAbs = ability.getPayingManaAbilities(); - ArrayList payMana = ability.getPayingMana(); - - payAbs.clear(); - // move non-undoable paying mana back to floating - if (refund) { - for (Mana m : payMana) - addManaToPool(floatingMana, m); - } - - payMana.clear(); - } - - /** - *

accountFor.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param mana an array of {@link java.lang.String} objects. - * @param c a {@link forge.Card} object. - * @return a boolean. - */ - public boolean accountFor(SpellAbility sa, String[] mana, Card c) { - // TODO: account for unpaying mana in payMana and floatingPool - ArrayList payMana = sa.getPayingMana(); - - ArrayList removePaying = new ArrayList(); - ArrayList removeFloating = new ArrayList(); - - int i = 0, j = 0; - boolean usePay = payMana.size() > 0; - boolean flag = false; - - String manaStr = mana[i]; - String color = Input_PayManaCostUtil.getLongColorString(manaStr); - - if (!usePay && floatingMana.size() == 0) - return false; - - while (i < mana.length) { - - Mana m = usePay ? payMana.get(j) : floatingMana.get(j); - - if (m.fromSourceCard(c) && m.getColor().equals(color)) { - int amt = m.getColorlessAmount(); - if (amt > 0) { - int difference = Integer.parseInt(manaStr) - amt; - if (difference > 0) - manaStr = Integer.toString(difference); - else { - i += amt; - if (i < mana.length) - manaStr = mana[i]; - } - } else { - i += m.getAmount(); - if (i < mana.length) - manaStr = mana[i]; - } - color = Input_PayManaCostUtil.getLongColorString(manaStr); - if (usePay) - removePaying.add(m); - else - removeFloating.add(m); - - if (i == mana.length) // If mana has been depleted, break from loop. All Accounted for! - break; - } - - j++; // increase j until we reach the end of paying, then reset and use floating. - if (usePay) { - if (payMana.size() == j) { - j = 0; - usePay = false; - } - } - if (!usePay && floatingMana.size() == j && !flag) - return false; - } - - - for (int k = 0; k < removePaying.size(); k++) { - removeManaFrom(payMana, removePaying.get(k)); - } - for (int k = 0; k < removeFloating.size(); k++) { - removeManaFrom(floatingMana, removeFloating.get(k)); - } - return true; - } - - - /** - *

unpaid.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param untap a boolean. - */ - public void unpaid(SpellAbility sa, boolean untap) { - // TODO: having some crash in here related to undo and not tracking abilities properly - ArrayList payAbs = sa.getPayingManaAbilities(); - - // go through paidAbilities if they are undoable - for (Ability_Mana am : payAbs) { - if (am.isUndoable()) { - String[] formattedMana = formatMana(am); - if (accountFor(sa, formattedMana, am.getSourceCard())) { - am.undo(); - } - // else can't account let clearPay move paying back to floating - } - } - - // move leftover pay back to floating - clearPay(sa, true); - } - - /** - *

updateKeywords.

- */ - private void updateKeywords() { - extrinsicKeyword.clear(); - for (Mana m : floatingMana) - extrinsicKeyword.add("ManaPool:" + m.toString()); - } - - private ArrayList extrinsicKeyword = new ArrayList(); - - /** {@inheritDoc} */ - @Override - public ArrayList getExtrinsicKeyword() { - return new ArrayList(extrinsicKeyword); - } - - /** {@inheritDoc} */ - @Override - public void addExtrinsicKeyword(String s) { - if (s.startsWith("ManaPool:")) { - extrinsicKeyword.add(s); - addManaToFloating(s.split(":")[1], this); - } - } - - /** {@inheritDoc} */ - @Override - public void removeExtrinsicKeyword(String s) { - if (s.startsWith("ManaPool:")) { - updateKeywords(); - extrinsicKeyword.remove(s); - subtractOne(s.split(":")[1]); - this.updateObservers(); - } - } - - /** {@inheritDoc} */ - @Override - public int getExtrinsicKeywordSize() { - updateKeywords(); - return extrinsicKeyword.size(); - } -} diff --git a/src/forge/card/mana/Mana_Part.java b/src/forge/card/mana/Mana_Part.java deleted file mode 100644 index 2632b2b9647..00000000000 --- a/src/forge/card/mana/Mana_Part.java +++ /dev/null @@ -1,96 +0,0 @@ -package forge.card.mana; - - -/** - *

Abstract Mana_Part class.

- * - * @author Forge - * @version $Id: $ - */ -public abstract class Mana_Part { - /** {@inheritDoc} */ - @Override - abstract public String toString(); - - /** - *

reduce.

- * - * @param mana a {@link java.lang.String} object. - */ - abstract public void reduce(String mana); - - /** - *

reduce.

- * - * @param mana a {@link forge.card.mana.Mana} object. - */ - abstract public void reduce(Mana mana); - - /** - *

isPaid.

- * - * @return a boolean. - */ - abstract public boolean isPaid(); - - /** - *

isNeeded.

- * - * @param mana a {@link java.lang.String} object. - * @return a boolean. - */ - abstract public boolean isNeeded(String mana); - - /** - *

isNeeded.

- * - * @param mana a {@link forge.card.mana.Mana} object. - * @return a boolean. - */ - abstract public boolean isNeeded(Mana mana); - - /** - *

isColor.

- * - * @param mana a {@link java.lang.String} object. - * @return a boolean. - */ - abstract public boolean isColor(String mana); - - /** - *

isColor.

- * - * @param mana a {@link forge.card.mana.Mana} object. - * @return a boolean. - */ - abstract public boolean isColor(Mana mana); - - /** - *

isEasierToPay.

- * - * @param mp a {@link forge.card.mana.Mana_Part} object. - * @return a boolean. - */ - abstract public boolean isEasierToPay(Mana_Part mp); - - /** - *

getConvertedManaCost.

- * - * @return a int. - */ - abstract public int getConvertedManaCost(); - - /** - *

checkSingleMana.

- * - * @param m a {@link java.lang.String} object. - */ - public static void checkSingleMana(String m) { - if (m.length() != 1) throw new RuntimeException( - "Mana_Part : checkMana() error, argument mana is not of length 1, mana - " + m); - - if (!(m.equals("G") || m.equals("U") || m.equals("W") || m.equals("B") || m.equals("R") || m.equals("1") || m.equals("S") || m.startsWith("P"))) - throw new RuntimeException( - "Mana_Part : checkMana() error, argument mana is invalid mana, mana - " + m); - } -} diff --git a/src/forge/card/mana/Mana_PartColor.java b/src/forge/card/mana/Mana_PartColor.java deleted file mode 100644 index 4f8f49845c8..00000000000 --- a/src/forge/card/mana/Mana_PartColor.java +++ /dev/null @@ -1,111 +0,0 @@ -package forge.card.mana; - -import forge.gui.input.Input_PayManaCostUtil; - - -/** - *

Mana_PartColor class.

- * - * @author Forge - * @version $Id: $ - */ -public class Mana_PartColor extends Mana_Part { - private String manaCost; - - //String manaCostToPay is either "G" or "GW" NOT "3 G" - //ManaPartColor only needs 1 mana in order to be paid - //GW means it will accept either G or W like Selesnya Guildmage - /** - *

Constructor for Mana_PartColor.

- * - * @param manaCostToPay a {@link java.lang.String} object. - */ - public Mana_PartColor(String manaCostToPay) { - char[] c = manaCostToPay.toCharArray(); - for (int i = 0; i < c.length; i++) { - if (i == 0 && c[i] == ' ') ; - else checkSingleMana("" + c[i]); - } - - manaCost = manaCostToPay; - } - - /** {@inheritDoc} */ - @Override - public String toString() { - return manaCost; - } - - /** {@inheritDoc} */ - @Override - public boolean isNeeded(String mana) { - //ManaPart method - checkSingleMana(mana); - - return !isPaid() && isColor(mana); - } - - /** {@inheritDoc} */ - @Override - public boolean isNeeded(Mana mana) { - return (!isPaid() && isColor(mana)); - } - - /** {@inheritDoc} */ - @Override - public boolean isColor(String mana) { - //ManaPart method - checkSingleMana(mana); - - return manaCost.indexOf(mana) != -1; - } - - /** {@inheritDoc} */ - @Override - public boolean isColor(Mana mana) { - String color = Input_PayManaCostUtil.getShortColorString(mana.getColor()); - - return manaCost.indexOf(color) != -1; - } - - /** {@inheritDoc} */ - @Override - public boolean isEasierToPay(Mana_Part mp) { - if (mp instanceof Mana_PartColorless) return false; - return toString().length() >= mp.toString().length(); - } - - /** {@inheritDoc} */ - @Override - public void reduce(String mana) { - //if mana is needed, then this mana cost is all paid up - if (!isNeeded(mana)) throw new RuntimeException( - "Mana_PartColor : reduce() error, argument mana not needed, mana - " + mana + ", toString() - " - + toString()); - - manaCost = ""; - } - - /** {@inheritDoc} */ - @Override - public void reduce(Mana mana) { - //if mana is needed, then this mana cost is all paid up - if (!isNeeded(mana)) throw new RuntimeException( - "Mana_PartColor : reduce() error, argument mana not needed, mana - " + mana + ", toString() - " - + toString()); - - manaCost = ""; - } - - /** {@inheritDoc} */ - @Override - public boolean isPaid() { - return manaCost.length() == 0; - } - - /** {@inheritDoc} */ - @Override - public int getConvertedManaCost() { - return 1; - } -} diff --git a/src/forge/card/mana/Mana_PartColorless.java b/src/forge/card/mana/Mana_PartColorless.java deleted file mode 100644 index a6cc5fb26ed..00000000000 --- a/src/forge/card/mana/Mana_PartColorless.java +++ /dev/null @@ -1,135 +0,0 @@ -package forge.card.mana; - -import forge.error.ErrorViewer; - - -/** - *

Mana_PartColorless class.

- * - * @author Forge - * @version $Id: $ - */ -public class Mana_PartColorless extends Mana_Part { - private int manaNeeded; - - /** - *

addToManaNeeded.

- * - * @param additional a int. - */ - public void addToManaNeeded(int additional) { - manaNeeded += additional; - } - - /** - *

Getter for the field manaNeeded.

- * - * @return a int. - */ - public int getManaNeeded() { - return manaNeeded; - } - - //String manaCostToPay is like "1", "4", but NO COLOR - /** - *

Constructor for Mana_PartColorless.

- * - * @param manaCostToPay a {@link java.lang.String} object. - */ - public Mana_PartColorless(String manaCostToPay) { - try { - manaNeeded = Integer.parseInt(manaCostToPay); - } catch (NumberFormatException ex) { - ErrorViewer.showError(ex, "mana cost is not a number - %s", manaCostToPay); - throw new RuntimeException(String.format("mana cost is not a number - %s", manaCostToPay), ex); - } - } - - /** - *

Constructor for Mana_PartColorless.

- * - * @param manaCostToPay a int. - */ - public Mana_PartColorless(int manaCostToPay) { - manaNeeded = manaCostToPay; - } - - /** {@inheritDoc} */ - @Override - public String toString() { - if (isPaid()) return ""; - - return String.valueOf(manaNeeded); - } - - /** {@inheritDoc} */ - @Override - public boolean isNeeded(String mana) { - //ManaPart method - checkSingleMana(mana); - - return 0 < manaNeeded; - } - - /** {@inheritDoc} */ - @Override - public boolean isNeeded(Mana mana) { - //ManaPart method - if (mana.getAmount() > 1) throw new RuntimeException("Mana_PartColorless received Mana type with amount > 1"); - - return 0 < manaNeeded; - } - - /** {@inheritDoc} */ - @Override - public boolean isColor(String mana) { - return false; - } - - /** {@inheritDoc} */ - @Override - public boolean isColor(Mana mana) { - return false; - } - - /** {@inheritDoc} */ - @Override - public boolean isEasierToPay(Mana_Part mp) { - // Colorless is always easier to Pay for - return true; - } - - /** {@inheritDoc} */ - @Override - public void reduce(String mana) { - //if mana is needed, then this mana cost is all paid up - if (!isNeeded(mana)) throw new RuntimeException( - "Mana_PartColorless : reduce() error, argument mana not needed, mana - " + mana - + ", toString() - " + toString()); - - manaNeeded--; - } - - /** {@inheritDoc} */ - @Override - public void reduce(Mana mana) { - //if mana is needed, then this mana cost is all paid up - if (!isNeeded(mana)) throw new RuntimeException( - "Mana_PartColorless : reduce() error, argument mana not needed, mana - " + mana - + ", toString() - " + toString()); - - manaNeeded--; - } - - /** {@inheritDoc} */ - @Override - public boolean isPaid() { - return manaNeeded == 0; - } - - /** {@inheritDoc} */ - @Override - public int getConvertedManaCost() { - return manaNeeded; - } -} diff --git a/src/forge/card/mana/Mana_PartPhyrexian.java b/src/forge/card/mana/Mana_PartPhyrexian.java deleted file mode 100644 index c233c1f0ae7..00000000000 --- a/src/forge/card/mana/Mana_PartPhyrexian.java +++ /dev/null @@ -1,109 +0,0 @@ -package forge.card.mana; - -/** - *

Mana_PartPhyrexian class.

- * - * @author Forge - * @version $Id: $ - */ -public class Mana_PartPhyrexian extends Mana_Part { - private Mana_PartColor wrappedColor; - private String color; - - /** - *

Constructor for Mana_PartPhyrexian.

- * - * @param manaCostToPay a {@link java.lang.String} object. - */ - public Mana_PartPhyrexian(String manaCostToPay) { - wrappedColor = new Mana_PartColor(manaCostToPay.substring(1)); - color = manaCostToPay.substring(1); - } - - /** {@inheritDoc} */ - public boolean isEasierToPay(Mana_Part part) { - return true; - } - - /** - *

toString.

- * - * @return a {@link java.lang.String} object. - */ - public String toString() { - return wrappedColor.toString().equals("") ? "" : "P" + wrappedColor.toString(); - } - - /** - *

isPaid.

- * - * @return a boolean. - */ - public boolean isPaid() { - return wrappedColor.isPaid(); - } - - /** - * {@inheritDoc} - * - *

isColor.

- * - * @param mana a {@link java.lang.String} object. - * @return a boolean. - */ - public boolean isColor(String mana) { - return wrappedColor.isColor(mana); - } - - /** {@inheritDoc} */ - public boolean isColor(Mana mana) { - return wrappedColor.isColor(mana); - } - - /** - *

isNeeded.

- * - * @param mana a {@link java.lang.String} object. - * @return a boolean. - */ - public boolean isNeeded(String mana) { - return wrappedColor.isNeeded(mana); - } - - /** {@inheritDoc} */ - public boolean isNeeded(Mana mana) { - return wrappedColor.isNeeded(mana); - } - - /** {@inheritDoc} */ - public void reduce(String mana) { - wrappedColor.reduce(mana); - } - - /** - * {@inheritDoc} - * - *

reduce.

- * - * @param mana a {@link forge.card.mana.Mana} object. - */ - public void reduce(Mana mana) { - wrappedColor.reduce(mana); - } - - /** - *

getConvertedManaCost.

- * - * @return a int. - */ - public int getConvertedManaCost() { - return wrappedColor.getConvertedManaCost(); - } - - /** - *

payLife.

- */ - public void payLife() { - wrappedColor.reduce(color); - } -} diff --git a/src/forge/card/mana/Mana_PartSnow.java b/src/forge/card/mana/Mana_PartSnow.java deleted file mode 100644 index e955c097d3e..00000000000 --- a/src/forge/card/mana/Mana_PartSnow.java +++ /dev/null @@ -1,80 +0,0 @@ -package forge.card.mana; - -/** - *

Mana_PartSnow class.

- * - * @author Forge - * @version $Id: $ - */ -public class Mana_PartSnow extends Mana_Part { - - private boolean isPaid = false; - - /** {@inheritDoc} */ - @Override - public boolean isNeeded(String mana) { - return !isPaid && mana.equals("S"); - } - - /** {@inheritDoc} */ - public boolean isNeeded(Mana mana) { - return !isPaid && mana.isSnow(); - } - - /** {@inheritDoc} */ - @Override - public boolean isColor(String mana) { - //ManaPart method - return mana.indexOf("S") != -1; - } - - /** {@inheritDoc} */ - @Override - public boolean isColor(Mana mana) { - return mana.isSnow(); - } - - /** {@inheritDoc} */ - @Override - public boolean isPaid() { - return isPaid; - } - - /** {@inheritDoc} */ - @Override - public boolean isEasierToPay(Mana_Part mp) { - if (mp instanceof Mana_PartColorless) return false; - return toString().length() >= mp.toString().length(); - } - - /** {@inheritDoc} */ - @Override - public void reduce(String mana) { - if (!mana.equals("S")) - throw new RuntimeException("Mana_PartSnow: reduce() error, " - + mana + " is not snow mana"); - isPaid = true; - } - - /** {@inheritDoc} */ - @Override - public void reduce(Mana mana) { - if (!mana.isSnow()) - throw new RuntimeException("Mana_PartSnow: reduce() error, " - + mana + " is not snow mana"); - isPaid = true; - } - - /** {@inheritDoc} */ - @Override - public String toString() { - return (isPaid ? "" : "S"); - } - - /** {@inheritDoc} */ - @Override - public int getConvertedManaCost() { - return 1; - } - -} diff --git a/src/forge/card/mana/Mana_PartSplit.java b/src/forge/card/mana/Mana_PartSplit.java deleted file mode 100644 index 0f8b38c6276..00000000000 --- a/src/forge/card/mana/Mana_PartSplit.java +++ /dev/null @@ -1,145 +0,0 @@ -package forge.card.mana; - -import forge.gui.input.Input_PayManaCostUtil; - - -//handles mana costs like 2/R or 2/B -//for cards like Flame Javelin (Shadowmoor) -/** - *

Mana_PartSplit class.

- * - * @author Forge - * @version $Id: $ - */ -public class Mana_PartSplit extends Mana_Part { - private Mana_Part manaPart = null; - private String originalCost = ""; - - /** - *

Constructor for Mana_PartSplit.

- * - * @param manaCost a {@link java.lang.String} object. - */ - public Mana_PartSplit(String manaCost) { - //is mana cost like "2/R" - if (manaCost.length() != 3) throw new RuntimeException( - "Mana_PartSplit : constructor() error, bad mana cost parameter - " + manaCost); - - originalCost = manaCost; - } - - /** - *

isFirstTime.

- * - * @return a boolean. - */ - private boolean isFirstTime() { - return manaPart == null; - } - - /** - *

setup.

- * - * @param manaToPay a {@link java.lang.String} object. - */ - private void setup(String manaToPay) { - //get R out of "2/R" - String color = originalCost.substring(2, 3); - - //is manaToPay the one color we want or do we - //treat it like colorless? - //if originalCost is 2/R and is color W (treated like colorless) - //or R? if W use Mana_PartColorless, if R use Mana_PartColor - //does manaToPay contain color? - if (0 <= manaToPay.indexOf(color)) { - manaPart = new Mana_PartColor(color); - } else { - //get 2 out of "2/R" - manaPart = new Mana_PartColorless(originalCost.substring(0, 1)); - } - }//setup() - - /** {@inheritDoc} */ - @Override - public void reduce(String mana) { - if (isFirstTime()) setup(mana); - - manaPart.reduce(mana); - } - - /** {@inheritDoc} */ - @Override - public void reduce(Mana mana) { - if (isFirstTime()) setup(Input_PayManaCostUtil.getShortColorString(mana.getColor())); - - manaPart.reduce(mana); - } - - /** {@inheritDoc} */ - @Override - public boolean isNeeded(String mana) { - if (isFirstTime()) { - //always true because any mana can pay the colorless part of 2/G - return true; - } - - return manaPart.isNeeded(mana); - }//isNeeded() - - /** {@inheritDoc} */ - public boolean isNeeded(Mana mana) { - if (isFirstTime()) { - //always true because any mana can pay the colorless part of 2/G - return true; - } - - return manaPart.isNeeded(mana); - } - - /** {@inheritDoc} */ - @Override - public boolean isColor(String mana) { - //ManaPart method - String mp = toString(); - return mp.indexOf(mana) != -1; - } - - /** {@inheritDoc} */ - @Override - public boolean isColor(Mana mana) { - String color = Input_PayManaCostUtil.getShortColorString(mana.getColor()); - String mp = toString(); - return mp.indexOf(color) != -1; - } - - /** {@inheritDoc} */ - @Override - public boolean isEasierToPay(Mana_Part mp) { - if (mp instanceof Mana_PartColorless) return false; - if (!isFirstTime()) return true; - return toString().length() >= mp.toString().length(); - } - - /** {@inheritDoc} */ - @Override - public String toString() { - if (isFirstTime()) return originalCost; - - return manaPart.toString(); - } - - /** {@inheritDoc} */ - @Override - public boolean isPaid() { - if (isFirstTime()) return false; - - return manaPart.isPaid(); - } - - /** {@inheritDoc} */ - @Override - public int getConvertedManaCost() { - // grab the colorless portion of the split cost (usually 2, but possibly more later) - return Integer.parseInt(originalCost.substring(0, 1)); - } -} diff --git a/src/forge/card/spellability/Ability.java b/src/forge/card/spellability/Ability.java deleted file mode 100644 index 2bab39ea658..00000000000 --- a/src/forge/card/spellability/Ability.java +++ /dev/null @@ -1,58 +0,0 @@ -package forge.card.spellability; - -import com.esotericsoftware.minlog.Log; -import forge.*; - - -/** - *

Abstract Ability class.

- * - * @author Forge - * @version $Id: $ - */ -abstract public class Ability extends SpellAbility { - //Slight hack for Pithing Needle - private String sourceCardName; - - /** - *

Constructor for Ability.

- * - * @param sourceCard a {@link forge.Card} object. - * @param manaCost a {@link java.lang.String} object. - */ - public Ability(Card sourceCard, String manaCost) { - super(SpellAbility.Ability, sourceCard); - setManaCost(manaCost); - sourceCardName = sourceCard.getName(); - } - - /** - *

Constructor for Ability.

- * - * @param sourceCard a {@link forge.Card} object. - * @param manaCost a {@link java.lang.String} object. - * @param stackDescription a {@link java.lang.String} object. - */ - public Ability(Card sourceCard, String manaCost, String stackDescription) { - this(sourceCard, manaCost); - setStackDescription(stackDescription); - Log.debug("an ability is being played from" + sourceCard.getName()); - } - - /** {@inheritDoc} */ - @Override - public boolean canPlay() { - if (AllZone.getStack().isSplitSecondOnStack()) return false; - - CardList pithing = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - pithing.addAll(AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer())); - pithing = pithing.getName("Pithing Needle"); - pithing = pithing.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getSVar("PithingTarget").equals(sourceCardName); - } - }); - - return AllZoneUtil.isCardInPlay(getSourceCard()) && !getSourceCard().isFaceDown() && getSourceCard().getName().equals("Spreading Seas") == false && pithing.size() == 0; - } -} diff --git a/src/forge/card/spellability/Ability_Activated.java b/src/forge/card/spellability/Ability_Activated.java deleted file mode 100644 index 193c8d7e2e6..00000000000 --- a/src/forge/card/spellability/Ability_Activated.java +++ /dev/null @@ -1,67 +0,0 @@ -package forge.card.spellability; - -import forge.*; - - -/** - *

Abstract Ability_Activated class.

- * - * @author Forge - * @version $Id: $ - */ -abstract public class Ability_Activated extends SpellAbility implements java.io.Serializable { - /** Constant serialVersionUID=1L */ - private static final long serialVersionUID = 1L; - - /** - *

Constructor for Ability_Activated.

- * - * @param card a {@link forge.Card} object. - * @param manacost a {@link java.lang.String} object. - */ - public Ability_Activated(Card card, String manacost) { - this(card, new Cost(manacost, card.getName(), true), null); - } - - /** - *

Constructor for Ability_Activated.

- * - * @param sourceCard a {@link forge.Card} object. - * @param abCost a {@link forge.card.spellability.Cost} object. - * @param tgt a {@link forge.card.spellability.Target} object. - */ - public Ability_Activated(Card sourceCard, Cost abCost, Target tgt) { - super(SpellAbility.Ability, sourceCard); - setManaCost(abCost.getTotalMana()); - setPayCosts(abCost); - if (tgt != null && tgt.doesTarget()) - setTarget(tgt); - } - - /** {@inheritDoc} */ - @Override - public boolean canPlay() { - if (AllZone.getStack().isSplitSecondOnStack()) return false; - - final Card c = getSourceCard(); - if (c.isFaceDown() && isIntrinsic()) // Intrinsic abilities can't be activated by face down cards - return false; - if (c.hasKeyword("CARDNAME's activated abilities can't be activated.")) return false; - - CardList pithing = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - pithing.addAll(AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer())); - pithing = pithing.getName("Pithing Needle"); - pithing = pithing.filter(new CardListFilter() { - public boolean addCard(Card crd) { - return crd.getSVar("PithingTarget").equals(c.getName()); - } - }); - - if (pithing.size() != 0) return false; - - if (!(getRestrictions().canPlay(c, this))) - return false; - - return Cost_Payment.canPayAdditionalCosts(payCosts, this); - } -} diff --git a/src/forge/card/spellability/Ability_Mana.java b/src/forge/card/spellability/Ability_Mana.java deleted file mode 100644 index e0c12efd5b8..00000000000 --- a/src/forge/card/spellability/Ability_Mana.java +++ /dev/null @@ -1,284 +0,0 @@ -package forge.card.spellability; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.Player; -import forge.card.mana.ManaPool; - -import java.util.HashMap; - -/** - *

Abstract Ability_Mana class.

- * - * @author Forge - * @version $Id: $ - */ -abstract public class Ability_Mana extends Ability_Activated implements java.io.Serializable { - /** Constant serialVersionUID=-6816356991224950520L */ - private static final long serialVersionUID = -6816356991224950520L; - - private String origProduced; - private int amount = 1; - protected boolean reflected = false; - protected boolean undoable = true; - protected boolean canceled = false; - - /** - *

Constructor for Ability_Mana.

- * - * @param sourceCard a {@link forge.Card} object. - * @param parse a {@link java.lang.String} object. - * @param produced a {@link java.lang.String} object. - */ - public Ability_Mana(Card sourceCard, String parse, String produced) { - this(sourceCard, parse, produced, 1); - } - - /** - *

Constructor for Ability_Mana.

- * - * @param sourceCard a {@link forge.Card} object. - * @param parse a {@link java.lang.String} object. - * @param produced a {@link java.lang.String} object. - * @param num a int. - */ - public Ability_Mana(Card sourceCard, String parse, String produced, int num) { - this(sourceCard, new Cost(parse, sourceCard.getName(), true), produced, num); - } - - /** - *

Constructor for Ability_Mana.

- * - * @param sourceCard a {@link forge.Card} object. - * @param cost a {@link forge.card.spellability.Cost} object. - * @param produced a {@link java.lang.String} object. - */ - public Ability_Mana(Card sourceCard, Cost cost, String produced) { - this(sourceCard, cost, produced, 1); - } - - /** - *

Constructor for Ability_Mana.

- * - * @param sourceCard a {@link forge.Card} object. - * @param cost a {@link forge.card.spellability.Cost} object. - * @param produced a {@link java.lang.String} object. - * @param num a int. - */ - public Ability_Mana(Card sourceCard, Cost cost, String produced, int num) { - super(sourceCard, cost, null); - - origProduced = produced; - amount = num; - } - - /** {@inheritDoc} */ - @Override - public boolean canPlayAI() { - return false; - } - - /** {@inheritDoc} */ - @Override - public void resolve() { - produceMana(); - } - - /** - *

produceMana.

- */ - public void produceMana() { - StringBuilder sb = new StringBuilder(); - if (amount == 0) - sb.append("0"); - else { - try { - // if baseMana is an integer(colorless), just multiply amount and baseMana - int base = Integer.parseInt(origProduced); - sb.append(base * amount); - } catch (NumberFormatException e) { - for (int i = 0; i < amount; i++) { - if (i != 0) - sb.append(" "); - sb.append(origProduced); - } - } - } - produceMana(sb.toString(), this.getSourceCard().getController()); - } - - /** - *

produceMana.

- * - * @param produced a {@link java.lang.String} object. - * @param player a {@link forge.Player} object. - */ - public void produceMana(String produced, Player player) { - final Card source = this.getSourceCard(); - ManaPool manaPool; - if (player.isHuman()) - manaPool = AllZone.getManaPool(); - else manaPool = AllZone.getComputerManaPool(); - // change this, once ManaPool moves to the Player - // this.getActivatingPlayer().ManaPool.addManaToFloating(origProduced, getSourceCard()); - manaPool.addManaToFloating(produced, source); - - // TODO: all of the following would be better as trigger events "tapped for mana" - if (source.getName().equals("Rainbow Vale")) { - this.undoable = false; - source.addExtrinsicKeyword("An opponent gains control of CARDNAME at the beginning of the next end step."); - } - - if (source.getName().equals("Undiscovered Paradise")) { - this.undoable = false; - // Probably best to conver this to an Extrinsic Ability - source.setBounceAtUntap(true); - } - - //Run triggers - HashMap runParams = new HashMap(); - - runParams.put("Card", source); - runParams.put("Player", player); - runParams.put("Ability_Mana", this); - runParams.put("Produced", produced); - AllZone.getTriggerHandler().runTrigger("TapsForMana", runParams); - - }//end produceMana(String) - - /** - *

mana.

- * - * @return a {@link java.lang.String} object. - */ - public String mana() { - return origProduced; - } - - /** - *

setMana.

- * - * @param s a {@link java.lang.String} object. - */ - public void setMana(String s) { - origProduced = s; - } - - /** - *

setReflectedMana.

- * - * @param bReflect a boolean. - */ - public void setReflectedMana(boolean bReflect) { - reflected = bReflect; - } - - /** - *

isSnow.

- * - * @return a boolean. - */ - public boolean isSnow() { - return this.getSourceCard().isSnow(); - } - - /** - *

isSacrifice.

- * - * @return a boolean. - */ - public boolean isSacrifice() { - return this.getPayCosts().getSacCost(); - } - - /** - *

isReflectedMana.

- * - * @return a boolean. - */ - public boolean isReflectedMana() { - return reflected; - } - - /** - *

canProduce.

- * - * @param s a {@link java.lang.String} object. - * @return a boolean. - */ - public boolean canProduce(String s) { - return origProduced.contains(s); - } - - /** - *

isBasic.

- * - * @return a boolean. - */ - public boolean isBasic() { - if (origProduced.length() != 1) - return false; - - if (amount > 1) - return false; - - return true; - } - - /** - *

isUndoable.

- * - * @return a boolean. - */ - public boolean isUndoable() { - return undoable && getPayCosts().isUndoable() && AllZoneUtil.isCardInPlay(getSourceCard()); - } - - /** - *

Setter for the field undoable.

- * - * @param bUndo a boolean. - */ - public void setUndoable(boolean bUndo) { - undoable = bUndo; - } - - /** - *

Setter for the field canceled.

- * - * @param bCancel a boolean. - */ - public void setCanceled(boolean bCancel) { - canceled = bCancel; - } - - /** - *

Getter for the field canceled.

- * - * @return a boolean. - */ - public boolean getCanceled() { - return canceled; - } - - /** - *

undo.

- */ - public void undo() { - if (isUndoable()) { - getPayCosts().refundPaidCost(getSourceCard()); - } - } - - /** {@inheritDoc} */ - @Override - public boolean equals(Object o) { - //Mana abilities with same Descriptions are "equal" - if (o == null) - return false; - return o.toString().equals(this.toString()); - } - -}//end class Ability_Mana - diff --git a/src/forge/card/spellability/Ability_Static.java b/src/forge/card/spellability/Ability_Static.java deleted file mode 100644 index 61e71658e14..00000000000 --- a/src/forge/card/spellability/Ability_Static.java +++ /dev/null @@ -1,22 +0,0 @@ -package forge.card.spellability; - - -import forge.Card; - -/** - *

Abstract Ability_Static class.

- * - * @author Forge - * @version $Id: $ - */ -abstract public class Ability_Static extends Ability { - /** - *

Constructor for Ability_Static.

- * - * @param sourceCard a {@link forge.Card} object. - * @param manaCost a {@link java.lang.String} object. - */ - public Ability_Static(Card sourceCard, String manaCost) { - super(sourceCard, manaCost); - } -} diff --git a/src/forge/card/spellability/Ability_Sub.java b/src/forge/card/spellability/Ability_Sub.java deleted file mode 100644 index 6f8326185ad..00000000000 --- a/src/forge/card/spellability/Ability_Sub.java +++ /dev/null @@ -1,62 +0,0 @@ -package forge.card.spellability; - -import forge.Card; - -/** - *

Abstract Ability_Sub class.

- * - * @author Forge - * @version $Id: $ - */ -abstract public class Ability_Sub extends SpellAbility implements java.io.Serializable { - /** Constant serialVersionUID=4650634415821733134L */ - private static final long serialVersionUID = 4650634415821733134L; - - private SpellAbility parent = null; - - /** - *

Constructor for Ability_Sub.

- * - * @param sourceCard a {@link forge.Card} object. - * @param tgt a {@link forge.card.spellability.Target} object. - */ - public Ability_Sub(Card sourceCard, Target tgt) { - super(SpellAbility.Ability, sourceCard); - setTarget(tgt); - } - - /** {@inheritDoc} */ - @Override - public boolean canPlay() { - // this should never be on the Stack by itself - return false; - } - - /** - *

chkAI_Drawback.

- * - * @return a boolean. - */ - abstract public boolean chkAI_Drawback(); - - /** {@inheritDoc} */ - abstract public boolean doTrigger(boolean mandatory); - - /** - *

Setter for the field parent.

- * - * @param parent a {@link forge.card.spellability.SpellAbility} object. - */ - public void setParent(SpellAbility parent) { - this.parent = parent; - } - - /** - *

Getter for the field parent.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility getParent() { - return parent; - } -} diff --git a/src/forge/card/spellability/Ability_Triggered.java b/src/forge/card/spellability/Ability_Triggered.java deleted file mode 100644 index e0e17043fcb..00000000000 --- a/src/forge/card/spellability/Ability_Triggered.java +++ /dev/null @@ -1,115 +0,0 @@ -package forge.card.spellability; - - -import forge.Card; -import forge.CardList; -import forge.Command; -import forge.ZCTrigger; - -import java.util.Arrays; - - -/** - *

Ability_Triggered class.

- * - * @author Forge - * @version $Id: $ - */ -public class Ability_Triggered extends Ability implements Command { - - - /** - * - */ - private static final long serialVersionUID = 4970998845621323960L; - - public String[] restrictions; - public ZCTrigger trigger; - public Command todo; - - /** - *

Constructor for Ability_Triggered.

- * - * @param sourceCard a {@link forge.Card} object. - * @param sourceCommand a {@link forge.Command} object. - * @param situation a {@link forge.ZCTrigger} object. - */ - public Ability_Triggered(Card sourceCard, Command sourceCommand, ZCTrigger situation) { - super(sourceCard, "0"); - setTrigger(true); - todo = sourceCommand; - trigger = situation; - if (todo instanceof Ability_Triggered) { - setStackDescription(((SpellAbility) todo).getStackDescription()); - restrictions = ((Ability_Triggered) todo).restrictions; - } else { - setStackDescription("Triggered ability: " + sourceCard + " " + situation); - restrictions = new String[]{"named " + sourceCard.getName()}; - } - } - - /** {@inheritDoc} */ - @Override - public boolean canPlay() { - return false; - }//this is a triggered ability: it cannot be "played" - - /** {@inheritDoc} */ - @Override - public boolean canAfford() { - return false; - }//this is a triggered ability: it cannot be "afforded" - - /** {@inheritDoc} */ - @Override - public void resolve() { - todo.execute(); - } - - /** - *

execute.

- */ - public void execute() { - resolve(); - } - - /** - *

triggerFor.

- * - * @param c a {@link forge.Card} object. - * @return a boolean. - */ - public boolean triggerFor(Card c) { - return !(new CardList(c)).getValidCards(restrictions, c.getController(), c).isEmpty(); - } - - /** - *

triggerOnZoneChange.

- * - * @param sourceZone a {@link java.lang.String} object. - * @param destinationZone a {@link java.lang.String} object. - * @return a boolean. - */ - public boolean triggerOnZoneChange(String sourceZone, String destinationZone) { - return trigger.triggerOn(sourceZone, destinationZone); - } - - /** {@inheritDoc} */ - @Override - public boolean equals(Object o)//TODO: triggers affecting other cards - { - if (!(o instanceof Ability_Triggered)) return false; - Ability_Triggered tmp = (Ability_Triggered) o; - return tmp.getSourceCard().equals(getSourceCard()) && tmp.trigger.equals(trigger) && tmp.todo.equals(todo) - && Arrays.equals(tmp.restrictions, restrictions); - } - - /** - *

isBasic.

- * - * @return a boolean. - */ - public boolean isBasic() { - return restrictions.length == 1 && restrictions[0].equals("named " + getSourceCard().getName()); - } -} diff --git a/src/forge/card/spellability/Cost.java b/src/forge/card/spellability/Cost.java deleted file mode 100644 index 70aab90799c..00000000000 --- a/src/forge/card/spellability/Cost.java +++ /dev/null @@ -1,1285 +0,0 @@ -package forge.card.spellability; - -import forge.AllZone; -import forge.Card; -import forge.Counters; -import forge.card.mana.ManaCost; - -import java.util.regex.Pattern; - -/** - *

Cost class.

- * - * @author Forge - * @version $Id: $ - */ -public class Cost { - private boolean isAbility = true; - - private boolean sacCost = false; - - /** - *

Getter for the field sacCost.

- * - * @return a boolean. - */ - public boolean getSacCost() { - return sacCost; - } - - private String sacType = ""; // or CARDNAME - - /** - *

Getter for the field sacType.

- * - * @return a {@link java.lang.String} object. - */ - public String getSacType() { - return sacType; - } - - private boolean sacThis = false; - - /** - *

Getter for the field sacThis.

- * - * @return a boolean. - */ - public boolean getSacThis() { - return sacThis; - } - - private int sacAmount = 0; - - /** - *

Getter for the field sacAmount.

- * - * @return a int. - */ - public int getSacAmount() { - return sacAmount; - } - - private boolean sacX = false; - - /** - *

isSacX.

- * - * @return a boolean. - */ - public boolean isSacX() { - return sacX; - } - - private boolean sacAll = false; - - /** - *

isSacAll.

- * - * @return a boolean. - */ - public boolean isSacAll() { - return sacAll; - } - - private boolean exileCost = false; - - /** - *

Getter for the field exileCost.

- * - * @return a boolean. - */ - public boolean getExileCost() { - return exileCost; - } - - private String exileType = ""; // or CARDNAME - - /** - *

Getter for the field exileType.

- * - * @return a {@link java.lang.String} object. - */ - public String getExileType() { - return exileType; - } - - private boolean exileThis = false; - - /** - *

Getter for the field exileThis.

- * - * @return a boolean. - */ - public boolean getExileThis() { - return exileThis; - } - - private int exileAmount = 0; - - /** - *

Getter for the field exileAmount.

- * - * @return a int. - */ - public int getExileAmount() { - return exileAmount; - } - - private boolean exileFromHandCost = false; - - /** - *

Getter for the field exileFromHandCost.

- * - * @return a boolean. - */ - public boolean getExileFromHandCost() { - return exileFromHandCost; - } - - private String exileFromHandType = ""; // or CARDNAME - - /** - *

Getter for the field exileFromHandType.

- * - * @return a {@link java.lang.String} object. - */ - public String getExileFromHandType() { - return exileFromHandType; - } - - private boolean exileFromHandThis = false; - - /** - *

Getter for the field exileFromHandThis.

- * - * @return a boolean. - */ - public boolean getExileFromHandThis() { - return exileFromHandThis; - } - - private int exileFromHandAmount = 0; - - /** - *

Getter for the field exileFromHandAmount.

- * - * @return a int. - */ - public int getExileFromHandAmount() { - return exileFromHandAmount; - } - - private boolean exileFromGraveCost = false; - - /** - *

Getter for the field exileFromGraveCost.

- * - * @return a boolean. - */ - public boolean getExileFromGraveCost() { - return exileFromGraveCost; - } - - private String exileFromGraveType = ""; // or CARDNAME - - /** - *

Getter for the field exileFromGraveType.

- * - * @return a {@link java.lang.String} object. - */ - public String getExileFromGraveType() { - return exileFromGraveType; - } - - private boolean exileFromGraveThis = false; - - /** - *

Getter for the field exileFromGraveThis.

- * - * @return a boolean. - */ - public boolean getExileFromGraveThis() { - return exileFromGraveThis; - } - - private int exileFromGraveAmount = 0; - - /** - *

Getter for the field exileFromGraveAmount.

- * - * @return a int. - */ - public int getExileFromGraveAmount() { - return exileFromGraveAmount; - } - - private boolean exileFromTopCost = false; - - /** - *

Getter for the field exileFromTopCost.

- * - * @return a boolean. - */ - public boolean getExileFromTopCost() { - return exileFromTopCost; - } - - private String exileFromTopType = ""; // or CARDNAME - - /** - *

Getter for the field exileFromTopType.

- * - * @return a {@link java.lang.String} object. - */ - public String getExileFromTopType() { - return exileFromTopType; - } - - private boolean exileFromTopThis = false; - - /** - *

Getter for the field exileFromTopThis.

- * - * @return a boolean. - */ - public boolean getExileFromTopThis() { - return exileFromTopThis; - } - - private int exileFromTopAmount = 0; - - /** - *

Getter for the field exileFromTopAmount.

- * - * @return a int. - */ - public int getExileFromTopAmount() { - return exileFromTopAmount; - } - - private boolean tapCost = false; - - /** - *

getTap.

- * - * @return a boolean. - */ - public boolean getTap() { - return tapCost; - } - - // future expansion of Ability_Cost class: tap untapped type - private boolean tapXTypeCost = false; - - /** - *

Getter for the field tapXTypeCost.

- * - * @return a boolean. - */ - public boolean getTapXTypeCost() { - return tapXTypeCost; - } - - private int tapXTypeAmount = 0; - - /** - *

Getter for the field tapXTypeAmount.

- * - * @return a int. - */ - public int getTapXTypeAmount() { - return tapXTypeAmount; - } - - private String tapXType = ""; - - /** - *

Getter for the field tapXType.

- * - * @return a {@link java.lang.String} object. - */ - public String getTapXType() { - return tapXType; - } - - private boolean untapCost = false; - - /** - *

getUntap.

- * - * @return a boolean. - */ - public boolean getUntap() { - return untapCost; - } - - private boolean subtractCounterCost = false; - - /** - *

getSubCounter.

- * - * @return a boolean. - */ - public boolean getSubCounter() { - return subtractCounterCost; - } - - private boolean addCounterCost = false; - - /** - *

getAddCounter.

- * - * @return a boolean. - */ - public boolean getAddCounter() { - return addCounterCost; - } - - private int counterAmount = 0; - - /** - *

getCounterNum.

- * - * @return a int. - */ - public int getCounterNum() { - return counterAmount; - } - - private Counters counterType; - - /** - *

Getter for the field counterType.

- * - * @return a {@link forge.Counters} object. - */ - public Counters getCounterType() { - return counterType; - } - - private boolean lifeCost = false; - - /** - *

Getter for the field lifeCost.

- * - * @return a boolean. - */ - public boolean getLifeCost() { - return lifeCost; - } - - private int lifeAmount = 0; - - /** - *

Getter for the field lifeAmount.

- * - * @return a int. - */ - public int getLifeAmount() { - return lifeAmount; - } - - private boolean discardCost = false; - - /** - *

Getter for the field discardCost.

- * - * @return a boolean. - */ - public boolean getDiscardCost() { - return discardCost; - } - - private int discardAmount = 0; - - /** - *

Getter for the field discardAmount.

- * - * @return a int. - */ - public int getDiscardAmount() { - return discardAmount; - } - - private String discardType = ""; - - /** - *

Getter for the field discardType.

- * - * @return a {@link java.lang.String} object. - */ - public String getDiscardType() { - return discardType; - } - - private boolean discardThis = false; - - /** - *

Getter for the field discardThis.

- * - * @return a boolean. - */ - public boolean getDiscardThis() { - return discardThis; - } - - private boolean returnCost = false; // Return something to owner's hand - - /** - *

Getter for the field returnCost.

- * - * @return a boolean. - */ - public boolean getReturnCost() { - return returnCost; - } - - private String returnType = ""; // or CARDNAME - - /** - *

Getter for the field returnType.

- * - * @return a {@link java.lang.String} object. - */ - public String getReturnType() { - return returnType; - } - - private boolean returnThis = false; - - /** - *

Getter for the field returnThis.

- * - * @return a boolean. - */ - public boolean getReturnThis() { - return returnThis; - } - - private int returnAmount = 0; - - /** - *

Getter for the field returnAmount.

- * - * @return a int. - */ - public int getReturnAmount() { - return returnAmount; - } - - /** - *

hasNoManaCost.

- * - * @return a boolean. - */ - public boolean hasNoManaCost() { - return manaCost.equals("") || manaCost.equals("0"); - } - - private String manaCost = ""; - - /** - *

getMana.

- * - * @return a {@link java.lang.String} object. - */ - public String getMana() { - return manaCost; - } // Only used for Human to pay for non-X cost first - - /** - *

setMana.

- * - * @param sCost a {@link java.lang.String} object. - */ - public void setMana(String sCost) { - manaCost = sCost; - } - - /** - *

hasNoXManaCost.

- * - * @return a boolean. - */ - public boolean hasNoXManaCost() { - return manaXCost == 0; - } - - private int manaXCost = 0; - - /** - *

getXMana.

- * - * @return a int. - */ - public int getXMana() { - return manaXCost; - } - - /** - *

setXMana.

- * - * @param xCost a int. - */ - public void setXMana(int xCost) { - manaXCost = xCost; - } - - /** - *

isOnlyManaCost.

- * - * @return a boolean. - */ - public boolean isOnlyManaCost() { - return !sacCost && !exileCost && !exileFromHandCost && !exileFromGraveCost && !exileFromTopCost && !tapCost && - !tapXTypeCost && !untapCost && !subtractCounterCost && !addCounterCost && !lifeCost && !discardCost && !returnCost; - } - - /** - *

getTotalMana.

- * - * @return a {@link java.lang.String} object. - */ - public String getTotalMana() { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < manaXCost; i++) - sb.append("X "); - - if (!hasNoManaCost()) - sb.append(manaCost); - - if (sb.toString().equals("")) - return "0"; - - return sb.toString().trim(); - } - - - private String name; - - /** - *

Constructor for Cost.

- * - * @param parse a {@link java.lang.String} object. - * @param cardName a {@link java.lang.String} object. - * @param bAbility a boolean. - */ - public Cost(String parse, String cardName, boolean bAbility) { - isAbility = bAbility; - // when adding new costs for cost string, place them here - name = cardName; - - String tapXStr = "tapXType<"; - if (parse.contains(tapXStr)) { - tapXTypeCost = true; - String[] splitStr = abCostParse(parse, tapXStr, 2); - parse = abUpdateParse(parse, tapXStr); - - tapXTypeAmount = Integer.parseInt(splitStr[0]); - tapXType = splitStr[1]; - } - - String subStr = "SubCounter<"; - if (parse.contains(subStr)) { - // SubCounter - subtractCounterCost = true; - String[] splitStr = abCostParse(parse, subStr, 2); - parse = abUpdateParse(parse, subStr); - - counterAmount = Integer.parseInt(splitStr[0]); - counterType = Counters.valueOf(splitStr[1]); - } - - String addStr = "AddCounter<"; - if (parse.contains(addStr)) { - // AddCounter - addCounterCost = true; - String[] splitStr = abCostParse(parse, addStr, 2); - parse = abUpdateParse(parse, addStr); - - counterAmount = Integer.parseInt(splitStr[0]); - counterType = Counters.valueOf(splitStr[1]); - } - - String lifeStr = "PayLife<"; - if (parse.contains(lifeStr)) { - // PayLife - lifeCost = true; - String[] splitStr = abCostParse(parse, lifeStr, 1); - parse = abUpdateParse(parse, lifeStr); - - lifeAmount = Integer.parseInt(splitStr[0]); - } - - String discStr = "Discard<"; - if (parse.contains(discStr)) { - // Discard - discardCost = true; - String[] splitStr = abCostParse(parse, discStr, 2); - parse = abUpdateParse(parse, discStr); - - discardAmount = Integer.parseInt(splitStr[0]); - discardType = splitStr[1]; - discardThis = (discardType.equals("CARDNAME")); - } - - String sacStr = "Sac<"; - if (parse.contains(sacStr)) { - // TODO: maybe separate SacThis from SacType? not sure if any card would use both - sacCost = true; - String[] splitStr = abCostParse(parse, sacStr, 2); - parse = abUpdateParse(parse, sacStr); - - if (splitStr[0].equals("X")) sacX = true; - else if (splitStr[0].equals("All")) sacAll = true; - else sacAmount = Integer.parseInt(splitStr[0]); - sacType = splitStr[1]; - sacThis = (sacType.equals("CARDNAME")); - } - - String exileStr = "Exile<"; - if (parse.contains(exileStr)) { - exileCost = true; - String[] splitStr = abCostParse(parse, exileStr, 2); - parse = abUpdateParse(parse, exileStr); - - exileAmount = Integer.parseInt(splitStr[0]); - exileType = splitStr[1]; - exileThis = (exileType.equals("CARDNAME")); - } - - String exileFromHandStr = "ExileFromHand<"; - if (parse.contains(exileFromHandStr)) { - exileFromHandCost = true; - String[] splitStr = abCostParse(parse, exileFromHandStr, 2); - parse = abUpdateParse(parse, exileFromHandStr); - - exileFromHandAmount = Integer.parseInt(splitStr[0]); - exileFromHandType = splitStr[1]; - exileFromHandThis = (exileFromHandType.equals("CARDNAME")); - } - - String exileFromGraveStr = "ExileFromGrave<"; - if (parse.contains(exileFromGraveStr)) { - exileFromGraveCost = true; - String[] splitStr = abCostParse(parse, exileFromGraveStr, 2); - parse = abUpdateParse(parse, exileFromGraveStr); - - exileFromGraveAmount = Integer.parseInt(splitStr[0]); - exileFromGraveType = splitStr[1]; - exileFromGraveThis = (exileFromGraveType.equals("CARDNAME")); - } - - String exileFromTopStr = "ExileFromTop<"; - if (parse.contains(exileFromTopStr)) { - exileFromTopCost = true; - String[] splitStr = abCostParse(parse, exileFromTopStr, 2); - parse = abUpdateParse(parse, exileFromTopStr); - - exileFromTopAmount = Integer.parseInt(splitStr[0]); - exileFromTopType = splitStr[1]; - exileFromTopThis = false; - } - - String returnStr = "Return<"; - if (parse.contains(returnStr)) { - returnCost = true; - String[] splitStr = abCostParse(parse, returnStr, 2); - parse = abUpdateParse(parse, returnStr); - - returnAmount = Integer.parseInt(splitStr[0]); - returnType = splitStr[1]; - returnThis = (returnType.equals("CARDNAME")); - } - - if (parse.contains("Untap")) { - untapCost = true; - parse = parse.replace("Untap", "").trim(); - } - - if (parse.contains("Q")) { - untapCost = true; - parse = parse.replace("Q", "").trim(); - } - - if (parse.contains("T")) { - tapCost = true; - parse = parse.replace("T", ""); - parse = parse.trim(); - } - - String stripXCost = parse.replaceAll("X", ""); - - manaXCost = parse.length() - stripXCost.length(); - - manaCost = stripXCost.trim(); - if (manaCost.equals("")) - manaCost = "0"; - } - - /** - *

abCostParse.

- * - * @param parse a {@link java.lang.String} object. - * @param subkey a {@link java.lang.String} object. - * @param numParse a int. - * @return an array of {@link java.lang.String} objects. - */ - String[] abCostParse(String parse, String subkey, int numParse) { - int startPos = parse.indexOf(subkey); - int endPos = parse.indexOf(">", startPos); - String str = parse.substring(startPos, endPos); - - str = str.replace(subkey, ""); - - String[] splitStr = str.split("/", numParse); - return splitStr; - } - - /** - *

abUpdateParse.

- * - * @param parse a {@link java.lang.String} object. - * @param subkey a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - String abUpdateParse(String parse, String subkey) { - int startPos = parse.indexOf(subkey); - int endPos = parse.indexOf(">", startPos); - String str = parse.substring(startPos, endPos + 1); - return parse.replace(str, "").trim(); - } - - /** - *

changeCost.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public void changeCost(SpellAbility sa) { - if (getTotalMana() != "0") { // 11/15/10 use getTotalMana() to account for X reduction - String mana = getTotalMana(); - manaCost = AllZone.getGameAction().getSpellCostChange(sa, new ManaCost(mana)).toString(); - } - } - - /** - *

refundPaidCost.

- * - * @param source a {@link forge.Card} object. - */ - public void refundPaidCost(Card source) { - // prereq: isUndoable is called first - if (tapCost) - source.untap(); - else if (untapCost) - source.tap(); - - if (subtractCounterCost) - source.addCounterFromNonEffect(counterType, counterAmount); - else if (addCounterCost) - source.subtractCounter(counterType, counterAmount); - - // refund chained mana abilities? - } - - /** - *

isUndoable.

- * - * @return a boolean. - */ - public boolean isUndoable() { - return !(sacCost || exileCost || exileFromHandCost || exileFromGraveCost || tapXTypeCost || discardCost || - returnCost || lifeCost || exileFromTopCost) && hasNoXManaCost() && hasNoManaCost(); - } - - - /** - *

isReusuableResource.

- * - * @return a boolean. - */ - public boolean isReusuableResource() { - return !(sacCost || exileCost || exileFromHandCost || tapXTypeCost || discardCost || - returnCost || lifeCost) && isAbility; - // TODO: add/sub counter? Maybe check if it's we're adding a positive counter, or removing a negative counter - } - - /** - *

toString.

- * - * @return a {@link java.lang.String} object. - */ - public String toString() { - if (isAbility) - return abilityToString(); - else - return spellToString(true); - } - - // maybe add a conversion method that turns the amounts into words 1=a(n), 2=two etc. - - /** - *

toStringAlt.

- * - * @return a {@link java.lang.String} object. - */ - public String toStringAlt() { - return spellToString(false); - } - - /** - *

spellToString.

- * - * @param bFlag a boolean. - * @return a {@link java.lang.String} object. - */ - private String spellToString(boolean bFlag) { - StringBuilder cost = new StringBuilder(); - - if (bFlag) - cost.append("As an additional cost to cast ").append(name).append(", "); - - boolean first = true; - - if (!bFlag) { - // usually no additional mana cost for spells - // only three Alliances cards have additional mana costs, but they are basically kicker/multikicker - if (!getTotalMana().equals("0")) { - cost.append("pay ").append(getTotalMana()); - first = false; - } - } - - if (tapCost || untapCost) { - // tap cost for spells will not be in this form. - } - - if (subtractCounterCost || addCounterCost) { - // add counterCost only appears in this form, which is currently on supported: - // put a -1/-1 counter on a creature you control. - - // subtractCounter for spells will not be in this form - - } - - if (lifeCost) { - if (first) - cost.append("pay "); - else - cost.append("and pay "); - cost.append(lifeAmount); - cost.append(" Life"); - - first = false; - } - - if (discardCost) { - cost.append(discardString(first)); - first = false; - } - - if (sacCost) { - cost.append(sacString(first)); - first = false; - } - - if (exileCost) { - cost.append(exileString(first)); - first = false; - } - - if (exileFromHandCost) { - cost.append(exileFromHandString(first)); - first = false; - } - - if (exileFromGraveCost) { - cost.append(exileFromGraveString(first)); - first = false; - } - - if (exileFromTopCost) { - cost.append(exileFromTopString(first)); - first = false; - } - - if (returnCost) { - cost.append(returnString(first)); - first = false; - } - - if (first) - return ""; - - if (bFlag) - cost.append(".").append("\n"); - - return cost.toString(); - } - - /** - *

abilityToString.

- * - * @return a {@link java.lang.String} object. - */ - private String abilityToString() { - StringBuilder cost = new StringBuilder(); - boolean first = true; - if (manaXCost > 0) { - for (int i = 0; i < manaXCost; i++) { - cost.append("X").append(" "); - } - first = false; - } - - if (!(manaCost.equals("0") || manaCost.equals(""))) { - cost.append(manaCost); - first = false; - } - - if (tapCost) { - if (first) - cost.append("Tap"); - else - cost.append(", tap"); - first = false; - } - - if (untapCost) { - if (first) - cost.append("Untap "); - else - cost.append(", untap"); - first = false; - } - - if (tapXTypeCost) { - if (first) - cost.append("Tap "); - else - cost.append(", tap "); - cost.append(convertIntAndTypeToWords(tapXTypeAmount, "untapped " + tapXType)); - cost.append(" you control"); -// cost.append(tapXType); // needs IsValid String converter - first = false; - } - - if (subtractCounterCost) { - if (counterType.getName().equals("Loyalty")) - cost.append("-").append(counterAmount); - else { - if (first) - cost.append("Remove "); - else - cost.append(", remove "); - - cost.append(convertIntAndTypeToWords(counterAmount, counterType.getName() + " counter")); - - cost.append(" from "); - cost.append(name); - } - - first = false; - } - - if (addCounterCost) { - if (counterType.getName().equals("Loyalty")) - cost.append("+").append(counterAmount); - else { - if (first) - cost.append("Put "); - else - cost.append(", put "); - - cost.append(convertIntAndTypeToWords(counterAmount, counterType.getName() + " counter")); - - cost.append(" on "); - cost.append(name); - } - first = false; - } - - if (lifeCost) { - if (first) - cost.append("Pay "); - else - cost.append(", Pay "); - cost.append(lifeAmount); - cost.append(" Life"); - - first = false; - } - - if (discardCost) { - cost.append(discardString(first)); - first = false; - } - - if (sacCost) { - cost.append(sacString(first)); - first = false; - } - - if (exileCost) { - cost.append(exileString(first)); - first = false; - } - - if (exileFromHandCost) { - cost.append(exileFromHandString(first)); - first = false; - } - - if (exileFromGraveCost) { - cost.append(exileFromGraveString(first)); - first = false; - } - - if (exileFromTopCost) { - cost.append(exileFromTopString(first)); - first = false; - } - - if (returnCost) { - cost.append(returnString(first)); - first = false; - } - - if (first) // No costs, append 0 - cost.append("0"); - - cost.append(": "); - return cost.toString(); - } - - /** - *

discardString.

- * - * @param first a boolean. - * @return a {@link java.lang.String} object. - */ - public String discardString(boolean first) { - StringBuilder cost = new StringBuilder(); - if (first) { - if (isAbility) - cost.append("Discard "); - else - cost.append("discard "); - } else { - if (isAbility) - cost.append(", discard "); - else - cost.append("and discard "); - } - - if (discardThis) { - cost.append(name); - } else if (discardType.equals("Hand")) { - cost.append("your hand"); - } else if (discardType.equals("LastDrawn")) { - cost.append("last drawn card"); - } else { - if (!discardType.equals("Any") && !discardType.equals("Card") && !discardType.equals("Random")) { - cost.append(convertIntAndTypeToWords(discardAmount, discardType + " card")); - } else - cost.append(convertIntAndTypeToWords(discardAmount, "card")); - - if (discardType.equals("Random")) - cost.append(" at random"); - } - return cost.toString(); - } - - /** - *

sacString.

- * - * @param first a boolean. - * @return a {@link java.lang.String} object. - */ - public String sacString(boolean first) { - StringBuilder cost = new StringBuilder(); - if (first) { - if (isAbility) - cost.append("Sacrifice "); - else - cost.append("sacrifice "); - } else { - cost.append(", sacrifice "); - } - - if (sacType.equals("CARDNAME")) - cost.append(name); - else - cost.append(convertIntAndTypeToWords(sacAmount, sacType)); - - return cost.toString(); - } - - /** - *

exileString.

- * - * @param first a boolean. - * @return a {@link java.lang.String} object. - */ - public String exileString(boolean first) { - StringBuilder cost = new StringBuilder(); - if (first) { - if (isAbility) - cost.append("Exile "); - else - cost.append("exile "); - } else { - cost.append(", exile "); - } - - if (exileType.equals("CARDNAME")) - cost.append(name); - else - cost.append(convertIntAndTypeToWords(exileAmount, exileType)); - - return cost.toString(); - } - - /** - *

exileFromHandString.

- * - * @param first a boolean. - * @return a {@link java.lang.String} object. - */ - public String exileFromHandString(boolean first) { - StringBuilder cost = new StringBuilder(); - if (first) { - if (isAbility) - cost.append("Exile "); - else - cost.append("exile "); - } else { - cost.append(", exile "); - } - - if (exileType.equals("CARDNAME")) - cost.append(name); - else { - cost.append(convertIntAndTypeToWords(exileFromHandAmount, exileFromHandType)); - cost.append(" from your hand"); - } - return cost.toString(); - } - - /** - *

exileFromGraveString.

- * - * @param first a boolean. - * @return a {@link java.lang.String} object. - */ - public String exileFromGraveString(boolean first) { - StringBuilder cost = new StringBuilder(); - if (first) { - if (isAbility) - cost.append("Exile "); - else - cost.append("exile "); - } else { - cost.append(", exile "); - } - - if (exileType.equals("CARDNAME")) - cost.append(name); - else { - cost.append(convertIntAndTypeToWords(exileFromGraveAmount, exileFromGraveType)); - cost.append(" from your graveyard"); - } - return cost.toString(); - } - - /** - *

exileFromTopString.

- * - * @param first a boolean. - * @return a {@link java.lang.String} object. - */ - public String exileFromTopString(boolean first) { - StringBuilder cost = new StringBuilder(); - if (first) { - if (isAbility) - cost.append("Exile "); - else - cost.append("exile "); - } else { - cost.append(", Exile "); - } - - if (exileType.equals("CARDNAME")) - cost.append(name).append(" from the top of you library"); - else { - cost.append("the top "); - cost.append(convertIntAndTypeToWords(exileFromTopAmount, exileFromTopType)); - cost.append(" of your library"); - } - return cost.toString(); - } - - /** - *

returnString.

- * - * @param first a boolean. - * @return a {@link java.lang.String} object. - */ - public String returnString(boolean first) { - StringBuilder cost = new StringBuilder(); - if (first) { - if (isAbility) - cost.append("Return "); - else - cost.append("return "); - } else { - cost.append(", return "); - } - String pronoun = "its"; - if (returnType.equals("CARDNAME")) - cost.append(name); - else { - cost.append(convertIntAndTypeToWords(returnAmount, returnType)); - - if (returnAmount > 1) { - pronoun = "their"; - } - cost.append(" you control"); - } - cost.append(" to ").append(pronoun).append(" owner's hand"); - return cost.toString(); - } - - // TODO: If an Ability_Cost needs to pay more than 10 of something, fill this array as appropriate - /** Constant numNames="{zero, a, two, three, four, five, six, "{trunked} */ - private static final String[] numNames = {"zero", "a", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"}; - /** Constant vowelPattern */ - private static final Pattern vowelPattern = Pattern.compile("^[aeiou]", Pattern.CASE_INSENSITIVE); - - - /** - *

convertIntAndTypeToWords.

- * - * @param i a int. - * @param type a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - private String convertIntAndTypeToWords(int i, String type) { - StringBuilder sb = new StringBuilder(); - - if (i >= numNames.length) { - sb.append(i); - } else if (1 == i && vowelPattern.matcher(type).find()) - sb.append("an"); - else - sb.append(numNames[i]); - - sb.append(" "); - sb.append(type); - if (1 != i) - sb.append("s"); - - return sb.toString(); - } -} diff --git a/src/forge/card/spellability/Cost_Payment.java b/src/forge/card/spellability/Cost_Payment.java deleted file mode 100644 index 49aaf6d8898..00000000000 --- a/src/forge/card/spellability/Cost_Payment.java +++ /dev/null @@ -1,1877 +0,0 @@ -package forge.card.spellability; - -import forge.*; -import forge.card.abilityFactory.AbilityFactory; -import forge.card.mana.ManaCost; -import forge.gui.GuiUtils; -import forge.gui.input.Input; -import forge.gui.input.Input_PayManaCostUtil; - -import javax.swing.*; - -/** - *

Cost_Payment class.

- * - * @author Forge - * @version $Id: $ - */ -public class Cost_Payment { - private Cost cost = null; - private SpellAbility ability = null; - private Card card = null; - private SpellAbility_Requirements req = null; - - /** - *

Getter for the field cost.

- * - * @return a {@link forge.card.spellability.Cost} object. - */ - public Cost getCost() { - return cost; - } - - /** - *

Getter for the field ability.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility getAbility() { - return ability; - } - - /** - *

Getter for the field card.

- * - * @return a {@link forge.Card} object. - */ - public Card getCard() { - return card; - } - - /** - *

setRequirements.

- * - * @param reqs a {@link forge.card.spellability.SpellAbility_Requirements} object. - */ - public void setRequirements(SpellAbility_Requirements reqs) { - req = reqs; - } - - /** - *

setCancel.

- * - * @param cancel a boolean. - */ - public void setCancel(boolean cancel) { - bCancel = cancel; - } - - /** - *

isCanceled.

- * - * @return a boolean. - */ - public boolean isCanceled() { - return bCancel; - } - - // No default values so an error will be kicked if not set properly in constructor - private boolean payTap; - private boolean payUntap; - private boolean payMana; - private boolean payXMana; - private boolean paySubCounter; - private boolean payAddCounter; - private boolean paySac; - private boolean payExile; - private boolean payExileFromHand; - private boolean payExileFromGrave; - private boolean payExileFromTop; - private boolean payLife; - private boolean payDiscard; - private boolean payTapXType; - private boolean payReturn; - - private boolean bCancel = false; - private boolean bXDefined = true; - - private CardList payTapXTypeTappedList = new CardList(); - - /** - *

addPayTapXTypeTappedList.

- * - * @param c a {@link forge.Card} object. - */ - private void addPayTapXTypeTappedList(Card c) { - payTapXTypeTappedList.add(c); - } - - /** - *

Setter for the field payMana.

- * - * @param bPay a boolean. - */ - public void setPayMana(boolean bPay) { - payMana = bPay; - } - - /** - *

Setter for the field payXMana.

- * - * @param bPay a boolean. - */ - public void setPayXMana(boolean bPay) { - payXMana = bPay; - } - - /** - *

Setter for the field payDiscard.

- * - * @param bSac a boolean. - */ - public void setPayDiscard(boolean bSac) { - payDiscard = bSac; - } - - /** - *

Setter for the field paySac.

- * - * @param bSac a boolean. - */ - public void setPaySac(boolean bSac) { - paySac = bSac; - } - - /** - *

Setter for the field payExile.

- * - * @param bExile a boolean. - */ - public void setPayExile(boolean bExile) { - payExile = bExile; - } - - /** - *

Setter for the field payExileFromHand.

- * - * @param bExileFromHand a boolean. - */ - public void setPayExileFromHand(boolean bExileFromHand) { - payExileFromHand = bExileFromHand; - } - - /** - *

Setter for the field payExileFromGrave.

- * - * @param bExileFromGrave a boolean. - */ - public void setPayExileFromGrave(boolean bExileFromGrave) { - payExileFromGrave = bExileFromGrave; - } - - /** - *

Setter for the field payExileFromTop.

- * - * @param bExileFromTop a boolean. - */ - public void setPayExileFromTop(boolean bExileFromTop) { - payExileFromTop = bExileFromTop; - } - - /** - *

Setter for the field payTapXType.

- * - * @param bTapX a boolean. - */ - public void setPayTapXType(boolean bTapX) { - payTapXType = bTapX; - } - - /** - *

Setter for the field payReturn.

- * - * @param bReturn a boolean. - */ - public void setPayReturn(boolean bReturn) { - payReturn = bReturn; - } - - /** - *

Constructor for Cost_Payment.

- * - * @param cost a {@link forge.card.spellability.Cost} object. - * @param abil a {@link forge.card.spellability.SpellAbility} object. - */ - public Cost_Payment(Cost cost, SpellAbility abil) { - this.cost = cost; - this.ability = abil; - card = this.ability.getSourceCard(); - payTap = !cost.getTap(); - payUntap = !cost.getUntap(); - payMana = cost.hasNoManaCost(); - payXMana = cost.hasNoXManaCost(); - paySubCounter = !cost.getSubCounter(); - payAddCounter = !cost.getAddCounter(); - paySac = !cost.getSacCost(); - payExile = !cost.getExileCost(); - payExileFromHand = !cost.getExileFromHandCost(); - payExileFromGrave = !cost.getExileFromGraveCost(); - payExileFromTop = !cost.getExileFromTopCost(); - payLife = !cost.getLifeCost(); - payDiscard = !cost.getDiscardCost(); - payTapXType = !cost.getTapXTypeCost(); - payReturn = !cost.getReturnCost(); - } - - /** - *

canPayAdditionalCosts.

- * - * @param cost a {@link forge.card.spellability.Cost} object. - * @param ability a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - public static boolean canPayAdditionalCosts(Cost cost, SpellAbility ability) { - if (cost == null) - return true; - - final Card card = ability.getSourceCard(); - if (cost.getTap() && (card.isTapped() || card.isSick())) - return false; - - if (cost.getUntap() && (card.isUntapped() || card.isSick())) - return false; - - if (cost.getTapXTypeCost()) { - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(card.getController()); - - typeList = typeList.getValidCards(cost.getTapXType().split(";"), ability.getActivatingPlayer(), ability.getSourceCard()); - - if (cost.getTap()) { - typeList = typeList.filter(new CardListFilter() { - public boolean addCard(Card c) { - return !c.equals(card) && c.isUntapped(); - } - }); - } - if (typeList.size() == 0) - return false; - } - - int countersLeft = 0; - if (cost.getSubCounter()) { - Counters c = cost.getCounterType(); - countersLeft = card.getCounters(c) - cost.getCounterNum(); - if (countersLeft < 0) { - return false; - } - } - - if (cost.getAddCounter()) { - // Adding Counters as a cost should always be able to be paid - } - - if (cost.getLifeCost()) { - if (!card.getController().canPayLife(cost.getLifeAmount())) return false; - } - - if (cost.getDiscardCost()) { - CardList handList = AllZoneUtil.getPlayerHand(card.getController()); - String discType = cost.getDiscardType(); - int discAmount = cost.getDiscardAmount(); - - if (cost.getDiscardThis()) { - if (!AllZone.getZone(card).getZoneName().equals(Constant.Zone.Hand)) - return false; - } else if (discType.equals("Hand")) { - // this will always work - } else if (discType.equals("LastDrawn")) { - Card c = card.getController().getLastDrawnCard(); - CardList hand = AllZoneUtil.getPlayerHand(card.getController()); - return hand.contains(c); - } else { - if (!discType.equals("Any") && !discType.equals("Random")) { - String validType[] = discType.split(";"); - - handList = handList.getValidCards(validType, ability.getActivatingPlayer(), ability.getSourceCard()); - } - if (discAmount > handList.size()) { - // not enough cards in hand to pay - return false; - } - } - } - - if (cost.getSacCost()) { - if (!cost.getSacThis()) { - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(card.getController()); - - typeList = typeList.getValidCards(cost.getSacType().split(";"), ability.getActivatingPlayer(), ability.getSourceCard()); - - int amount = cost.isSacAll() ? typeList.size() : cost.getSacAmount(); - - if (typeList.size() < amount) - return false; - } else if (!AllZoneUtil.isCardInPlay(card)) - return false; - } - - if (cost.getExileCost()) { - if (!cost.getExileThis()) { - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(card.getController()); - - typeList = typeList.getValidCards(cost.getExileType().split(";"), ability.getActivatingPlayer(), ability.getSourceCard()); - if (typeList.size() < cost.getExileAmount()) - return false; - } else if (!AllZoneUtil.isCardInPlay(card)) - return false; - } - - if (cost.getExileFromHandCost()) { - if (!cost.getExileFromHandThis()) { - CardList typeList = AllZoneUtil.getPlayerHand(card.getController()); - - typeList = typeList.getValidCards(cost.getExileFromHandType().split(";"), ability.getActivatingPlayer(), ability.getSourceCard()); - if (typeList.size() < cost.getExileFromHandAmount()) - return false; - } else if (!AllZoneUtil.isCardInPlayerHand(card.getController(), card)) - return false; - } - - if (cost.getExileFromGraveCost()) { - if (!cost.getExileFromGraveThis()) { - CardList typeList = AllZoneUtil.getPlayerGraveyard(card.getController()); - - typeList = typeList.getValidCards(cost.getExileFromGraveType().split(";"), ability.getActivatingPlayer(), ability.getSourceCard()); - if (typeList.size() < cost.getExileFromGraveAmount()) - return false; - } else if (!AllZoneUtil.isCardInPlayerGraveyard(card.getController(), card)) - return false; - } - - if (cost.getExileFromTopCost()) { - if (!cost.getExileFromTopThis()) { - CardList typeList = AllZoneUtil.getPlayerCardsInLibrary(card.getController()); - - typeList = typeList.getValidCards(cost.getExileFromTopType().split(";"), ability.getActivatingPlayer(), ability.getSourceCard()); - if (typeList.size() < cost.getExileFromTopAmount()) - return false; - } else if (!AllZoneUtil.isCardInPlayerLibrary(card.getController(), card)) - return false; - } - - if (cost.getReturnCost()) { - if (!cost.getReturnThis()) { - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(card.getController()); - - typeList = typeList.getValidCards(cost.getReturnType().split(";"), ability.getActivatingPlayer(), ability.getSourceCard()); - if (typeList.size() < cost.getReturnAmount()) - return false; - } else if (!AllZoneUtil.isCardInPlay(card)) - return false; - } - - return true; - } - - /** - *

setInput.

- * - * @param in a {@link forge.gui.input.Input} object. - */ - public void setInput(Input in) { - AllZone.getInputControl().setInput(in, true); - } - - /** - *

payCost.

- * - * @return a boolean. - */ - public boolean payCost() { - if (bCancel) { - req.finishPaying(); - return false; - } - - if (!payTap && cost.getTap()) { - if (card.isUntapped()) { - card.tap(); - payTap = true; - } else - return false; - } - - if (!payUntap && cost.getUntap()) { - if (card.isTapped()) { - card.untap(); - payUntap = true; - } else - return false; - } - - int manaToAdd = 0; - if (bXDefined && !cost.hasNoXManaCost()) { - // if X cost is a defined value, other than xPaid - if (!card.getSVar("X").equals("Count$xPaid")) { - // this currently only works for things about Targeted object - manaToAdd = AbilityFactory.calculateAmount(card, "X", ability) * cost.getXMana(); - payXMana = true; // Since the X-cost is being lumped into the mana cost - payMana = false; - } - } - bXDefined = false; - - if (!payMana) { // pay mana here - setInput(input_payMana(getAbility(), this, manaToAdd)); - return false; - } - - if (!payXMana && !cost.hasNoXManaCost()) { // pay X mana here - card.setXManaCostPaid(0); - setInput(input_payXMana(getCost().getXMana(), getAbility(), this)); - return false; - } - - if (!payTapXType && cost.getTapXTypeCost()) { - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(card.getController()); - typeList = typeList.getValidCards(cost.getTapXType().split(";"), ability.getActivatingPlayer(), ability.getSourceCard()); - - setInput(input_tapXCost(cost.getTapXTypeAmount(), cost.getTapXType(), typeList, ability, this)); - return false; - } - - if (!paySubCounter && cost.getSubCounter()) { // pay counters here. - Counters type = cost.getCounterType(); - if (card.getCounters(type) >= cost.getCounterNum()) { - card.subtractCounter(type, cost.getCounterNum()); - paySubCounter = true; - } else { - bCancel = true; - req.finishPaying(); - return false; - } - } - - if (!payAddCounter && cost.getAddCounter()) { // add counters here. - card.addCounterFromNonEffect(cost.getCounterType(), cost.getCounterNum()); - payAddCounter = true; - } - - if (!payLife && cost.getLifeCost()) { // pay life here - StringBuilder sb = new StringBuilder(); - sb.append(getCard().getName()); - sb.append(" - Pay "); - sb.append(cost.getLifeAmount()); - sb.append(" Life?"); - Object[] possibleValues = {"Yes", "No"}; - Object choice = JOptionPane.showOptionDialog(null, sb.toString(), getCard().getName() + " - Cost", - JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, - null, possibleValues, possibleValues[0]); - if (choice.equals(0)) { - AllZone.getHumanPlayer().payLife(cost.getLifeAmount(), null); - payLife = true; - } else { - bCancel = true; - req.finishPaying(); - return false; - } - } - - if (!payDiscard && cost.getDiscardCost()) { // discard here - CardList handList = AllZoneUtil.getPlayerHand(card.getController()); - String discType = cost.getDiscardType(); - int discAmount = cost.getDiscardAmount(); - - if (cost.getDiscardThis()) { - card.getController().discard(card, ability); - payDiscard = true; - } else if (discType.equals("Hand")) { - card.getController().discardHand(ability); - payDiscard = true; - } else if (discType.equals("LastDrawn")) { - if (handList.contains(card.getController().getLastDrawnCard())) { - card.getController().discard(card.getController().getLastDrawnCard(), ability); - payDiscard = true; - } - - } else { - if (discType.equals("Random")) { - card.getController().discardRandom(discAmount, ability); - payDiscard = true; - } else { - if (!discType.equals("Any")) { - String validType[] = discType.split(";"); - handList = handList.getValidCards(validType, ability.getActivatingPlayer(), ability.getSourceCard()); - } - setInput(input_discardCost(discAmount, discType, handList, ability, this)); - return false; - } - } - } - - if (!paySac && cost.getSacCost()) { // sacrifice stuff here - if (cost.getSacThis()) - setInput(sacrificeThis(ability, this)); - else if (cost.isSacAll()) - sacrificeAllType(ability, cost.getSacType(), this); - else if (cost.isSacX()) - setInput(sacrificeXType(ability, cost.getSacType(), this)); - else - setInput(sacrificeType(ability, cost.getSacType(), this)); - return false; - } - - if (!payExile && cost.getExileCost()) { // exile stuff here - if (cost.getExileThis()) - setInput(exileThis(ability, this)); - else - setInput(exileType(ability, cost.getExileType(), this)); - return false; - } - - if (!payExileFromHand && cost.getExileFromHandCost()) { // exile stuff here - if (cost.getExileFromHandThis()) - setInput(exileFromHandThis(ability, this)); - else - setInput(exileFromHandType(ability, cost.getExileFromHandType(), this)); - return false; - } - - if (!payExileFromGrave && cost.getExileFromGraveCost()) { // exile stuff here - if (cost.getExileFromGraveThis()) - setInput(exileFromGraveThis(ability, this)); - else - setInput(exileFromGraveType(ability, cost.getExileFromGraveType(), this)); - return false; - } - - if (!payExileFromTop && cost.getExileFromTopCost()) { // exile stuff here - if (cost.getExileFromTopThis()) - setInput(exileFromTopThis(ability, this)); - else - setInput(exileFromTopType(ability, cost.getExileFromTopType(), this)); - return false; - } - - if (!payReturn && cost.getReturnCost()) { // return stuff here - if (cost.getReturnThis()) - setInput(returnThis(ability, this)); - else - setInput(returnType(ability, cost.getReturnType(), this)); - return false; - } - - resetUndoList(); - req.finishPaying(); - return true; - } - - /** - *

isAllPaid.

- * - * @return a boolean. - */ - public boolean isAllPaid() { - // if you add a new Cost type add it here - return (payTap && payUntap && payMana && payXMana && paySubCounter && payAddCounter && - paySac && payExile && payLife && payDiscard && payTapXType && payReturn && - payExileFromHand && payExileFromGrave && payExileFromTop); - } - - /** - *

resetUndoList.

- */ - public void resetUndoList() { - // TODO: clear other undoLists here? - payTapXTypeTappedList.clear(); - } - - /** - *

cancelPayment.

- */ - public void cancelPayment() { - // unpay anything we can. - if (cost.getTap() && payTap) { - // untap if tapped - card.untap(); - } - if (cost.getUntap() && payUntap) { - // tap if untapped - card.tap(); - } - // refund mana - AllZone.getManaPool().unpaid(ability, false); - - if (cost.getTapXTypeCost()) { // Can't depend on payTapXType if canceling before tapping enough - - for (Card c : payTapXTypeTappedList) - c.untap(); - //needed? - payTapXTypeTappedList.clear(); - } - - // refund counters - if (cost.getSubCounter() && paySubCounter) { - card.addCounterFromNonEffect(cost.getCounterType(), cost.getCounterNum()); - } - - // remove added counters - if (cost.getAddCounter() && payAddCounter) { - card.subtractCounter(cost.getCounterType(), cost.getCounterNum()); - } - - // refund life - if (cost.getLifeCost() && payLife) { - card.getController().payLife(cost.getLifeAmount() * -1, null); - } - - // can't really undiscard things - - // can't really unsacrifice things - - //can't really unexile things - - // can't really unexile things from hand - - // can't really unreturn things - } - - /** - *

payComputerCosts.

- * - * @return a boolean. - */ - public boolean payComputerCosts() { - // ******** NOTE for Adding Costs ************ - // make sure ComputerUtil.canPayAdditionalCosts() is updated so the AI knows if they can Pay the cost - CardList sacCard = new CardList(); - CardList exileCard = new CardList(); - CardList exileFromHandCard = new CardList(); - CardList exileFromGraveCard = new CardList(); - CardList exileFromTopCard = new CardList(); - CardList tapXCard = new CardList(); - CardList returnCard = new CardList(); - ability.setActivatingPlayer(AllZone.getComputerPlayer()); - - // double check if something can be sacrificed here. Real check is in ComputerUtil.canPayAdditionalCosts() - if (cost.getSacCost()) { - int amount = cost.getSacAmount(); - if (cost.getSacThis()) - sacCard.add(card); - else if (cost.isSacAll()) { - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - typeList = typeList.getValidCards(cost.getSacType().split(","), card.getController(), card); - sacCard.addAll(typeList); - amount = sacCard.size(); - } else - sacCard = ComputerUtil.chooseSacrificeType(cost.getSacType(), card, ability.getTargetCard(), cost.getSacAmount()); - - if (sacCard.size() != amount) { - System.out.println("Couldn't find a valid card to sacrifice for: " + card.getName()); - return false; - } - } - - // double check if something can be exiled here. Real check is in ComputerUtil.canPayAdditionalCosts() - if (cost.getExileCost()) { - if (cost.getExileThis()) - exileCard.add(card); - else - exileCard = ComputerUtil.chooseExileType(cost.getExileType(), card, ability.getTargetCard(), cost.getExileAmount()); - - - if (exileCard.size() != cost.getExileAmount()) { - System.out.println("Couldn't find a valid card to exile for: " + card.getName()); - return false; - } - } - - // double check if something can be exiled here. Real check is in ComputerUtil.canPayAdditionalCosts() - if (cost.getExileFromHandCost()) { - if (cost.getExileFromHandThis()) - exileFromHandCard.add(card); - else - exileFromHandCard = ComputerUtil.chooseExileFromHandType(cost.getExileFromHandType(), card, ability.getTargetCard(), cost.getExileFromHandAmount()); - - if (exileFromHandCard.size() != cost.getExileFromHandAmount()) { - System.out.println("Couldn't find a valid card to exile for: " + card.getName()); - return false; - } - } - - if (cost.getExileFromGraveCost()) { - if (cost.getExileFromGraveThis()) - exileFromGraveCard.add(card); - else - exileFromGraveCard = ComputerUtil.chooseExileFromGraveType( - cost.getExileFromGraveType(), card, ability.getTargetCard(), cost.getExileFromGraveAmount()); - - if (exileFromGraveCard.size() != cost.getExileFromGraveAmount()) { - System.out.println("Couldn't find a valid card to exile for: " + card.getName()); - return false; - } - } - - if (cost.getExileFromTopCost()) { - if (cost.getExileFromTopThis()) - exileFromTopCard.add(card); - else - exileFromTopCard = AllZoneUtil.getPlayerCardsInLibrary(AllZone.getComputerPlayer(), cost.getExileFromTopAmount()); - - if (exileFromTopCard.size() != cost.getExileFromTopAmount()) { - System.out.println("Couldn't find a valid card to exile for: " + card.getName()); - return false; - } - } - - if (cost.getReturnCost()) { - if (cost.getReturnThis()) - returnCard.add(card); - else - returnCard = ComputerUtil.chooseReturnType(cost.getReturnType(), card, ability.getTargetCard(), cost.getReturnAmount()); - - if (returnCard.size() != cost.getReturnAmount()) { - System.out.println("Couldn't find a valid card to return for: " + card.getName()); - return false; - } - } - - if (cost.getDiscardThis()) { - if (!AllZoneUtil.getPlayerHand(card.getController()).contains(card.getController().getLastDrawnCard())) { - return false; - } - if (!AllZone.getZone(card).getZoneName().equals(Constant.Zone.Hand)) - return false; - } - - if (cost.getTapXTypeCost()) { - boolean tap = cost.getTap(); - - tapXCard = ComputerUtil.chooseTapType(cost.getTapXType(), card, tap, cost.getTapXTypeAmount()); - - if (tapXCard == null || tapXCard.size() != cost.getTapXTypeAmount()) { - System.out.println("Couldn't find a valid card to tap for: " + card.getName()); - return false; - } - } - - // double check if counters available? Real check is in ComputerUtil.canPayAdditionalCosts() - if (cost.getSubCounter() && cost.getCounterNum() > card.getCounters(cost.getCounterType())) { - System.out.println("Not enough " + cost.getCounterType() + " on " + card.getName()); - return false; - } - - if (cost.getTap()) - card.tap(); - - if (cost.getUntap()) - card.untap(); - - if (!cost.hasNoManaCost()) - ComputerUtil.payManaCost(ability); - - if (cost.getTapXTypeCost()) { - for (Card c : tapXCard) - c.tap(); - } - - if (cost.getSubCounter()) - card.subtractCounter(cost.getCounterType(), cost.getCounterNum()); - - if (cost.getAddCounter()) { - card.addCounterFromNonEffect(cost.getCounterType(), cost.getCounterNum()); - } - - if (cost.getLifeCost()) - AllZone.getComputerPlayer().payLife(cost.getLifeAmount(), null); - - if (cost.getDiscardCost()) { - String discType = cost.getDiscardType(); - int discAmount = cost.getDiscardAmount(); - - if (cost.getDiscardThis()) { - card.getController().discard(card, ability); - } else if (discType.equals("Hand")) { - card.getController().discardHand(ability); - } else { - if (discType.equals("Random")) { - card.getController().discardRandom(discAmount, ability); - } else { - if (!discType.equals("Any")) { - String validType[] = discType.split(";"); - AllZone.getGameAction().AI_discardNumType(discAmount, validType, ability); - } else { - AllZone.getComputerPlayer().discard(discAmount, ability, false); - } - } - } - } - - if (cost.getSacCost()) { - for (Card c : sacCard) - AllZone.getGameAction().sacrifice(c); - } - - if (cost.getExileCost()) { - for (Card c : exileCard) - AllZone.getGameAction().exile(c); - } - - if (cost.getExileFromHandCost()) { - for (Card c : exileFromHandCard) - AllZone.getGameAction().exile(c); - } - - if (cost.getExileFromGraveCost()) { - for (Card c : exileFromGraveCard) - AllZone.getGameAction().exile(c); - } - - if (cost.getExileFromTopCost()) { - for (Card c : exileFromTopCard) - AllZone.getGameAction().exile(c); - } - - if (cost.getReturnCost()) { - for (Card c : returnCard) - AllZone.getGameAction().moveToHand(c); - } - return true; - } - - /** - *

changeCost.

- */ - public void changeCost() { - cost.changeCost(ability); - } - - - // ****************************************************************************** - // *********** Inputs used by Cost_Payment below here *************************** - // ****************************************************************************** - - /** - *

input_payMana.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param payment a {@link forge.card.spellability.Cost_Payment} object. - * @param manaToAdd a int. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input input_payMana(final SpellAbility sa, final Cost_Payment payment, int manaToAdd) { - final ManaCost manaCost; - - if (Phase.getGameBegins() == 1) { - if (sa.getSourceCard().isCopiedSpell() && sa.isSpell()) { - manaCost = new ManaCost("0"); - } else { - String mana = payment.getCost().getMana().replace("X", "").trim(); - manaCost = new ManaCost(mana); - manaCost.increaseColorlessMana(manaToAdd); - } - } else { - manaCost = new ManaCost(sa.getManaCost()); - } - - Input payMana = new Input() { - private ManaCost mana = manaCost; - private static final long serialVersionUID = 3467312982164195091L; - - private final String originalManaCost = payment.getCost().getMana(); - - private int phyLifeToLose = 0; - - private void resetManaCost() { - mana = new ManaCost(originalManaCost); - phyLifeToLose = 0; - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - // prevent cards from tapping themselves if ability is a tapability, although it should already be tapped - if (sa.getSourceCard().equals(card) && sa.isTapAbility()) { - return; - } - - mana = Input_PayManaCostUtil.activateManaAbility(sa, card, mana); - - if (mana.isPaid()) - done(); - else if (AllZone.getInputControl().getInput() == this) - showMessage(); - } - - @Override - public void selectPlayer(Player player) { - if (player.isHuman()) { - if (manaCost.payPhyrexian()) { - phyLifeToLose += 2; - } - - showMessage(); - - } - - } - - private void done() { - if (phyLifeToLose > 0) - AllZone.getHumanPlayer().payLife(phyLifeToLose, sa.getSourceCard()); - sa.getSourceCard().setColorsPaid(mana.getColorsPaid()); - sa.getSourceCard().setSunburstValue(mana.getSunburst()); - resetManaCost(); - payment.setPayMana(true); - stop(); - payment.payCost(); - } - - @Override - public void selectButtonCancel() { - resetManaCost(); - payment.setCancel(true); - payment.payCost(); - AllZone.getHumanBattlefield().updateObservers();//DO NOT REMOVE THIS, otherwise the cards don't always tap - stop(); - } - - @Override - public void showMessage() { - ButtonUtil.enableOnlyCancel(); - String displayMana = mana.toString().replace("X", "").trim(); - AllZone.getDisplay().showMessage("Pay Mana Cost: " + displayMana); - - StringBuilder msg = new StringBuilder("Pay Mana Cost: " + displayMana); - if (phyLifeToLose > 0) { - msg.append(" ("); - msg.append(phyLifeToLose); - msg.append(" life paid for phyrexian mana)"); - } - - if (mana.containsPhyrexianMana()) { - msg.append("\n(Click on your life total to pay life for phyrexian mana.)"); - } - - AllZone.getDisplay().showMessage(msg.toString()); - if (mana.isPaid()) - done(); - } - }; - return payMana; - } - - /** - *

input_payXMana.

- * - * @param numX a int. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param payment a {@link forge.card.spellability.Cost_Payment} object. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input input_payXMana(final int numX, final SpellAbility sa, final Cost_Payment payment) { - Input payX = new Input() { - private static final long serialVersionUID = -6900234444347364050L; - int xPaid = 0; - ManaCost manaCost = new ManaCost(Integer.toString(numX)); - - @Override - public void showMessage() { - if (manaCost.toString().equals(Integer.toString(numX))) // Can only cancel if partially paid an X value - ButtonUtil.enableAll(); - else - ButtonUtil.enableOnlyCancel(); - - AllZone.getDisplay().showMessage("Pay X Mana Cost for " + sa.getSourceCard().getName() + "\n" + xPaid + " Paid so far."); - } - - // selectCard - @Override - public void selectCard(Card card, PlayerZone zone) { - if (sa.getSourceCard().equals(card) && sa.isTapAbility()) { - // this really shouldn't happen but just in case - return; - } - - manaCost = Input_PayManaCostUtil.activateManaAbility(sa, card, manaCost); - if (manaCost.isPaid()) { - manaCost = new ManaCost(Integer.toString(numX)); - xPaid++; - } - - if (AllZone.getInputControl().getInput() == this) - showMessage(); - } - - @Override - public void selectButtonCancel() { - payment.setCancel(true); - payment.payCost(); - AllZone.getHumanBattlefield().updateObservers();//DO NOT REMOVE THIS, otherwise the cards don't always tap - stop(); - } - - @Override - public void selectButtonOK() { - payment.setPayXMana(true); - payment.getCard().setXManaCostPaid(xPaid); - stop(); - payment.payCost(); - } - - }; - - return payX; - } - - - /** - *

input_discardCost.

- * - * @param nCards a int. - * @param discType a {@link java.lang.String} object. - * @param handList a {@link forge.CardList} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param payment a {@link forge.card.spellability.Cost_Payment} object. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input input_discardCost(final int nCards, final String discType, final CardList handList, SpellAbility sa, final Cost_Payment payment) { - final SpellAbility sp = sa; - Input target = new Input() { - private static final long serialVersionUID = -329993322080934435L; - - int nDiscard = 0; - - @Override - public void showMessage() { - boolean any = discType.equals("Any") ? true : false; - if (AllZone.getHumanHand().size() == 0) stop(); - StringBuilder type = new StringBuilder(""); - if (any || !discType.equals("Card")) { - type.append(" ").append(discType); - } - StringBuilder sb = new StringBuilder(); - sb.append("Select "); - if (any) { - sb.append("any "); - } else { - sb.append("a ").append(type.toString()).append(" "); - } - sb.append("card to discard."); - if (nCards > 1) { - sb.append(" You have "); - sb.append(nCards - nDiscard); - sb.append(" remaining."); - } - AllZone.getDisplay().showMessage(sb.toString()); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - cancel(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (zone.is(Constant.Zone.Hand) && handList.contains(card)) { - // send in CardList for Typing - card.getController().discard(card, sp); - handList.remove(card); - nDiscard++; - - //in case no more cards in hand - if (nDiscard == nCards) - done(); - else if (AllZone.getHumanHand().size() == 0) // this really shouldn't happen - cancel(); - else - showMessage(); - } - } - - public void cancel() { - payment.setCancel(true); - stop(); - payment.payCost(); - } - - public void done() { - payment.setPayDiscard(true); - stop(); - payment.payCost(); - } - }; - - return target; - }//input_discard() - - /** - *

sacrificeThis.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param payment a {@link forge.card.spellability.Cost_Payment} object. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input sacrificeThis(final SpellAbility sa, final Cost_Payment payment) { - Input target = new Input() { - private static final long serialVersionUID = 2685832214519141903L; - - @Override - public void showMessage() { - Card card = sa.getSourceCard(); - if (card.getController().isHuman() && AllZoneUtil.isCardInPlay(card)) { - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()); - sb.append(" - Sacrifice?"); - Object[] possibleValues = {"Yes", "No"}; - Object choice = JOptionPane.showOptionDialog(null, sb.toString(), card.getName() + " - Cost", - JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, - null, possibleValues, possibleValues[0]); - if (choice.equals(0)) { - payment.setPaySac(true); - payment.getAbility().addCostToHashList(card, "Sacrificed"); - AllZone.getGameAction().sacrifice(card); - stop(); - payment.payCost(); - } else { - payment.setCancel(true); - stop(); - payment.payCost(); - } - } - } - }; - - return target; - }//input_sacrifice() - - /** - *

sacrificeType.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param type a {@link java.lang.String} object. - * @param payment a {@link forge.card.spellability.Cost_Payment} object. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input sacrificeType(final SpellAbility sa, final String type, final Cost_Payment payment) { - Input target = new Input() { - private static final long serialVersionUID = 2685832214519141903L; - private CardList typeList; - private int nSacrifices = 0; - private int nNeeded = payment.getCost().getSacAmount(); - - @Override - public void showMessage() { - StringBuilder msg = new StringBuilder("Sacrifice "); - int nLeft = nNeeded - nSacrifices; - msg.append(nLeft).append(" "); - msg.append(type); - if (nLeft > 1) { - msg.append("s"); - } - - typeList = AllZoneUtil.getPlayerCardsInPlay(sa.getSourceCard().getController()); - typeList = typeList.getValidCards(type.split(";"), sa.getActivatingPlayer(), sa.getSourceCard()); - AllZone.getDisplay().showMessage(msg.toString()); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - cancel(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (typeList.contains(card)) { - nSacrifices++; - payment.getAbility().addCostToHashList(card, "Sacrificed"); - AllZone.getGameAction().sacrifice(card); - typeList.remove(card); - //in case nothing else to sacrifice - if (nSacrifices == nNeeded) - done(); - else if (typeList.size() == 0) // this really shouldn't happen - cancel(); - else - showMessage(); - } - } - - public void done() { - payment.setPaySac(true); - stop(); - payment.payCost(); - } - - public void cancel() { - payment.setCancel(true); - stop(); - payment.payCost(); - } - }; - - return target; - }//sacrificeType() - - /** - *

sacrificeAllType.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param type a {@link java.lang.String} object. - * @param payment a {@link forge.card.spellability.Cost_Payment} object. - */ - public static void sacrificeAllType(final SpellAbility sa, final String type, final Cost_Payment payment) { - // TODO Ask First - - CardList typeList; - typeList = AllZoneUtil.getPlayerCardsInPlay(sa.getActivatingPlayer()); - typeList = typeList.getValidCards(type.split(";"), sa.getActivatingPlayer(), sa.getSourceCard()); - - for (Card card : typeList) { - payment.getAbility().addCostToHashList(card, "Sacrificed"); - AllZone.getGameAction().sacrifice(card); - } - - payment.setPaySac(true); - payment.payCost(); - } - - /** - *

sacrificeXType.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param type a {@link java.lang.String} object. - * @param payment a {@link forge.card.spellability.Cost_Payment} object. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input sacrificeXType(final SpellAbility sa, final String type, final Cost_Payment payment) { - Input target = new Input() { - private static final long serialVersionUID = -4496270321029213839L; - private CardList typeList; - private int nSacrifices = 0; - - @Override - public void showMessage() { - StringBuilder msg = new StringBuilder("Sacrifice X "); - msg.append(type).append("s. "); - msg.append("(").append(nSacrifices).append(" sacrificed so far.)"); - - typeList = AllZoneUtil.getPlayerCardsInPlay(sa.getSourceCard().getController()); - typeList = typeList.getValidCards(type.split(";"), sa.getActivatingPlayer(), sa.getSourceCard()); - AllZone.getDisplay().showMessage(msg.toString()); - ButtonUtil.enableAll(); - } - - @Override - public void selectButtonCancel() { - cancel(); - } - - @Override - public void selectButtonOK() { - done(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (typeList.contains(card)) { - nSacrifices++; - payment.getAbility().addCostToHashList(card, "Sacrificed"); - AllZone.getGameAction().sacrifice(card); - typeList.remove(card); - if (typeList.size() == 0) // this really shouldn't happen - done(); - else - showMessage(); - } - } - - public void done() { - payment.setPaySac(true); - stop(); - payment.payCost(); - } - - public void cancel() { - payment.setCancel(true); - stop(); - payment.payCost(); - } - }; - - return target; - }//sacrificeXType() - - /** - *

exileThis.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param payment a {@link forge.card.spellability.Cost_Payment} object. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input exileThis(final SpellAbility sa, final Cost_Payment payment) { - Input target = new Input() { - private static final long serialVersionUID = 678668673002725001L; - - @Override - public void showMessage() { - Card card = sa.getSourceCard(); - if (card.getController().isHuman() && AllZoneUtil.isCardInPlay(card)) { - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()); - sb.append(" - Exile?"); - Object[] possibleValues = {"Yes", "No"}; - Object choice = JOptionPane.showOptionDialog(null, sb.toString(), card.getName() + " - Cost", - JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, - null, possibleValues, possibleValues[0]); - if (choice.equals(0)) { - payment.setPayExile(true); - payment.getAbility().addCostToHashList(card, "Exiled"); - AllZone.getGameAction().exile(card); - stop(); - payment.payCost(); - } else { - payment.setCancel(true); - stop(); - payment.payCost(); - } - } - } - }; - - return target; - }//input_exile() - - /** - *

exileFromHandThis.

- * - * @param spell a {@link forge.card.spellability.SpellAbility} object. - * @param payment a {@link forge.card.spellability.Cost_Payment} object. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input exileFromHandThis(final SpellAbility spell, final Cost_Payment payment) { - Input target = new Input() { - private static final long serialVersionUID = 2651542083913697972L; - - @Override - public void showMessage() { - Card card = spell.getSourceCard(); - if (card.getController().isHuman() && AllZoneUtil.isCardInPlayerHand(card.getController(), card)) { - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()); - sb.append(" - Exile?"); - Object[] possibleValues = {"Yes", "No"}; - Object choice = JOptionPane.showOptionDialog(null, sb.toString(), card.getName() + " - Cost", - JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, - null, possibleValues, possibleValues[0]); - if (choice.equals(0)) { - payment.setPayExileFromHand(true); - payment.getAbility().addCostToHashList(card, "Exiled"); - AllZone.getGameAction().exile(card); - stop(); - payment.payCost(); - } else { - payment.setCancel(true); - stop(); - payment.payCost(); - } - } - } - }; - return target; - }//input_exile() - - /** - *

exileFromTopThis.

- * - * @param spell a {@link forge.card.spellability.SpellAbility} object. - * @param payment a {@link forge.card.spellability.Cost_Payment} object. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input exileFromTopThis(final SpellAbility spell, final Cost_Payment payment) { - Input target = new Input() { - private static final long serialVersionUID = 3416809678763443014L; - - @Override - public void showMessage() { - Card card = spell.getSourceCard(); - if (card.getController().isHuman() && AllZoneUtil.isCardInPlayerHand(card.getController(), card)) { - //This can't really happen, but if for some reason it could.... - if (AllZoneUtil.getPlayerCardsInLibrary(card.getController()).size() > 0) { - payment.setPayExileFromTop(true); - payment.getAbility().addCostToHashList(card, "Exiled"); - AllZone.getGameAction().exile(card); - stop(); - payment.payCost(); - } else { - payment.setCancel(true); - stop(); - payment.payCost(); - } - } - } - }; - return target; - }//input_exile() - - /** - *

exileFromGraveThis.

- * - * @param spell a {@link forge.card.spellability.SpellAbility} object. - * @param payment a {@link forge.card.spellability.Cost_Payment} object. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input exileFromGraveThis(final SpellAbility spell, final Cost_Payment payment) { - Input target = new Input() { - private static final long serialVersionUID = 6237561876518762902L; - - @Override - public void showMessage() { - Card card = spell.getSourceCard(); - if (card.getController().isHuman() && AllZoneUtil.isCardInPlayerGraveyard(card.getController(), card)) { - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()); - sb.append(" - Exile?"); - Object[] possibleValues = {"Yes", "No"}; - Object choice = JOptionPane.showOptionDialog(null, sb.toString(), card.getName() + " - Cost", - JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, - null, possibleValues, possibleValues[0]); - if (choice.equals(0)) { - payment.setPayExileFromGrave(true); - payment.getAbility().addCostToHashList(card, "Exiled"); - AllZone.getGameAction().exile(card); - stop(); - payment.payCost(); - } else { - payment.setCancel(true); - stop(); - payment.payCost(); - } - } - } - }; - return target; - }//input_exile() - - /** - *

exileType.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param type a {@link java.lang.String} object. - * @param payment a {@link forge.card.spellability.Cost_Payment} object. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input exileType(final SpellAbility sa, final String type, final Cost_Payment payment) { - Input target = new Input() { - private static final long serialVersionUID = 1403915758082824694L; - - private CardList typeList; - private int nExiles = 0; - private int nNeeded = payment.getCost().getExileAmount(); - - @Override - public void showMessage() { - StringBuilder msg = new StringBuilder("Exile "); - int nLeft = nNeeded - nExiles; - msg.append(nLeft).append(" "); - msg.append(type); - if (nLeft > 1) { - msg.append("s"); - } - - typeList = AllZoneUtil.getPlayerCardsInPlay(sa.getSourceCard().getController()); - typeList = typeList.getValidCards(type.split(";"), sa.getActivatingPlayer(), sa.getSourceCard()); - AllZone.getDisplay().showMessage(msg.toString()); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - cancel(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (typeList.contains(card)) { - nExiles++; - payment.getAbility().addCostToHashList(card, "Exiled"); - AllZone.getGameAction().exile(card); - typeList.remove(card); - //in case nothing else to exile - if (nExiles == nNeeded) - done(); - else if (typeList.size() == 0) // this really shouldn't happen - cancel(); - else - showMessage(); - } - } - - public void done() { - payment.setPayExile(true); - stop(); - payment.payCost(); - } - - public void cancel() { - payment.setCancel(true); - stop(); - payment.payCost(); - } - }; - - return target; - }//exileType() - - /** - *

exileFromHandType.

- * - * @param spell a {@link forge.card.spellability.SpellAbility} object. - * @param type a {@link java.lang.String} object. - * @param payment a {@link forge.card.spellability.Cost_Payment} object. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input exileFromHandType(final SpellAbility spell, final String type, final Cost_Payment payment) { - Input target = new Input() { - private static final long serialVersionUID = 759041801001973859L; - private CardList typeList; - private int nExiles = 0; - private int nNeeded = payment.getCost().getExileFromHandAmount(); - - @Override - public void showMessage() { - StringBuilder msg = new StringBuilder("Exile "); - int nLeft = nNeeded - nExiles; - msg.append(nLeft).append(" "); - msg.append(type); - if (nLeft > 1) { - msg.append("s"); - } - msg.append(" from your hand"); - - typeList = AllZoneUtil.getPlayerHand(spell.getSourceCard().getController()); - typeList = typeList.getValidCards(type.split(";"), spell.getActivatingPlayer(), spell.getSourceCard()); - AllZone.getDisplay().showMessage(msg.toString()); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - cancel(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (typeList.contains(card)) { - nExiles++; - payment.getAbility().addCostToHashList(card, "Exiled"); - AllZone.getGameAction().exile(card); - typeList.remove(card); - //in case nothing else to exile - if (nExiles == nNeeded) - done(); - else if (typeList.size() == 0) // this really shouldn't happen - cancel(); - else - showMessage(); - } - } - - public void done() { - payment.setPayExileFromHand(true); - stop(); - payment.payCost(); - } - - public void cancel() { - payment.setCancel(true); - stop(); - payment.payCost(); - } - }; - return target; - }//exileFromHandType() - - /** - *

exileFromGraveType.

- * - * @param spell a {@link forge.card.spellability.SpellAbility} object. - * @param type a {@link java.lang.String} object. - * @param payment a {@link forge.card.spellability.Cost_Payment} object. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input exileFromGraveType(final SpellAbility spell, final String type, final Cost_Payment payment) { - Input target = new Input() { - private static final long serialVersionUID = 734256837615635021L; - - @Override - public void showMessage() { - CardList typeList; - int nNeeded = payment.getCost().getExileFromGraveAmount(); - typeList = AllZoneUtil.getPlayerGraveyard(spell.getSourceCard().getController()); - typeList = typeList.getValidCards(type.split(";"), spell.getActivatingPlayer(), spell.getSourceCard()); - - for (int i = 0; i < nNeeded; i++) { - if (typeList.size() == 0) - cancel(); - - Object o = GuiUtils.getChoiceOptional("Exile from grave", typeList.toArray()); - - if (o != null) { - Card c = (Card) o; - typeList.remove(c); - payment.getAbility().addCostToHashList(c, "Exiled"); - AllZone.getGameAction().exile(c); - if (i == nNeeded - 1) done(); - } - } - } - - @Override - public void selectButtonCancel() { - cancel(); - } - - public void done() { - payment.setPayExileFromGrave(true); - stop(); - payment.payCost(); - } - - public void cancel() { - payment.setCancel(true); - stop(); - payment.payCost(); - } - }; - return target; - }//exileFromGraveType() - - /** - *

exileFromTopType.

- * - * @param spell a {@link forge.card.spellability.SpellAbility} object. - * @param type a {@link java.lang.String} object. - * @param payment a {@link forge.card.spellability.Cost_Payment} object. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input exileFromTopType(final SpellAbility spell, final String type, final Cost_Payment payment) { - Input target = new Input() { - private static final long serialVersionUID = -4764871768555887091L; - - @Override - public void showMessage() { - CardList typeList; - int nNeeded = payment.getCost().getExileFromTopAmount(); - PlayerZone lib = AllZone.getZone(Constant.Zone.Library, spell.getSourceCard().getController()); - typeList = AllZoneUtil.getPlayerCardsInLibrary(spell.getSourceCard().getController()); - typeList = typeList.getValidCards(type.split(";"), spell.getActivatingPlayer(), spell.getSourceCard()); - - for (int i = 0; i < nNeeded; i++) { - if (typeList.size() == 0) - cancel(); - - if (lib.size() > 0) { - Card c = typeList.get(0); - typeList.remove(c); - payment.getAbility().addCostToHashList(c, "Exiled"); - AllZone.getGameAction().exile(c); - if (i == nNeeded - 1) done(); - } - } - } - - @Override - public void selectButtonCancel() { - cancel(); - } - - public void done() { - payment.setPayExileFromTop(true); - stop(); - payment.payCost(); - } - - public void cancel() { - payment.setCancel(true); - stop(); - payment.payCost(); - } - }; - return target; - }//exileFromTopType() - - /** - *

input_tapXCost.

- * - * @param nCards a int. - * @param cardType a {@link java.lang.String} object. - * @param cardList a {@link forge.CardList} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param payment a {@link forge.card.spellability.Cost_Payment} object. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input input_tapXCost(final int nCards, final String cardType, final CardList cardList, SpellAbility sa, final Cost_Payment payment) { - //final SpellAbility sp = sa; - Input target = new Input() { - - private static final long serialVersionUID = 6438988130447851042L; - int nTapped = 0; - - @Override - public void showMessage() { - if (cardList.size() == 0) stop(); - - int left = nCards - nTapped; - AllZone.getDisplay().showMessage("Select a " + cardType + " to tap (" + left + " left)"); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - cancel(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (zone.is(Constant.Zone.Battlefield) && cardList.contains(card) && card.isUntapped()) { - // send in CardList for Typing - card.tap(); - payment.addPayTapXTypeTappedList(card); - cardList.remove(card); - payment.getAbility().addCostToHashList(card, "Tapped"); - nTapped++; - - if (nTapped == nCards) - done(); - else if (cardList.size() == 0) // this really shouldn't happen - cancel(); - else - showMessage(); - } - } - - public void cancel() { - payment.setCancel(true); - stop(); - payment.payCost(); - } - - public void done() { - payment.setPayTapXType(true); - stop(); - payment.payCost(); - } - }; - - return target; - }//input_tapXCost() - - /** - *

returnThis.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param payment a {@link forge.card.spellability.Cost_Payment} object. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input returnThis(final SpellAbility sa, final Cost_Payment payment) { - Input target = new Input() { - private static final long serialVersionUID = 2685832214519141903L; - - @Override - public void showMessage() { - Card card = sa.getSourceCard(); - if (card.getController().isHuman() && AllZoneUtil.isCardInPlay(card)) { - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()); - sb.append(" - Return to Hand?"); - Object[] possibleValues = {"Yes", "No"}; - Object choice = JOptionPane.showOptionDialog(null, sb.toString(), card.getName() + " - Cost", - JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, - null, possibleValues, possibleValues[0]); - if (choice.equals(0)) { - payment.setPayReturn(true); - AllZone.getGameAction().moveToHand(card); - stop(); - payment.payCost(); - } else { - payment.setCancel(true); - stop(); - payment.payCost(); - } - } - } - }; - - return target; - }//input_sacrifice() - - /** - *

returnType.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param type a {@link java.lang.String} object. - * @param payment a {@link forge.card.spellability.Cost_Payment} object. - * @return a {@link forge.gui.input.Input} object. - */ - public static Input returnType(final SpellAbility sa, final String type, final Cost_Payment payment) { - Input target = new Input() { - private static final long serialVersionUID = 2685832214519141903L; - private CardList typeList; - private int nReturns = 0; - private int nNeeded = payment.getCost().getReturnAmount(); - - @Override - public void showMessage() { - StringBuilder msg = new StringBuilder("Return "); - int nLeft = nNeeded - nReturns; - msg.append(nLeft).append(" "); - msg.append(type); - if (nLeft > 1) { - msg.append("s"); - } - - typeList = AllZoneUtil.getPlayerCardsInPlay(sa.getSourceCard().getController()); - typeList = typeList.getValidCards(type.split(";"), sa.getActivatingPlayer(), sa.getSourceCard()); - AllZone.getDisplay().showMessage(msg.toString()); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - cancel(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (typeList.contains(card)) { - nReturns++; - AllZone.getGameAction().moveToHand(card); - typeList.remove(card); - //in case nothing else to return - if (nReturns == nNeeded) - done(); - else if (typeList.size() == 0) // this really shouldn't happen - cancel(); - else - showMessage(); - } - } - - public void done() { - payment.setPayReturn(true); - stop(); - payment.payCost(); - } - - public void cancel() { - payment.setCancel(true); - stop(); - payment.payCost(); - } - }; - - return target; - }//returnType() -} diff --git a/src/forge/card/spellability/Spell.java b/src/forge/card/spellability/Spell.java deleted file mode 100644 index 834210b2a86..00000000000 --- a/src/forge/card/spellability/Spell.java +++ /dev/null @@ -1,100 +0,0 @@ -package forge.card.spellability; - -import forge.*; -import forge.error.ErrorViewer; - - -/** - *

Abstract Spell class.

- * - * @author Forge - * @version $Id: $ - */ -abstract public class Spell extends SpellAbility implements java.io.Serializable, Cloneable { - - /** Constant serialVersionUID=-7930920571482203460L */ - private static final long serialVersionUID = -7930920571482203460L; - - /** - *

Constructor for Spell.

- * - * @param sourceCard a {@link forge.Card} object. - */ - public Spell(Card sourceCard) { - super(SpellAbility.Spell, sourceCard); - - setManaCost(sourceCard.getManaCost()); - setStackDescription(sourceCard.getSpellText()); - getRestrictions().setZone(Constant.Zone.Hand); - } - - /** - *

Constructor for Spell.

- * - * @param sourceCard a {@link forge.Card} object. - * @param abCost a {@link forge.card.spellability.Cost} object. - * @param abTgt a {@link forge.card.spellability.Target} object. - */ - public Spell(Card sourceCard, Cost abCost, Target abTgt) { - super(SpellAbility.Spell, sourceCard); - - setManaCost(sourceCard.getManaCost()); - - setPayCosts(abCost); - setTarget(abTgt); - setStackDescription(sourceCard.getSpellText()); - getRestrictions().setZone(Constant.Zone.Hand); - } - - /** {@inheritDoc} */ - @Override - public boolean canPlay() { - if (AllZone.getStack().isSplitSecondOnStack()) return false; - - Card card = getSourceCard(); - - if (card.isUnCastable()) - return false; - - if (payCosts != null) - if (!Cost_Payment.canPayAdditionalCosts(payCosts, this)) - return false; - - if (!this.getRestrictions().canPlay(card, this)) - return false; - - return (card.isInstant() || card.hasKeyword("Flash") || Phase.canCastSorcery(card.getController())); - }//canPlay() - - /** {@inheritDoc} */ - @Override - public boolean canPlayAI() { - Card card = getSourceCard(); - if (card.getSVar("NeedsToPlay").length() > 0) { - String needsToPlay = card.getSVar("NeedsToPlay"); - CardList list = AllZoneUtil.getCardsInPlay(); - - list = list.getValidCards(needsToPlay.split(","), card.getController(), card); - if (list.isEmpty()) return false; - } - - return super.canPlayAI(); - } - - /** {@inheritDoc} */ - @Override - public String getStackDescription() { - return super.getStackDescription(); - } - - /** {@inheritDoc} */ - @Override - public Object clone() { - try { - return super.clone(); - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("Spell : clone() error, " + ex); - } - } -} diff --git a/src/forge/card/spellability/SpellAbility.java b/src/forge/card/spellability/SpellAbility.java deleted file mode 100644 index 0d9a9bbd979..00000000000 --- a/src/forge/card/spellability/SpellAbility.java +++ /dev/null @@ -1,1205 +0,0 @@ -package forge.card.spellability; - -import forge.*; -import forge.card.abilityFactory.AbilityFactory; -import forge.card.mana.Mana; -import forge.gui.input.Input; - -import java.util.ArrayList; -import java.util.HashMap; - - -//only SpellAbility can go on the stack -//override any methods as needed -/** - *

Abstract SpellAbility class.

- * - * @author Forge - * @version $Id: $ - */ -public abstract class SpellAbility { - public Object[] choices_made; //open ended Casting choice storage - //choices for constructor isPermanent argument - /** Constant Spell=0 */ - public static final int Spell = 0; - /** Constant Ability=1 */ - public static final int Ability = 1; - - private String description = ""; - private Player targetPlayer = null; - private String stackDescription = ""; - private String manaCost = ""; - private String additionalManaCost = ""; - private String multiKickerManaCost = ""; - private String replicateManaCost = ""; - private String xManaCost = ""; - private Player activatingPlayer = null; - - private String type = "Intrinsic"; //set to Intrinsic by default - - private Card targetCard; - private Card sourceCard; - - private CardList targetList; - // targetList doesn't appear to be used anymore - - private boolean spell; - private boolean trigger = false; - private int sourceTrigger = -1; - private boolean mandatory = false; - - private boolean tapAbility; - private boolean untapAbility; - private boolean buyBackAbility = false; //false by default - private boolean flashBackAbility = false; - private boolean multiKicker = false; - private boolean replicate = false; - private boolean xCost = false; - private boolean kickerAbility = false; - private boolean kothThirdAbility = false; - private boolean cycling = false; - - private Input beforePayMana; - private Input afterResolve; - private Input afterPayMana; - - protected Cost payCosts = null; - protected Target chosenTarget = null; - - private SpellAbility_Restriction restrictions = new SpellAbility_Restriction(); - private SpellAbility_Condition conditions = new SpellAbility_Condition(); - private Ability_Sub subAbility = null; - - private AbilityFactory abilityFactory = null; - - private ArrayList payingMana = new ArrayList(); - private ArrayList paidAbilities = new ArrayList(); - - private HashMap paidLists = new HashMap(); - - private HashMap triggeringObjects = new HashMap(); - - private Command cancelCommand = Command.Blank; - private Command beforePayManaAI = Command.Blank; - - private CommandArgs randomTarget = new CommandArgs() { - - private static final long serialVersionUID = 1795025064923737374L; - - public void execute(Object o) { - } - }; - - /** - *

Constructor for SpellAbility.

- * - * @param spellOrAbility a int. - * @param i_sourceCard a {@link forge.Card} object. - */ - public SpellAbility(int spellOrAbility, Card i_sourceCard) { - if (spellOrAbility == Spell) spell = true; - else if (spellOrAbility == Ability) spell = false; - - else throw new RuntimeException("SpellAbility : constructor error, invalid spellOrAbility argument = " - + spellOrAbility); - - - sourceCard = i_sourceCard; - } - - //Spell, and Ability, and other Ability objects override this method - /** - *

canPlay.

- * - * @return a boolean. - */ - abstract public boolean canPlay(); - - /** {@inheritDoc} */ - public boolean canAfford() { - Player activator = this.getActivatingPlayer(); - if (activator == null) - activator = this.getSourceCard().getController(); - - return ComputerUtil.canPayCost(this, activator); - } - - public boolean canPlayAndAfford(){ - return canPlay() && canAfford(); - } - - //all Spell's and Abilities must override this method - /** - *

resolve.

- */ - abstract public void resolve(); - - /** - *

canPlayAI.

- * - * @return a boolean. - */ - public boolean canPlayAI() { - return true; - } - - // This should be overridden by ALL AFs - /** - *

doTrigger.

- * - * @param mandatory a boolean. - * @return a boolean. - */ - public boolean doTrigger(boolean mandatory) { - return false; - } - - /** - *

chooseTargetAI.

- */ - public void chooseTargetAI() { - randomTarget.execute(this); - } - - /** - *

setChooseTargetAI.

- * - * @param c a {@link forge.CommandArgs} object. - */ - public void setChooseTargetAI(CommandArgs c) { - randomTarget = c; - } - - /** - *

getChooseTargetAI.

- * - * @return a {@link forge.CommandArgs} object. - */ - public CommandArgs getChooseTargetAI() { - return randomTarget; - } - - /** - *

Getter for the field manaCost.

- * - * @return a {@link java.lang.String} object. - */ - public String getManaCost() { - return manaCost; - } - - /** - *

Setter for the field manaCost.

- * - * @param cost a {@link java.lang.String} object. - */ - public void setManaCost(String cost) { - manaCost = cost; - } - - /** - *

Getter for the field additionalManaCost.

- * - * @return a {@link java.lang.String} object. - */ - public String getAdditionalManaCost() { - return additionalManaCost; - } - - /** - *

Setter for the field additionalManaCost.

- * - * @param cost a {@link java.lang.String} object. - */ - public void setAdditionalManaCost(String cost) { - additionalManaCost = cost; - } - - /** - *

Getter for the field multiKickerManaCost.

- * - * @return a {@link java.lang.String} object. - */ - public String getMultiKickerManaCost() { - return multiKickerManaCost; - } - - /** - *

Setter for the field multiKickerManaCost.

- * - * @param cost a {@link java.lang.String} object. - */ - public void setMultiKickerManaCost(String cost) { - multiKickerManaCost = cost; - } - - /** - *

Getter for the field replicateManaCost.

- * - * @return a {@link java.lang.String} object. - */ - public String getReplicateManaCost() { - return replicateManaCost; - } - - /** - *

Setter for the field replicateManaCost.

- * - * @param cost a {@link java.lang.String} object. - */ - public void setReplicateManaCost(String cost) { - replicateManaCost = cost; - } - - /** - *

Getter for the field xManaCost.

- * - * @return a {@link java.lang.String} object. - */ - public String getXManaCost() { - return xManaCost; - } - - /** - *

Setter for the field xManaCost.

- * - * @param cost a {@link java.lang.String} object. - */ - public void setXManaCost(String cost) { - xManaCost = cost; - } - - /** - *

Getter for the field activatingPlayer.

- * - * @return a {@link forge.Player} object. - */ - public Player getActivatingPlayer() { - return activatingPlayer; - } - - /** - *

Setter for the field activatingPlayer.

- * - * @param player a {@link forge.Player} object. - */ - public void setActivatingPlayer(Player player) { - // trickle down activating player - activatingPlayer = player; - if (subAbility != null) - subAbility.setActivatingPlayer(player); - } - - /** - *

isSpell.

- * - * @return a boolean. - */ - public boolean isSpell() { - return spell; - } - - /** - *

isAbility.

- * - * @return a boolean. - */ - public boolean isAbility() { - return !isSpell(); - } - - /** - *

isTapAbility.

- * - * @return a boolean. - */ - public boolean isTapAbility() { - return tapAbility; - } - - /** - *

isUntapAbility.

- * - * @return a boolean. - */ - public boolean isUntapAbility() { - return untapAbility; - } - - /** - *

makeUntapAbility.

- */ - public void makeUntapAbility() { - untapAbility = true; - tapAbility = false; - } - - /** - *

setIsBuyBackAbility.

- * - * @param b a boolean. - */ - public void setIsBuyBackAbility(boolean b) { - buyBackAbility = b; - } - - /** - *

isBuyBackAbility.

- * - * @return a boolean. - */ - public boolean isBuyBackAbility() { - return buyBackAbility; - } - - /** - *

setIsMultiKicker.

- * - * @param b a boolean. - */ - public void setIsMultiKicker(boolean b) { - multiKicker = b; - } - - /** - *

isMultiKicker.

- * - * @return a boolean. - */ - public boolean isMultiKicker() { - return multiKicker; - } - - /** - *

setIsReplicate.

- * - * @param b a boolean. - */ - public void setIsReplicate(boolean b) { - replicate = b; - } - - /** - *

isReplicate.

- * - * @return a boolean. - */ - public boolean isReplicate() { - return replicate; - } - - /** - *

setIsXCost.

- * - * @param b a boolean. - */ - public void setIsXCost(boolean b) { - xCost = b; - } - - /** - *

isXCost.

- * - * @return a boolean. - */ - public boolean isXCost() { - return xCost; - } - - /** - *

setIsCycling.

- * - * @param b a boolean. - */ - public void setIsCycling(boolean b) { - cycling = b; - } - - /** - *

isCycling.

- * - * @return a boolean. - */ - public boolean isCycling() { - return cycling; - } - - /** - *

Setter for the field sourceCard.

- * - * @param c a {@link forge.Card} object. - */ - public void setSourceCard(Card c) { - sourceCard = c; - } - - /** - *

Getter for the field sourceCard.

- * - * @return a {@link forge.Card} object. - */ - public Card getSourceCard() { - return sourceCard; - } - - /** - *

Getter for the field beforePayManaAI.

- * - * @return a {@link forge.Command} object. - */ - public Command getBeforePayManaAI() { - return beforePayManaAI; - } - - /** - *

Setter for the field beforePayManaAI.

- * - * @param c a {@link forge.Command} object. - */ - public void setBeforePayManaAI(Command c) { - beforePayManaAI = c; - } - - //begin - Input methods - /** - *

Getter for the field beforePayMana.

- * - * @return a {@link forge.gui.input.Input} object. - */ - public Input getBeforePayMana() { - return beforePayMana; - } - - /** - *

Setter for the field beforePayMana.

- * - * @param in a {@link forge.gui.input.Input} object. - */ - public void setBeforePayMana(Input in) { - beforePayMana = in; - } - - /** - *

Getter for the field afterPayMana.

- * - * @return a {@link forge.gui.input.Input} object. - */ - public Input getAfterPayMana() { - return afterPayMana; - } - - /** - *

Setter for the field afterPayMana.

- * - * @param in a {@link forge.gui.input.Input} object. - */ - public void setAfterPayMana(Input in) { - afterPayMana = in; - } - - /** - *

Getter for the field payCosts.

- * - * @return a {@link forge.card.spellability.Cost} object. - */ - public Cost getPayCosts() { - return payCosts; - } - - /** - *

Setter for the field payCosts.

- * - * @param abCost a {@link forge.card.spellability.Cost} object. - */ - public void setPayCosts(Cost abCost) { - payCosts = abCost; - } - - /** - *

getTarget.

- * - * @return a {@link forge.card.spellability.Target} object. - */ - public Target getTarget() { - return chosenTarget; - } - - /** - *

setTarget.

- * - * @param tgt a {@link forge.card.spellability.Target} object. - */ - public void setTarget(Target tgt) { - chosenTarget = tgt; - } - - /** - *

Setter for the field restrictions.

- * - * @param restrict a {@link forge.card.spellability.SpellAbility_Restriction} object. - */ - public void setRestrictions(SpellAbility_Restriction restrict) { - restrictions = restrict; - } - - /** - *

Getter for the field restrictions.

- * - * @return a {@link forge.card.spellability.SpellAbility_Restriction} object. - */ - public SpellAbility_Restriction getRestrictions() { - return restrictions; - } - - /** - *

Shortcut to see how many activations there were.

- */ - public int getActivationsThisTurn(){ - return restrictions.getNumberTurnActivations(); - } - - - /** - *

Setter for the field conditions.

- * - * @param condition a {@link forge.card.spellability.SpellAbility_Condition} object. - * @since 1.0.15 - */ - public void setConditions(SpellAbility_Condition condition) { - conditions = condition; - } - - /** - *

Getter for the field conditions.

- * - * @return a {@link forge.card.spellability.SpellAbility_Condition} object. - * @since 1.0.15 - */ - public SpellAbility_Condition getConditions() { - return conditions; - } - - /** - *

Setter for the field abilityFactory.

- * - * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. - */ - public void setAbilityFactory(AbilityFactory af) { - abilityFactory = af; - } - - /** - *

Getter for the field abilityFactory.

- * - * @return a {@link forge.card.abilityFactory.AbilityFactory} object. - */ - public AbilityFactory getAbilityFactory() { - return abilityFactory; - } - - /** - *

Getter for the field payingMana.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getPayingMana() { - return payingMana; - } - - /** - *

getPayingManaAbilities.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getPayingManaAbilities() { - return paidAbilities; - } - - // Combined PaidLists - /** - *

setPaidHash.

- * - * @param hash a {@link java.util.HashMap} object. - */ - public void setPaidHash(HashMap hash) { - paidLists = hash; - } - - /** - *

getPaidHash.

- * - * @return a {@link java.util.HashMap} object. - */ - public HashMap getPaidHash() { - return paidLists; - } - - // Paid List are for things ca - /** - *

setPaidList.

- * - * @param list a {@link forge.CardList} object. - * @param str a {@link java.lang.String} object. - */ - public void setPaidList(CardList list, String str) { - paidLists.put(str, list); - } - - /** - *

getPaidList.

- * - * @param str a {@link java.lang.String} object. - * @return a {@link forge.CardList} object. - */ - public CardList getPaidList(String str) { - return paidLists.get(str); - } - - /** - *

addCostToHashList.

- * - * @param c a {@link forge.Card} object. - * @param str a {@link java.lang.String} object. - */ - public void addCostToHashList(Card c, String str) { - if (!paidLists.containsKey(str)) - paidLists.put(str, new CardList()); - - paidLists.get(str).add(c); - } - - /** - *

resetPaidHash.

- */ - public void resetPaidHash() { - paidLists = new HashMap(); - } - - /** - *

Getter for the field triggeringObjects.

- * - * @return a {@link java.util.HashMap} object. - * @since 1.0.15 - */ - public HashMap getTriggeringObjects() { - return triggeringObjects; - } - - /** - *

setAllTriggeringObjects.

- * - * @param triggeredObjects a {@link java.util.HashMap} object. - * @since 1.0.15 - */ - public void setAllTriggeringObjects(HashMap triggeredObjects) { - this.triggeringObjects = triggeredObjects; - } - - /** - *

setTriggeringObject.

- * - * @param type a {@link java.lang.String} object. - * @param o a {@link java.lang.Object} object. - * @since 1.0.15 - */ - public void setTriggeringObject(String type, Object o) { - this.triggeringObjects.put(type, o); - } - - /** - *

getTriggeringObject.

- * - * @param type a {@link java.lang.String} object. - * @return a {@link java.lang.Object} object. - * @since 1.0.15 - */ - public Object getTriggeringObject(String type) { - return triggeringObjects.get(type); - } - - /** - *

hasTriggeringObject.

- * - * @param type a {@link java.lang.String} object. - * @return a boolean. - * @since 1.0.15 - */ - public boolean hasTriggeringObject(String type) { - return triggeringObjects.containsKey(type); - } - - /** - *

resetTriggeringObjects.

- * - * @since 1.0.15 - */ - public void resetTriggeringObjects() { - triggeringObjects = new HashMap(); - } - - /** - *

resetOnceResolved.

- */ - public void resetOnceResolved() { - resetPaidHash(); - - if (chosenTarget != null) - chosenTarget.resetTargets(); - - resetTriggeringObjects(); - } - - /** - *

Getter for the field afterResolve.

- * - * @return a {@link forge.gui.input.Input} object. - */ - public Input getAfterResolve() { - return afterResolve; - } - - /** - *

Setter for the field afterResolve.

- * - * @param in a {@link forge.gui.input.Input} object. - */ - public void setAfterResolve(Input in) { - afterResolve = in; - } - - /** - *

Setter for the field stackDescription.

- * - * @param s a {@link java.lang.String} object. - */ - public void setStackDescription(String s) { - stackDescription = s; - if (description == "" && sourceCard.getText().equals("")) - description = s; - } - - /** - *

Getter for the field stackDescription.

- * - * @return a {@link java.lang.String} object. - */ - public String getStackDescription() { - if (stackDescription.equals(getSourceCard().getText().trim())) return getSourceCard().getName() + " - " - + getSourceCard().getText(); - - return stackDescription.replaceAll("CARDNAME", this.getSourceCard().getName()); - } - - /** - *

isIntrinsic.

- * - * @return a boolean. - */ - public boolean isIntrinsic() { - return type.equals("Intrinsic"); - } - - /** - *

isExtrinsic.

- * - * @return a boolean. - */ - public boolean isExtrinsic() { - return type.equals("Extrinsic"); - } - - /** - *

Setter for the field type.

- * - * @param s a {@link java.lang.String} object. - */ - public void setType(String s) //Extrinsic or Intrinsic: - { - type = s; - } - - /** - *

Getter for the field type.

- * - * @return a {@link java.lang.String} object. - */ - public String getType() //Extrinsic or Intrinsic: - { - return type; - } - - //setDescription() includes mana cost and everything like - //"G, tap: put target creature from your hand onto the battlefield" - /** - *

Setter for the field description.

- * - * @param s a {@link java.lang.String} object. - */ - public void setDescription(String s) { - description = s; - } - - /** - *

Getter for the field description.

- * - * @return a {@link java.lang.String} object. - */ - public String getDescription() { - return description; - } - - /** {@inheritDoc} */ - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - SpellAbility node = this; - - while (node != null) { - if (node != this) - sb.append(" "); - - sb.append(node.getDescription().replace("CARDNAME", node.getSourceCard().getName())); - node = node.getSubAbility(); - - } - return sb.toString(); - } - - /** - *

Setter for the field subAbility.

- * - * @param subAbility a {@link forge.card.spellability.Ability_Sub} object. - */ - public void setSubAbility(Ability_Sub subAbility) { - this.subAbility = subAbility; - if (subAbility != null) - subAbility.setParent(this); - } - - /** - *

Getter for the field subAbility.

- * - * @return a {@link forge.card.spellability.Ability_Sub} object. - */ - public Ability_Sub getSubAbility() { - return this.subAbility; - } - - /** - *

Getter for the field targetCard.

- * - * @return a {@link forge.Card} object. - */ - public Card getTargetCard() { - if (targetCard == null) { - Target tgt = this.getTarget(); - if (tgt != null) { - ArrayList list = tgt.getTargetCards(); - - if (!list.isEmpty()) - return list.get(0); - } - return null; - } - - return targetCard; - } - - /** - *

Setter for the field targetCard.

- * - * @param card a {@link forge.Card} object. - */ - public void setTargetCard(Card card) { - if (card == null) { - System.out.println(getSourceCard() + " - SpellAbility.setTargetCard() called with null for target card."); - return; - } - - Target tgt = this.getTarget(); - if (tgt != null) { - tgt.addTarget(card); - } else { - targetPlayer = null;//reset setTargetPlayer() - targetCard = card; - } - String desc = ""; - if (null != card) { - if (!card.isFaceDown()) desc = getSourceCard().getName() + " - targeting " + card; - else desc = getSourceCard().getName() + " - targeting Morph(" + card.getUniqueNumber() + ")"; - setStackDescription(desc); - } - } - - /** - *

Getter for the field targetList.

- * - * @return a {@link forge.CardList} object. - */ - public CardList getTargetList() { - return targetList; - } - - /** - *

Setter for the field targetList.

- * - * @param list a {@link forge.CardList} object. - */ - public void setTargetList(CardList list) { - // The line below started to create a null error at forge.CardFactoryUtil.canTarget(CardFactoryUtil.java:3329) - // after ForgeSVN r2699. I hope that commenting out the line below will not result in other bugs. :) - // targetPlayer = null;//reset setTargetPlayer() - - targetList = list; - StringBuilder sb = new StringBuilder(); - sb.append(getSourceCard().getName()).append(" - targeting "); - for (int i = 0; i < targetList.size(); i++) { - - if (!targetList.get(i).isFaceDown()) sb.append(targetList.get(i)); - else sb.append("Morph(").append(targetList.get(i).getUniqueNumber()).append(")"); - - if (i < targetList.size() - 1) sb.append(", "); - } - setStackDescription(sb.toString()); - } - - /** - *

Setter for the field targetPlayer.

- * - * @param p a {@link forge.Player} object. - */ - public void setTargetPlayer(Player p) { - if (p == null || (!(p.isHuman() || p.isComputer()))) throw new RuntimeException( - "SpellAbility : setTargetPlayer() error, argument is " + p + " source card is " + getSourceCard()); - - Target tgt = this.getTarget(); - if (tgt != null) { - tgt.addTarget(p); - } else { - targetCard = null;//reset setTargetCard() - targetPlayer = p; - } - setStackDescription(getSourceCard().getName() + " - targeting " + p); - } - - /** - *

Getter for the field targetPlayer.

- * - * @return a {@link forge.Player} object. - */ - public Player getTargetPlayer() { - if (targetPlayer == null) { - Target tgt = this.getTarget(); - if (tgt != null) { - ArrayList list = tgt.getTargetPlayers(); - - if (!list.isEmpty()) - return list.get(0); - } - return null; - } - return targetPlayer; - } - - /** - *

Getter for the field cancelCommand.

- * - * @return a {@link forge.Command} object. - */ - public Command getCancelCommand() { - return cancelCommand; - } - - /** - *

Setter for the field cancelCommand.

- * - * @param cancelCommand a {@link forge.Command} object. - */ - public void setCancelCommand(Command cancelCommand) { - this.cancelCommand = cancelCommand; - } - - /** - *

Setter for the field flashBackAbility.

- * - * @param flashBackAbility a boolean. - */ - public void setFlashBackAbility(boolean flashBackAbility) { - this.flashBackAbility = flashBackAbility; - } - - /** - *

isFlashBackAbility.

- * - * @return a boolean. - */ - public boolean isFlashBackAbility() { - return flashBackAbility; - } - - /** - *

Setter for the field kickerAbility.

- * - * @param kab a boolean. - */ - public void setKickerAbility(boolean kab) { - this.kickerAbility = kab; - } - - /** - *

isKickerAbility.

- * - * @return a boolean. - */ - public boolean isKickerAbility() { - return kickerAbility; - } - - // Only used by Ability_Reflected_Mana, because the user has an option to cancel the input. - // Most spell abilities and even most mana abilities do not need to use this. - /** - *

wasCancelled.

- * - * @return a boolean. - */ - public boolean wasCancelled() { - return false; - } - - /** - *

copy.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility copy() { - SpellAbility clone = null; - try { - clone = (SpellAbility) this.clone(); - } catch (CloneNotSupportedException e) { - System.err.println(e); - } - return clone; - } - - /** - *

Setter for the field kothThirdAbility.

- * - * @param kothThirdAbility a boolean. - */ - public void setKothThirdAbility(boolean kothThirdAbility) { - this.kothThirdAbility = kothThirdAbility; - } - - /** - *

isKothThirdAbility.

- * - * @return a boolean. - */ - public boolean isKothThirdAbility() { - return kothThirdAbility; - } - - /** - *

Setter for the field trigger.

- * - * @param trigger a boolean. - */ - public void setTrigger(boolean trigger) { - this.trigger = trigger; - } - - /** - *

isTrigger.

- * - * @return a boolean. - */ - public boolean isTrigger() { - return trigger; - } - - /** - *

setSourceTrigger.

- * - * @param ID a int. - */ - public void setSourceTrigger(int ID) { - sourceTrigger = ID; - } - - /** - *

getSourceTrigger.

- * - * @return a int. - */ - public int getSourceTrigger() { - return sourceTrigger; - } - - /** - *

Setter for the field mandatory.

- * - * @param mand a boolean. - */ - public void setMandatory(boolean mand) { - this.mandatory = mand; - } - - /** - *

isMandatory.

- * - * @return a boolean. - */ - public boolean isMandatory() { - return mandatory; - } - - /** - *

getRootSpellAbility.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - * @since 1.0.15 - */ - public SpellAbility getRootSpellAbility() { - if (this instanceof Ability_Sub) { - SpellAbility parent = ((Ability_Sub) this).getParent(); - if (parent != null) - return parent.getRootSpellAbility(); - } - - return this; - } - - /** - *

getAllTargetChoices.

- * - * @return a {@link java.util.ArrayList} object. - * @since 1.0.15 - */ - public ArrayList getAllTargetChoices() { - ArrayList res = new ArrayList(); - - SpellAbility sa = getRootSpellAbility(); - if (sa.getTarget() != null) - res.add(sa.getTarget().getTargetChoices()); - while (sa.getSubAbility() != null) { - sa = sa.getSubAbility(); - - if (sa.getTarget() != null) - res.add(sa.getTarget().getTargetChoices()); - } - - return res; - } - - //is this a wrapping ability (used by trigger abilities) - /** - *

isWrapper.

- * - * @return a boolean. - * @since 1.0.15 - */ - public boolean isWrapper() { - return false; - } - -} diff --git a/src/forge/card/spellability/SpellAbilityList.java b/src/forge/card/spellability/SpellAbilityList.java deleted file mode 100644 index 0f0b690c5c1..00000000000 --- a/src/forge/card/spellability/SpellAbilityList.java +++ /dev/null @@ -1,123 +0,0 @@ -package forge.card.spellability; - - -import forge.ComputerUtil; - -import java.util.ArrayList; - - -/** - *

SpellAbilityList class.

- * - * @author Forge - * @version $Id: $ - */ -public class SpellAbilityList { - private ArrayList list = new ArrayList(); - - /** - *

Constructor for SpellAbilityList.

- */ - public SpellAbilityList() { - } - - /** - *

Constructor for SpellAbilityList.

- * - * @param s a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbilityList(SpellAbility s) { - add(s); - } - - /** - *

Constructor for SpellAbilityList.

- * - * @param s an array of {@link forge.card.spellability.SpellAbility} objects. - */ - public SpellAbilityList(SpellAbility[] s) { - for (int i = 0; i < s.length; i++) - add(s[i]); - } - - /** - *

remove.

- * - * @param n a int. - */ - public void remove(int n) { - list.remove(n); - } - - /** - *

add.

- * - * @param s a {@link forge.card.spellability.SpellAbility} object. - */ - public void add(SpellAbility s) { - list.add(s); - } - - /** - *

size.

- * - * @return a int. - */ - public int size() { - return list.size(); - } - - /** - *

get.

- * - * @param n a int. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility get(int n) { - return list.get(n); - } - - /** - *

addAll.

- * - * @param s a {@link forge.card.spellability.SpellAbilityList} object. - */ - public void addAll(SpellAbilityList s) { - for (int i = 0; i < s.size(); i++) - add(s.get(i)); - } - - //Move1.getMax() uses this - /** - *

execute.

- */ - public void execute() { - for (int i = 0; i < size(); i++) { - if (!ComputerUtil.canPayCost(get(i))) throw new RuntimeException( - "SpellAbilityList : execute() error, cannot pay for the spell " + get(i).getSourceCard() - + " - " + get(i).getStackDescription()); - - ComputerUtil.playNoStack(get(i)); - } - }//execute() - - /** {@inheritDoc} */ - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < size(); i++) { - sb.append(get(i).getSourceCard().toString()); - sb.append(" - "); - sb.append(get(i).getStackDescription()); - sb.append("\r\n"); - } - return sb.toString(); - }//toString() - - /** {@inheritDoc} */ - @Override - public boolean equals(Object o) { - if (o == null) return false; - return toString().equals(o.toString()); - } -} diff --git a/src/forge/card/spellability/SpellAbility_Condition.java b/src/forge/card/spellability/SpellAbility_Condition.java deleted file mode 100644 index 06e88459cb1..00000000000 --- a/src/forge/card/spellability/SpellAbility_Condition.java +++ /dev/null @@ -1,245 +0,0 @@ -package forge.card.spellability; - - -import forge.*; -import forge.card.abilityFactory.AbilityFactory; -import forge.card.cardFactory.CardFactoryUtil; - -import java.util.HashMap; - -/** - *

SpellAbility_Condition class.

- * - * @author Forge - * @version $Id: $ - * @since 1.0.15 - */ -public class SpellAbility_Condition extends SpellAbility_Variables { - // A class for handling SpellAbility Conditions. These restrictions include: - // Zone, Phase, OwnTurn, Speed (instant/sorcery), Amount per Turn, Player, - // Threshold, Metalcraft, LevelRange, etc - // Each value will have a default, that can be overridden (mostly by AbilityFactory) - // The CanPlay function will use these values to determine if the current game state is ok with these restrictions - - /** - *

Constructor for SpellAbility_Condition.

- */ - public SpellAbility_Condition() { - } - - /** - *

setConditions.

- * - * @param params a {@link java.util.HashMap} object. - */ - public void setConditions(HashMap params) { - if (params.containsKey("Condition")) { - String value = params.get("Condition"); - if (value.equals("Threshold")) setThreshold(true); - if (value.equals("Metalcraft")) setMetalcraft(true); - if (value.equals("Hellbent")) setHellbent(true); - } - - if (params.containsKey("ConditionZone")) - setZone(params.get("ContitionZone")); - - if (params.containsKey("ConditionSorcerySpeed")) - setSorcerySpeed(true); - - if (params.containsKey("ConditionPlayerTurn")) - setPlayerTurn(true); - - if (params.containsKey("ConditionOpponentTurn")) - setOpponentTurn(true); - - if (params.containsKey("ConditionPhases")) { - String phases = params.get("ConditionPhases"); - - if (phases.contains("->")) { - // If phases lists a Range, split and Build Activate String - // Combat_Begin->Combat_End (During Combat) - // Draw-> (After Upkeep) - // Upkeep->Combat_Begin (Before Declare Attackers) - - String[] split = phases.split("->", 2); - phases = AllZone.getPhase().buildActivateString(split[0], split[1]); - } - - setPhases(phases); - } - - if (params.containsKey("ConditionCardsInHand")) - setActivateCardsInHand(Integer.parseInt(params.get("ConditionCardsInHand"))); - - //Condition version of IsPresent stuff - if (params.containsKey("ConditionPresent")) { - setIsPresent(params.get("ConditionPresent")); - if (params.containsKey("ConditionCompare")) - setPresentCompare(params.get("ConditionCompare")); - } - - if (params.containsKey("ConditionDefined")) { - setPresentDefined(params.get("ConditionDefined")); - } - - if (params.containsKey("ConditionNotPresent")) { - setIsPresent(params.get("ConditionNotPresent")); - setPresentCompare("EQ0"); - } - - //basically PresentCompare for life totals: - if (params.containsKey("ConditionLifeTotal")) { - lifeTotal = params.get("ConditionLifeTotal"); - if (params.containsKey("ConditionLifeAmount")) { - lifeAmount = params.get("ConditionLifeAmount"); - } - } - - if(params.containsKey("ConditionManaSpent")) { - setManaSpent(params.get("ConditionManaSpent")); - } - }//setConditions - - /** - *

checkConditions.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - public boolean checkConditions(SpellAbility sa) { - - Player activator = sa.getActivatingPlayer(); - if (activator == null) { - activator = sa.getSourceCard().getController(); - System.out.println(sa.getSourceCard().getName() + " Did not have activator set in SpellAbility_Condition.checkConditions()"); - } - - if (hellbent) { - if (!activator.hasHellbent()) - return false; - } - if (threshold) { - if (!activator.hasThreshold()) - return false; - } - if (metalcraft) { - if (!activator.hasMetalcraft()) - return false; - } - - if (bSorcerySpeed && !Phase.canCastSorcery(activator)) - return false; - - if (bPlayerTurn && !AllZone.getPhase().isPlayerTurn(activator)) - return false; - - if (bOpponentTurn && AllZone.getPhase().isPlayerTurn(activator)) - return false; - - if (activationLimit != -1 && numberTurnActivations >= activationLimit) - return false; - - if (phases.size() > 0) { - boolean isPhase = false; - String currPhase = AllZone.getPhase().getPhase(); - for (String s : phases) { - if (s.equals(currPhase)) { - isPhase = true; - break; - } - } - - if (!isPhase) - return false; - } - - if (nCardsInHand != -1) { - // Can handle Library of Alexandria, or Hellbent - if (AllZoneUtil.getPlayerHand(activator).size() != nCardsInHand) - return false; - } - - if (sIsPresent != null) { - CardList list = AllZoneUtil.getCardsInPlay(); - - list = list.getValidCards(sIsPresent.split(","), sa.getActivatingPlayer(), sa.getSourceCard()); - - int right = 1; - String rightString = presentCompare.substring(2); - if (rightString.equals("X")) { - right = CardFactoryUtil.xCount(sa.getSourceCard(), sa.getSourceCard().getSVar("X")); - } else { - right = Integer.parseInt(presentCompare.substring(2)); - } - int left = list.size(); - - if (!AllZoneUtil.compare(left, presentCompare, right)) - return false; - } - - if (presentDefined != null) { - CardList list = new CardList(AbilityFactory.getDefinedCards(sa.getSourceCard(), presentDefined, sa)); - - list = list.getValidCards(sIsPresent.split(","), sa.getActivatingPlayer(), sa.getSourceCard()); - - int right; - String rightString = presentCompare.substring(2); - try { // If this is an Integer, just parse it - right = Integer.parseInt(rightString); - } catch (NumberFormatException e) { // Otherwise, grab it from the SVar - right = CardFactoryUtil.xCount(sa.getSourceCard(), sa.getSourceCard().getSVar(rightString)); - } - - int left = list.size(); - - return AllZoneUtil.compare(left, presentCompare, right); - } else if (sIsPresent != null) { - CardList list = AllZoneUtil.getCardsInPlay(); - - list = list.getValidCards(sIsPresent.split(","), activator, sa.getSourceCard()); - - int right = 1; - String rightString = presentCompare.substring(2); - if (rightString.equals("X")) { - right = CardFactoryUtil.xCount(sa.getSourceCard(), sa.getSourceCard().getSVar("X")); - } else { - right = Integer.parseInt(presentCompare.substring(2)); - } - int left = list.size(); - - if (!AllZoneUtil.compare(left, presentCompare, right)) - return false; - } - - if (lifeTotal != null) { - int life = 1; - if (lifeTotal.equals("You")) { - life = activator.getLife(); - } - if (lifeTotal.equals("Opponent")) { - life = activator.getOpponent().getLife(); - } - - int right = 1; - String rightString = lifeAmount.substring(2); - if (rightString.equals("X")) { - right = CardFactoryUtil.xCount(sa.getSourceCard(), sa.getSourceCard().getSVar("X")); - } else { - right = Integer.parseInt(lifeAmount.substring(2)); - } - - if (!AllZoneUtil.compare(life, lifeAmount, right)) { - return false; - } - } - - if(null != manaSpent) { - if(!sa.getSourceCard().getColorsPaid().contains(manaSpent)) { - return false; - } - } - - return true; - } - -}//end class SpellAbility_Condition diff --git a/src/forge/card/spellability/SpellAbility_Requirements.java b/src/forge/card/spellability/SpellAbility_Requirements.java deleted file mode 100644 index 4d77dba4828..00000000000 --- a/src/forge/card/spellability/SpellAbility_Requirements.java +++ /dev/null @@ -1,180 +0,0 @@ -package forge.card.spellability; - -import forge.AllZone; -import forge.Card; -import forge.PlayerZone; -import forge.card.abilityFactory.AbilityFactory; - -import java.util.ArrayList; - -/** - *

SpellAbility_Requirements class.

- * - * @author Forge - * @version $Id: $ - */ -public class SpellAbility_Requirements { - private SpellAbility ability = null; - private Target_Selection select = null; - private Cost_Payment payment = null; - private boolean isFree = false; - private boolean skipStack = false; - - /** - *

Setter for the field skipStack.

- * - * @param bSkip a boolean. - */ - public void setSkipStack(boolean bSkip) { - skipStack = bSkip; - } - - /** - *

setFree.

- * - * @param bFree a boolean. - */ - public void setFree(boolean bFree) { - isFree = bFree; - } - - private PlayerZone fromZone = null; - private boolean bCasting = false; - - /** - *

Constructor for SpellAbility_Requirements.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param ts a {@link forge.card.spellability.Target_Selection} object. - * @param cp a {@link forge.card.spellability.Cost_Payment} object. - */ - public SpellAbility_Requirements(SpellAbility sa, Target_Selection ts, Cost_Payment cp) { - ability = sa; - select = ts; - payment = cp; - } - - /** - *

fillRequirements.

- */ - public void fillRequirements() { - fillRequirements(false); - } - - /** - *

fillRequirements.

- * - * @param skipTargeting a boolean. - */ - public void fillRequirements(boolean skipTargeting) { - if (ability instanceof Spell && !bCasting) { - // remove from hand - bCasting = true; - if (!ability.getSourceCard().isCopiedSpell()) { - Card c = ability.getSourceCard(); - - fromZone = AllZone.getZone(c); - AllZone.getGameAction().moveToStack(c); - } - } - - // freeze Stack. No abilities should go onto the stack while I'm filling requirements. - AllZone.getStack().freezeStack(); - - // Skip to paying if parent ability doesn't target and has no subAbilities. (or trigger case where its already targeted) - if (!skipTargeting && (select.doesTarget() || ability.getSubAbility() != null)) { - select.setRequirements(this); - select.resetTargets(); - select.chooseTargets(); - } else - needPayment(); - } - - /** - *

finishedTargeting.

- */ - public void finishedTargeting() { - if (select.isCanceled()) { - // cancel ability during target choosing - Card c = ability.getSourceCard(); - if (bCasting && !c.isCopiedSpell()) { // and not a copy - // add back to where it came from - AllZone.getGameAction().moveTo(fromZone, c); - } - - select.resetTargets(); - AllZone.getStack().clearFrozen(); - return; - } else - needPayment(); - } - - /** - *

needPayment.

- */ - public void needPayment() { - if (!isFree) - startPaying(); - else - finishPaying(); - } - - /** - *

startPaying.

- */ - public void startPaying() { - payment.setRequirements(this); - payment.payCost(); - } - - /** - *

finishPaying.

- */ - public void finishPaying() { - if (isFree || payment.isAllPaid()) { - if (skipStack) - AbilityFactory.resolve(ability, false); - else - addAbilityToStack(); - - select.resetTargets(); - AllZone.getGameAction().checkStateEffects(); - } else if (payment.isCanceled()) { - Card c = ability.getSourceCard(); - if (bCasting && !c.isCopiedSpell()) { // and not a copy - // add back to Previous Zone - AllZone.getGameAction().moveTo(fromZone, c); - } - - if (select != null) - select.resetTargets(); - - payment.cancelPayment(); - AllZone.getStack().clearFrozen(); - } - } - - /** - *

addAbilityToStack.

- */ - public void addAbilityToStack() { - // For older abilities that don't setStackDescription set it here - if (ability.getStackDescription().equals("")) { - StringBuilder sb = new StringBuilder(); - sb.append(ability.getSourceCard().getName()); - if (ability.getTarget() != null) { - ArrayList targets = ability.getTarget().getTargets(); - if (targets.size() > 0) { - sb.append(" - Targeting "); - for (Object o : targets) - sb.append(o.toString()).append(" "); - } - } - - ability.setStackDescription(sb.toString()); - } - - AllZone.getManaPool().clearPay(ability, false); - AllZone.getStack().addAndUnfreeze(ability); - } -} diff --git a/src/forge/card/spellability/SpellAbility_Restriction.java b/src/forge/card/spellability/SpellAbility_Restriction.java deleted file mode 100644 index 77cb3ff8747..00000000000 --- a/src/forge/card/spellability/SpellAbility_Restriction.java +++ /dev/null @@ -1,249 +0,0 @@ -package forge.card.spellability; - - -import forge.*; -import forge.card.abilityFactory.AbilityFactory; -import forge.card.cardFactory.CardFactoryUtil; - -import java.util.HashMap; - -/** - *

SpellAbility_Restriction class.

- * - * @author Forge - * @version $Id: $ - */ -public class SpellAbility_Restriction extends SpellAbility_Variables { - // A class for handling SpellAbility Restrictions. These restrictions include: - // Zone, Phase, OwnTurn, Speed (instant/sorcery), Amount per Turn, Player, - // Threshold, Metalcraft, LevelRange, etc - // Each value will have a default, that can be overridden (mostly by AbilityFactory) - // The canPlay function will use these values to determine if the current game state is ok with these restrictions - - - /** - *

Constructor for SpellAbility_Restriction.

- */ - public SpellAbility_Restriction() { - } - - /** - *

setRestrictions.

- * - * @param params a {@link java.util.HashMap} object. - * @since 1.0.15 - */ - public void setRestrictions(HashMap params) { - if (params.containsKey("Activation")) { - String value = params.get("Activation"); - if (value.equals("Threshold")) setThreshold(true); - if (value.equals("Metalcraft")) setMetalcraft(true); - if (value.equals("Hellbent")) setHellbent(true); - } - - if (params.containsKey("ActivationZone")) - setZone(params.get("ActivationZone")); - - if (params.containsKey("Flashback")) { - setZone("Graveyard"); - } - - if (params.containsKey("SorcerySpeed")) - setSorcerySpeed(true); - - if (params.containsKey("PlayerTurn")) - setPlayerTurn(true); - - if (params.containsKey("OpponentTurn")) - setOpponentTurn(true); - - if (params.containsKey("AnyPlayer")) - setAnyPlayer(true); - - if (params.containsKey("ActivationLimit")) - setActivationLimit(Integer.parseInt(params.get("ActivationLimit"))); - - if (params.containsKey("ActivationNumberSacrifice")) - setActivationNumberSacrifice(Integer.parseInt(params.get("ActivationNumberSacrifice"))); - - if (params.containsKey("ActivationPhases")) { - String phases = params.get("ActivationPhases"); - - if (phases.contains("->")) { - // If phases lists a Range, split and Build Activate String - // Combat_Begin->Combat_End (During Combat) - // Draw-> (After Upkeep) - // Upkeep->Combat_Begin (Before Declare Attackers) - - String[] split = phases.split("->", 2); - phases = AllZone.getPhase().buildActivateString(split[0], split[1]); - } - - setPhases(phases); - } - - if (params.containsKey("ActivationCardsInHand")) - setActivateCardsInHand(Integer.parseInt(params.get("ActivationCardsInHand"))); - - if (params.containsKey("Planeswalker")) - setPlaneswalker(true); - - if (params.containsKey("IsPresent")) { - setIsPresent(params.get("IsPresent")); - if (params.containsKey("PresentCompare")) - setPresentCompare(params.get("PresentCompare")); - if (params.containsKey("PresentZone")) - setPresentZone(params.get("PresentZone")); - } - - if (params.containsKey("IsNotPresent")) { - setIsPresent(params.get("IsNotPresent")); - setPresentCompare("EQ0"); - } - - //basically PresentCompare for life totals: - if (params.containsKey("ActivationLifeTotal")) { - lifeTotal = params.get("ActivationLifeTotal"); - if (params.containsKey("ActivationLifeAmount")) { - lifeAmount = params.get("ActivationLifeAmount"); - } - } - - if (params.containsKey("CheckSVar")) { - setSvarToCheck(params.get("CheckSVar")); - } - if (params.containsKey("SVarCompare")) { - setSvarOperator(params.get("SVarCompare").substring(0, 2)); - setSvarOperand(params.get("SVarCompare").substring(2)); - } - }//end setRestrictions() - - /** - *

canPlay.

- * - * @param c a {@link forge.Card} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - public boolean canPlay(Card c, SpellAbility sa) { - if (!AllZone.getZone(c).is(zone)) - return false; - - Player activator = sa.getActivatingPlayer(); - if (activator == null) { - activator = c.getController(); - System.out.println(c.getName() + " Did not have activator set in SpellAbility_Restriction.canPlay()"); - } - - if (bSorcerySpeed && !Phase.canCastSorcery(activator)) - return false; - - if (bPlayerTurn && !AllZone.getPhase().isPlayerTurn(activator)) - return false; - - if (bOpponentTurn && AllZone.getPhase().isPlayerTurn(activator)) - return false; - - if (!bAnyPlayer && !activator.equals(c.getController())) - return false; - - if (activationLimit != -1 && numberTurnActivations >= activationLimit) - return false; - - if (phases.size() > 0) { - boolean isPhase = false; - String currPhase = AllZone.getPhase().getPhase(); - for (String s : phases) { - if (s.equals(currPhase)) { - isPhase = true; - break; - } - } - - if (!isPhase) - return false; - } - - if (nCardsInHand != -1) { - if (AllZoneUtil.getPlayerHand(activator).size() != nCardsInHand) - return false; - } - if (hellbent) { - if (!activator.hasHellbent()) - return false; - } - if (threshold) { - if (!activator.hasThreshold()) - return false; - } - if (metalcraft) { - if (!activator.hasMetalcraft()) - return false; - } - - if (sIsPresent != null) { - CardList list = AllZoneUtil.getCardsInZone(presentZone); - - list = list.getValidCards(sIsPresent.split(","), activator, c); - - int right = 1; - String rightString = presentCompare.substring(2); - if (rightString.equals("X")) { - right = CardFactoryUtil.xCount(c, c.getSVar("X")); - } else { - right = Integer.parseInt(presentCompare.substring(2)); - } - int left = list.size(); - - if (!AllZoneUtil.compare(left, presentCompare, right)) - return false; - } - - if (lifeTotal != null) { - int life = 1; - if (lifeTotal.equals("You")) { - life = activator.getLife(); - } - if (lifeTotal.equals("Opponent")) { - life = activator.getOpponent().getLife(); - } - - int right = 1; - String rightString = lifeAmount.substring(2); - if (rightString.equals("X")) { - right = CardFactoryUtil.xCount(sa.getSourceCard(), sa.getSourceCard().getSVar("X")); - } else { - right = Integer.parseInt(lifeAmount.substring(2)); - } - - if (!AllZoneUtil.compare(life, lifeAmount, right)) { - return false; - } - } - - if (pwAbility) { - // Planeswalker abilities can only be activated as Sorceries - if (!Phase.canCastSorcery(activator)) - return false; - - for (SpellAbility pwAbs : c.getSpellAbility()) { - // check all abilities on card that have their planeswalker restriction set to confirm they haven't been activated - SpellAbility_Restriction restrict = pwAbs.getRestrictions(); - if (restrict.getPlaneswalker() && restrict.getNumberTurnActivations() > 0) - return false; - } - } - - if (svarToCheck != null) { - int svarValue = AbilityFactory.calculateAmount(c, svarToCheck, sa); - int operandValue = AbilityFactory.calculateAmount(c, svarOperand, sa); - - if (!AllZoneUtil.compare(svarValue, svarOperator, operandValue)) - return false; - - } - - return true; - }//canPlay() - -}//end class SpellAbility_Restriction diff --git a/src/forge/card/spellability/SpellAbility_StackInstance.java b/src/forge/card/spellability/SpellAbility_StackInstance.java deleted file mode 100644 index a6cd3b0ca92..00000000000 --- a/src/forge/card/spellability/SpellAbility_StackInstance.java +++ /dev/null @@ -1,171 +0,0 @@ -package forge.card.spellability; - -import forge.Card; -import forge.CardList; -import forge.Player; - -import java.util.HashMap; - -/** - *

SpellAbility_StackInstance class.

- * - * @author Forge - * @version $Id: $ - */ -public class SpellAbility_StackInstance { - // At some point I want this functioning more like Target/Target Choices where the SA has an "active" - // Stack Instance, and instead of having duplicate parameters, it adds changes directly to the "active" one - // When hitting the Stack, the active SI gets "applied" to the Stack and gets cleared from the base SI - // Coming off the Stack would work similarly, except it would just add the full active SI instead of each of the parts - SpellAbility ability = null; - SpellAbility_StackInstance subInstace = null; - - // When going to a SubAbility that SA has a Instance Choice object - Target_Choices tc = null; - Player activatingPlayer = null; - String activatedFrom = null; - - String stackDescription = null; - - // Adjusted Mana Cost - //private String adjustedManaCost = ""; - - // Paid Mana Cost - //private ArrayList payingMana = new ArrayList(); - //private ArrayList paidAbilities = new ArrayList(); - private int xManaPaid = 0; - - // Other Paid things - private HashMap paidHash = new HashMap(); - - // Additional info - // is Kicked, is Buyback - - - // Triggers - private HashMap triggeringObjects = new HashMap(); - - /** - *

Constructor for SpellAbility_StackInstance.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility_StackInstance(SpellAbility sa) { - // Base SA info - ability = sa; - stackDescription = ability.getStackDescription(); - activatingPlayer = sa.getActivatingPlayer(); - - // Payment info - paidHash = ability.getPaidHash(); - ability.resetPaidHash(); - - // TODO getXManaCostPaid should be on the SA, not the Card - xManaPaid = sa.getSourceCard().getXManaCostPaid(); - - // Triggering info - triggeringObjects = sa.getTriggeringObjects(); - - Ability_Sub subAb = ability.getSubAbility(); - if (subAb != null) - subInstace = new SpellAbility_StackInstance(subAb); - - // Targeting info -- 29/06/11 Moved to after taking care of SubAbilities because otherwise AF_DealDamage SubAbilities that use Defined$ Targeted breaks (since it's parents target is reset) - Target target = sa.getTarget(); - if (target != null) { - tc = target.getTargetChoices(); - ability.getTarget().resetTargets(); - } - } - - /** - *

getSpellAbility.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility getSpellAbility() { - if (ability.getTarget() != null) { - ability.getTarget().resetTargets(); - ability.getTarget().setTargetChoices(tc); - } - ability.setActivatingPlayer(activatingPlayer); - - // Saved sub-SA needs to be reset on the way out - if (this.subInstace != null) - ability.setSubAbility((Ability_Sub) this.subInstace.getSpellAbility()); - - // Set Cost specific things here - ability.setPaidHash(paidHash); - ability.getSourceCard().setXManaCostPaid(xManaPaid); - - // Triggered - ability.setAllTriggeringObjects(triggeringObjects); - - return ability; - } - - // A bit of SA shared abilities to restrict conflicts - /** - *

Getter for the field stackDescription.

- * - * @return a {@link java.lang.String} object. - */ - public String getStackDescription() { - return stackDescription; - } - - /** - *

getSourceCard.

- * - * @return a {@link forge.Card} object. - */ - public Card getSourceCard() { - return ability.getSourceCard(); - } - - /** - *

Getter for the field activatingPlayer.

- * - * @return a {@link forge.Player} object. - */ - public Player getActivatingPlayer() { - return activatingPlayer; - } - - /** - *

isSpell.

- * - * @return a boolean. - */ - public boolean isSpell() { - return ability.isSpell(); - } - - /** - *

isAbility.

- * - * @return a boolean. - */ - public boolean isAbility() { - return ability.isAbility(); - } - - /** - *

isTrigger.

- * - * @return a boolean. - */ - public boolean isTrigger() { - return ability.isTrigger(); - } - - /** - *

isStateTrigger.

- * - * @param ID a int. - * @return a boolean. - */ - public boolean isStateTrigger(int ID) { - return ability.getSourceTrigger() == ID; - } -} diff --git a/src/forge/card/spellability/SpellAbility_Variables.java b/src/forge/card/spellability/SpellAbility_Variables.java deleted file mode 100644 index 1c2299689df..00000000000 --- a/src/forge/card/spellability/SpellAbility_Variables.java +++ /dev/null @@ -1,349 +0,0 @@ -package forge.card.spellability; - - -import forge.Constant; - -import java.util.ArrayList; - -/** - *

SpellAbility_Variables class.

- * - * @author Forge - * @version $Id: $ - * @since 1.0.15 - */ -public class SpellAbility_Variables { - // A class for handling SpellAbility Variables. These restrictions include: - // Zone, Phase, OwnTurn, Speed (instant/sorcery), Amount per Turn, Player, - // Threshold, Metalcraft, Hellbent, LevelRange, etc - // Each value will have a default, that can be overridden (mostly by AbilityFactory) - - /** - *

Constructor for SpellAbility_Variables.

- */ - public SpellAbility_Variables() { - } - - // default values for Sorcery speed abilities - protected String zone = Constant.Zone.Battlefield; - protected ArrayList phases = new ArrayList(); - protected boolean bSorcerySpeed = false; - protected boolean bAnyPlayer = false; - protected boolean bOpponentTurn = false; - protected boolean bPlayerTurn = false; - - protected int activationLimit = -1; - protected int numberTurnActivations = 0; - protected int activationNumberSacrifice = -1; - - protected int nCardsInHand = -1; - protected boolean threshold = false; - protected boolean metalcraft = false; - protected boolean hellbent = false; - - protected String sIsPresent = null; - protected String presentCompare = "GE1"; // Default Compare to Greater or Equal to 1 - protected String presentDefined = null; - protected String presentZone = Constant.Zone.Battlefield; - - protected String svarToCheck = null; - protected String svarOperator = "GE"; - protected String svarOperand = "1"; - - protected String lifeTotal = null; - protected String lifeAmount = "GE1"; - - protected String manaSpent = ""; - - protected boolean pwAbility = false; - - /** - *

Setter for the field manaSpent.

- * - * @param s a {@link java.lang.String} object. - */ - public void setManaSpent(String s) { - manaSpent = s; - } - - /** - *

Getter for the field manaSpent.

- * - * @return a {@link java.lang.String} object. - */ - public String getManaSpent() { - return manaSpent; - } - - /** - *

Setter for the field zone.

- * - * @param zone a {@link java.lang.String} object. - */ - public void setZone(String zone) { - this.zone = zone; - } - - /** - *

Getter for the field zone.

- * - * @return a {@link java.lang.String} object. - */ - public String getZone() { - return zone; - } - - /** - *

setSorcerySpeed.

- * - * @param bSpeed a boolean. - */ - public void setSorcerySpeed(boolean bSpeed) { - bSorcerySpeed = bSpeed; - } - - /** - *

getSorcerySpeed.

- * - * @return a boolean. - */ - public boolean getSorcerySpeed() { - return bSorcerySpeed; - } - - /** - *

setAnyPlayer.

- * - * @param anyPlayer a boolean. - */ - public void setAnyPlayer(boolean anyPlayer) { - bAnyPlayer = anyPlayer; - } - - /** - *

getAnyPlayer.

- * - * @return a boolean. - */ - public boolean getAnyPlayer() { - return bAnyPlayer; - } - - /** - *

setPlayerTurn.

- * - * @param bTurn a boolean. - */ - public void setPlayerTurn(boolean bTurn) { - bPlayerTurn = bTurn; - } - - /** - *

getPlayerTurn.

- * - * @return a boolean. - */ - public boolean getPlayerTurn() { - return bPlayerTurn; - } - - /** - *

setOpponentTurn.

- * - * @param bTurn a boolean. - */ - public void setOpponentTurn(boolean bTurn) { - bOpponentTurn = bTurn; - } - - /** - *

getOpponentTurn.

- * - * @return a boolean. - */ - public boolean getOpponentTurn() { - return bOpponentTurn; - } - - /** - *

Setter for the field activationLimit.

- * - * @param limit a int. - */ - public void setActivationLimit(int limit) { - activationLimit = limit; - } - - /** - *

abilityActivated.

- */ - public void abilityActivated() { - numberTurnActivations++; - } - - /** - *

Getter for the field numberTurnActivations.

- * - * @return a int. - */ - public int getNumberTurnActivations() { - return numberTurnActivations; - } - - /** - *

resetTurnActivations.

- */ - public void resetTurnActivations() { - numberTurnActivations = 0; - } - - /** - *

Setter for the field activationNumberSacrifice.

- * - * @param num a int. - */ - public void setActivationNumberSacrifice(int num) { - activationNumberSacrifice = num; - } - - /** - *

Getter for the field activationNumberSacrifice.

- * - * @return a int. - */ - public int getActivationNumberSacrifice() { - return activationNumberSacrifice; - } - - /** - *

Setter for the field phases.

- * - * @param phasesString a {@link java.lang.String} object. - */ - public void setPhases(String phasesString) { - for (String s : phasesString.split(",")) - phases.add(s); - } - - /** - *

setActivateCardsInHand.

- * - * @param cards a int. - */ - public void setActivateCardsInHand(int cards) { - nCardsInHand = cards; - } - - //specific named conditions - /** - *

Setter for the field hellbent.

- * - * @param bHellbent a boolean. - */ - public void setHellbent(boolean bHellbent) { - hellbent = bHellbent; - } - - /** - *

Setter for the field threshold.

- * - * @param bThreshold a boolean. - */ - public void setThreshold(boolean bThreshold) { - threshold = bThreshold; - } - - /** - *

Setter for the field metalcraft.

- * - * @param bMetalcraft a boolean. - */ - public void setMetalcraft(boolean bMetalcraft) { - metalcraft = bMetalcraft; - } - - //IsPresent for Valid battlefield stuff - - /** - *

setIsPresent.

- * - * @param present a {@link java.lang.String} object. - */ - public void setIsPresent(String present) { - sIsPresent = present; - } - - /** - *

Setter for the field presentCompare.

- * - * @param compare a {@link java.lang.String} object. - */ - public void setPresentCompare(String compare) { - presentCompare = compare; - } - - public String getPresentZone() { - return presentZone; - } - - public void setPresentZone(String presentZone) { - this.presentZone = presentZone; - } - - /** - *

Setter for the field presentDefined.

- * - * @param defined a {@link java.lang.String} object. - */ - public void setPresentDefined(String defined) { - presentDefined = defined; - } - - //used to define as a Planeswalker ability - /** - *

setPlaneswalker.

- * - * @param bPlaneswalker a boolean. - */ - public void setPlaneswalker(boolean bPlaneswalker) { - pwAbility = bPlaneswalker; - } - - /** - *

getPlaneswalker.

- * - * @return a boolean. - */ - public boolean getPlaneswalker() { - return pwAbility; - } - - //Checking the values of SVars (Mostly for Traps) - /** - *

Setter for the field svarToCheck.

- * - * @param SVar a {@link java.lang.String} object. - */ - public void setSvarToCheck(String SVar) { - svarToCheck = SVar; - } - - /** - *

Setter for the field svarOperator.

- * - * @param Operator a {@link java.lang.String} object. - */ - public void setSvarOperator(String Operator) { - svarOperator = Operator; - } - - /** - *

Setter for the field svarOperand.

- * - * @param Operand a {@link java.lang.String} object. - */ - public void setSvarOperand(String Operand) { - svarOperand = Operand; - } - -}//end class SpellAbility_Variables diff --git a/src/forge/card/spellability/Spell_Permanent.java b/src/forge/card/spellability/Spell_Permanent.java deleted file mode 100644 index 5249e4d8c2b..00000000000 --- a/src/forge/card/spellability/Spell_Permanent.java +++ /dev/null @@ -1,314 +0,0 @@ -package forge.card.spellability; - -import forge.*; -import forge.card.abilityFactory.AbilityFactory; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.trigger.Trigger; -import forge.gui.input.Input; - -import java.util.ArrayList; -import java.util.HashMap; - - -/** - *

Spell_Permanent class.

- * - * @author Forge - * @version $Id: $ - */ -public class Spell_Permanent extends Spell { - /** Constant serialVersionUID=2413495058630644447L */ - private static final long serialVersionUID = 2413495058630644447L; - - private boolean willChampion = false; - private String championValid = null; - private String championValidDesc = ""; - - - final Input championInputComes = new Input() { - private static final long serialVersionUID = -7503268232821397107L; - - @Override - public void showMessage() { - CardList choice = (CardList) championGetCreature.execute(); - - stopSetNext(CardFactoryUtil.input_targetChampionSac(getSourceCard(), championAbilityComes, choice, - "Select another " + championValidDesc + " you control to exile", false, false)); - ButtonUtil.disableAll(); //target this card means: sacrifice this card - } - }; - - private final CommandReturn championGetCreature = new CommandReturn() { - public Object execute() { - CardList cards = AllZoneUtil.getPlayerCardsInPlay(getSourceCard().getController()); - return cards.getValidCards(championValid, getSourceCard().getController(), getSourceCard()); - } - };//CommandReturn - - final SpellAbility championAbilityComes = new Ability(getSourceCard(), "0") { - @Override - public void resolve() { - - Card source = getSourceCard(); - Player controller = source.getController(); - - CardList creature = (CardList) championGetCreature.execute(); - if (creature.size() == 0) { - AllZone.getGameAction().sacrifice(source); - return; - } else if (controller.isHuman()) { - AllZone.getInputControl().setInput(championInputComes); - } else { //Computer - CardList computer = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - computer = computer.getValidCards(championValid, controller, source); - computer.remove(source); - - computer.shuffle(); - if (computer.size() != 0) { - Card c = computer.get(0); - source.setChampionedCard(c); - if (AllZoneUtil.isCardInPlay(c)) { - AllZone.getGameAction().exile(c); - } - - //Run triggers - HashMap runParams = new HashMap(); - runParams.put("Card", source); - runParams.put("Championed", source.getChampionedCard()); - AllZone.getTriggerHandler().runTrigger("Championed", runParams); - } else - AllZone.getGameAction().sacrifice(getSourceCard()); - }//computer - }//resolve() - }; - - Command championCommandComes = new Command() { - - private static final long serialVersionUID = -3580408066322945328L; - - public void execute() { - StringBuilder sb = new StringBuilder(); - sb.append(getSourceCard()).append(" - When CARDNAME enters the battlefield, sacrifice it unless you exile another Faerie you control."); - championAbilityComes.setStackDescription(sb.toString()); - AllZone.getStack().addSimultaneousStackEntry(championAbilityComes); - }//execute() - };//championCommandComes - - Command championCommandLeavesPlay = new Command() { - - private static final long serialVersionUID = -5903638227914705191L; - - public void execute() { - - SpellAbility ability = new Ability(getSourceCard(), "0") { - @Override - public void resolve() { - Card c = getSourceCard().getChampionedCard(); - if (c != null && !c.isToken() && AllZoneUtil.isCardExiled(c)) { - AllZone.getGameAction().moveToPlay(c); - } - }//resolve() - };//SpellAbility - - StringBuilder sb = new StringBuilder(); - sb.append(getSourceCard()).append(" - When CARDNAME leaves the battlefield, exiled card returns to the battlefield."); - ability.setStackDescription(sb.toString()); - - AllZone.getStack().addSimultaneousStackEntry(ability); - }//execute() - };//championCommandLeavesPlay - - /////// - //////////////////// - - /** - *

Constructor for Spell_Permanent.

- * - * @param sourceCard a {@link forge.Card} object. - */ - public Spell_Permanent(Card sourceCard) { - // Add Costs for all SpellPermanents - this(sourceCard, new Cost(sourceCard.getManaCost(), sourceCard.getName(), false), null); - }//Spell_Permanent() - - /** - *

Constructor for Spell_Permanent.

- * - * @param sourceCard a {@link forge.Card} object. - * @param cost a {@link forge.card.spellability.Cost} object. - * @param tgt a {@link forge.card.spellability.Target} object. - */ - public Spell_Permanent(Card sourceCard, Cost cost, Target tgt) { - this(sourceCard, cost, tgt, true); - }//Spell_Permanent() - - public Spell_Permanent(Card sourceCard, Cost cost, Target tgt, boolean setDesc) { - super(sourceCard, cost, tgt); - - if (CardFactoryUtil.hasKeyword(sourceCard, "Champion") != -1) { - int n = CardFactoryUtil.hasKeyword(sourceCard, "Champion"); - - String toParse = sourceCard.getKeyword().get(n).toString(); - String parsed[] = toParse.split(":"); - willChampion = true; - championValid = parsed[1]; - if (parsed.length > 2) { - championValidDesc = parsed[2]; - } else championValidDesc = championValid; - } - - if (sourceCard.isCreature()) { - - StringBuilder sb = new StringBuilder(); - sb.append(sourceCard.getName()).append(" - Creature ").append(sourceCard.getNetAttack()); - sb.append(" / ").append(sourceCard.getNetDefense()); - setStackDescription(sb.toString()); - } else setStackDescription(sourceCard.getName()); - - if (setDesc) - setDescription(getStackDescription()); - - if (willChampion) { - sourceCard.addComesIntoPlayCommand(championCommandComes); - sourceCard.addLeavesPlayCommand(championCommandLeavesPlay); - } - - }//Spell_Permanent() - - /** {@inheritDoc} */ - @Override - public boolean canPlay() { - Card source = getSourceCard(); - if (AllZone.getStack().isSplitSecondOnStack() || source.isUnCastable()) return false; - - Player turn = AllZone.getPhase().getPlayerTurn(); - - if (source.getName().equals("Serra Avenger")) { - if (turn.equals(source.getController()) && turn.getTurn() <= 3) - return false; - } else if (source.getName().equals("Blizzard")) { - CardList lands = AllZoneUtil.getPlayerLandsInPlay(source.getController()); - lands = lands.getType("Snow"); - if (lands.size() == 0) return false; - } - - // Flash handled by super.canPlay - return super.canPlay(); - } - - /** {@inheritDoc} */ - @Override - public boolean canPlayAI() { - - Card card = getSourceCard(); - - //check on legendary - if (card.isType("Legendary")) { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - if (list.containsName(card.getName())) - return false; - } - if (card.isPlaneswalker()) { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - list = list.getType("Planeswalker"); - - for (int i = 0; i < list.size(); i++) { - String subtype = card.getType().get(card.getType().size() - 1); - CardList cl = list.getType(subtype); - - if (cl.size() > 0) { - return false; - } - } - } - if (card.isType("World")) { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); - list = list.getType("World"); - if (list.size() > 0) return false; - } - - if (card.isCreature() - && card.getNetDefense() <= 0 - && !card.hasStartOfKeyword("etbCounter") - && !card.getText().contains("Modular")) - return false; - - if (willChampion) { - Object o = championGetCreature.execute(); - if (o == null) return false; - - CardList cl = (CardList) championGetCreature.execute(); - if ((o == null) || !(cl.size() > 0) || !AllZone.getZone(getSourceCard()).is(Constant.Zone.Hand)) - return false; - } - - if (!checkETBEffects(card, this, null)) - return false; - - return super.canPlayAI(); - }//canPlayAI() - - /** - *

checkETBEffects.

- * - * @param card a {@link forge.Card} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param api a {@link java.lang.String} object. - * @return a boolean. - */ - public static boolean checkETBEffects(Card card, SpellAbility sa, String api) { - // Trigger play improvements - ArrayList triggers = card.getTriggers(); - for (Trigger tr : triggers) { - // These triggers all care for ETB effects - - HashMap params = tr.getMapParams(); - if (!params.get("Mode").equals("ChangesZone")) - continue; - - if (!params.get("Destination").equals("Battlefield")) - continue; - - if (params.containsKey("ValidCard") && !params.get("ValidCard").contains("Self")) - continue; - - if (!tr.requirementsCheck()) - continue; - - if (tr.getOverridingAbility() != null) // Don't look at Overriding Abilities yet - continue; - - // Maybe better considerations - AbilityFactory af = new AbilityFactory(); - SpellAbility exSA = af.getAbility(card.getSVar(params.get("Execute")), card); - - if (api != null && !af.getAPI().equals(api)) - continue; - - exSA.setActivatingPlayer(sa.getActivatingPlayer()); - - // Run non-mandatory trigger. - // These checks only work if the Executing SpellAbility is an Ability_Sub. - if (exSA instanceof Ability_Sub && !exSA.doTrigger(false)) { - // AI would not run this trigger if given the chance - - // if trigger is mandatory, return false - if (params.get("OptionalDecider") == null) { - return false; - } - // else - // otherwise, return false 50% of the time? - } - } - - return true; - } - - - /** {@inheritDoc} */ - @Override - public void resolve() { - Card c = getSourceCard(); - AllZone.getGameAction().moveToPlay(c); - } -} diff --git a/src/forge/card/spellability/Target.java b/src/forge/card/spellability/Target.java deleted file mode 100644 index ac664d149df..00000000000 --- a/src/forge/card/spellability/Target.java +++ /dev/null @@ -1,494 +0,0 @@ -package forge.card.spellability; - -import forge.*; -import forge.card.abilityFactory.AbilityFactory; -import forge.card.cardFactory.CardFactoryUtil; - -import java.util.ArrayList; - -/** - *

Target class.

- * - * @author Forge - * @version $Id: $ - */ -public class Target { - // Target has two things happening: - // Targeting restrictions (Creature, Min/Maxm etc) which are true for this whole Target - // Target Choices (which is specific for the StackInstance) - private Card srcCard; - - private Target_Choices choice = null; - - /** - *

getTargetChoices.

- * - * @return a {@link forge.card.spellability.Target_Choices} object. - */ - public Target_Choices getTargetChoices() { - return choice; - } - - /** - *

setTargetChoices.

- * - * @param tc a {@link forge.card.spellability.Target_Choices} object. - */ - public void setTargetChoices(Target_Choices tc) { - choice = tc; - } - - private boolean bMandatory = false; - - /** - *

getMandatory.

- * - * @return a boolean. - */ - public boolean getMandatory() { - return bMandatory; - } - - /** - *

setMandatory.

- * - * @param m a boolean. - */ - public void setMandatory(boolean m) { - bMandatory = m; - } - - private boolean tgtValid = false; - private String ValidTgts[]; - private String vtSelection = ""; - - /** - *

doesTarget.

- * - * @return a boolean. - */ - public boolean doesTarget() { - return tgtValid; - } - - /** - *

getValidTgts.

- * - * @return an array of {@link java.lang.String} objects. - */ - public String[] getValidTgts() { - return ValidTgts; - } - - /** - *

getVTSelection.

- * - * @return a {@link java.lang.String} object. - */ - public String getVTSelection() { - return vtSelection; - } - - private String minTargets; - private String maxTargets; - - /** - *

Getter for the field minTargets.

- * - * @param c a {@link forge.Card} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a int. - */ - public int getMinTargets(Card c, SpellAbility sa) { - return AbilityFactory.calculateAmount(c, minTargets, sa); - } - - /** - *

Getter for the field maxTargets.

- * - * @param c a {@link forge.Card} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a int. - */ - public int getMaxTargets(Card c, SpellAbility sa) { - return AbilityFactory.calculateAmount(c, maxTargets, sa); - } - - /** - *

isMaxTargetsChosen.

- * - * @param c a {@link forge.Card} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - public boolean isMaxTargetsChosen(Card c, SpellAbility sa) { - return choice != null && getMaxTargets(c, sa) == choice.getNumTargeted(); - } - - /** - *

isMinTargetsChosen.

- * - * @param c a {@link forge.Card} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - public boolean isMinTargetsChosen(Card c, SpellAbility sa) { - if (getMinTargets(c, sa) == 0) - return true; - return choice != null && getMinTargets(c, sa) <= choice.getNumTargeted(); - } - - private String tgtZone = Constant.Zone.Battlefield; - - /** - *

setZone.

- * - * @param tZone a {@link java.lang.String} object. - */ - public void setZone(String tZone) { - tgtZone = tZone; - } - - /** - *

getZone.

- * - * @return a {@link java.lang.String} object. - */ - public String getZone() { - return tgtZone; - } - - // Used for Counters. Currently, Spell,Activated,Triggered can be Comma-separated - private String targetSpellAbilityType = null; - - /** - *

Setter for the field targetSpellAbilityType.

- * - * @param tgtSAType a {@link java.lang.String} object. - */ - public void setTargetSpellAbilityType(String tgtSAType) { - targetSpellAbilityType = tgtSAType; - } - - /** - *

Getter for the field targetSpellAbilityType.

- * - * @return a {@link java.lang.String} object. - */ - public String getTargetSpellAbilityType() { - return targetSpellAbilityType; - } - - // Used for Counters. The target SA of this SA must be targeting a Valid X - private String saValidTargeting = null; - - /** - *

setSAValidTargeting.

- * - * @param saValidTgting a {@link java.lang.String} object. - */ - public void setSAValidTargeting(String saValidTgting) { - saValidTargeting = saValidTgting; - } - - /** - *

getSAValidTargeting.

- * - * @return a {@link java.lang.String} object. - */ - public String getSAValidTargeting() { - return saValidTargeting; - } - - // Leaving old structure behind for compatibility. - /** - *

addTarget.

- * - * @param o a {@link java.lang.Object} object. - * @return a boolean. - */ - public boolean addTarget(Object o) { - if (choice == null) - choice = new Target_Choices(); - - if (o instanceof Card) - return choice.addTarget((Card) o); - - if (o instanceof Player) - return choice.addTarget((Player) o); - - if (o instanceof SpellAbility) - return choice.addTarget((SpellAbility) o); - - return false; - } - - /** - *

getTargetCards.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getTargetCards() { - if (choice == null) - return new ArrayList(); - - return choice.getTargetCards(); - } - - /** - *

getTargetPlayers.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getTargetPlayers() { - if (choice == null) - return new ArrayList(); - - return choice.getTargetPlayers(); - } - - /** - *

getTargetSAs.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getTargetSAs() { - if (choice == null) - return new ArrayList(); - - return choice.getTargetSAs(); - } - - /** - *

getTargets.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getTargets() { - if (choice == null) - return new ArrayList(); - - return choice.getTargets(); - } - - /** - *

getNumTargeted.

- * - * @return a int. - */ - public int getNumTargeted() { - if (choice == null) - return 0; - return choice.getNumTargeted(); - } - - /** - *

resetTargets.

- */ - public void resetTargets() { - choice = null; - } - - /** - *

Constructor for Target.

- * - * @param src a {@link forge.Card} object. - * @param parse a {@link java.lang.String} object. - */ - public Target(Card src, String parse) { - this(src, parse, "1", "1"); - } - - /** - *

Constructor for Target.

- * - * @param src a {@link forge.Card} object. - * @param parse a {@link java.lang.String} object. - * @param min a {@link java.lang.String} object. - * @param max a {@link java.lang.String} object. - */ - public Target(Card src, String parse, String min, String max) { - // parse=Tgt{C}{P} - Primarily used for Pump or Damage - // C = Creature P=Player/Planeswalker - // CP = All three - - tgtValid = true; - srcCard = src; - - if (parse.contains("Tgt")) { - parse = parse.replace("Tgt", ""); - } - - String valid; - String prompt; - StringBuilder sb = new StringBuilder(); - - if (parse.equals("CP")) { - valid = "Creature,Planeswalker.YouDontCtrl,Player"; - prompt = "Select target creature, planeswalker, or player"; - } else if (parse.equals("C")) { - valid = "Creature"; - prompt = "Select target creature"; - } else if (parse.equals("P")) { - valid = "Planeswalker.YouDontCtrl,Player"; - prompt = "Select target planeswalker or player"; - } else { - System.out.println("Bad Parsing in Target(parse, min, max): " + parse); - return; - } - - if (src != null) sb.append(src + " - "); - sb.append(prompt); - vtSelection = sb.toString(); - ValidTgts = valid.split(","); - - minTargets = min; - maxTargets = max; - } - - /** - *

Constructor for Target.

- * - * @param src a {@link forge.Card} object. - * @param select a {@link java.lang.String} object. - * @param valid an array of {@link java.lang.String} objects. - */ - public Target(Card src, String select, String[] valid) { - this(src, select, valid, "1", "1"); - } - - /** - *

Constructor for Target.

- * - * @param src a {@link forge.Card} object. - * @param select a {@link java.lang.String} object. - * @param valid a {@link java.lang.String} object. - */ - public Target(Card src, String select, String valid) { - this(src, select, valid.split(","), "1", "1"); - } - - /** - *

Constructor for Target.

- * - * @param src a {@link forge.Card} object. - * @param select a {@link java.lang.String} object. - * @param valid an array of {@link java.lang.String} objects. - * @param min a {@link java.lang.String} object. - * @param max a {@link java.lang.String} object. - */ - public Target(Card src, String select, String[] valid, String min, String max) { - srcCard = src; - tgtValid = true; - vtSelection = select; - ValidTgts = valid; - - minTargets = min; - maxTargets = max; - } - - /** - *

getTargetedString.

- * - * @return a {@link java.lang.String} object. - */ - public String getTargetedString() { - ArrayList tgts = getTargets(); - StringBuilder sb = new StringBuilder(""); - for (Object o : tgts) { - if (o instanceof Player) { - Player p = (Player) o; - sb.append(p.getName()); - } - if (o instanceof Card) { - Card c = (Card) o; - sb.append(c); - } - sb.append(" "); - } - - return sb.toString(); - } - - - /** - *

canOnlyTgtOpponent.

- * - * @return a boolean. - */ - public boolean canOnlyTgtOpponent() { - boolean player = false; - boolean opponent = false; - for (String s : ValidTgts) { - if (s.equals("Opponent")) - opponent = true; - else if (s.equals("Player")) - player = true; - } - return opponent && !player; - } - - /** - *

canTgtPlayer.

- * - * @return a boolean. - */ - public boolean canTgtPlayer() { - for (String s : ValidTgts) { - if (s.equals("Player") || s.equals("Opponent")) - return true; - } - return false; - } - - /** - *

canTgtCreature.

- * - * @return a boolean. - */ - - public boolean canTgtPermanent() { - for (String s : ValidTgts) { - if (s.contains("Permanent")) - return true; - } - return false; - } - - public boolean canTgtCreature() { - for (String s : ValidTgts) { - if (s.contains("Creature") && !s.contains("nonCreature")) - return true; - } - return false; - } - - /** - *

canTgtCreatureAndPlayer.

- * - * @return a boolean. - */ - public boolean canTgtCreatureAndPlayer() { - return canTgtPlayer() && canTgtCreature(); - } - - /** - *

hasCandidates.

- * @param isTargeted Check Valid Candidates and Targeting - * - * @return a boolean. - */ - public boolean hasCandidates(boolean isTargeted) { - if (canTgtPlayer()) { - return true; - } - - for (Card c : AllZoneUtil.getCardsInZone(tgtZone)){ - if (c.isValidCard(ValidTgts, srcCard.getController(), srcCard) && (!isTargeted || CardFactoryUtil.canTarget(srcCard, c))) { - return true; - } - } - - return false; - } -} diff --git a/src/forge/card/spellability/Target_Choices.java b/src/forge/card/spellability/Target_Choices.java deleted file mode 100644 index 35f5b8d86f5..00000000000 --- a/src/forge/card/spellability/Target_Choices.java +++ /dev/null @@ -1,162 +0,0 @@ -package forge.card.spellability; - -import forge.Card; -import forge.Player; - -import java.util.ArrayList; - -/** - *

Target_Choices class.

- * - * @author Forge - * @version $Id: $ - */ -public class Target_Choices { - private int numTargeted = 0; - - /** - *

Getter for the field numTargeted.

- * - * @return a int. - */ - public int getNumTargeted() { - return numTargeted; - } - - // Card or Player are legal targets. - private ArrayList targetCards = new ArrayList(); - private ArrayList targetPlayers = new ArrayList(); - private ArrayList targetSAs = new ArrayList(); - - /** - *

addTarget.

- * - * @param o a {@link java.lang.Object} object. - * @return a boolean. - */ - public boolean addTarget(Object o) { - if (o instanceof Player) - return addTarget((Player) o); - - else if (o instanceof Card) - return addTarget((Card) o); - - else if (o instanceof SpellAbility) - return addTarget((SpellAbility) o); - - return false; - } - - /** - *

addTarget.

- * - * @param c a {@link forge.Card} object. - * @return a boolean. - */ - public boolean addTarget(Card c) { - if (!targetCards.contains(c)) { - targetCards.add(c); - numTargeted++; - return true; - } - return false; - } - - /** - *

addTarget.

- * - * @param p a {@link forge.Player} object. - * @return a boolean. - */ - public boolean addTarget(Player p) { - if (!targetPlayers.contains(p)) { - targetPlayers.add(p); - numTargeted++; - return true; - } - return false; - } - - /** - *

addTarget.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - public boolean addTarget(SpellAbility sa) { - if (!targetSAs.contains(sa)) { - targetSAs.add(sa); - numTargeted++; - return true; - } - return false; - } - - /** - *

Getter for the field targetCards.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getTargetCards() { - return targetCards; - } - - /** - *

Getter for the field targetPlayers.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getTargetPlayers() { - return targetPlayers; - } - - /** - *

Getter for the field targetSAs.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getTargetSAs() { - return targetSAs; - } - - /** - *

getTargets.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getTargets() { - ArrayList tgts = new ArrayList(); - tgts.addAll(targetPlayers); - tgts.addAll(targetCards); - tgts.addAll(targetSAs); - - return tgts; - } - - /** - *

getTargetedString.

- * - * @return a {@link java.lang.String} object. - */ - public String getTargetedString() { - ArrayList tgts = getTargets(); - StringBuilder sb = new StringBuilder(""); - for (Object o : tgts) { - if (o instanceof Player) { - Player p = (Player) o; - sb.append(p.getName()); - } - if (o instanceof Card) { - Card c = (Card) o; - sb.append(c); - } - if (o instanceof SpellAbility) { - SpellAbility sa = (SpellAbility) o; - sb.append(sa); - } - sb.append(" "); - } - - return sb.toString(); - } -} diff --git a/src/forge/card/spellability/Target_Selection.java b/src/forge/card/spellability/Target_Selection.java deleted file mode 100644 index 2fb0c9ba1db..00000000000 --- a/src/forge/card/spellability/Target_Selection.java +++ /dev/null @@ -1,460 +0,0 @@ -package forge.card.spellability; - -import forge.*; -import forge.card.cardFactory.CardFactoryUtil; -import forge.gui.GuiUtils; -import forge.gui.input.Input; - -import java.util.ArrayList; -import java.util.HashMap; - -/** - *

Target_Selection class.

- * - * @author Forge - * @version $Id: $ - */ -public class Target_Selection { - private Target target = null; - private SpellAbility ability = null; - private Card card = null; - private Target_Selection subSelection = null; - - /** - *

getTgt.

- * - * @return a {@link forge.card.spellability.Target} object. - */ - public Target getTgt() { - return target; - } - - /** - *

Getter for the field ability.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility getAbility() { - return ability; - } - - /** - *

Getter for the field card.

- * - * @return a {@link forge.Card} object. - */ - public Card getCard() { - return card; - } - - private SpellAbility_Requirements req = null; - - /** - *

setRequirements.

- * - * @param reqs a {@link forge.card.spellability.SpellAbility_Requirements} object. - */ - public void setRequirements(SpellAbility_Requirements reqs) { - req = reqs; - } - - private boolean bCancel = false; - - /** - *

setCancel.

- * - * @param done a boolean. - */ - public void setCancel(boolean done) { - bCancel = done; - } - - /** - *

isCanceled.

- * - * @return a boolean. - */ - public boolean isCanceled() { - if (bCancel) - return bCancel; - - if (subSelection == null) - return false; - - return subSelection.isCanceled(); - } - - private boolean bDoneTarget = false; - - /** - *

setDoneTarget.

- * - * @param done a boolean. - */ - public void setDoneTarget(boolean done) { - bDoneTarget = done; - } - - /** - *

Constructor for Target_Selection.

- * - * @param tgt a {@link forge.card.spellability.Target} object. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public Target_Selection(Target tgt, SpellAbility sa) { - target = tgt; - ability = sa; - card = sa.getSourceCard(); - } - - /** - *

doesTarget.

- * - * @return a boolean. - */ - public boolean doesTarget() { - if (target == null) - return false; - return target.doesTarget(); - } - - /** - *

resetTargets.

- */ - public void resetTargets() { - if (target != null) - target.resetTargets(); - } - - /** - *

chooseTargets.

- * - * @return a boolean. - */ - public boolean chooseTargets() { - // if not enough targets chosen, reset and cancel Ability - if (bCancel || (bDoneTarget && !target.isMinTargetsChosen(card, ability))) { - bCancel = true; - req.finishedTargeting(); - return false; - } else if (!doesTarget() || bDoneTarget && target.isMinTargetsChosen(card, ability) || target.isMaxTargetsChosen(card, ability)) { - Ability_Sub abSub = ability.getSubAbility(); - - if (abSub == null) { - // if no more SubAbilities finish targeting - req.finishedTargeting(); - return true; - } else { - // Has Sub Ability - subSelection = new Target_Selection(abSub.getTarget(), abSub); - subSelection.setRequirements(req); - subSelection.resetTargets(); - return subSelection.chooseTargets(); - } - } - - chooseValidInput(); - - return false; - } - - // these have been copied over from CardFactoryUtil as they need two extra parameters for target selection. - // however, due to the changes necessary for SA_Requirements this is much different than the original - - /** - *

chooseValidInput.

- */ - public void chooseValidInput() { - Target tgt = this.getTgt(); - String zone = tgt.getZone(); - final boolean mandatory = target.getMandatory() ? target.hasCandidates(true) : false; - - if (zone.equals(Constant.Zone.Stack)) { - // If Zone is Stack, the choices are handled slightly differently - chooseCardFromStack(mandatory); - return; - } - - CardList choices = AllZoneUtil.getCardsInZone(zone).getValidCards(target.getValidTgts(), ability.getActivatingPlayer(), ability.getSourceCard()); - - // Remove cards already targeted - ArrayList targeted = tgt.getTargetCards(); - for (Card c : targeted) { - if (choices.contains(c)) - choices.remove(c); - } - - if (zone.equals(Constant.Zone.Battlefield)) { - AllZone.getInputControl().setInput(input_targetSpecific(choices, true, mandatory)); - } else - chooseCardFromList(choices, true, mandatory); - }//input_targetValid - - //CardList choices are the only cards the user can successful select - /** - *

input_targetSpecific.

- * - * @param choices a {@link forge.CardList} object. - * @param targeted a boolean. - * @param mandatory a boolean. - * @return a {@link forge.gui.input.Input} object. - */ - public Input input_targetSpecific(final CardList choices, final boolean targeted, final boolean mandatory) { - final SpellAbility sa = this.ability; - final Target_Selection select = this; - final Target tgt = this.target; - final SpellAbility_Requirements req = this.req; - - Input target = new Input() { - private static final long serialVersionUID = -1091595663541356356L; - - @Override - public void showMessage() { - StringBuilder sb = new StringBuilder(); - sb.append("Targeted: "); - sb.append(tgt.getTargetedString()); - sb.append("\n"); - sb.append(tgt.getVTSelection()); - - AllZone.getDisplay().showMessage(sb.toString()); - - // If reached Minimum targets, enable OK button - if (!tgt.isMinTargetsChosen(sa.getSourceCard(), sa)) - ButtonUtil.enableOnlyCancel(); - else - ButtonUtil.enableAll(); - - if (mandatory) - ButtonUtil.disableCancel(); - } - - @Override - public void selectButtonCancel() { - select.setCancel(true); - stop(); - req.finishedTargeting(); - } - - @Override - public void selectButtonOK() { - select.setDoneTarget(true); - done(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - // leave this in temporarily, there some seriously wrong things going on here - if (targeted && !CardFactoryUtil.canTarget(sa, card)) { - AllZone.getDisplay().showMessage("Cannot target this card (Shroud? Protection? Restrictions?)."); - } else if (choices.contains(card)) { - tgt.addTarget(card); - done(); - } - }//selectCard() - - @Override - public void selectPlayer(Player player) { - if ((tgt.canTgtPlayer() || (tgt.canOnlyTgtOpponent() && player.equals(sa.getActivatingPlayer().getOpponent()))) && - player.canTarget(sa)) { - tgt.addTarget(player); - done(); - } - } - - void done() { - stop(); - - select.chooseTargets(); - } - }; - - return target; - }//input_targetSpecific() - - - /** - *

chooseCardFromList.

- * - * @param choices a {@link forge.CardList} object. - * @param targeted a boolean. - * @param mandatory a boolean. - */ - public void chooseCardFromList(final CardList choices, boolean targeted, final boolean mandatory) { - // Send in a list of valid cards, and popup a choice box to target - final Card dummy = new Card(); - dummy.setName("[FINISH TARGETING]"); - final SpellAbility sa = this.ability; - final String message = this.target.getVTSelection(); - - Target tgt = this.getTgt(); - - CardList choicesWithDone = choices; - if (tgt.isMinTargetsChosen(sa.getSourceCard(), sa)) { - // is there a more elegant way of doing this? - choicesWithDone.add(dummy); - } - Object check = GuiUtils.getChoiceOptional(message, choicesWithDone.toArray()); - if (check != null) { - Card c = (Card) check; - if (c.equals(dummy)) - this.setDoneTarget(true); - else - tgt.addTarget(c); - } else - this.setCancel(true); - - this.chooseTargets(); - } - - /** - *

chooseCardFromStack.

- * - * @param mandatory a boolean. - */ - public void chooseCardFromStack(final boolean mandatory) { - Target tgt = this.target; - String message = tgt.getVTSelection(); - Target_Selection select = this; - - // Find what's targetable, then allow human to choose - ArrayList choosables = getTargetableOnStack(this.ability, select.getTgt()); - - HashMap map = new HashMap(); - - for (SpellAbility sa : choosables) { - map.put(sa.getStackDescription(), sa); - } - - String[] choices = new String[map.keySet().size()]; - choices = map.keySet().toArray(choices); - - if (choices.length == 0) { - select.setCancel(true); - } else { - String madeChoice = GuiUtils.getChoiceOptional(message, choices); - - if (madeChoice != null) { - tgt.addTarget(map.get(madeChoice)); - } else - select.setCancel(true); - } - - select.chooseTargets(); - } - - // TODO: The following three functions are Utility functions for TargetOnStack, probably should be moved - // The following should be select.getTargetableOnStack() - /** - *

getTargetableOnStack.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param tgt a {@link forge.card.spellability.Target} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getTargetableOnStack(SpellAbility sa, Target tgt) { - ArrayList choosables = new ArrayList(); - - for (int i = 0; i < AllZone.getStack().size(); i++) { - choosables.add(AllZone.getStack().peekAbility(i)); - } - - for (int i = 0; i < choosables.size(); i++) { - if (!matchSpellAbility(sa, choosables.get(i), tgt)) { - choosables.remove(i); - } - } - return choosables; - } - - /** - *

matchSpellAbility.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param topSA a {@link forge.card.spellability.SpellAbility} object. - * @param tgt a {@link forge.card.spellability.Target} object. - * @return a boolean. - */ - public static boolean matchSpellAbility(SpellAbility sa, SpellAbility topSA, Target tgt) { - String saType = tgt.getTargetSpellAbilityType(); - - if (null == saType) { - //just take this to mean no restrictions - carry on. - } else if (topSA.isSpell()) { - if (!saType.contains("Spell")) - return false; - } else if (topSA.isTrigger()) { - if (!saType.contains("Triggered")) - return false; - } else if (topSA.isAbility()) { - if (!saType.contains("Activated")) - return false; - } - - String splitTargetRestrictions = tgt.getSAValidTargeting(); - if (splitTargetRestrictions != null) { - // TODO: What about spells with SubAbilities with Targets? - - Target matchTgt = topSA.getTarget(); - - if (matchTgt == null) - return false; - - boolean result = false; - - for (Object o : matchTgt.getTargets()) { - if (matchesValid(o, splitTargetRestrictions.split(","), sa)) { - result = true; - break; - } - } - - if (!result) - return false; - } - - if (!matchesValid(topSA, tgt.getValidTgts(), sa)) { - return false; - } - - return true; - } - - /** - *

matchesValid.

- * - * @param o a {@link java.lang.Object} object. - * @param valids an array of {@link java.lang.String} objects. - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean matchesValid(Object o, String[] valids, SpellAbility sa) { - Card srcCard = sa.getSourceCard(); - Player activatingPlayer = sa.getActivatingPlayer(); - if (o instanceof Card) { - Card c = (Card) o; - return c.isValidCard(valids, activatingPlayer, srcCard); - } - - if (o instanceof Player) { - for (String v : valids) { - if (v.equalsIgnoreCase("Player")) - return true; - - if (v.equalsIgnoreCase("Opponent")) { - if (o.equals(activatingPlayer.getOpponent())) { - return true; - } - } - if (v.equalsIgnoreCase("You")) - return o.equals(activatingPlayer); - } - } - - if (o instanceof SpellAbility) { - Card c = ((SpellAbility) o).getSourceCard(); - return c.isValidCard(valids, activatingPlayer, srcCard); - } - - return false; - } -} diff --git a/src/forge/card/trigger/Trigger.java b/src/forge/card/trigger/Trigger.java deleted file mode 100644 index 2ceab333caf..00000000000 --- a/src/forge/card/trigger/Trigger.java +++ /dev/null @@ -1,517 +0,0 @@ -package forge.card.trigger; - -import forge.*; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.SpellAbility; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -/** - *

Abstract Trigger class.

- * - * @author Forge - * @version $Id: $ - */ -public abstract class Trigger { - - /** Constant nextID=0 */ - private static int nextID = 0; - - /** - *

resetIDs.

- */ - public static void resetIDs() { - nextID = 50000; - } - - protected int ID = nextID++; - - protected String name; - - /** - *

Getter for the field name.

- * - * @return a {@link java.lang.String} object. - */ - public String getName() { - return name; - } - - /** - *

Setter for the field name.

- * - * @param n a {@link java.lang.String} object. - */ - public void setName(String n) { - name = n; - } - - /** - *

setID.

- * - * @param id a int. - */ - public void setID(int id) { - ID = id; - } - - protected HashMap mapParams = new HashMap(); - - /** - *

Getter for the field mapParams.

- * - * @return a {@link java.util.HashMap} object. - */ - public HashMap getMapParams() { - return mapParams; - } - - protected Map runParams; - - /** - *

Setter for the field runParams.

- * - * @param runParams2 a {@link java.util.Map} object. - */ - public void setRunParams(Map runParams2) { - runParams = runParams2; - } - - /** - *

Getter for the field runParams.

- * - * @return a {@link java.util.Map} object. - */ - public Map getRunParams() { - return runParams; - } - - protected SpellAbility overridingAbility = null; - - /** - *

Getter for the field overridingAbility.

- * - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public SpellAbility getOverridingAbility() { - return overridingAbility; - } - - /** - *

Setter for the field overridingAbility.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public void setOverridingAbility(SpellAbility sa) { - overridingAbility = sa; - } - - private HashMap storedTriggeredObjects = null; - - /** - *

Setter for the field storedTriggeredObjects.

- * - * @param storedTriggeredObjects a {@link java.util.HashMap} object. - * @since 1.0.15 - */ - public void setStoredTriggeredObjects(HashMap storedTriggeredObjects) { - this.storedTriggeredObjects = storedTriggeredObjects; - } - - /** - *

Getter for the field storedTriggeredObjects.

- * - * @return a {@link java.util.HashMap} object. - * @since 1.0.15 - */ - public HashMap getStoredTriggeredObjects() { - return storedTriggeredObjects; - } - - protected Card hostCard; - - /** - *

Getter for the field hostCard.

- * - * @return a {@link forge.Card} object. - */ - public Card getHostCard() { - return hostCard; - } - - /** - *

Setter for the field hostCard.

- * - * @param c a {@link forge.Card} object. - */ - public void setHostCard(Card c) { - hostCard = c; - } - - /** - *

Constructor for Trigger.

- * - * @param n a {@link java.lang.String} object. - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger(String n, HashMap params, Card host) { - name = n; - mapParams = new HashMap(); - for (Map.Entry entry : params.entrySet()) { - mapParams.put(entry.getKey(), entry.getValue()); - } - hostCard = host; - } - - /** - *

Constructor for Trigger.

- * - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger(HashMap params, Card host) { - mapParams = new HashMap(); - for (Map.Entry entry : params.entrySet()) { - mapParams.put(entry.getKey(), entry.getValue()); - } - hostCard = host; - } - - /** - *

toString.

- * - * @return a {@link java.lang.String} object. - */ - public String toString() { - if (mapParams.containsKey("TriggerDescription")) { - return mapParams.get("TriggerDescription").replace("CARDNAME", hostCard.getName()); - } else return ""; - } - - /** - *

zonesCheck.

- * - * @return a boolean. - */ - public boolean zonesCheck() { - if (mapParams.containsKey("TriggerZones")) { - ArrayList triggerZones = new ArrayList(); - for (String s : mapParams.get("TriggerZones").split(",")) { - triggerZones.add(s); - } - if (AllZone.getZone(hostCard) == null) { - return false; - } - if (!triggerZones.contains(AllZone.getZone(hostCard).getZoneName())) { - return false; - } - } - - return true; - } - - /** - *

phasesCheck.

- * - * @return a boolean. - */ - public boolean phasesCheck() { - if (mapParams.containsKey("TriggerPhases")) { - String phases = mapParams.get("TriggerPhases"); - - if (phases.contains("->")) { - // If phases lists a Range, split and Build Activate String - // Combat_Begin->Combat_End (During Combat) - // Draw-> (After Upkeep) - // Upkeep->Combat_Begin (Before Declare Attackers) - - String[] split = phases.split("->", 2); - phases = AllZone.getPhase().buildActivateString(split[0], split[1]); - } - ArrayList triggerPhases = new ArrayList(); - for (String s : phases.split(",")) { - triggerPhases.add(s); - } - if (!triggerPhases.contains(AllZone.getPhase().getPhase())) { - return false; - } - } - - if (mapParams.containsKey("PlayerTurn")) - if (!AllZone.getPhase().isPlayerTurn(hostCard.getController())) - return false; - - if (mapParams.containsKey("OpponentTurn")) - if (AllZone.getPhase().isPlayerTurn(hostCard.getController())) - return false; - - return true; - } - - /** - *

requirementsCheck.

- * - * @return a boolean. - */ - public boolean requirementsCheck() { - if (mapParams.containsKey("Metalcraft")) { - if (mapParams.get("Metalcraft").equals("True") && !hostCard.getController().hasMetalcraft()) { - return false; - } - } - - if (mapParams.containsKey("Threshold")) { - if (mapParams.get("Threshold").equals("True") && !hostCard.getController().hasThreshold()) { - return false; - } - } - - if (mapParams.containsKey("Hellbent")) { - if (mapParams.get("Hellbent").equals("True") && !hostCard.getController().hasHellbent()) { - return false; - } - } - - if (mapParams.containsKey("PlayersPoisoned")) { - if (mapParams.get("PlayersPoisoned").equals("You") && hostCard.getController().getPoisonCounters() == 0) { - return false; - } else if (mapParams.get("PlayersPoisoned").equals("Opponent") && hostCard.getController().getOpponent().getPoisonCounters() == 0) { - return false; - } else if (mapParams.get("PlayersPoisoned").equals("Each") && !(hostCard.getController().getPoisonCounters() != 0 && hostCard.getController().getPoisonCounters() != 0)) { - return false; - } - } - - if (mapParams.containsKey("LifeTotal")) { - String player = mapParams.get("LifeTotal"); - String lifeCompare = "GE1"; - int life = 1; - - if (player.equals("You")) { - life = hostCard.getController().getLife(); - } - if (player.equals("Opponent")) { - life = hostCard.getController().getOpponent().getLife(); - } - - if (mapParams.containsKey("LifeAmount")) { - lifeCompare = mapParams.get("LifeAmount"); - } - - - int right = 1; - String rightString = lifeCompare.substring(2); - if (rightString.equals("X")) { - right = CardFactoryUtil.xCount(hostCard, hostCard.getSVar("X")); - } else { - right = Integer.parseInt(lifeCompare.substring(2)); - } - - if (!AllZoneUtil.compare(life, lifeCompare, right)) { - return false; - } - - } - - if (mapParams.containsKey("IsPresent")) { - String sIsPresent = mapParams.get("IsPresent"); - String presentCompare = "GE1"; - String presentZone = "Battlefield"; - String presentPlayer = "Any"; - if (mapParams.containsKey("PresentCompare")) { - presentCompare = mapParams.get("PresentCompare"); - } - if (mapParams.containsKey("PresentZone")) { - presentZone = mapParams.get("PresentZone"); - } - if (mapParams.containsKey("PresentPlayer")) { - presentPlayer = mapParams.get("PresentPlayer"); - } - CardList list = new CardList(); - if (presentPlayer.equals("You") || presentPlayer.equals("Any")) { - list.addAll(AllZoneUtil.getCardsInZone(presentZone, hostCard.getController())); - } - if (presentPlayer.equals("Opponent") || presentPlayer.equals("Any")) { - list.addAll(AllZoneUtil.getCardsInZone(presentZone, hostCard.getController().getOpponent())); - } - - list = list.getValidCards(sIsPresent.split(","), hostCard.getController(), hostCard); - - int right = 1; - String rightString = presentCompare.substring(2); - if (rightString.equals("X")) { - right = CardFactoryUtil.xCount(hostCard, hostCard.getSVar("X")); - } else { - right = Integer.parseInt(presentCompare.substring(2)); - } - int left = list.size(); - - if (!AllZoneUtil.compare(left, presentCompare, right)) { - return false; - } - - } - - if (mapParams.containsKey("IsPresent2")) { - String sIsPresent = mapParams.get("IsPresent2"); - String presentCompare = "GE1"; - String presentZone = "Battlefield"; - String presentPlayer = "Any"; - if (mapParams.containsKey("PresentCompare2")) { - presentCompare = mapParams.get("PresentCompare2"); - } - if (mapParams.containsKey("PresentZone2")) { - presentZone = mapParams.get("PresentZone2"); - } - if (mapParams.containsKey("PresentPlayer2")) { - presentPlayer = mapParams.get("PresentPlayer2"); - } - CardList list = new CardList(); - if (presentPlayer.equals("You") || presentPlayer.equals("Any")) { - list.addAll(AllZoneUtil.getCardsInZone(presentZone, hostCard.getController())); - } - if (presentPlayer.equals("Opponent") || presentPlayer.equals("Any")) { - list.addAll(AllZoneUtil.getCardsInZone(presentZone, hostCard.getController().getOpponent())); - } - - list = list.getValidCards(sIsPresent.split(","), hostCard.getController(), hostCard); - - int right = 1; - String rightString = presentCompare.substring(2); - if (rightString.equals("X")) { - right = CardFactoryUtil.xCount(hostCard, hostCard.getSVar("X")); - } else { - right = Integer.parseInt(presentCompare.substring(2)); - } - int left = list.size(); - - if (!AllZoneUtil.compare(left, presentCompare, right)) { - return false; - } - - } - - if(mapParams.containsKey("CheckSVar")) { - String SVarName = mapParams.get("CheckSVar"); - String operator = "GE"; - String operand = "1"; - - if(mapParams.containsKey("SVarCompare")) - { - operator = mapParams.get("SVarCompare").substring(0,2); - operand = mapParams.get("SVarCompare").substring(2); - } - - int sVarResult = CardFactoryUtil.xCount(hostCard, hostCard.getSVar(SVarName)); - int operandResult = 0; - try { - operandResult = Integer.parseInt(operand); - } - catch ( Exception e) { - operandResult = CardFactoryUtil.xCount(hostCard, hostCard.getSVar(operand)); - } - - if(!AllZoneUtil.compare(sVarResult,operator,operandResult)) - { - return false; - } - - } - - return true; - } - - - /** - *

matchesValid.

- * - * @param o a {@link java.lang.Object} object. - * @param valids an array of {@link java.lang.String} objects. - * @param srcCard a {@link forge.Card} object. - * @return a boolean. - */ - public boolean matchesValid(Object o, String[] valids, Card srcCard) { - if (o instanceof Card) { - Card c = (Card) o; - return c.isValidCard(valids, srcCard.getController(), srcCard); - } - - if (o instanceof Player) { - for (String v : valids) { - if (v.equalsIgnoreCase("Player") || v.equalsIgnoreCase("Each")) { - return true; - } - if (v.equalsIgnoreCase("Opponent")) { - if (o.equals(srcCard.getController().getOpponent())) { - return true; - } - } - if (v.equalsIgnoreCase("You")) { - return o.equals(srcCard.getController()); - } - if (v.equalsIgnoreCase("EnchantedController")) { - return ((Player) o).isPlayer(srcCard.getEnchantingCard().getController()); - } - } - } - - return false; - } - - /** - *

isSecondary.

- * - * @return a boolean. - */ - public boolean isSecondary() { - if (mapParams.containsKey("Secondary")) { - if (mapParams.get("Secondary").equals("True")) - return true; - } - return false; - } - - /** {@inheritDoc} */ - @Override - public boolean equals(Object o) { - if (!(o instanceof Trigger)) - return false; - - return this.ID == ((Trigger) o).ID; - } - - /** - *

performTest.

- * - * @param runParams2 a {@link java.util.HashMap} object. - * @return a boolean. - */ - public abstract boolean performTest(java.util.Map runParams2); - - /** - *

getCopy.

- * - * @return a {@link forge.card.trigger.Trigger} object. - */ - public abstract Trigger getCopy(); - - /** - *

setTriggeringObjects.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public abstract void setTriggeringObjects(SpellAbility sa); - - protected boolean temporary = false; - - public void setTemporary(boolean temp) { - temporary = temp; - } - - public boolean isTemporary() { - return temporary; - } -} diff --git a/src/forge/card/trigger/TriggerHandler.java b/src/forge/card/trigger/TriggerHandler.java deleted file mode 100644 index bacbf82bdd0..00000000000 --- a/src/forge/card/trigger/TriggerHandler.java +++ /dev/null @@ -1,954 +0,0 @@ -package forge.card.trigger; - -import forge.*; -import forge.card.abilityFactory.AbilityFactory; -import forge.card.spellability.*; -import forge.gui.input.Input; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -/** - *

TriggerHandler class.

- * - * @author Forge - * @version $Id: $ - */ -public class TriggerHandler { - - private ArrayList registeredModes = new ArrayList(); - private ArrayList registeredTriggers = new ArrayList(); - private ArrayList suppressedModes = new ArrayList(); - - private ArrayList delayedTriggers = new ArrayList(); - - /** - *

suppressMode.

- * - * @param mode a {@link java.lang.String} object. - */ - public void suppressMode(String mode) { - suppressedModes.add(mode); - } - - /** - *

clearSuppression.

- * - * @param mode a {@link java.lang.String} object. - */ - public void clearSuppression(String mode) { - suppressedModes.remove(mode); - } - - /** - *

parseTrigger.

- * - * @param name a {@link java.lang.String} object. - * @param trigParse a {@link java.lang.String} object. - * @param host a {@link forge.Card} object. - * @return a {@link forge.card.trigger.Trigger} object. - */ - public static Trigger parseTrigger(String name, String trigParse, Card host) { - Trigger ret = TriggerHandler.parseTrigger(trigParse, host); - ret.setName(name); - return ret; - } - - /** - *

parseTrigger.

- * - * @param trigParse a {@link java.lang.String} object. - * @param host a {@link forge.Card} object. - * @return a {@link forge.card.trigger.Trigger} object. - */ - public static Trigger parseTrigger(String trigParse, Card host) { - HashMap mapParams = parseParams(trigParse); - return parseTrigger(mapParams, host); - } - - /** - *

parseTrigger.

- * - * @param mapParams a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - * @return a {@link forge.card.trigger.Trigger} object. - */ - public static Trigger parseTrigger(HashMap mapParams, Card host) { - Trigger ret = null; - - String mode = mapParams.get("Mode"); - if (mode.equals("AbilityCast")) { - ret = new Trigger_SpellAbilityCast(mapParams, host); - } else if (mode.equals("Always")) { - ret = new Trigger_Always(mapParams, host); - } else if (mode.equals("AttackerBlocked")) { - ret = new Trigger_AttackerBlocked(mapParams, host); - } else if (mode.equals("AttackerUnblocked")) { - ret = new Trigger_AttackerUnblocked(mapParams, host); - } else if (mode.equals("Attacks")) { - ret = new Trigger_Attacks(mapParams, host); - } else if (mode.equals("BecomesTarget")) { - ret = new Trigger_BecomesTarget(mapParams, host); - } else if (mode.equals("Blocks")) { - ret = new Trigger_Blocks(mapParams, host); - } else if (mode.equals("Championed")) { - ret = new Trigger_Championed(mapParams, host); - } else if (mode.equals("ChangesZone")) { - ret = new Trigger_ChangesZone(mapParams, host); - } else if (mode.equals("Clashed")) { - ret = new Trigger_Clashed(mapParams, host); - } else if (mode.equals("CounterAdded")) { - ret = new Trigger_CounterAdded(mapParams, host); - } else if (mode.equals("Cycled")) { - ret = new Trigger_Cycled(mapParams, host); - } else if (mode.equals("DamageDone")) { - ret = new Trigger_DamageDone(mapParams, host); - } else if (mode.equals("Discarded")) { - ret = new Trigger_Discarded(mapParams, host); - } else if (mode.equals("Drawn")) { - ret = new Trigger_Drawn(mapParams, host); - } else if (mode.equals("LandPlayed")) { - ret = new Trigger_LandPlayed(mapParams, host); - } else if (mode.equals("LifeGained")) { - ret = new Trigger_LifeGained(mapParams, host); - } else if (mode.equals("LifeLost")) { - ret = new Trigger_LifeLost(mapParams, host); - } else if (mode.equals("Phase")) { - ret = new Trigger_Phase(mapParams, host); - } else if (mode.equals("Sacrificed")) { - ret = new Trigger_Sacrificed(mapParams, host); - } else if (mode.equals("Shuffled")) { - ret = new Trigger_Shuffled(mapParams, host); - } else if (mode.equals("SpellAbilityCast")) { - ret = new Trigger_SpellAbilityCast(mapParams, host); - } else if (mode.equals("SpellCast")) { - ret = new Trigger_SpellAbilityCast(mapParams, host); - } else if (mode.equals("Taps")) { - ret = new Trigger_Taps(mapParams, host); - } else if (mode.equals("TapsForMana")) { - ret = new Trigger_TapsForMana(mapParams, host); - } else if (mode.equals("TurnFaceUp")) { - ret = new Trigger_TurnFaceUp(mapParams, host); - } else if (mode.equals("Unequip")) { - ret = new Trigger_Unequip(mapParams, host); - } else if (mode.equals("Untaps")) { - ret = new Trigger_Untaps(mapParams, host); - } - - return ret; - } - - /** - *

parseParams.

- * - * @param trigParse a {@link java.lang.String} object. - * @return a {@link java.util.HashMap} object. - */ - private static HashMap parseParams(String trigParse) { - HashMap mapParams = new HashMap(); - - if (trigParse.length() == 0) - throw new RuntimeException("TriggerFactory : registerTrigger -- trigParse too short"); - - String params[] = trigParse.split("\\|"); - - for (int i = 0; i < params.length; i++) { - params[i] = params[i].trim(); - } - - for (String param : params) { - String[] splitParam = param.split("\\$"); - for (int i = 0; i < splitParam.length; i++) { - splitParam[i] = splitParam[i].trim(); - } - - if (splitParam.length != 2) { - StringBuilder sb = new StringBuilder(); - sb.append("TriggerFactory Parsing Error in registerTrigger() : Split length of "); - sb.append(param).append(" is not 2."); - throw new RuntimeException(sb.toString()); - } - - mapParams.put(splitParam[0], splitParam[1]); - } - - return mapParams; - } - - /** - *

registerDelayedTrigger.

- * - * @param trig a {@link forge.card.trigger.Trigger} object. - */ - public void registerDelayedTrigger(Trigger trig) { - delayedTriggers.add(trig); - - String mode = trig.getMapParams().get("Mode"); - if (!registeredModes.contains(mode)) - registeredModes.add(mode); - } - - /** - *

registerTrigger.

- * - * @param trig a {@link forge.card.trigger.Trigger} object. - */ - public void registerTrigger(Trigger trig) { - registeredTriggers.add(trig); - - String mode = trig.getMapParams().get("Mode"); - if (!registeredModes.contains(mode)) - registeredModes.add(mode); - } - - /** - *

clearRegistered.

- */ - public void clearRegistered() { - delayedTriggers.clear(); - registeredTriggers.clear(); - registeredModes.clear(); - } - - /** - *

removeRegisteredTrigger.

- * - * @param trig a {@link forge.card.trigger.Trigger} object. - */ - public void removeRegisteredTrigger(Trigger trig) { - for (int i = 0; i < registeredTriggers.size(); i++) { - if (registeredTriggers.get(i).equals(trig)) - registeredTriggers.remove(i); - } - } - - public void removeTemporaryTriggers() { - for (int i = 0; i < registeredTriggers.size(); i++) { - if (registeredTriggers.get(i).isTemporary()) { - registeredTriggers.get(i).hostCard.removeTrigger(registeredTriggers.get(i)); - registeredTriggers.remove(i); - } - } - } - - /** - *

Getter for the field registeredTriggers.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getRegisteredTriggers() { - return registeredTriggers; - } - - /** - *

removeAllFromCard.

- * - * @param crd a {@link forge.Card} object. - */ - public void removeAllFromCard(Card crd) { - for (int i = 0; i < registeredTriggers.size(); i++) { - if (registeredTriggers.get(i).getHostCard().equals(crd)) { - registeredTriggers.remove(i); - i--; - } - } - } - - /** - *

runTrigger.

- * - * @param mode a {@link java.lang.String} object. - * @param runParams a {@link java.util.Map} object. - */ - public void runTrigger(String mode, Map runParams) { - if (suppressedModes.contains(mode) || !registeredModes.contains(mode)) { - return; - } - //AP - for (Trigger regtrig : registeredTriggers) { - if (regtrig.getHostCard().getController().equals(AllZone.getPhase().getPlayerTurn())) { - runSingleTrigger(regtrig, mode, runParams); - } - } - for (int i = 0; i < delayedTriggers.size(); i++) { - Trigger deltrig = delayedTriggers.get(i); - if (deltrig.getHostCard().getController().equals(AllZone.getPhase().getPlayerTurn())) { - if (runSingleTrigger(deltrig, mode, runParams)) { - delayedTriggers.remove(i); - i--; - } - } - } - - //NAP - for (Trigger regtrig : registeredTriggers) { - if (regtrig.getHostCard().getController().equals(AllZone.getPhase().getPlayerTurn().getOpponent())) { - runSingleTrigger(regtrig, mode, runParams); - } - } - for (int i = 0; i < delayedTriggers.size(); i++) { - Trigger deltrig = delayedTriggers.get(i); - if (deltrig.getHostCard().getController().equals(AllZone.getPhase().getPlayerTurn().getOpponent())) { - if (runSingleTrigger(deltrig, mode, runParams)) { - delayedTriggers.remove(i); - i--; - } - } - } - } - - //Checks if the conditions are right for a single trigger to go off, and runs it if so. - //Return true if the trigger went off, false otherwise. - /** - *

runSingleTrigger.

- * - * @param regtrig a {@link forge.card.trigger.Trigger} object. - * @param mode a {@link java.lang.String} object. - * @param runParams a {@link java.util.HashMap} object. - * @return a boolean. - */ - private boolean runSingleTrigger(final Trigger regtrig, final String mode, final Map runParams) { - if (!regtrig.zonesCheck()) { - return false; - } - if (!regtrig.phasesCheck()) { - return false; - } - if (!regtrig.requirementsCheck()) { - return false; - } - if (regtrig.getHostCard().isFaceDown()) { - return false; - } - if(regtrig instanceof Trigger_Always) { - if(AllZone.getStack().hasStateTrigger(regtrig.ID)) - { - return false; //State triggers that are already on the stack don't trigger again. - } - } - - HashMap trigParams = regtrig.getMapParams(); - final Player[] decider = new Player[1]; - //final boolean isOptional = false; - - if (mode.equals(trigParams.get("Mode"))) { - if (!regtrig.performTest(runParams)) { - return false; - } - - // Any trigger should cause the phase not to skip - AllZone.getPhase().setSkipPhase(false); - - regtrig.setRunParams(runParams); - - //All tests passed, execute ability. - if (regtrig instanceof Trigger_TapsForMana) { - Ability_Mana abMana = (Ability_Mana) runParams.get("Ability_Mana"); - if (null != abMana) abMana.setUndoable(false); - } - - AbilityFactory AF = new AbilityFactory(); - - final SpellAbility[] sa = new SpellAbility[1]; - Card host = AllZoneUtil.getCardState(regtrig.getHostCard()); - - if (host == null) - host = regtrig.getHostCard(); - - // This will fix the Oblivion Ring issue, but is this the right fix? - for (Object o : regtrig.getHostCard().getRemembered()) { - if (!host.getRemembered().contains(o)) { - host.addRemembered(o); - } - } - - sa[0] = regtrig.getOverridingAbility(); - if (sa[0] == null) { - if (!trigParams.containsKey("Execute")) { - sa[0] = new Ability(regtrig.getHostCard(), "0") { - @Override - public void resolve() { - } - }; - } else { - sa[0] = AF.getAbility(host.getSVar(trigParams.get("Execute")), host); - } - } - sa[0].setTrigger(true); - sa[0].setSourceTrigger(regtrig.ID); - regtrig.setTriggeringObjects(sa[0]); - if (regtrig.getStoredTriggeredObjects() != null) - sa[0].setAllTriggeringObjects(regtrig.getStoredTriggeredObjects()); - - sa[0].setActivatingPlayer(host.getController()); - sa[0].setStackDescription(sa[0].toString()); - - boolean mand = false; - if (trigParams.containsKey("OptionalDecider")) { - mand = false; - decider[0] = AbilityFactory.getDefinedPlayers(host, trigParams.get("OptionalDecider"), sa[0]).get(0); - } else { - mand = true; - - SpellAbility ability = sa[0]; - while(ability != null){ - Target tgt = ability.getTarget(); - - if (tgt != null) { - tgt.setMandatory(true); - } - ability = ability.getSubAbility(); - } - } - final boolean isMandatory = mand; - - //Wrapper ability that checks the requirements again just before resolving, for intervening if clauses. - //Yes, it must wrap ALL SpellAbility methods in order to handle possible corner cases. - //(The trigger can have a hardcoded OverridingAbility which can make use of any of the methods) - final Ability wrapperAbility = new Ability(regtrig.getHostCard(), "0") { - - @Override - public boolean isWrapper() { - return true; - } - - @Override - public void setPaidHash(HashMap hash) { - sa[0].setPaidHash(hash); - } - - @Override - public HashMap getPaidHash() { - return sa[0].getPaidHash(); - } - - @Override - public void setPaidList(CardList list, String str) { - sa[0].setPaidList(list, str); - } - - @Override - public CardList getPaidList(String str) { - return sa[0].getPaidList(str); - } - - @Override - public void addCostToHashList(Card c, String str) { - sa[0].addCostToHashList(c, str); - } - - @Override - public void resetPaidHash() { - sa[0].resetPaidHash(); - } - - @Override - public HashMap getTriggeringObjects() { - return sa[0].getTriggeringObjects(); - } - - @Override - public void setAllTriggeringObjects(HashMap triggeredObjects) { - sa[0].setAllTriggeringObjects(triggeredObjects); - } - - @Override - public void setTriggeringObject(String type, Object o) { - sa[0].setTriggeringObject(type, o); - } - - @Override - public Object getTriggeringObject(String type) { - return sa[0].getTriggeringObject(type); - } - - @Override - public boolean hasTriggeringObject(String type) { - return sa[0].hasTriggeringObject(type); - } - - @Override - public void resetTriggeringObjects() { - sa[0].resetTriggeringObjects(); - } - - @Override - public boolean canPlay() { - return sa[0].canPlay(); - } - - @Override - public boolean canPlayAI() { - return sa[0].canPlayAI(); - } - - @Override - public void chooseTargetAI() { - sa[0].chooseTargetAI(); - } - - @Override - public SpellAbility copy() { - return sa[0].copy(); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return sa[0].doTrigger(mandatory); - } - - @Override - public AbilityFactory getAbilityFactory() { - return sa[0].getAbilityFactory(); - } - - @Override - public Player getActivatingPlayer() { - return sa[0].getActivatingPlayer(); - } - - @Override - public Input getAfterPayMana() { - return sa[0].getAfterPayMana(); - } - - @Override - public Input getAfterResolve() { - return sa[0].getAfterResolve(); - } - - @Override - public Input getBeforePayMana() { - return sa[0].getBeforePayMana(); - } - - @Override - public Command getBeforePayManaAI() { - return sa[0].getBeforePayManaAI(); - } - - @Override - public Command getCancelCommand() { - return sa[0].getCancelCommand(); - } - - @Override - public CommandArgs getChooseTargetAI() { - return sa[0].getChooseTargetAI(); - } - - @Override - public String getDescription() { - return sa[0].getDescription(); - } - - @Override - public String getMultiKickerManaCost() { - return sa[0].getMultiKickerManaCost(); - } - - @Override - public String getReplicateManaCost() { - return sa[0].getReplicateManaCost(); - } - - @Override - public SpellAbility_Restriction getRestrictions() { - return sa[0].getRestrictions(); - } - - @Override - public Card getSourceCard() { - return sa[0].getSourceCard(); - } - - @Override - public String getStackDescription() { - StringBuilder sb = new StringBuilder(regtrig.toString()); - if (getTarget() != null) { - sb.append(" (Targeting "); - for (Object o : getTarget().getTargets()) { - sb.append(o.toString()); - sb.append(", "); - } - if (sb.toString().endsWith(", ")) { - sb.setLength(sb.length() - 2); - } else { - sb.append("ERROR"); - } - sb.append(")"); - } - - return sb.toString(); - } - - @Override - public Ability_Sub getSubAbility() { - return sa[0].getSubAbility(); - } - - @Override - public Target getTarget() { - return sa[0].getTarget(); - } - - @Override - public Card getTargetCard() { - return sa[0].getTargetCard(); - } - - @Override - public CardList getTargetList() { - return sa[0].getTargetList(); - } - - @Override - public Player getTargetPlayer() { - return sa[0].getTargetPlayer(); - } - - @Override - public String getXManaCost() { - return sa[0].getXManaCost(); - } - - @Override - public boolean isAbility() { - return sa[0].isAbility(); - } - - @Override - public boolean isBuyBackAbility() { - return sa[0].isBuyBackAbility(); - } - - @Override - public boolean isCycling() { - return sa[0].isCycling(); - } - - @Override - public boolean isExtrinsic() { - return sa[0].isExtrinsic(); - } - - @Override - public boolean isFlashBackAbility() { - return sa[0].isFlashBackAbility(); - } - - @Override - public boolean isIntrinsic() { - return sa[0].isIntrinsic(); - } - - @Override - public boolean isKickerAbility() { - return sa[0].isKickerAbility(); - } - - @Override - public boolean isKothThirdAbility() { - return sa[0].isKothThirdAbility(); - } - - @Override - public boolean isMultiKicker() { - return sa[0].isMultiKicker(); - } - - @Override - public boolean isReplicate() { - return sa[0].isReplicate(); - } - - @Override - public boolean isSpell() { - return sa[0].isSpell(); - } - - @Override - public boolean isTapAbility() { - return sa[0].isTapAbility(); - } - - @Override - public boolean isUntapAbility() { - return sa[0].isUntapAbility(); - } - - @Override - public boolean isXCost() { - return sa[0].isXCost(); - } - - @Override - public void resetOnceResolved() { - // Fixing an issue with Targeting + Paying Mana - //sa[0].resetOnceResolved(); - } - - @Override - public void setAbilityFactory(AbilityFactory af) { - sa[0].setAbilityFactory(af); - } - - @Override - public void setActivatingPlayer(Player player) { - sa[0].setActivatingPlayer(player); - } - - @Override - public void setAdditionalManaCost(String cost) { - sa[0].setAdditionalManaCost(cost); - } - - @Override - public void setAfterPayMana(Input in) { - sa[0].setAfterPayMana(in); - } - - @Override - public void setAfterResolve(Input in) { - sa[0].setAfterResolve(in); - } - - @Override - public void setBeforePayMana(Input in) { - sa[0].setBeforePayMana(in); - } - - @Override - public void setBeforePayManaAI(Command c) { - sa[0].setBeforePayManaAI(c); - } - - @Override - public void setCancelCommand(Command cancelCommand) { - sa[0].setCancelCommand(cancelCommand); - } - - @Override - public void setChooseTargetAI(CommandArgs c) { - sa[0].setChooseTargetAI(c); - } - - @Override - public void setDescription(String s) { - sa[0].setDescription(s); - } - - @Override - public void setFlashBackAbility(boolean flashBackAbility) { - sa[0].setFlashBackAbility(flashBackAbility); - } - - @Override - public void setIsBuyBackAbility(boolean b) { - sa[0].setIsBuyBackAbility(b); - } - - @Override - public void setIsCycling(boolean b) { - sa[0].setIsCycling(b); - } - - @Override - public void setIsMultiKicker(boolean b) { - sa[0].setIsMultiKicker(b); - } - - @Override - public void setIsReplicate(boolean b) { - sa[0].setIsReplicate(b); - } - - @Override - public void setIsXCost(boolean b) { - sa[0].setIsXCost(b); - } - - @Override - public void setKickerAbility(boolean kab) { - sa[0].setKickerAbility(kab); - } - - @Override - public void setKothThirdAbility(boolean kothThirdAbility) { - sa[0].setKothThirdAbility(kothThirdAbility); - } - - @Override - public void setManaCost(String cost) { - sa[0].setManaCost(cost); - } - - @Override - public void setMultiKickerManaCost(String cost) { - sa[0].setMultiKickerManaCost(cost); - } - - @Override - public void setReplicateManaCost(String cost) { - sa[0].setReplicateManaCost(cost); - } - - @Override - public void setPayCosts(Cost abCost) { - sa[0].setPayCosts(abCost); - } - - @Override - public void setRestrictions(SpellAbility_Restriction restrict) { - sa[0].setRestrictions(restrict); - } - - @Override - public void setSourceCard(Card c) { - sa[0].setSourceCard(c); - } - - @Override - public void setStackDescription(String s) { - sa[0].setStackDescription(s); - } - - @Override - public void setSubAbility(Ability_Sub subAbility) { - sa[0].setSubAbility(subAbility); - } - - @Override - public void setTarget(Target tgt) { - sa[0].setTarget(tgt); - } - - @Override - public void setTargetCard(Card card) { - sa[0].setTargetCard(card); - } - - @Override - public void setTargetList(CardList list) { - sa[0].setTargetList(list); - } - - @Override - public void setTargetPlayer(Player p) { - sa[0].setTargetPlayer(p); - } - - @Override - public void setType(String s) { - sa[0].setType(s); - } - - @Override - public void setXManaCost(String cost) { - sa[0].setXManaCost(cost); - } - - @Override - public boolean wasCancelled() { - return sa[0].wasCancelled(); - } - - @Override - public void setSourceTrigger(int ID) { - sa[0].setSourceTrigger(ID); - } - - @Override - public int getSourceTrigger() { - return sa[0].getSourceTrigger(); - } - - //////////////////////////////////////// - //THIS ONE IS ALL THAT MATTERS - //////////////////////////////////////// - @Override - public void resolve() { - if(!(regtrig instanceof Trigger_Always)) //State triggers don't do the whole "Intervening If" thing. - { - if (!regtrig.requirementsCheck()) { - return; - } - } - - if (decider[0] != null) { - if (decider[0].isHuman()) { - StringBuilder buildQuestion = new StringBuilder("Use triggered ability of "); - buildQuestion.append(regtrig.getHostCard().getName()).append("(").append(regtrig.getHostCard().getUniqueNumber()).append(")?"); - buildQuestion.append("\r\n("); - buildQuestion.append(regtrig.getMapParams().get("TriggerDescription").replace("CARDNAME", regtrig.getHostCard().getName())); - buildQuestion.append(")"); - if (!GameActionUtil.showYesNoDialog(regtrig.getHostCard(), buildQuestion.toString())) { - return; - } - } else { - // This isn't quite right, but better than canPlayAI - if (!sa[0].doTrigger(isMandatory)) { - return; - } - } - } - - if (sa[0].getSourceCard().getController().isHuman()) { - //Card src = (Card)(sa[0].getSourceCard().getTriggeringObject("Card")); - //System.out.println("Trigger resolving for "+mode+". Card = "+src); - AllZone.getGameAction().playSpellAbility_NoStack(sa[0], true); - } else { - // commented out because i don't think this should be called again here - //sa[0].doTrigger(isMandatory); - ComputerUtil.playNoStack(sa[0]); - } - - //Add eventual delayed trigger. - if (regtrig.getMapParams().containsKey("DelayedTrigger")) { - String SVarName = regtrig.getMapParams().get("DelayedTrigger"); - Trigger deltrig = parseTrigger(regtrig.getHostCard().getSVar(SVarName), regtrig.getHostCard()); - deltrig.setStoredTriggeredObjects(this.getTriggeringObjects()); - registerDelayedTrigger(deltrig); - } - } - }; - wrapperAbility.setTrigger(true); - wrapperAbility.setMandatory(isMandatory); - wrapperAbility.setDescription(wrapperAbility.getStackDescription()); - /* - if(host.getController().isHuman()) - { - AllZone.getGameAction().playSpellAbility(wrapperAbility); - } - else - { - wrapperAbility.doTrigger(isMandatory); - ComputerUtil.playStack(wrapperAbility); - } - */ - - //Card src = (Card)(sa[0].getSourceCard().getTriggeringObject("Card")); - //System.out.println("Trigger going on stack for "+mode+". Card = "+src); - - if(regtrig.getMapParams().containsKey("Static")) - { - if(regtrig.getMapParams().get("Static").equals("True")) - { - AllZone.getGameAction().playSpellAbility_NoStack(wrapperAbility,false); - } - else - { - AllZone.getStack().addSimultaneousStackEntry(wrapperAbility); - } - } - else - { - AllZone.getStack().addSimultaneousStackEntry(wrapperAbility); - } - return true; - } - - return false; - } -} diff --git a/src/forge/card/trigger/Trigger_AttackerBlocked.java b/src/forge/card/trigger/Trigger_AttackerBlocked.java deleted file mode 100644 index d57db3629e6..00000000000 --- a/src/forge/card/trigger/Trigger_AttackerBlocked.java +++ /dev/null @@ -1,64 +0,0 @@ -package forge.card.trigger; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -import java.util.HashMap; -import java.util.Map; - -/** - *

Trigger_AttackerBlocked class.

- * - * @author Forge - * @version $Id: $ - */ -public class Trigger_AttackerBlocked extends Trigger { - - /** - *

Constructor for Trigger_AttackerBlocked.

- * - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger_AttackerBlocked(HashMap params, Card host) { - super(params, host); - } - - /** {@inheritDoc} */ - @Override - public boolean performTest(Map runParams) { - if (mapParams.containsKey("ValidCard")) { - if (!matchesValid(runParams.get("Attacker"), mapParams.get("ValidCard").split(","), hostCard)) { - return false; - } - } - if (mapParams.containsKey("ValidBlocker")) { - if (!matchesValid(runParams.get("Blocker"), mapParams.get("ValidBlocker").split(","), hostCard)) { - return false; - } - } - - return true; - } - - /** {@inheritDoc} */ - @Override - public Trigger getCopy() { - Trigger copy = new Trigger_AttackerBlocked(mapParams, hostCard); - if (overridingAbility != null) { - copy.setOverridingAbility(overridingAbility); - } - copy.setName(name); - copy.setID(ID); - - return copy; - } - - /** {@inheritDoc} */ - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("Attacker", runParams.get("Attacker")); - sa.setTriggeringObject("Blocker", runParams.get("Blocker")); - sa.setTriggeringObject("NumBlockers", runParams.get("NumBlockers")); - } -} diff --git a/src/forge/card/trigger/Trigger_AttackerUnblocked.java b/src/forge/card/trigger/Trigger_AttackerUnblocked.java deleted file mode 100644 index 71d7590093f..00000000000 --- a/src/forge/card/trigger/Trigger_AttackerUnblocked.java +++ /dev/null @@ -1,57 +0,0 @@ -package forge.card.trigger; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -import java.util.HashMap; -import java.util.Map; - -/** - *

Trigger_AttackerUnblocked class.

- * - * @author Forge - * @version $Id: $ - */ -public class Trigger_AttackerUnblocked extends Trigger { - - /** - *

Constructor for Trigger_AttackerUnblocked.

- * - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger_AttackerUnblocked(HashMap params, Card host) { - super(params, host); - } - - /** {@inheritDoc} */ - @Override - public boolean performTest(Map runParams) { - if (mapParams.containsKey("ValidCard")) { - if (!matchesValid(runParams.get("Attacker"), mapParams.get("ValidCard").split(","), hostCard)) { - return false; - } - } - - return true; - } - - /** {@inheritDoc} */ - @Override - public Trigger getCopy() { - Trigger copy = new Trigger_AttackerUnblocked(mapParams, hostCard); - if (overridingAbility != null) { - copy.setOverridingAbility(overridingAbility); - } - copy.setName(name); - copy.setID(ID); - - return copy; - } - - /** {@inheritDoc} */ - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("Attacker", runParams.get("Attacker")); - } -} diff --git a/src/forge/card/trigger/Trigger_Attacks.java b/src/forge/card/trigger/Trigger_Attacks.java deleted file mode 100644 index 27c43bec478..00000000000 --- a/src/forge/card/trigger/Trigger_Attacks.java +++ /dev/null @@ -1,74 +0,0 @@ -package forge.card.trigger; - -import forge.Card; -import forge.CardList; -import forge.card.spellability.SpellAbility; - -import java.util.HashMap; -import java.util.Map; - -/** - *

Trigger_Attacks class.

- * - * @author Forge - * @version $Id: $ - */ -public class Trigger_Attacks extends Trigger { - - /** - *

Constructor for Trigger_Attacks.

- * - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger_Attacks(HashMap params, Card host) { - super(params, host); - } - - /** {@inheritDoc} */ - @Override - public boolean performTest(Map runParams) { - if (mapParams.containsKey("ValidCard")) { - if (!matchesValid(runParams.get("Attacker"), mapParams.get("ValidCard").split(","), hostCard)) { - return false; - } - } - - if (mapParams.containsKey("Alone")) { - CardList otherAttackers = (CardList) runParams.get("OtherAttackers"); - if (otherAttackers == null) { - return false; - } - if (mapParams.get("Alone").equals("True")) { - if (otherAttackers.size() != 0) { - return false; - } - } else { - if (otherAttackers.size() == 0) { - return false; - } - } - } - - return true; - } - - /** {@inheritDoc} */ - @Override - public Trigger getCopy() { - Trigger copy = new Trigger_Attacks(mapParams, hostCard); - if (overridingAbility != null) { - copy.setOverridingAbility(overridingAbility); - } - copy.setName(name); - copy.setID(ID); - - return copy; - } - - /** {@inheritDoc} */ - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("Attacker", runParams.get("Attacker")); - } -} diff --git a/src/forge/card/trigger/Trigger_Blocks.java b/src/forge/card/trigger/Trigger_Blocks.java deleted file mode 100644 index 1c56b5b85fd..00000000000 --- a/src/forge/card/trigger/Trigger_Blocks.java +++ /dev/null @@ -1,64 +0,0 @@ -package forge.card.trigger; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -import java.util.HashMap; -import java.util.Map; - - -/** - *

Trigger_Blocks class.

- * - * @author Forge - * @version $Id: $ - */ -public class Trigger_Blocks extends Trigger { - - /** - *

Constructor for Trigger_Blocks.

- * - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger_Blocks(HashMap params, Card host) { - super(params, host); - } - - /** {@inheritDoc} */ - @Override - public boolean performTest(Map runParams) { - if (mapParams.containsKey("ValidCard")) { - if (!matchesValid(runParams.get("Blocker"), mapParams.get("ValidCard").split(","), hostCard)) { - return false; - } - } - if (mapParams.containsKey("ValidBlocked")) { - if (!matchesValid(runParams.get("Attacker"), mapParams.get("ValidBlocked").split(","), hostCard)) { - return false; - } - } - - return true; - } - - /** {@inheritDoc} */ - @Override - public Trigger getCopy() { - Trigger copy = new Trigger_Blocks(mapParams, hostCard); - if (overridingAbility != null) { - copy.setOverridingAbility(overridingAbility); - } - copy.setName(name); - copy.setID(ID); - - return copy; - } - - /** {@inheritDoc} */ - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("Blocker", runParams.get("Blocker")); - sa.setTriggeringObject("Attacker", runParams.get("Attacker")); - } -} diff --git a/src/forge/card/trigger/Trigger_ChangesZone.java b/src/forge/card/trigger/Trigger_ChangesZone.java deleted file mode 100644 index 12a4effdde1..00000000000 --- a/src/forge/card/trigger/Trigger_ChangesZone.java +++ /dev/null @@ -1,76 +0,0 @@ -package forge.card.trigger; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -import java.util.HashMap; - -/** - *

Trigger_ChangesZone class.

- * - * @author Forge - * @version $Id: $ - */ -public class Trigger_ChangesZone extends Trigger { - - /** - *

Constructor for Trigger_ChangesZone.

- * - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger_ChangesZone(HashMap params, Card host) { - super(params, host); - } - - /** {@inheritDoc} */ - @Override - public boolean performTest(java.util.Map runParams) { - if (mapParams.containsKey("Origin")) { - if (!mapParams.get("Origin").equals("Any")) { - if (mapParams.get("Origin") == null) { - return false; - } - if (!mapParams.get("Origin").equals((String) runParams.get("Origin"))) { - return false; - } - } - } - - if (mapParams.containsKey("Destination")) { - if (!mapParams.get("Destination").equals("Any")) { - if (!mapParams.get("Destination").equals((String) runParams.get("Destination"))) { - return false; - } - } - } - - if (mapParams.containsKey("ValidCard")) { - Card moved = (Card) runParams.get("Card"); - if (!moved.isValidCard(mapParams.get("ValidCard").split(","), hostCard.getController(), hostCard)) { - return false; - } - } - - return true; - } - - /** {@inheritDoc} */ - @Override - public Trigger getCopy() { - Trigger copy = new Trigger_ChangesZone(mapParams, hostCard); - if (overridingAbility != null) { - copy.setOverridingAbility(overridingAbility); - } - copy.setName(name); - copy.setID(ID); - - return copy; - } - - /** {@inheritDoc} */ - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("Card", runParams.get("Card")); - } -} diff --git a/src/forge/card/trigger/Trigger_Clashed.java b/src/forge/card/trigger/Trigger_Clashed.java deleted file mode 100644 index 8f91163134d..00000000000 --- a/src/forge/card/trigger/Trigger_Clashed.java +++ /dev/null @@ -1,61 +0,0 @@ -package forge.card.trigger; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -import java.util.HashMap; - -/** - *

Trigger_Clashed class.

- * - * @author Forge - * @version $Id: $ - */ -public class Trigger_Clashed extends Trigger { - - /** - *

Constructor for Trigger_Clashed.

- * - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger_Clashed(HashMap params, Card host) { - super(params, host); - } - - /** {@inheritDoc} */ - @Override - public boolean performTest(java.util.Map runParams) { - if (mapParams.containsKey("ValidPlayer")) { - if (!matchesValid(runParams.get("Player"), mapParams.get("ValidPlayer").split(","), hostCard)) { - return false; - } - } - - if (mapParams.containsKey("Won")) { - if (!mapParams.get("Won").equals(runParams.get("Won"))) - return false; - } - - return true; - } - - /** {@inheritDoc} */ - @Override - public Trigger getCopy() { - Trigger copy = new Trigger_Clashed(mapParams, hostCard); - if (overridingAbility != null) { - copy.setOverridingAbility(overridingAbility); - } - copy.setName(name); - copy.setID(ID); - - return copy; - } - - /** {@inheritDoc} */ - @Override - public void setTriggeringObjects(SpellAbility sa) { - //No triggered-variables for you :( - } -} diff --git a/src/forge/card/trigger/Trigger_CounterAdded.java b/src/forge/card/trigger/Trigger_CounterAdded.java deleted file mode 100644 index d9b3e012851..00000000000 --- a/src/forge/card/trigger/Trigger_CounterAdded.java +++ /dev/null @@ -1,67 +0,0 @@ -package forge.card.trigger; - -import forge.Card; -import forge.Counters; -import forge.card.spellability.SpellAbility; - -import java.util.HashMap; - -/** - *

Trigger_CounterAdded class.

- * - * @author Forge - * @version $Id: $ - */ -public class Trigger_CounterAdded extends Trigger { - - /** - *

Constructor for Trigger_CounterAdded.

- * - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger_CounterAdded(HashMap params, Card host) { - super(params, host); - } - - /** {@inheritDoc} */ - @Override - public boolean performTest(java.util.Map runParams) { - Card addedTo = (Card) runParams.get("Card"); - Counters addedType = (Counters) runParams.get("CounterType"); - - if (mapParams.containsKey("ValidCard")) { - if (!addedTo.isValidCard(mapParams.get("ValidCard").split(","), hostCard.getController(), hostCard)) { - return false; - } - } - - if (mapParams.containsKey("CounterType")) { - String type = mapParams.get("CounterType"); - if (!type.equals(addedType.toString())) { - return false; - } - } - - return true; - } - - /** {@inheritDoc} */ - @Override - public Trigger getCopy() { - Trigger copy = new Trigger_CounterAdded(mapParams, hostCard); - if (overridingAbility != null) { - copy.setOverridingAbility(overridingAbility); - } - copy.setName(name); - copy.setID(ID); - - return copy; - } - - /** {@inheritDoc} */ - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("Card", runParams.get("Card")); - } -} diff --git a/src/forge/card/trigger/Trigger_Cycled.java b/src/forge/card/trigger/Trigger_Cycled.java deleted file mode 100644 index 441ff46f2b4..00000000000 --- a/src/forge/card/trigger/Trigger_Cycled.java +++ /dev/null @@ -1,56 +0,0 @@ -package forge.card.trigger; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -import java.util.HashMap; - -/** - *

Trigger_Cycled class.

- * - * @author Forge - * @version $Id: $ - */ -public class Trigger_Cycled extends Trigger { - - /** - *

Constructor for Trigger_Cycled.

- * - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger_Cycled(HashMap params, Card host) { - super(params, host); - } - - /** {@inheritDoc} */ - @Override - public Trigger getCopy() { - Trigger copy = new Trigger_Cycled(mapParams, hostCard); - if (overridingAbility != null) { - copy.setOverridingAbility(overridingAbility); - } - copy.setName(name); - copy.setID(ID); - - return copy; - } - - /** {@inheritDoc} */ - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("Card", runParams.get("Card")); - } - - /** {@inheritDoc} */ - @Override - public boolean performTest(java.util.Map runParams) { - if (mapParams.containsKey("ValidCard")) { - if (!matchesValid(runParams.get("Card"), mapParams.get("ValidCard").split(","), hostCard)) { - return false; - } - } - return true; - } - -} diff --git a/src/forge/card/trigger/Trigger_DamageDone.java b/src/forge/card/trigger/Trigger_DamageDone.java deleted file mode 100644 index 34de1df3bf2..00000000000 --- a/src/forge/card/trigger/Trigger_DamageDone.java +++ /dev/null @@ -1,94 +0,0 @@ -package forge.card.trigger; - -import forge.AllZoneUtil; -import forge.Card; -import forge.card.spellability.SpellAbility; - -import java.util.HashMap; - -/** - *

Trigger_DamageDone class.

- * - * @author Forge - * @version $Id: $ - */ -public class Trigger_DamageDone extends Trigger { - - /** - *

Constructor for Trigger_DamageDone.

- * - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger_DamageDone(HashMap params, Card host) { - super(params, host); - } - - /** {@inheritDoc} */ - @Override - public boolean performTest(java.util.Map runParams) { - Card src = (Card) runParams.get("DamageSource"); - Object tgt = runParams.get("DamageTarget"); - - if (mapParams.containsKey("ValidSource")) { - if (!src.isValidCard(mapParams.get("ValidSource").split(","), hostCard.getController(), hostCard)) { - return false; - } - } - - if (mapParams.containsKey("ValidTarget")) { - if (!matchesValid(tgt, mapParams.get("ValidTarget").split(","), hostCard)) { - return false; - } - } - - if (mapParams.containsKey("CombatDamage")) { - if (mapParams.get("CombatDamage").equals("True")) { - if (!((Boolean) runParams.get("IsCombatDamage"))) - return false; - } else if (mapParams.get("CombatDamage").equals("False")) { - if (((Boolean) runParams.get("IsCombatDamage"))) - return false; - } - } - - if (mapParams.containsKey("DamageAmount")) { - String fullParam = mapParams.get("DamageAmount"); - - String operator = fullParam.substring(0, 2); - int operand = Integer.parseInt(fullParam.substring(2)); - int actualAmount = (Integer) runParams.get("DamageAmount"); - - if (AllZoneUtil.compare(actualAmount, operator, operand)) - return false; - - System.out.print("DamageDone Amount Operator: "); - System.out.println(operator); - System.out.print("DamageDone Amount Operand: "); - System.out.println(operand); - } - - return true; - } - - /** {@inheritDoc} */ - @Override - public Trigger getCopy() { - Trigger copy = new Trigger_DamageDone(mapParams, hostCard); - if (overridingAbility != null) { - copy.setOverridingAbility(overridingAbility); - } - copy.setName(name); - copy.setID(ID); - - return copy; - } - - /** {@inheritDoc} */ - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("Source", runParams.get("DamageSource")); - sa.setTriggeringObject("Target", runParams.get("DamageTarget")); - sa.setTriggeringObject("DamageAmount", runParams.get("DamageAmount")); - } -} diff --git a/src/forge/card/trigger/Trigger_Discarded.java b/src/forge/card/trigger/Trigger_Discarded.java deleted file mode 100644 index 85114abc923..00000000000 --- a/src/forge/card/trigger/Trigger_Discarded.java +++ /dev/null @@ -1,70 +0,0 @@ -package forge.card.trigger; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -import java.util.HashMap; - -/** - *

Trigger_Discarded class.

- * - * @author Forge - * @version $Id: $ - */ -public class Trigger_Discarded extends Trigger { - - /** - *

Constructor for Trigger_Discarded.

- * - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger_Discarded(HashMap params, Card host) { - super(params, host); - } - - /** {@inheritDoc} */ - @Override - public boolean performTest(java.util.Map runParams) { - if (mapParams.containsKey("ValidCard")) { - if (!matchesValid(runParams.get("Card"), mapParams.get("ValidCard").split(","), hostCard)) { - return false; - } - } - - if (mapParams.containsKey("ValidPlayer")) { - if (!matchesValid(runParams.get("Player"), mapParams.get("ValidPlayer").split(","), hostCard)) { - return false; - } - } - - if (mapParams.containsKey("ValidCause")) { - if (runParams.get("Cause") == null) { - return false; - } - if (!matchesValid(runParams.get("Cause"), mapParams.get("ValidCause").split(","), hostCard)) { - return false; - } - } - return true; - } - - /** {@inheritDoc} */ - @Override - public Trigger getCopy() { - Trigger copy = new Trigger_Discarded(mapParams, hostCard); - if (overridingAbility != null) { - copy.setOverridingAbility(overridingAbility); - } - copy.setName(name); - copy.setID(ID); - - return copy; - } - - /** {@inheritDoc} */ - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("Card", runParams.get("Card")); - } -} diff --git a/src/forge/card/trigger/Trigger_Drawn.java b/src/forge/card/trigger/Trigger_Drawn.java deleted file mode 100644 index db2c7adf3a5..00000000000 --- a/src/forge/card/trigger/Trigger_Drawn.java +++ /dev/null @@ -1,57 +0,0 @@ -package forge.card.trigger; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -import java.util.HashMap; - -/** - *

Trigger_Drawn class.

- * - * @author Forge - * @version $Id: $ - */ -public class Trigger_Drawn extends Trigger { - - /** - *

Constructor for Trigger_Drawn.

- * - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger_Drawn(HashMap params, Card host) { - super(params, host); - } - - /** {@inheritDoc} */ - @Override - public boolean performTest(java.util.Map runParams) { - Card draw = ((Card) runParams.get("Card")); - - if (mapParams.containsKey("ValidCard")) { - if (!draw.isValidCard(mapParams.get("ValidCard").split(","), hostCard.getController(), hostCard)) { - return false; - } - } - return true; - } - - /** {@inheritDoc} */ - @Override - public Trigger getCopy() { - Trigger copy = new Trigger_Drawn(mapParams, hostCard); - if (overridingAbility != null) { - copy.setOverridingAbility(overridingAbility); - } - copy.setName(name); - copy.setID(ID); - - return copy; - } - - /** {@inheritDoc} */ - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("Card", runParams.get("Card")); - } -} diff --git a/src/forge/card/trigger/Trigger_LandPlayed.java b/src/forge/card/trigger/Trigger_LandPlayed.java deleted file mode 100644 index fd98e7bbad6..00000000000 --- a/src/forge/card/trigger/Trigger_LandPlayed.java +++ /dev/null @@ -1,67 +0,0 @@ -package forge.card.trigger; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -import java.util.HashMap; - -/** - *

Trigger_LandPlayed class.

- * - * @author Forge - * @version $Id: $ - */ -public class Trigger_LandPlayed extends Trigger { - - /** - *

Constructor for Trigger_LandPlayed.

- * - * @param n a {@link java.lang.String} object. - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger_LandPlayed(String n, HashMap params, Card host) { - super(n, params, host); - } - - /** - *

Constructor for Trigger_LandPlayed.

- * - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger_LandPlayed(HashMap params, Card host) { - super(params, host); - } - - /** {@inheritDoc} */ - @Override - public Trigger getCopy() { - Trigger copy = new Trigger_LandPlayed(name, mapParams, hostCard); - copy.setID(ID); - - if (this.overridingAbility != null) { - copy.setOverridingAbility(overridingAbility); - } - - return copy; - } - - /** {@inheritDoc} */ - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("Card", runParams.get("Card")); - } - - /** {@inheritDoc} */ - @Override - public boolean performTest(java.util.Map runParams) { - if (mapParams.containsKey("ValidCard")) { - if (!matchesValid(runParams.get("Card"), mapParams.get("ValidCard").split(","), hostCard)) { - return false; - } - } - return true; - } - -} diff --git a/src/forge/card/trigger/Trigger_LifeGained.java b/src/forge/card/trigger/Trigger_LifeGained.java deleted file mode 100644 index 5a132d99397..00000000000 --- a/src/forge/card/trigger/Trigger_LifeGained.java +++ /dev/null @@ -1,57 +0,0 @@ -package forge.card.trigger; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -import java.util.HashMap; - -/** - *

Trigger_LifeGained class.

- * - * @author Forge - * @version $Id: $ - */ -public class Trigger_LifeGained extends Trigger { - - /** - *

Constructor for Trigger_LifeGained.

- * - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger_LifeGained(HashMap params, Card host) { - super(params, host); - } - - /** {@inheritDoc} */ - @Override - public boolean performTest(java.util.Map runParams) { - if (mapParams.containsKey("ValidPlayer")) { - if (!matchesValid(runParams.get("Player"), mapParams.get("ValidPlayer").split(","), hostCard)) { - return false; - } - } - - return true; - } - - /** {@inheritDoc} */ - @Override - public Trigger getCopy() { - Trigger copy = new Trigger_LifeGained(mapParams, hostCard); - if (overridingAbility != null) { - copy.setOverridingAbility(overridingAbility); - } - copy.setName(name); - copy.setID(ID); - - return copy; - } - - /** {@inheritDoc} */ - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("LifeAmount", runParams.get("LifeAmount")); - sa.setTriggeringObject("Player", runParams.get("Player")); - } -} diff --git a/src/forge/card/trigger/Trigger_LifeLost.java b/src/forge/card/trigger/Trigger_LifeLost.java deleted file mode 100644 index ca0bff7d912..00000000000 --- a/src/forge/card/trigger/Trigger_LifeLost.java +++ /dev/null @@ -1,57 +0,0 @@ -package forge.card.trigger; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -import java.util.HashMap; - -/** - *

Trigger_LifeLost class.

- * - * @author Forge - * @version $Id: $ - */ -public class Trigger_LifeLost extends Trigger { - - /** - *

Constructor for Trigger_LifeLost.

- * - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger_LifeLost(HashMap params, Card host) { - super(params, host); - } - - /** {@inheritDoc} */ - @Override - public boolean performTest(java.util.Map runParams) { - if (mapParams.containsKey("ValidPlayer")) { - if (!matchesValid(runParams.get("Player"), mapParams.get("ValidPlayer").split(","), hostCard)) { - return false; - } - } - - return true; - } - - /** {@inheritDoc} */ - @Override - public Trigger getCopy() { - Trigger copy = new Trigger_LifeLost(mapParams, hostCard); - if (overridingAbility != null) { - copy.setOverridingAbility(overridingAbility); - } - copy.setName(name); - copy.setID(ID); - - return copy; - } - - /** {@inheritDoc} */ - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("LifeAmount", runParams.get("LifeAmount")); - sa.setTriggeringObject("Player", runParams.get("Player")); - } -} diff --git a/src/forge/card/trigger/Trigger_Phase.java b/src/forge/card/trigger/Trigger_Phase.java deleted file mode 100644 index 0b157fc665a..00000000000 --- a/src/forge/card/trigger/Trigger_Phase.java +++ /dev/null @@ -1,73 +0,0 @@ -package forge.card.trigger; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -import java.util.HashMap; - -/** - *

Trigger_Phase class.

- * - * @author Forge - * @version $Id: $ - */ -public class Trigger_Phase extends Trigger { - - /** - *

Constructor for Trigger_Phase.

- * - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger_Phase(HashMap params, Card host) { - super(params, host); - } - - /** {@inheritDoc} */ - @Override - public boolean performTest(java.util.Map runParams) { - if (mapParams.containsKey("Phase")) { - if (mapParams.get("Phase").contains(",")) { - boolean found = false; - for (String s : mapParams.get("Phase").split(",")) { - if (s.equals(runParams.get("Phase"))) { - found = true; - break; - } - } - - if (!found) - return false; - } else { - if (!mapParams.get("Phase").equals(runParams.get("Phase"))) { - return false; - } - } - } - if (mapParams.containsKey("ValidPlayer")) { - if (!matchesValid(runParams.get("Player"), mapParams.get("ValidPlayer").split(","), hostCard)) { - return false; - } - } - return true; - } - - /** {@inheritDoc} */ - @Override - public Trigger getCopy() { - Trigger copy = new Trigger_Phase(mapParams, hostCard); - if (overridingAbility != null) { - copy.setOverridingAbility(overridingAbility); - } - copy.setName(name); - copy.setID(ID); - - return copy; - } - - /** {@inheritDoc} */ - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("Player", runParams.get("Player")); - } -} diff --git a/src/forge/card/trigger/Trigger_Sacrificed.java b/src/forge/card/trigger/Trigger_Sacrificed.java deleted file mode 100644 index ddefab83891..00000000000 --- a/src/forge/card/trigger/Trigger_Sacrificed.java +++ /dev/null @@ -1,61 +0,0 @@ -package forge.card.trigger; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -import java.util.HashMap; - -/** - *

Trigger_Sacrificed class.

- * - * @author Forge - * @version $Id: $ - */ -public class Trigger_Sacrificed extends Trigger { - - /** - *

Constructor for Trigger_Sacrificed.

- * - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger_Sacrificed(HashMap params, Card host) { - super(params, host); - } - - /** {@inheritDoc} */ - @Override - public boolean performTest(java.util.Map runParams) { - Card sac = (Card) runParams.get("Card"); - if (mapParams.containsKey("ValidPlayer")) { - if (!matchesValid(sac.getController(), mapParams.get("ValidPlayer").split(","), hostCard)) { - return false; - } - } - if (mapParams.containsKey("ValidCard")) { - if (!sac.isValidCard(mapParams.get("ValidCard").split(","), hostCard.getController(), hostCard)) { - return false; - } - } - return true; - } - - /** {@inheritDoc} */ - @Override - public Trigger getCopy() { - Trigger copy = new Trigger_Sacrificed(mapParams, hostCard); - if (overridingAbility != null) { - copy.setOverridingAbility(overridingAbility); - } - copy.setName(name); - copy.setID(ID); - - return copy; - } - - /** {@inheritDoc} */ - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("Card", runParams.get("Card")); - } -} diff --git a/src/forge/card/trigger/Trigger_Shuffled.java b/src/forge/card/trigger/Trigger_Shuffled.java deleted file mode 100644 index 20e2d35d28c..00000000000 --- a/src/forge/card/trigger/Trigger_Shuffled.java +++ /dev/null @@ -1,56 +0,0 @@ -package forge.card.trigger; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -import java.util.HashMap; - -/** - *

Trigger_Shuffled class.

- * - * @author Forge - * @version $Id: $ - */ -public class Trigger_Shuffled extends Trigger { - - /** - *

Constructor for Trigger_Shuffled.

- * - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger_Shuffled(HashMap params, Card host) { - super(params, host); - } - - /** {@inheritDoc} */ - @Override - public boolean performTest(java.util.Map runParams) { - if (mapParams.containsKey("ValidPlayer")) { - if (!matchesValid(runParams.get("Player"), mapParams.get("ValidPlayer").split(","), hostCard)) { - return false; - } - } - - return true; - } - - /** {@inheritDoc} */ - @Override - public Trigger getCopy() { - Trigger copy = new Trigger_Shuffled(mapParams, hostCard); - if (overridingAbility != null) { - copy.setOverridingAbility(overridingAbility); - } - copy.setName(name); - copy.setID(ID); - - return copy; - } - - /** {@inheritDoc} */ - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("Player", runParams.get("Player")); - } -} diff --git a/src/forge/card/trigger/Trigger_SpellAbilityCast.java b/src/forge/card/trigger/Trigger_SpellAbilityCast.java deleted file mode 100644 index 754b4266ffa..00000000000 --- a/src/forge/card/trigger/Trigger_SpellAbilityCast.java +++ /dev/null @@ -1,151 +0,0 @@ -package forge.card.trigger; - -import forge.AllZone; -import forge.Card; -import forge.Player; -import forge.card.spellability.Cost; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.SpellAbility_StackInstance; - -import java.util.HashMap; - -/** - *

Trigger_SpellAbilityCast class.

- * - * @author Forge - * @version $Id: $ - */ -public class Trigger_SpellAbilityCast extends Trigger { - - /** - *

Constructor for Trigger_SpellAbilityCast.

- * - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger_SpellAbilityCast(HashMap params, Card host) { - super(params, host); - } - - /** {@inheritDoc} */ - @Override - public boolean performTest(java.util.Map runParams) { - SpellAbility SA = (SpellAbility) runParams.get("CastSA"); - Card cast = SA.getSourceCard(); - SpellAbility_StackInstance si = AllZone.getStack().getInstanceFromSpellAbility(SA); - - if (mapParams.get("Mode").equals("SpellCast")) { - if (!SA.isSpell()) { - return false; - } - } else if (mapParams.get("Mode").equals("AbilityCast")) { - if (!SA.isAbility()) { - return false; - } - } else if (mapParams.get("Mode").equals("SpellAbilityCast")) { - //Empty block for readability. - } - - if (mapParams.containsKey("ValidControllingPlayer")) { - if (!matchesValid(cast.getController(), mapParams.get("ValidControllingPlayer").split(","), hostCard)) { - return false; - } - } - - if (mapParams.containsKey("ValidActivatingPlayer")) { - if (!matchesValid(si.getActivatingPlayer(), mapParams.get("ValidActivatingPlayer").split(","), hostCard)) { - return false; - } - } - - if (mapParams.containsKey("ValidCard")) { - if (!matchesValid(cast, mapParams.get("ValidCard").split(","), hostCard)) { - return false; - } - } - - if (mapParams.containsKey("TargetsValid")) { - SpellAbility sa = si.getSpellAbility(); - if (sa.getTarget() == null) { - if (sa.getTargetCard() == null) { - if (sa.getTargetList() == null) { - if (sa.getTargetPlayer() == null) { - return false; - } else { - if (!matchesValid(sa.getTargetPlayer(), mapParams.get("TargetsValid").split(","), hostCard)) { - return false; - } - } - } else { - boolean validTgtFound = false; - for (Card tgt : sa.getTargetList()) { - if (matchesValid(tgt, mapParams.get("TargetsValid").split(","), hostCard)) { - validTgtFound = true; - break; - } - } - if (!validTgtFound) { - return false; - } - } - } else { - if (!matchesValid(sa.getTargetCard(), mapParams.get("TargetsValid").split(","), hostCard)) { - return false; - } - } - } else { - if (sa.getTarget().doesTarget()) { - boolean validTgtFound = false; - for (Card tgt : sa.getTarget().getTargetCards()) { - if (tgt.isValidCard(mapParams.get("TargetsValid").split(","), hostCard.getController(), hostCard)) { - validTgtFound = true; - break; - } - } - - for (Player p : sa.getTarget().getTargetPlayers()) { - if (matchesValid(p, mapParams.get("TargetsValid").split(","), hostCard)) { - validTgtFound = true; - break; - } - } - - if (!validTgtFound) { - return false; - } - } else { - return false; - } - } - } - - if (mapParams.containsKey("NonTapCost")) { - Cost cost = (Cost) (runParams.get("Cost")); - if (cost.getTap()) return false; - } - - return true; - } - - /** {@inheritDoc} */ - @Override - public Trigger getCopy() { - Trigger copy = new Trigger_SpellAbilityCast(mapParams, hostCard); - if (overridingAbility != null) { - copy.setOverridingAbility(overridingAbility); - } - copy.setName(name); - copy.setID(ID); - - return copy; - } - - /** {@inheritDoc} */ - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("Card", ((SpellAbility) runParams.get("CastSA")).getSourceCard()); - sa.setTriggeringObject("SpellAbility", runParams.get("CastSA")); - sa.setTriggeringObject("Player", runParams.get("Player")); - sa.setTriggeringObject("Activator", runParams.get("Activator")); - } -} diff --git a/src/forge/card/trigger/Trigger_Taps.java b/src/forge/card/trigger/Trigger_Taps.java deleted file mode 100644 index ed832812729..00000000000 --- a/src/forge/card/trigger/Trigger_Taps.java +++ /dev/null @@ -1,58 +0,0 @@ -package forge.card.trigger; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -import java.util.HashMap; - -/** - *

Trigger_Taps class.

- * - * @author Forge - * @version $Id: $ - */ -public class Trigger_Taps extends Trigger { - - /** - *

Constructor for Trigger_Taps.

- * - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger_Taps(HashMap params, Card host) { - super(params, host); - } - - /** {@inheritDoc} */ - @Override - public boolean performTest(java.util.Map runParams) { - Card tapper = (Card) runParams.get("Card"); - - if (mapParams.containsKey("ValidCard")) { - if (!tapper.isValidCard(mapParams.get("ValidCard").split(","), hostCard.getController(), hostCard)) { - return false; - } - } - - return true; - } - - /** {@inheritDoc} */ - @Override - public Trigger getCopy() { - Trigger copy = new Trigger_Taps(mapParams, hostCard); - if (overridingAbility != null) { - copy.setOverridingAbility(overridingAbility); - } - copy.setName(name); - copy.setID(ID); - - return copy; - } - - /** {@inheritDoc} */ - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("Card", runParams.get("Card")); - } -} diff --git a/src/forge/card/trigger/Trigger_TapsForMana.java b/src/forge/card/trigger/Trigger_TapsForMana.java deleted file mode 100644 index 5c14d94df61..00000000000 --- a/src/forge/card/trigger/Trigger_TapsForMana.java +++ /dev/null @@ -1,60 +0,0 @@ -package forge.card.trigger; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -import java.util.HashMap; - -/** - *

Trigger_TapsForMana class.

- * - * @author Forge - * @version $Id: $ - */ -public class Trigger_TapsForMana extends Trigger { - - /** - *

Constructor for Trigger_TapsForMana.

- * - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger_TapsForMana(HashMap params, Card host) { - super(params, host); - } - - /** {@inheritDoc} */ - @Override - public boolean performTest(java.util.Map runParams) { - Card tapper = (Card) runParams.get("Card"); - - if (mapParams.containsKey("ValidCard")) { - if (!tapper.isValidCard(mapParams.get("ValidCard").split(","), hostCard.getController(), hostCard)) { - return false; - } - } - - return true; - } - - /** {@inheritDoc} */ - @Override - public Trigger getCopy() { - Trigger copy = new Trigger_TapsForMana(mapParams, hostCard); - if (overridingAbility != null) { - copy.setOverridingAbility(overridingAbility); - } - copy.setName(name); - copy.setID(ID); - - return copy; - } - - /** {@inheritDoc} */ - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("Card", runParams.get("Card")); - sa.setTriggeringObject("Player", runParams.get("Player")); - sa.setTriggeringObject("Produced", runParams.get("Produced")); - } -} diff --git a/src/forge/card/trigger/Trigger_TurnFaceUp.java b/src/forge/card/trigger/Trigger_TurnFaceUp.java deleted file mode 100644 index ad4db161367..00000000000 --- a/src/forge/card/trigger/Trigger_TurnFaceUp.java +++ /dev/null @@ -1,56 +0,0 @@ -package forge.card.trigger; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -import java.util.HashMap; - -/** - *

Trigger_TurnFaceUp class.

- * - * @author Forge - * @version $Id: $ - */ -public class Trigger_TurnFaceUp extends Trigger { - - /** - *

Constructor for Trigger_TurnFaceUp.

- * - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger_TurnFaceUp(HashMap params, Card host) { - super(params, host); - } - - /** {@inheritDoc} */ - @Override - public boolean performTest(java.util.Map runParams) { - if (mapParams.containsKey("ValidCard")) { - if (!matchesValid(runParams.get("Card"), mapParams.get("ValidCard").split(","), hostCard)) { - return false; - } - } - - return true; - } - - /** {@inheritDoc} */ - @Override - public Trigger getCopy() { - Trigger copy = new Trigger_TurnFaceUp(mapParams, hostCard); - if (overridingAbility != null) { - copy.setOverridingAbility(overridingAbility); - } - copy.setName(name); - copy.setID(ID); - - return copy; - } - - /** {@inheritDoc} */ - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("Card", runParams.get("Card")); - } -} diff --git a/src/forge/card/trigger/Trigger_Unequip.java b/src/forge/card/trigger/Trigger_Unequip.java deleted file mode 100644 index fc24ddf221a..00000000000 --- a/src/forge/card/trigger/Trigger_Unequip.java +++ /dev/null @@ -1,66 +0,0 @@ -package forge.card.trigger; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -import java.util.HashMap; - -/** - *

Trigger_Unequip class.

- * - * @author Forge - * @version $Id: $ - */ -public class Trigger_Unequip extends Trigger { - - /** - *

Constructor for Trigger_Unequip.

- * - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger_Unequip(HashMap params, Card host) { - super(params, host); - } - - /** {@inheritDoc} */ - @Override - public boolean performTest(java.util.Map runParams) { - Card equipped = (Card) runParams.get("Card"); - Card equipment = (Card) runParams.get("Equipment"); - - if (mapParams.containsKey("ValidCard")) { - if (!equipped.isValidCard(mapParams.get("ValidCard").split(","), hostCard.getController(), hostCard)) { - return false; - } - } - - if (mapParams.containsKey("ValidEquipment")) { - if (!equipment.isValidCard(mapParams.get("ValidEquipment").split(","), hostCard.getController(), hostCard)) { - return false; - } - } - - return true; - } - - /** {@inheritDoc} */ - @Override - public Trigger getCopy() { - Trigger copy = new Trigger_Unequip(mapParams, hostCard); - if (overridingAbility != null) { - copy.setOverridingAbility(overridingAbility); - } - copy.setName(name); - copy.setID(ID); - - return copy; - } - - /** {@inheritDoc} */ - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("Card", runParams.get("Card")); - sa.setTriggeringObject("Equipment", runParams.get("Equipment")); - } -} diff --git a/src/forge/card/trigger/Trigger_Untaps.java b/src/forge/card/trigger/Trigger_Untaps.java deleted file mode 100644 index dfd46659570..00000000000 --- a/src/forge/card/trigger/Trigger_Untaps.java +++ /dev/null @@ -1,59 +0,0 @@ -package forge.card.trigger; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -import java.util.HashMap; - -/** - *

Trigger_Untaps class.

- * - * @author Forge - * @version $Id: $ - */ -public class Trigger_Untaps extends Trigger { - - /** - *

Constructor for Trigger_Untaps.

- * - * @param params a {@link java.util.HashMap} object. - * @param host a {@link forge.Card} object. - */ - public Trigger_Untaps(HashMap params, Card host) { - super(params, host); - } - - /** {@inheritDoc} */ - @Override - public boolean performTest(java.util.Map runParams) { - Card untapper = (Card) runParams.get("Card"); - - if (mapParams.containsKey("ValidCard")) { - if (!untapper.isValidCard(mapParams.get("ValidCard").split(","), hostCard.getController(), hostCard)) { - return false; - } - } - - return true; - } - - /** {@inheritDoc} */ - @Override - public Trigger getCopy() { - Trigger copy = new Trigger_Untaps(mapParams, hostCard); - if (overridingAbility != null) { - copy.setOverridingAbility(overridingAbility); - } - copy.setName(name); - copy.setID(ID); - - return copy; - } - - /** {@inheritDoc} */ - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("Card", runParams.get("Card")); - } - -} diff --git a/src/forge/deck/Deck.java b/src/forge/deck/Deck.java deleted file mode 100644 index 906b1dd0b1a..00000000000 --- a/src/forge/deck/Deck.java +++ /dev/null @@ -1,378 +0,0 @@ -package forge.deck; - -import forge.Card; -import forge.Constant; - -import java.io.Serializable; -import java.util.*; - -/** - *

Deck class.

- * - * @author Forge - * @version $Id: $ - */ -public class Deck implements Comparable, Serializable { - /** - * - */ - private static final long serialVersionUID = -7478025567887481994L; - - //gameType is from Constant.GameType, like Constant.GameType.Regular - - private Map metadata = new HashMap(); - - private List main; - private List sideboard; - - /** Constant NAME="Name" */ - public static final String NAME = "Name"; - /** Constant DECK_TYPE="Deck Type" */ - public static final String DECK_TYPE = "Deck Type"; - /** Constant COMMENT="Comment" */ - public static final String COMMENT = "Comment"; - /** Constant DESCRIPTION="Description" */ - public static final String DESCRIPTION = "Description"; - /** Constant DIFFICULTY="Difficulty" */ - public static final String DIFFICULTY = "Difficulty"; - - - //gameType is from Constant.GameType, like Constant.GameType.Regular - /** - *

Constructor for Deck.

- */ - public Deck() { - main = new ArrayList(); - sideboard = new ArrayList(); - } - - /** - *

Constructor for Deck.

- * - * @param deckType a {@link java.lang.String} object. - * @param main a {@link java.util.List} object. - * @param sideboard a {@link java.util.List} object. - * @param name a {@link java.lang.String} object. - */ - public Deck(String deckType, List main, List sideboard, String name) { - setDeckType(deckType); - setName(name); - - this.main = main; - this.sideboard = sideboard; - } - - /** - *

Constructor for Deck.

- * - * @param type a {@link java.lang.String} object. - */ - public Deck(String type) { - this(); - setDeckType(type); - } - - /** - *

Getter for the field main.

- * - * @return a {@link java.util.List} object. - */ - public List getMain() { - return Collections.unmodifiableList(main); - } - - /** - *

Getter for the field sideboard.

- * - * @return a {@link java.util.List} object. - */ - public List getSideboard() { - return Collections.unmodifiableList(sideboard); - } - - /** - *

getDeckType.

- * - * @return a {@link java.lang.String} object. - */ - public String getDeckType() { - return metadata.get(DECK_TYPE); - } - - //can only call this method ONCE - /** - *

setDeckType.

- * - * @param deckType a {@link java.lang.String} object. - */ - void setDeckType(String deckType) { - if (this.getDeckType() != null) { - throw new IllegalStateException( - "Deck : setDeckType() error, deck type has already been set"); - } - - if (!Constant.GameType.GameTypes.contains(deckType)) { - throw new RuntimeException( - "Deck : setDeckType() error, invalid deck type - " + deckType); - } - - metadata.put(DECK_TYPE, deckType); - } - - /** - *

setName.

- * - * @param s a {@link java.lang.String} object. - */ - public void setName(String s) { - metadata.put(NAME, s); - } - - /** - *

getName.

- * - * @return a {@link java.lang.String} object. - */ - public String getName() { - return metadata.get(NAME); - } - - /** - *

setComment.

- * - * @param comment a {@link java.lang.String} object. - */ - public void setComment(String comment) { - metadata.put(COMMENT, comment); - } - - /** - *

getComment.

- * - * @return a {@link java.lang.String} object. - */ - public String getComment() { - return metadata.get(COMMENT); - - } - - /** - *

addMain.

- * - * @param cardName a {@link java.lang.String} object. - */ - public void addMain(String cardName) { - main.add(cardName); - } - - /** - *

countMain.

- * - * @return a int. - */ - public int countMain() { - return main.size(); - } - - /** - *

Getter for the field main.

- * - * @param index a int. - * @return a {@link java.lang.String} object. - */ - public String getMain(int index) { - return main.get(index); - } - - /** - *

removeMain.

- * - * @param index a int. - * @return a {@link java.lang.String} object. - */ - public String removeMain(int index) { - return main.remove(index); - } - - /** - *

removeMain.

- * - * @param c a {@link forge.Card} object. - */ - public void removeMain(Card c) { - if (main.contains(c.getName())) { - int i = main.indexOf(c.getName()); - main.remove(i); - } - } - - /** - *

addSideboard.

- * - * @param cardName a {@link java.lang.String} object. - */ - public void addSideboard(String cardName) { - sideboard.add(cardName); - } - - /** - *

countSideboard.

- * - * @return a int. - */ - public int countSideboard() { - return sideboard.size(); - } - - /** - *

Getter for the field sideboard.

- * - * @param index a int. - * @return a {@link java.lang.String} object. - */ - public String getSideboard(int index) { - return sideboard.get(index); - } - - /** - *

removeSideboard.

- * - * @param index a int. - * @return a {@link java.lang.String} object. - */ - public String removeSideboard(int index) { - return sideboard.remove(index); - } - - /** - *

isDraft.

- * - * @return a boolean. - */ - public boolean isDraft() { - return getDeckType().equals(Constant.GameType.Draft); - } - - /** - *

isSealed.

- * - * @return a boolean. - */ - public boolean isSealed() { - return getDeckType().equals(Constant.GameType.Sealed); - } - - /** - *

isRegular.

- * - * @return a boolean. - */ - public boolean isRegular() { - return getDeckType().equals(Constant.GameType.Constructed); - } - - /** - *

hashCode.

- * - * @return a int. - */ - public int hashCode() { - return getName().hashCode(); - } - - /** {@inheritDoc} */ - @Override - public String toString() { - return getName(); - } - - - // The setters and getters below are for Quest decks - /** - *

setDifficulty.

- * - * @param s a {@link java.lang.String} object. - */ - public void setDifficulty(String s) { - metadata.put(DIFFICULTY, s); - } - - /** - *

getDifficulty.

- * - * @return a {@link java.lang.String} object. - */ - public String getDifficulty() { - return metadata.get(DIFFICULTY); - } - - /** - *

setDescription.

- * - * @param s a {@link java.lang.String} object. - */ - public void setDescription(String s) { - metadata.put(DESCRIPTION, s); - } - - /** - *

getDescription.

- * - * @return a {@link java.lang.String} object. - */ - public String getDescription() { - return metadata.get(DESCRIPTION); - } - - /** - *

compareTo.

- * - * @param d a {@link forge.deck.Deck} object. - * @return a int. - */ - public int compareTo(Deck d) { - return getName().compareTo(d.getName()); - } - - /** {@inheritDoc} */ - public boolean equals(Object o) { - if (o instanceof Deck) { - Deck d = (Deck) o; - return getName().equals(d.getName()); - } - return false; - } - - /** - *

Getter for the field metadata.

- * - * @return a {@link java.util.Set} object. - */ - public Set> getMetadata() { - return metadata.entrySet(); - } - - /** - *

Getter for the field metadata.

- * - * @param key a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - * @since 1.0.15 - */ - public String getMetadata(String key) { - if (metadata.containsKey(key)) - return metadata.get(key); - - return ""; - } - - /** - *

addMetaData.

- * - * @param key a {@link java.lang.String} object. - * @param value a {@link java.lang.String} object. - */ - public void addMetaData(String key, String value) { - metadata.put(key, value); - } -} diff --git a/src/forge/deck/DeckManager.java b/src/forge/deck/DeckManager.java deleted file mode 100755 index 06d231909bf..00000000000 --- a/src/forge/deck/DeckManager.java +++ /dev/null @@ -1,481 +0,0 @@ -package forge.deck; - - -import forge.Constant; -import forge.error.ErrorViewer; - -import java.io.*; -import java.util.*; -import java.util.Map.Entry; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import static java.lang.Integer.parseInt; -import static java.lang.String.format; -import static java.util.Arrays.asList; - - -//reads and writeDeck Deck objects -/** - *

DeckManager class.

- * - * @author Forge - * @version $Id: $ - */ -public class DeckManager { - /** Constant BDKFileFilter */ - private static FilenameFilter BDKFileFilter = new FilenameFilter() { - public boolean accept(File dir, String name) { - return name.endsWith(".bdk"); - } - }; - - /** Constant DCKFileFilter */ - private static FilenameFilter DCKFileFilter = new FilenameFilter() { - public boolean accept(File dir, String name) { - return name.endsWith(".dck"); - } - }; - - - private File deckDir; - Map deckMap; - Map draftMap; - - /** - *

Constructor for DeckManager.

- * - * @param deckDir a {@link java.io.File} object. - */ - public DeckManager(File deckDir) { - if (deckDir == null) { - throw new IllegalArgumentException("No deck directory specified"); - } - try { - this.deckDir = deckDir; - - if (deckDir.isFile()) { - throw new IOException("Not a directory"); - } else { - deckDir.mkdirs(); - if (!deckDir.isDirectory()) { - throw new IOException("Directory can't be created"); - } - this.deckMap = new HashMap(); - this.draftMap = new HashMap(); - readAllDecks(); - } - } catch (IOException ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("DeckManager : writeDeck() error, " + ex.getMessage()); - } - } - - - /** - *

isUnique.

- * - * @param deckName a {@link java.lang.String} object. - * @return a boolean. - */ - public boolean isUnique(String deckName) { - return !deckMap.containsKey(deckName); - } - - /** - *

isUniqueDraft.

- * - * @param deckName a {@link java.lang.String} object. - * @return a boolean. - */ - public boolean isUniqueDraft(String deckName) { - return !draftMap.keySet().contains(deckName); - } - - /** - *

getDeck.

- * - * @param deckName a {@link java.lang.String} object. - * @return a {@link forge.deck.Deck} object. - */ - public Deck getDeck(String deckName) { - return deckMap.get(deckName); - } - - - /** - *

addDeck.

- * - * @param deck a {@link forge.deck.Deck} object. - */ - public void addDeck(Deck deck) { - if (deck.getDeckType().equals(Constant.GameType.Draft)) { - throw new RuntimeException( - "DeckManager : addDeck() error, deck type is Draft"); - } - - deckMap.put(deck.getName(), deck); - } - - /** - *

deleteDeck.

- * - * @param deckName a {@link java.lang.String} object. - */ - public void deleteDeck(String deckName) { - deckMap.remove(deckName); - } - - /** - *

getDraftDeck.

- * - * @param deckName a {@link java.lang.String} object. - * @return an array of {@link forge.deck.Deck} objects. - */ - public Deck[] getDraftDeck(String deckName) { - if (!draftMap.containsKey(deckName)) { - throw new RuntimeException( - "DeckManager : getDraftDeck() error, deck name not found - " + deckName); - } - - return draftMap.get(deckName); - } - - /** - *

addDraftDeck.

- * - * @param deck an array of {@link forge.deck.Deck} objects. - */ - public void addDraftDeck(Deck[] deck) { - checkDraftDeck(deck); - - draftMap.put(deck[0].toString(), deck); - } - - /** - *

deleteDraftDeck.

- * - * @param deckName a {@link java.lang.String} object. - */ - public void deleteDraftDeck(String deckName) { - if (!draftMap.containsKey(deckName)) { - throw new RuntimeException( - "DeckManager : deleteDraftDeck() error, deck name not found - " + deckName); - } - - draftMap.remove(deckName); - } - - /** - *

checkDraftDeck.

- * - * @param deck an array of {@link forge.deck.Deck} objects. - */ - private void checkDraftDeck(Deck[] deck) { - if (deck == null || deck.length != 8 || deck[0].getName().equals("") - || (!deck[0].getDeckType().equals(Constant.GameType.Draft))) { - throw new RuntimeException("DeckManager : checkDraftDeck() error, invalid deck"); - } - } - - - /** - *

getDecks.

- * - * @return a {@link java.util.Collection} object. - */ - public Collection getDecks() { - return deckMap.values(); - } - - /** - *

getDraftDecks.

- * - * @return a {@link java.util.Map} object. - */ - public Map getDraftDecks() { - return new HashMap(draftMap); - } - - /** - *

close.

- */ - public void close() { - writeAllDecks(); - } - - - /** - *

readAllDecks.

- */ - public void readAllDecks() { - deckMap.clear(); - draftMap.clear(); - - File[] files; - - files = deckDir.listFiles(DCKFileFilter); - for (File file : files) { - Deck newDeck = readDeck(file); - deckMap.put(newDeck.getName(), newDeck); - } - - files = deckDir.listFiles(BDKFileFilter); - for (File file : files) { - Deck[] d = new Deck[8]; - - for (int i = 0; i < d.length; i++) { - d[i] = readDeck(new File(file, i + ".dck")); - } - - draftMap.put(d[0].getName(), d); - } - } - - /** - *

readDeck.

- * - * @param deckFile a {@link java.io.File} object. - * @return a {@link forge.deck.Deck} object. - */ - public static Deck readDeck(File deckFile) { - - List lines = new LinkedList(); - - try { - BufferedReader r = new BufferedReader(new FileReader(deckFile)); - - String line; - while ((line = r.readLine()) != null) { - lines.add(line); - } - - r.close(); - } catch (IOException e) { - e.printStackTrace(); - } - - ListIterator lineIterator = lines.listIterator(); - - String line = lineIterator.next(); - - //Old text-based format - if (!line.equals("[metadata]")) { - lineIterator.previous(); - return readDeckOld(lineIterator); - } - - Deck d = new Deck(); - - //read metadata - while (!(line = lineIterator.next()).equals("[main]")) { - String[] linedata = line.split("=", 2); - d.addMetaData(linedata[0], linedata[1]); - } - - addCardList(lineIterator, d); - - return d; - - } - - /** - *

readDeckOld.

- * - * @param iterator a {@link java.util.ListIterator} object. - * @return a {@link forge.deck.Deck} object. - */ - private static Deck readDeckOld(ListIterator iterator) { - - String line; - //readDeck name - String name = iterator.next(); - - //readDeck comments - String comment = null; - while ((line = iterator.next()) != null && !line.equals("[general]")) { - if (comment == null) { - comment = line; - } else { - comment += "\n" + line; - } - } - - //readDeck deck type - String deckType = iterator.next(); - - Deck d = new Deck(); - d.setName(name); - d.setComment(comment); - d.setDeckType(deckType); - - //go to [main] - while ((line = iterator.next()) != null && !line.equals("[main]")) { - System.err.println("unexpected line: " + line); - } - - addCardList(iterator, d); - - return d; - } - - /** - *

addCardList.

- * - * @param lineIterator a {@link java.util.ListIterator} object. - * @param d a {@link forge.deck.Deck} object. - */ - private static void addCardList(ListIterator lineIterator, Deck d) { - String line; - - Pattern p = Pattern.compile("\\s*((\\d+)\\s+)?(.*?)\\s*"); - - //readDeck main deck - while (lineIterator.hasNext() && !(line = lineIterator.next()).equals("[sideboard]")) { - Matcher m = p.matcher(line); - m.matches(); - String s = m.group(2); - int count = s == null ? 1 : parseInt(s); - - for (int i = 0; i < count; i++) { - d.addMain(m.group(3)); - } - } - - //readDeck sideboard - while (lineIterator.hasNext()) { - line = lineIterator.next(); - Matcher m = p.matcher(line); - m.matches(); - String s = m.group(2); - int count = s == null ? 1 : parseInt(s); - for (int i = 0; i < count; i++) { - d.addSideboard(m.group(3)); - } - } - } - - /** - *

deriveFileName.

- * - * @param deckName a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - private String deriveFileName(String deckName) { - //skips all but the listed characters - return deckName.replaceAll("[^-_$#@.{[()]} a-zA-Z0-9]", ""); - } - - /** - *

writeAllDecks.

- */ - public void writeAllDecks() { - try { - //store the files that do exist - List files = new ArrayList(); - files.addAll(asList(deckDir.listFiles(DCKFileFilter))); - - //save the files and remove them from the list - for (Deck deck : deckMap.values()) { - File f = new File(deckDir, deriveFileName(deck.getName()) + ".dck"); - files.remove(f); - BufferedWriter out = new BufferedWriter(new FileWriter(f)); - writeDeck(deck, out); - out.close(); - } - //delete the files that were not written out: the decks that were deleted - for (File file : files) { - file.delete(); - } - - //store the files that do exist - files.clear(); - files.addAll(asList(deckDir.listFiles(BDKFileFilter))); - - //save the files and remove them from the list - for (Entry e : draftMap.entrySet()) { - File f = new File(deckDir, deriveFileName(e.getValue()[0].getName()) + ".bdk"); - f.mkdir(); - for (int i = 0; i < e.getValue().length; i++) { - BufferedWriter out = new BufferedWriter(new FileWriter(new File(f, i + ".dck"))); - writeDeck(e.getValue()[i], out); - out.close(); - } - } - /* - //delete the files that were not written out: the decks that were deleted - for(File file:files) { - for(int i = 0; i < 8; i++) - new File(file, i + ".dck").delete(); - file.delete(); - } - */ - } catch (IOException ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("DeckManager : writeDeck() error, " + ex.getMessage()); - } - } - - /** - *

writeDeck.

- * - * @param d a {@link forge.deck.Deck} object. - * @param out a {@link java.io.BufferedWriter} object. - * @throws java.io.IOException if any. - */ - private static void writeDeck(Deck d, BufferedWriter out) throws IOException { - out.write("[metadata]\n"); - - for (Entry entry : d.getMetadata()) { - if (entry.getValue() != null) - out.write(format("%s=%s%n", entry.getKey(), entry.getValue().replaceAll("\n", ""))); - } - - out.write(format("%s%n", "[main]")); - for (Entry e : count(d.getMain()).entrySet()) { - out.write(format("%d %s%n", e.getValue(), e.getKey())); - } - out.write(format("%s%n", "[sideboard]")); - for (Entry e : count(d.getSideboard()).entrySet()) { - out.write(format("%d %s%n", e.getValue(), e.getKey())); - } - } - - /** - *

count.

- * - * @param src a {@link java.util.List} object. - * @return a {@link java.util.Map} object. - */ - private static Map count(List src) { - Map result = new HashMap(); - for (String s : src) { - Integer dstValue = result.get(s); - if (dstValue == null) { - result.put(s, 1); - } else { - result.put(s, dstValue + 1); - } - } - return result; - } - - /** - *

writeDeck.

- * - * @param d a {@link forge.deck.Deck} object. - * @param f a {@link java.io.File} object. - */ - public static void writeDeck(Deck d, File f) { - try { - BufferedWriter writer = new BufferedWriter(new FileWriter(f)); - writeDeck(d, writer); - - writer.close(); - } catch (IOException e) { - throw new RuntimeException(e); - } - - } - -} diff --git a/src/forge/deck/DownloadDeck.java b/src/forge/deck/DownloadDeck.java deleted file mode 100644 index b3f80e70213..00000000000 --- a/src/forge/deck/DownloadDeck.java +++ /dev/null @@ -1,178 +0,0 @@ -package forge.deck; - -import forge.AllZone; -import forge.Card; - -/** - *

DownloadDeck class.

- * - * @author Forge - * @version $Id: $ - */ -public class DownloadDeck { - - - /** - *

foundNumberCard.

- * - * @param rStr a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public String foundNumberCard(String rStr) { - int temp; - int i; - - for (i = 0; i < rStr.length(); i++) { - temp = rStr.codePointAt(i); - if (temp >= 48 && temp <= 57) { - break; - - } - - } - if (rStr.codePointAt(i + 1) >= 48 && rStr.codePointAt(i + 1) <= 57) { - return rStr.substring(i, i + 2); - } else { - return rStr.substring(i, i + 1); - } - } - - /** - *

foundNameCard.

- * - * @param rStr a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public String foundNameCard(String rStr) { - int temp; - int i; - - for (i = 0; i < rStr.length(); i++) { - temp = rStr.codePointAt(i); - if (temp >= 48 && temp <= 57) { - break; - - } - - } - return rStr.substring(0, i - 1); - } - - - /** - *

removeSpace.

- * - * @param rStr a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public String removeSpace(String rStr) { - int temp; - int i; - - for (i = 0; i < rStr.length(); i++) { - temp = rStr.codePointAt(i); - if (temp != 32) { - break; - - } - - } - return rStr.substring(i); - } - - /** - *

removeSpaceBack.

- * - * @param rStr a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public String removeSpaceBack(String rStr) { - int temp; - int i; - - for (i = rStr.length() - 1; i > -1; i = i - 1) { - temp = rStr.codePointAt(i); - if (temp != 32) { - break; - - } - - } - return rStr.substring(0, i + 1); - } - - /** - *

removeFoundNumberCard.

- * - * @param rStr a {@link java.lang.String} object. - * @param Number a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public String removeFoundNumberCard(String rStr, String Number) { - int a; - int temp; - a = rStr.indexOf(Number); - temp = rStr.codePointAt(a + 1); - if (temp >= 48 && temp <= 57) { - return rStr.substring(a + 2); - } else { - return rStr.substring(a + 1); - } - - } - - /** - *

removeFoundNameCard.

- * - * @param rStr a {@link java.lang.String} object. - * @param Name a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public String removeFoundNameCard(String rStr, String Name) { - int a; - a = Name.length(); - return rStr.substring(a); - - } - - /** - *

isCardSupport.

- * - * @param CardName a {@link java.lang.String} object. - * @return a boolean. - */ - public boolean isCardSupport(String CardName) { - // TODO: using AllZone.getCardFactory().getCard() would probably be much faster. - - for (Card gCard : AllZone.getCardFactory()) { - if (CardName.equalsIgnoreCase(gCard.getName())) { - return true; - } - } - return false; - } - - /** - *

getCardDownload.

- * - * @param c a {@link forge.Card} object. - * @param CardName a {@link java.lang.String} object. - * @return a {@link forge.Card} object. - */ - public Card getCardDownload(Card c, String CardName) { - // TODO: using AllZone.getCardFactory().getCard() would probably be much faster. - - for (Card newCard : AllZone.getCardFactory()) { - if (CardName.equalsIgnoreCase(newCard.getName())) { - return newCard; - } - } - - return null; - - } - -} - - - diff --git a/src/forge/deck/generate/Generate2ColorDeck.java b/src/forge/deck/generate/Generate2ColorDeck.java deleted file mode 100644 index 3ec83417302..00000000000 --- a/src/forge/deck/generate/Generate2ColorDeck.java +++ /dev/null @@ -1,392 +0,0 @@ -package forge.deck.generate; - -import forge.*; -import forge.error.ErrorViewer; -import forge.properties.ForgeProps; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; -import java.util.Random; - -/** - *

Generate2ColorDeck class.

- * - * @author Forge - * @version $Id: $ - */ -public class Generate2ColorDeck { - private String color1 = ""; - private String color2 = ""; - private Random r = null; - private Map ClrMap = null; - private ArrayList notColors = null; - private ArrayList DualLands = null; - private ArrayList DL = null; - private Map CardCounts = null; - - /** - *

Constructor for Generate2ColorDeck.

- * - * @param Clr1 a {@link java.lang.String} object. - * @param Clr2 a {@link java.lang.String} object. - */ - public Generate2ColorDeck(String Clr1, String Clr2) { - r = MyRandom.random; - - CardCounts = new HashMap(); - - ClrMap = new HashMap(); - ClrMap.put("white", "W"); - ClrMap.put("blue", "U"); - ClrMap.put("black", "B"); - ClrMap.put("red", "R"); - ClrMap.put("green", "G"); - - notColors = new ArrayList(); - notColors.add("white"); - notColors.add("blue"); - notColors.add("black"); - notColors.add("red"); - notColors.add("green"); - - DualLands = new ArrayList(); - DualLands.add(new DLnd("Tundra", "WU")); - DualLands.add(new DLnd("Hallowed Fountain", "WU")); - DualLands.add(new DLnd("Underground Sea", "UB")); - DualLands.add(new DLnd("Watery Grave", "UB")); - DualLands.add(new DLnd("Badlands", "BR")); - DualLands.add(new DLnd("Blood Crypt", "BR")); - DualLands.add(new DLnd("Taiga", "RG")); - DualLands.add(new DLnd("Stomping Ground", "RG")); - DualLands.add(new DLnd("Savannah", "GW")); - DualLands.add(new DLnd("Temple Garden", "GW")); - DualLands.add(new DLnd("Scrubland", "WB")); - DualLands.add(new DLnd("Godless Shrine", "WB")); - DualLands.add(new DLnd("Volcanic Island", "UR")); - DualLands.add(new DLnd("Steam Vents", "UR")); - DualLands.add(new DLnd("Bayou", "BG")); - DualLands.add(new DLnd("Overgrown Tomb", "BG")); - DualLands.add(new DLnd("Plateau", "RW")); - DualLands.add(new DLnd("Sacred Foundry", "RW")); - DualLands.add(new DLnd("Tropical Island", "GU")); - DualLands.add(new DLnd("Breeding Pool", "GU")); - - if (Clr1.equals("AI")) { - // choose first color - color1 = notColors.get(r.nextInt(5)); - - // choose second color - String c2 = notColors.get(r.nextInt(5)); - while (c2.equals(color1)) - c2 = notColors.get(r.nextInt(5)); - color2 = c2; - } else { - color1 = Clr1; - color2 = Clr2; - } - - notColors.remove(color1); - notColors.remove(color2); - - DL = new ArrayList(); - for (int i = 0; i < DualLands.size(); i++) { - DLnd d = DualLands.get(i); - if (d.Mana.contains(ClrMap.get(color1)) && d.Mana.contains(ClrMap.get(color2))) { - DL.add(d.Name); - CardCounts.put(d.Name, 0); - } - } - - } - - /** - *

get2ColorDeck.

- * - * @param Size a int. - * @return a {@link forge.CardList} object. - */ - public CardList get2ColorDeck(int Size) { - int lc = 0; // loop counter to prevent infinite card selection loops - String tmpDeck = ""; - CardList tDeck = new CardList(); - - int LandsPercentage = 42; - int CreatPercentage = 34; - int SpellPercentage = 24; - - // start with all cards - // remove cards that generated decks don't like - CardList AllCards = CardFilter.filter(AllZone.getCardFactory(), new CardListFilter() { - public boolean addCard(Card c) { - return !(c.getSVar("RemAIDeck").equals("True") || c.getSVar("RemRandomDeck").equals("True")); - } - }); - - // reduce to cards that match the colors - CardList CL1 = AllCards.getColor(color1); - CardList CL2 = AllCards.getColor(color2); - - // remove multicolor cards that don't match the colors - CardListFilter clrF = new CardListFilter() { - public boolean addCard(Card c) { - for (int i = 0; i < notColors.size(); i++) { - if (c.getManaCost().contains(ClrMap.get(notColors.get(i)))) - return false; - } - return true; - } - }; - CL1 = CL1.filter(clrF); - CL2 = CL2.filter(clrF); - - // build subsets based on type - CardList Cr1 = CL1.getType("Creature"); - CardList Cr2 = CL2.getType("Creature"); - - String ISE[] = {"Instant", "Sorcery", "Enchantment", "Planeswalker"}; - CardList Sp1 = CL1.getValidCards(ISE, null, null); - CardList Sp2 = CL2.getValidCards(ISE, null, null); - - // final card pools - CardList Cr12 = new CardList(); - CardList Sp12 = new CardList(); - - // used for mana curve in the card pool - final int MinCMC[] = {1}, MaxCMC[] = {2}; - CardListFilter cmcF = new CardListFilter() { - public boolean addCard(Card c) { - int cCMC = c.getCMC(); - return (cCMC >= MinCMC[0]) && (cCMC <= MaxCMC[0]); - } - }; - - // select cards to build card pools using a mana curve - for (int i = 4; i > 0; i--) { - CardList Cr1CMC = Cr1.filter(cmcF); - CardList Cr2CMC = Cr2.filter(cmcF); - CardList Sp1CMC = Sp1.filter(cmcF); - CardList Sp2CMC = Sp2.filter(cmcF); - - for (int j = 0; j < i; j++) { - Card c = Cr1CMC.get(r.nextInt(Cr1CMC.size())); - Cr12.add(c); - CardCounts.put(c.getName(), 0); - - c = Cr2CMC.get(r.nextInt(Cr2CMC.size())); - Cr12.add(c); - CardCounts.put(c.getName(), 0); - - c = Sp1CMC.get(r.nextInt(Sp1CMC.size())); - Sp12.add(c); - CardCounts.put(c.getName(), 0); - - c = Sp2CMC.get(r.nextInt(Sp2CMC.size())); - Sp12.add(c); - CardCounts.put(c.getName(), 0); - } - - MinCMC[0] += 2; - MaxCMC[0] += 2; - // resulting mana curve of the card pool - //16x 1 - 2 - //12x 3 - 4 - //8x 5 - 6 - //4x 7 - 8 - //=40x - card pool could support up to a 275 card deck (all 4-ofs plus basic lands) - } - - // shuffle card pools - Cr12.shuffle(); - Sp12.shuffle(); - - // calculate card counts - float p = (float) ((float) CreatPercentage * .01); - int CreatCnt = (int) (p * (float) Size); - tmpDeck += "Creature Count:" + CreatCnt + "\n"; - - p = (float) ((float) SpellPercentage * .01); - int SpellCnt = (int) (p * (float) Size); - tmpDeck += "Spell Count:" + SpellCnt + "\n"; - - // build deck from the card pools - for (int i = 0; i < CreatCnt; i++) { - Card c = Cr12.get(r.nextInt(Cr12.size())); - - lc = 0; - while (CardCounts.get(c.getName()) > 3 || lc > 100) { - c = Cr12.get(r.nextInt(Cr12.size())); - lc++; - } - if (lc > 100) - throw new RuntimeException("Generate2ColorDeck : get2ColorDeck -- looped too much -- Cr12"); - - tDeck.add(AllZone.getCardFactory().getCard(c.getName(), AllZone.getComputerPlayer())); - int n = CardCounts.get(c.getName()); - CardCounts.put(c.getName(), n + 1); - tmpDeck += c.getName() + " " + c.getManaCost() + "\n"; - } - - for (int i = 0; i < SpellCnt; i++) { - Card c = Sp12.get(r.nextInt(Sp12.size())); - - lc = 0; - while (CardCounts.get(c.getName()) > 3 || lc > 100) { - c = Sp12.get(r.nextInt(Sp12.size())); - lc++; - } - if (lc > 100) - throw new RuntimeException("Generate2ColorDeck : get2ColorDeck -- looped too much -- Sp12"); - - tDeck.add(AllZone.getCardFactory().getCard(c.getName(), AllZone.getComputerPlayer())); - int n = CardCounts.get(c.getName()); - CardCounts.put(c.getName(), n + 1); - tmpDeck += c.getName() + " " + c.getManaCost() + "\n"; - } - - // Add lands - int numLands = 0; - if (LandsPercentage > 0) { - p = (float) ((float) LandsPercentage * .01); - numLands = (int) (p * (float) Size); - } else // otherwise, just fill in the rest of the deck with basic lands - numLands = Size - tDeck.size(); - - tmpDeck += "numLands:" + numLands + "\n"; - - int nDLands = (numLands / 6); - for (int i = 0; i < nDLands; i++) { - String s = DL.get(r.nextInt(DL.size())); - - lc = 0; - while (CardCounts.get(s) > 3 || lc > 20) { - s = DL.get(r.nextInt(DL.size())); - lc++; - } - if (lc > 20) - throw new RuntimeException("Generate2ColorDeck : get2ColorDeck -- looped too much -- DL"); - - tDeck.add(AllZone.getCardFactory().getCard(s, AllZone.getHumanPlayer())); - int n = CardCounts.get(s); - CardCounts.put(s, n + 1); - tmpDeck += s + "\n"; - } - - numLands -= nDLands; - - if (numLands > 0) // attempt to optimize basic land counts according to color representation - { - CCnt ClrCnts[] = {new CCnt("Plains", 0), - new CCnt("Island", 0), - new CCnt("Swamp", 0), - new CCnt("Mountain", 0), - new CCnt("Forest", 0)}; - - // count each card color using mana costs - // TODO: count hybrid mana differently? - for (int i = 0; i < tDeck.size(); i++) { - String mc = tDeck.get(i).getManaCost(); - - // count each mana symbol in the mana cost - for (int j = 0; j < mc.length(); j++) { - char c = mc.charAt(j); - - if (c == 'W') - ClrCnts[0].Count++; - else if (c == 'U') - ClrCnts[1].Count++; - else if (c == 'B') - ClrCnts[2].Count++; - else if (c == 'R') - ClrCnts[3].Count++; - else if (c == 'G') - ClrCnts[4].Count++; - } - } - - // total of all ClrCnts - int totalColor = 0; - for (int i = 0; i < 5; i++) { - totalColor += ClrCnts[i].Count; - tmpDeck += ClrCnts[i].Color + ":" + ClrCnts[i].Count + "\n"; - } - - tmpDeck += "totalColor:" + totalColor + "\n"; - - for (int i = 0; i < 5; i++) { - if (ClrCnts[i].Count > 0) { // calculate number of lands for each color - p = (float) ClrCnts[i].Count / (float) totalColor; - int nLand = (int) ((float) numLands * p); - tmpDeck += "nLand-" + ClrCnts[i].Color + ":" + nLand + "\n"; - - // just to prevent a null exception by the deck size fixing code - CardCounts.put(ClrCnts[i].Color, nLand); - - for (int j = 0; j <= nLand; j++) - tDeck.add(AllZone.getCardFactory().getCard(ClrCnts[i].Color, AllZone.getComputerPlayer())); - } - } - } - tmpDeck += "DeckSize:" + tDeck.size() + "\n"; - - // fix under-sized or over-sized decks, due to integer arithmetic - if (tDeck.size() < Size) { - int diff = Size - tDeck.size(); - - for (int i = 0; i < diff; i++) { - Card c = tDeck.get(r.nextInt(tDeck.size())); - - lc = 0; - while (CardCounts.get(c.getName()) > 3 || lc > Size) { - c = tDeck.get(r.nextInt(tDeck.size())); - lc++; - } - if (lc > Size) - throw new RuntimeException("Generate2ColorDeck : get2ColorDeck -- looped too much -- undersize"); - - int n = CardCounts.get(c.getName()); - tDeck.add(AllZone.getCardFactory().getCard(c.getName(), AllZone.getComputerPlayer())); - CardCounts.put(c.getName(), n + 1); - tmpDeck += "Added:" + c.getName() + "\n"; - } - } else if (tDeck.size() > Size) { - int diff = tDeck.size() - Size; - - for (int i = 0; i < diff; i++) { - Card c = tDeck.get(r.nextInt(tDeck.size())); - - while (c.isBasicLand()) // don't remove basic lands - c = tDeck.get(r.nextInt(tDeck.size())); - - tDeck.remove(c); - tmpDeck += "Removed:" + c.getName() + "\n"; - } - } - - tmpDeck += "DeckSize:" + tDeck.size() + "\n"; - if (ForgeProps.getProperty("showdeck/2color", "false").equals("true")) - ErrorViewer.showError(tmpDeck); - - return tDeck; - } - - private class CCnt { - public String Color; - public int Count; - - public CCnt(String clr, int cnt) { - Color = clr; - Count = cnt; - } - } - - private class DLnd { - public String Name; - public String Mana; - - public DLnd(String nm, String mn) { - Name = nm; - Mana = mn; - } - } -} diff --git a/src/forge/deck/generate/Generate3ColorDeck.java b/src/forge/deck/generate/Generate3ColorDeck.java deleted file mode 100644 index 62d114005c6..00000000000 --- a/src/forge/deck/generate/Generate3ColorDeck.java +++ /dev/null @@ -1,417 +0,0 @@ -package forge.deck.generate; - -import forge.*; -import forge.error.ErrorViewer; -import forge.properties.ForgeProps; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; -import java.util.Random; - -/** - *

Generate3ColorDeck class.

- * - * @author Forge - * @version $Id: $ - */ -public class Generate3ColorDeck { - private String color1 = ""; - private String color2 = ""; - private String color3 = ""; - private Random r = null; - private Map ClrMap = null; - private ArrayList notColors = null; - private ArrayList DualLands = null; - private ArrayList DL = null; - private Map CardCounts = null; - - /** - *

Constructor for Generate3ColorDeck.

- * - * @param Clr1 a {@link java.lang.String} object. - * @param Clr2 a {@link java.lang.String} object. - * @param Clr3 a {@link java.lang.String} object. - */ - public Generate3ColorDeck(String Clr1, String Clr2, String Clr3) { - r = MyRandom.random; - - CardCounts = new HashMap(); - - ClrMap = new HashMap(); - ClrMap.put("white", "W"); - ClrMap.put("blue", "U"); - ClrMap.put("black", "B"); - ClrMap.put("red", "R"); - ClrMap.put("green", "G"); - - notColors = new ArrayList(); - notColors.add("white"); - notColors.add("blue"); - notColors.add("black"); - notColors.add("red"); - notColors.add("green"); - - DualLands = new ArrayList(); - DualLands.add(new DLnd("Tundra", "WU")); - DualLands.add(new DLnd("Hallowed Fountain", "WU")); - DualLands.add(new DLnd("Underground Sea", "UB")); - DualLands.add(new DLnd("Watery Grave", "UB")); - DualLands.add(new DLnd("Badlands", "BR")); - DualLands.add(new DLnd("Blood Crypt", "BR")); - DualLands.add(new DLnd("Taiga", "RG")); - DualLands.add(new DLnd("Stomping Ground", "RG")); - DualLands.add(new DLnd("Savannah", "GW")); - DualLands.add(new DLnd("Temple Garden", "GW")); - DualLands.add(new DLnd("Scrubland", "WB")); - DualLands.add(new DLnd("Godless Shrine", "WB")); - DualLands.add(new DLnd("Volcanic Island", "UR")); - DualLands.add(new DLnd("Steam Vents", "UR")); - DualLands.add(new DLnd("Bayou", "BG")); - DualLands.add(new DLnd("Overgrown Tomb", "BG")); - DualLands.add(new DLnd("Plateau", "RW")); - DualLands.add(new DLnd("Sacred Foundry", "RW")); - DualLands.add(new DLnd("Tropical Island", "GU")); - DualLands.add(new DLnd("Breeding Pool", "GU")); - - if (Clr1.equals("AI")) { - // choose first color - color1 = notColors.get(r.nextInt(5)); - - // choose second color - String c2 = notColors.get(r.nextInt(5)); - while (c2.equals(color1)) - c2 = notColors.get(r.nextInt(5)); - color2 = c2; - - String c3 = notColors.get(r.nextInt(5)); - while (c3.equals(color1) || c3.equals(color2)) - c3 = notColors.get(r.nextInt(5)); - color3 = c3; - } else { - color1 = Clr1; - color2 = Clr2; - color3 = Clr3; - } - - notColors.remove(color1); - notColors.remove(color2); - notColors.remove(color3); - - DL = new ArrayList(); - for (int i = 0; i < DualLands.size(); i++) { - DLnd d = DualLands.get(i); - if ((d.Mana.contains(ClrMap.get(color1)) && d.Mana.contains(ClrMap.get(color2))) || - (d.Mana.contains(ClrMap.get(color1)) && d.Mana.contains(ClrMap.get(color3))) || - (d.Mana.contains(ClrMap.get(color2)) && d.Mana.contains(ClrMap.get(color3)))) { - DL.add(d.Name); - CardCounts.put(d.Name, 0); - } - } - - } - - /** - *

get3ColorDeck.

- * - * @param Size a int. - * @return a {@link forge.CardList} object. - */ - public CardList get3ColorDeck(int Size) { - int lc = 0; // loop counter to prevent infinite card selection loops - String tmpDeck = ""; - CardList tDeck = new CardList(); - - int LandsPercentage = 44; - int CreatPercentage = 34; - int SpellPercentage = 22; - - // start with all cards - // remove cards that generated decks don't like - CardList AllCards = CardFilter.filter(AllZone.getCardFactory(), new CardListFilter() { - public boolean addCard(Card c) { - return !(c.getSVar("RemAIDeck").equals("True") || c.getSVar("RemRandomDeck").equals("True")); - } - }); - - // reduce to cards that match the colors - CardList CL1 = AllCards.getColor(color1); - CardList CL2 = AllCards.getColor(color2); - CardList CL3 = AllCards.getColor(color3); - - // remove multicolor cards that don't match the colors - CardListFilter clrF = new CardListFilter() { - public boolean addCard(Card c) { - for (int i = 0; i < notColors.size(); i++) { - if (c.getManaCost().contains(ClrMap.get(notColors.get(i)))) - return false; - } - return true; - } - }; - CL1 = CL1.filter(clrF); - CL2 = CL2.filter(clrF); - CL3 = CL3.filter(clrF); - - // build subsets based on type - CardList Cr1 = CL1.getType("Creature"); - CardList Cr2 = CL2.getType("Creature"); - CardList Cr3 = CL3.getType("Creature"); - - String ISE[] = {"Instant", "Sorcery", "Enchantment", "Planeswalker"}; - CardList Sp1 = CL1.getValidCards(ISE, null, null); - CardList Sp2 = CL2.getValidCards(ISE, null, null); - CardList Sp3 = CL3.getValidCards(ISE, null, null); - - // final card pools - CardList Cr123 = new CardList(); - CardList Sp123 = new CardList(); - - // used for mana curve in the card pool - final int MinCMC[] = {1}, MaxCMC[] = {3}; - CardListFilter cmcF = new CardListFilter() { - public boolean addCard(Card c) { - int cCMC = c.getCMC(); - return (cCMC >= MinCMC[0]) && (cCMC <= MaxCMC[0]); - } - }; - - // select cards to build card pools using a mana curve - for (int i = 3; i > 0; i--) { - CardList Cr1CMC = Cr1.filter(cmcF); - CardList Cr2CMC = Cr2.filter(cmcF); - CardList Cr3CMC = Cr3.filter(cmcF); - - CardList Sp1CMC = Sp1.filter(cmcF); - CardList Sp2CMC = Sp2.filter(cmcF); - CardList Sp3CMC = Sp3.filter(cmcF); - - for (int j = 0; j < i; j++) { - Card c = Cr1CMC.get(r.nextInt(Cr1CMC.size())); - Cr123.add(c); - CardCounts.put(c.getName(), 0); - - c = Cr2CMC.get(r.nextInt(Cr2CMC.size())); - Cr123.add(c); - CardCounts.put(c.getName(), 0); - - c = Cr3CMC.get(r.nextInt(Cr3CMC.size())); - Cr123.add(c); - CardCounts.put(c.getName(), 0); - - c = Sp1CMC.get(r.nextInt(Sp1CMC.size())); - Sp123.add(c); - CardCounts.put(c.getName(), 0); - - c = Sp2CMC.get(r.nextInt(Sp2CMC.size())); - Sp123.add(c); - CardCounts.put(c.getName(), 0); - - c = Sp3CMC.get(r.nextInt(Sp3CMC.size())); - Sp123.add(c); - CardCounts.put(c.getName(), 0); - } - - MinCMC[0] += 2; - MaxCMC[0] += 2; - // resulting mana curve of the card pool - //18x 1 - 3 - //12x 3 - 5 - //6x 5 - 7 - //=36x - card pool could support up to a 257 card deck (all 4-ofs plus basic lands) - } - - // shuffle card pools - Cr123.shuffle(); - Sp123.shuffle(); - - // calculate card counts - float p = (float) ((float) CreatPercentage * .01); - int CreatCnt = (int) (p * (float) Size); - tmpDeck += "Creature Count:" + CreatCnt + "\n"; - - p = (float) ((float) SpellPercentage * .01); - int SpellCnt = (int) (p * (float) Size); - tmpDeck += "Spell Count:" + SpellCnt + "\n"; - - // build deck from the card pools - for (int i = 0; i < CreatCnt; i++) { - Card c = Cr123.get(r.nextInt(Cr123.size())); - - lc = 0; - while (CardCounts.get(c.getName()) > 3 || lc > 100) { - c = Cr123.get(r.nextInt(Cr123.size())); - lc++; - } - if (lc > 100) - throw new RuntimeException("Generate3ColorDeck : get3ColorDeck -- looped too much -- Cr123"); - - tDeck.add(AllZone.getCardFactory().getCard(c.getName(), AllZone.getComputerPlayer())); - int n = CardCounts.get(c.getName()); - CardCounts.put(c.getName(), n + 1); - tmpDeck += c.getName() + " " + c.getManaCost() + "\n"; - } - - for (int i = 0; i < SpellCnt; i++) { - Card c = Sp123.get(r.nextInt(Sp123.size())); - - lc = 0; - while (CardCounts.get(c.getName()) > 3 || lc > 100) { - c = Sp123.get(r.nextInt(Sp123.size())); - lc++; - } - if (lc > 100) - throw new RuntimeException("Generate3ColorDeck : get3ColorDeck -- looped too much -- Sp123"); - - tDeck.add(AllZone.getCardFactory().getCard(c.getName(), AllZone.getComputerPlayer())); - int n = CardCounts.get(c.getName()); - CardCounts.put(c.getName(), n + 1); - tmpDeck += c.getName() + " " + c.getManaCost() + "\n"; - } - - // Add lands - int numLands = 0; - if (LandsPercentage > 0) { - p = (float) ((float) LandsPercentage * .01); - numLands = (int) (p * (float) Size); - } else // otherwise, just fill in the rest of the deck with basic lands - numLands = Size - tDeck.size(); - - tmpDeck += "numLands:" + numLands + "\n"; - - int nDLands = (numLands / 4); - for (int i = 0; i < nDLands; i++) { - String s = DL.get(r.nextInt(DL.size())); - - lc = 0; - while (CardCounts.get(s) > 3 || lc > 20) { - s = DL.get(r.nextInt(DL.size())); - lc++; - } - if (lc > 20) - throw new RuntimeException("Generate3ColorDeck : get3ColorDeck -- looped too much -- DL"); - - tDeck.add(AllZone.getCardFactory().getCard(s, AllZone.getHumanPlayer())); - int n = CardCounts.get(s); - CardCounts.put(s, n + 1); - tmpDeck += s + "\n"; - } - - numLands -= nDLands; - - if (numLands > 0) // attempt to optimize basic land counts according to color representation - { - CCnt ClrCnts[] = {new CCnt("Plains", 0), - new CCnt("Island", 0), - new CCnt("Swamp", 0), - new CCnt("Mountain", 0), - new CCnt("Forest", 0)}; - - // count each card color using mana costs - // TODO: count hybrid mana differently? - for (int i = 0; i < tDeck.size(); i++) { - String mc = tDeck.get(i).getManaCost(); - - // count each mana symbol in the mana cost - for (int j = 0; j < mc.length(); j++) { - char c = mc.charAt(j); - - if (c == 'W') - ClrCnts[0].Count++; - else if (c == 'U') - ClrCnts[1].Count++; - else if (c == 'B') - ClrCnts[2].Count++; - else if (c == 'R') - ClrCnts[3].Count++; - else if (c == 'G') - ClrCnts[4].Count++; - } - } - - // total of all ClrCnts - int totalColor = 0; - for (int i = 0; i < 5; i++) { - totalColor += ClrCnts[i].Count; - tmpDeck += ClrCnts[i].Color + ":" + ClrCnts[i].Count + "\n"; - } - - tmpDeck += "totalColor:" + totalColor + "\n"; - - for (int i = 0; i < 5; i++) { - if (ClrCnts[i].Count > 0) { // calculate number of lands for each color - p = (float) ClrCnts[i].Count / (float) totalColor; - int nLand = (int) ((float) numLands * p); - tmpDeck += "nLand-" + ClrCnts[i].Color + ":" + nLand + "\n"; - - // just to prevent a null exception by the deck size fixing code - CardCounts.put(ClrCnts[i].Color, nLand); - - for (int j = 0; j <= nLand; j++) - tDeck.add(AllZone.getCardFactory().getCard(ClrCnts[i].Color, AllZone.getComputerPlayer())); - } - } - } - tmpDeck += "DeckSize:" + tDeck.size() + "\n"; - - // fix under-sized or over-sized decks, due to integer arithmetic - if (tDeck.size() < Size) { - int diff = Size - tDeck.size(); - - for (int i = 0; i < diff; i++) { - Card c = tDeck.get(r.nextInt(tDeck.size())); - - lc = 0; - while (CardCounts.get(c.getName()) > 3 || lc > Size) { - c = tDeck.get(r.nextInt(tDeck.size())); - lc++; - } - if (lc > Size) - throw new RuntimeException("Generate3ColorDeck : get3ColorDeck -- looped too much -- undersize"); - - int n = CardCounts.get(c.getName()); - tDeck.add(AllZone.getCardFactory().getCard(c.getName(), AllZone.getComputerPlayer())); - CardCounts.put(c.getName(), n + 1); - tmpDeck += "Added:" + c.getName() + "\n"; - } - } else if (tDeck.size() > Size) { - int diff = tDeck.size() - Size; - - for (int i = 0; i < diff; i++) { - Card c = tDeck.get(r.nextInt(tDeck.size())); - - while (c.isBasicLand()) // don't remove basic lands - c = tDeck.get(r.nextInt(tDeck.size())); - - tDeck.remove(c); - tmpDeck += "Removed:" + c.getName() + "\n"; - } - } - - tmpDeck += "DeckSize:" + tDeck.size() + "\n"; - if (ForgeProps.getProperty("showdeck/3color", "false").equals("true")) - ErrorViewer.showError(tmpDeck); - - return tDeck; - } - - private class CCnt { - public String Color; - public int Count; - - public CCnt(String clr, int cnt) { - Color = clr; - Count = cnt; - } - } - - private class DLnd { - public String Name; - public String Mana; - - public DLnd(String nm, String mn) { - Name = nm; - Mana = mn; - } - } -} diff --git a/src/forge/deck/generate/GenerateConstructedDeck.java b/src/forge/deck/generate/GenerateConstructedDeck.java deleted file mode 100644 index 4cd43ee9131..00000000000 --- a/src/forge/deck/generate/GenerateConstructedDeck.java +++ /dev/null @@ -1,193 +0,0 @@ -package forge.deck.generate; - -import forge.*; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -/** - *

GenerateConstructedDeck class.

- * - * @author Forge - * @version $Id: $ - */ -public class GenerateConstructedDeck { - private String color1; - private String color2; - - private Map map = new HashMap(); - - /** - *

Constructor for GenerateConstructedDeck.

- */ - public GenerateConstructedDeck() { - setupMap(); - } - - /** - *

setupMap.

- */ - private void setupMap() { - map.put(Constant.Color.Black, "Swamp"); - map.put(Constant.Color.Blue, "Island"); - map.put(Constant.Color.Green, "Forest"); - map.put(Constant.Color.Red, "Mountain"); - map.put(Constant.Color.White, "Plains"); - } - - /** - *

generateDeck.

- * - * @return a {@link forge.CardList} object. - */ - public CardList generateDeck() { - CardList deck; - - int check; - - do { - deck = get2ColorDeck(); - check = deck.getType("Creature").size(); - - } while (check < 16 || 24 < check); - - addLand(deck); - - if (deck.size() != 60) - throw new RuntimeException("GenerateConstructedDeck() : generateDeck() error, deck size it not 60, deck size is " + deck.size()); - - return deck; - } - - //25 lands - /** - *

addLand.

- * - * @param list a {@link forge.CardList} object. - */ - private void addLand(CardList list) { - Card land; - for (int i = 0; i < 13; i++) { - land = AllZone.getCardFactory().getCard(map.get(color1).toString(), AllZone.getComputerPlayer()); - list.add(land); - - land = AllZone.getCardFactory().getCard(map.get(color2).toString(), AllZone.getComputerPlayer()); - list.add(land); - } - }//addLand() - - /** - * Creates a CardList from the set of all cards that meets the criteria - * for color(s), type, whether the card is suitable for - * placement in random decks and in AI decks, etc. - * - * @see #filterBadCards(Iterable) - * - * @return a subset of carsd <= the set of all cards; might be empty, but - * never null - */ - private CardList getCards() { - return filterBadCards(AllZone.getCardFactory()); - }//getCards() - - /** - *

get2ColorDeck.

- * - * @return a {@link forge.CardList} object. - */ - private CardList get2ColorDeck() { - CardList deck = get2Colors(getCards()); - - CardList out = new CardList(); - deck.shuffle(); - - //trim deck size down to 34 cards, presumes 26 land, for a total of 60 cards - for (int i = 0; i < 34 && i < deck.size(); i++) - out.add(deck.get(i)); - - return out; - } - - /** - *

get2Colors.

- * - * @param in a {@link forge.CardList} object. - * @return a {@link forge.CardList} object. - */ - private CardList get2Colors(CardList in) { - int a; - int b; - - do { - a = CardUtil.getRandomIndex(Constant.Color.onlyColors); - b = CardUtil.getRandomIndex(Constant.Color.onlyColors); - } while (a == b);//do not want to get the same color twice - - color1 = Constant.Color.onlyColors[a]; - color2 = Constant.Color.onlyColors[b]; - - CardList out = new CardList(); - out.addAll(CardListUtil.getColor(in, color1)); - out.addAll(CardListUtil.getColor(in, color2)); - out.shuffle(); - - CardList artifact = in.filter(new CardListFilter() { - public boolean addCard(Card c) { - //is this really a colorless artifact and not something - //wierd like Sarcomite Myr which is a colored artifact - return c.isArtifact() && - CardUtil.getColors(c).contains(Constant.Color.Colorless) && - !Gui_NewGame.removeArtifacts.isSelected(); - } - }); - out.addAll(artifact); - - out = out.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (c.isCreature() && - c.getNetAttack() <= 1 && - Gui_NewGame.removeSmallCreatures.isSelected()) { - return false; - } - - return true; - } - }); - - out = filterBadCards(out); - return out; - } - - /** - * Creates a CardList from the given sequence that meets the criteria - * for color(s), type, whether the card is suitable for - * placement in random decks and in AI decks, etc. - * - * @param sequence an iterable over Card instances - * - * @return a subset of sequence <= sequence; might be empty, but never - * null - */ - private CardList filterBadCards(Iterable sequence) { - - final ArrayList goodLand = new ArrayList(); - - CardList out = CardFilter.filter(sequence, new CardListFilter() { - public boolean addCard(Card c) { - ArrayList list = CardUtil.getColors(c); - if (list.size() == 2) { - if (!(list.contains(color1) && list.contains(color2))) - return false; - } - return CardUtil.getColors(c).size() <= 2 && //only dual colored gold cards - !c.isLand() && //no land - !c.getSVar("RemRandomDeck").equals("True") && - !c.getSVar("RemAIDeck").equals("True") || //OR very important - goodLand.contains(c.getName()); - } - }); - - return out; - }//filterBadCards() -} diff --git a/src/forge/deck/generate/GenerateConstructedMultiColorDeck.java b/src/forge/deck/generate/GenerateConstructedMultiColorDeck.java deleted file mode 100644 index 28c7a4d53b7..00000000000 --- a/src/forge/deck/generate/GenerateConstructedMultiColorDeck.java +++ /dev/null @@ -1,438 +0,0 @@ -package forge.deck.generate; - -import forge.*; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -/** - *

GenerateConstructedMultiColorDeck class.

- * - * @author Forge - * @version $Id: $ - */ -public class GenerateConstructedMultiColorDeck { - private String color1; - private String color2; - private String color3; - private String color4; - private String color5; - - private Map map = new HashMap(); - private Map multiMap = new HashMap(); - - /** - *

Constructor for GenerateConstructedMultiColorDeck.

- */ - public GenerateConstructedMultiColorDeck() { - setupBasicLandMap(); - setupMultiMap(); - } - - /** - *

setupBasicLandMap.

- */ - private void setupBasicLandMap() { - map.put(Constant.Color.Black, "Swamp"); - map.put(Constant.Color.Blue, "Island"); - map.put(Constant.Color.Green, "Forest"); - map.put(Constant.Color.Red, "Mountain"); - map.put(Constant.Color.White, "Plains"); - } - - /** - *

setupMultiMap.

- */ - private void setupMultiMap() { - multiMap.put(Constant.Color.Black + Constant.Color.Blue, new String[]{"Underground Sea", "Watery Grave"}); - multiMap.put(Constant.Color.Black + Constant.Color.Green, new String[]{"Bayou", "Overgrown Tomb"}); - multiMap.put(Constant.Color.Black + Constant.Color.Red, new String[]{"Badlands", "Blood Crypt"}); - multiMap.put(Constant.Color.Black + Constant.Color.White, new String[]{"Scrubland", "Godless Shrine"}); - multiMap.put(Constant.Color.Blue + Constant.Color.Black, new String[]{"Underground Sea", "Watery Grave"}); - multiMap.put(Constant.Color.Blue + Constant.Color.Green, new String[]{"Tropical Island", "Breeding Pool"}); - multiMap.put(Constant.Color.Blue + Constant.Color.Red, new String[]{"Volcanic Island", "Steam Vents"}); - multiMap.put(Constant.Color.Blue + Constant.Color.White, new String[]{"Tundra", "Hallowed Fountain"}); - multiMap.put(Constant.Color.Green + Constant.Color.Black, new String[]{"Bayou", "Overgrown Tomb"}); - multiMap.put(Constant.Color.Green + Constant.Color.Blue, new String[]{"Tropical Island", "Breeding Pool"}); - multiMap.put(Constant.Color.Green + Constant.Color.Red, new String[]{"Taiga", "Stomping Ground"}); - multiMap.put(Constant.Color.Green + Constant.Color.White, new String[]{"Savannah", "Temple Garden"}); - multiMap.put(Constant.Color.Red + Constant.Color.Black, new String[]{"Badlands", "Blood Crypt"}); - multiMap.put(Constant.Color.Red + Constant.Color.Blue, new String[]{"Volcanic Island", "Steam Vents"}); - multiMap.put(Constant.Color.Red + Constant.Color.Green, new String[]{"Taiga", "Stomping Ground"}); - multiMap.put(Constant.Color.Red + Constant.Color.White, new String[]{"Plateau", "Sacred Foundry"}); - multiMap.put(Constant.Color.White + Constant.Color.Black, new String[]{"Scrubland", "Godless Shrine"}); - multiMap.put(Constant.Color.White + Constant.Color.Blue, new String[]{"Tundra", "Hallowed Fountain"}); - multiMap.put(Constant.Color.White + Constant.Color.Green, new String[]{"Savannah", "Temple Garden"}); - multiMap.put(Constant.Color.White + Constant.Color.Red, new String[]{"Plateau", "Sacred Foundry"}); - } - - - /** - *

generate3ColorDeck.

- * - * @return a {@link forge.CardList} object. - */ - public CardList generate3ColorDeck() { - CardList deck; - - int check; - - do { - deck = get3ColorDeck(); - check = deck.getType("Creature").size(); - - } while (check < 16 || 24 < check); - - addLand(deck, 3); - - if (deck.size() != 60) - throw new RuntimeException("GenerateConstructedDeck() : generateDeck() error, deck size it not 60, deck size is " + deck.size()); - - return deck; - } - - /** - *

generate5ColorDeck.

- * - * @return a {@link forge.CardList} object. - */ - public CardList generate5ColorDeck() { - CardList deck; - - /* - int check; - - do{ - deck = get5ColorDeck(); - check = deck.getType("Creature").size(); - - }while(check < 15 || 25 < check); - */ - - deck = get5ColorDeck(); - - addLand(deck, 5); - - if (deck.size() != 61) - throw new RuntimeException("GenerateConstructedDeck() : generateDeck() error, deck size it not 60, deck size is " + deck.size()); - - return deck; - } - - /** - *

addLand.

- * - * @param list a {@link forge.CardList} object. - * @param colors a int. - */ - private void addLand(CardList list, int colors) { - if (colors == 3) { - int numberBasic = 2; - Card land; - for (int i = 0; i < numberBasic; i++) { - - land = AllZone.getCardFactory().getCard(map.get(color1).toString(), AllZone.getComputerPlayer()); - list.add(land); - - land = AllZone.getCardFactory().getCard(map.get(color2).toString(), AllZone.getComputerPlayer()); - list.add(land); - - land = AllZone.getCardFactory().getCard(map.get(color3).toString(), AllZone.getComputerPlayer()); - list.add(land); - } - - int numberDual = 4; - for (int i = 0; i < numberDual; i++) { - land = AllZone.getCardFactory().getCard(multiMap.get(color1 + color2)[0], AllZone.getComputerPlayer()); - list.add(land); - - land = AllZone.getCardFactory().getCard(multiMap.get(color1 + color3)[0], AllZone.getComputerPlayer()); - list.add(land); - - land = AllZone.getCardFactory().getCard(multiMap.get(color2 + color3)[0], AllZone.getComputerPlayer()); - list.add(land); - } - for (int i = 0; i < 2; i++) { - land = AllZone.getCardFactory().getCard(multiMap.get(color1 + color2)[1], AllZone.getComputerPlayer()); - list.add(land); - - land = AllZone.getCardFactory().getCard(multiMap.get(color1 + color3)[1], AllZone.getComputerPlayer()); - list.add(land); - - land = AllZone.getCardFactory().getCard(multiMap.get(color2 + color3)[1], AllZone.getComputerPlayer()); - list.add(land); - } - } else if (colors == 5) { - int numberBasic = 1; - Card land; - for (int i = 0; i < numberBasic; i++) { - - land = AllZone.getCardFactory().getCard(map.get(color1).toString(), AllZone.getComputerPlayer()); - list.add(land); - - land = AllZone.getCardFactory().getCard(map.get(color2).toString(), AllZone.getComputerPlayer()); - list.add(land); - - land = AllZone.getCardFactory().getCard(map.get(color3).toString(), AllZone.getComputerPlayer()); - list.add(land); - - land = AllZone.getCardFactory().getCard(map.get(color4).toString(), AllZone.getComputerPlayer()); - list.add(land); - - land = AllZone.getCardFactory().getCard(map.get(color5).toString(), AllZone.getComputerPlayer()); - list.add(land); - } - - - int numberDual = 2; - for (int i = 0; i < numberDual; i++) { - land = AllZone.getCardFactory().getCard(multiMap.get(color1 + color2)[0], AllZone.getComputerPlayer()); - list.add(land); - - land = AllZone.getCardFactory().getCard(multiMap.get(color1 + color3)[0], AllZone.getComputerPlayer()); - list.add(land); - - land = AllZone.getCardFactory().getCard(multiMap.get(color1 + color4)[0], AllZone.getComputerPlayer()); - list.add(land); - - land = AllZone.getCardFactory().getCard(multiMap.get(color1 + color5)[0], AllZone.getComputerPlayer()); - list.add(land); - - land = AllZone.getCardFactory().getCard(multiMap.get(color2 + color3)[0], AllZone.getComputerPlayer()); - list.add(land); - - land = AllZone.getCardFactory().getCard(multiMap.get(color2 + color4)[0], AllZone.getComputerPlayer()); - list.add(land); - - land = AllZone.getCardFactory().getCard(multiMap.get(color2 + color5)[0], AllZone.getComputerPlayer()); - list.add(land); - - land = AllZone.getCardFactory().getCard(multiMap.get(color3 + color4)[0], AllZone.getComputerPlayer()); - list.add(land); - - land = AllZone.getCardFactory().getCard(multiMap.get(color3 + color5)[0], AllZone.getComputerPlayer()); - list.add(land); - - land = AllZone.getCardFactory().getCard(multiMap.get(color4 + color5)[0], AllZone.getComputerPlayer()); - list.add(land); - } - - } - }//addLand() - - /** - * Filters out cards by color and their suitability for being placed in - * a randomly created deck. - * - * @param colors the number of different colors the deck should have; - * if this is a number other than 3 or 5, we return an empty list. - * - * @return a subset of all cards in the CardFactory database - * which might be empty, but never null - */ - private CardList getCards(int colors) { - return filterBadCards(AllZone.getCardFactory(), colors); - }//getCards() - - /** - *

get3ColorDeck.

- * - * @return a {@link forge.CardList} object. - */ - private CardList get3ColorDeck() { - CardList deck = get3Colors(getCards(3)); - - CardList out = new CardList(); - deck.shuffle(); - - //trim deck size down to 36 cards, presumes 24 land, for a total of 60 cards - for (int i = 0; i < 36 && i < deck.size(); i++) - out.add(deck.get(i)); - - return out; - } - - /** - *

get5ColorDeck.

- * - * @return a {@link forge.CardList} object. - */ - private CardList get5ColorDeck() { - CardList deck = get5Colors(getCards(5)); - - CardList out = new CardList(); - deck.shuffle(); - - //trim deck size down to 36 cards, presumes 24 land, for a total of 60 cards - for (int i = 0; i < 36 && i < deck.size(); i++) - out.add(deck.get(i)); - - return out; - } - - /** - *

get3Colors.

- * - * @param in a {@link forge.CardList} object. - * @return a {@link forge.CardList} object. - */ - private CardList get3Colors(CardList in) { - int a; - int b; - int c; - - a = CardUtil.getRandomIndex(Constant.Color.onlyColors); - do { - b = CardUtil.getRandomIndex(Constant.Color.onlyColors); - c = CardUtil.getRandomIndex(Constant.Color.onlyColors); - } while (a == b || a == c || b == c);//do not want to get the same color thrice - - color1 = Constant.Color.onlyColors[a]; - color2 = Constant.Color.onlyColors[b]; - color3 = Constant.Color.onlyColors[c]; - - CardList out = new CardList(); - out.addAll(CardListUtil.getColor(in, color1)); - out.addAll(CardListUtil.getColor(in, color2)); - out.addAll(CardListUtil.getColor(in, color3)); - out.shuffle(); - - CardList artifact = in.filter(new CardListFilter() { - public boolean addCard(Card c) { - //is this really a colorless artifact and not something - //wierd like Sarcomite Myr which is a colored artifact - return c.isArtifact() && - CardUtil.getColors(c).contains(Constant.Color.Colorless) && - !Gui_NewGame.removeArtifacts.isSelected(); - } - }); - out.addAll(artifact); - - out = out.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (c.isCreature() && - c.getNetAttack() <= 1 && - Gui_NewGame.removeSmallCreatures.isSelected()) { - return false; - } - - return true; - } - }); - - out = filterBadCards(out, 3); - return out; - } - - /** - *

get5Colors.

- * - * @param in a {@link forge.CardList} object. - * @return a {@link forge.CardList} object. - */ - private CardList get5Colors(CardList in) { - - color1 = Constant.Color.Black; - color2 = Constant.Color.Blue; - color3 = Constant.Color.Green; - color4 = Constant.Color.Red; - color5 = Constant.Color.White; - - CardList out = new CardList(); - /* - out.addAll(CardListUtil.getColor(in, color1)); - out.addAll(CardListUtil.getColor(in, color2)); - out.addAll(CardListUtil.getColor(in, color3)); - out.addAll(CardListUtil.getColor(in, color4)); - out.addAll(CardListUtil.getColor(in, color5)); - */ - out.addAll(CardListUtil.getGoldCards(in)); - out.shuffle(); - - CardList artifact = in.filter(new CardListFilter() { - public boolean addCard(Card c) { - //is this really a colorless artifact and not something - //wierd like Sarcomite Myr which is a colored artifact - return c.isArtifact() && - CardUtil.getColors(c).contains(Constant.Color.Colorless) && - !Gui_NewGame.removeArtifacts.isSelected(); - } - }); - out.addAll(artifact); - - out = out.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (c.isCreature() && - c.getNetAttack() <= 1 && - Gui_NewGame.removeSmallCreatures.isSelected()) { - return false; - } - - return true; - } - }); - - out = filterBadCards(out, 3); - return out; - } - - - /** - * Filters out cards by color and their suitability for being placed in - * a randomly created deck. - * - * @param sequence an Iterable of Card instances - * - * @param colors the number of different colors the deck should have; - * if this is a number other than 3 or 5, we return an empty list. - * - * @return a subset of sequence <= sequence which might be empty, but - * never null - */ - private CardList filterBadCards(Iterable sequence, int colors) { - final ArrayList goodLand = new ArrayList(); - //goodLand.add("Faerie Conclave"); - //goodLand.add("Forbidding Watchtower"); - //goodLand.add("Treetop Village"); - - CardList out = new CardList(); - if (colors == 3) { - - out = CardFilter.filter(sequence, new CardListFilter() { - public boolean addCard(Card c) { - ArrayList list = CardUtil.getColors(c); - - if (list.size() == 3) { - if (!list.contains(color1) || !list.contains(color2) || !list.contains(color3)) - return false; - } else if (list.size() == 2) { - if (!(list.contains(color1) && list.contains(color2)) && - !(list.contains(color1) && list.contains(color3)) && - !(list.contains(color2) && list.contains(color3))) - return false; - } - - return CardUtil.getColors(c).size() <= 3 && - !c.isLand() && //no land - !c.getSVar("RemRandomDeck").equals("True") && - !c.getSVar("RemAIDeck").equals("True") || //OR very important - goodLand.contains(c.getName()); - } - }); - } else if (colors == 5) { - out = CardFilter.filter(sequence, new CardListFilter() { - public boolean addCard(Card c) { - return CardUtil.getColors(c).size() >= 2 && //only get multicolored cards - !c.isLand() && //no land - !c.getSVar("RemRandomDeck").equals("True") && - !c.getSVar("RemAIDeck").equals("True") || //OR very important - goodLand.contains(c.getName()); - } - }); - - } - - return out; - }//filterBadCards() -} diff --git a/src/forge/deck/generate/GenerateThemeDeck.java b/src/forge/deck/generate/GenerateThemeDeck.java deleted file mode 100644 index 9a366278520..00000000000 --- a/src/forge/deck/generate/GenerateThemeDeck.java +++ /dev/null @@ -1,297 +0,0 @@ -package forge.deck.generate; - -import forge.AllZone; -import forge.Card; -import forge.CardList; -import forge.MyRandom; -import forge.error.ErrorViewer; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; -import java.util.Random; - -/** - *

GenerateThemeDeck class.

- * - * @author Forge - * @version $Id: $ - */ -public class GenerateThemeDeck { - private BufferedReader in = null; - - /** - *

Constructor for GenerateThemeDeck.

- */ - public GenerateThemeDeck() { - - } - - /** - *

getThemeNames.

- * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getThemeNames() { - ArrayList ltNames = new ArrayList(); - - File file = new File("res/quest/themes/"); - - if (!file.exists()) - throw new RuntimeException("GenerateThemeDeck : getThemeNames error -- file not found -- filename is " - + file.getAbsolutePath()); - - if (!file.isDirectory()) - throw new RuntimeException("GenerateThemeDeck : getThemeNames error -- not a direcotry -- " - + file.getAbsolutePath()); - - String[] fileList = file.list(); - for (int i = 0; i < fileList.length; i++) { - if (fileList[i].endsWith(".thm")) - ltNames.add(fileList[i].substring(0, fileList[i].indexOf(".thm"))); - } - - return ltNames; - } - - /** - *

getThemeDeck.

- * - * @param ThemeName a {@link java.lang.String} object. - * @param Size a int. - * @return a {@link forge.CardList} object. - */ - public CardList getThemeDeck(String ThemeName, int Size) { - CardList tDeck = new CardList(); - - ArrayList Groups = new ArrayList(); - - Map CardCounts = new HashMap(); - - String s = ""; - int BLandPercentage = 0; - boolean Testing = false; - - // read theme file - String tFileName = "res/quest/themes/" + ThemeName + ".thm"; - File tFile = new File(tFileName); - if (!tFile.exists()) - throw new RuntimeException("GenerateThemeDeck : getThemeDeck -- file not found -- filename is " + tFile.getAbsolutePath()); - - try { - in = new BufferedReader(new FileReader(tFile)); - } catch (Exception ex) { - ErrorViewer.showError(ex, "File \"%s\" exception", tFile.getAbsolutePath()); - throw new RuntimeException("GenerateThemeDeck : getThemeDeck -- file exception -- filename is " + tFile.getPath()); - } - - s = readLine(); - while (!s.equals("End")) { - if (s.startsWith("[Group")) { - Grp G = new Grp(); - - String ss[] = s.replaceAll("[\\[\\]]", "").split(" "); - for (int i = 0; i < ss.length; i++) { - if (ss[i].startsWith("Percentage")) { - String p = ss[i].substring("Percentage".length() + 1); - G.Percentage = Integer.parseInt(p); - } - if (ss[i].startsWith("MaxCnt")) { - String m = ss[i].substring("MaxCnt".length() + 1); - G.MaxCnt = Integer.parseInt(m); - } - } - - s = readLine(); - while (!s.equals("[/Group]")) { - G.Cardnames.add(s); - CardCounts.put(s, 0); - - s = readLine(); - } - - Groups.add(G); - } - - if (s.startsWith("BasicLandPercentage")) - BLandPercentage = Integer.parseInt(s.substring("BasicLandPercentage".length() + 1)); - - if (s.equals("Testing")) - Testing = true; - - s = readLine(); - } - - try { - in.close(); - } catch (IOException ex) { - ErrorViewer.showError(ex, "File \"%s\" exception", tFile.getAbsolutePath()); - throw new RuntimeException("GenerateThemeDeck : getThemeDeck -- file exception -- filename is " + tFile.getPath()); - } - - String tmpDeck = ""; - - // begin assigning cards to the deck - Random r = MyRandom.random; - - for (int i = 0; i < Groups.size(); i++) { - Grp G = Groups.get(i); - float p = (float) ((float) G.Percentage * .01); - int GrpCnt = (int) (p * (float) Size); - int cnSize = G.Cardnames.size(); - tmpDeck += "Group" + i + ":" + GrpCnt + "\n"; - - for (int j = 0; j < GrpCnt; j++) { - s = G.Cardnames.get(r.nextInt(cnSize)); - - int lc = 0; - while (CardCounts.get(s) >= G.MaxCnt || lc > Size) // don't keep looping forever - { - s = G.Cardnames.get(r.nextInt(cnSize)); - lc++; - } - if (lc > Size) - throw new RuntimeException("GenerateThemeDeck : getThemeDeck -- looped too much -- filename is " + tFile.getAbsolutePath()); - - int n = CardCounts.get(s); - tDeck.add(AllZone.getCardFactory().getCard(s, AllZone.getComputerPlayer())); - CardCounts.put(s, n + 1); - tmpDeck += s + "\n"; - - } - } - - int numBLands = 0; - if (BLandPercentage > 0) // if theme explicitly defines this - { - float p = (float) ((float) BLandPercentage * .01); - numBLands = (int) (p * (float) Size); - } else // otherwise, just fill in the rest of the deck with basic lands - numBLands = Size - tDeck.size(); - - tmpDeck += "numBLands:" + numBLands + "\n"; - - if (numBLands > 0) // attempt to optimize basic land counts according to color representation - { - CCnt ClrCnts[] = {new CCnt("Plains", 0), - new CCnt("Island", 0), - new CCnt("Swamp", 0), - new CCnt("Mountain", 0), - new CCnt("Forest", 0)}; - - // count each instance of a color in mana costs - // TODO: count hybrid mana differently? - for (int i = 0; i < tDeck.size(); i++) { - String mc = tDeck.get(i).getManaCost(); - - for (int j = 0; j < mc.length(); j++) { - char c = mc.charAt(j); - - if (c == 'W') - ClrCnts[0].Count++; - else if (c == 'U') - ClrCnts[1].Count++; - else if (c == 'B') - ClrCnts[2].Count++; - else if (c == 'R') - ClrCnts[3].Count++; - else if (c == 'G') - ClrCnts[4].Count++; - } - } - - int totalColor = 0; - for (int i = 0; i < 5; i++) { - totalColor += ClrCnts[i].Count; - tmpDeck += ClrCnts[i].Color + ":" + ClrCnts[i].Count + "\n"; - } - - tmpDeck += "totalColor:" + totalColor + "\n"; - - for (int i = 0; i < 5; i++) { - if (ClrCnts[i].Count > 0) { // calculate number of lands for each color - float p = (float) ClrCnts[i].Count / (float) totalColor; - int nLand = (int) ((float) numBLands * p); - tmpDeck += "numLand-" + ClrCnts[i].Color + ":" + nLand + "\n"; - - CardCounts.put(ClrCnts[i].Color, 2); - for (int j = 0; j < nLand; j++) - tDeck.add(AllZone.getCardFactory().getCard(ClrCnts[i].Color, AllZone.getComputerPlayer())); - } - } - } - tmpDeck += "DeckSize:" + tDeck.size() + "\n"; - - if (tDeck.size() < Size) { - int diff = Size - tDeck.size(); - - for (int i = 0; i < diff; i++) { - s = tDeck.get(r.nextInt(tDeck.size())).getName(); - - while (CardCounts.get(s) >= 4) - s = tDeck.get(r.nextInt(tDeck.size())).getName(); - - int n = CardCounts.get(s); - tDeck.add(AllZone.getCardFactory().getCard(s, AllZone.getComputerPlayer())); - CardCounts.put(s, n + 1); - tmpDeck += "Added:" + s + "\n"; - } - } else if (tDeck.size() > Size) { - int diff = tDeck.size() - Size; - - for (int i = 0; i < diff; i++) { - Card c = tDeck.get(r.nextInt(tDeck.size())); - - while (c.isBasicLand()) - c = tDeck.get(r.nextInt(tDeck.size())); - - tDeck.remove(c); - tmpDeck += "Removed:" + s + "\n"; - } - } - - tmpDeck += "DeckSize:" + tDeck.size() + "\n"; - if (Testing) - ErrorViewer.showError(tmpDeck); - - return tDeck; - } - - /** - *

readLine.

- * - * @return a {@link java.lang.String} object. - */ - private String readLine() { - //makes the checked exception, into an unchecked runtime exception - try { - String s = in.readLine(); - if (s != null) s = s.trim(); - return s; - } catch (Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("GenerateThemeDeck : readLine error"); - } - }//readLine(Card) - - class CCnt { - public String Color; - public int Count; - - public CCnt(String clr, int cnt) { - Color = clr; - Count = cnt; - } - } - - class Grp { - public ArrayList Cardnames = new ArrayList(); - public int MaxCnt; - public int Percentage; - } -} - diff --git a/src/forge/error/ErrorViewer.java b/src/forge/error/ErrorViewer.java deleted file mode 100644 index b0e11b743b5..00000000000 --- a/src/forge/error/ErrorViewer.java +++ /dev/null @@ -1,294 +0,0 @@ -package forge.error; - - -import static forge.properties.ForgeProps.getLocalized; -import static forge.properties.ForgeProps.getProperty; -import static java.awt.event.InputEvent.CTRL_DOWN_MASK; -import static java.awt.event.KeyEvent.VK_S; -import static java.awt.event.KeyEvent.VK_B; -import static javax.swing.JOptionPane.DEFAULT_OPTION; -import static javax.swing.JOptionPane.ERROR_MESSAGE; - -import java.awt.Font; -import java.awt.event.ActionEvent; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.Map; -import java.util.Map.Entry; - -import javax.swing.AbstractAction; -import javax.swing.Action; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFileChooser; -import javax.swing.JOptionPane; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.KeyStroke; - -import forge.properties.NewConstants; - - -/** - * The class ErrorViewer. Enables showing and saving error messages that occurred in forge. - * - * @author Clemens Koza - * @version V1.0 02.08.2009 - */ -public class ErrorViewer implements NewConstants, NewConstants.LANG.ErrorViewer { - /** Constant NAME_OS="os.name". */ - private static final String NAME_OS = "os.name"; - /** Constant VERSION_OS="os.version". */ - private static final String VERSION_OS = "os.version"; - /** Constant ARCHITECTURE_OS="os.arch". */ - private static final String ARCHITECTURE_OS = "os.arch"; - /** Constant VERSION_JAVA="java.version". */ - private static final String VERSION_JAVA = "java.version"; - /** Constant VENDOR_JAVA="java.vendor". */ - private static final String VENDOR_JAVA = "java.vendor"; - - /** Constant ALL_THREADS_ACTION. */ - public static final Action ALL_THREADS_ACTION = new ShowAllThreadsAction(); - - private static JDialog dlg = null; - - /** - * Shows an error dialog taking the exception's message as the error message. - * - * @param ex a {@link java.lang.Throwable} object. - */ - public static void showError(final Throwable ex) { - showError(ex, null); - } - - /** - * Shows an error dialog creating the error message by a formatting operation. - * - * @param ex a {@link java.lang.Throwable} object. - * @param format a {@link java.lang.String} object. - * @param args a {@link java.lang.Object} object. - */ - public static void showError(final Throwable ex, final String format, final Object... args) { - if (ex == null) { - return; - } - showError(ex, String.format(format, args)); - } - - /** - * Shows an error dialog with the specified error message. - * - * @param ex a {@link java.lang.Throwable} object. - * @param message a {@link java.lang.String} object. - */ - public static void showError(final Throwable ex, final String message) { - if (ex == null) { - return; - } - - final StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - printError(pw, ex, message); - - showDialog(sw.toString()); - } - - /** - * Shows an error without an exception that caused it. - * - * @param format a {@link java.lang.String} object. - * @param args a {@link java.lang.Object} object. - */ - public static void showError(final String format, final Object... args) { - showError(String.format(format, args)); - } - - /** - * Shows an error without an exception that caused it. - * - * @param message a {@link java.lang.String} object. - */ - public static void showError(final String message) { - showError(new Exception(), message); - } - - /** - * Shows an error message for all running threads. - * - * @param format a {@link java.lang.String} object. - * @param args a {@link java.lang.Object} object. - */ - public static void showErrorAllThreads(final String format, final Object... args) { - showErrorAllThreads(String.format(format, args)); - } - - /** - * Shows an error message for all running threads. - * - * @param message a {@link java.lang.String} object. - */ - public static void showErrorAllThreads(final String message) { - final StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - printError(pw, message); - - showDialog(sw.toString()); - } - - /** - *

showDialog.

- * - * @param fullMessage a {@link java.lang.String} object. - */ - private static void showDialog(final String fullMessage) { - JTextArea area = new JTextArea(fullMessage, 40, 90); - area.setFont(new Font("Monospaced", Font.PLAIN, 10)); - area.setEditable(false); - area.setLineWrap(true); - area.setWrapStyleWord(true); - - //Button is not modified, String gets the automatic listener to hide the dialog - Object[] options = { - new JButton(new BugzAction(area)), new JButton(new SaveAction(area)), getLocalized(BUTTON_CLOSE), new JButton(new ExitAction())}; - JOptionPane pane = new JOptionPane(new JScrollPane(area), ERROR_MESSAGE, DEFAULT_OPTION, null, options, - options[1]); - dlg = pane.createDialog(null, getLocalized(TITLE)); - dlg.setResizable(true); - dlg.setVisible(true); - dlg.dispose(); - } - - /** - * Prints the error message for the specified exception to the print writer. - * - * @param pw a {@link java.io.PrintWriter} object. - * @param ex a {@link java.lang.Throwable} object. - * @param message a {@link java.lang.String} object. - */ - private static void printError(final PrintWriter pw, final Throwable ex, final String message) { - if (message != null) { - System.err.println(message); - } - ex.printStackTrace(); - - pw.printf(getLocalized(MESSAGE), getProperty(HOW_TO_REPORT_BUGS_URL), - message != null ? message : ex.getMessage(), getProperty(VERSION), - System.getProperty(NAME_OS), System.getProperty(VERSION_OS), System.getProperty(ARCHITECTURE_OS), - System.getProperty(VERSION_JAVA), System.getProperty(VENDOR_JAVA)); - ex.printStackTrace(pw); - } - - /** - * Prints the error message to the print writer, showing all running threads' stack traces. - * - * @param pw a {@link java.io.PrintWriter} object. - * @param message a {@link java.lang.String} object. - */ - private static void printError(final PrintWriter pw, final String message) { - System.err.println(message); - - pw.printf(getLocalized(MESSAGE), getProperty(HOW_TO_REPORT_BUGS_URL), message, getProperty(VERSION), - System.getProperty(NAME_OS), System.getProperty(VERSION_OS), System.getProperty(ARCHITECTURE_OS), - System.getProperty(VERSION_JAVA), System.getProperty(VENDOR_JAVA)); - Map traces = Thread.getAllStackTraces(); - for (Entry e : traces.entrySet()) { - pw.println(); - pw.printf("%s (%s):%n", e.getKey().getName(), e.getKey().getId()); - for (StackTraceElement el : e.getValue()) { - pw.println(el); - } - } - } - - private static class SaveAction extends AbstractAction { - - private static final long serialVersionUID = 9146834661273525959L; - - private static JFileChooser c; - - private JTextArea area; - - public SaveAction(final JTextArea areaParam) { - super(getLocalized(BUTTON_SAVE)); - putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(VK_S, CTRL_DOWN_MASK)); - this.area = areaParam; - } - - public void actionPerformed(final ActionEvent e) { - if (c == null) { - c = new JFileChooser(); - } - - File f; - for (int i = 0;; i++) { - String name = String.format("%TF-%02d.txt", System.currentTimeMillis(), i); - f = new File(name); - if (!f.exists()) { - break; - } - } - c.setSelectedFile(f); - c.showSaveDialog(null); - f = c.getSelectedFile(); - - try { - BufferedWriter bw = new BufferedWriter(new FileWriter(f)); - bw.write(area.getText()); - bw.close(); - } catch (IOException ex) { - showError(ex, getLocalized(ERRORS.SAVE_MESSAGE)); - } - } - } - - private static class BugzAction extends AbstractAction { - - private static final long serialVersionUID = 914634661273525959L; - - private JTextArea area; - - public BugzAction(JTextArea area) { - putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(VK_B, CTRL_DOWN_MASK)); - putValue(NAME, "Report Bug"); - this.area = area; - } - - public void actionPerformed(ActionEvent e) { - BugzReporter br = new BugzReporter(); - br.setDumpText(area.getText()); - br.setVisible(true); - dlg.dispose(); - } - } - - private static class ExitAction extends AbstractAction { - - private static final long serialVersionUID = 276202595758381626L; - - public ExitAction() { - super(getLocalized(BUTTON_EXIT)); - } - - - public void actionPerformed(final ActionEvent e) { - System.exit(0); - } - } - - private static class ShowAllThreadsAction extends AbstractAction { - - private static final long serialVersionUID = 5638147106706803363L; - - public ShowAllThreadsAction() { - super(getLocalized(SHOW_ERROR)); - } - - public void actionPerformed(final ActionEvent e) { - showErrorAllThreads(getLocalized(ERRORS.SHOW_MESSAGE)); - } - } -} diff --git a/src/forge/error/ExceptionHandler.java b/src/forge/error/ExceptionHandler.java deleted file mode 100644 index e46266b9a03..00000000000 --- a/src/forge/error/ExceptionHandler.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * ExceptionHandler.java - * - * Created on 27.09.2009 - */ - -package forge.error; - - -import com.esotericsoftware.minlog.Log; - -import java.lang.Thread.UncaughtExceptionHandler; - - -/** - * This class handles all exceptions that weren't caught by showing the error to the user. - * - * @author Forge - * @version $Id: $ - */ -public class ExceptionHandler implements UncaughtExceptionHandler { - static { - //Tells Java to let this class handle any uncaught exception - Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler()); - //Tells AWT to let this class handle any uncaught exception - System.setProperty("sun.awt.exception.handler", ExceptionHandler.class.getName()); - } - - /** - * Call this at the beginning to make sure that the class is loaded and the static initializer has run - */ - public static void registerErrorHandling() { - Log.debug("Error handling registered!"); - } - - - /** {@inheritDoc} */ - public void uncaughtException(Thread t, Throwable ex) { - ErrorViewer.showError(ex); - } - - /** - * This Method is called by AWT when an error is thrown in the event dispatching thread and not caught. - * - * @param ex a {@link java.lang.Throwable} object. - */ - public void handle(Throwable ex) { - ErrorViewer.showError(ex); - } -} diff --git a/src/forge/gui/ForgeAction.java b/src/forge/gui/ForgeAction.java deleted file mode 100644 index f11e5e4b433..00000000000 --- a/src/forge/gui/ForgeAction.java +++ /dev/null @@ -1,59 +0,0 @@ -package forge.gui; -/** - * ForgeAction.java - * - * Created on 02.09.2009 - */ - - -import forge.properties.ForgeProps; - -import javax.swing.*; - - -/** - * The class ForgeAction. - * - * @author Clemens Koza - * @version V0.0 02.09.2009 - */ -public abstract class ForgeAction extends AbstractAction { - - /** Constant serialVersionUID=-1881183151063146955L */ - private static final long serialVersionUID = -1881183151063146955L; - private String property; - - /** - *

Constructor for ForgeAction.

- * - * @param property A Property key containing the keys "/button" and "/menu". - */ - public ForgeAction(String property) { - super(ForgeProps.getLocalized(property + "/button")); - this.property = property; - putValue("buttonText", ForgeProps.getLocalized(property + "/button")); - putValue("menuText", ForgeProps.getLocalized(property + "/menu")); - } - - /** - *

Getter for the field property.

- * - * @return a {@link java.lang.String} object. - */ - protected String getProperty() { - return property; - } - - /** - *

setupButton.

- * - * @param button a T object. - * @return a T object. - * @param a T object. - */ - public T setupButton(T button) { - button.setAction(this); - button.setText((String) getValue(button instanceof JMenuItem ? "menuText" : "buttonText")); - return button; - } -} diff --git a/src/forge/gui/GuiUtils.java b/src/forge/gui/GuiUtils.java deleted file mode 100644 index 1adf4f0614f..00000000000 --- a/src/forge/gui/GuiUtils.java +++ /dev/null @@ -1,267 +0,0 @@ -package forge.gui; - -import forge.AllZone; -import forge.Card; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - -import javax.swing.*; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; - -import net.slightlymagic.braids.util.UtilFunctions; - -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.File; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; - - -/** - *

GuiUtils class.

- * - * @author Forge - * @version $Id: $ - */ -public class GuiUtils { - - /** - * This method takes a collection of components and sets the width of each component - * to the maximum of the collection - * - * @param components a {@link java.util.Collection} object. - */ - public static void setWidthToMax(Collection components) { - int maxWidth = 0; - - for (Component c : components) { - if (c.getPreferredSize().getWidth() > maxWidth) { - maxWidth = (int) c.getPreferredSize().getWidth(); - } - } - - for (Component c : components) { - c.setMinimumSize(new Dimension(maxWidth, (int) c.getPreferredSize().getHeight())); - c.setMaximumSize(new Dimension(maxWidth, (int) c.getPreferredSize().getHeight())); - c.setPreferredSize(new Dimension(maxWidth, (int) c.getPreferredSize().getHeight())); - } - - } - - /** - * Adds a Horizontal Glue to panel - * - * @param panel a {@link javax.swing.JPanel} object. - */ - public static void addExpandingHorizontalSpace(JPanel panel) { - panel.add(Box.createHorizontalGlue()); - } - - /** - * Adds a Vertical Glue to panel - * - * @param panel a {@link javax.swing.JPanel} object. - */ - public static void addExpandingVerticalSpace(JPanel panel) { - panel.add(Box.createHorizontalGlue()); - } - - /** - * Adds a rigid area of size strutSize to panel - * - * @param panel a {@link javax.swing.JPanel} object. - * @param strutSize a int. - */ - public static void addGap(JPanel panel, int strutSize) { - panel.add(Box.createRigidArea(new Dimension(strutSize, strutSize))); - } - - /** - * Adds a rigid area of size 5 to panel - * - * @param panel a {@link javax.swing.JPanel} object. - */ - public static void addGap(JPanel panel) { - panel.add(Box.createRigidArea(new Dimension(5, 5))); - } - - /** - * Sets the font size of a component - * - * @param component a {@link java.awt.Component} object. - * @param newSize a int. - */ - public static void setFontSize(Component component, int newSize) { - Font oldFont = component.getFont(); - component.setFont(oldFont.deriveFont((float) newSize)); - } - - /** - *

getIconFromFile.

- * - * @param iconName a {@link java.lang.String} object. - * @return a {@link javax.swing.ImageIcon} object. - */ - public static ImageIcon getIconFromFile(String iconName) { - File base = ForgeProps.getFile(NewConstants.IMAGE_ICON); - File file = new File(base, iconName); - if (iconName.equals("") || !file.exists()) { - return null; - } else { - return new ImageIcon(file.toString()); - } - } - - /** - *

getResizedIcon.

- * - * @param icon a {@link javax.swing.ImageIcon} object. - * @param width a int. - * @param height a int. - * @return a {@link javax.swing.ImageIcon} object. - */ - public static ImageIcon getResizedIcon(ImageIcon icon, int width, int height) { - return new ImageIcon(icon.getImage().getScaledInstance(width, height, Image.SCALE_SMOOTH)); - } - - /** - *

getEmptyIcon.

- * - * @param width a int. - * @param height a int. - * @return a {@link javax.swing.ImageIcon} object. - */ - public static ImageIcon getEmptyIcon(int width, int height) { - return new ImageIcon(new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB)); - } - - /** - * Convenience for getChoices(message, 0, 1, choices). - * - * @see #getChoices(String, int, int, Object...) - * - * @param message a {@link java.lang.String} object. - * @param choices a T object. - * @param is automatically inferred. - * - * @return null if choices is missing, empty, or if the users' - * choices are empty; otherwise, returns the first item in - * the List returned by getChoices. - */ - public static T getChoiceOptional(String message, T... choices) { - if (choices == null || choices.length == 0) return null; - List choice = getChoices(message, 0, 1, choices); - return choice.isEmpty() ? null : choice.get(0); - }//getChoiceOptional(String,T...) - - /** - * Like getChoiceOptional, but this takes an Iterator instead of a - * variable number of arguments. - * - * @see #getChoiceOptional(String, T...) - * @see #getChoices(String, int, int, Object...) - * - * @param message a {@link java.lang.String} object. - * @param choices an Iterator over T objects. - * @param is automatically inferred. - * - * @return null if choices is missing, empty, or if the users' - * choices are empty; otherwise, returns the first item in - * the List returned by getChoices. - */ - public static T getChoiceOptional(String message, Iterator choices) { - if (choices == null | !choices.hasNext()) { - return null; - } - - // TODO: this is an expensive operation; it would be better to - // update getChoices to accept an Iterator. - T[] choicesArray = UtilFunctions.iteratorToArray(choices); - - List choice = getChoices(message, 0, 1, choicesArray); - return choice.isEmpty() ? null : choice.get(0); - }//getChoiceOptional(String,Iterator) - - // returned Object will never be null - /** - *

getChoice.

- * - * @param message a {@link java.lang.String} object. - * @param choices a T object. - * @param a T object. - * @return a T object. - */ - public static T getChoice(String message, T... choices) { - List choice = getChoices(message, 1, 1, choices); - assert choice.size() == 1; - return choice.get(0); - }//getChoice() - - // returned Object will never be null - /** - *

getChoicesOptional.

- * - * @param message a {@link java.lang.String} object. - * @param choices a T object. - * @param a T object. - * @return a {@link java.util.List} object. - */ - public static List getChoicesOptional(String message, T... choices) { - return getChoices(message, 0, choices.length, choices); - }//getChoice() - - // returned Object will never be null - /** - *

getChoices.

- * - * @param message a {@link java.lang.String} object. - * @param choices a T object. - * @param a T object. - * @return a {@link java.util.List} object. - */ - public static List getChoices(String message, T... choices) { - return getChoices(message, 1, choices.length, choices); - }//getChoice() - - // returned Object will never be null - /** - *

getChoices.

- * - * @param message a {@link java.lang.String} object. - * @param min a int. - * @param max a int. - * @param choices a T object. - * @param a T object. - * @return a {@link java.util.List} object. - */ - public static List getChoices(String message, int min, int max, T... choices) { - ListChooser c = new ListChooser(message, min, max, choices); - final JList list = c.getJList(); - list.addListSelectionListener(new ListSelectionListener() { - public void valueChanged(ListSelectionEvent ev) { - if (list.getSelectedValue() instanceof Card && AllZone.getDisplay() != null) { - AllZone.getDisplay().setCard((Card) list.getSelectedValue()); - } - } - }); - c.show(); - return c.getSelectedValues(); - }//getChoice() - - /** - * Centers a frame on the screen based on its current size - * - * @param frame a fully laid-out frame - */ - public static void centerFrame(Frame frame) { - Dimension screen = frame.getToolkit().getScreenSize(); - Rectangle bounds = frame.getBounds(); - bounds.width = frame.getWidth(); - bounds.height = frame.getHeight(); - bounds.x = (screen.width - bounds.width) / 2; - bounds.y = (screen.height - bounds.height) / 2; - frame.setBounds(bounds); - } -} diff --git a/src/forge/gui/ListChooser.java b/src/forge/gui/ListChooser.java deleted file mode 100644 index 363b1fd6222..00000000000 --- a/src/forge/gui/ListChooser.java +++ /dev/null @@ -1,382 +0,0 @@ -/** - * ListChooser.java - * - * Created on 31.08.2009 - */ - -package forge.gui; - - -import javax.swing.*; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; -import java.awt.event.ActionEvent; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.AbstractList; -import java.util.List; - -import static java.util.Arrays.asList; -import static java.util.Collections.unmodifiableList; -import static javax.swing.JOptionPane.*; -import static javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE; - - -/** - * A simple class that shows a list of choices in a dialog. Two properties influence the behavior of a list - * chooser: minSelection and maxSelection. These two give the allowed number of selected items for the dialog to be - * closed. - *
    - *
  • If minSelection is 0, there will be a Cancel button.
  • - *
  • If minSelection is 0 or 1, double-clicking a choice will also close the dialog.
  • - *
  • If the number of selections is out of bounds, the "OK" button is disabled.
  • - *
  • The dialog was "committed" if "OK" was clicked or a choice was double clicked.
  • - *
  • The dialog was "canceled" if "Cancel" or "X" was clicked.
  • - *
  • If the dialog was canceled, the selection will be empty.
  • - *
  • - *
- * - * @author Forge - * @version $Id: $ - */ -public class ListChooser { - - //Data and number of choices for the list - private List list; - private int minChoices, maxChoices; - - //Decoration - private String title; - - //Flag: was the dialog already shown? - private boolean called; - //initialized before; listeners may be added to it - private JList jList; - //Temporarily stored for event handlers during show - private JDialog d; - private JOptionPane p; - private Action ok, cancel; - - /** - *

Constructor for ListChooser.

- * - * @param title a {@link java.lang.String} object. - * @param list a T object. - */ - public ListChooser(String title, T... list) { - this(title, 1, list); - } - - /** - *

Constructor for ListChooser.

- * - * @param title a {@link java.lang.String} object. - * @param numChoices a int. - * @param list a T object. - */ - public ListChooser(String title, int numChoices, T... list) { - this(title, numChoices, numChoices, list); - } - - /** - *

Constructor for ListChooser.

- * - * @param title a {@link java.lang.String} object. - * @param minChoices a int. - * @param maxChoices a int. - * @param list a T object. - */ - public ListChooser(String title, int minChoices, int maxChoices, T... list) { - this(title, null, minChoices, maxChoices, list); - } - - /** - *

Constructor for ListChooser.

- * - * @param title a {@link java.lang.String} object. - * @param message a {@link java.lang.String} object. - * @param list a T object. - */ - public ListChooser(String title, String message, T... list) { - this(title, message, 1, list); - } - - /** - *

Constructor for ListChooser.

- * - * @param title a {@link java.lang.String} object. - * @param message a {@link java.lang.String} object. - * @param numChoices a int. - * @param list a T object. - */ - public ListChooser(String title, String message, int numChoices, T... list) { - this(title, message, numChoices, numChoices, list); - } - - /** - *

Constructor for ListChooser.

- * - * @param title a {@link java.lang.String} object. - * @param message a {@link java.lang.String} object. - * @param minChoices a int. - * @param maxChoices a int. - * @param list a T object. - */ - public ListChooser(String title, String message, int minChoices, int maxChoices, T... list) { - this(title, message, minChoices, maxChoices, asList(list)); - } - - /** - *

Constructor for ListChooser.

- * - * @param title a {@link java.lang.String} object. - * @param list a {@link java.util.List} object. - */ - public ListChooser(String title, List list) { - this(title, 1, list); - } - - /** - *

Constructor for ListChooser.

- * - * @param title a {@link java.lang.String} object. - * @param numChoices a int. - * @param list a {@link java.util.List} object. - */ - public ListChooser(String title, int numChoices, List list) { - this(title, numChoices, numChoices, list); - } - - /** - *

Constructor for ListChooser.

- * - * @param title a {@link java.lang.String} object. - * @param minChoices a int. - * @param maxChoices a int. - * @param list a {@link java.util.List} object. - */ - public ListChooser(String title, int minChoices, int maxChoices, List list) { - this(title, null, minChoices, maxChoices, list); - } - - /** - *

Constructor for ListChooser.

- * - * @param title a {@link java.lang.String} object. - * @param message a {@link java.lang.String} object. - * @param list a {@link java.util.List} object. - */ - public ListChooser(String title, String message, List list) { - this(title, message, 1, list); - } - - /** - *

Constructor for ListChooser.

- * - * @param title a {@link java.lang.String} object. - * @param message a {@link java.lang.String} object. - * @param numChoices a int. - * @param list a {@link java.util.List} object. - */ - public ListChooser(String title, String message, int numChoices, List list) { - this(title, message, numChoices, numChoices, list); - } - - /** - *

Constructor for ListChooser.

- * - * @param title a {@link java.lang.String} object. - * @param message a {@link java.lang.String} object. - * @param minChoices a int. - * @param maxChoices a int. - * @param list a {@link java.util.List} object. - */ - public ListChooser(String title, String message, int minChoices, int maxChoices, List list) { - this.title = title; - this.minChoices = minChoices; - this.maxChoices = maxChoices; - this.list = unmodifiableList(list); - jList = new JList(new ChooserListModel()); - ok = new CloseAction(OK_OPTION, "OK"); - ok.setEnabled(minChoices == 0); - cancel = new CloseAction(CANCEL_OPTION, "Cancel"); - - Object[] options; - if (minChoices == 0) options = new Object[]{new JButton(ok), new JButton(cancel)}; - else options = new Object[]{new JButton(ok)}; - - p = new JOptionPane(new Object[]{message, new JScrollPane(jList)}, QUESTION_MESSAGE, DEFAULT_OPTION, - null, options, options[0]); - jList.getSelectionModel().addListSelectionListener(new SelListener()); - jList.addMouseListener(new DblListener()); - } - - /** - *

getChoices.

- * - * @return a {@link java.util.List} object. - */ - public List getChoices() { - return list; - } - - /** - * Returns the JList used in the list chooser. this is useful for registering listeners before showing the - * dialog. - * - * @return a {@link javax.swing.JList} object. - */ - public JList getJList() { - return jList; - } - - /** - * Shows the dialog and returns after the dialog was closed. - * - * @return a boolean. - */ - public synchronized boolean show() { - if (called) throw new IllegalStateException("Already shown"); - Integer value; - do { - d = p.createDialog(p.getParent(), title); - if (minChoices != 0) d.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); - jList.setSelectedIndex(0); - d.setVisible(true); - d.dispose(); - value = (Integer) p.getValue(); - if (value == null || value != OK_OPTION) jList.clearSelection(); - //can't stop closing by ESC, so repeat if cancelled - } while (minChoices != 0 && value != OK_OPTION); - //this assert checks if we really don't return on a cancel if input is mandatory - assert minChoices == 0 || value == OK_OPTION; - called = true; - return value != null && value == OK_OPTION; - } - - /** - * Returns if the dialog was closed by pressing "OK" or double clicking an option the last time - * - * @return a boolean. - */ - public boolean isCommitted() { - if (!called) throw new IllegalStateException("not yet shown"); - return (Integer) p.getValue() == OK_OPTION; - } - - /** - * Returns the selected indices as a list of integers - * - * @return a {@link java.util.List} object. - */ - public List getSelectedIndices() { - if (!called) throw new IllegalStateException("not yet shown"); - final int[] indices = jList.getSelectedIndices(); - return new AbstractList() { - @Override - public int size() { - return indices.length; - } - - @Override - public Integer get(int index) { - return indices[index]; - } - }; - } - - /** - * Returns the selected values as a list of objects. no casts are necessary when retrieving the objects. - * - * @return a {@link java.util.List} object. - */ - public List getSelectedValues() { - if (!called) throw new IllegalStateException("not yet shown"); - final Object[] selected = jList.getSelectedValues(); - return new AbstractList() { - @Override - public int size() { - return selected.length; - } - - @SuppressWarnings("unchecked") - @Override - public T get(int index) { - return (T) selected[index]; - } - }; - } - - /** - * Returns the (minimum) selected index, or -1 - * - * @return a int. - */ - public int getSelectedIndex() { - if (!called) throw new IllegalStateException("not yet shown"); - return jList.getSelectedIndex(); - } - - /** - * Returns the (first) selected value, or null - * - * @return a T object. - */ - @SuppressWarnings("unchecked") - public T getSelectedValue() { - if (!called) throw new IllegalStateException("not yet shown"); - return (T) jList.getSelectedValue(); - } - - /** - *

commit.

- */ - private void commit() { - if (ok.isEnabled()) p.setValue(OK_OPTION); - } - - private class ChooserListModel extends AbstractListModel { - - private static final long serialVersionUID = 3871965346333840556L; - - public int getSize() { - return list.size(); - } - - - public Object getElementAt(int index) { - return list.get(index); - } - } - - private class CloseAction extends AbstractAction { - - private static final long serialVersionUID = -8426767786083886936L; - private int value; - - public CloseAction(int value, String label) { - super(label); - this.value = value; - } - - - public void actionPerformed(ActionEvent e) { - p.setValue(value); - } - } - - private class SelListener implements ListSelectionListener { - - public void valueChanged(ListSelectionEvent e) { - int num = jList.getSelectedIndices().length; - ok.setEnabled(num >= minChoices && num <= maxChoices); - } - } - - private class DblListener extends MouseAdapter { - @Override - public void mouseClicked(MouseEvent e) { - if (e.getClickCount() == 2) commit(); - } - } -} diff --git a/src/forge/gui/MultiLineLabel.java b/src/forge/gui/MultiLineLabel.java deleted file mode 100755 index e02a47129f8..00000000000 --- a/src/forge/gui/MultiLineLabel.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2009 Samuel Sjoberg - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package forge.gui; - -import javax.swing.*; -import java.awt.*; - - -/** - * A {@link JLabel} with support for multi-line text that wraps when the line - * doesn't fit in the available width. Multi-line text support is handled by the - * {@link MultiLineLabelUI}, the default UI delegate of this component. The text - * in the label can be horizontally and vertically aligned, relative to the - * bounds of the component. - * - * @author Samuel Sjoberg, http://samuelsjoberg.com - * @version 1.0.0 - */ -public class MultiLineLabel extends JLabel { - - /** - * Default serial version UID. - */ - private static final long serialVersionUID = 1L; - - /** - * Horizontal text alignment. - */ - private int halign = LEFT; - - /** - * Vertical text alignment. - */ - private int valign = CENTER; - - /** - * Cache to save heap allocations. - */ - private Rectangle bounds; - - /** - * Creates a new empty label. - */ - public MultiLineLabel() { - super(); - setUI(MultiLineLabelUI.labelUI); - } - - /** - * Creates a new label with text value. - * - * @param text the value of the label - */ - public MultiLineLabel(String text) { - this(); - setText(text); - } - - /** - * {@inheritDoc} - * - * @return a {@link java.awt.Rectangle} object. - */ - public Rectangle getBounds() { - if (bounds == null) { - bounds = new Rectangle(); - } - return super.getBounds(bounds); - } - - /** - * Set the vertical text alignment. - * - * @param alignment vertical alignment - */ - public void setVerticalTextAlignment(int alignment) { - firePropertyChange("verticalTextAlignment", valign, alignment); - valign = alignment; - } - - /** - * Set the horizontal text alignment. - * - * @param alignment horizontal alignment - */ - public void setHorizontalTextAlignment(int alignment) { - firePropertyChange("horizontalTextAlignment", halign, alignment); - halign = alignment; - } - - /** - * Get the vertical text alignment. - * - * @return vertical text alignment - */ - public int getVerticalTextAlignment() { - return valign; - } - - /** - * Get the horizontal text alignment. - * - * @return horizontal text alignment - */ - public int getHorizontalTextAlignment() { - return halign; - } -} diff --git a/src/forge/gui/MultiLineLabelUI.java b/src/forge/gui/MultiLineLabelUI.java deleted file mode 100755 index 56b0ec2c3c1..00000000000 --- a/src/forge/gui/MultiLineLabelUI.java +++ /dev/null @@ -1,588 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2009 Samuel Sjoberg - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package forge.gui; - -import javax.swing.*; -import javax.swing.plaf.ComponentUI; -import javax.swing.plaf.LabelUI; -import javax.swing.plaf.basic.BasicLabelUI; -import javax.swing.text.*; -import java.awt.*; -import java.awt.event.ComponentEvent; -import java.awt.event.ComponentListener; -import java.beans.PropertyChangeEvent; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - - -/** - * Label UI delegate that supports multiple lines and line wrapping. Hard line - * breaks (\n) are preserved. If the dimensions of the label is too - * small to fit all content, the string will be clipped and "..." appended to - * the end of the visible text (similar to the default behavior of - * JLabel). If used in conjunction with a {@link MultiLineLabel}, - * text alignment (horizontal and vertical) is supported. The UI delegate can be - * used on a regular JLabel if text alignment isn't required. The - * default alignment, left and vertically centered, will then be used. - *

- * Example of usage: - *

- *

- * JLabel myLabel = new JLabel();
- * myLabel.setUI(MultiLineLabelUI.labelUI);
- * myLabel.setText("A long label that will wrap automatically.");
- * 
- *

- *

- * The line and wrapping support is implemented without using a - * View to make it easy for subclasses to add custom text effects - * by overriding {@link #paintEnabledText(JLabel, Graphics, String, int, int)} - * and {@link #paintDisabledText(JLabel, Graphics, String, int, int)}. This - * class is designed to be easily extended by subclasses. - * - * @author Samuel Sjoberg, http://samuelsjoberg.com - * @version 1.3.0 - */ -public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener { - - /** - * Shared instance of the UI delegate. - */ - public static LabelUI labelUI = new MultiLineLabelUI(); - - /** - * Client property key used to store the calculated wrapped lines on the - * JLabel. - */ - public static final String PROPERTY_KEY = "WrappedText"; - - // Static references to avoid heap allocations. - /** Constant paintIconR */ - protected static Rectangle paintIconR = new Rectangle(); - /** Constant paintTextR */ - protected static Rectangle paintTextR = new Rectangle(); - /** Constant paintViewR */ - protected static Rectangle paintViewR = new Rectangle(); - /** Constant paintViewInsets */ - protected static Insets paintViewInsets = new Insets(0, 0, 0, 0); - - /** - * Font metrics of the JLabel being rendered. - */ - protected FontMetrics metrics; - - /** - * Default size of the lines list. - */ - protected static int defaultSize = 4; - - /** - * Get the shared UI instance. - * @param c - * @return a ComponentUI - */ - public static ComponentUI createUI(JComponent c) { - return labelUI; - } - - /** {@inheritDoc} */ - protected void uninstallDefaults(JLabel c) { - super.uninstallDefaults(c); - clearCache(c); - } - - /** {@inheritDoc} */ - protected void installListeners(JLabel c) { - super.installListeners(c); - c.addComponentListener(this); - } - - /** {@inheritDoc} */ - protected void uninstallListeners(JLabel c) { - super.uninstallListeners(c); - c.removeComponentListener(this); - } - - /** - * Clear the wrapped line cache. - * - * @param l the label containing a cached value - */ - protected void clearCache(JLabel l) { - l.putClientProperty(PROPERTY_KEY, null); - } - - /** {@inheritDoc} */ - public void propertyChange(PropertyChangeEvent e) { - super.propertyChange(e); - final String name = e.getPropertyName(); - if (name.equals("text") || "font".equals(name)) { - clearCache((JLabel) e.getSource()); - } - } - - /** - * Calculate the paint rectangles for the icon and text for the passed - * label. - * - * @param l a label - * @param fm the font metrics to use, or null to get the font - * metrics from the label - * @param width label width - * @param height label height - */ - protected void updateLayout(JLabel l, FontMetrics fm, int width, int height) { - if (fm == null) { - fm = l.getFontMetrics(l.getFont()); - } - metrics = fm; - - String text = l.getText(); - Icon icon = l.getIcon(); - Insets insets = l.getInsets(paintViewInsets); - - paintViewR.x = insets.left; - paintViewR.y = insets.top; - paintViewR.width = width - (insets.left + insets.right); - paintViewR.height = height - (insets.top + insets.bottom); - - paintIconR.x = paintIconR.y = paintIconR.width = paintIconR.height = 0; - paintTextR.x = paintTextR.y = paintTextR.width = paintTextR.height = 0; - - layoutCL(l, fm, text, icon, paintViewR, paintIconR, paintTextR); - } - - /** - *

prepareGraphics.

- * - * @param g a {@link java.awt.Graphics} object. - */ - protected void prepareGraphics(Graphics g) { - } - - /** {@inheritDoc} */ - public void paint(Graphics g, JComponent c) { - - // parent's update method fills the background - prepareGraphics(g); - - JLabel label = (JLabel) c; - String text = label.getText(); - Icon icon = (label.isEnabled()) ? label.getIcon() : label - .getDisabledIcon(); - - if ((icon == null) && (text == null)) { - return; - } - - FontMetrics fm = g.getFontMetrics(); - - updateLayout(label, fm, c.getWidth(), c.getHeight()); - - if (icon != null) { - icon.paintIcon(c, g, paintIconR.x, paintIconR.y); - } - - if (text != null) { - View v = (View) c.getClientProperty("html"); - if (v != null) { - // HTML view disables multi-line painting. - v.paint(g, paintTextR); - } else { - // Paint the multi line text - paintTextLines(g, label, fm); - } - } - } - - /** - * Paint the wrapped text lines. - * - * @param g graphics component to paint on - * @param label the label being painted - * @param fm font metrics for current font - */ - protected void paintTextLines(Graphics g, JLabel label, FontMetrics fm) { - List lines = getTextLines(label); - - // Available component height to paint on. - int height = getAvailableHeight(label); - - int textHeight = lines.size() * fm.getHeight(); - while (textHeight > height) { - // Remove one line until no. of visible lines is found. - textHeight -= fm.getHeight(); - } - paintTextR.height = Math.min(textHeight, height); - paintTextR.y = alignmentY(label, fm, paintTextR); - - int textX = paintTextR.x; - int textY = paintTextR.y; - - for (Iterator it = lines.iterator(); it.hasNext() - && paintTextR.contains(textX, textY + getAscent(fm)); textY += fm - .getHeight()) { - - String text = it.next().trim(); - - if (it.hasNext() - && !paintTextR.contains(textX, textY + fm.getHeight() - + getAscent(fm))) { - // The last visible row, add a clip indication. - text = clip(text, fm, paintTextR); - } - - int x = alignmentX(label, fm, text, paintTextR); - - if (label.isEnabled()) { - paintEnabledText(label, g, text, x, textY); - } else { - paintDisabledText(label, g, text, x, textY); - } - } - } - - /** - * Returns the available height to paint text on. This is the height of the - * passed component with insets subtracted. - * - * @param l a component - * @return the available height - */ - protected int getAvailableHeight(JLabel l) { - l.getInsets(paintViewInsets); - return l.getHeight() - paintViewInsets.top - paintViewInsets.bottom; - } - - /** - * Add a clip indication to the string. It is important that the string - * length does not exceed the length or the original string. - * - * @param text the to be painted - * @param fm font metrics - * @param bounds the text bounds - * @return the clipped string - */ - protected String clip(String text, FontMetrics fm, Rectangle bounds) { - // Fast and lazy way to insert a clip indication is to simply replace - // the last characters in the string with the clip indication. - // A better way would be to use metrics and calculate how many (if any) - // characters that need to be replaced. - if (text.length() < 3) { - return "..."; - } - return text.substring(0, text.length() - 3) + "..."; - } - - /** - * Establish the vertical text alignment. The default alignment is to center - * the text in the label. - * - * @param label the label to paint - * @param fm font metrics - * @param bounds the text bounds rectangle - * @return the vertical text alignment, defaults to CENTER. - */ - protected int alignmentY(JLabel label, FontMetrics fm, Rectangle bounds) { - final int height = getAvailableHeight(label); - int textHeight = bounds.height; - - if (label instanceof MultiLineLabel) { - int align = ((MultiLineLabel) label).getVerticalTextAlignment(); - switch (align) { - case JLabel.TOP: - return getAscent(fm) + paintViewInsets.top; - case JLabel.BOTTOM: - return getAscent(fm) + height - paintViewInsets.top - + paintViewInsets.bottom - textHeight; - default: - } - } - - // Center alignment - int textY = paintViewInsets.top + (height - textHeight) / 2 - + getAscent(fm); - return Math.max(textY, getAscent(fm) + paintViewInsets.top); - } - - /** - *

getAscent.

- * - * @param fm a {@link java.awt.FontMetrics} object. - * @return a int. - */ - private static int getAscent(FontMetrics fm) { - return fm.getAscent() + fm.getLeading(); - } - - /** - * Establish the horizontal text alignment. The default alignment is left - * aligned text. - * - * @param label the label to paint - * @param fm font metrics - * @param s the string to paint - * @param bounds the text bounds rectangle - * @return the x-coordinate to use when painting for proper alignment - */ - protected int alignmentX(JLabel label, FontMetrics fm, String s, - Rectangle bounds) { - if (label instanceof MultiLineLabel) { - int align = ((MultiLineLabel) label).getHorizontalTextAlignment(); - switch (align) { - case JLabel.RIGHT: - return bounds.x + paintViewR.width - fm.stringWidth(s); - case JLabel.CENTER: - return bounds.x + paintViewR.width / 2 - fm.stringWidth(s) / 2; - default: - return bounds.x; - } - } - return bounds.x; - } - - /** - * Check the given string to see if it should be rendered as HTML. Code - * based on implementation found in - * BasicHTML.isHTMLString(String) in future JDKs. - * - * @param s the string - * @return true if string is HTML, otherwise false - */ - private static boolean isHTMLString(String s) { - if (s != null) { - if ((s.length() >= 6) && (s.charAt(0) == '<') - && (s.charAt(5) == '>')) { - String tag = s.substring(1, 5); - return tag.equalsIgnoreCase("html"); - } - } - return false; - } - - /** {@inheritDoc} */ - public Dimension getPreferredSize(JComponent c) { - Dimension d = super.getPreferredSize(c); - JLabel label = (JLabel) c; - - if (isHTMLString(label.getText())) { - return d; // HTML overrides everything and we don't need to process - } - - // Width calculated by super is OK. The preferred width is the width of - // the unwrapped content as long as it does not exceed the width of the - // parent container. - - if (c.getParent() != null) { - // Ensure that preferred width never exceeds the available width - // (including its border insets) of the parent container. - Insets insets = c.getParent().getInsets(); - Dimension size = c.getParent().getSize(); - if (size.width > 0) { - // If width isn't set component shouldn't adjust. - d.width = size.width - insets.left - insets.right; - } - } - - updateLayout(label, null, d.width, d.height); - - // The preferred height is either the preferred height of the text - // lines, or the height of the icon. - d.height = Math.max(d.height, getPreferredHeight(label)); - - return d; - } - - /** - * The preferred height of the label is the height of the lines with added - * top and bottom insets. - * - * @param label the label - * @return the preferred height of the wrapped lines. - */ - protected int getPreferredHeight(JLabel label) { - int numOfLines = getTextLines(label).size(); - Insets insets = label.getInsets(paintViewInsets); - return numOfLines * metrics.getHeight() + insets.top + insets.bottom; - } - - /** - * Get the lines of text contained in the text label. The prepared lines is - * cached as a client property, accessible via {@link #PROPERTY_KEY}. - * - * @param l the label - * @return the text lines of the label. - */ - @SuppressWarnings("unchecked") - protected List getTextLines(JLabel l) { - List lines = (List) l.getClientProperty(PROPERTY_KEY); - if (lines == null) { - lines = prepareLines(l); - l.putClientProperty(PROPERTY_KEY, lines); - } - return lines; - } - - /** {@inheritDoc} */ - public void componentHidden(ComponentEvent e) { - // Don't care - } - - /** {@inheritDoc} */ - public void componentMoved(ComponentEvent e) { - // Don't care - } - - /** {@inheritDoc} */ - public void componentResized(ComponentEvent e) { - clearCache((JLabel) e.getSource()); - } - - /** {@inheritDoc} */ - public void componentShown(ComponentEvent e) { - // Don't care - } - - /** - * Prepare the text lines for rendering. The lines are wrapped to fit in the - * current available space for text. Explicit line breaks are preserved. - * - * @param l the label to render - * @return a list of text lines to render - */ - protected List prepareLines(JLabel l) { - List lines = new ArrayList(defaultSize); - String text = l.getText(); - if (text == null) { - return null; // Null guard - } - PlainDocument doc = new PlainDocument(); - try { - doc.insertString(0, text, null); - } catch (BadLocationException e) { - return null; - } - Element root = doc.getDefaultRootElement(); - for (int i = 0, j = root.getElementCount(); i < j; i++) { - wrap(lines, root.getElement(i)); - } - return lines; - } - - /** - * If necessary, wrap the text into multiple lines. - * - * @param lines line array in which to store the wrapped lines - * @param elem the document element containing the text content - */ - protected void wrap(List lines, Element elem) { - int p1 = elem.getEndOffset(); - Document doc = elem.getDocument(); - for (int p0 = elem.getStartOffset(); p0 < p1; ) { - int p = calculateBreakPosition(doc, p0, p1); - try { - lines.add(doc.getText(p0, p - p0)); - } catch (BadLocationException e) { - throw new Error("Can't get line text. p0=" + p0 + " p=" + p); - } - p0 = (p == p0) ? p1 : p; - } - } - - /** - * Calculate the position on which to break (wrap) the line. - * - * @param doc the document - * @param p0 start position - * @param p1 end position - * @return the actual end position, will be p1 if content does - * not need to wrap, otherwise it will be less than p1. - */ - protected int calculateBreakPosition(Document doc, int p0, int p1) { - Segment segment = SegmentCache.getSegment(); - try { - doc.getText(p0, p1 - p0, segment); - } catch (BadLocationException e) { - throw new Error("Can't get line text"); - } - - int width = paintTextR.width; - int p = p0 - + Utilities.getBreakLocation(segment, metrics, 0, width, null, - p0); - SegmentCache.releaseSegment(segment); - return p; - } - - /** - * Static singleton {@link Segment} cache. - * - * @author Samuel Sjoberg - * @see javax.swing.text.SegmentCache - */ - protected static final class SegmentCache { - - /** - * Reused segments. - */ - private ArrayList segments = new ArrayList(2); - - /** - * Singleton instance. - */ - private static SegmentCache cache = new SegmentCache(); - - /** - * Private constructor. - */ - private SegmentCache() { - } - - /** - * Returns a Segment. When done, the Segment - * should be recycled by invoking {@link #releaseSegment(Segment)}. - * - * @return a Segment. - */ - public static Segment getSegment() { - int size = cache.segments.size(); - if (size > 0) { - return cache.segments.remove(size - 1); - } - return new Segment(); - } - - /** - * Releases a Segment. A segment should not be used after - * it is released, and a segment should never be released more than - * once. - */ - public static void releaseSegment(Segment segment) { - segment.array = null; - segment.count = 0; - cache.segments.add(segment); - } - } -} diff --git a/src/forge/gui/game/CardDetailPanel.java b/src/forge/gui/game/CardDetailPanel.java deleted file mode 100644 index 46538aa3402..00000000000 --- a/src/forge/gui/game/CardDetailPanel.java +++ /dev/null @@ -1,351 +0,0 @@ -/** - * CardDetailPanel.java - * - * Created on 17.02.2010 - */ - -package forge.gui.game; - - -import forge.*; - -import javax.swing.*; -import javax.swing.border.EtchedBorder; -import java.awt.Color; -import java.awt.*; -import java.util.Iterator; - - -/** - * The class CardDetailPanel. Shows the details of a card. - * - * @author Clemens Koza - * @version V0.0 17.02.2010 - */ -public class CardDetailPanel extends JPanel implements CardContainer { - /** Constant serialVersionUID=-8461473263764812323L */ - private static final long serialVersionUID = -8461473263764812323L; - - private static Color PURPLE = new Color(14381203); - - private Card card; - - private JLabel nameCostLabel; - private JLabel typeLabel; - private JLabel powerToughnessLabel; - private JLabel damageLabel; - private JLabel idLabel; - private JLabel setInfoLabel; - private JTextArea cdArea; - - /** - *

Constructor for CardDetailPanel.

- * - * @param card a {@link forge.Card} object. - */ - public CardDetailPanel(Card card) { - setLayout(new GridLayout(2, 0, 0, 5)); - setBorder(new EtchedBorder()); - - JPanel cdLabels = new JPanel(new GridLayout(0, 1, 0, 5)); - cdLabels.add(nameCostLabel = new JLabel()); - cdLabels.add(typeLabel = new JLabel()); - cdLabels.add(powerToughnessLabel = new JLabel()); - cdLabels.add(damageLabel = new JLabel()); - - JPanel IDR = new JPanel(new GridBagLayout()); - GridBagConstraints c = new GridBagConstraints(); - - c.fill = GridBagConstraints.HORIZONTAL; - - c.gridwidth = 2; - c.weightx = 1.0; - IDR.add(idLabel = new JLabel(), c); - - c.gridwidth = 1; - c.weightx = 0.3; - IDR.add(setInfoLabel = new JLabel(), c); - - cdLabels.add(IDR); - - add(cdLabels); - nameCostLabel.setHorizontalAlignment(SwingConstants.CENTER); - typeLabel.setHorizontalAlignment(SwingConstants.CENTER); - powerToughnessLabel.setHorizontalAlignment(SwingConstants.CENTER); - //cdLabel7.setSize(100, cdLabel7.getHeight()); - - setInfoLabel.setHorizontalAlignment(SwingConstants.CENTER); - - add(new JScrollPane(cdArea = new JTextArea(4, 12))); - cdArea.setLineWrap(true); - cdArea.setWrapStyleWord(true); - - if (!Gui_NewGame.useLAFFonts.isSelected()) { - nameCostLabel.setFont(new java.awt.Font("Dialog", 0, 14)); - typeLabel.setFont(new java.awt.Font("Dialog", 0, 14)); - powerToughnessLabel.setFont(new java.awt.Font("Dialog", 0, 14)); - damageLabel.setFont(new java.awt.Font("Dialog", 0, 14)); - idLabel.setFont(new java.awt.Font("Dialog", 0, 14)); - - - java.awt.Font f = new java.awt.Font("Dialog", 0, 14); - f = f.deriveFont(java.awt.Font.BOLD); - setInfoLabel.setFont(f); - - cdArea.setFont(new java.awt.Font("Dialog", 0, 14)); - } - - setCard(card); - } - - /** {@inheritDoc} */ - public void setCard(Card card) { - nameCostLabel.setText(""); - typeLabel.setText(""); - powerToughnessLabel.setText(""); - damageLabel.setText(""); - idLabel.setText(""); - setInfoLabel.setText(""); - setInfoLabel.setOpaque(false); - setInfoLabel.setBorder(null); - cdArea.setText(""); - setBorder(GuiDisplayUtil.getBorder(card)); - - this.card = card; - if (card == null) return; - - boolean faceDown = card.isFaceDown() && card.getController() != AllZone.getHumanPlayer(); - if (!faceDown) { - if (card.getManaCost().equals("") || card.isLand()) nameCostLabel.setText(card.getName()); - else nameCostLabel.setText(card.getName() + " - " + card.getManaCost()); - } else nameCostLabel.setText("Morph"); - - if (!faceDown) typeLabel.setText(GuiDisplayUtil.formatCardType(card)); - else typeLabel.setText("Creature"); - - if (card.isCreature()) { - powerToughnessLabel.setText(card.getNetAttack() + " / " + card.getNetDefense()); - damageLabel.setText("Damage: " + card.getDamage() + " Assigned Damage: " + card.getTotalAssignedDamage()); - } - if (card.isPlaneswalker()) damageLabel.setText("Assigned Damage: " + card.getTotalAssignedDamage()); - - idLabel.setText("Card ID " + card.getUniqueNumber()); - - //rarity and set of a face down card should not be visible to the opponent - if (!card.isFaceDown() || card.getController().isHuman()) setInfoLabel.setText(card.getCurSetCode()); - - if (!setInfoLabel.getText().equals("")) { - setInfoLabel.setOpaque(true); - String csr = card.getCurSetRarity(); - if (csr.equals("Common") || csr.equals("Land")) { - setInfoLabel.setBackground(Color.BLACK); - setInfoLabel.setForeground(Color.WHITE); - setInfoLabel.setBorder(BorderFactory.createLineBorder(Color.WHITE)); - } else if (csr.equals("Uncommon")) { - setInfoLabel.setBackground(Color.LIGHT_GRAY); - setInfoLabel.setForeground(Color.BLACK); - setInfoLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK)); - } else if (csr.equals("Rare")) { - setInfoLabel.setBackground(Color.YELLOW); - setInfoLabel.setForeground(Color.BLACK); - setInfoLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK)); - } else if (csr.equals("Mythic")) { - setInfoLabel.setBackground(Color.RED); - setInfoLabel.setForeground(Color.BLACK); - setInfoLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK)); - } else if (csr.equals("Special")) { - // "Timeshifted" or other Special Rarity Cards - setInfoLabel.setBackground(PURPLE); - setInfoLabel.setForeground(Color.BLACK); - setInfoLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK)); - } - //cdLabel7.setText(card.getCurSetCode()); - } - - //fill the card text - - StringBuilder area = new StringBuilder(); - - //Token - if (card.isToken()) area.append("Token"); - - if (!faceDown) { - //card text - if (area.length() != 0) area.append("\n"); - String text = card.getText(); - //LEVEL [0-9]+-[0-9]+ - //LEVEL [0-9]+\+ - - String regex = "LEVEL [0-9]+-[0-9]+ "; - text = text.replaceAll(regex, "$0\r\n"); - - regex = "LEVEL [0-9]+\\+ "; - text = text.replaceAll(regex, "\r\n$0\r\n"); - - //displays keywords that have dots in them a little better: - regex = "\\., "; - text = text.replaceAll(regex, ".\r\n"); - - area.append(text); - } - - //counter text - Counters[] counters = Counters.values(); - for (Counters counter : counters) { - if (card.getCounters(counter) != 0) { - if (area.length() != 0) area.append("\n"); - area.append(counter.getName() + " counters: "); - area.append(card.getCounters(counter)); - } - } - - // Regeneration Shields - int regenShields = card.getShield(); - if (regenShields > 0) { - if (area.length() != 0) area.append("\n"); - area.append("Regeneration Shield(s): ").append(regenShields); - } - - // Damage Prevention - int preventNextDamage = card.getPreventNextDamage(); - if (preventNextDamage > 0) { - area.append("\n"); - area.append("Prevent the next ").append(preventNextDamage).append(" damage that would be dealt to "); - area.append(card.getName()).append(" it this turn."); - } - - //top revealed - if (card.hasKeyword("Play with the top card of your library revealed.") && card.getController() != null - && !AllZoneUtil.getPlayerCardsInLibrary(card.getController()).isEmpty()) { - area.append("\r\nTop card: "); - area.append(AllZoneUtil.getPlayerCardsInLibrary(card.getController(), 1)); - } - - //chosen type - if (card.getChosenType() != "") { - if (area.length() != 0) area.append("\n"); - area.append("(chosen type: "); - area.append(card.getChosenType()); - area.append(")"); - } - - //chosen color - if (card.getChosenColor() != "") { - if (area.length() != 0) area.append("\n"); - area.append("(chosen color: "); - area.append(card.getChosenColor()); - area.append(")"); - } - - //named card - if (card.getNamedCard() != "") { - if (area.length() != 0) area.append("\n"); - area.append("(named card: "); - area.append(card.getNamedCard()); - area.append(")"); - } - - //equipping - if (card.getEquipping().size() > 0) { - if (area.length() != 0) area.append("\n"); - area.append("=Equipping "); - area.append(card.getEquipping().get(0)); - area.append("="); - } - - //equipped by - if (card.getEquippedBy().size() > 0) { - if (area.length() != 0) area.append("\n"); - area.append("=Equipped by "); - for (Iterator it = card.getEquippedBy().iterator(); it.hasNext(); ) { - area.append(it.next()); - if (it.hasNext()) area.append(", "); - } - area.append("="); - } - - //enchanting - if (card.getEnchanting().size() > 0) { - if (area.length() != 0) area.append("\n"); - area.append("*Enchanting "); - if (card.getEnchanting().get(0).isFaceDown() - && card.getEnchanting().get(0).getController().isComputer()) { - area.append("Morph ("); - area.append(card.getEnchanting().get(0).getUniqueNumber()); - area.append(")"); - } else { - area.append(card.getEnchanting().get(0)); - } - area.append("*"); - } - - //enchanted by - if (card.getEnchantedBy().size() > 0) { - if (area.length() != 0) area.append("\n"); - area.append("*Enchanted by "); - for (Iterator it = card.getEnchantedBy().iterator(); it.hasNext(); ) { - area.append(it.next()); - if (it.hasNext()) area.append(", "); - } - area.append("*"); - } - - //controlling - if (card.getGainControlTargets().size() > 0) { - if (area.length() != 0) area.append("\n"); - area.append("+Controlling: "); - for (Iterator it = card.getGainControlTargets().iterator(); it.hasNext(); ) { - area.append(it.next()); - if (it.hasNext()) area.append(", "); - } - area.append("+"); - } - - //cloned via - if (card.getCloneOrigin() != null) { - if (area.length() != 0) area.append("\n"); - area.append("^Cloned via: "); - area.append(card.getCloneOrigin().getName()); - area.append("^"); - } - - //Imprint - if (!card.getImprinted().isEmpty()) { - if (area.length() != 0) area.append("\n"); - area.append("^Imprinting: "); - for (Iterator it = card.getImprinted().iterator(); it.hasNext(); ) { - area.append(it.next()); - if (it.hasNext()) area.append(", "); - } - area.append("^"); - } - - //uncastable - if (card.isUnCastable()) { - if (area.length() != 0) area.append("\n"); - area.append("This card can't be cast."); - } - - if (card.hasAttachedCards()) { - if (area.length() != 0) area.append("\n"); - Card[] cards = card.getAttachedCards(); - area.append("=Attached: "); - for (Card c : cards) { - area.append(c.getName()); - area.append(" "); - } - area.append("="); - } - - cdArea.setText(area.toString()); - } - - /** - *

Getter for the field card.

- * - * @return a {@link forge.Card} object. - */ - public Card getCard() { - return card; - } -} diff --git a/src/forge/gui/game/CardPanel.java b/src/forge/gui/game/CardPanel.java deleted file mode 100644 index b2d48e14fdd..00000000000 --- a/src/forge/gui/game/CardPanel.java +++ /dev/null @@ -1,81 +0,0 @@ -package forge.gui.game; - - -import forge.Card; -import forge.CardContainer; -import forge.GuiDisplayUtil; -import forge.ImageCache; - -import javax.swing.*; -import java.awt.*; - - -/** - * The class CardPanel. A card panel stores a card to display it on the battlefield. An image is used if available. - * - * @author Forge - * @version $Id: $ - */ -public class CardPanel extends JPanel implements CardContainer { - /** Constant serialVersionUID=509877513760665415L */ - private static final long serialVersionUID = 509877513760665415L; - private Card card; - - /** - *

Constructor for CardPanel.

- * - * @param card a {@link forge.Card} object. - */ - public CardPanel(Card card) { - setCard(card); - } - - /** - *

addComponents.

- */ - private void addComponents() { - Card c = getCard(); - Image cardImage = ImageCache.getImage(c); - if (cardImage == null) { - //show the card as text - setLayout(new GridLayout(0, 1)); - - add(new JLabel(c.isFaceDown() ? "Morph" : c.getName() + " " + c.getManaCost())); - add(new JLabel(GuiDisplayUtil.formatCardType(c))); - - JLabel tapLabel = new JLabel("Tapped"); - tapLabel.setBackground(Color.white); - tapLabel.setOpaque(true); - - if (c.isTapped()) { - add(tapLabel); - } - - if (c.isCreature()) add(new JLabel(c.getNetAttack() + " / " + c.getNetDefense())); - } else { - //show the card image - setLayout(new GridLayout(1, 1)); - add(new JLabel(new ImageIcon(cardImage))); - } - } - - /** {@inheritDoc} */ - public void setCard(Card card) { - this.card = card; - setBorder(GuiDisplayUtil.getBorder(card)); - addComponents(); - } - - /** - *

Getter for the field card.

- * - * @return a {@link forge.Card} object. - */ - public Card getCard() { - return card; - } - - //~ - public CardPanel connectedCard; - //~ -} diff --git a/src/forge/gui/game/CardPicturePanel.java b/src/forge/gui/game/CardPicturePanel.java deleted file mode 100644 index 521b7f35819..00000000000 --- a/src/forge/gui/game/CardPicturePanel.java +++ /dev/null @@ -1,108 +0,0 @@ -/** - * CardPicturePanel.java - * - * Created on 17.02.2010 - */ - -package forge.gui.game; - - -import arcane.ui.ScaledImagePanel; -import arcane.ui.ScaledImagePanel.MultipassType; -import arcane.ui.ScaledImagePanel.ScalingType; -import forge.Card; -import forge.CardContainer; -import forge.ImageCache; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; - - -/** - * The class CardPicturePanel. Shows the full-sized image in a label. if there's no picture, the cardname is - * displayed instead. - * - * @author Clemens Koza - * @version V0.0 17.02.2010 - */ -public class CardPicturePanel extends JPanel implements CardContainer { - /** Constant serialVersionUID=-3160874016387273383L */ - private static final long serialVersionUID = -3160874016387273383L; - - private Card card; - - // private JLabel label; -// private ImageIcon icon; - private ScaledImagePanel panel; - private Image currentImange; - - /** - *

Constructor for CardPicturePanel.

- * - * @param card a {@link forge.Card} object. - */ - public CardPicturePanel(Card card) { - super(new BorderLayout()); -// add(label = new JLabel(icon = new ImageIcon())); - add(panel = new ScaledImagePanel()); - panel.setScalingBlur(false); - panel.setScalingType(ScalingType.bicubic); - panel.setScalingMultiPassType(MultipassType.none); - - addComponentListener(new ComponentAdapter() { - @Override - public void componentShown(ComponentEvent e) { - update(); - } - - @Override - public void componentResized(ComponentEvent e) { - update(); - } - }); - - setCard(card); - } - - /** - *

update.

- */ - public void update() { - setCard(getCard()); - } - - /** {@inheritDoc} */ - public void setCard(Card card) { - this.card = card; - if (!isShowing()) return; - Insets i = getInsets(); - Image image = card == null ? null : ImageCache.getImage(card, getWidth() - i.left - i.right, getHeight() - - i.top - i.bottom); - - if (image != currentImange) { - currentImange = image; - panel.setImage(image, null); - panel.repaint(); - } -// if(image == null) { -// label.setIcon(null); -// //avoid a hard reference to the image while not needed -// icon.setImage(null); -// label.setText(card.isFaceDown()? "Morph":card.getName()); -// } else if(image != icon.getImage()) { -// icon.setImage(image); -// label.setIcon(icon); -// } - } - - /** - *

Getter for the field card.

- * - * @return a {@link forge.Card} object. - */ - public Card getCard() { - return card; - } -} diff --git a/src/forge/gui/input/Input.java b/src/forge/gui/input/Input.java deleted file mode 100644 index 50a7e9fe456..00000000000 --- a/src/forge/gui/input/Input.java +++ /dev/null @@ -1,109 +0,0 @@ -package forge.gui.input; - -import forge.AllZone; -import forge.Card; -import forge.Player; -import forge.PlayerZone; - - -/** - *

Abstract Input class.

- * - * @author Forge - * @version $Id: $ - */ -public abstract class Input implements java.io.Serializable { - /** Constant serialVersionUID=-6539552513871194081L */ - private static final long serialVersionUID = -6539552513871194081L; - - private boolean isFree = false; - - //showMessage() is always the first method called - /** - *

showMessage.

- */ - public void showMessage() { - AllZone.getDisplay().showMessage("Blank Input"); - } - - /** - *

selectCard.

- * - * @param c a {@link forge.Card} object. - * @param zone a {@link forge.PlayerZone} object. - */ - public void selectCard(Card c, PlayerZone zone) { - } - - /** - *

selectPlayer.

- * - * @param player a {@link forge.Player} object. - */ - public void selectPlayer(final Player player) { - } - - /** - *

selectButtonOK.

- */ - public void selectButtonOK() { - } - - /** - *

selectButtonCancel.

- */ - public void selectButtonCancel() { - } - - //helper methods, since they are used alot - //to be used by anything in CardFactory like SetTargetInput - //NOT TO BE USED by Input_Main or any of the "regular" Inputs objects that are not set using AllZone.getInputControl().setInput(Input) - /** - *

stop.

- */ - final public void stop() { - //clears a "temp" Input like Input_PayManaCost if there is one - AllZone.getInputControl().resetInput(); - - if (AllZone.getPhase().isNeedToNextPhase()) { - // mulligan needs this to move onto next phase - AllZone.getPhase().setNeedToNextPhase(false); - AllZone.getPhase().nextPhase(); - } - } - - //exits the "current" Input and sets the next Input - /** - *

stopSetNext.

- * - * @param in a {@link forge.gui.input.Input} object. - */ - final public void stopSetNext(Input in) { - stop(); - AllZone.getInputControl().setInput(in); - } - - /** {@inheritDoc} */ - @Override - public String toString() { - return "blank"; - }//returns the Input name like "EmptyStack" - - /** - *

setFree.

- * - * @param isFree a boolean. - */ - public void setFree(boolean isFree) { - this.isFree = isFree; - } - - /** - *

isFree.

- * - * @return a boolean. - */ - public boolean isFree() { - return isFree; - } -} diff --git a/src/forge/gui/input/InputControl.java b/src/forge/gui/input/InputControl.java deleted file mode 100644 index c09140285d3..00000000000 --- a/src/forge/gui/input/InputControl.java +++ /dev/null @@ -1,187 +0,0 @@ -package forge.gui.input; - -import forge.*; - -import java.util.LinkedList; -import java.util.Stack; - -/** - *

InputControl class.

- * - * @author Forge - * @version $Id: $ - */ -public class InputControl extends MyObservable implements java.io.Serializable { - /** Constant serialVersionUID=3955194449319994301L */ - private static final long serialVersionUID = 3955194449319994301L; - - private Input input; - /** Constant n=0 */ - static int n = 0; - private Stack inputStack = new Stack(); - private Stack resolvingStack = new Stack(); - private LinkedList resolvingQueue = new LinkedList(); - - /** - *

Setter for the field input.

- * - * @param in a {@link forge.gui.input.Input} object. - */ - public void setInput(final Input in) { - if (AllZone.getStack().getResolving() || !(input == null || input instanceof Input_PassPriority)) - inputStack.add(in); - else - input = in; - updateObservers(); - } - - /** - *

Setter for the field input.

- * - * @param in a {@link forge.gui.input.Input} object. - * @param bAddToResolving a boolean. - */ - public void setInput(final Input in, boolean bAddToResolving) { - // Make this - if (!bAddToResolving) { - setInput(in); - return; - } - - Input old = input; - resolvingStack.add(old); - changeInput(in); - } - - /** - *

changeInput.

- * - * @param in a {@link forge.gui.input.Input} object. - */ - private void changeInput(final Input in) { - input = in; - updateObservers(); - } - - /** - *

Getter for the field input.

- * - * @return a {@link forge.gui.input.Input} object. - */ - public Input getInput() { - return input; - } - - /** - *

clearInput.

- */ - public void clearInput() { - input = null; - resolvingQueue.clear(); - inputStack.clear(); - } - - /** - *

resetInput.

- */ - public void resetInput() { - input = null; - updateObservers(); - } - - /** - *

resetInput.

- * - * @param update a boolean. - */ - public void resetInput(boolean update) { - input = null; - if (update) - updateObservers(); - } - - /** - *

updateInput.

- * - * @return a {@link forge.gui.input.Input} object. - */ - public Input updateInput() { - final String phase = AllZone.getPhase().getPhase(); - final Player playerTurn = AllZone.getPhase().getPlayerTurn(); - final Player priority = AllZone.getPhase().getPriorityPlayer(); - - // TODO: this resolving portion needs more work, but fixes Death Cloud issues - if (resolvingStack.size() > 0) { - if (input != null) { - return input; - } - - // if an SA is resolving, only change input for something that is part of the resolving SA - changeInput(resolvingStack.pop()); - return input; - } - - if (AllZone.getStack().getResolving()) - return null; - - - if (input != null) - return input; - - else if (inputStack.size() > 0) { // incoming input to Control - changeInput(inputStack.pop()); - return input; - } - - if (Phase.getGameBegins() != 0 && AllZone.getPhase().doPhaseEffects()) { - // Handle begin phase stuff, then start back from the top - AllZone.getPhase().handleBeginPhase(); - return updateInput(); - } - - // If the Phase we're in doesn't allow for Priority, return null to move to next phase - if (AllZone.getPhase().isNeedToNextPhase()) - return null; - - // Special Inputs needed for the following phases: - if (phase.equals(Constant.Phase.Combat_Declare_Attackers)) { - AllZone.getStack().freezeStack(); - - if (playerTurn.isHuman()) - return new Input_Attack(); - } else if (phase.equals(Constant.Phase.Combat_Declare_Blockers)) { - AllZone.getStack().freezeStack(); - if (playerTurn.isHuman()) { - AllZone.getComputer().getComputer().declare_blockers(); - return null; - } else { - if (AllZone.getCombat().getAttackers().length == 0) { - // no active attackers, skip the Blocking phase - AllZone.getPhase().setNeedToNextPhase(true); - return null; - } else - return new Input_Block(); - } - } else if (phase.equals(Constant.Phase.Cleanup)) // Player needs to discard - if (AllZone.getStack().size() == 0) // fall through to resolve things like Madness - return new Input_Cleanup(); - - // ********************* - // Special phases handled above, everything else is handled simply by priority - - if (priority.isHuman()) { - boolean skip = AllZone.getPhase().doSkipPhase(); - AllZone.getPhase().setSkipPhase(false); - if (AllZone.getStack().size() == 0 && !AllZone.getDisplay().stopAtPhase(playerTurn, phase) && skip) { - AllZone.getPhase().passPriority(); - return null; - } else - return new Input_PassPriority(); - } else if (playerTurn.isComputer()) - return AllZone.getComputer(); - else { - AllZone.getComputer().getComputer().stack_not_empty(); - return null; - } - }//getInput() -}//InputControl diff --git a/src/forge/gui/input/Input_Attack.java b/src/forge/gui/input/Input_Attack.java deleted file mode 100644 index 6fd6107c748..00000000000 --- a/src/forge/gui/input/Input_Attack.java +++ /dev/null @@ -1,98 +0,0 @@ -package forge.gui.input; - -import forge.*; - - -/** - *

Input_Attack class.

- * - * @author Forge - * @version $Id: $ - */ -public class Input_Attack extends Input { - /** Constant serialVersionUID=7849903731842214245L */ - private static final long serialVersionUID = 7849903731842214245L; - - /** {@inheritDoc} */ - @Override - public void showMessage() { - // TODO: still seems to have some issues with multiple planeswalkers - - ButtonUtil.enableOnlyOK(); - - Object o = AllZone.getCombat().nextDefender(); - if (o == null) { - return; - } - - StringBuilder sb = new StringBuilder(); - sb.append("Declare Attackers: Select Creatures to Attack "); - sb.append(o.toString()); - - AllZone.getDisplay().showMessage(sb.toString()); - - if (AllZone.getCombat().getRemainingDefenders() == 0) { - // Nothing left to attack, has to attack this defender - CardList possibleAttackers = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); - possibleAttackers = possibleAttackers.getType("Creature"); - for (int i = 0; i < possibleAttackers.size(); i++) { - Card c = possibleAttackers.get(i); - if (c.hasKeyword("CARDNAME attacks each turn if able.") - && CombatUtil.canAttack(c, AllZone.getCombat()) - && !c.isAttacking()) { - AllZone.getCombat().addAttacker(c); - //if(!c.hasKeyword("Vigilance")) - // c.tap(); - } - } - } - } - - /** {@inheritDoc} */ - @Override - public void selectButtonOK() { - if (AllZone.getCombat().getAttackers().length > 0) - AllZone.getPhase().setCombat(true); - - if (AllZone.getCombat().getRemainingDefenders() != 0) - AllZone.getPhase().repeatPhase(); - - AllZone.getPhase().setNeedToNextPhase(true); - AllZone.getInputControl().resetInput(); - } - - /** {@inheritDoc} */ - @Override - public void selectCard(Card card, PlayerZone zone) { - if (card.isAttacking() || card.getController().isComputer()) - return; - - if (zone.is(Constant.Zone.Battlefield, AllZone.getHumanPlayer()) && CombatUtil.canAttack(card, AllZone.getCombat())) { - - // TODO add the propaganda code here and remove it in Phase.nextPhase() - // if (!CombatUtil.checkPropagandaEffects(card)) - // return; - - AllZone.getCombat().addAttacker(card); - AllZone.getHumanBattlefield().updateObservers(); // just to make sure the attack symbol is marked - - //for Castle Raptors, since it gets a bonus if untapped - for (String effect : AllZone.getStaticEffects().getStateBasedMap().keySet()) { - Command com = GameActionUtil.commands.get(effect); - com.execute(); - } - - CombatUtil.showCombat(); - } - }//selectCard() - - /** - *

unselectCard.

- * - * @param card a {@link forge.Card} object. - * @param zone a {@link forge.PlayerZone} object. - */ - public void unselectCard(Card card, PlayerZone zone) { - - } -} diff --git a/src/forge/gui/input/Input_Block.java b/src/forge/gui/input/Input_Block.java deleted file mode 100644 index a31c02b4c67..00000000000 --- a/src/forge/gui/input/Input_Block.java +++ /dev/null @@ -1,96 +0,0 @@ -package forge.gui.input; - - -import forge.*; - -import java.util.ArrayList; - - -/** - *

Input_Block class.

- * - * @author Forge - * @version $Id: $ - */ -public class Input_Block extends Input { - /** Constant serialVersionUID=6120743598368928128L */ - private static final long serialVersionUID = 6120743598368928128L; - - private Card currentAttacker = null; - private ArrayList allBlocking = new ArrayList(); - - /** - *

removeFromAllBlocking.

- * - * @param c a {@link forge.Card} object. - */ - public void removeFromAllBlocking(Card c) { - allBlocking.remove(c); - } - - /** {@inheritDoc} */ - @Override - public void showMessage() { - //for Castle Raptors, since it gets a bonus if untapped - for (String effect : AllZone.getStaticEffects().getStateBasedMap().keySet()) { - Command com = GameActionUtil.commands.get(effect); - com.execute(); - } - - //could add "Reset Blockers" button - ButtonUtil.enableOnlyOK(); - - - if (currentAttacker == null) { - /* - //Lure - CardList attackers = new CardList(AllZone.getCombat().getAttackers()); - for(Card attacker:attackers) { - if(attacker.hasKeyword("All creatures able to block CARDNAME do so.")) { - CardList bls = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer()); - for(Card bl:bls) { - if(CombatUtil.canBlock(attacker, bl, AllZone.getCombat())) { - allBlocking.add(bl); - AllZone.getCombat().addBlocker(attacker, bl); - } - } - } - }*/ - - AllZone.getDisplay().showMessage("To Block, click on your Opponents attacker first, then your blocker(s)"); - } else { - String attackerName = currentAttacker.isFaceDown() ? "Morph" : currentAttacker.getName(); - AllZone.getDisplay().showMessage("Select a creature to block " + attackerName + " (" - + currentAttacker.getUniqueNumber() + ") "); - } - - CombatUtil.showCombat(); - } - - /** {@inheritDoc} */ - @Override - public void selectButtonOK() { - if (CombatUtil.finishedMandatotyBlocks(AllZone.getCombat())) { - // Done blocking - ButtonUtil.reset(); - - AllZone.getPhase().setNeedToNextPhase(true); - } - } - - /** {@inheritDoc} */ - @Override - public void selectCard(Card card, PlayerZone zone) { - //is attacking? - if (CardUtil.toList(AllZone.getCombat().getAttackers()).contains(card)) { - currentAttacker = card; - } else if (zone.is(Constant.Zone.Battlefield, AllZone.getHumanPlayer()) && card.isCreature() - && CombatUtil.canBlock(currentAttacker, card, AllZone.getCombat())) { - if (currentAttacker != null && (!allBlocking.contains(card))) { - allBlocking.add(card); - AllZone.getCombat().addBlocker(currentAttacker, card); - } - } - showMessage(); - }//selectCard() -} diff --git a/src/forge/gui/input/Input_Cleanup.java b/src/forge/gui/input/Input_Cleanup.java deleted file mode 100644 index 9671d9aa6e9..00000000000 --- a/src/forge/gui/input/Input_Cleanup.java +++ /dev/null @@ -1,66 +0,0 @@ -package forge.gui.input; - -import forge.*; - -/** - *

Input_Cleanup class.

- * - * @author Forge - * @version $Id: $ - */ -public class Input_Cleanup extends Input { - /** Constant serialVersionUID=-4164275418971547948L */ - private static final long serialVersionUID = -4164275418971547948L; - - /** {@inheritDoc} */ - @Override - public void showMessage() { - if (AllZone.getPhase().getPlayerTurn().isComputer()) { - AI_CleanupDiscard(); - return; - } - - ButtonUtil.disableAll(); - int n = AllZoneUtil.getPlayerHand(AllZone.getHumanPlayer()).size(); - - //MUST showMessage() before stop() or it will overwrite the next Input's message - StringBuffer sb = new StringBuffer(); - sb.append("Cleanup Phase: You can only have a maximum of ").append(AllZone.getHumanPlayer().getMaxHandSize()); - sb.append(" cards, you currently have ").append(n).append(" cards in your hand - select a card to discard"); - AllZone.getDisplay().showMessage(sb.toString()); - - //goes to the next phase - if (n <= AllZone.getHumanPlayer().getMaxHandSize() || AllZone.getHumanPlayer().getMaxHandSize() == -1) { - CombatUtil.removeAllDamage(); - - AllZone.getPhase().setNeedToNextPhase(true); - AllZone.getPhase().nextPhase(); // TODO: keep an eye on this code, see if we can get rid of it. - } - } - - /** {@inheritDoc} */ - @Override - public void selectCard(Card card, PlayerZone zone) { - if (zone.is(Constant.Zone.Hand, AllZone.getHumanPlayer())) { - card.getController().discard(card, null); - if (AllZone.getStack().size() == 0) - showMessage(); - } - }//selectCard() - - - /** - *

AI_CleanupDiscard.

- */ - public void AI_CleanupDiscard() { - int size = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()).size(); - - if (AllZone.getComputerPlayer().getMaxHandSize() != -1) { - int numDiscards = size - AllZone.getComputerPlayer().getMaxHandSize(); - AllZone.getComputerPlayer().discard(numDiscards, null, false); - } - CombatUtil.removeAllDamage(); - - AllZone.getPhase().setNeedToNextPhase(true); - } -} diff --git a/src/forge/gui/input/Input_Mulligan.java b/src/forge/gui/input/Input_Mulligan.java deleted file mode 100644 index caf9ad5f634..00000000000 --- a/src/forge/gui/input/Input_Mulligan.java +++ /dev/null @@ -1,112 +0,0 @@ -package forge.gui.input; - -import forge.*; - -/** - *

Input_Mulligan class.

- * - * @author Forge - * @version $Id: $ - */ -public class Input_Mulligan extends Input { - /** Constant serialVersionUID=-8112954303001155622L */ - private static final long serialVersionUID = -8112954303001155622L; - - /** {@inheritDoc} */ - @Override - public void showMessage() { - ButtonUtil.enableAll(); - AllZone.getDisplay().getButtonOK().setText("No"); - AllZone.getDisplay().getButtonCancel().setText("Yes"); - AllZone.getDisplay().showMessage("Do you want to Mulligan?"); - } - - /** {@inheritDoc} */ - @Override - public void selectButtonOK() { - end(); - } - - /** {@inheritDoc} */ - @Override - public void selectButtonCancel() { - AllZone.getGameInfo().setHumanMulliganedToZero(false); - - CardList hand = AllZoneUtil.getPlayerHand(AllZone.getHumanPlayer()); - for (Card c : hand) - AllZone.getGameAction().moveToLibrary(c); - - for (int i = 0; i < 100; i++) - AllZone.getHumanPlayer().shuffle(); - - int newHand = hand.size() - 1; - - AllZone.getGameInfo().addHumanNumberOfTimesMulliganed(1); - - if (AllZone.getQuestData() != null) { - if (AllZone.getQuestData().getInventory().hasItem("Sleight") && AllZone.getGameInfo().getHumanNumberOfTimesMulliganed() == 1) - newHand++; - } - for (int i = 0; i < newHand; i++) - AllZone.getHumanPlayer().drawCard(); - - if (newHand == 0) { - AllZone.getGameInfo().setHumanMulliganedToZero(true); - end(); - } - }//selectButtonOK() - - /** - *

end.

- */ - void end() { - //Computer mulligan - CardList CHandList = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); - - Card dummy = CHandList.get(0); - //Computer mulligans if there are no cards with converted mana cost of 0 in its hand - while (CHandList.size() > 5 && CHandList.getValidCards("Card.cmcEQ0", AllZone.getComputerPlayer(), dummy).size() < 2) { - for (Card c : CHandList) - AllZone.getGameAction().moveToLibrary(c); - - for (int i = 0; i < 100; i++) - AllZone.getComputerPlayer().shuffle(); - - int newHand = CHandList.size() - 1; - for (int i = 0; i < newHand; i++) - AllZone.getComputerPlayer().drawCard(); - - CHandList = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); - } - - //Human Leylines - ButtonUtil.reset(); - CardList HHandList = AllZoneUtil.getPlayerHand(AllZone.getHumanPlayer()); - - for (Card c : HHandList) { - if (c.getName().startsWith("Leyline")) { - if (GameActionUtil.showYesNoDialog(c, "Put onto Battlefield?")) - AllZone.getGameAction().moveToPlay(c); - } - } - - //Computer Leylines - for (Card c : CHandList) { - if (c.getName().startsWith("Leyline") && !(c.getName().startsWith("Leyline of Singularity") - && AllZoneUtil.getCardsInPlay("Leyline of Singularity").size() > 0)) { - AllZone.getGameAction().moveToPlay(c); - AllZone.getGameAction().checkStateEffects(); - } - - } - if (AllZone.getGameAction().isStartCut() && !(HHandList.contains(AllZone.getGameAction().getHumanCut()) - || CHandList.contains(AllZone.getGameAction().getComputerCut()))) { - AllZone.getGameAction().moveTo(AllZone.getZone(Constant.Zone.Library, AllZone.getHumanPlayer()), AllZone.getGameAction().getHumanCut()); - AllZone.getGameAction().moveTo(AllZone.getZone(Constant.Zone.Library, AllZone.getComputerPlayer()), AllZone.getGameAction().getComputerCut()); - } - AllZone.getGameAction().checkStateEffects(); - Phase.setGameBegins(1); - AllZone.getPhase().setNeedToNextPhase(false); - stop(); - } -} diff --git a/src/forge/gui/input/Input_PassPriority.java b/src/forge/gui/input/Input_PassPriority.java deleted file mode 100644 index 818c043df6e..00000000000 --- a/src/forge/gui/input/Input_PassPriority.java +++ /dev/null @@ -1,60 +0,0 @@ -package forge.gui.input; - -import forge.*; - -/** - *

Input_PassPriority class.

- * - * @author Forge - * @version $Id: $ - */ -public class Input_PassPriority extends Input implements java.io.Serializable { - /** Constant serialVersionUID=-581477682214137181L */ - private static final long serialVersionUID = -581477682214137181L; - - /** {@inheritDoc} */ - @Override - public void showMessage() { - GuiDisplayUtil.updateGUI(); - ButtonUtil.enableOnlyOK(); - - String phase = AllZone.getPhase().getPhase(); - Player player = AllZone.getPhase().getPriorityPlayer(); - - if (player.isComputer()) { - System.out.println(phase + ": Computer in passpriority"); - } - - StringBuilder sb = new StringBuilder(); - - sb.append("Turn : ").append(AllZone.getPhase().getPlayerTurn()).append("\n"); - sb.append("Phase: ").append(phase).append("\n"); - sb.append("Stack: "); - if (AllZone.getStack().size() != 0) - sb.append(AllZone.getStack().size()).append(" to Resolve."); - else - sb.append("Empty"); - sb.append("\n"); - sb.append("Priority: ").append(player); - - AllZone.getDisplay().showMessage(sb.toString()); - } - - /** {@inheritDoc} */ - @Override - public void selectButtonOK() { - AllZone.getPhase().passPriority(); - GuiDisplayUtil.updateGUI(); - Input in = AllZone.getInputControl().getInput(); - if (in == this || in == null) - AllZone.getInputControl().resetInput(); - // Clear out PassPriority after clicking button - } - - /** {@inheritDoc} */ - @Override - public void selectCard(Card card, PlayerZone zone) { - if (AllZone.getGameAction().playCard(card)) - AllZone.getPhase().setPriority(AllZone.getHumanPlayer()); - }//selectCard() -} diff --git a/src/forge/gui/input/Input_PayManaCost.java b/src/forge/gui/input/Input_PayManaCost.java deleted file mode 100644 index bf886cd5890..00000000000 --- a/src/forge/gui/input/Input_PayManaCost.java +++ /dev/null @@ -1,204 +0,0 @@ -package forge.gui.input; - -import forge.*; -import forge.card.mana.ManaCost; -import forge.card.spellability.SpellAbility; - -//pays the cost of a card played from the player's hand -//the card is removed from the players hand if the cost is paid -//CANNOT be used for ABILITIES -/** - *

Input_PayManaCost class.

- * - * @author Forge - * @version $Id: $ - */ -public class Input_PayManaCost extends Input { - // anything that uses this should be converted to Ability_Cost - /** Constant serialVersionUID=3467312982164195091L */ - private static final long serialVersionUID = 3467312982164195091L; - - private final String originalManaCost; - - private final Card originalCard; - public ManaCost manaCost; - - private final SpellAbility spell; - - private boolean skipStack; - - private int phyLifeToLose = 0; - - /** - *

Constructor for Input_PayManaCost.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param noStack a boolean. - */ - public Input_PayManaCost(SpellAbility sa, boolean noStack) { - skipStack = noStack; - originalManaCost = sa.getManaCost(); // Change - originalCard = sa.getSourceCard(); - - spell = sa; - - if (Phase.getGameBegins() == 1) { - if (sa.getSourceCard().isCopiedSpell() && sa.isSpell()) { - if (spell.getAfterPayMana() != null) stopSetNext(spell.getAfterPayMana()); - else { - manaCost = new ManaCost("0"); - AllZone.getStack().add(spell); - } - } else { - manaCost = AllZone.getGameAction().getSpellCostChange(sa, new ManaCost(originalManaCost)); - } - } else { - manaCost = new ManaCost(sa.getManaCost()); - } - } - - /** - *

Constructor for Input_PayManaCost.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - */ - public Input_PayManaCost(SpellAbility sa) { - originalManaCost = sa.getManaCost(); // Change - originalCard = sa.getSourceCard(); - - spell = sa; - - if (Phase.getGameBegins() == 1) { - if (sa.getSourceCard().isCopiedSpell() && sa.isSpell()) { - if (spell.getAfterPayMana() != null) stopSetNext(spell.getAfterPayMana()); - else { - manaCost = new ManaCost("0"); - AllZone.getStack().add(spell); - } - } else { - manaCost = AllZone.getGameAction().getSpellCostChange(sa, new ManaCost(originalManaCost)); - } - } else { - manaCost = new ManaCost(sa.getManaCost()); - } - } - - /** - *

resetManaCost.

- */ - private void resetManaCost() { - manaCost = new ManaCost(originalManaCost); - phyLifeToLose = 0; - } - - /** {@inheritDoc} */ - @Override - public void selectCard(Card card, PlayerZone zone) { - //this is a hack, to prevent lands being able to use mana to pay their own abilities from cards like - //Kher Keep, Pendelhaven, Blinkmoth Nexus, and Mikokoro, Center of the Sea, .... - - if (originalCard.equals(card) && spell.isTapAbility()) { - // I'm not sure if this actually prevents anything that wouldn't be handled by canPlay below - return; - } - - manaCost = Input_PayManaCostUtil.activateManaAbility(spell, card, manaCost); - - // only show message if this is the active input - if (AllZone.getInputControl().getInput() == this) - showMessage(); - - if (manaCost.isPaid()) { - originalCard.setSunburstValue(manaCost.getSunburst()); - done(); - } - } - - /** {@inheritDoc} */ - @Override - public void selectPlayer(Player player) { - - if (player.isHuman()) { - if (manaCost.payPhyrexian()) { - phyLifeToLose += 2; - } - - showMessage(); - } - - } - - /** - *

done.

- */ - private void done() { - if (phyLifeToLose > 0) - AllZone.getHumanPlayer().payLife(phyLifeToLose, originalCard); - if (spell.getSourceCard().isCopiedSpell()) { - if (spell.getAfterPayMana() != null) { - stopSetNext(spell.getAfterPayMana()); - } else - AllZone.getInputControl().resetInput(); - } else { - AllZone.getManaPool().clearPay(spell, false); - resetManaCost(); - - // if tap ability, tap card - if (spell.isTapAbility()) - originalCard.tap(); - if (spell.isUntapAbility()) - originalCard.untap(); - - // if this is a spell, move it to the Stack ZOne - - if (spell.isSpell()) // already checked for if its a copy - AllZone.getGameAction().moveToStack(originalCard); - - if (spell.getAfterPayMana() != null) - stopSetNext(spell.getAfterPayMana()); - else { - if (skipStack) { - spell.resolve(); - } else { - AllZone.getStack().add(spell); - } - AllZone.getInputControl().resetInput(); - } - } - } - - /** {@inheritDoc} */ - @Override - public void selectButtonCancel() { - resetManaCost(); - AllZone.getManaPool().unpaid(spell, true); - AllZone.getHumanBattlefield().updateObservers();//DO NOT REMOVE THIS, otherwise the cards don't always tap - - stop(); - } - - /** {@inheritDoc} */ - @Override - public void showMessage() { - ButtonUtil.enableOnlyCancel(); - - StringBuilder msg = new StringBuilder("Pay Mana Cost: " + manaCost.toString()); - if (phyLifeToLose > 0) { - msg.append(" ("); - msg.append(phyLifeToLose); - msg.append(" life paid for phyrexian mana)"); - } - - if (manaCost.containsPhyrexianMana()) { - msg.append("\n(Click on your life total to pay life for phyrexian mana.)"); - } - - AllZone.getDisplay().showMessage(msg.toString()); - if (manaCost.isPaid() && !new ManaCost(originalManaCost).isPaid()) { - originalCard.setSunburstValue(manaCost.getSunburst()); - done(); - } - - - } -} diff --git a/src/forge/gui/input/Input_PayManaCostUtil.java b/src/forge/gui/input/Input_PayManaCostUtil.java deleted file mode 100644 index 6574f6a221d..00000000000 --- a/src/forge/gui/input/Input_PayManaCostUtil.java +++ /dev/null @@ -1,184 +0,0 @@ -package forge.gui.input; - -import forge.AllZone; -import forge.Card; -import forge.Constant; -import forge.card.mana.ManaCost; -import forge.card.mana.ManaPool; -import forge.card.spellability.Ability_Mana; -import forge.card.spellability.SpellAbility; -import forge.gui.GuiUtils; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -/** - *

Input_PayManaCostUtil class.

- * - * @author Forge - * @version $Id: $ - */ -public class Input_PayManaCostUtil { - //all mana abilities start with this and typical look like "tap: add G" - //mana abilities are Strings and are retrieved by calling card.getKeyword() - //taps any card that has mana ability, not just land - /** - *

activateManaAbility.

- * - * @param sa a {@link forge.card.spellability.SpellAbility} object. - * @param card a {@link forge.Card} object. - * @param manaCost a {@link forge.card.mana.ManaCost} object. - * @return a {@link forge.card.mana.ManaCost} object. - */ - public static ManaCost activateManaAbility(SpellAbility sa, Card card, ManaCost manaCost) { - //make sure computer's lands aren't selected - if (card.getController().isComputer()) - return manaCost; - - if (card instanceof ManaPool) - return ((ManaPool) card).subtractMana(sa, manaCost); - - ArrayList abilities = getManaAbilities(card); - StringBuilder cneeded = new StringBuilder(); - boolean choice = true; - boolean skipExpress = false; - - for (String color : Constant.Color.ManaColors) - if (manaCost.isNeeded(color)) - cneeded.append(getShortColorString(color)); - - Iterator it = abilities.iterator();//you can't remove unneeded abilities inside a for(am:abilities) loop :( - while (it.hasNext()) { - Ability_Mana ma = it.next(); - ma.setActivatingPlayer(AllZone.getHumanPlayer()); - if (!ma.canPlay()) it.remove(); - else if (!canMake(ma, cneeded.toString())) it.remove(); - - if (!skipExpress) { - // skip express mana if the ability is not undoable - if (!ma.isUndoable()) { - skipExpress = true; - continue; - } - } - } - if (abilities.isEmpty()) - return manaCost; - - // TODO when implementing sunburst - // If the card has sunburst or any other ability that tracks mana spent, skip express Mana choice - // if (card.getTrackManaPaid()) skipExpress = true; - - if (!skipExpress) { - // express Mana Choice - ArrayList colorMatches = new ArrayList(); - - for (Ability_Mana am : abilities) { - String[] m = ManaPool.formatMana(am); - for (String color : m) - if (manaCost.isColor(color)) // convert to long before checking if color - colorMatches.add(am); - } - - if (colorMatches.size() == 0 || colorMatches.size() == abilities.size()) - // can only match colorless just grab the first and move on. - choice = false; - else if (colorMatches.size() < abilities.size()) { - // leave behind only color matches - abilities = colorMatches; - } - } - - Ability_Mana chosen = abilities.get(0); - if (1 < abilities.size() && choice) { - HashMap ability = new HashMap(); - for (Ability_Mana am : abilities) - ability.put(am.toString(), am); - chosen = (Ability_Mana) GuiUtils.getChoice("Choose mana ability", abilities.toArray()); - } - - AllZone.getGameAction().playSpellAbility(chosen); - - manaCost = AllZone.getManaPool().subtractMana(sa, manaCost, chosen); - - AllZone.getHumanBattlefield().updateObservers();//DO NOT REMOVE THIS, otherwise the cards don't always tap (copied) - return manaCost; - - } - - /** - *

getManaAbilities.

- * - * @param card a {@link forge.Card} object. - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getManaAbilities(Card card) { - return card.getManaAbility(); - } - - //color is like "G", returns "Green" - /** - *

canMake.

- * - * @param am a {@link forge.card.spellability.Ability_Mana} object. - * @param mana a {@link java.lang.String} object. - * @return a boolean. - */ - public static boolean canMake(Ability_Mana am, String mana) { - if (mana.contains("1")) return true; - if (mana.contains("S") && am.isSnow()) return true; - - for (String color : ManaPool.formatMana(am)) - if (mana.contains(color)) return true; - return false; - } - - - /** - *

getLongColorString.

- * - * @param color a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public static String getLongColorString(String color) { - Map m = new HashMap(); - m.put("G", Constant.Color.Green); - m.put("R", Constant.Color.Red); - m.put("U", Constant.Color.Blue); - m.put("B", Constant.Color.Black); - m.put("W", Constant.Color.White); - m.put("S", Constant.Color.Snow); - - Object o = m.get(color); - - if (o == null) - o = Constant.Color.Colorless; - - - return o.toString(); - } - - /** - *

getShortColorString.

- * - * @param color a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public static String getShortColorString(String color) { - Map m = new HashMap(); - m.put(Constant.Color.Green, "G"); - m.put(Constant.Color.Red, "R"); - m.put(Constant.Color.Blue, "U"); - m.put(Constant.Color.Black, "B"); - m.put(Constant.Color.White, "W"); - m.put(Constant.Color.Colorless, "1"); - m.put(Constant.Color.Snow, "S"); - - Object o = m.get(color); - - return o.toString(); - } - -} diff --git a/src/forge/gui/input/Input_PayManaCost_Ability.java b/src/forge/gui/input/Input_PayManaCost_Ability.java deleted file mode 100644 index a06ee1b8dd8..00000000000 --- a/src/forge/gui/input/Input_PayManaCost_Ability.java +++ /dev/null @@ -1,147 +0,0 @@ -package forge.gui.input; - -import forge.*; -import forge.card.mana.ManaCost; -import forge.card.spellability.SpellAbility; - -//if cost is paid, Command.execute() is called - -/** - *

Input_PayManaCost_Ability class.

- * - * @author Forge - * @version $Id: $ - */ -public class Input_PayManaCost_Ability extends Input { - /** - * Constant serialVersionUID=3836655722696348713L - */ - private static final long serialVersionUID = 3836655722696348713L; - - private String originalManaCost; - private String message = ""; - private ManaCost manaCost; - private SpellAbility fakeAbility; - - private Command paidCommand; - private Command unpaidCommand; - - //only used for X costs: - private boolean showOnlyOKButton = false; - - /** - *

Constructor for Input_PayManaCost_Ability.

- * - * @param manaCost a {@link java.lang.String} object. - * @param paid a {@link forge.Command} object. - */ - public Input_PayManaCost_Ability(String manaCost, Command paid) { - this(manaCost, paid, Command.Blank); - } - - /** - *

Constructor for Input_PayManaCost_Ability.

- * - * @param manaCost_2 a {@link java.lang.String} object. - * @param paidCommand_2 a {@link forge.Command} object. - * @param unpaidCommand_2 a {@link forge.Command} object. - */ - public Input_PayManaCost_Ability(String manaCost_2, Command paidCommand_2, Command unpaidCommand_2) { - this("", manaCost_2, paidCommand_2, unpaidCommand_2); - } - - /** - *

Constructor for Input_PayManaCost_Ability.

- * - * @param m a {@link java.lang.String} object. - * @param manaCost_2 a {@link java.lang.String} object. - * @param paidCommand_2 a {@link forge.Command} object. - * @param unpaidCommand_2 a {@link forge.Command} object. - */ - public Input_PayManaCost_Ability(String m, String manaCost_2, Command paidCommand_2, Command unpaidCommand_2) { - this(m, manaCost_2, paidCommand_2, unpaidCommand_2, false); - } - - /** - *

Constructor for Input_PayManaCost_Ability.

- * - * @param m a {@link java.lang.String} object. - * @param manaCost_2 a {@link java.lang.String} object. - * @param paidCommand_2 a {@link forge.Command} object. - * @param unpaidCommand_2 a {@link forge.Command} object. - * @param showOKButton a boolean. - */ - public Input_PayManaCost_Ability(String m, String manaCost_2, Command paidCommand_2, Command unpaidCommand_2, boolean showOKButton) { - fakeAbility = new SpellAbility(SpellAbility.Ability, null) { - @Override - public void resolve() { - } - - @Override - public boolean canPlay() { - return false; - } - }; - originalManaCost = manaCost_2; - message = m; - - manaCost = new ManaCost(originalManaCost); - paidCommand = paidCommand_2; - unpaidCommand = unpaidCommand_2; - showOnlyOKButton = showOKButton; - } - - - /** - *

resetManaCost.

- */ - public void resetManaCost() { - manaCost = new ManaCost(originalManaCost); - } - - /** {@inheritDoc} */ - @Override - public void selectCard(Card card, PlayerZone zone) { - //only tap card if the mana is needed - manaCost = Input_PayManaCostUtil.activateManaAbility(fakeAbility, card, manaCost); - showMessage(); - - if (manaCost.isPaid()) { - resetManaCost(); - AllZone.getManaPool().clearPay(fakeAbility, false); - - paidCommand.execute(); - - AllZone.getInputControl().resetInput(); - } - } - - /** {@inheritDoc} */ - @Override - public void selectButtonCancel() { - resetManaCost(); - AllZone.getManaPool().unpaid(fakeAbility, true); - unpaidCommand.execute(); - AllZone.getInputControl().resetInput(); - } - - /** {@inheritDoc} */ - @Override - public void selectButtonOK() { - if (showOnlyOKButton) { - unpaidCommand.execute(); - AllZone.getInputControl().resetInput(); - } - } - - /** {@inheritDoc} */ - @Override - public void showMessage() { - ButtonUtil.enableOnlyCancel(); - if (showOnlyOKButton) - ButtonUtil.enableOnlyOK(); - AllZone.getDisplay().showMessage(message + "Pay Mana Cost: \r\n" + manaCost.toString()); - } - - -} diff --git a/src/forge/properties/ForgePreferences.java b/src/forge/properties/ForgePreferences.java deleted file mode 100644 index de95abfc5fa..00000000000 --- a/src/forge/properties/ForgePreferences.java +++ /dev/null @@ -1,170 +0,0 @@ -package forge.properties; - -import java.io.*; -import java.util.ArrayList; -import java.util.List; - -/** - *

ForgePreferences class.

- * - * @author Forge - * @version $Id$ - */ -public class ForgePreferences extends Preferences { - public boolean newGui; - public boolean stackAiLand; - public boolean millingLossCondition; - public boolean developerMode; - public boolean uploadDraftAI; - public boolean randCFoil; - - public String laf; - public boolean lafFonts; - public StackOffsetType stackOffset; - public int maxStackSize; - public CardSizeType cardSize; - public boolean cardOverlay; - public boolean scaleLargerThanOriginal; - - public String BugzName; - public String BugzPwd; - - // Phases - public boolean bAIUpkeep; - public boolean bAIDraw; - public boolean bAIEOT; - public boolean bAIBeginCombat; - public boolean bAIEndCombat; - public boolean bHumanUpkeep; - public boolean bHumanDraw; - public boolean bHumanEOT; - public boolean bHumanBeginCombat; - public boolean bHumanEndCombat; - - private List saveListeners = new ArrayList(); - private final String fileName; - - /** - *

Constructor for ForgePreferences.

- * - * @param fileName a {@link java.lang.String} object. - * @throws java.lang.Exception if any. - */ - public ForgePreferences(String fileName) throws Exception { - this.fileName = fileName; - File f = new File(fileName); - if (!f.exists()) { - f.createNewFile(); - } - try { - FileInputStream stream = new FileInputStream(fileName); - load(stream); - stream.close(); - } catch (FileNotFoundException ex) { - throw new Exception("File not found: \"" + fileName + "\".", ex); - } catch (IOException ex) { - throw new Exception("Error reading \"" + fileName + "\".", ex); - } - - newGui = getBoolean("gui.new", true); - stackAiLand = getBoolean("AI.stack.land", false); - millingLossCondition = getBoolean("loss.condition.milling", true); - developerMode = getBoolean("developer.mode", false); - - uploadDraftAI = getBoolean("upload.Draft.AI", true); - - randCFoil = getBoolean("rand.C.Foil", true); - - laf = get("gui.laf", ""); - lafFonts = getBoolean("gui.laf.fonts", false); - - cardOverlay = getBoolean("card.overlay", true); - cardSize = CardSizeType.valueOf(get("card.images.size", "medium")); - stackOffset = StackOffsetType.valueOf(get("stack.offset", "tiny")); - maxStackSize = getInt("stack.max.size", 3); - scaleLargerThanOriginal = getBoolean("card.scale.larger.than.original", true); - - BugzName = get("bugz.user.name", ""); - BugzPwd = get("bugz.user.pwd", ""); - - // Stop at Phases - bAIUpkeep = getBoolean("phase.ai.upkeep", true); - bAIDraw = getBoolean("phase.ai.draw", true); - bAIEOT = getBoolean("phase.ai.eot", true); - bAIBeginCombat = getBoolean("phase.ai.beginCombat", true); - bAIEndCombat = getBoolean("phase.ai.endCombat", true); - bHumanUpkeep = getBoolean("phase.human.upkeep", true); - bHumanDraw = getBoolean("phase.human.draw", true); - bHumanEOT = getBoolean("phase.human.eot", true); - bHumanBeginCombat = getBoolean("phase.human.beginCombat", true); - bHumanEndCombat = getBoolean("phase.human.endCombat", true); - } - - /** - *

save.

- * - * @throws java.lang.Exception if any. - */ - public void save() throws Exception { - - set("gui.new", newGui); - - set("AI.stack.land", stackAiLand); - set("loss.condition.milling", millingLossCondition); - set("developer.mode", developerMode); - set("upload.Draft.AI", uploadDraftAI); - - set("rand.C.Foil", randCFoil); - - set("gui.laf", laf); - set("gui.laf.fonts", lafFonts); - - set("card.overlay", cardOverlay); - set("card.images.size", cardSize); - set("stack.offset", stackOffset); - set("stack.max.size", maxStackSize); - set("card.scale.larger.than.original", scaleLargerThanOriginal); - for (SavePreferencesListener listeners : saveListeners) - listeners.savePreferences(); - - set("bugz.user.name", BugzName); - set("bugz.user.pwd", BugzPwd); - - - set("phase.ai.upkeep", bAIUpkeep); - set("phase.ai.draw", bAIDraw); - set("phase.ai.eot", bAIEOT); - set("phase.ai.beginCombat", bAIBeginCombat); - set("phase.ai.endCombat", bAIEndCombat); - set("phase.human.upkeep", bHumanUpkeep); - set("phase.human.draw", bHumanDraw); - set("phase.human.eot", bHumanEOT); - set("phase.human.beginCombat", bHumanBeginCombat); - set("phase.human.endCombat", bHumanEndCombat); - - try { - FileOutputStream stream = new FileOutputStream(fileName); - store(stream, "Forge"); - stream.close(); - } catch (IOException ex) { - throw new Exception("Error saving \"" + fileName + "\".", ex); - } - } - - /** - *

addSaveListener.

- * - * @param listener a {@link forge.properties.SavePreferencesListener} object. - */ - public void addSaveListener(SavePreferencesListener listener) { - saveListeners.add(listener); - } - - static public enum CardSizeType { - tiny, smaller, small, medium, large, huge - } - - static public enum StackOffsetType { - tiny, small, medium, large - } -} diff --git a/src/forge/properties/ForgeProps.java b/src/forge/properties/ForgeProps.java deleted file mode 100644 index 870f4c37e84..00000000000 --- a/src/forge/properties/ForgeProps.java +++ /dev/null @@ -1,149 +0,0 @@ -package forge.properties; -/** - * ForgeProps.java - * - * Created on 30.08.2009 - */ - - -import forge.error.ErrorViewer; -import treeProperties.TreeProperties; - -import java.io.File; -import java.io.IOException; -import java.util.Locale; - -import static java.lang.String.format; - - -/** - * The class ForgeProps. Wrapper around TreeProperties to support the uses in forge. - * - * @author Forge - * @version $Id: $ - */ -public class ForgeProps { - /** Constant properties */ - private static final TreeProperties properties; - - static { - TreeProperties p; - try { - p = new TreeProperties("forge.properties"); - p.rethrow(); - } catch (IOException ex) { - ErrorViewer.showError(ex); - p = null; - } - properties = p; - } - - /** - * Returns the tree properties of forge - * - * @return a {@link treeProperties.TreeProperties} object. - */ - public static TreeProperties getProperties() { - return properties; - } - - /** - * Returns the string property value, or null if there's no such property - * - * @param key a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public static String getProperty(String key) { - return getProperty(key, null); - } - - /** - * Returns the string property value, or def if there's no such property - * - * @param key a {@link java.lang.String} object. - * @param def a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public static String getProperty(String key, String def) { - String result; - try { - result = getProperties().getProperty(key); - if (result == null) result = def; - } catch (Exception ex) { - result = def; - } - return result; - } - - /** - * Returns the File property value, or null if there's no such property - * - * @param key a {@link java.lang.String} object. - * @return a {@link java.io.File} object. - */ - public static File getFile(String key) { - return getFile(key, null); - } - - /** - * Returns the File property value, or def if there's no such property - * - * @param key a {@link java.lang.String} object. - * @param def a {@link java.io.File} object. - * @return a {@link java.io.File} object. - */ - public static File getFile(String key, File def) { - File result; - try { - result = getProperties().getFile(key); - if (result == null) result = def; - } catch (Exception ex) { - result = def; - } - return result; - } - - /** - * Returns the localized version of the specified property. The key is a format string containing "%s", which - * is replaced with a language code (ISO 639-1, see {@link Locale#getLanguage()}). First, the configured - * language is used. Second, the locale's code is used. If none of them contains the requested key, "en" is - * used as the language code. - * - * @param key a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public static String getLocalized(String key) { - return getLocalized(key, null); - } - - /** - * Returns the localized version of the specified property. The key is a format string containing "%s", which - * is replaced with a language code (ISO 639-1, see {@link Locale#getLanguage()}). First, the configured - * language is used. Second, the locale's code is used. If none of them contains the requested key, "en" is - * used as the language code. If even that has no value, the def parameter is returned. - * - * @param key a {@link java.lang.String} object. - * @param def a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public static String getLocalized(String key, String def) { - //the list of languages to look for, in the order to be used - //the first is the configured language - //the second is the default locale's language code - String[] languages = {getProperty(NewConstants.LANG.LANGUAGE), Locale.getDefault().getLanguage(), "en"}; - try { - for (String lang : languages) { - //could be if a property does not exist - //just skip it, and try the next - if (lang == null) continue; - String result = getProperty(format(key, lang)); - if (result != null) return result; - } - //exceptions are skipped here; also the error viewer uses this, and reporting exceptions may result - //in a more fatal error (stack overflow) - } catch (Exception ex) { - } - //if no property was found, or an error occurred, return the default value - return def; - } -} diff --git a/src/forge/properties/NewConstants.java b/src/forge/properties/NewConstants.java deleted file mode 100644 index 6ef26025ba5..00000000000 --- a/src/forge/properties/NewConstants.java +++ /dev/null @@ -1,510 +0,0 @@ -package forge.properties; - - -/** - * NewConstants.java - * - * Created on 22.08.2009 - */ - -/** - * These are mostly property keys. - * - * @author Clemens Koza - * @version V0.0 22.08.2009 - */ -public interface NewConstants { - //General properties - /** Constant HOW_TO_REPORT_BUGS_URL = "program/howToReportBugsURL". */ - String HOW_TO_REPORT_BUGS_URL = "program/howToReportBugsURL"; - /** Constant VERSION="program/version". */ - String VERSION = "program/version"; - - /** Constant SHOW2CDECK="showdeck/2color". */ - String SHOW2CDECK = "showdeck/2color"; - - /** Constant DECKS="decks". */ - String DECKS = "decks"; - /** Constant BOOSTER_DECKS="booster-decks". */ - String BOOSTER_DECKS = "booster-decks"; - /** Constant NEW_DECKS="decks-dir". */ - String NEW_DECKS = "decks-dir"; - - /** Constant TOKENS="tokens". */ - String TOKENS = "tokens"; - /** Constant CARD_PICTURES="card-pictures". */ - String CARD_PICTURES = "card-pictures"; - /** Constant CARD_PICTURES_TOKEN_LQ="card-pictures_token_lq". */ - String CARD_PICTURES_TOKEN_LQ = "card-pictures_token_lq"; - /** Constant CARD_PICTURES_A="card-pictures_a". */ - String CARD_PICTURES_A = "card-pictures_a"; - /** Constant CARD_PICTURES_B="card-pictures_b". */ - String CARD_PICTURES_B = "card-pictures_b"; - /** Constant CARD_PICTURES_C="card-pictures_c". */ - String CARD_PICTURES_C = "card-pictures_c"; - /** Constant CARD_PICTURES_D="card-pictures_d". */ - String CARD_PICTURES_D = "card-pictures_d"; - /** Constant CARD_PICTURES_E="card-pictures_e". */ - String CARD_PICTURES_E = "card-pictures_e"; - /** Constant CARD_PICTURES_F="card-pictures_f". */ - String CARD_PICTURES_F = "card-pictures_f"; - /** Constant CARD_PICTURES_G="card-pictures_g". */ - String CARD_PICTURES_G = "card-pictures_g"; - /** Constant CARD_PICTURES_H="card-pictures_h". */ - String CARD_PICTURES_H = "card-pictures_h"; - /** Constant CARD_PICTURES_I="card-pictures_i". */ - String CARD_PICTURES_I = "card-pictures_i"; - /** Constant CARD_PICTURES_J="card-pictures_j". */ - String CARD_PICTURES_J = "card-pictures_j"; - /** Constant CARD_PICTURES_K="card-pictures_k". */ - String CARD_PICTURES_K = "card-pictures_k"; - /** Constant CARD_PICTURES_L="card-pictures_l". */ - String CARD_PICTURES_L = "card-pictures_l"; - /** Constant CARD_PICTURES_M="card-pictures_m". */ - String CARD_PICTURES_M = "card-pictures_m"; - /** Constant CARD_PICTURES_N="card-pictures_n". */ - String CARD_PICTURES_N = "card-pictures_n"; - /** Constant CARD_PICTURES_O="card-pictures_o". */ - String CARD_PICTURES_O = "card-pictures_o"; - /** Constant CARD_PICTURES_P="card-pictures_p". */ - String CARD_PICTURES_P = "card-pictures_p"; - /** Constant CARD_PICTURES_Q="card-pictures_q". */ - String CARD_PICTURES_Q = "card-pictures_q"; - /** Constant CARD_PICTURES_R="card-pictures_r". */ - String CARD_PICTURES_R = "card-pictures_r"; - /** Constant CARD_PICTURES_S="card-pictures_s". */ - String CARD_PICTURES_S = "card-pictures_s"; - /** Constant CARD_PICTURES_T="card-pictures_t". */ - String CARD_PICTURES_T = "card-pictures_t"; - /** Constant CARD_PICTURES_U="card-pictures_u". */ - String CARD_PICTURES_U = "card-pictures_u"; - /** Constant CARD_PICTURES_V="card-pictures_v". */ - String CARD_PICTURES_V = "card-pictures_v"; - /** Constant CARD_PICTURES_W="card-pictures_w". */ - String CARD_PICTURES_W = "card-pictures_w"; - /** Constant CARD_PICTURES_X="card-pictures_x". */ - String CARD_PICTURES_X = "card-pictures_x"; - /** Constant CARD_PICTURES_Y="card-pictures_y". */ - String CARD_PICTURES_Y = "card-pictures_y"; - /** Constant CARD_PICTURES_Z="card-pictures_z". */ - String CARD_PICTURES_Z = "card-pictures_z"; - /** Constant CARD_PICTURES_OTHER="card-pictures_other". */ - String CARD_PICTURES_OTHER = "card-pictures_other"; - /** Constant CARD_PICTURES_TOKEN_HQ="card-pictures_token_hq". */ - String CARD_PICTURES_TOKEN_HQ = "card-pictures_token_hq"; - /** Constant CARDS="cards". */ - String CARDS = "cards"; - /** Constant CARDSFOLDER="cardsfolder". */ - String CARDSFOLDER = "cardsfolder"; - /** Constant REMOVED="removed-cards". */ - String REMOVED = "removed-cards"; - /** Constant NAME_MUTATOR="name-mutator". */ - String NAME_MUTATOR = "name-mutator"; - /** Constant BOOSTERDATA="boosterdata". */ - String BOOSTERDATA = "boosterdata"; - - /** Constant IMAGE_BASE="image/base". */ - String IMAGE_BASE = "image/base"; - /** Constant IMAGE_TOKEN="image/token". */ - String IMAGE_TOKEN = "image/token"; - /** Constant IMAGE_ICON="image/icon". */ - String IMAGE_ICON = "image/icon"; - /** Constant SOUND_BASE="sound/base". */ - String SOUND_BASE = "sound/base"; - - /** - * These properties are for a regular game. - */ - public static interface REGULAR { - /** Property path for a common card. */ - String COMMON = "regular/common"; - /** Property path for an uncommon card. */ - String UNCOMMON = "regular/uncommon"; - /** Property path for a rare card. */ - String RARE = "regular/rare"; - } - - /** - * These properties are for a booster draft. - */ - public static interface DRAFT { - /** Property path for a common card. */ - String COMMON = "draft/common"; - /** Property path for an uncommon card. */ - String UNCOMMON = "draft/uncommon"; - /** Property path for a rare card. */ - String RARE = "draft/rare"; - } - - /** - * These properties are for a quest game. - */ - public static interface QUEST { - /** Property path for a common card. */ - String COMMON = "quest/common"; - /** Property path for an uncommon card. */ - String UNCOMMON = "quest/uncommon"; - /** Property path for a rare card. */ - String RARE = "quest/rare"; - - /** Property path for price. */ - String PRICE = "quest/price"; - /** Property path for quests. */ - String QUESTS = "quest/quests"; - - /** Property path for easy quest difficulty. */ - String EASY = "quest/easy"; - /** Property path for medium quest difficulty. */ - String MEDIUM = "quest/medium"; - /** Property path for hard quest difficulty. */ - String HARD = "quest/hard"; - /** Property path for very hard quest difficulty. */ - String VERYHARD = "quest/veryhard"; - - String DATA = "quest/data"; - String PREFS = "quest/prefs"; - - String DECKS = "quest/decks-dir"; - String XMLDATA = "quest/data-xml"; - } - - /** - * These are GUI-related properties. - */ - public static interface GUI { - public static interface GuiDisplay { - String LAYOUT = "gui/Display"; - String LAYOUT_NEW = "gui/Display/new"; - } - - public static interface GuiDeckEditor { - String LAYOUT = "gui/DeckEditor"; - - } - } - - /** - * These are localization properties. - */ - public static interface LANG { - String PROGRAM_NAME = "%s/program/name"; - String LANGUAGE = "lang"; - - public static interface HowTo { - String TITLE = "%s/HowTo/title"; - String MESSAGE = "%s/HowTo/message"; - } - - public static interface ErrorViewer { - String SHOW_ERROR = "%s/ErrorViewer/show"; - - String TITLE = "%s/ErrorViewer/title"; - String MESSAGE = "%s/ErrorViewer/message"; - String BUTTON_SAVE = "%s/ErrorViewer/button/save"; - String BUTTON_CLOSE = "%s/ErrorViewer/button/close"; - String BUTTON_EXIT = "%s/ErrorViewer/button/exit"; - - public static interface ERRORS { - String SAVE_MESSAGE = "%s/ErrorViewer/errors/save/message"; - String SHOW_MESSAGE = "%s/ErrorViewer/errors/show/message"; - } - } - - public static interface Gui_BoosterDraft { - String CLOSE_MESSAGE = "%s/BoosterDraft/close/message"; - String SAVE_MESSAGE = "%s/BoosterDraft/save/message"; - String SAVE_TITLE = "%s/BoosterDraft/save/title"; - String RENAME_MESSAGE = "%s/BoosterDraft/rename/message"; - String RENAME_TITLE = "%s/BoosterDraft/rename/title"; - String SAVE_DRAFT_MESSAGE = "%s/BoosterDraft/saveDraft/message"; - String SAVE_DRAFT_TITLE = "%s/BoosterDraft/saveDraft/title"; - } - - public static interface GuiDisplay { - public static interface MENU_BAR { - public static interface MENU { - String TITLE = "%s/Display/menu/title"; - } - - public static interface PHASE { - String TITLE = "%s/Display/phase/title"; - } - - public static interface DEV { - String TITLE = "%s/Display/dev/title"; - } - } - - String HUMAN_TITLE = "%s/Display/human/title"; - - public static interface HUMAN_HAND { - String TITLE = "%s/Display/human/hand/title"; - } - - public static interface HUMAN_LIBRARY { - String BASE = "%s/Display/human/library"; - String TITLE = "%s/Display/human/library/title"; - String MENU = "%s/Display/human/library/menu"; - String BUTTON = "%s/Display/human/library/button"; - } - - String HUMAN_GRAVEYARD = "%s/Display/human/graveyard"; - - public static interface HUMAN_GRAVEYARD { - String TITLE = "%s/Display/human/graveyard/title"; - String BUTTON = "%s/Display/human/graveyard/button"; - String MENU = "%s/Display/human/graveyard/menu"; - } - - String HUMAN_REMOVED = "%s/Display/human/removed"; - - public static interface HUMAN_REMOVED { - String TITLE = "%s/Display/human/removed/title"; - String BUTTON = "%s/Display/human/removed/button"; - String MENU = "%s/Display/human/removed/menu"; - } - - String COMBAT = "%s/Display/combat/title"; - - String HUMAN_FLASHBACK = "%s/Display/human/flashback"; - - public static interface HUMAN_FLASHBACK { - String TITLE = "%s/Display/human/flashback/title"; - String BUTTON = "%s/Display/human/flashback/button"; - String MENU = "%s/Display/human/flashback/menu"; - } - - String COMPUTER_TITLE = "%s/Display/computer/title"; - - - public static interface COMPUTER_HAND { - String BASE = "%s/Display/computer/hand"; - String TITLE = "%s/Display/computer/hand/title"; - String BUTTON = "%s/Display/computer/hand/button"; - String MENU = "%s/Display/computer/hand/menu"; - } - - - public static interface COMPUTER_LIBRARY { - String BASE = "%s/Display/computer/library"; - String TITLE = "%s/Display/computer/library/title"; - String BUTTON = "%s/Display/computer/library/button"; - String MENU = "%s/Display/computer/library/menu"; - } - - - String COMPUTER_GRAVEYARD = "%s/Display/computer/graveyard"; - - public static interface COMPUTER_GRAVEYARD { - String TITLE = "%s/Display/computer/graveyard/title"; - String BUTTON = "%s/Display/computer/graveyard/button"; - String MENU = "%s/Display/computer/graveyard/menu"; - } - - - String COMPUTER_REMOVED = "%s/Display/computer/removed"; - - public static interface COMPUTER_REMOVED { - String TITLE = "%s/Display/computer/removed/title"; - String BUTTON = "%s/Display/computer/removed/button"; - String MENU = "%s/Display/computer/removed/menu"; - } - - String CONCEDE = "%s/Display/concede"; - - public static interface CONCEDE { - String BUTTON = "%s/Display/concede/button"; - String MENU = "%s/Display/concede/menu"; - } - - String MANAGEN = "%s/Display/managen"; - - public static interface MANAGEN { - String BUTTON = "%s/Display/managen/button"; - String MENU = "%s/Display/managen/menu"; - } - - String SETUPBATTLEFIELD = "%s/Display/setupbattlefield"; - - public static interface SETUPBATTLEFIELD { - String BUTTON = "%s/Display/setupbattlefield/button"; - String MENU = "%s/Display/setupbattlefield/menu"; - } - - String TUTOR = "%s/Display/tutor"; - - public static interface TUTOR { - String BUTTON = "%s/Display/tutor/button"; - String MENU = "%s/Display/tutor/menu"; - } - - String ADDCOUNTER = "%s/Display/addcounter"; - - public static interface ADDCOUNTER { - String BUTTON = "%s/Display/addcounter/button"; - String MENU = "%s/Display/addcounter/menu"; - } - - String TAPPERM = "%s/Display/tapperm"; - - public static interface TAPPERM { - String BUTTON = "%s/Display/tapperm/button"; - String MENU = "%s/Display/tapperm/menu"; - } - - String UNTAPPERM = "%s/Display/untapperm"; - - public static interface UNTAPPERM { - String BUTTON = "%s/Display/untapperm/button"; - String MENU = "%s/Display/untapperm/menu"; - } - - String NOLANDLIMIT = "%s/Display/nolandlimit"; - - public static interface NOLANDLIMIT { - String BUTTON = "%s/Display/nolandlimit/button"; - String MENU = "%s/Display/nolandlimit/menu"; - } - } - - public static interface Gui_DownloadPictures { - String TITLE = "%s/DownloadPictures/title"; - - String PROXY_ADDRESS = "%s/DownloadPictures/proxy/address"; - String PROXY_PORT = "%s/DownloadPictures/proxy/port"; - - String NO_PROXY = "%s/DownloadPictures/proxy/type/none"; - String HTTP_PROXY = "%s/DownloadPictures/proxy/type/http"; - String SOCKS_PROXY = "%s/DownloadPictures/proxy/type/socks"; - - String NO_MORE = "%s/DownloadPictures/no-more"; - - String BAR_BEFORE_START = "%s/DownloadPictures/bar/before-start"; - String BAR_WAIT = "%s/DownloadPictures/bar/wait"; - String BAR_CLOSE = "%s/DownloadPictures/bar/close"; - - public static interface BUTTONS { - String START = "%s/DownloadPictures/button/start"; - String CANCEL = "%s/DownloadPictures/button/cancel"; - String CLOSE = "%s/DownloadPictures/button/close"; - } - - public static interface ERRORS { - String PROXY_CONNECT = "%s/DownloadPictures/errors/proxy/connect"; - String OTHER = "%s/DownloadPictures/errors/other"; - } - } - - - public static interface Gui_NewGame { - public static interface NEW_GAME_TEXT { - String GAMETYPE = "%s/NewGame/gametype"; - String LIBRARY = "%s/NewGame/library"; - String SETTINGS = "%s/NewGame/settings"; - String NEW_GAME = "%s/NewGame/new_game"; - String CONSTRUCTED_TEXT = "%s/NewGame/constructed_text"; - String SEALED_TEXT = "%s/NewGame/sealed_text"; - String BOOSTER_TEXT = "%s/NewGame/booster_text"; - String YOURDECK = "%s/NewGame/yourdeck"; - String OPPONENT = "%s/NewGame/opponent"; - String DECK_EDITOR = "%s/NewGame/deckeditor"; - String NEW_GUI = "%s/NewGame/newgui"; - String AI_LAND = "%s/NewGame/ailand"; - String DEV_MODE = "%s/NewGame/devmode"; - String QUEST_MODE = "%s/NewGame/questmode"; - String START_GAME = "%s/NewGame/startgame"; - String SAVE_SEALED_MSG = "%s/NewGame/savesealed_msg"; - String SAVE_SEALED_TTL = "%s/NewGame/savesealed_ttl"; - - } - - public static interface MENU_BAR { - public static interface MENU { - String TITLE = "%s/NewGame/menu/title"; - String LF = "%s/NewGame/menu/lookAndFeel"; - String DOWNLOADPRICE = "%s/NewGame/menu/downloadPrice"; - String DOWNLOAD = "%s/NewGame/menu/download"; - String DOWNLOADLQ = "%s/NewGame/menu/downloadlq"; - String DOWNLOADSETLQ = "%s/NewGame/menu/downloadsetlq"; - String IMPORTPICTURE = "%s/NewGame/menu/importPicture"; - String CARD_SIZES = "%s/NewGame/menu/cardSizes"; - String CARD_STACK = "%s/NewGame/menu/cardStack"; - String CARD_STACK_OFFSET = "%s/NewGame/menu/cardStackOffset"; - String ABOUT = "%s/NewGame/menu/about"; - } - - public static interface OPTIONS { - String TITLE = "%s/NewGame/options/title"; - String FONT = "%s/NewGame/options/font"; - String CARD_OVERLAY = "%s/NewGame/options/cardOverlay"; - String CARD_SCALE = "%s/NewGame/options/cardScale"; - - public static interface GENERATE { - String TITLE = "%s/NewGame/options/generate/title"; - String REMOVE_SMALL = "%s/NewGame/options/generate/removeSmall"; - String REMOVE_ARTIFACTS = "%s/NewGame/options/generate/removeArtifacts"; - } - } - - public static interface HELP { - String TITLE = "%s/NewGame/help/title"; - } - - - } - - public static interface ERRORS { - } - } - - public static interface Gui_WinLose { - public static interface WINLOSE_TEXT { - String WON = "%s/WinLose/won"; - String LOST = "%s/WinLose/lost"; - String WIN = "%s/WinLose/win"; - String LOSE = "%s/WinLose/lose"; - String CONTINUE = "%s/WinLose/continue"; - String RESTART = "%s/WinLose/restart"; - String QUIT = "%s/WinLose/quit"; - } - } - - public static interface Gui_DownloadPrices { - public static interface DOWNLOADPRICES { - String TITLE = "%s/DownloadPrices/title"; - String START_UPDATE = "%s/DownloadPrices/startupdate"; - String DOWNLOADING = "%s/DownloadPrices/downloading"; - String COMPILING = "%s/DownloadPrices/compiling"; - } - } - - public static interface GameAction { - public static interface GAMEACTION_TEXT { - String HEADS = "%s/GameAction/heads"; - String TAILS = "%s/GameAction/tails"; - String HEADS_OR_TAILS = "%s/GameAction/heads_or_tails"; - String COIN_TOSS = "%s/GameAction/coin_toss"; - String HUMAN_WIN = "%s/GameAction/human_win"; - String COMPUTER_WIN = "%s/GameAction/computer_win"; - String COMPUTER_STARTS = "%s/GameAction/computer_starts"; - String HUMAN_STARTS = "%s/GameAction/human_starts"; - String HUMAN_MANA_COST = "%s/GameAction/human_mana_cost"; - String COMPUTER_MANA_COST = "%s/GameAction/computer_mana_cost"; - String COMPUTER_CUT = "%s/GameAction/computer_cut"; - String HUMAN_CUT = "%s/GameAction/human_cut"; - String CUT_NUMBER = "%s/GameAction/cut_number"; - String RESOLVE_STARTER = "%s/GameAction/resolve_starter"; - String EQUAL_CONVERTED_MANA = "%s/GameAction/equal_converted_mana"; - String CUTTING_AGAIN = "%s/GameAction/cutting_again"; - String YES = "%s/GameAction/yes"; - String NO = "%s/GameAction/no"; - String WANT_DREDGE = "%s/GameAction/want_dredge"; - String SELECT_DREDGE = "%s/GameAction/select_dredge"; - String CHOOSE_2ND_LAND = "%s/GameAction/choose_2nd_land"; - - - } - } - } -} - diff --git a/src/forge/properties/Preferences.java b/src/forge/properties/Preferences.java deleted file mode 100644 index 1d9db49f956..00000000000 --- a/src/forge/properties/Preferences.java +++ /dev/null @@ -1,135 +0,0 @@ -package forge.properties; - - -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.*; - - -/** - * A collection of name/value pairs with sorted keys and utility methods. - * - * @author Forge - * @version $Id$ - */ -public class Preferences { - protected Properties props; - - /** - *

Constructor for Preferences.

- */ - public Preferences() { - props = new Properties(); - } - - /** - *

Constructor for Preferences.

- * - * @param prefs a {@link forge.properties.Preferences} object. - */ - public Preferences(Preferences prefs) { - props = prefs.props; - } - - /** - *

keys.

- * - * @return a {@link java.util.Enumeration} object. - */ - public synchronized Enumeration keys() { - @SuppressWarnings({"unchecked", "rawtypes"}) - Set keysEnum = (Set) props.keySet(); - Vector keyList = new Vector(); - keyList.addAll(keysEnum); - Collections.sort(keyList); - return keyList.elements(); - } - - /** - *

getInt.

- * - * @param name a {@link java.lang.String} object. - * @param defaultValue a int. - * @return a int. - */ - public int getInt(String name, int defaultValue) { - String value = props.getProperty(name); - if (value == null) return defaultValue; - try { - return Integer.parseInt(value); - } catch (NumberFormatException ex) { - return defaultValue; - } - } - - /** - *

getBoolean.

- * - * @param name a {@link java.lang.String} object. - * @param defaultValue a boolean. - * @return a boolean. - */ - public boolean getBoolean(String name, boolean defaultValue) { - String value = props.getProperty(name); - if (value == null) return defaultValue; - return Boolean.parseBoolean(value); - } - - /** - *

getLong.

- * - * @param name a {@link java.lang.String} object. - * @param defaultValue a long. - * @return a long. - */ - public long getLong(String name, long defaultValue) { - String value = props.getProperty(name); - if (value == null) return defaultValue; - return Long.parseLong(value); - } - - /** - *

set.

- * - * @param key a {@link java.lang.String} object. - * @param value a {@link java.lang.Object} object. - */ - public void set(String key, Object value) { - props.setProperty(key, String.valueOf(value)); - } - - /** - *

get.

- * - * @param key a {@link java.lang.String} object. - * @param value a {@link java.lang.Object} object. - * @return a {@link java.lang.String} object. - */ - public String get(String key, Object value) { - String string = null; - if (value != null) string = String.valueOf(value); - return props.getProperty(key, string); - } - - /** - *

load.

- * - * @param stream a {@link java.io.FileInputStream} object. - * @throws java.io.IOException if any. - */ - public void load(FileInputStream stream) throws IOException { - props.load(stream); - } - - /** - *

store.

- * - * @param stream a {@link java.io.FileOutputStream} object. - * @param comments a {@link java.lang.String} object. - * @throws java.io.IOException if any. - */ - public void store(FileOutputStream stream, String comments) throws IOException { - props.store(stream, comments); - } -} diff --git a/src/forge/properties/SavePreferencesListener.java b/src/forge/properties/SavePreferencesListener.java deleted file mode 100644 index f211fe65b8c..00000000000 --- a/src/forge/properties/SavePreferencesListener.java +++ /dev/null @@ -1,14 +0,0 @@ -package forge.properties; - -/** - *

SavePreferencesListener interface.

- * - * @author Forge - * @version $Id$ - */ -public interface SavePreferencesListener { - /** - *

savePreferences.

- */ - public void savePreferences(); -} diff --git a/src/forge/quest/data/QuestBattleManager.java b/src/forge/quest/data/QuestBattleManager.java deleted file mode 100644 index 8da9a3f9ae4..00000000000 --- a/src/forge/quest/data/QuestBattleManager.java +++ /dev/null @@ -1,196 +0,0 @@ -package forge.quest.data; - -import forge.AllZone; -import forge.FileUtil; -import forge.deck.Deck; -import forge.deck.DeckManager; -import forge.error.ErrorViewer; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - -import java.io.File; -import java.util.*; - -/** - *

QuestBattleManager class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestBattleManager { - /** Constant aiDecks */ - private static transient Map aiDecks = new HashMap(); - /** Constant easyAIDecks */ - private static transient List easyAIDecks; - /** Constant mediumAIDecks */ - private static transient List mediumAIDecks; - /** Constant hardAIDecks */ - private static transient List hardAIDecks; - /** Constant veryHardAIDecks */ - private static transient List veryHardAIDecks; - - static { - List aiDeckNames = getAIDeckNames(); - easyAIDecks = readFile(ForgeProps.getFile(NewConstants.QUEST.EASY), aiDeckNames); - mediumAIDecks = readFile(ForgeProps.getFile(NewConstants.QUEST.MEDIUM), aiDeckNames); - hardAIDecks = readFile(ForgeProps.getFile(NewConstants.QUEST.HARD), aiDeckNames); - veryHardAIDecks = readFile(ForgeProps.getFile(NewConstants.QUEST.VERYHARD), aiDeckNames); - } - - - /** - *

removeAIDeck.

- * - * @param deckName a {@link java.lang.String} object. - */ - public static void removeAIDeck(String deckName) { - aiDecks.remove(deckName); - } - - /** - *

addAIDeck.

- * - * @param d a {@link forge.deck.Deck} object. - */ - public static void addAIDeck(Deck d) { - aiDecks.put(d.getName(), d); - } - - /** - *

getAIDeck.

- * - * @param deckName a {@link java.lang.String} object. - * @return a {@link forge.deck.Deck} object. - */ - public static Deck getAIDeck(String deckName) { - if (!aiDecks.containsKey(deckName)) { - ErrorViewer.showError(new Exception(), - "QuestData : getDeckFromMap(String deckName) error, deck name not found - %s", deckName); - } - - return aiDecks.get(deckName); - } - - /** - *

getAIDeckNewFormat.

- * - * @param deckName a {@link java.lang.String} object. - * @return a {@link forge.deck.Deck} object. - */ - public static Deck getAIDeckNewFormat(String deckName) { - return (new DeckManager(ForgeProps.getFile(NewConstants.QUEST.DECKS))).getDeck(deckName); - } - - /** - *

getAIDeckNames.

- * - * @return a {@link java.util.List} object. - */ - public static List getAIDeckNames() { - return new ArrayList(aiDecks.keySet()); - } - - /** - *

getOpponent.

- * - * @param aiDeck a {@link java.util.List} object. - * @param number a int. - * @return a {@link java.lang.String} object. - */ - public static String getOpponent(List aiDeck, int number) { - //This is to make sure that the opponents do not change when the deck editor is launched. - List deckListCopy = new ArrayList(aiDeck); - Collections.shuffle(deckListCopy, new Random(AllZone.getQuestData().getRandomSeed())); - - return deckListCopy.get(number); - - } - - - /** - *

getOpponents.

- * - * @return an array of {@link java.lang.String} objects. - */ - public static String[] getOpponents() { - int index = AllZone.getQuestData().getDifficultyIndex(); - - if (AllZone.getQuestData().getWin() < QuestPreferences.getWinsForMediumAI(index)) { - return new String[]{ - getOpponent(easyAIDecks, 0), - getOpponent(easyAIDecks, 1), - getOpponent(easyAIDecks, 2)}; - } - - if (AllZone.getQuestData().getWin() == QuestPreferences.getWinsForMediumAI(index)) { - return new String[]{ - getOpponent(easyAIDecks, 0), - getOpponent(mediumAIDecks, 0), - getOpponent(mediumAIDecks, 1)}; - } - - if (AllZone.getQuestData().getWin() < QuestPreferences.getWinsForHardAI(index)) { - return new String[]{ - getOpponent(mediumAIDecks, 0), - getOpponent(mediumAIDecks, 1), - getOpponent(mediumAIDecks, 2)}; - } - - if (AllZone.getQuestData().getWin() == QuestPreferences.getWinsForHardAI(index)) { - return new String[]{ - getOpponent(mediumAIDecks, 0), - getOpponent(hardAIDecks, 0), - getOpponent(hardAIDecks, 1)}; - } - - if (AllZone.getQuestData().getWin() >= QuestPreferences.getWinsForVeryHardAI(index)) { - return new String[]{ - getOpponent(hardAIDecks, 0), - getOpponent(hardAIDecks, 1), - getOpponent(veryHardAIDecks, 0)}; - } - - return new String[]{ - getOpponent(hardAIDecks, 0), - getOpponent(hardAIDecks, 1), - getOpponent(hardAIDecks, 2)}; - } - - /** - *

readFile.

- * - * @param file a {@link java.io.File} object. - * @param aiDecks a {@link java.util.List} object. - * @return a {@link java.util.List} object. - */ - private static List readFile(File file, List aiDecks) { - ArrayList list = FileUtil.readFile(file); - - //remove any blank lines - ArrayList noBlankLines = new ArrayList(); - String s; - for (String aList : list) { - s = aList.trim(); - if (!s.equals("")) { - noBlankLines.add(s); - } - } - list = noBlankLines; - - if (list.size() < 3) { - ErrorViewer.showError(new Exception(), - "QuestData : readFile() error, file %s is too short, it must contain at least 3 ai deck names", - file); - } - - - for (String aList : list) { - if (!aiDecks.contains(aList)) { - aiDecks.add(aList); - } - } - - return list; - } - -} diff --git a/src/forge/quest/data/QuestBoosterPack.java b/src/forge/quest/data/QuestBoosterPack.java deleted file mode 100644 index 5c1bca01aed..00000000000 --- a/src/forge/quest/data/QuestBoosterPack.java +++ /dev/null @@ -1,216 +0,0 @@ -package forge.quest.data; - -import forge.Card; -import forge.CardFilter; -import forge.Constant; -import forge.properties.NewConstants; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.NoSuchElementException; - -import net.slightlymagic.braids.util.generator.GeneratorFunctions; - -import com.google.code.jyield.Generator; - -// The BoosterPack generates cards for the Card Pool in Quest Mode -/** - *

QuestBoosterPack class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestBoosterPack implements NewConstants { - ArrayList choices; - - /** - *

Constructor for QuestBoosterPack.

- */ - public QuestBoosterPack() { - choices = new ArrayList(); - choices.add("Multicolor"); - - for (String s : Constant.Color.Colors) { - choices.add(s); - choices.add(s); - } - } - - /** - *

- * getQuestStarterDeck. - *

- * - * @param allCards - * the card pool from which we can generate the deck - * - * @param numCommon - * a int. - * - * @param numUncommon - * a int. - * - * @param numRare - * a int. - * - * @param standardPool - * whether to restrict the card pool to what is currently - * considered the Standard block. To update the sets that are - * considered standard, modify this method. - * - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList getQuestStarterDeck(Generator allCards, int numCommon, int numUncommon, int numRare, boolean standardPool) { - ArrayList names = new ArrayList(); - - // Each color should have around the same amount of monocolored cards - // There should be 3 Colorless cards for every 4 cards in a single color - // There should be 1 Multicolor card for every 4 cards in a single color - - ArrayList started = new ArrayList(); - started.add("Multicolor"); - for (int i = 0; i < 4; i++) { - if (i != 2) - started.add(Constant.Color.Colorless); - - started.addAll(Arrays.asList(Constant.Color.onlyColors)); - } - - if (standardPool) { - // filter Cards for cards appearing in Standard Sets - ArrayList sets = new ArrayList(); - - //TODO: It would be handy if the list of any sets can be chosen - // ... Huh? - // TODO: Braids: "It would also be handy if comments were written - // in clear English." - - sets.add("NPH"); - sets.add("MBS"); - sets.add("SOM"); - sets.add("M11"); - sets.add("ROE"); - sets.add("WWK"); - sets.add("ZEN"); - - allCards = CardFilter.getSets(allCards, sets); - - /* - * Here we force the generator to evaluate (solidify) into a - * temporary ArrayList. This list only contains cards from 7 sets, - * so it doesn't have nearly as much heap impact as an array of all - * cards. Plus, we need to scan this array 3 times in the code - * below. Braids thinks it's better to have the temporary list than - * to force evaluation of the original generator three times, - * because the original generator examines every card in the - * database. - */ - allCards = GeneratorFunctions.solidify(allCards); - } - - // We don't bother solidifying here, because allCards could be - // equal to the set of ALL cards. - - names.addAll(generateCards(allCards, numCommon, Constant.Rarity.Common, null, started)); - names.addAll(generateCards(allCards, numUncommon, Constant.Rarity.Uncommon, null, started)); - names.addAll(generateCards(allCards, numRare, Constant.Rarity.Rare, null, started)); - - return names; - } - - /** - * Create the list of card names at random from the given pool. - * - * @param allCards the card pool to use - * @param num how many card names to add to the result - * @param rarity only allow cards of this rarity - * @param color may be null; if not null, only cards of this color may be added - * @param colorOrder we shuffle this as a side effect of calling this method - * @return a list of card names - */ - public ArrayList generateCards(Generator allCards, int num, String rarity, String color, ArrayList colorOrder) - { - // If color is null, use colorOrder progression to grab cards - ArrayList names = new ArrayList(); - - int size = colorOrder.size(); - Collections.shuffle(colorOrder); - - allCards = CardFilter.getRarity(allCards, rarity); - int count = 0, i = 0; - - if (num > 1) { - // Force evaluation (solidify) the generator because we've applied - // a filter to it, and we're about to use it more than once. - - allCards = GeneratorFunctions.solidify(allCards); - } - - while (count < num) { - String name; - - if (color == null) - name = getCardName(allCards, colorOrder.get(i % size)); - else - name = getCardName(allCards); - - if (name != null && !names.contains(name)) { - names.add(name); - count++; - } - i++; - } - - return names; - } - - /** - * Convenience for generateCards(cards, num, rarity, color, this.choices); - * - * @see #generateCards(Generator, int, String, String, ArrayList) - */ - public ArrayList generateCards(Generator cards, int num, String rarity, String color) { - return generateCards(cards, num, rarity, color, choices); - } - - /** - * Retrieve a card name at random from the given pool of cards; - * the card must have a specific color. - * - * This forces one evaluation of the allCards Generator. - * - * @param allCards the card pool to use - * @param color a {@link java.lang.String} object. - * @return a random card name with the given color from allCards - */ - public String getCardName(Generator allCards, String color) { - return getCardName(CardFilter.getColor(allCards, color)); - } - - /** - * Fetch a random card name from the given pool. - * - * This forces one evaluation of the cards Generator. - * - * @param cards the card pool from which to select - * @return a card name from cards - */ - public String getCardName(Generator cards) { - Card selected = null; - try { - selected = GeneratorFunctions.selectRandom(cards); - } - catch (NoSuchElementException ignored) { - ; - } - if (selected == null) { - // Previously, it was thought that this - // Only should happen if something is programmed wrong - // But empirical evidence contradicts this. - return null; - } - - return selected.getName(); - } -} diff --git a/src/forge/quest/data/QuestData.java b/src/forge/quest/data/QuestData.java deleted file mode 100644 index 55ec7dd528f..00000000000 --- a/src/forge/quest/data/QuestData.java +++ /dev/null @@ -1,892 +0,0 @@ -package forge.quest.data; - -import forge.*; -import forge.deck.Deck; -import forge.error.ErrorViewer; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; -import forge.quest.data.item.QuestInventory; -import forge.quest.data.pet.QuestPetManager; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import com.google.code.jyield.Generator; -import com.google.code.jyield.YieldUtils; - - -//when you create QuestDataOld and AFTER you copy the AI decks over -//you have to call one of these two methods below -//see Gui_QuestOptions for more details - -// -//static readAIQuestDeckFiles(QuestDataOld data, ArrayList aiDeckNames) -//OR non-static readAIQuestDeckFiles() -//which reads the files "questDecks-easy", "questDecks-medium","questDecks-hard", - -/** - *

QuestData class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestData { - - int rankIndex; - int win; - int lost; - - int life; - //private int maxLife; - - int questsPlayed; - - long credits; - int diffIndex; - String difficulty; - - String mode = ""; - - Map myDecks = new HashMap(); - - //holds String card names - List cardPool = new ArrayList(); - List newCardList = new ArrayList(); - - List shopList = new ArrayList(); - List availableQuests = new ArrayList(); - - List completedQuests = new ArrayList(); - - private transient QuestBoosterPack boosterPack; - - //used by shouldAddAdditionalCards() - private long randomSeed = 0; - - private transient String[] rankArray; - - /** Constant FANTASY="Fantasy" */ - public static final String FANTASY = "Fantasy"; - /** Constant REALISTIC="Realistic" */ - public static final String REALISTIC = "Realistic"; - - QuestInventory inventory = new QuestInventory(); - - //This field holds the version of the Quest Data - /** Constant CURRENT_VERSION_NUMBER=1 */ - public static final int CURRENT_VERSION_NUMBER = 1; - - //This field places the version number into QD instance, - //but only when the object is created through the constructor - //DO NOT RENAME THIS FIELD - int versionNumber = CURRENT_VERSION_NUMBER; - - QuestPetManager petManager = new QuestPetManager(); - - /** - *

Constructor for QuestData.

- */ - public QuestData() { - - for (int i = 0; i < QuestPreferences.getStartingBasic(); i++) { - cardPool.add("Forest"); - cardPool.add("Mountain"); - cardPool.add("Swamp"); - cardPool.add("Island"); - cardPool.add("Plains"); - } - - for (int i = 0; i < QuestPreferences.getStartingSnowBasic(); i++) { - cardPool.add("Snow-Covered Forest"); - cardPool.add("Snow-Covered Mountain"); - cardPool.add("Snow-Covered Swamp"); - cardPool.add("Snow-Covered Island"); - cardPool.add("Snow-Covered Plains"); - } - - initTransients(); - randomizeOpponents(); - } - - /** - *

initTransients.

- */ - private void initTransients() { - rankArray = new String[]{ - "Level 0 - Confused Wizard", - "Level 1 - Mana Mage", - "Level 2 - Death by Megrim", - "Level 3 - Shattered the Competition", - "Level 4 - Black Knighted", - "Level 5 - Shockingly Good", - "Level 6 - Regressed into Timmy", - "Level 7 - Loves Blue Control", - "Level 8 - Immobilized by Fear", - "Level 9 - Lands = Friends", - "Saltblasted for your talent", - "Serra Angel is your girlfriend",}; - - boosterPack = new QuestBoosterPack(); - } - - - //adds cards to card pool and sets difficulty - - /** - *

newGame.

- * - * @param difficulty a int. - * @param m a {@link java.lang.String} object. - * @param standardStart a boolean. - */ - public void newGame(int difficulty, String m, boolean standardStart) { - setDifficulty(difficulty); - - Generator allCards = YieldUtils.toGenerator(AllZone.getCardFactory()); - - ArrayList list = new ArrayList(); - - list.addAll(boosterPack.getQuestStarterDeck(allCards, QuestPreferences.getStartingCommons(difficulty), - QuestPreferences.getStartingUncommons(difficulty), QuestPreferences.getStartingRares(difficulty), standardStart)); - - //because cardPool already has basic land added to it - cardPool.addAll(list); - credits = QuestPreferences.getStartingCredits(); - - mode = m; - if (mode.equals(FANTASY)) { - life = 15; - } else { - life = 20; - } - } - - /** - * This method should be called whenever the opponents should change. - */ - public void randomizeOpponents() { - randomSeed = MyRandom.random.nextLong(); - } - - - /** - *

saveData.

- */ - public void saveData() { - QuestDataIO.saveData(this); - } - - - //returns Strings of the card names - - /** - *

getCardpool.

- * - * @return a {@link java.util.List} object. - */ - public List getCardpool() { - //make a copy so the internal ArrrayList cannot be changed externally - return new ArrayList(cardPool); - } - - /** - *

setCardpool.

- * - * @param pool a {@link java.util.ArrayList} object. - * @since 1.0.15 - */ - public void setCardpool(ArrayList pool) { - cardPool = pool; - } - - /** - *

Getter for the field shopList.

- * - * @return a {@link java.util.List} object. - */ - public List getShopList() { - if (shopList != null) { - return new ArrayList(shopList); - } else { - return null; - } - } - - /** - *

Setter for the field shopList.

- * - * @param list a {@link java.util.List} object. - */ - public void setShopList(List list) { - shopList = list; - } - - - /** - *

Getter for the field availableQuests.

- * - * @return a {@link java.util.List} object. - */ - public List getAvailableQuests() { - if (availableQuests != null) { - return new ArrayList(availableQuests); - } else { - return null; - } - } - - /** - *

Setter for the field availableQuests.

- * - * @param list a {@link java.util.List} object. - */ - public void setAvailableQuests(List list) { - availableQuests = list; - } - - /** - *

clearAvailableQuests.

- */ - public void clearAvailableQuests() { - availableQuests.clear(); - } - - /** - *

Getter for the field completedQuests.

- * - * @return a {@link java.util.List} object. - */ - public List getCompletedQuests() { - if (completedQuests != null) { - return new ArrayList(completedQuests); - } else { - return null; - } - } - - /** - *

Setter for the field completedQuests.

- * - * @param list a {@link java.util.List} object. - */ - public void setCompletedQuests(List list) { - completedQuests = list; - } - - - /** - *

clearShopList.

- */ - public void clearShopList() { - shopList.clear(); - } - - - /** - *

removeDeck.

- * - * @param deckName a {@link java.lang.String} object. - */ - public void removeDeck(String deckName) { - myDecks.remove(deckName); - } - - - /** - *

addDeck.

- * - * @param d a {@link forge.deck.Deck} object. - */ - public void addDeck(Deck d) { - myDecks.put(d.getName(), d); - } - - //this Deck object is a Constructed deck - //deck.getDeckType() is Constant.GameType.Sealed - //sealed since the card pool is the Deck sideboard - - /** - *

getDeck.

- * - * @param deckName a {@link java.lang.String} object. - * @return a {@link forge.deck.Deck} object. - */ - public Deck getDeck(String deckName) { - //have to always set the card pool aka the Deck sideboard - //because new cards may have been added to the card pool by addCards() - - if (!myDecks.containsKey(deckName)) { - ErrorViewer.showError(new Exception(), - "QuestData : getDeckFromMap(String deckName) error, deck name not found - %s", deckName); - } - - Deck d = myDecks.get(deckName); - - //below is probably not needed - - //remove old cards from card pool - for (int i = 0; i < d.countSideboard(); i++) { - d.removeSideboard(i); - } - - //add all cards to card pool - for (int i = 0; i < cardPool.size(); i++) { - d.addSideboard(cardPool.get(i)); - } - - return d; - } - - - //returns human player decks - //returns ArrayList of String deck names - - /** - *

getDeckNames.

- * - * @return a {@link java.util.List} object. - */ - public List getDeckNames() { - return new ArrayList(myDecks.keySet()); - } - - - //get new cards that were added to your card pool by addCards() - - /** - *

getAddedCards.

- * - * @return a {@link java.util.List} object. - */ - public List getAddedCards() { - return new ArrayList(newCardList); - } - - //adds 11 cards, to the current card pool - //(I chose 11 cards instead of 15 in order to make things more challenging) - - /** - *

addCards.

- */ - public void addCards() { - Generator cards = YieldUtils.toGenerator(AllZone.getCardFactory()); - int nCommon = QuestPreferences.getNumCommon(); - int nUncommon = QuestPreferences.getNumUncommon(); - int nRare = QuestPreferences.getNumRare(); - - ArrayList newCards = new ArrayList(); - newCards.addAll(boosterPack.generateCards(cards, nCommon, Constant.Rarity.Common, null)); - newCards.addAll(boosterPack.generateCards(cards, nUncommon, Constant.Rarity.Uncommon, null)); - newCards.addAll(boosterPack.generateCards(cards, nRare, Constant.Rarity.Rare, null)); - - cardPool.addAll(newCards); - - //getAddedCards() uses newCardList - newCardList = newCards; - - } - - /** - *

addRandomRare.

- * - * @param n a int. - * @return a {@link java.util.ArrayList} object. - */ - public ArrayList addRandomRare(int n) { - Generator allCards = YieldUtils.toGenerator(AllZone.getCardFactory()); - ArrayList newCards = new ArrayList(); - newCards.addAll(boosterPack.generateCards(allCards, n, Constant.Rarity.Rare, null)); - - cardPool.addAll(newCards); - newCardList.addAll(newCards); - - return newCards; - } - - /** - *

addRandomRare.

- * - * @return a {@link java.lang.String} object. - */ - public String addRandomRare() { - return addRandomRare(1).get(0); - } - - /** - *

addCard.

- * - * @param c a {@link forge.Card} object. - */ - public void addCard(Card c) { - cardPool.add(c.getName()); - } - - /** - *

addCard.

- * - * @param s a {@link java.lang.String} object. - */ - public void addCard(String s) { - cardPool.add(s); - } - - /** - *

removeCard.

- * - * @param c a {@link forge.Card} object. - */ - public void removeCard(Card c) { - - String s = c.getName(); - if (!cardPool.contains(s)) { - return; - } - - for (int i = 0; i < cardPool.size(); i++) { - String str = cardPool.get(i); - if (str.equals(s)) { - cardPool.remove(i); - break; - } - } - } - - /** - *

addCardToShopList.

- * - * @param c a {@link forge.Card} object. - */ - public void addCardToShopList(Card c) { - shopList.add(c.getName()); - } - - /** - *

removeCardFromShopList.

- * - * @param c a {@link forge.Card} object. - */ - public void removeCardFromShopList(Card c) { - String s = c.getName(); - if (!shopList.contains(s)) { - return; - } - - for (int i = 0; i < shopList.size(); i++) { - String str = shopList.get(i); - if (str.equals(s)) { - shopList.remove(i); - break; - } - } - } - - /** - *

getCreditsToAdd.

- * - * @param matchState a {@link forge.quest.data.QuestMatchState} object. - * @return a long. - */ - public long getCreditsToAdd(QuestMatchState matchState) { - long creds = (long) (QuestPreferences.getMatchRewardBase() + (QuestPreferences.getMatchRewardTotalWins() * win)); - String[] wins = matchState.getWinMethods(); - int[] winTurns = matchState.getWinTurns(); - boolean[] mulliganedToZero = matchState.getMulliganedToZero(); - - if (matchState.getLose() == 0) { - creds += QuestPreferences.getMatchRewardNoLosses(); - } - - for (String s : wins) { - if (s != null) { - if (s.equals("Poison Counters")) { - creds += QuestPreferences.getMatchRewardPoisonWinBonus(); - } else if (s.equals("Milled")) { - creds += QuestPreferences.getMatchRewardMilledWinBonus(); - } else if (s.equals("Battle of Wits") || s.equals("Felidar Sovereign") || s.equals("Helix Pinnacle") || - s.equals("Epic Struggle") || s.equals("Door to Nothingness") || s.equals("Barren Glory") || - s.equals("Near-Death Experience") || s.equals("Mortal Combat") || s.equals("Test of Endurance")) { - creds += QuestPreferences.getMatchRewardAltWinBonus(); - } - } - } - for (int i : winTurns) { - if (i == 1) { - creds += QuestPreferences.getMatchRewardWinFirst(); - } else if (i <= 5) { - creds += QuestPreferences.getMatchRewardWinByFifth(); - } else if (i <= 10) { - creds += QuestPreferences.getMatchRewardWinByTen(); - } else if (i <= 15) { - creds += QuestPreferences.getMatchRewardWinByFifteen(); - } - } - - - for (boolean b : mulliganedToZero) { - if (b == true) { - creds += QuestPreferences.getMatchMullToZero(); - } - } - - if (inventory.getItemLevel("Estates") == 1) { - creds *= 1.1; - } else if (inventory.getItemLevel("Estates") == 2) { - creds *= 1.15; - } else if (inventory.getItemLevel("Estates") == 3) { - creds *= 1.2; - } - - this.addCredits(creds); - - return creds; - } - - //gets all of the cards that are in the cardpool - - /** - *

getCards.

- * - * @return a {@link java.util.List} object. - */ - public List getCards() { - //copy CardList in order to keep private variables private - //if we just return cardPool, it could be changed externally - return new ArrayList(cardPool); - } - - - /** - *

getTotalNumberOfGames.

- * - * @param difficulty a int. - * @return a int. - */ - public int getTotalNumberOfGames(int difficulty) { - //-2 because you start a level 1, and the last level is secret - int numberLevels = rankArray.length - 2; - int nMatches = QuestPreferences.getWinsForRankIncrease(difficulty); - - return numberLevels * nMatches; - } - - //this changes getRank() - - /** - *

addWin.

- */ - public void addWin() { - win++; - - if (win % QuestPreferences.getWinsForRankIncrease(diffIndex) == 0) { - rankIndex++; - } - } - - /** - *

addLost.

- */ - public void addLost() { - lost++; - } - - /** - *

Getter for the field win.

- * - * @return a int. - */ - public int getWin() { - return win; - } - - /** - *

Getter for the field lost.

- * - * @return a int. - */ - public int getLost() { - return lost; - } - - //********************FANTASY STUFF START*********************** - - /** - *

Setter for the field life.

- * - * @param n a int. - */ - public void setLife(int n) { - life = n; - } - - /** - *

Getter for the field life.

- * - * @return a int. - */ - public int getLife() { - return life; - } - - /** - *

addLife.

- * - * @param n a int. - */ - public void addLife(int n) { - life += n; - } - - - /** - *

Getter for the field questsPlayed.

- * - * @return a int. - */ - public int getQuestsPlayed() { - return questsPlayed; - } - - /** - *

addQuestsPlayed.

- */ - public void addQuestsPlayed() { - questsPlayed++; - } - - //********************FANTASY STUFF END*********************** - - /** - *

addCredits.

- * - * @param c a long. - */ - public void addCredits(long c) { - credits += c; - } - - /** - *

subtractCredits.

- * - * @param c a long. - */ - public void subtractCredits(long c) { - credits -= c; - if (credits < 0) { - credits = 0; - } - } - - /** - *

Getter for the field credits.

- * - * @return a long. - */ - public long getCredits() { - return credits; - } - - /** - *

Getter for the field mode.

- * - * @return a {@link java.lang.String} object. - */ - public String getMode() { - if (mode == null) { - return ""; - } - return mode; - } - - //should be called first, because the difficultly won't change - - /** - *

Getter for the field difficulty.

- * - * @return a {@link java.lang.String} object. - */ - public String getDifficulty() { - return difficulty; - } - - /** - *

getDifficultyIndex.

- * - * @return a int. - */ - public int getDifficultyIndex() { - return diffIndex; - } - - /** - *

Setter for the field difficulty.

- * - * @param i a int. - */ - public void setDifficulty(int i) { - diffIndex = i; - difficulty = QuestPreferences.getDifficulty(i); - } - - /** - *

setDifficultyIndex.

- */ - public void setDifficultyIndex() { - String[] diffStr = QuestPreferences.getDifficulty(); - for (int i = 0; i < diffStr.length; i++) { - if (difficulty.equals(diffStr[i])) { - diffIndex = i; - } - } - } - - /** - *

getDifficultyChoices.

- * - * @return an array of {@link java.lang.String} objects. - */ - public String[] getDifficultyChoices() { - return QuestPreferences.getDifficulty(); - } - - /** - *

getRank.

- * - * @return a {@link java.lang.String} object. - */ - public String getRank() { - //is rankIndex too big? - if (rankIndex >= rankArray.length) { - rankIndex = rankArray.length - 1; - } - - return rankArray[rankIndex]; - } - - /** - *

getLevel.

- * - * @return a int. - * @since 1.0.15 - */ - public int getLevel() { - return rankIndex; - } - - //add cards after a certain number of wins or losses - - /** - *

shouldAddCards.

- * - * @param didWin a boolean. - * @return a boolean. - */ - public boolean shouldAddCards(boolean didWin) { - int n = QuestPreferences.getWinsForBooster(diffIndex); - - if (didWin) { - return getWin() % n == 0; - } else { - return getLost() % n == 0; - } - } - - /** - *

shouldAddAdditionalCards.

- * - * @param didWin a boolean. - * @return a boolean. - */ - public boolean shouldAddAdditionalCards(boolean didWin) { - float chance = 0.5f; - if (inventory.getItemLevel("Lucky Coin") == 1) { - chance = 0.65f; - } - - float r = MyRandom.random.nextFloat(); - - if (didWin) { - return r <= chance; - } else { - return false; - } - } - - /** - *

hasSaveFile.

- * - * @return a boolean. - */ - public boolean hasSaveFile() { - return ForgeProps.getFile(NewConstants.QUEST.DATA).exists() || - ForgeProps.getFile(NewConstants.QUEST.XMLDATA).exists(); - } - - /** - *

main.

- * - * @param args an array of {@link java.lang.String} objects. - */ - public static void main(String[] args) { - QuestData q = new QuestData(); - for (int i = 0; i < 20; i++) { - q.addCards(); - } - - for (int i = 0; i < 10; i++) { - q.saveData(); - q = QuestDataIO.loadData(); - } - - System.exit(1); - } - - /** - *

Getter for the field petManager.

- * - * @return a {@link forge.quest.data.pet.QuestPetManager} object. - */ - public QuestPetManager getPetManager() { - return petManager; - } - - //get new cards that were added to your card pool by addCards() - - /** - *

addToNewList.

- * - * @param added a {@link java.util.ArrayList} object. - */ - public void addToNewList(ArrayList added) { - newCardList.addAll(added); - } - - /** - *

readResolve.

- * - * @return a {@link java.lang.Object} object. - */ - public Object readResolve() { - initTransients(); - return this; - } - - /** - *

Getter for the field inventory.

- * - * @return a {@link forge.quest.data.item.QuestInventory} object. - */ - public QuestInventory getInventory() { - return inventory; - } - - /** - *

Getter for the field randomSeed.

- * - * @return a long. - */ - public long getRandomSeed() { - return randomSeed; - } -} diff --git a/src/forge/quest/data/QuestDataIO.java b/src/forge/quest/data/QuestDataIO.java deleted file mode 100644 index b6711290115..00000000000 --- a/src/forge/quest/data/QuestDataIO.java +++ /dev/null @@ -1,166 +0,0 @@ -package forge.quest.data; - -import com.thoughtworks.xstream.XStream; -import com.thoughtworks.xstream.mapper.MapperWrapper; -import forge.error.ErrorViewer; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; -import forge.quest.data.item.QuestInventory; -import org.w3c.dom.Document; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import java.io.*; -import java.util.ArrayList; -import java.util.List; -import java.util.zip.GZIPInputStream; -import java.util.zip.GZIPOutputStream; - -/** - *

QuestDataIO class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestDataIO { - /** - *

Constructor for QuestDataIO.

- */ - public QuestDataIO() { - } - - /** - *

loadData.

- * - * @return a {@link forge.quest.data.QuestData} object. - */ - public static QuestData loadData() { - try { - //read file "questData" - QuestData data = null; - - File xmlSaveFile = ForgeProps.getFile(NewConstants.QUEST.XMLDATA); - - GZIPInputStream zin = - new GZIPInputStream(new FileInputStream(xmlSaveFile)); - - StringBuilder xml = new StringBuilder(); - char[] buf = new char[1024]; - InputStreamReader reader = new InputStreamReader(zin); - while (reader.ready()) { - int len = reader.read(buf); - xml.append(buf, 0, len); - } - - IgnoringXStream xStream = new IgnoringXStream(); - data = (QuestData) xStream.fromXML(xml.toString()); - - if (data.versionNumber != QuestData.CURRENT_VERSION_NUMBER) { - updateSaveFile(data, xml.toString()); - } - - zin.close(); - - return data; - } catch (Exception ex) { - ErrorViewer.showError(ex, "Error loading Quest Data"); - throw new RuntimeException(ex); - } - } - - /** - *

updateSaveFile.

- * - * @param newData a {@link forge.quest.data.QuestData} object. - * @param input a {@link java.lang.String} object. - */ - private static void updateSaveFile( - final QuestData newData, final String input) { - try { - DocumentBuilder builder = - DocumentBuilderFactory.newInstance().newDocumentBuilder(); - InputSource is = new InputSource(); - is.setCharacterStream(new StringReader(input)); - Document document = builder.parse(is); - - - switch (newData.versionNumber) { - //There should be a fall-through b/w the cases so that each - // version's changes get applied progressively - case 0: - // First beta release with new file format, - // inventory needs to be migrated - newData.inventory = new QuestInventory(); - NodeList elements = document.getElementsByTagName("estatesLevel"); - newData.getInventory().setItemLevel("Estates", Integer.parseInt(elements.item(0).getTextContent())); - elements = document.getElementsByTagName("luckyCoinLevel"); - newData.getInventory().setItemLevel("Lucky Coin", Integer.parseInt(elements.item(0).getTextContent())); - elements = document.getElementsByTagName("sleightOfHandLevel"); - newData.getInventory().setItemLevel("Sleight", Integer.parseInt(elements.item(0).getTextContent())); - elements = document.getElementsByTagName("gearLevel"); - - int gearLevel = Integer.parseInt(elements.item(0).getTextContent()); - if (gearLevel >= 1) { - newData.inventory.setItemLevel("Map", 1); - } - if (gearLevel == 2) { - newData.inventory.setItemLevel("Zeppelin", 1); - } - break; - } - - //mark the QD as the latest version - newData.versionNumber = QuestData.CURRENT_VERSION_NUMBER; - - } catch (Exception e) { - forge.error.ErrorViewer.showError(e); - } - } - - /** - *

saveData.

- * - * @param qd a {@link forge.quest.data.QuestData} object. - */ - public static void saveData(QuestData qd) { - try { - File f = ForgeProps.getFile(NewConstants.QUEST.XMLDATA); - BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(f)); - GZIPOutputStream zout = new GZIPOutputStream(bout); - - XStream xStream = new XStream(); - xStream.toXML(qd, zout); - - zout.flush(); - zout.close(); - } catch (Exception ex) { - ErrorViewer.showError(ex, "Error saving Quest Data."); - throw new RuntimeException(ex); - } - } - - /** - * Xstream subclass that ignores fields that are present in the save but not in the class. - */ - private static class IgnoringXStream extends XStream { - List ignoredFields = new ArrayList(); - - @Override - protected MapperWrapper wrapMapper(MapperWrapper next) { - return new MapperWrapper(next) { - @Override - public boolean shouldSerializeMember( - @SuppressWarnings("rawtypes") Class definedIn, - String fieldName) { - if (definedIn == Object.class) { - ignoredFields.add(fieldName); - return false; - } - return super.shouldSerializeMember(definedIn, fieldName); - } - }; - } - } -} diff --git a/src/forge/quest/data/QuestMatchState.java b/src/forge/quest/data/QuestMatchState.java deleted file mode 100644 index 446435acbb0..00000000000 --- a/src/forge/quest/data/QuestMatchState.java +++ /dev/null @@ -1,146 +0,0 @@ -package forge.quest.data; - -/** - *

QuestMatchState class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestMatchState { - //the way wins were achieved: - //Damage - //Poison Counters - //Battle of Wits - //Mortal Combat - //Milled - //Felidar Sovereign - //... - // - private String[] winMethods = new String[2]; - private int[] winTurns = new int[2]; - - private boolean[] mulliganedToZero = new boolean[2]; - - private int win; - private int lose; - private boolean winRecently; - - /** - *

reset.

- */ - public void reset() { - win = 0; - lose = 0; - winMethods = new String[2]; - } - - /** - *

addWin.

- */ - public void addWin() { - win++; - winRecently = true; - } - - /** - *

addLose.

- */ - public void addLose() { - lose++; - winRecently = false; - } - - /** - *

Getter for the field win.

- * - * @return a int. - */ - public int getWin() { - return win; - } - - /** - *

Getter for the field lose.

- * - * @return a int. - */ - public int getLose() { - return lose; - } - - /** - *

countWinLose.

- * - * @return a int. - */ - public int countWinLose() { - return win + lose; - } - - /** - *

setWinMethod.

- * - * @param gameNumber a int. - * @param method a {@link java.lang.String} object. - */ - public void setWinMethod(int gameNumber, String method) { - winMethods[gameNumber] = method; - } - - /** - *

Getter for the field winMethods.

- * - * @return an array of {@link java.lang.String} objects. - */ - public String[] getWinMethods() { - return winMethods; - } - - /** - *

setWinTurn.

- * - * @param gameNumber a int. - * @param turns a int. - */ - public void setWinTurn(int gameNumber, int turns) { - winTurns[gameNumber] = turns; - } - - - /** - *

Getter for the field winTurns.

- * - * @return an array of int. - */ - public int[] getWinTurns() { - return winTurns; - } - - /** - *

Getter for the field mulliganedToZero.

- * - * @return an array of boolean. - */ - public boolean[] getMulliganedToZero() { - return mulliganedToZero; - } - - /** - *

Setter for the field mulliganedToZero.

- * - * @param gameNumber a int. - * @param b a boolean. - */ - public void setMulliganedToZero(int gameNumber, boolean b) { - mulliganedToZero[gameNumber] = b; - } - - /** - *

didWinRecently.

- * - * @return a boolean. - */ - public boolean didWinRecently() { - return winRecently; - } -} diff --git a/src/forge/quest/data/QuestPreferences.java b/src/forge/quest/data/QuestPreferences.java deleted file mode 100644 index 4d731de0ed4..00000000000 --- a/src/forge/quest/data/QuestPreferences.java +++ /dev/null @@ -1,665 +0,0 @@ -package forge.quest.data; - -import forge.properties.ForgeProps; -import forge.properties.NewConstants.QUEST; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.Serializable; - -/** - *

QuestPreferences class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestPreferences implements Serializable { - /** Constant serialVersionUID=3266336025656577905L */ - private static final long serialVersionUID = 3266336025656577905L; - - /** Constant numDiff=4 */ - private static int numDiff = 4; - - // Descriptive difficulty names - /** Constant sDifficulty="{Easy, Normal, Hard, Very Hard}" */ - private static String[] sDifficulty = {"Easy", "Normal", "Hard", "Very Hard"}; - - // Default match wins it takes to gain a booster - /** Constant winsForBooster={1, 1, 2, 2} */ - private static int[] winsForBooster = {1, 1, 2, 2}; - /** Constant winsForRankIncrease={1, 2, 3, 4} */ - private static int[] winsForRankIncrease = {1, 2, 3, 4}; - /** Constant winsForMediumAI={6, 6, 11, 11} */ - private static int[] winsForMediumAI = {6, 6, 11, 11}; - /** Constant winsForHardAI={9, 9, 21, 21} */ - private static int[] winsForHardAI = {9, 9, 21, 21}; - /** Constant winsForVeryHardAI={29, 29, 31, 31} */ - private static int[] winsForVeryHardAI = {29, 29, 31, 31}; - - // Default starting land for a quest - /** Constant startingBasicLand=20 */ - private static int startingBasicLand = 20; - /** Constant startingSnowBasicLand=20 */ - private static int startingSnowBasicLand = 20; - - // Default starting amount of each rarity - /** Constant startingCommons={45, 40, 40, 40} */ - private static int[] startingCommons = {45, 40, 40, 40}; - /** Constant startingUncommons={20, 15, 15, 15} */ - private static int[] startingUncommons = {20, 15, 15, 15}; - /** Constant startingRares={10, 10, 10, 10} */ - private static int[] startingRares = {10, 10, 10, 10}; - - /** Constant startingCredits=250 */ - private static int startingCredits = 250; - - /** Constant boosterPackRare=1 */ - private static int boosterPackRare = 1; - /** Constant boosterPackUncommon=3 */ - private static int boosterPackUncommon = 3; - /** Constant boosterPackCommon=9 */ - private static int boosterPackCommon = 9; - - /** Constant matchRewardBase=10 */ - private static int matchRewardBase = 10; - /** Constant matchRewardTotalWins=0.3 */ - private static double matchRewardTotalWins = 0.3; - /** Constant matchRewardNoLosses=10 */ - private static int matchRewardNoLosses = 10; - - /** Constant matchRewardPoisonWinBonus=50 */ - private static int matchRewardPoisonWinBonus = 50; - /** Constant matchRewardMilledWinBonus=40 */ - private static int matchRewardMilledWinBonus = 40; - /** Constant matchRewardAltWinBonus=100 */ - private static int matchRewardAltWinBonus = 100; - - /** Constant matchRewardWinOnFirstTurn=1500 */ - private static int matchRewardWinOnFirstTurn = 1500; - /** Constant matchRewardWinByTurnFive=250 */ - private static int matchRewardWinByTurnFive = 250; - /** Constant matchRewardWinByTurnTen=50 */ - private static int matchRewardWinByTurnTen = 50; - /** Constant matchRewardWinByTurnFifteen=5 */ - private static int matchRewardWinByTurnFifteen = 5; - /** Constant matchRewardMullToZero=500 */ - private static int matchRewardMullToZero = 500; - - - static { - // if quest.prefs exists - grabPrefsFromFile(); - } - - /** - *

grabPrefsFromFile.

- */ - public static void grabPrefsFromFile() { - try { - BufferedReader input = new BufferedReader(new FileReader(ForgeProps.getFile(QUEST.PREFS))); - String line = null; - while ((line = input.readLine()) != null) { - if (line.startsWith("#") || line.length() == 0) - continue; - String[] split = line.split("="); - - if (split[0].equals("difficultyString")) - setDifficulty(split[1]); - else if (split[0].equals("winsForBooster")) - setWinsForBooster(split[1]); - else if (split[0].equals("winsForRankIncrease")) - setWinsForRank(split[1]); - else if (split[0].equals("winsForMediumAI")) - setWinsForMediumAI(split[1]); - else if (split[0].equals("winsForHardAI")) - setWinsForHardAI(split[1]); - else if (split[0].equals("startingBasicLand")) - setStartingBasic(split[1]); - else if (split[0].equals("startingSnowBasicLand")) - setStartingSnowBasic(split[1]); - else if (split[0].equals("startingCommons")) - setStartingCommons(split[1]); - else if (split[0].equals("startingUncommons")) - setStartingUncommons(split[1]); - else if (split[0].equals("startingRares")) - setStartingRares(split[1]); - else if (split[0].equals("startingCredits")) - setStartingCredits(split[1]); - else if (split[0].equals("boosterPackCommon")) - setNumCommon(split[1]); - else if (split[0].equals("boosterPackUncommon")) - setNumUncommon(split[1]); - else if (split[0].equals("boosterPackRare")) - setNumRares(split[1]); - else if (split[0].equals("matchRewardBase")) - setMatchRewardBase(split[1]); - else if (split[0].equals("matchRewardTotalWins")) - setMatchRewardTotalWins(split[1]); - else if (split[0].equals("matchRewardNoLosses")) - setMatchRewardNoLosses(split[1]); - else if (split[0].equals("matchRewardMilledWinBonus")) - setMatchRewardMilledWinBonus(split[1]); - else if (split[0].equals("matchRewardPoisonWinBonus")) - setMatchRewardPoisonWinBonus(split[1]); - else if (split[0].equals("matchRewardAltWinBonus")) - setMatchRewardAltWinBonus(split[1]); - else if (split[0].equals("matchRewardWinOnFirstTurn")) - setMatchRewardWinFirst(split[1]); - else if (split[0].equals("matchRewardWinByTurnFive")) - setMatchRewardWinByFifth(split[1]); - else if (split[0].equals("matchRewardWinByTurnTen")) - setMatchRewardWinByTen(split[1]); - else if (split[0].equals("matchRewardWinByTurnFifteen")) - setMatchRewardWinByFifteen(split[1]); - else if (split[0].equals("matchRewardMullToZero")) - setMatchMullToZero(split[1]); - } - } catch (Exception e) { - System.out.println("Trouble grabbing quest data preferences. Using default values."); - } - } - - /** - *

getDifficulty.

- * - * @return an array of {@link java.lang.String} objects. - */ - public static String[] getDifficulty() { - return sDifficulty; - } - - /** - *

getDifficulty.

- * - * @param index a int. - * @return a {@link java.lang.String} object. - */ - public static String getDifficulty(int index) { - return sDifficulty[index]; - } - - /** - *

Getter for the field winsForBooster.

- * - * @param index a int. - * @return a int. - */ - public static int getWinsForBooster(int index) { - return winsForBooster[index]; - } - - /** - *

Getter for the field winsForRankIncrease.

- * - * @param index a int. - * @return a int. - */ - public static int getWinsForRankIncrease(int index) { - return winsForRankIncrease[index]; - } - - /** - *

Getter for the field winsForMediumAI.

- * - * @param index a int. - * @return a int. - */ - public static int getWinsForMediumAI(int index) { - return winsForMediumAI[index]; - } - - /** - *

Getter for the field winsForHardAI.

- * - * @param index a int. - * @return a int. - */ - public static int getWinsForHardAI(int index) { - return winsForHardAI[index]; - } - - /** - *

Getter for the field winsForVeryHardAI.

- * - * @param index a int. - * @return a int. - */ - public static int getWinsForVeryHardAI(int index) { - return winsForVeryHardAI[index]; - } - - /** - *

getStartingBasic.

- * - * @return a int. - */ - public static int getStartingBasic() { - return startingBasicLand; - } - - /** - *

getStartingSnowBasic.

- * - * @return a int. - */ - public static int getStartingSnowBasic() { - return startingSnowBasicLand; - } - - /** - *

Getter for the field startingCommons.

- * - * @param index a int. - * @return a int. - */ - public static int getStartingCommons(int index) { - return startingCommons[index]; - } - - /** - *

Getter for the field startingUncommons.

- * - * @param index a int. - * @return a int. - */ - public static int getStartingUncommons(int index) { - return startingUncommons[index]; - } - - /** - *

Getter for the field startingRares.

- * - * @param index a int. - * @return a int. - */ - public static int getStartingRares(int index) { - return startingRares[index]; - } - - /** - *

Getter for the field startingCredits.

- * - * @return a int. - */ - public static int getStartingCredits() { - return startingCredits; - } - - /** - *

getNumCommon.

- * - * @return a int. - */ - public static int getNumCommon() { - return boosterPackCommon; - } - - /** - *

getNumUncommon.

- * - * @return a int. - */ - public static int getNumUncommon() { - return boosterPackUncommon; - } - - /** - *

getNumRare.

- * - * @return a int. - */ - public static int getNumRare() { - return boosterPackRare; - } - - - /** - *

Getter for the field matchRewardBase.

- * - * @return a int. - */ - public static int getMatchRewardBase() { - return matchRewardBase; - } - - /** - *

Getter for the field matchRewardTotalWins.

- * - * @return a double. - */ - public static double getMatchRewardTotalWins() { - return matchRewardTotalWins; - } - - /** - *

Getter for the field matchRewardNoLosses.

- * - * @return a int. - */ - public static int getMatchRewardNoLosses() { - return matchRewardNoLosses; - } - - /** - *

Getter for the field matchRewardPoisonWinBonus.

- * - * @return a int. - */ - public static int getMatchRewardPoisonWinBonus() { - return matchRewardPoisonWinBonus; - } - - /** - *

Getter for the field matchRewardMilledWinBonus.

- * - * @return a int. - */ - public static int getMatchRewardMilledWinBonus() { - return matchRewardMilledWinBonus; - } - - /** - *

Getter for the field matchRewardAltWinBonus.

- * - * @return a int. - */ - public static int getMatchRewardAltWinBonus() { - return matchRewardAltWinBonus; - } - - - /** - *

getMatchRewardWinFirst.

- * - * @return a int. - */ - public static int getMatchRewardWinFirst() { - return matchRewardWinOnFirstTurn; - } - - /** - *

getMatchRewardWinByFifth.

- * - * @return a int. - */ - public static int getMatchRewardWinByFifth() { - return matchRewardWinByTurnFive; - } - - /** - *

getMatchRewardWinByTen.

- * - * @return a int. - */ - public static int getMatchRewardWinByTen() { - return matchRewardWinByTurnTen; - } - - /** - *

getMatchRewardWinByFifteen.

- * - * @return a int. - */ - public static int getMatchRewardWinByFifteen() { - return matchRewardWinByTurnFifteen; - } - - /** - *

getMatchMullToZero.

- * - * @return a int. - */ - public static int getMatchMullToZero() { - return matchRewardMullToZero; - } - - - // setters - /** - *

setDifficulty.

- * - * @param diff a {@link java.lang.String} object. - */ - public static void setDifficulty(String diff) { - sDifficulty = diff.split(","); - } - - /** - *

Setter for the field winsForBooster.

- * - * @param wins a {@link java.lang.String} object. - */ - public static void setWinsForBooster(String wins) { - String[] winsStr = wins.split(","); - - for (int i = 0; i < numDiff; i++) - winsForBooster[i] = Integer.parseInt(winsStr[i]); - } - - /** - *

setWinsForRank.

- * - * @param wins a {@link java.lang.String} object. - */ - public static void setWinsForRank(String wins) { - String[] winsStr = wins.split(","); - - for (int i = 0; i < numDiff; i++) - winsForRankIncrease[i] = Integer.parseInt(winsStr[i]); - } - - /** - *

Setter for the field winsForMediumAI.

- * - * @param wins a {@link java.lang.String} object. - */ - public static void setWinsForMediumAI(String wins) { - String[] winsStr = wins.split(","); - - for (int i = 0; i < numDiff; i++) - winsForMediumAI[i] = Integer.parseInt(winsStr[i]); - } - - /** - *

Setter for the field winsForHardAI.

- * - * @param wins a {@link java.lang.String} object. - */ - public static void setWinsForHardAI(String wins) { - String[] winsStr = wins.split(","); - - for (int i = 0; i < numDiff; i++) - winsForHardAI[i] = Integer.parseInt(winsStr[i]); - } - - /** - *

setStartingBasic.

- * - * @param land a {@link java.lang.String} object. - */ - public static void setStartingBasic(String land) { - startingBasicLand = Integer.parseInt(land); - } - - /** - *

setStartingSnowBasic.

- * - * @param land a {@link java.lang.String} object. - */ - public static void setStartingSnowBasic(String land) { - startingSnowBasicLand = Integer.parseInt(land); - } - - /** - *

Setter for the field startingCommons.

- * - * @param rarity a {@link java.lang.String} object. - */ - public static void setStartingCommons(String rarity) { - String[] splitStr = rarity.split(","); - - for (int i = 0; i < numDiff; i++) - startingCommons[i] = Integer.parseInt(splitStr[i]); - } - - /** - *

Setter for the field startingUncommons.

- * - * @param rarity a {@link java.lang.String} object. - */ - public static void setStartingUncommons(String rarity) { - String[] splitStr = rarity.split(","); - - for (int i = 0; i < numDiff; i++) - startingUncommons[i] = Integer.parseInt(splitStr[i]); - } - - /** - *

Setter for the field startingRares.

- * - * @param rarity a {@link java.lang.String} object. - */ - public static void setStartingRares(String rarity) { - String[] splitStr = rarity.split(","); - - for (int i = 0; i < numDiff; i++) - startingRares[i] = Integer.parseInt(splitStr[i]); - } - - /** - *

Setter for the field startingCredits.

- * - * @param credits a {@link java.lang.String} object. - */ - public static void setStartingCredits(String credits) { - startingCredits = Integer.parseInt(credits); - } - - /** - *

setNumCommon.

- * - * @param pack a {@link java.lang.String} object. - */ - public static void setNumCommon(String pack) { - boosterPackCommon = Integer.parseInt(pack); - } - - /** - *

setNumUncommon.

- * - * @param pack a {@link java.lang.String} object. - */ - public static void setNumUncommon(String pack) { - boosterPackUncommon = Integer.parseInt(pack); - } - - /** - *

setNumRares.

- * - * @param pack a {@link java.lang.String} object. - */ - public static void setNumRares(String pack) { - boosterPackRare = Integer.parseInt(pack); - } - - - /** - *

Setter for the field matchRewardBase.

- * - * @param match a {@link java.lang.String} object. - */ - public static void setMatchRewardBase(String match) { - matchRewardBase = Integer.parseInt(match); - } - - /** - *

Setter for the field matchRewardTotalWins.

- * - * @param match a {@link java.lang.String} object. - */ - public static void setMatchRewardTotalWins(String match) { - matchRewardTotalWins = Double.parseDouble(match); - } - - /** - *

Setter for the field matchRewardNoLosses.

- * - * @param match a {@link java.lang.String} object. - */ - public static void setMatchRewardNoLosses(String match) { - matchRewardNoLosses = Integer.parseInt(match); - } - - /** - *

Setter for the field matchRewardPoisonWinBonus.

- * - * @param match a {@link java.lang.String} object. - */ - public static void setMatchRewardPoisonWinBonus(String match) { - matchRewardPoisonWinBonus = Integer.parseInt(match); - } - - /** - *

Setter for the field matchRewardMilledWinBonus.

- * - * @param match a {@link java.lang.String} object. - */ - public static void setMatchRewardMilledWinBonus(String match) { - matchRewardMilledWinBonus = Integer.parseInt(match); - } - - /** - *

Setter for the field matchRewardAltWinBonus.

- * - * @param match a {@link java.lang.String} object. - */ - public static void setMatchRewardAltWinBonus(String match) { - matchRewardAltWinBonus = Integer.parseInt(match); - } - - - /** - *

setMatchRewardWinFirst.

- * - * @param match a {@link java.lang.String} object. - */ - public static void setMatchRewardWinFirst(String match) { - matchRewardWinOnFirstTurn = Integer.parseInt(match); - } - - /** - *

setMatchRewardWinByFifth.

- * - * @param match a {@link java.lang.String} object. - */ - public static void setMatchRewardWinByFifth(String match) { - matchRewardWinByTurnFive = Integer.parseInt(match); - } - - /** - *

setMatchRewardWinByTen.

- * - * @param match a {@link java.lang.String} object. - */ - public static void setMatchRewardWinByTen(String match) { - matchRewardWinByTurnTen = Integer.parseInt(match); - } - - /** - *

setMatchRewardWinByFifteen.

- * - * @param match a {@link java.lang.String} object. - */ - public static void setMatchRewardWinByFifteen(String match) { - matchRewardWinByTurnFifteen = Integer.parseInt(match); - } - - /** - *

setMatchMullToZero.

- * - * @param match a {@link java.lang.String} object. - */ - public static void setMatchMullToZero(String match) { - matchRewardMullToZero = Integer.parseInt(match); - } -} diff --git a/src/forge/quest/data/QuestUtil.java b/src/forge/quest/data/QuestUtil.java deleted file mode 100644 index 6e27594a2c6..00000000000 --- a/src/forge/quest/data/QuestUtil.java +++ /dev/null @@ -1,489 +0,0 @@ -package forge.quest.data; - -import forge.*; - -import java.util.ArrayList; - -import com.google.code.jyield.Generator; -import com.google.code.jyield.YieldUtils; - -/** - *

QuestUtil class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestUtil { - - /** - *

getComputerCreatures.

- * - * @param qd a {@link forge.quest.data.QuestData} object. - * @return a {@link forge.CardList} object. - */ - public static CardList getComputerCreatures(QuestData qd) { - return new CardList(); - } - - /** - *

getComputerCreatures.

- * - * @param qd a {@link forge.quest.data.QuestData} object. - * @param qa a {@link forge.Quest_Assignment} object. - * @return a {@link forge.CardList} object. - */ - public static CardList getComputerCreatures(QuestData qd, Quest_Assignment qa) { - CardList list = new CardList(); - if (qa != null) { - ArrayList compCards = qa.getCompy(); - - for (String s : compCards) { - Card c = AllZone.getCardFactory().getCard(s, AllZone.getComputerPlayer()); - - c.setCurSetCode(c.getMostRecentSet()); - c.setImageFilename(CardUtil.buildFilename(c)); - - list.add(c); - } - } - return list; - } - - /** - *

getHumanPlantAndPet.

- * - * @param qd a {@link forge.quest.data.QuestData} object. - * @return a {@link forge.CardList} object. - */ - public static CardList getHumanPlantAndPet(QuestData qd) { - CardList list = new CardList(); - - if (qd.getPetManager().shouldPetBeUsed()) { - list.add(qd.getPetManager().getSelectedPet().getPetCard()); - } - - if (qd.getPetManager().shouldPlantBeUsed()) { - list.add(qd.getPetManager().getPlant().getPetCard()); - } - - return list; - } - - /** - *

getHumanPlantAndPet.

- * - * @param qd a {@link forge.quest.data.QuestData} object. - * @param qa a {@link forge.Quest_Assignment} object. - * @return a {@link forge.CardList} object. - */ - public static CardList getHumanPlantAndPet(QuestData qd, Quest_Assignment qa) { - CardList list = getHumanPlantAndPet(qd); - - if (qa != null) - list.addAll(qa.getHuman()); - - return list; - } - - - /** - *

setupQuest.

- * - * @param qa a {@link forge.Quest_Assignment} object. - */ - public static void setupQuest(Quest_Assignment qa) { - QuestBoosterPack pack = new QuestBoosterPack(); - qa.clearCompy(); - - int id = qa.getId(); - - Generator cards = YieldUtils.toGenerator(AllZone.getCardFactory()); - - if (id == 1) //White Dungeon - { - qa.addCompy("Divine Presence"); - - qa.setCardRewardList(pack.generateCards(cards, 3, Constant.Rarity.Rare, Constant.Color.White)); - } else if (id == 2) //Blue Dungeon - { - CardList humanList = new CardList(); - Card c = AllZone.getCardFactory().getCard("Quest for Ancient Secrets", AllZone.getHumanPlayer()); - - c.setCurSetCode(c.getMostRecentSet()); - c.setImageFilename(CardUtil.buildFilename(c)); - - humanList.add(c); - - qa.setHuman(humanList); - - qa.addCompy("Forced Fruition"); - - qa.setCardRewardList(pack.generateCards(cards, 3, Constant.Rarity.Rare, Constant.Color.Blue)); - } else if (id == 3) //Black Dungeon - { - qa.setCardRewardList(pack.generateCards(cards, 3, Constant.Rarity.Rare, Constant.Color.Black)); - } else if (id == 4) //Red Dungeon - { - for (int i = 0; i < 3; i++) - qa.addCompy("Mons's Goblin Raiders"); - - qa.setCardRewardList(pack.generateCards(cards, 3, Constant.Rarity.Rare, Constant.Color.Red)); - } else if (id == 5) //Green Dungeon - { - qa.setCardRewardList(pack.generateCards(cards, 3, Constant.Rarity.Rare, Constant.Color.Green)); - } else if (id == 6) //Colorless Dungeon - { - for (int i = 0; i < 3; i++) - qa.addCompy("Eon Hub"); - qa.setCardRewardList(pack.generateCards(cards, 3, Constant.Rarity.Rare, Constant.Color.Colorless)); - } else if (id == 7) //Gold Dungeon - { - CardList humanList = new CardList(); - Card c = AllZone.getCardFactory().getCard("Trailblazer's Boots", AllZone.getHumanPlayer()); - - c.setCurSetCode(c.getMostRecentSet()); - c.setImageFilename(CardUtil.buildFilename(c)); - - humanList.add(c); - - qa.setHuman(humanList); - qa.setCardRewardList(pack.generateCards(cards, 3, Constant.Rarity.Rare, "Multicolor")); - } else if (id == 8) { - CardList humanList = new CardList(); - for (int i = 0; i < 3; i++) { - //CANNOT use makeToken because of WheneverKeyword - Card c = new Card(); - c.setName("Sheep"); - c.setImageName("G 0 1 Sheep"); - - c.setController(AllZone.getHumanPlayer()); - c.setOwner(AllZone.getHumanPlayer()); - - //c.setManaCost("G"); - c.addColor("G"); - c.setToken(true); - - c.addType("Creature"); - c.addType("Sheep"); - - c.setBaseAttack(0); - c.setBaseDefense(1); - - humanList.add(c); - } - qa.setHuman(humanList); - qa.setCardRewardList(pack.generateCards(cards, 3, Constant.Rarity.Rare, null)); - } else if (id == 9) { - CardList humanList = new CardList(); - Card c = AllZone.getCardFactory().getCard("Trusty Machete", AllZone.getHumanPlayer()); - - c.setCurSetCode(c.getMostRecentSet()); - c.setImageFilename(CardUtil.buildFilename(c)); - - humanList.add(c); - - qa.setHuman(humanList); - - for (int i = 0; i < 3; i++) - qa.addCompy("Wall of Wood"); - - qa.setCardRewardList(pack.generateCards(cards, 4, Constant.Rarity.Rare, Constant.Color.Green)); - } else if (id == 10) { - CardList humanList = new CardList(); - - Card crd = AllZone.getCardFactory().getCard("Wall of Spears", AllZone.getHumanPlayer()); - - crd.setCurSetCode(crd.getMostRecentSet()); - crd.setImageFilename(CardUtil.buildFilename(crd)); - - humanList.add(crd); - - for (int i = 0; i < 3; i++) { - Card c = new Card(); - c.setName("Citizen"); - c.setImageName("W 1 1 Citizen"); - - c.setController(AllZone.getHumanPlayer()); - c.setOwner(AllZone.getHumanPlayer()); - - c.setManaCost("W"); - c.addColor("W"); - c.setToken(true); - - c.addType("Creature"); - c.addType("Citizen"); - - c.setBaseAttack(1); - c.setBaseDefense(1); - - humanList.add(c); - } - - qa.setHuman(humanList); - - for (int i = 0; i < 3; i++) - qa.addCompy("Scathe Zombies"); - qa.addCompy("Mass of Ghouls"); - - qa.setCardRewardList(pack.generateCards(cards, 4, Constant.Rarity.Rare, Constant.Color.Black)); - } else if (id == 11) // The King's Contest - { - CardList humanList = new CardList(); - Card c = AllZone.getCardFactory().getCard("Seal of Cleansing", AllZone.getHumanPlayer()); - - c.setCurSetCode(c.getMostRecentSet()); - c.setImageFilename(CardUtil.buildFilename(c)); - - humanList.add(c); - - qa.setHuman(humanList); - - qa.addCompy("Loyal Retainers"); - - qa.setCardRewardList(pack.generateCards(cards, 3, Constant.Rarity.Rare, null)); - } else if (id == 12) // Barroom Brawl - { - CardList humanList = new CardList(); - for (int i = 0; i < 3; i++) { - Card c = new Card(); - c.setName("Soldier Ally"); - c.setImageName("W 1 1 Soldier Ally"); - - c.setController(AllZone.getHumanPlayer()); - c.setOwner(AllZone.getHumanPlayer()); - - c.setManaCost("W"); - c.addColor("W"); - c.setToken(true); - - c.addType("Creature"); - c.addType("Soldier"); - c.addType("Ally"); - - c.setBaseAttack(1); - c.setBaseDefense(1); - - - humanList.add(c); - } - qa.setHuman(humanList); - - - qa.addCompy("Lowland Giant"); - - qa.setCardRewardList(pack.generateCards(cards, 4, Constant.Rarity.Rare, null)); - } else if (id == 13) // The Court Jester - { - CardList humanList = new CardList(); - Card c = AllZone.getCardFactory().getCard("Sensei's Divining Top", AllZone.getHumanPlayer()); - - c.setCurSetCode(c.getMostRecentSet()); - c.setImageFilename(CardUtil.buildFilename(c)); - - humanList.add(c); - - qa.setHuman(humanList); - - qa.addCompy("Teferi's Puzzle Box"); - - qa.setCardRewardList(pack.generateCards(cards, 4, Constant.Rarity.Rare, "Multicolor")); - } else if (id == 14) // Ancient Battlefield - { - CardList humanList = new CardList(); - String humanSetupCards[] = {"Glasses of Urza", "Blight Sickle"}; - - for (int i = 0; i < 2; i++) { - Card c = AllZone.getCardFactory().getCard(humanSetupCards[i], AllZone.getHumanPlayer()); - - c.setCurSetCode(c.getMostRecentSet()); - c.setImageFilename(CardUtil.buildFilename(c)); - - humanList.add(c); - } - qa.setHuman(humanList); - - String compySetupCards[] = {"Bad Moon", "Wall of Brambles"}; - - for (int i = 0; i < 2; i++) { - qa.addCompy(compySetupCards[i]); - } - - qa.setCardRewardList(pack.generateCards(cards, 4, Constant.Rarity.Rare, null)); - } else if (id == 15) // Don't Play With Matches - { - CardList humanList = new CardList(); - String humanSetupCards[] = {"Mudbutton Torchrunner", "Scuzzback Scrapper"}; - - for (int i = 0; i < 2; i++) { - Card c = AllZone.getCardFactory().getCard(humanSetupCards[i], AllZone.getHumanPlayer()); - - c.setCurSetCode(c.getMostRecentSet()); - c.setImageFilename(CardUtil.buildFilename(c)); - - humanList.add(c); - } - qa.setHuman(humanList); - - String compySetupCards[] = {"Heedless One", "Norwood Archers", "Wildslayer Elves"}; - - for (int i = 0; i < 3; i++) { - qa.addCompy(compySetupCards[i]); - } - - qa.setCardRewardList(pack.generateCards(cards, 4, Constant.Rarity.Rare, Constant.Color.Red)); - } else if (id == 16) // Mines of Kazum Durl - { - CardList humanList = new CardList(); - String humanSetupCards[] = {"Dwarven Demolition Team", "Dwarven Pony", "Dwarven Trader"}; - - for (int i = 0; i < 3; i++) { - Card c = AllZone.getCardFactory().getCard(humanSetupCards[i], AllZone.getHumanPlayer()); - - c.setCurSetCode(c.getMostRecentSet()); - c.setImageFilename(CardUtil.buildFilename(c)); - - humanList.add(c); - } - qa.setHuman(humanList); - - String compySetupCards[] = - {"Wall of Earth", "Wall of Air", "Wall of Ice", "Wall of Light", "Carrion Wall", "Steel Wall"}; - - for (int i = 0; i < 6; i++) { - qa.addCompy(compySetupCards[i]); - } - - qa.setCardRewardList(pack.generateCards(cards, 4, Constant.Rarity.Rare, Constant.Color.Green)); - } else if (id == 17) // House Party - { - CardList humanList = new CardList(); - String humanSetupCards[] = {"Hopping Automaton", "Honden of Life's Web", "Forbidden Orchard"}; - - for (int i = 0; i < 3; i++) { - Card c = AllZone.getCardFactory().getCard(humanSetupCards[i], AllZone.getHumanPlayer()); - - c.setCurSetCode(c.getMostRecentSet()); - c.setImageFilename(CardUtil.buildFilename(c)); - - humanList.add(c); - } - qa.setHuman(humanList); - - String compySetupCards[] = {"Honden of Infinite Rage", "Mikokoro, Center of the Sea", "Tidehollow Strix"}; - - for (int i = 0; i < 3; i++) { - qa.addCompy(compySetupCards[i]); - } - - qa.setCardRewardList(pack.generateCards(cards, 4, Constant.Rarity.Rare, Constant.Color.Colorless)); - } else if (id == 18) // Crows in the Field - { - CardList humanList = new CardList(); - String humanSetupCards[] = {"Straw Soldiers", "Femeref Archers", "Moonglove Extract"}; - - for (int i = 0; i < 3; i++) { - Card c = AllZone.getCardFactory().getCard(humanSetupCards[i], AllZone.getHumanPlayer()); - - c.setCurSetCode(c.getMostRecentSet()); - c.setImageFilename(CardUtil.buildFilename(c)); - - humanList.add(c); - } - qa.setHuman(humanList); - - String compySetupCards[] = {"Defiant Falcon", "Soulcatcher", "Storm Crow", "Hypnotic Specter"}; - - for (int i = 0; i < 4; i++) { - qa.addCompy(compySetupCards[i]); - } - - qa.setCardRewardList(pack.generateCards(cards, 5, Constant.Rarity.Rare, null)); - } else if (id == 19) // The Desert Caravan - { - CardList humanList = new CardList(); - String humanSetupCards[] = {"Spidersilk Net", "Dromad Purebred"}; - - for (int i = 0; i < 2; i++) { - Card c = AllZone.getCardFactory().getCard(humanSetupCards[i], AllZone.getHumanPlayer()); - - c.setCurSetCode(c.getMostRecentSet()); - c.setImageFilename(CardUtil.buildFilename(c)); - - humanList.add(c); - } - qa.setHuman(humanList); - - String compySetupCards[] = {"Ambush Party", "Ambush Party", "Gnat Alley Creeper", "Ambush Party", "Ambush Party"}; - - for (int i = 0; i < 5; i++) { - qa.addCompy(compySetupCards[i]); - } - - qa.setCardRewardList(pack.generateCards(cards, 5, Constant.Rarity.Rare, null)); - } else if (id == 20) // Blood Oath - { - CardList humanList = new CardList(); - String humanSetupCards[] = {"Counterbalance", "Hatching Plans", "Ley Druid"}; - - for (int i = 0; i < 3; i++) { - Card c = AllZone.getCardFactory().getCard(humanSetupCards[i], AllZone.getHumanPlayer()); - - c.setCurSetCode(c.getMostRecentSet()); - c.setImageFilename(CardUtil.buildFilename(c)); - - humanList.add(c); - } - qa.setHuman(humanList); - - String compySetupCards[] = {"Ior Ruin Expedition", "Oversold Cemetery", "Trapjaw Kelpie"}; - - for (int i = 0; i < 3; i++) { - qa.addCompy(compySetupCards[i]); - } - - qa.setCardRewardList(pack.generateCards(cards, 5, Constant.Rarity.Rare, Constant.Color.Colorless)); - } else if (id == 21) // Private Domain - { - CardList humanList = new CardList(); - - Card c = AllZone.getCardFactory().getCard("Strip Mine", AllZone.getHumanPlayer()); - - c.setCurSetCode(c.getMostRecentSet()); - c.setImageFilename(CardUtil.buildFilename(c)); - - humanList.add(c); - - qa.setHuman(humanList); - - String compySetupCards[] = {"Plains", "Island", "Swamp", "Mountain", "Forest"}; - - for (int i = 0; i < 5; i++) - qa.addCompy(compySetupCards[i]); - - qa.setCardRewardList(pack.generateCards(cards, 6, Constant.Rarity.Rare, null)); - } else if (id == 22) // Pied Piper - { - CardList humanList = new CardList(); - String humanSetupCards[] = {"Volunteer Militia", "Land Tax", "Elvish Farmer", "An-Havva Township"}; - - for (int i = 0; i < 4; i++) { - Card c = AllZone.getCardFactory().getCard(humanSetupCards[i], AllZone.getHumanPlayer()); - - c.setCurSetCode(c.getMostRecentSet()); - c.setImageFilename(CardUtil.buildFilename(c)); - - humanList.add(c); - } - qa.setHuman(humanList); - - String compySetupCards[] = {"Darksteel Citadel", "Relentless Rats"}; - - for (int i = 0; i < 2; i++) - qa.addCompy(compySetupCards[i]); - - qa.setCardRewardList(pack.generateCards(cards, 3, Constant.Rarity.Rare, null)); - } - - } - -}//QuestUtil diff --git a/src/forge/quest/data/bazaar/QuestStallDefinition.java b/src/forge/quest/data/bazaar/QuestStallDefinition.java deleted file mode 100644 index 36dd6fa76d4..00000000000 --- a/src/forge/quest/data/bazaar/QuestStallDefinition.java +++ /dev/null @@ -1,29 +0,0 @@ -package forge.quest.data.bazaar; - -/** - *

QuestStallDefinition class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestStallDefinition { - public String name; - public String displayName; - public String iconName; - public String fluff; - - /** - *

Constructor for QuestStallDefinition.

- * - * @param name a {@link java.lang.String} object. - * @param displayName a {@link java.lang.String} object. - * @param fluff a {@link java.lang.String} object. - * @param iconName a {@link java.lang.String} object. - */ - public QuestStallDefinition(String name, String displayName, String fluff, String iconName) { - this.name = name; - this.displayName = displayName; - this.fluff = fluff; - this.iconName = iconName; - } -} diff --git a/src/forge/quest/data/bazaar/QuestStallManager.java b/src/forge/quest/data/bazaar/QuestStallManager.java deleted file mode 100644 index bd16cc64c07..00000000000 --- a/src/forge/quest/data/bazaar/QuestStallManager.java +++ /dev/null @@ -1,143 +0,0 @@ -package forge.quest.data.bazaar; - -import forge.AllZone; - -import java.util.*; - -/** - *

QuestStallManager class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestStallManager { - - /** Constant stalls */ - static Map stalls; - /** Constant items */ - static Map> items; - - /** - *

buildStalls.

- */ - public static void buildStalls() { - stalls = new HashMap(); - stalls.put(ALCHEMIST, - new QuestStallDefinition(ALCHEMIST, - "Alchemist", - "The walls of this alchemist's stall are covered with shelves with potions, oils, " + - "powders, poultices and elixirs, each meticulously labeled.", - "BottlesIconSmall.png")); - stalls.put(BANKER, - new QuestStallDefinition(BANKER, - "Banker", - "A large book large enough to be seen from the outside rests on the Banker's desk.", - "CoinIconSmall.png")); - stalls.put(BOOKSTORE, - new QuestStallDefinition(BOOKSTORE, - "Bookstore", - "Tomes of different sizes are stacked in man-high towers.", - "BookIconSmall.png")); - stalls.put(GEAR, - new QuestStallDefinition(GEAR, - "Adventuring Gear", - "This adventurer's market has a tool for every need ... or so the plaque on the wall claims.", - "GearIconSmall.png")); - stalls.put(NURSERY, - new QuestStallDefinition(NURSERY, - "Nursery", - "The smells of the one hundred and one different plants forms a unique fragrance.", - "LeafIconSmall.png")); - stalls.put(PET_SHOP, - new QuestStallDefinition(PET_SHOP, - "Pet Shop", - "This large stall echoes with a multitude of animal noises.", - "FoxIconSmall.png")); - } - - /** - *

getStallNames.

- * - * @return a {@link java.util.List} object. - */ - public static List getStallNames() { - List ret = new ArrayList(); - ret.add(ALCHEMIST); - ret.add(BANKER); - ret.add(BOOKSTORE); - ret.add(GEAR); - ret.add(NURSERY); - ret.add(PET_SHOP); - return ret; - } - - /** - *

getStall.

- * - * @param stallName a {@link java.lang.String} object. - * @return a {@link forge.quest.data.bazaar.QuestStallDefinition} object. - */ - public static QuestStallDefinition getStall(String stallName) { - if (stalls == null) { - buildStalls(); - } - - return stalls.get(stallName); - } - - /** - *

buildItems.

- */ - public static void buildItems() { - SortedSet itemSet = new TreeSet(); - - itemSet.addAll(AllZone.getQuestData().getInventory().getItems()); - itemSet.addAll(AllZone.getQuestData().getPetManager().getPetsAndPlants()); - - items = new HashMap>(); - - for (String stallName : getStallNames()) { - items.put(stallName, new TreeSet()); - } - - for (QuestStallPurchasable purchasable : itemSet) { - items.get(purchasable.getStallName()).add(purchasable); - } - - } - - /** - *

Getter for the field items.

- * - * @param stallName a {@link java.lang.String} object. - * @return a {@link java.util.List} object. - */ - public static List getItems(String stallName) { - if (items == null) { - buildItems(); - } - - List ret = new ArrayList(); - - for (QuestStallPurchasable purchasable : items.get(stallName)) { - if (purchasable.isAvailableForPurchase()) { - ret.add(purchasable); - } - } - return ret; - } - - /** Constant ALCHEMIST="Alchemist" */ - public static final String ALCHEMIST = "Alchemist"; - /** Constant BANKER="Banker" */ - public static final String BANKER = "Banker"; - /** Constant BOOKSTORE="Bookstore" */ - public static final String BOOKSTORE = "Bookstore"; - /** Constant GEAR="Gear" */ - public static final String GEAR = "Gear"; - /** Constant NURSERY="Nursery" */ - public static final String NURSERY = "Nursery"; - /** Constant PET_SHOP="Pet Shop" */ - public static final String PET_SHOP = "Pet Shop"; - -} diff --git a/src/forge/quest/data/bazaar/QuestStallPurchasable.java b/src/forge/quest/data/bazaar/QuestStallPurchasable.java deleted file mode 100644 index 07afee21e64..00000000000 --- a/src/forge/quest/data/bazaar/QuestStallPurchasable.java +++ /dev/null @@ -1,57 +0,0 @@ -package forge.quest.data.bazaar; - -/** - * This interface defines a thing that can be sold at the Bazaar - * - * @author Forge - * @version $Id: $ - */ -public interface QuestStallPurchasable extends Comparable { - /** - *

getPurchaseName.

- * - * @return The Name of the item - */ - public String getPurchaseName(); - - /** - *

getPurchaseDescription.

- * - * @return an HTML formatted item description - */ - public String getPurchaseDescription(); - - /** - *

getImageName.

- * - * @return the name of the image that is displayed in the bazaar - */ - public String getImageName(); - - /** - *

getPrice.

- * - * @return the cost of the item in credits - */ - public int getPrice(); - - /** - * Returns if the item is available for purchase; - * - * @return true if the item can be displayed in a store - * false if the item should not be displayed in store since, for example, prerequisites are not met - */ - public boolean isAvailableForPurchase(); - - /** - * Executed when the item is bought - */ - public void onPurchase(); - - /** - *

getStallName.

- * - * @return the name of the stall form which this item can be purchased - */ - public String getStallName(); -} diff --git a/src/forge/quest/data/item/QuestInventory.java b/src/forge/quest/data/item/QuestInventory.java deleted file mode 100644 index be7f6e8b091..00000000000 --- a/src/forge/quest/data/item/QuestInventory.java +++ /dev/null @@ -1,120 +0,0 @@ -package forge.quest.data.item; - -import java.util.*; - -/** - *

QuestInventory class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestInventory { - Map inventory = new HashMap(); - - /** - *

Constructor for QuestInventory.

- */ - public QuestInventory() { - Set allItems = getAllItems(); - for (QuestItemAbstract item : allItems) { - inventory.put(item.getName(), item); - } - } - - /** - *

hasItem.

- * - * @param itemName a {@link java.lang.String} object. - * @return a boolean. - */ - public boolean hasItem(String itemName) { - return inventory.containsKey(itemName) && inventory.get(itemName).getLevel() > 0; - } - - /** - *

addItem.

- * - * @param item a {@link forge.quest.data.item.QuestItemAbstract} object. - */ - public void addItem(QuestItemAbstract item) { - inventory.put(item.getName(), item); - } - - /** - *

getItemLevel.

- * - * @param itemName a {@link java.lang.String} object. - * @return a int. - */ - public int getItemLevel(String itemName) { - QuestItemAbstract item = inventory.get(itemName); - if (item == null) { - return 0; - } - return item.getLevel(); - } - - /** - *

setItemLevel.

- * - * @param itemName a {@link java.lang.String} object. - * @param level a int. - */ - public void setItemLevel(String itemName, int level) { - inventory.get(itemName).setLevel(level); - } - - - /** - *

getAllItems.

- * - * @return a {@link java.util.Set} object. - */ - private static Set getAllItems() { - SortedSet set = new TreeSet(); - - set.add(new QuestItemElixir()); - set.add(new QuestItemEstates()); - set.add(new QuestItemLuckyCoin()); - set.add(new QuestItemMap()); - set.add(new QuestItemSleight()); - set.add(new QuestItemZeppelin()); - - return set; - } - - //Magic to support added pet types when reading saves. - /** - *

readResolve.

- * - * @return a {@link java.lang.Object} object. - */ - private Object readResolve() { - for (QuestItemAbstract item : getAllItems()) { - if (!inventory.containsKey(item.getName())) { - inventory.put(item.getName(), item); - } - } - return this; - } - - - /** - *

getItems.

- * - * @return a {@link java.util.Collection} object. - */ - public Collection getItems() { - return inventory.values(); - } - - /** - *

getItem.

- * - * @param itemName a {@link java.lang.String} object. - * @return a {@link forge.quest.data.item.QuestItemAbstract} object. - */ - public QuestItemAbstract getItem(String itemName) { - return inventory.get(itemName); - } -} diff --git a/src/forge/quest/data/item/QuestItemAbstract.java b/src/forge/quest/data/item/QuestItemAbstract.java deleted file mode 100644 index 5e85b5c0622..00000000000 --- a/src/forge/quest/data/item/QuestItemAbstract.java +++ /dev/null @@ -1,151 +0,0 @@ -package forge.quest.data.item; - -import forge.AllZone; -import forge.quest.data.bazaar.QuestStallPurchasable; - -/** - *

Abstract QuestItemAbstract class.

- * - * @author Forge - * @version $Id: $ - */ -public abstract class QuestItemAbstract implements QuestStallPurchasable { - private int level = 0; - private String name; - private String shopName; - private int maxLevel = 1; - - - /** - *

Constructor for QuestItemAbstract.

- * - * @param name a {@link java.lang.String} object. - * @param shopName a {@link java.lang.String} object. - */ - protected QuestItemAbstract(String name, String shopName) { - this.name = name; - this.shopName = shopName; - } - - /** - *

Constructor for QuestItemAbstract.

- * - * @param name a {@link java.lang.String} object. - * @param shopName a {@link java.lang.String} object. - * @param maxLevel a int. - */ - protected QuestItemAbstract(String name, String shopName, int maxLevel) { - this.name = name; - this.shopName = shopName; - this.maxLevel = maxLevel; - } - - /** - * This is the name shared across all item levels e.g., "Estates" - * - * @return a {@link java.lang.String} object. - */ - public final String getName() { - return name; - } - - /** - * This is the name used in purchasing the item e.g.,"Estates Training 1" - * - * @return a {@link java.lang.String} object. - */ - public String getPurchaseName() { - return name; - } - - /** - *

getStallName.

- * - * @return a {@link java.lang.String} object. - */ - public String getStallName() { - return shopName; - } - - - /** - * This method will be invoked when an item is bought in a shop. - */ - public void onPurchase() { - int currentLevel = AllZone.getQuestData().getInventory().getItemLevel(name); - AllZone.getQuestData().getInventory().setItemLevel(name, currentLevel + 1); - } - - - /** - *

isAvailableForPurchase.

- * - * @return a boolean. - */ - public boolean isAvailableForPurchase() { - return AllZone.getQuestData().getInventory().getItemLevel(name) < maxLevel; - } - - /** - *

Getter for the field level.

- * - * @return a int. - */ - public int getLevel() { - return level; - } - - /** - *

Setter for the field level.

- * - * @param level a int. - */ - public void setLevel(int level) { - this.level = level; - } - - /** - *

Getter for the field maxLevel.

- * - * @return a int. - */ - public int getMaxLevel() { - return maxLevel; - } - - /** - *

isLeveledItem.

- * - * @return a boolean. - */ - public boolean isLeveledItem() { - return maxLevel == 1; - } - - /** - *

getPurchaseDescription.

- * - * @return a {@link java.lang.String} object. - */ - public abstract String getPurchaseDescription(); - - /** - *

getImageName.

- * - * @return a {@link java.lang.String} object. - */ - public abstract String getImageName(); - - /** - *

getPrice.

- * - * @return a int. - */ - public abstract int getPrice(); - - /** {@inheritDoc} */ - public int compareTo(Object o) { - QuestStallPurchasable q = (QuestStallPurchasable) o; - return this.getPurchaseName().compareTo(q.getPurchaseName()); - } -} diff --git a/src/forge/quest/data/item/QuestItemElixir.java b/src/forge/quest/data/item/QuestItemElixir.java deleted file mode 100644 index 15d9568cace..00000000000 --- a/src/forge/quest/data/item/QuestItemElixir.java +++ /dev/null @@ -1,51 +0,0 @@ -package forge.quest.data.item; - -import forge.AllZone; -import forge.quest.data.bazaar.QuestStallManager; - -/** - * This item has special coding because of the - * - * @author Forge - * @version $Id: $ - */ -public class QuestItemElixir extends QuestItemAbstract { - - /** - *

Constructor for QuestItemElixir.

- */ - QuestItemElixir() { - super("Elixir of Life", QuestStallManager.ALCHEMIST, 15); - } - - /** {@inheritDoc} */ - @Override - public String getPurchaseDescription() { - return "Gives +1 to maximum life
Current Life: " + AllZone.getQuestData().getLife(); - } - - /** {@inheritDoc} */ - @Override - public String getImageName() { - return "ElixirIcon.png"; - } - - /** {@inheritDoc} */ - @Override - public int getPrice() { - if (getLevel() < 5) { - return 250; - } else if (getLevel() < 10) { - return 500; - } else { - return 750; - } - } - - /** {@inheritDoc} */ - @Override - public void onPurchase() { - AllZone.getQuestData().addLife(1); - } - -} diff --git a/src/forge/quest/data/item/QuestItemEstates.java b/src/forge/quest/data/item/QuestItemEstates.java deleted file mode 100644 index 1d2c3e43b4c..00000000000 --- a/src/forge/quest/data/item/QuestItemEstates.java +++ /dev/null @@ -1,45 +0,0 @@ -package forge.quest.data.item; - -import forge.quest.data.bazaar.QuestStallManager; - -/** - *

QuestItemEstates class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestItemEstates extends QuestItemAbstract { - /** - *

Constructor for QuestItemEstates.

- */ - QuestItemEstates() { - super("Estates", QuestStallManager.BANKER, 3); - } - - /** {@inheritDoc} */ - @Override - public String getPurchaseDescription() { - return String.format("Gives a bonus of %d%% to match winnings.
" + - "Improves sell percentage by %.2f%%.", (10 + getLevel() * 5), (1 + getLevel() * 0.75)); - } - - /** {@inheritDoc} */ - @Override - public String getImageName() { - return "GoldIconLarge.png"; - } - - /** {@inheritDoc} */ - @Override - public int getPrice() { - if (getLevel() == 0) { - return 500; - } else if (getLevel() == 1) { - return 750; - } else { - return 1000; - } - } - - -} diff --git a/src/forge/quest/data/item/QuestItemLuckyCoin.java b/src/forge/quest/data/item/QuestItemLuckyCoin.java deleted file mode 100644 index d8bd2bed016..00000000000 --- a/src/forge/quest/data/item/QuestItemLuckyCoin.java +++ /dev/null @@ -1,39 +0,0 @@ -package forge.quest.data.item; - -import forge.quest.data.bazaar.QuestStallManager; - -/** - *

QuestItemLuckyCoin class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestItemLuckyCoin extends QuestItemAbstract { - /** - *

Constructor for QuestItemLuckyCoin.

- */ - QuestItemLuckyCoin() { - super("Lucky Coin", QuestStallManager.BANKER); - } - - /** {@inheritDoc} */ - @Override - public String getPurchaseDescription() { - return "This coin is believed to give good luck to its owner.
" + - "Improves the chance of getting a random
rare after each match by 15%."; - } - - /** {@inheritDoc} */ - @Override - public String getImageName() { - return "CoinIcon.png"; - } - - /** {@inheritDoc} */ - @Override - public int getPrice() { - return 2000; - } - - -} diff --git a/src/forge/quest/data/item/QuestItemMap.java b/src/forge/quest/data/item/QuestItemMap.java deleted file mode 100644 index b783a43dfaa..00000000000 --- a/src/forge/quest/data/item/QuestItemMap.java +++ /dev/null @@ -1,43 +0,0 @@ -package forge.quest.data.item; - -import forge.quest.data.bazaar.QuestStallManager; - -/** - *

QuestItemMap class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestItemMap extends QuestItemAbstract { - /** - *

Constructor for QuestItemMap.

- */ - QuestItemMap() { - super("Map", QuestStallManager.GEAR); - } - - /** {@inheritDoc} */ - @Override - public String getPurchaseName() { - return "Adventurer's Map"; - } - - /** {@inheritDoc} */ - @Override - public String getPurchaseDescription() { - return "These ancient charts should facilitate navigation during your travels significantly.
" + - "Effect: Quest assignments become available more frequently."; - } - - /** {@inheritDoc} */ - @Override - public String getImageName() { - return "MapIconLarge.png"; - } - - /** {@inheritDoc} */ - @Override - public int getPrice() { - return 2000; - } -} diff --git a/src/forge/quest/data/item/QuestItemSleight.java b/src/forge/quest/data/item/QuestItemSleight.java deleted file mode 100644 index e9efe3717d4..00000000000 --- a/src/forge/quest/data/item/QuestItemSleight.java +++ /dev/null @@ -1,44 +0,0 @@ -package forge.quest.data.item; - -import forge.quest.data.bazaar.QuestStallManager; - -/** - *

QuestItemSleight class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestItemSleight extends QuestItemAbstract { - /** - *

Constructor for QuestItemSleight.

- */ - QuestItemSleight() { - super("Sleight", QuestStallManager.BOOKSTORE); - - } - - /** {@inheritDoc} */ - @Override - public String getImageName() { - return "BookIcon.png"; - } - - /** {@inheritDoc} */ - @Override - public int getPrice() { - return 2000; - } - - /** {@inheritDoc} */ - @Override - public String getPurchaseName() { - return "Sleight of Hand Vol. I"; - } - - /** {@inheritDoc} */ - @Override - public String getPurchaseDescription() { - return "These volumes explain how to perform the most difficult of sleights.
" + - "Effect: Your first mulligan is free"; - } -} diff --git a/src/forge/quest/data/item/QuestItemZeppelin.java b/src/forge/quest/data/item/QuestItemZeppelin.java deleted file mode 100644 index 9fc00f33bfd..00000000000 --- a/src/forge/quest/data/item/QuestItemZeppelin.java +++ /dev/null @@ -1,72 +0,0 @@ -package forge.quest.data.item; - -import forge.AllZone; -import forge.quest.data.bazaar.QuestStallManager; - -/** - *

QuestItemZeppelin class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestItemZeppelin extends QuestItemAbstract { - boolean zeppelinUsed = false; - - /** - *

Constructor for QuestItemZeppelin.

- */ - QuestItemZeppelin() { - super("Zeppelin", QuestStallManager.GEAR); - } - - /** {@inheritDoc} */ - @Override - public String getPurchaseName() { - return "Zeppelin"; - } - - /** {@inheritDoc} */ - @Override - public String getPurchaseDescription() { - return "This extremely comfortable airship allows for more efficient and safe travel
to faraway destinations.
" + - "Effect: Quest assignments become available more frequently
" + - "Effect: Adds +3 to max life during quest games.
" + - "Effect: Allows travel to far places, allowing you to see a new set of opponents"; - } - - /** {@inheritDoc} */ - @Override - public String getImageName() { - return "ZeppelinIcon.png"; - } - - /** {@inheritDoc} */ - @Override - public int getPrice() { - return 5000; - } - - /** {@inheritDoc} */ - @Override - public boolean isAvailableForPurchase() { - return super.isAvailableForPurchase() && AllZone.getQuestData().getInventory().hasItem("Map"); - } - - /** - *

hasBeenUsed.

- * - * @return a boolean. - */ - public boolean hasBeenUsed() { - return zeppelinUsed; - } - - /** - *

Setter for the field zeppelinUsed.

- * - * @param used a boolean. - */ - public void setZeppelinUsed(boolean used) { - this.zeppelinUsed = used; - } -} diff --git a/src/forge/quest/data/pet/QuestPetAbstract.java b/src/forge/quest/data/pet/QuestPetAbstract.java deleted file mode 100644 index 6b3b4cd2b97..00000000000 --- a/src/forge/quest/data/pet/QuestPetAbstract.java +++ /dev/null @@ -1,229 +0,0 @@ -package forge.quest.data.pet; - -import forge.AllZone; -import forge.Card; -import forge.quest.data.bazaar.QuestStallManager; -import forge.quest.data.bazaar.QuestStallPurchasable; - -/** - *

Abstract QuestPetAbstract class.

- * - * @author Forge - * @version $Id: $ - */ -public abstract class QuestPetAbstract implements QuestStallPurchasable { - int level; - private int maxLevel; - private String name; - private String description; - - /** - *

getPetCard.

- * - * @return a {@link forge.Card} object. - */ - public abstract Card getPetCard(); - - /** - *

getAllUpgradePrices.

- * - * @return an array of int. - */ - public abstract int[] getAllUpgradePrices(); - - /** - *

getPrice.

- * - * @return a int. - */ - public int getPrice() { - return getAllUpgradePrices()[level]; - } - - /** - *

getAllUpgradeDescriptions.

- * - * @return an array of {@link java.lang.String} objects. - */ - public abstract String[] getAllUpgradeDescriptions(); - - /** - *

getUpgradeDescription.

- * - * @return a {@link java.lang.String} object. - */ - public String getUpgradeDescription() { - return getAllUpgradeDescriptions()[level]; - } - - - /** - *

getAllImageNames.

- * - * @return an array of {@link java.lang.String} objects. - */ - public abstract String[] getAllImageNames(); - - /** - *

getImageName.

- * - * @return a {@link java.lang.String} object. - */ - public String getImageName() { - return getAllImageNames()[level]; - } - - /** - *

getAllStats.

- * - * @return an array of {@link java.lang.String} objects. - */ - public abstract String[] getAllStats(); - - /** - *

getStats.

- * - * @return a {@link java.lang.String} object. - */ - public String getStats() { - return getAllStats()[level]; - } - - /** - *

getUpgradedStats.

- * - * @return a {@link java.lang.String} object. - */ - public String getUpgradedStats() { - return getAllStats()[level + 1]; - } - - - /** - *

Getter for the field level.

- * - * @return a int. - */ - public int getLevel() { - return level; - } - - /** - *

incrementLevel.

- */ - public void incrementLevel() { - if (level < maxLevel) { - level++; - } - } - - /** - *

Getter for the field maxLevel.

- * - * @return a int. - */ - public int getMaxLevel() { - return maxLevel; - } - - /** - *

Constructor for QuestPetAbstract.

- * - * @param name a {@link java.lang.String} object. - * @param description a {@link java.lang.String} object. - * @param maxLevel a int. - */ - protected QuestPetAbstract(String name, String description, int maxLevel) { - this.description = description; - this.name = name; - this.maxLevel = maxLevel; - } - - /** - *

Setter for the field level.

- * - * @param level a int. - */ - public void setLevel(int level) { - this.level = level; - } - - /** - *

getPurchaseDescription.

- * - * @return a {@link java.lang.String} object. - */ - public String getPurchaseDescription() { - return "" + getDescription() + "
" + getUpgradeDescription() + - "

Current stats: " + getStats() + - "
Upgraded stats: " + getUpgradedStats(); - - } - - /** - *

Getter for the field description.

- * - * @return a {@link java.lang.String} object. - */ - public String getDescription() { - return description; - } - - /** - *

Getter for the field name.

- * - * @return a {@link java.lang.String} object. - */ - public String getName() { - return name; - } - - /** {@inheritDoc} */ - @Override - public String toString() { - return name; - } - - /** {@inheritDoc} */ - public int compareTo(Object o) { - return name.compareTo(o.toString()); - } - - /** - *

getPurchaseName.

- * - * @return a {@link java.lang.String} object. - */ - public String getPurchaseName() { - return name; - } - - /** - *

getStallName.

- * - * @return a {@link java.lang.String} object. - */ - public String getStallName() { - return QuestStallManager.PET_SHOP; - } - - /** - *

isAvailableForPurchase.

- * - * @return a boolean. - */ - public boolean isAvailableForPurchase() { - QuestPetAbstract pet = AllZone.getQuestData().getPetManager().getPet(name); - if (pet == null) { - return true; - } - return pet.level < pet.getMaxLevel(); - } - - /** - *

onPurchase.

- */ - public void onPurchase() { - AllZone.getQuestData().getPetManager().addPetLevel(name); - } -} diff --git a/src/forge/quest/data/pet/QuestPetBird.java b/src/forge/quest/data/pet/QuestPetBird.java deleted file mode 100644 index 7b4e73622b1..00000000000 --- a/src/forge/quest/data/pet/QuestPetBird.java +++ /dev/null @@ -1,101 +0,0 @@ -package forge.quest.data.pet; - -import forge.AllZone; -import forge.Card; - -/** - *

QuestPetBird class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestPetBird extends QuestPetAbstract { - /** {@inheritDoc} */ - @Override - public Card getPetCard() { - Card petCard = new Card(); - - petCard.setName("Bird Pet"); - petCard.setController(AllZone.getHumanPlayer()); - petCard.setOwner(AllZone.getHumanPlayer()); - - petCard.addColor("W"); - petCard.setToken(true); - - petCard.addType("Creature"); - petCard.addType("Bird"); - petCard.addType("Pet"); - - petCard.addIntrinsicKeyword("Flying"); - - - if (level == 1) { - petCard.setImageName("W 0 1 Bird Pet"); - petCard.setBaseAttack(0); - petCard.setBaseDefense(1); - } else if (level == 2) { - petCard.setImageName("W 1 1 Bird Pet"); - petCard.setBaseAttack(1); - petCard.setBaseDefense(1); - } else if (level == 3) { - petCard.setImageName("W 2 1 Bird Pet"); - petCard.setBaseAttack(2); - petCard.setBaseDefense(1); - } else if (level == 4) { - petCard.setImageName("W 2 1 Bird Pet First Strike"); - petCard.setBaseAttack(2); - petCard.setBaseDefense(1); - petCard.addIntrinsicKeyword("First Strike"); - } - - return petCard; - } - - /** - *

Constructor for QuestPetBird.

- */ - public QuestPetBird() { - super("Bird", - "Unmatched in speed, agility and awareness, this trained hawk makes a fantastic hunter.", - 4); - } - - /** {@inheritDoc} */ - @Override - public int[] getAllUpgradePrices() { - return new int[]{200, 300, 450, 400}; - } - - /** {@inheritDoc} */ - @Override - public String[] getAllUpgradeDescriptions() { - return new String[]{ - "Purchase Bird", - "Improve the attack power of your bird.", - "Improve the attack power of your bird.", - "Give First Strike to your bird.", - "You cannot train your bird any further"}; - } - - /** {@inheritDoc} */ - @Override - public String[] getAllStats() { - return new String[]{"You do not own a bird", - "0/1, W, Flying", - "1/1, W, Flying", - "2/1, W, Flying", - "2/1, W, Flying, First Strike"}; - } - - /** {@inheritDoc} */ - @Override - public String[] getAllImageNames() { - return new String[]{ - "", - "w_0_1_bird_pet_small.jpg", - "w_1_1_bird_pet_small.jpg", - "w_2_1_bird_pet_small.jpg", - "w_2_1_bird_pet_first_strike_small.jpg" - }; - } -} diff --git a/src/forge/quest/data/pet/QuestPetCrocodile.java b/src/forge/quest/data/pet/QuestPetCrocodile.java deleted file mode 100644 index cdedbad2a34..00000000000 --- a/src/forge/quest/data/pet/QuestPetCrocodile.java +++ /dev/null @@ -1,98 +0,0 @@ -package forge.quest.data.pet; - -import forge.AllZone; -import forge.Card; - -/** - *

QuestPetCrocodile class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestPetCrocodile extends QuestPetAbstract { - /** {@inheritDoc} */ - @Override - public Card getPetCard() { - Card petCard = new Card(); - petCard.setName("Crocodile Pet"); - petCard.setController(AllZone.getHumanPlayer()); - petCard.setOwner(AllZone.getHumanPlayer()); - - petCard.addColor("B"); - petCard.setToken(true); - - petCard.addType("Creature"); - petCard.addType("Crocodile"); - petCard.addType("Pet"); - - if (level == 1) { - petCard.setImageName("B 1 1 Crocodile Pet"); - petCard.setBaseAttack(1); - petCard.setBaseDefense(1); - } else if (level == 2) { - petCard.setImageName("B 2 1 Crocodile Pet"); - petCard.setBaseAttack(2); - petCard.setBaseDefense(1); - } else if (level == 3) { - petCard.setImageName("B 3 1 Crocodile Pet"); - petCard.setBaseAttack(3); - petCard.setBaseDefense(1); - } else if (level == 4) { - petCard.setImageName("B 3 1 Crocodile Pet Swampwalk"); - petCard.setBaseAttack(3); - petCard.setBaseDefense(1); - petCard.addIntrinsicKeyword("Swampwalk"); - } - - - return petCard; - } - - /** - *

Constructor for QuestPetCrocodile.

- */ - public QuestPetCrocodile() { - super("Crocodile", - "With its razor sharp teeth, this swamp-dwelling monster is extremely dangerous.", - 4); - } - - /** {@inheritDoc} */ - @Override - public int[] getAllUpgradePrices() { - return new int[]{250, 300, 450, 600}; - } - - /** {@inheritDoc} */ - @Override - public String[] getAllUpgradeDescriptions() { - return new String[]{ - "Purchase Crocodile", - "Improve the attack power of your crocodile.", - "Improve the attack power of your crocodile.", - "Give Swampwalking to your crocodile.", - "You cannot train your crocodile any further"}; - } - - /** {@inheritDoc} */ - @Override - public String[] getAllStats() { - return new String[]{"You do not own a crocodile", - "1/1, B", - "2/1, B", - "3/1, B", - "3/1, B, Swampwalking"}; - } - - /** {@inheritDoc} */ - @Override - public String[] getAllImageNames() { - return new String[]{ - "", - "b_1_1_crocodile_pet_small.jpg", - "b_2_1_crocodile_pet_small.jpg", - "b_3_1_crocodile_pet_small.jpg", - "b_3_1_crocodile_pet_swampwalk_small.jpg" - }; - } -} diff --git a/src/forge/quest/data/pet/QuestPetHound.java b/src/forge/quest/data/pet/QuestPetHound.java deleted file mode 100644 index b5d9d430383..00000000000 --- a/src/forge/quest/data/pet/QuestPetHound.java +++ /dev/null @@ -1,109 +0,0 @@ -package forge.quest.data.pet; - -import forge.AllZone; -import forge.Card; -import forge.card.abilityFactory.AbilityFactory; -import forge.card.trigger.Trigger; -import forge.card.trigger.TriggerHandler; - -/** - *

QuestPetHound class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestPetHound extends QuestPetAbstract { - /** - *

Constructor for QuestPetHound.

- */ - public QuestPetHound() { - super("Hound", "Dogs are said to be man's best friend. Definitely not this one.", 4); - } - - /** {@inheritDoc} */ - @Override - public Card getPetCard() { - Card petCard = new Card(); - - petCard.setName("Hound Pet"); - petCard.setController(AllZone.getHumanPlayer()); - petCard.setOwner(AllZone.getHumanPlayer()); - - petCard.addColor("R"); - petCard.setToken(true); - - petCard.addType("Creature"); - petCard.addType("Hound"); - petCard.addType("Pet"); - - if (level == 1) { - petCard.setImageName("R 1 1 Hound Pet"); - petCard.setBaseAttack(1); - petCard.setBaseDefense(1); - } else if (level == 2) { - petCard.setImageName("R 1 1 Hound Pet Haste"); - petCard.setBaseAttack(1); - petCard.setBaseDefense(1); - petCard.addIntrinsicKeyword("Haste"); - } else if (level == 3) { - petCard.setImageName("R 2 1 Hound Pet"); - petCard.setBaseAttack(2); - petCard.setBaseDefense(1); - petCard.addIntrinsicKeyword("Haste"); - - } else if (level == 4) { - petCard.setImageName("R 2 1 Hound Pet Alone"); - petCard.setBaseAttack(2); - petCard.setBaseDefense(1); - petCard.addIntrinsicKeyword("Haste"); - //petCard.addIntrinsicKeyword("Whenever this creature attacks alone, it gets +2/+0 until end of turn."); - - final Trigger myTrigger = TriggerHandler.parseTrigger("Mode$ Attacks | ValidCard$ Card.Self | Alone$ True | TriggerDescription$ Whenever CARDNAME attacks alone, it gets +2/+0 until end of turn.", petCard); - AbilityFactory af = new AbilityFactory(); - myTrigger.setOverridingAbility(af.getAbility("AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2", petCard)); - petCard.addTrigger(myTrigger); - } - - - return petCard; - } - - /** {@inheritDoc} */ - @Override - public int[] getAllUpgradePrices() { - return new int[]{200, 350, 450, 750}; - } - - /** {@inheritDoc} */ - @Override - public String[] getAllUpgradeDescriptions() { - return new String[]{ - "Purchase hound", - "Give Haste to your hound.", - "Improve the attack power of your hound.", - "Greatly improves your hound's attack power if it attacks alone.", - "You cannot train your hound any further"}; - } - - /** {@inheritDoc} */ - @Override - public String[] getAllStats() { - return new String[]{"You do not own a hound", - "1/1, R", - "1/1, R, Haste", - "2/1, R, Haste", - "2/1, R, Haste, Whenever this creature attacks alone, it gets +2/+0 until end of turn."}; - } - - /** {@inheritDoc} */ - @Override - public String[] getAllImageNames() { - return new String[]{ - "", - "r_1_1_hound_pet_small.jpg", - "r_1_1_hound_pet_haste_small.jpg", - "r_2_1_hound_pet_small.jpg", - "r_2_1_hound_pet_alone_small.jpg" - }; - } -} diff --git a/src/forge/quest/data/pet/QuestPetManager.java b/src/forge/quest/data/pet/QuestPetManager.java deleted file mode 100644 index 3986e241ad4..00000000000 --- a/src/forge/quest/data/pet/QuestPetManager.java +++ /dev/null @@ -1,181 +0,0 @@ -package forge.quest.data.pet; - -import java.util.*; - -/** - *

QuestPetManager class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestPetManager { - - public Map pets = new HashMap(); - public QuestPetAbstract selectedPet; - public QuestPetAbstract plant; - public boolean usePlant; - - /** - *

Constructor for QuestPetManager.

- */ - public QuestPetManager() { - plant = new QuestPetPlant(); - for (QuestPetAbstract pet : getAllPets()) { - addPet(pet); - } - } - - /** - *

Setter for the field selectedPet.

- * - * @param pet a {@link java.lang.String} object. - */ - public void setSelectedPet(String pet) { - selectedPet = (pet == null) ? null : getPet(pet); - } - - /** - *

Getter for the field selectedPet.

- * - * @return a {@link forge.quest.data.pet.QuestPetAbstract} object. - */ - public QuestPetAbstract getSelectedPet() { - return selectedPet; - } - - /** - *

Getter for the field plant.

- * - * @return a {@link forge.quest.data.pet.QuestPetAbstract} object. - */ - public QuestPetAbstract getPlant() { - return plant; - } - - /** - *

addPlantLevel.

- */ - public void addPlantLevel() { - if (plant == null) { - plant = new QuestPetPlant(); - } else { - plant.incrementLevel(); - } - } - - /** - *

getPet.

- * - * @param petName a {@link java.lang.String} object. - * @return a {@link forge.quest.data.pet.QuestPetAbstract} object. - */ - public QuestPetAbstract getPet(String petName) { - - return pets.get(petName); - } - - /** - *

addPet.

- * - * @param newPet a {@link forge.quest.data.pet.QuestPetAbstract} object. - */ - public void addPet(QuestPetAbstract newPet) { - pets.put(newPet.getName(), newPet); - } - - /** - *

getPetNames.

- * - * @return a {@link java.util.Set} object. - */ - public Set getPetNames() { - return pets.keySet(); - } - - /** - *

addPetLevel.

- * - * @param s a {@link java.lang.String} object. - */ - public void addPetLevel(String s) { - pets.get(s).incrementLevel(); - } - - /** - *

shouldPlantBeUsed.

- * - * @return a boolean. - */ - public boolean shouldPlantBeUsed() { - return usePlant; - } - - /** - *

shouldPetBeUsed.

- * - * @return a boolean. - */ - public boolean shouldPetBeUsed() { - return selectedPet != null; - } - - /** - *

getAllPets.

- * - * @return a {@link java.util.Set} object. - */ - private static Set getAllPets() { - SortedSet set = new TreeSet(); - - set.add(new QuestPetBird()); - set.add(new QuestPetCrocodile()); - set.add(new QuestPetHound()); - set.add(new QuestPetWolf()); - - return set; - } - - - /** - *

getAvailablePetNames.

- * - * @return a {@link java.util.Set} object. - */ - public Set getAvailablePetNames() { - SortedSet set = new TreeSet(); - for (Map.Entry pet : pets.entrySet()) { - if (pet.getValue().getLevel() > 0) { - set.add(pet.getKey()); - } - } - return set; - } - - - /** - *

getPetsAndPlants.

- * - * @return a {@link java.util.Collection} object. - */ - public Collection getPetsAndPlants() { - Set petsAndPlants = new HashSet(pets.values()); - petsAndPlants.add(plant); - - return petsAndPlants; - } - - //Magic to support added pet types when reading saves. - /** - *

readResolve.

- * - * @return a {@link java.lang.Object} object. - */ - private Object readResolve() { - for (QuestPetAbstract pet : getAllPets()) { - if (!pets.containsKey(pet.getName())) { - addPet(pet); - } - } - return this; - } -} diff --git a/src/forge/quest/data/pet/QuestPetPlant.java b/src/forge/quest/data/pet/QuestPetPlant.java deleted file mode 100644 index f47969ef849..00000000000 --- a/src/forge/quest/data/pet/QuestPetPlant.java +++ /dev/null @@ -1,167 +0,0 @@ -package forge.quest.data.pet; - -import forge.AllZone; -import forge.Card; -import forge.Constant; -import forge.card.spellability.Ability_Activated; -import forge.card.spellability.Cost; -import forge.card.spellability.SpellAbility; -import forge.quest.data.bazaar.QuestStallManager; - -/** - *

QuestPetPlant class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestPetPlant extends QuestPetAbstract { - /** {@inheritDoc} */ - @Override - public Card getPetCard() { - final Card petCard = new Card(); - - petCard.setName("Plant Wall"); - - petCard.setController(AllZone.getHumanPlayer()); - petCard.setOwner(AllZone.getHumanPlayer()); - - petCard.addColor("G"); - petCard.setToken(true); - - petCard.addType("Creature"); - petCard.addType("Plant"); - petCard.addType("Wall"); - - petCard.addIntrinsicKeyword("Defender"); - - if (level == 1) { - petCard.setImageName("G 0 1 Plant Wall"); - petCard.setBaseAttack(0); - petCard.setBaseDefense(1); - } else if (level == 2) { - petCard.setImageName("G 0 2 Plant Wall"); - petCard.setBaseAttack(0); - petCard.setBaseDefense(2); - } else if (level == 3) { - petCard.setImageName("G 0 3 Plant Wall"); - petCard.setBaseAttack(0); - petCard.setBaseDefense(3); - } else if (level == 4) { - petCard.setImageName("G 1 3 Plant Wall"); - petCard.setBaseAttack(1); - petCard.setBaseDefense(3); - // petCard.addIntrinsicKeyword("First Strike"); - } else if (level == 5) { - petCard.setImageName("G 1 3 Plant Wall Deathtouch"); - petCard.setBaseAttack(1); - petCard.setBaseDefense(3); - petCard.addIntrinsicKeyword("Deathtouch"); - } else if (level == 6) { - petCard.setImageName("G 1 4 Plant Wall"); - petCard.setBaseAttack(1); - petCard.setBaseDefense(4); - petCard.addIntrinsicKeyword("Deathtouch"); - - - Cost abCost = new Cost("T", petCard.getName(), true); - final SpellAbility ability = new Ability_Activated(petCard, abCost, null) { - private static final long serialVersionUID = 7546242087593613719L; - - @Override - public boolean canPlayAI() { - return AllZone.getPhase().getPhase().equals(Constant.Phase.Main2); - } - - @Override - public void resolve() { - petCard.getController().gainLife(1, petCard); - } - }; - petCard.addSpellAbility(ability); - ability.setDescription("tap: You gain 1 life."); - - StringBuilder sb = new StringBuilder(); - sb.append("Plant Wall - ").append(petCard.getController()).append(" gains 1 life."); - ability.setStackDescription(sb.toString()); - - petCard.setText("tap: You gain 1 life."); - } - - - return petCard; - } - - /** - *

Constructor for QuestPetPlant.

- */ - public QuestPetPlant() { - super("Plant", - "Start each of your battles with this lush, verdant plant on your side. Excellent at blocking the nastiest of critters!", - 6); - } - - /** {@inheritDoc} */ - @Override - public int[] getAllUpgradePrices() { - return new int[]{100, 150, 200, 300, 750, 1000}; - } - - /** {@inheritDoc} */ - @Override - public String[] getAllUpgradeDescriptions() { - return new String[]{ - "Purchase Plant", - "Improve the defense power of your plant.", - "Improve the defense power of your plant.", - "Improve the defense power of your plant.", - "Grow venomous thorns on your plant.", - "Improve the defense power of your plant and your plant will have healing properties", - "You cannot train your plant any further"}; - } - - /** {@inheritDoc} */ - @Override - public String[] getAllStats() { - return new String[]{"You do not own a plant", - "0/1, G, Defender", - "0/2, G, Defender", - "0/3, G, Defender", - "1/3, G, Defender", - "1/3, G, Defender, Deathtouch", - "1/4, G, Defender, Deathtouch, T: Gain 1 life"}; - } - - /** {@inheritDoc} */ - @Override - public String[] getAllImageNames() { - return new String[]{ - "", - "g_0_1_plant_wall_small.jpg", - "g_0_2_plant_wall_small.jpg", - "g_0_3_plant_wall_small.jpg", - "g_1_3_plant_wall_small.jpg", - "g_1_3_plant_wall_deathtouch_small", - "g_1_4_plant_wall_small.jpg" - }; - } - - /** {@inheritDoc} */ - @Override - public String getStallName() { - return QuestStallManager.NURSERY; - } - - /** {@inheritDoc} */ - @Override - public void onPurchase() { - AllZone.getQuestData().getPetManager().addPlantLevel(); - } - - /** {@inheritDoc} */ - @Override - public boolean isAvailableForPurchase() { - QuestPetPlant plant = (QuestPetPlant) AllZone.getQuestData().getPetManager().getPlant(); - - return plant == null || plant.getLevel() < plant.getMaxLevel(); - } -} diff --git a/src/forge/quest/data/pet/QuestPetWolf.java b/src/forge/quest/data/pet/QuestPetWolf.java deleted file mode 100644 index 743ef922bd4..00000000000 --- a/src/forge/quest/data/pet/QuestPetWolf.java +++ /dev/null @@ -1,98 +0,0 @@ -package forge.quest.data.pet; - -import forge.AllZone; -import forge.Card; - -/** - *

QuestPetWolf class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestPetWolf extends QuestPetAbstract { - /** {@inheritDoc} */ - @Override - public Card getPetCard() { - Card petCard = new Card(); - - petCard.setName("Wolf Pet"); - petCard.setController(AllZone.getHumanPlayer()); - petCard.setOwner(AllZone.getHumanPlayer()); - - petCard.addColor("G"); - petCard.setToken(true); - - petCard.addType("Creature"); - petCard.addType("Wolf"); - petCard.addType("Pet"); - - if (level == 1) { - petCard.setImageName("G 1 1 Wolf Pet"); - petCard.setBaseAttack(1); - petCard.setBaseDefense(1); - } else if (level == 2) { - petCard.setImageName("G 1 2 Wolf Pet"); - petCard.setBaseAttack(1); - petCard.setBaseDefense(2); - } else if (level == 3) { - petCard.setImageName("G 2 2 Wolf Pet"); - petCard.setBaseAttack(2); - petCard.setBaseDefense(2); - } else if (level == 4) { - petCard.setImageName("G 2 2 Wolf Pet Flanking"); - petCard.setBaseAttack(2); - petCard.setBaseDefense(2); - petCard.addIntrinsicKeyword("Flanking"); - } - - return petCard; - } - - /** - *

Constructor for QuestPetWolf.

- */ - public QuestPetWolf() { - super("Wolf", - "This ferocious animal may have been raised in captivity, but it has been trained to kill.", - 4); - } - - /** {@inheritDoc} */ - @Override - public int[] getAllUpgradePrices() { - return new int[]{250, 250, 500, 550}; - } - - /** {@inheritDoc} */ - @Override - public String[] getAllUpgradeDescriptions() { - return new String[]{ - "Purchase Wolf", - "Improve the attack power of your wolf.", - "Improve the defense power of your wolf.", - "Give Flanking to your wolf.", - "You cannot train your wolf any further"}; - } - - /** {@inheritDoc} */ - @Override - public String[] getAllStats() { - return new String[]{"You do not own a wolf", - "1/1, G", - "1/2, G", - "2/2, G", - "2/2, G, Flanking"}; - } - - /** {@inheritDoc} */ - @Override - public String[] getAllImageNames() { - return new String[]{ - "", - "g_1_1_wolf_pet_small.jpg", - "g_1_2_wolf_pet_small.jpg", - "g_2_2_wolf_pet_small.jpg", - "g_2_2_wolf_pet_flanking_small.jpg" - }; - } -} diff --git a/src/forge/quest/gui/QuestAbstractPanel.java b/src/forge/quest/gui/QuestAbstractPanel.java deleted file mode 100644 index 72c2373165e..00000000000 --- a/src/forge/quest/gui/QuestAbstractPanel.java +++ /dev/null @@ -1,30 +0,0 @@ -package forge.quest.gui; - -import javax.swing.*; - -/** - *

Abstract QuestAbstractPanel class.

- * - * @author Forge - * @version $Id: $ - */ -public abstract class QuestAbstractPanel extends JPanel { - /** Constant serialVersionUID=-6378675010346615367L */ - private static final long serialVersionUID = -6378675010346615367L; - - public QuestFrame mainFrame; - - /** - *

Constructor for QuestAbstractPanel.

- * - * @param mainFrame a {@link forge.quest.gui.QuestFrame} object. - */ - protected QuestAbstractPanel(QuestFrame mainFrame) { - this.mainFrame = mainFrame; - } - - /** - *

refreshState.

- */ - public abstract void refreshState(); -} diff --git a/src/forge/quest/gui/QuestFrame.java b/src/forge/quest/gui/QuestFrame.java deleted file mode 100644 index ac3a46f80e2..00000000000 --- a/src/forge/quest/gui/QuestFrame.java +++ /dev/null @@ -1,106 +0,0 @@ -package forge.quest.gui; - -import forge.AllZone; -import forge.Gui_NewGame; -import forge.gui.GuiUtils; -import forge.quest.gui.bazaar.QuestBazaarPanel; -import forge.quest.gui.main.QuestMainPanel; - -import javax.swing.*; -import javax.swing.border.EmptyBorder; -import java.awt.*; -import java.util.HashMap; -import java.util.Map; - -/** - *

QuestFrame class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestFrame extends JFrame { - /** Constant serialVersionUID=-2832625381531838412L */ - private static final long serialVersionUID = -2832625381531838412L; - - JPanel visiblePanel; - CardLayout questLayout; - - /** Constant MAIN_PANEL="Main" */ - public static final String MAIN_PANEL = "Main"; - /** Constant BAZAAR_PANEL="Bazaar" */ - public static final String BAZAAR_PANEL = "Bazaar"; - - Map subPanelMap = new HashMap(); - - /** - *

Constructor for QuestFrame.

- * - * @throws java.awt.HeadlessException if any. - */ - public QuestFrame() throws HeadlessException { - this.setTitle("Quest Mode"); - - visiblePanel = new JPanel(new BorderLayout()); - visiblePanel.setBorder(new EmptyBorder(2, 2, 2, 2)); - questLayout = new CardLayout(); - visiblePanel.setLayout(questLayout); - - QuestAbstractPanel newPanel = new QuestMainPanel(this); - visiblePanel.add(newPanel, MAIN_PANEL); - subPanelMap.put(MAIN_PANEL, newPanel); - - newPanel = new QuestBazaarPanel(this); - visiblePanel.add(newPanel, BAZAAR_PANEL); - subPanelMap.put(BAZAAR_PANEL, newPanel); - - - this.getContentPane().setLayout(new BorderLayout()); - this.getContentPane().add(visiblePanel, BorderLayout.CENTER); - this.setPreferredSize(new Dimension(1024, 768)); - this.setMinimumSize(new Dimension(800, 600)); - - questLayout.show(visiblePanel, MAIN_PANEL); - - this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); - this.pack(); - this.setVisible(true); - - GuiUtils.centerFrame(this); - - } - - - /** - *

showPane.

- * - * @param paneName a {@link java.lang.String} object. - */ - private void showPane(String paneName) { - subPanelMap.get(paneName).refreshState(); - questLayout.show(visiblePanel, paneName); - } - - /** - *

showMainPane.

- */ - public void showMainPane() { - showPane(MAIN_PANEL); - } - - /** - *

showBazaarPane.

- */ - public void showBazaarPane() { - showPane(BAZAAR_PANEL); - } - - - /** - *

returnToMainMenu.

- */ - public void returnToMainMenu() { - AllZone.getQuestData().saveData(); - (new Gui_NewGame()).setVisible(true); - this.dispose(); - } -} diff --git a/src/forge/quest/gui/bazaar/QuestBazaarItem.java b/src/forge/quest/gui/bazaar/QuestBazaarItem.java deleted file mode 100644 index 0a2f573280a..00000000000 --- a/src/forge/quest/gui/bazaar/QuestBazaarItem.java +++ /dev/null @@ -1,140 +0,0 @@ -package forge.quest.gui.bazaar; - - -import forge.AllZone; -import forge.gui.GuiUtils; -import forge.gui.MultiLineLabel; -import forge.quest.data.bazaar.QuestStallPurchasable; - -import javax.swing.*; -import javax.swing.border.CompoundBorder; -import javax.swing.border.EmptyBorder; -import javax.swing.border.LineBorder; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - - -/** - *

QuestBazaarItem class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestBazaarItem { - - QuestStallPurchasable item; - - /** - *

Constructor for QuestBazaarItem.

- * - * @param purchasable a {@link forge.quest.data.bazaar.QuestStallPurchasable} object. - */ - protected QuestBazaarItem(QuestStallPurchasable purchasable) { - this.item = purchasable; - } - - /** - * Invoked by the Bazaar UI when the item is purchased. The credits of the item should not be deducted here. - */ - public void purchaseItem() { - item.onPurchase(); - } - - /** - *

getItemPanel.

- * - * @return a {@link javax.swing.JPanel} object. - */ - protected final JPanel getItemPanel() { - ImageIcon icon = GuiUtils.getIconFromFile(item.getImageName()); - if (icon == null) { - // The original size was only 40 x 40 pixels. - // Increased the size to give added pixels for more detail. - icon = GuiUtils.getEmptyIcon(80, 80); - } - // The original size was only 40 x 40 pixels. - // Increased the size to give added pixels for more detail. - ImageIcon resizedImage = GuiUtils.getResizedIcon(icon, 80, 80); - - JLabel iconLabel = new JLabel(resizedImage); - iconLabel.setBorder(new LineBorder(Color.BLACK)); - JPanel iconPanel = new JPanel(new BorderLayout()); - iconPanel.add(iconLabel, BorderLayout.NORTH); - - JLabel nameLabel = new JLabel(item.getPurchaseName()); - nameLabel.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 14)); - - JLabel descriptionLabel = new MultiLineLabel("" + item.getPurchaseDescription() + ""); - descriptionLabel.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 12)); - - JLabel priceLabel = new JLabel("Cost: " + item.getPrice() + " credits"); - priceLabel.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 12)); - - - JButton purchaseButton = new JButton("Buy"); - purchaseButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - AllZone.getQuestData().subtractCredits(item.getPrice()); - purchaseItem(); - AllZone.getQuestData().saveData(); - QuestBazaarPanel.refreshLastInstance(); - } - }); - - if (AllZone.getQuestData().getCredits() < item.getPrice()) { - purchaseButton.setEnabled(false); - } - - JPanel itemPanel = new JPanel() { - private static final long serialVersionUID = -5182857296365949682L; - - @Override - public Dimension getPreferredSize() { - Dimension realSize = super.getPreferredSize(); - realSize.width = 100; - return realSize; - } - }; - GridBagLayout layout = new GridBagLayout(); - itemPanel.setLayout(layout); - - GridBagConstraints constraints = new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.CENTER, - GridBagConstraints.NONE, new Insets(2, 2, 2, 2), 0, 0); - - constraints.gridheight = GridBagConstraints.REMAINDER; - layout.setConstraints(iconLabel, constraints); - itemPanel.add(iconLabel); - - constraints.gridheight = 1; - constraints.gridx = 1; - constraints.weightx = 1; - constraints.fill = GridBagConstraints.HORIZONTAL; - - layout.setConstraints(nameLabel, constraints); - itemPanel.add(nameLabel); - - constraints.gridy = 1; - layout.setConstraints(descriptionLabel, constraints); - itemPanel.add(descriptionLabel); - - constraints.gridy = 2; - layout.setConstraints(priceLabel, constraints); - itemPanel.add(priceLabel); - - constraints.gridy = 2; - constraints.gridx = 2; - constraints.fill = GridBagConstraints.NONE; - constraints.gridheight = 1; - constraints.weightx = 0; - layout.setConstraints(purchaseButton, constraints); - itemPanel.add(purchaseButton); - - itemPanel.setBorder(new CompoundBorder(new LineBorder(Color.BLACK, 1), new EmptyBorder(5, 5, 5, 5))); - - itemPanel.setMinimumSize(new Dimension(0, 0)); - - - return itemPanel; - } -} diff --git a/src/forge/quest/gui/bazaar/QuestBazaarPanel.java b/src/forge/quest/gui/bazaar/QuestBazaarPanel.java deleted file mode 100644 index 9b0f47ff798..00000000000 --- a/src/forge/quest/gui/bazaar/QuestBazaarPanel.java +++ /dev/null @@ -1,144 +0,0 @@ -package forge.quest.gui.bazaar; - -import forge.quest.data.bazaar.QuestStallManager; -import forge.quest.gui.QuestAbstractPanel; -import forge.quest.gui.QuestFrame; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; - -/** - *

QuestBazaarPanel class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestBazaarPanel extends QuestAbstractPanel { - /** Constant serialVersionUID=1418913010051869222L */ - private static final long serialVersionUID = 1418913010051869222L; - - /** Constant stallList */ - static List stallList = new ArrayList(); - - JPanel buttonPanel = new JPanel(new BorderLayout()); - JPanel buttonPanelMain = new JPanel(); - - JPanel stallPanel = new JPanel(); - - JToggleButton selectedStall = null; - - CardLayout stallLayout = new CardLayout(); - - /** - *

Constructor for QuestBazaarPanel.

- * - * @param mainFrame a {@link forge.quest.gui.QuestFrame} object. - */ - public QuestBazaarPanel(QuestFrame mainFrame) { - super(mainFrame); - this.setLayout(new BorderLayout()); - - stallList = new ArrayList(); - - for (String stallName : QuestStallManager.getStallNames()) { - stallList.add(new QuestBazaarStall(QuestStallManager.getStall(stallName))); - } - - buttonPanelMain.setLayout(new GridLayout(stallList.size(), 1)); - - stallPanel.setLayout(stallLayout); - List buttonList = new LinkedList(); - - double maxWidth = 0; - double maxHeight = 0; - - for (QuestBazaarStall stall : stallList) { - JToggleButton stallButton = new JToggleButton(stall.getStallName(), stall.getStallIcon()); - stallButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - - if (QuestBazaarPanel.this.selectedStall == e.getSource()) { - QuestBazaarPanel.this.selectedStall.setSelected(true); - return; - } - - if (QuestBazaarPanel.this.selectedStall != null) { - QuestBazaarPanel.this.selectedStall.setSelected(false); - } - - QuestBazaarPanel.this.showStall(((JToggleButton) e.getSource()).getText()); - QuestBazaarPanel.this.selectedStall = (JToggleButton) e.getSource(); - } - }); - - Dimension preferredSize = stallButton.getPreferredSize(); - - if (preferredSize.getWidth() > maxWidth) { - maxWidth = preferredSize.getWidth(); - } - - if (preferredSize.getHeight() > maxHeight) { - maxHeight = preferredSize.getHeight(); - } - - buttonList.add(stallButton); - - buttonPanelMain.add(stallButton); - stallPanel.add(stall, stall.getStallName()); - } - - buttonList.get(0).setSelected(true); - this.selectedStall = buttonList.get(0); - - Dimension max = new Dimension((int) maxWidth, (int) maxHeight); - - for (JToggleButton button : buttonList) { - button.setMinimumSize(max); - } - - - buttonPanel.add(buttonPanelMain, BorderLayout.NORTH); - JButton quitButton = new JButton("Leave Bazaar"); - quitButton.setSize(max); - quitButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - QuestBazaarPanel.this.mainFrame.showMainPane(); - } - }); - - buttonPanel.add(quitButton, BorderLayout.SOUTH); - - this.add(buttonPanel, BorderLayout.WEST); - this.add(stallPanel, BorderLayout.CENTER); - - } - - /** - *

showStall.

- * - * @param source a {@link java.lang.String} object. - */ - private void showStall(String source) { - stallLayout.show(stallPanel, source); - } - - /** - * Slightly hackish, but should work. - */ - static void refreshLastInstance() { - for (QuestBazaarStall stall : stallList) { - stall.updateItems(); - } - } - - /** {@inheritDoc} */ - @Override - public void refreshState() { - refreshLastInstance(); - } -} diff --git a/src/forge/quest/gui/bazaar/QuestBazaarStall.java b/src/forge/quest/gui/bazaar/QuestBazaarStall.java deleted file mode 100644 index 93e98b2a4db..00000000000 --- a/src/forge/quest/gui/bazaar/QuestBazaarStall.java +++ /dev/null @@ -1,231 +0,0 @@ -package forge.quest.gui.bazaar; - -import forge.AllZone; -import forge.gui.GuiUtils; -import forge.properties.NewConstants; -import forge.quest.data.QuestData; -import forge.quest.data.bazaar.QuestStallDefinition; -import forge.quest.data.bazaar.QuestStallManager; -import forge.quest.data.bazaar.QuestStallPurchasable; - -import javax.swing.*; -import javax.swing.border.EmptyBorder; -import java.awt.*; -import java.util.ArrayList; - -/** - *

QuestBazaarStall class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestBazaarStall extends JPanel implements NewConstants { - /** Constant serialVersionUID=-4147745071116906043L */ - private static final long serialVersionUID = -4147745071116906043L; - String name; - String stallName; - String fluff; - ImageIcon icon; - - - private JLabel creditLabel = new JLabel(); - private JPanel inventoryPanel = new JPanel(); - - protected QuestData questData = AllZone.getQuestData(); - - /** - *

Constructor for QuestBazaarStall.

- * - * @param name a {@link java.lang.String} object. - * @param stallName a {@link java.lang.String} object. - * @param iconName a {@link java.lang.String} object. - * @param fluff a {@link java.lang.String} object. - */ - protected QuestBazaarStall(String name, String stallName, String iconName, String fluff) { - this.name = name; - this.fluff = fluff; - this.icon = GuiUtils.getIconFromFile(iconName); - this.stallName = stallName; - - initUI(); - - } - - /** - *

Constructor for QuestBazaarStall.

- * - * @param definition a {@link forge.quest.data.bazaar.QuestStallDefinition} object. - */ - protected QuestBazaarStall(QuestStallDefinition definition) { - this.fluff = definition.fluff; - this.icon = GuiUtils.getIconFromFile(definition.iconName); - this.stallName = definition.displayName; - this.name = definition.name; - initUI(); - } - - /** - *

initUI.

- */ - private void initUI() { - this.removeAll(); - - JLabel stallNameLabel; - - GridBagLayout layout = new GridBagLayout(); - this.setLayout(layout); - - stallNameLabel = new JLabel(stallName); - stallNameLabel.setFont(new Font("sserif", Font.BOLD, 22)); - stallNameLabel.setHorizontalAlignment(SwingConstants.CENTER); - - creditLabel.setText("Credits: " + questData.getCredits()); - creditLabel.setFont(new Font("sserif", 0, 14)); - - JTextArea fluffArea = new JTextArea(fluff); - fluffArea.setFont(new Font("sserif", Font.ITALIC, 14)); - fluffArea.setLineWrap(true); - fluffArea.setWrapStyleWord(true); - fluffArea.setOpaque(false); - fluffArea.setEditable(false); - fluffArea.setFocusable(false); - fluffArea.setPreferredSize(new Dimension(fluffArea.getPreferredSize().width, 40)); - GridBagConstraints constraints = new GridBagConstraints(0, - 0, - 1, - 1, - 1, - 0, - GridBagConstraints.CENTER, - GridBagConstraints.NONE, - new Insets(2, 2, 2, 2), - 0, - 0); - layout.setConstraints(stallNameLabel, constraints); - this.add(stallNameLabel); - - constraints.gridy = 1; - constraints.anchor = GridBagConstraints.WEST; - constraints.fill = GridBagConstraints.HORIZONTAL; - layout.setConstraints(fluffArea, constraints); - this.add(fluffArea); - - constraints.gridy = 2; - layout.setConstraints(creditLabel, constraints); - this.add(creditLabel); - - constraints.gridy = 3; - constraints.anchor = GridBagConstraints.NORTHWEST; - constraints.fill = GridBagConstraints.BOTH; - constraints.insets = new Insets(10, 5, 10, 5); - constraints.weighty = 1; - constraints.weightx = GridBagConstraints.REMAINDER; - - populateInventory(populateItems()); - - JScrollPane scrollPane = new JScrollPane(inventoryPanel); - scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - scrollPane.setBorder(new EmptyBorder(0, 0, 0, 0)); - layout.setConstraints(scrollPane, constraints); - this.add(scrollPane); - - this.setBorder(new EmptyBorder(0, 5, 0, 0)); - } - - /** - *

populateInventory.

- * - * @param stallItems a {@link java.util.List} object. - */ - private void populateInventory(java.util.List stallItems) { - inventoryPanel.removeAll(); - - GridBagLayout innerLayout = new GridBagLayout(); - inventoryPanel.setLayout(innerLayout); - GridBagConstraints innerConstraints = - new GridBagConstraints(0, - 0, - 1, - 1, - 1, - 0, - GridBagConstraints.NORTHWEST, - GridBagConstraints.HORIZONTAL, - new Insets(2, 2, 2, 2), - 0, - 0); - - JLabel purchaseLabel = new JLabel(); - - if (stallItems.size() == 0) { - - purchaseLabel.setText("The merchant does not have anything useful for sale"); - inventoryPanel.add(purchaseLabel); - innerConstraints.gridy++; - } else { - - innerConstraints.insets = new Insets(5, 20, 5, 5); - for (QuestBazaarItem item : stallItems) { - JPanel itemPanel = item.getItemPanel(); - - innerLayout.setConstraints(itemPanel, innerConstraints); - inventoryPanel.add(itemPanel); - innerConstraints.gridy++; - } - } - innerConstraints.weighty = 1; - JLabel fillLabel = new JLabel(); - - innerLayout.setConstraints(fillLabel, innerConstraints); - inventoryPanel.add(fillLabel); - } - - /** - *

populateItems.

- * - * @return a {@link java.util.List} object. - */ - protected java.util.List populateItems() { - java.util.List ret = new ArrayList(); - java.util.List purchasables = QuestStallManager.getItems(name); - - for (QuestStallPurchasable purchasable : purchasables) { - ret.add(new QuestBazaarItem(purchasable)); - } - - return ret; - } - - - /** - *

getStallIcon.

- * - * @return a {@link javax.swing.ImageIcon} object. - */ - public ImageIcon getStallIcon() { - return icon; - } - - /** - *

Getter for the field stallName.

- * - * @return a {@link java.lang.String} object. - */ - public String getStallName() { - return stallName; - } - - /** - *

updateItems.

- */ - public void updateItems() { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - populateInventory(populateItems()); - creditLabel.setText("Credits: " + questData.getCredits()); - inventoryPanel.invalidate(); - inventoryPanel.repaint(); - } - }); - } -} diff --git a/src/forge/quest/gui/main/QuestBattle.java b/src/forge/quest/gui/main/QuestBattle.java deleted file mode 100644 index 2c67b22a4f5..00000000000 --- a/src/forge/quest/gui/main/QuestBattle.java +++ /dev/null @@ -1,503 +0,0 @@ -package forge.quest.gui.main; - - -import forge.gui.GuiUtils; -import forge.quest.data.QuestBattleManager; - -import javax.swing.*; -import java.util.ArrayList; -import java.util.List; -import java.util.TreeMap; - -/** - *

QuestBattle class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestBattle extends QuestSelectablePanel { - /** Constant serialVersionUID=3112668476017792084L */ - private static final long serialVersionUID = 3112668476017792084L; - - /** Constant nameDeckMap */ - static TreeMap nameDeckMap = new TreeMap(); - - String deckName; - - static { - buildDeckList(); - } - - /** - *

buildDeckList.

- */ - private static void buildDeckList() { - //TODO: Build this list dynamically from the deck files. - - addToDeckList("Abraham Lincoln 3", "hard", "WUR flying creatures deck with Flamebreak and Earthquake"); - addToDeckList("Albert Einstein 2", "medium", "WG deck with Garruk Wildspeaker, Needle Storm and Retribution of the Meek"); - addToDeckList("Albert Einstein 3", "hard", "WG deck with Garruk Wildspeaker, Needle Storm and Retribution of the Meek"); - addToDeckList("Alice in Wonderland 2", "medium", "WG Lands deck with manlands, cycle lands and Life from the Loam"); - addToDeckList("Alice in Wonderland 3", "hard", "WG Lands deck with manlands, cycle lands and Life from the Loam"); - addToDeckList("Apu Nahasapeemapetilon 2", "medium", "WG persist deck with Heartmender and Juniper Order Ranger"); - addToDeckList("Aquaman 1", "easy", "WU Control deck"); - addToDeckList("Aquaman 2", "medium", "WU Caw-Blade deck"); - addToDeckList("Aquaman 3", "hard", "WU Caw-Blade deck"); - addToDeckList("Aragorn 1", "medium", "WBRG Landfall deck"); - addToDeckList("Aragorn 2", "medium", "WUBRG Landfall deck"); -// addToDeckList("Ash 1", "easy", "WB Singleton deck"); -// addToDeckList("Ash 2", "medium", "WB Singleton deck"); -// addToDeckList("Ash 3", "hard", "WB Oversold Cemetery deck"); -// addToDeckList("Atomic Robo 1", "easy", "Artifact Singleton deck"); -// addToDeckList("Atomic Robo 2", "medium", "Artifact Singleton deck"); - addToDeckList("Atomic Robo 3", "hard", "UB artifact sacrifice deck with Thopter Foundry and Sword of the Meek"); - - addToDeckList("Bamm Bamm Rubble 1", "easy", "WUBRG Domain deck"); - addToDeckList("Barney Rubble 1", "easy", "WU Sovereigns of Lost Alara deck with walls and auras"); - addToDeckList("Barney Rubble 2", "medium", "WU Sovereigns of Lost Alara deck with walls and auras"); - addToDeckList("Barney Rubble 3", "hard", "WU Sovereigns of Lost Alara deck with walls and auras"); - addToDeckList("Bart Simpson 1", "easy", "UBG deck with Rathi Trapper and Paralyzing Grasp"); - addToDeckList("Bart Simpson 2", "medium", "WUG deck with Minister of Impediments and Paralyzing Grasp"); - addToDeckList("Bart Simpson 3", "hard", "WUG deck with Harrier Griffin and Entangling Vines"); - addToDeckList("Batman 3", "hard", "RG Valakut Titan deck"); -// addToDeckList("Bear 1", "easy", "G Bear theme deck"); -// addToDeckList("Bear 2", "medium", "2/2s with abilities deck"); -// addToDeckList("Bear 3", "hard", "Token 2/2s, a lot of Token 2/2s deck"); -// addToDeckList("Beast 2", "medium", "GR Furnace Celebration deck"); -// addToDeckList("Beast 3", "hard", "UWB Standard Constructed deck"); - addToDeckList("Bela Lugosi 3", "hard", "Mono B Vampire Aggro deck"); - addToDeckList("Betty Rubble 3", "hard", "BRG Hand of Emrakul deck with Broodwarden and Eldrazi Spawn tokens"); - addToDeckList("Blackbeard 3", "hard", "Mono W Soldiers deck with Preeminent Captain, Captain of the Watch and Daru Warchief"); - addToDeckList("Boba Fett 3", "hard", "WRG Dragons deck with Chandra Nalaar, Crucible of Fire and Dragon Roost"); - addToDeckList("Boris Karloff 3", "hard", "WR Boros Aggro deck with Kors, levelers and threat removal"); - addToDeckList("Boromir 2", "medium", "Mono G Elvish Piper deck with Quicksilver Amulet and huge creatures"); - addToDeckList("Boromir 3", "hard", "Mono G Elvish Piper deck with Quicksilver Amulet and huge creatures"); - addToDeckList("Boromir 4", "very hard", "UG Show and Tell deck with huge creatures"); - addToDeckList("Bridge Troll 3", "hard", "Mono B Quest for the Nihil Stone deck with The Rack and Bottomless Pit"); -// addToDeckList("Brood 2", "medium", "W Battlecry deck"); - addToDeckList("Buffy 1", "easy", "Mono B Zombie deck"); - addToDeckList("Buffy 2", "medium", "Mono B Zombie deck"); - addToDeckList("Buffy 3", "hard", "Mono B Zombie deck"); - - addToDeckList("C3PO 1", "easy", "BR Goblin deck with Goblin Ringleader, Mad Auntie and Sensation Gorger"); - addToDeckList("C3PO 2", "medium", "BR Goblin deck with Goblin Ringleader, Kiki-Jiki, Mad Auntie and Sensation Gorger"); - addToDeckList("C3PO 3", "hard", "BR Goblin deck with Goblin Ringleader, Kiki-Jiki, Mad Auntie and Sensation Gorger"); -// addToDeckList("Cable 2", "medium", "UR Artifact deck"); -// addToDeckList("Cable 3", "hard", "R Artifact deck deck"); - addToDeckList("Captain America 2", "medium", "Bant Exalted deck"); - addToDeckList("Captain America 3", "hard", "Bant Exalted deck"); - addToDeckList("Catwoman 1", "easy", "WG Cat deck with Kjeldoran War Cry"); - addToDeckList("Catwoman 2", "medium", "WRG Cat deck with Lightning Helix"); - addToDeckList("Cave Troll 3", "hard", "Mono B Quest for the Nihil Stone deck with The Rack, Bottomless Pit and Nyxathid"); -// addToDeckList("Colbert 2", "medium", "WG Cats deck"); -// addToDeckList("Colbert 3", "hard", "WUR Extended deck"); -// addToDeckList("Colossus 2", "medium", "RG Changeling deck"); -// addToDeckList("Colossus 3", "hard", "UG Standard Constructed deck"); - addToDeckList("Comic Book Guy 3", "hard", "WR deck with Roc and Rukh Eggs, Flamebrake, Earthquake and Auriok Champion"); - addToDeckList("Conan the Barbarian 1", "easy", "BRG Barbarian deck with Balthor the Stout and Spellgorger Barbarian"); - addToDeckList("Conan the Barbarian 2", "medium", "BRG Barbarian deck with Lovisa Coldeyes, Balthor the Stout and weapons"); - addToDeckList("Cow 1", "easy", "Mono R Minotaur deck"); -// addToDeckList("Conan 3", "hard", "Red monsters deck"); - addToDeckList("Crocodile Dundee 1", "easy", "Mono R deck with Mudbrawler Cohort and Bloodmark Mentor"); - addToDeckList("Crocodile Dundee 2", "medium", "Mono R deck with Mudbrawler Cohort and Bloodmark Mentor"); - addToDeckList("Crocodile Dundee 3", "hard", "Mono R deck with Mudbrawler Cohort and Bloodmark Mentor"); - addToDeckList("Cyclops 2", "medium", "WUBRG Sliver deck with four copies of almost every sliver"); - addToDeckList("Cyclops 3", "hard", "WUBRG Sliver deck with a few spells"); - - addToDeckList("Da Vinci 1", "easy", "Mono B deck with Ashenmoor Cohort, Badmoon and some Fear"); - addToDeckList("Da Vinci 2", "medium", "Mono B deck with Korlash, Heir to Blackblade, Badmoon and threat removal"); - addToDeckList("Da Vinci 3", "hard", "Mono B deck with Korlash, Heir to Blackblade, Badmoon and threat removal"); -// addToDeckList("Darkseid 2", "medium", "B Sacrifice"); - addToDeckList("Darrin Stephens 1", "easy", "Mono U Affinity deck with Affinity for artifacts and Modular cards"); - addToDeckList("Darrin Stephens 2", "medium", "Mono U Affinity deck with Affinity for artifacts and Modular cards"); - addToDeckList("Darrin Stephens 3", "hard", "Mono U Affinity deck with Affinity for artifacts and Modular cards"); - addToDeckList("Darrin Stephens 4", "very hard", "Mono U Affinity deck"); - addToDeckList("Darth Vader 3", "hard", "WU Battle of Wits style alternate win type deck with WoG"); - addToDeckList("Data 3", "hard", "WB Swampwalk Karma deck with Contaminated Ground and Crusading Knight"); - addToDeckList("Deadpool 2", "medium", "BR deck with Ashenmoor Liege and Grixis Grimblade"); - addToDeckList("Deadpool 3", "hard", "BR deck with Ashenmoor Liege and Grixis Grimblade"); - addToDeckList("Demon 3", "hard", "Mono B Demon deck"); -// addToDeckList("Dick Grayson 3", "hard", "WU Constructed"); - addToDeckList("Dilbert 3", "hard", "BRG Ball Lightning deck with Smoke, Mighty Emergence and Kavu Lair"); - addToDeckList("Dino 1", "easy", "Mono brown artifact deck with Affinity for artifacts, Metalcraft and Modular cards"); - addToDeckList("Dino 2", "medium", "Mono brown affinity deck with Affinity for artifacts and Modular cards"); - addToDeckList("Dino 3", "hard", "Mono brown affinity deck with Affinity for artifacts and Modular cards"); - addToDeckList("Dino 4", "very hard", "Mono brown affinity deck with Affinity for artifacts, Metalcraft and Modular cards"); -// addToDeckList("Dinosaur 1", "easy", "GR Large Creatures"); -// addToDeckList("Dinosaur 2", "medium", "WGR Naya"); - addToDeckList("Doc Holiday 1", "easy", "WUG Morph deck"); - addToDeckList("Doc Holiday 2", "medium", "WUG deck with Sunscape Familiar and Bant Sureblade"); - addToDeckList("Doc Holiday 3", "hard", "WUG deck with Stoic Angel, Murkfiend Liege and Knight of New Alara"); - addToDeckList("Dogbert 2", "medium", "WRG Berserker deck with Blade-Tribe Berserkers and Spiraling Duelist"); -// addToDeckList("Dog 2", "medium", "GRB Sacrifice"); - addToDeckList("Doran 3", "hard", "WBG Doran, the Siege Tower deck with high toughness creatures"); -// addToDeckList("Dr Doom 2", "medium", "GWB"); -// addToDeckList("Dr Doom 3", "hard", "GWB Constructed"); -// addToDeckList("Dr Fate 3", "hard", "UB Infect"); - addToDeckList("Dr No 3", "hard", "WUB Combo & Control deck with The Rack, Balance, Propaganda and discard spells"); - addToDeckList("Dr Strangelove 3", "hard", "Mono U Sanity Grinding deck"); - - addToDeckList("Electro 2", "medium", "WRG Naya deck with creatures with power 5 or greater"); - addToDeckList("Electro 3", "hard", "WRG Naya deck with creatures with power 5 or greater"); - addToDeckList("Elrond 1", "easy", "WG Aura deck with Rabid Wombat"); - addToDeckList("Elrond 2", "medium", "RGW Aura deck with Rabid Wombat"); - addToDeckList("Elrond 3", "hard", "RGW Aura deck with Kor Spiritdancer"); -// addToDeckList("En Sabah Nur 2", "medium", "RUB Singleton"); -// addToDeckList("En Sabah Nur 3", "hard", "UBR Standard Constructed"); - addToDeckList("Endora 2", "medium", "WG Enchantress deck with enchantments and cards with enchantment effects"); - addToDeckList("Endora 3", "hard", "WG Enchantress deck with enchantments and cards with enchantment effects"); - addToDeckList("Eomer 2", "medium", "Mono W flanking deck"); - addToDeckList("Ezio 3", "hard", "Mono B Assassin deck"); - - addToDeckList("Fat Albert 1", "easy", "WBRG Winter Orb deck with Keldon Warlord and mana Elves/Slivers"); - addToDeckList("Fat Albert 2", "medium", "WUBRG Winter Orb deck with Keldon Warlord and mana Elves/Slivers"); - addToDeckList("Fat Albert 3", "hard", "UG Winter Orb deck with Kalonian Behemoth and mana Elves/Slivers"); -// addToDeckList("Fin Fang Foom 1", "easy", "B Artifact"); - addToDeckList("Fin Fang Foom 1", "easy", "Mono G Poison deck"); - addToDeckList("Fin Fang Foom 2", "medium", "Mono G Infect deck"); - addToDeckList("Fin Fang Foom 3", "hard", "GB Infect deck"); - addToDeckList("Fred Flintstone 3", "hard", "WUG deck with Phytohydra and Lorescale Coatl"); - addToDeckList("Frodo 1", "easy", "WRG Zoo deck with some threat removal"); - addToDeckList("Frodo 2", "medium", "WRG Zoo deck with some threat removal and Glorious Anthem"); - addToDeckList("Frodo 3", "hard", "WRG Zoo deck with threat removal and Glorious Anthems"); - - addToDeckList("Galadriel 2", "medium", "Mono G Deck with Amulet of Vigor, mana ramp, Time Vault and Howl of the Night Pack"); - addToDeckList("Galahad 1", "easy", "WB Knight deck with Kinsbaile Cavalier and Knight Exemplar"); - addToDeckList("Galahad 2", "medium", "WB Knight deck with Kinsbaile Cavalier and Knight Exemplar"); - addToDeckList("Galahad 3", "hard", "WB Knight deck with Kinsbaile Cavalier and Knight Exemplar"); - addToDeckList("Gambit 2", "medium", "URG Bounce deck with Taurean Mauler and Forgotten Ancient"); - addToDeckList("Genghis Khan 1", "easy", "WRG deck with mana ramp, Armageddon and Mungha Wurm"); - addToDeckList("Genghis Khan 2", "medium", "WG deck with mana ramp, Armageddon and Terravore"); - addToDeckList("Genghis Khan 3", "hard", "WRG deck with mana ramp, Armageddon, and Terravore"); - addToDeckList("George of the Jungle 1", "easy", "WR deck with Belligerent Hatchling and Battlegate Mimic"); - addToDeckList("George of the Jungle 2", "medium", "WR deck with Belligerent Hatchling, Battlegate Mimic and Ajani Vengeant"); - addToDeckList("George of the Jungle 3", "hard", "WR deck with Belligerent Hatchling, Battlegate Mimic and Ajani Vengeant"); -// addToDeckList("Ghost Rider 3", "hard", "W Aggressive Life deck"); - addToDeckList("Gimli 2", "medium", "WB Indestructible permanents deck with mass removal"); - addToDeckList("Gimli 3", "hard", "WB Indestructible permanents deck with mass removal"); -// addToDeckList("Goblin King 2", "medium", "RG Singleton deck"); -// addToDeckList("Goblin King 3", "hard", "RG Extended deck"); -// addToDeckList("Goblin Recruit 2", "medium", "RG Skullclamp deck"); -// addToDeckList("Goblin Recruit 3", "hard", "BR Goblin Sacrifice deck"); - addToDeckList("Gold Finger 3", "hard", "Mono U control deck with various counter spells, Serra Sphinx and Memnarch"); - addToDeckList("Gold Finger 4", "very hard", "Mono U control deck with various counter spells"); - addToDeckList("Grampa Simpson 1", "easy", "WR Double and First Strike deck with equipments and auras"); - addToDeckList("Grampa Simpson 2", "medium", "WR Double Strike deck with equipments and auras"); - addToDeckList("Grampa Simpson 3", "hard", "WRG Double Strike deck with equipments and auras"); - addToDeckList("Green Arrow 1", "easy", "WG Archer deck with Jagged-Scar Archers and Titania's Chosen"); - addToDeckList("Green Arrow 2", "medium", "Mono G Archer deck with Greatbow Doyen and Jagged-Scar Archers"); - addToDeckList("Green Arrow 3", "hard", "WRG Archer Aggro deck with Greatbow Doyen and Changelings"); - addToDeckList("Green Lantern 3", "hard", "UBR Deathtouch deck with auras and several equipments"); -// addToDeckList("Gunslinger 3", "hard", "WBRG Cascade deck"); - - addToDeckList("Hagrid 2", "medium", "Mono R Giants deck"); - addToDeckList("Han Solo 3", "hard", "WU Enchanted Evening deck with lots of enchantment removal"); - addToDeckList("Hans 3", "hard", "WRG Allies deck"); - addToDeckList("Harry Potter 1", "easy", "Mono U Mill and counter spell deck"); - addToDeckList("Harry Potter 2", "medium", "UB Mill and counter spell deck"); - addToDeckList("Harry Potter 3", "hard", "UB Mill and counter spell deck with card draw"); - addToDeckList("Hellboy 3", "hard", "BR direct damage deck"); - addToDeckList("Hercules 1", "easy", "GW Deck with Safehold Duo, Bant Sureblade and Naya Hushblade"); - addToDeckList("Hercules 2", "medium", "GW Deck with Bant Sureblade and Naya Hushblade"); - addToDeckList("Hercules 3", "hard", "GW Deck with Wilt-Leaf Liege, Bant Sureblade and Naya Hushblade"); - addToDeckList("Hermione Granger 3", "hard", "UR deck with Riverfall Mimic and Mindwrack Liege"); - addToDeckList("Higgins 3", "hard", "UBR Grixis Control deck"); - addToDeckList("Hobbes 3", "hard", "UBG Dredge deck with Hermit Druid, Ichorid and Narcomoeba"); - addToDeckList("Hobbes 4", "very hard", "UBG Dredge deck with Hermit Druid, Ichorid and Narcomoeba"); - addToDeckList("Homer Simpson 1", "easy", "UBR Sacrifice deck with Mortician Beetle"); - addToDeckList("Homer Simpson 2", "medium", "UBR Sacrifice deck with Mortician Beetle"); - addToDeckList("Homer Simpson 3", "hard", "UBR Sacrifice deck with Mortician Beetle"); -// addToDeckList("Hulk 2", "medium", "G Men with Pants deck"); -// addToDeckList("Hulk 3", "hard", "G Midrange deck"); - - addToDeckList("Iceman 3", "hard", "UB Bounce deck with Warped Devotion"); - addToDeckList("Indiana Jones 1", "easy", "UBR Sol'kanar the Swamp King and buff"); - addToDeckList("Indiana Jones 2", "medium", "UBR Sol'kanar the Swamp King, buff and Raise Dead"); - addToDeckList("Indiana Jones 3", "hard", "UBR Sol'kanar the Swamp King, buff and Terminate"); - - addToDeckList("Jabba the Hut 3", "hard", "Mono B Infect deck"); -// addToDeckList("Jack 2", "medium", "BG Aggressive deck"); -// addToDeckList("Jack 3", "hard", "WUB Sphinx Cascade deck"); - addToDeckList("Jack Sparrow 1", "easy", "UB Pirate deck with Talas Warrior, Coastal Piracy, Drowned and Sea's Claim"); - addToDeckList("Jack Sparrow 2", "medium", "UB Pirate deck with Talas Warrior, Coastal Piracy and Spreading Seas"); - addToDeckList("James Bond 1", "easy", "WG Sliver deck"); - addToDeckList("James Bond 2", "medium", "WG Sliver deck"); - addToDeckList("James Bond 3", "hard", "WG Sliver deck"); - addToDeckList("James T Kirk 3", "hard", "Mono B discard deck with Liliana Vess"); -// addToDeckList("Jason Todd 3", "hard", "BRG Sacrifice deck"); - addToDeckList("Joe Kidd 1", "easy", "WB deck with Voracious Hatchling and Nightsky Mimic"); - addToDeckList("Joe Kidd 2", "medium", "WB deck with Voracious Hatchling and Nightsky Mimic"); - addToDeckList("Joe Kidd 3", "hard", "WB deck with Voracious Hatchling and Nightsky Mimic"); -// addToDeckList("Joker 2", "medium", "WG Novablast deck"); -// addToDeckList("Jon Stewart 2", "medium", "WG Midrange deck"); -// addToDeckList("Jon Stewart 3", "hard", "WG Extended deck"); - - addToDeckList("Kang 1", "easy", "UB deck with Gravelgill Duo and Dire Undercurrents"); - addToDeckList("Kang 2", "medium", "UB deck with Glen Elendra Liege, Gravelgill Duo and Dire Undercurrents"); - addToDeckList("Kang 3", "hard", "UB deck with Glen Elendra Liege and Dire Undercurrents"); - addToDeckList("King Arthur 1", "easy", "WG Knight deck with Wilt-Leaf Cavaliers, Raven's Run Dragoon and Llanowar Knight"); - addToDeckList("King Arthur 2", "medium", "WG Hybrid Knight deck with Knight of New Alara and Knight of the Reliquary"); - addToDeckList("King Arthur 3", "hard", "WG Hybrid Knight deck with Wilt-Leaf Liege, Knight of New Alara and equipments"); - addToDeckList("King Edward 1", "easy", "WUBRG Elementals deck with Tribal Flames"); - addToDeckList("King Edward 2", "medium", "WUBRG Elementals deck with Tribal Flames"); - addToDeckList("King Edward 3", "hard", "WUBRG Elementals deck with Tribal Flames and Horde of Notions"); - addToDeckList("King Goldemar 1", "easy", "Mono R Kobold deck"); - addToDeckList("King Kong 1", "easy", "WBG Squirrel deck with tokens, changelings, Deranged Hermit and curse type auras"); - addToDeckList("King Kong 2", "medium", "WBG Squirrel deck with tokens, changelings, Deranged Hermit and curse type auras"); - addToDeckList("King Kong 3", "hard", "WRG Squirrel deck with tokens, changelings, Deranged Hermit and threat removal"); - addToDeckList("Kojak 1", "easy", "Mono U deck with Sunken City, Inundate, counterspells and bounce"); - addToDeckList("Kojak 2", "medium", "Mono U deck with Sunken City, Inundate, counterspells and bounce"); - addToDeckList("Kojak 3", "hard", "Mono U deck with Sunken City, Inundate, counterspells and bounce"); - addToDeckList("Krypto 2", "medium", "BRG Bloodthirst deck with Honden of Infinite Rage, Kyren Sniper and Rumbling Slum"); - addToDeckList("Krypto 3", "hard", "BRG Bloodthirst deck with Doubling Season, Kyren Sniper and Rumbling Slum"); - - addToDeckList("Leprechaun 1", "easy", "WBG anti green deck with Aisling Leprechaun, Beast Within and Waiting in the Weeds"); -// addToDeckList("Lex 3", "hard", "Ninjas deck"); -// addToDeckList("Link 3", "hard", "GUR Standard Constructed deck"); - addToDeckList("Lisa Simpson 2", "medium", "WG Devour deck with tokens, Skullmulcher and Mycoloth"); -// addToDeckList("Lucifer 2", "medium", "W Sacrifice deck"); -// addToDeckList("Lucifer 3", "hard", "W Sacrifice deck"); - addToDeckList("Luke Skywalker 3", "hard", "WU Rebels deck with Training Grounds"); - - addToDeckList("Maggie Simpson 3", "hard", "BRG jund deck with Sprouting Thrinax, Jund Hackblade and Bloodbraid Elf"); - addToDeckList("Magneto 3", "hard", "Mono B Shriekmaw deck with creature removal and re-animation"); - addToDeckList("Magnum 1", "easy", "UG deck with Sturdy Hatchling and Shorecrasher Mimic"); - addToDeckList("Magnum 2", "medium", "UG deck with Sturdy Hatchling and Shorecrasher Mimic"); - addToDeckList("Magnum 3", "hard", "UG deck with Sturdy Hatchling and Shorecrasher Mimic"); - addToDeckList("Marge Simpson 2", "medium", "RG deck with tokens which are devoured by creatures with devour"); - addToDeckList("Mister Fantastic 3", "hard", "UG Intruder Alarm deck with Imperious Perfect and mana elves"); -// addToDeckList("Michael 3", "hard", "W Angels deck"); - addToDeckList("Morpheus 3", "hard", "Mono G Elf deck with Overrun, Gaea's Anthem, Imperious Perfect and other pumps"); - addToDeckList("Mr Slate 2", "medium", "WUG Merfolk deck with Lord of Atlantis, Stonybrook Banneret and Stonybrook Schoolmaster"); - addToDeckList("Mr Slate 3", "hard", "WUG Merfolk deck with Lord of Atlantis, Stonybrook Banneret and Stonybrook Schoolmaster"); -// addToDeckList("Mummy 1", "easy", "W Life deck"); - - addToDeckList("Nagini 2", "medium", "Mono G Snake deck"); -// addToDeckList("Namor 2", "medium", "U Control deck"); -// addToDeckList("Namor 3", "hard", "U Standard Constructed deck"); - addToDeckList("Napoleon 3", "hard", "WBG Wall deck with Rolling Stones and Doran, the Siege Tower"); - addToDeckList("Ned Flanders 1", "easy", "Mono B reanimator deck with a few large creatures and some spells"); - addToDeckList("Ned Flanders 2", "medium", "Mono B reanimator deck with a few large creatures and some spells"); - addToDeckList("Ned Flanders 3", "hard", "Mono B reanimator deck with a few large creatures and some spells"); - addToDeckList("Ned Flanders 4", "very hard", "Mono B reanimator deck with a few large creatures and some spells"); - addToDeckList("Neo 2", "medium", "RG deck with Boartusk Liege, Jund Hackblade and Naya Hushblade"); - addToDeckList("Neo 3", "hard", "RG deck with Boartusk Liege, Jund Hackblade and Naya Hushblade"); - addToDeckList("Newton 3", "hard", "WB Relentless Rats deck with Thrumming Stone, Vindicate and Swords to Plowshares"); - - addToDeckList("Oberon 1", "easy", "UB Faerie deck"); - addToDeckList("Oberon 2", "medium", "UB Faerie deck"); - addToDeckList("Oberon 3", "hard", "UB Faerie deck"); - addToDeckList("Odin 1", "easy", "WU deck with Thistledown Duo"); - addToDeckList("Odin 2", "medium", "WU deck with Thistledown Duo, Thistledown Liege and Grand Arbiter Augustin IV"); - addToDeckList("Odin 3", "hard", "WU deck with Thistledown Liege and Grand Arbiter Augustin IV"); - addToDeckList("Optimus Prime 3", "hard", "Mono U deck with Modular creatures and proliferate spells"); -// addToDeckList("Owlman 2", "medium", "U Ebony Owl deck"); -// addToDeckList("Owlman 3", "hard", "B Control Standard deck"); - - addToDeckList("Pebbles Flintstone 2", "medium", "WU Meekstone deck with Meekstone, Marble Titan and creatures with vigilance"); - addToDeckList("Pebbles Flintstone 3", "hard", "WU Meekstone deck with Meekstone, Marble Titan and creatures with vigilance"); -// addToDeckList("Phoenix 3", "hard", "R Burn"); - addToDeckList("Picard 3", "hard", "WUG Elf deck with elf lords"); - addToDeckList("Pinky and the Brain 2", "medium", "WB Royal Assassin deck with white tap abilities"); -// addToDeckList("Predator 2", "medium", "WG Purity Ramp deck"); -// addToDeckList("Predator 3", "hard", "UG Beastmaster Ascension deck"); - addToDeckList("Pointy Haired Boss 3", "hard", "WUG Combo deck with Hokori, Dust Drinker, Mana Leak and Sunscape Master"); - addToDeckList("Princess Selenia 1", "easy", "BUG Song of Serenity deck"); - addToDeckList("Professor X 2", "medium", "WUB Esper Artifacts deck with Master of Etherium and Esper Stormblade"); - addToDeckList("Professor X 3", "hard", "WUB Esper Artifacts deck with Master of Etherium and Esper Stormblade"); - - addToDeckList("R2-D2 3", "hard", "Mono U Black Vise deck with bounce spells and Howling Mine"); - addToDeckList("Radagast 2", "medium", "Mono G Muraganda Petroglyphs deck with vanilla creatures and a few tokens"); - addToDeckList("Radiant 3", "hard", "WU flying creature deck with Radiant, Archangel, Gravitational Shift and Moat"); - addToDeckList("Radioactive Man 3", "hard", "WR Sneak Attack deck"); - addToDeckList("Radioactive Man 4", "very hard", "WR Sneak Attack deck"); - addToDeckList("Ratbert 2", "medium", "Mono B Fear deck with Thran Lens"); -// addToDeckList("Ras Al Ghul 2", "medium", "RG Biorhythm deck"); -// addToDeckList("Ras Al Ghul 3", "hard", "WG Eldrazi Monument deck"); -// addToDeckList("Raven 1", "easy", "Birds deck"); -// addToDeckList("Raven 2", "medium", "Birds deck"); -// addToDeckList("Raven 3", "hard", " Possessed Birds deck"); -// addToDeckList("Red Skull 2", "medium", "BR Metalcraft deck"); - addToDeckList("Redwall 2", "medium", "Mono R Defender deck with Vent Sentinel"); - addToDeckList("Reverend Lovejoy 2", "medium", "WRG deck with Kavu Predator and Punishing Fire"); - addToDeckList("Riddler 3", "hard", "WR deck with mass damage spells, Spitemare and Swans of Bryn Argoll"); - addToDeckList("Riddler 4", "very hard", "WR deck with mass damage spells, Stuffy Doll and Guilty Conscience"); -// addToDeckList("Robin 2", "medium", "G Big Green deck"); -// addToDeckList("Robin 3", "hard", "WG Standard deck"); - addToDeckList("Rocky 1", "easy", "WUR Pro red deck with Flamebreak, Tremor, Pyroclasm"); - addToDeckList("Rocky 2", "medium", "WUR Pro red deck with Flamebreak, Tremor, Pyroclasm"); - addToDeckList("Rocky 3", "hard", "WUR Pro red deck with Flamebreak, Tremor, Pyroclasm"); - addToDeckList("Rogue 3", "hard", "Mono R Dragon deck with Tarox Bladewing, Dragon Roost and Chandra Nalaar"); - -// addToDeckList("Sabertooth 2", "medium", "G Smokestack deck"); - addToDeckList("Samantha Stephens 1", "easy", "WU Painter's Servant anti-red deck"); - addToDeckList("Samantha Stephens 2", "medium", "WU Painter's Servant anti-red deck"); - addToDeckList("Samantha Stephens 3", "hard", "WU Painter's Servant anti-red deck with Grindstone combo"); - addToDeckList("Samantha Stephens 4", "very hard", "WU Painter's Servant - Grindstone combo"); - addToDeckList("Samwise Gamgee 2", "medium", "Mono W Kithkin deck"); - addToDeckList("Samwise Gamgee 3", "hard", "Mono W Kithkin deck"); - addToDeckList("Saruman 2", "medium", "UBR discard deck with Megrim, Liliana's Caress and Burning Inquiry "); - addToDeckList("Saruman 3", "hard", "UBR discard deck with Megrim, Liliana's Caress and Burning Inquiry "); - addToDeckList("Sauron 2", "medium", "UB Underworld Dreams deck with Black Vise and lots of card draw for both players"); - addToDeckList("Scooby Doo 3", "hard", "WR Giants Aggro deck with a few changelings"); - addToDeckList("Scotty 2", "medium", "WBG protection from black Famine deck with Phantom Centaur and Nightwind Glider"); - addToDeckList("Scotty 3", "hard", "WBG protection from black Famine deck with Chameleon Colossus and Oversoul of Dusk"); - addToDeckList("Seabiscuit 1", "easy", "Mono W Metalcraft deck with Ardent Recruit and Indomitable Archangel"); - addToDeckList("Seabiscuit 2", "medium", "Mono W Metalcraft deck with Ardent Recruit and Indomitable Archangel"); - addToDeckList("Seabiscuit 3", "hard", "Mono W Metalcraft deck with Ardent Recruit and Indomitable Archangel"); - addToDeckList("Secret Squirrel 3", "hard", "Mono G Squirrel deck with Squirrel Mob, Deranged Hermit, Coat of Arms and Nut Collector"); -// addToDeckList("Sentinel 2", "medium", "WB Token deck"); -// addToDeckList("Sentinel 3", "hard", "WB Token deck"); -// addToDeckList("Shelob 1", "easy", "G Reach deck"); - addToDeckList("Sherlock Holmes 1", "easy", "Mono G deck with Baru, Fist of Krosa, land fetch and some buff cards"); - addToDeckList("Sherlock Holmes 2", "medium", "Mono G deck with Baru, Fist of Krosa and lots of good green creatures"); - addToDeckList("Sherlock Holmes 3", "hard", "Mono G deck with Baru, Fist of Krosa and lots of great green creatures"); - addToDeckList("Shrek 1", "easy", "Mono B Demon and Ogre deck"); - addToDeckList("Silver Surfer 3", "hard", "BG deck with Hunted Wumpus and Iwamori of the Open Fist"); - addToDeckList("Silver Samurai 2", "medium", "Mono W Samurai deck"); - addToDeckList("Spiderman 2", "medium", "Mono W weenie deck with WoG, Armageddon and Mass Calcify"); - addToDeckList("Spiderman 3", "hard", "Mono W weenie deck with WoG, Armageddon, Honor of the Pure and Mass Calcify"); - addToDeckList("Spock 2", "medium", "Mono G Elf singleton deck with several Winnower Patrol and Wolf-Skull Shaman"); -// addToDeckList("Starfire 2", "medium", "Incarnations deck"); -// addToDeckList("Starfire 3", "hard", "Incarnations deck"); - addToDeckList("Storm 1", "easy", "WBG Lifegain deck with Ajani's Pridemate and Serra Ascendant"); - addToDeckList("Storm 2", "medium", "WBG Lifegain deck with Ajani's Pridemate and Serra Ascendant"); - addToDeckList("Storm 3", "hard", "WBG Lifegain deck with Ajani's Pridemate and Serra Ascendant"); - addToDeckList("Sun Quan 2", "medium", "Mono U Horsemanship deck"); -// addToDeckList("Superboy 3", "hard", "R Artifact deck"); - addToDeckList("Superman 3", "hard", "WRG counters deck with Borborygmos, Rushwood Elemental, Doubling Season and Titania's Boon"); -// addToDeckList("Swamp Thing 1", "easy", "BG deck"); -// addToDeckList("Swamp Thing 2", "medium", "BG deck"); -// addToDeckList("Swamp Thing 3", "hard", "BG deck"); - - addToDeckList("Tarzan 1", "easy", "WR Ape tribal deck with Ancient Silverback, Earthbind, Claws of Wirewood and pump spells"); - addToDeckList("Tarzan 2", "medium", "WR Ape tribal deck with Ancient Silverback, Raking Canopy and Treetop Village"); - addToDeckList("Terminator 3", "hard", "Mono B artifact deck with The Abyss"); - addToDeckList("The Great Gazoo 3", "hard", "WR deck with, red damage all spells and pro from red creatures"); - addToDeckList("The Thing 2", "medium", "Mono W creatureless deck with Urza's Armor, Sphere of Purity, Copper Tablet and Ankh of Mishra"); -// addToDeckList("Thing 2", "medium", "WG Elves deck"); -// addToDeckList("Thing 3", "hard", "G Garruk Elves deck"); -// addToDeckList("Thor 1", "easy", "WR Singleton deck"); -// addToDeckList("Thor 2", "medium", "BR 1cc deck"); -// addToDeckList("Thor 3", "hard", "WR Constructed deck"); -// addToDeckList("Thugs 2", "medium", "WG Elves deck"); -// addToDeckList("Thugs 3", "hard", "WG Strength in Numbers deck"); - addToDeckList("Tom Bombadil 3", "hard", "Mono G deck with Garruk's Packleader, Garruk Wildspeaker and Garruk's Companion"); - addToDeckList("Totoro 2", "medium", "UBG deck with spirits and arcane spells"); - addToDeckList("Treebeard 1", "easy", "Mono G Treefolk deck with Bosk Banneret, Dauntless Dourbark and Leaf-Crowned Elder"); - addToDeckList("Treebeard 2", "medium", "WBG Treefolk deck with Bosk Banneret, Dauntless Dourbark, Timber Protector, Leaf-Crowned Elder and Doran"); - addToDeckList("Treebeard 3", "hard", "WBG Treefolk deck with Bosk Banneret, Dauntless Dourbark, Timber Protector, Leaf-Crowned Elder and Doran"); - - addToDeckList("Uncle Owen 3", "hard", "WUB Control deck"); - -// addToDeckList("Vampire 2", "medium", "Vampire Singleton"); -// addToDeckList("Vampire 3", "hard", "Vampire Constructed"); - - addToDeckList("Walle 2", "medium", "Mono W Myr deck"); - addToDeckList("Wally 3", "hard", "WB Artifact deck with Tempered Steel"); -// addToDeckList("Werewolf 2", "medium", "UGB UBG Fungal Shambler deck"); - addToDeckList("White Knight 1", "easy", "Mono W Knights deck"); - addToDeckList("White Knight 2", "medium", "Mono W Knights deck"); - addToDeckList("White Knight 3", "hard", "Mono W Knights deck"); - addToDeckList("Wilma Flintstone 1", "easy", "BG deck with Noxious Hatchling and Woodlurker Mimic"); - addToDeckList("Wilma Flintstone 2", "medium", "BG deck with Noxious Hatchling and Woodlurker Mimic"); - addToDeckList("Wilma Flintstone 3", "hard", "BG deck with Noxious Hatchling and Woodlurker Mimic"); - addToDeckList("Wolverine 3", "hard", "BG deck with Nightmare, Korlash, Heir to Blackblade and Kodama's Reach"); - addToDeckList("Wonder Woman 2", "medium", "Mono W Equipment deck"); - addToDeckList("Wyatt Earp 1", "easy", "Mono W deck with Crovax, Ascendant Hero, Crusade and small to medium sized creatures."); - addToDeckList("Wyatt Earp 2", "medium", "Mono W deck with Crovax, Ascendant Hero, Crusade and small to medium sized creatures."); - addToDeckList("Wyatt Earp 3", "hard", "Mono W deck with Crovax, Ascendant Hero, Honor of the Pure and small to medium sized creatures."); - -// addToDeckList("Xavier 2", "medium", "UR Twitch"); - } - - /** - *

addToDeckList.

- * - * @param name a {@link java.lang.String} object. - * @param difficulty a {@link java.lang.String} object. - * @param description a {@link java.lang.String} object. - */ - private static void addToDeckList(String name, String difficulty, String description) { - nameDeckMap.put(name, new DeckInfo(name, description, difficulty)); - } - - /** - *

getDescription.

- * - * @param deckName a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public static String getDescription(String deckName) { - if (nameDeckMap.containsKey(deckName)) { - return nameDeckMap.get(deckName).description; - } else { - System.out.println("Deck " + deckName + " does not have a description."); - return ""; - } - } - - private static class DeckInfo { - //String name; - String difficulty; - String description; - - private DeckInfo(String name, String description, String difficulty) { - this.description = description; - this.difficulty = difficulty; - //this.name = name; - } - } - - /** - *

getBattles.

- * - * @return a {@link java.util.List} object. - */ - public static List getBattles() { - List opponentList = new ArrayList(); - - String[] opponentNames = QuestBattleManager.getOpponents(); - for (String opponentName : opponentNames) { - - String oppIconName = opponentName.substring(0, opponentName.length() - 1).trim() + ".jpg"; - ImageIcon icon = GuiUtils.getIconFromFile(oppIconName); - - try { - opponentList.add(new QuestBattle(opponentName, - nameDeckMap.get(opponentName).difficulty, - nameDeckMap.get(opponentName).description, - icon)); - } catch (NullPointerException e) { - System.out.println("Missing Deck Description. Fix me:" + opponentName); - opponentList.add(new QuestBattle(opponentName, - "<>", - "<>", - icon)); - - } - } - - return opponentList; - } - - /** - *

Constructor for QuestBattle.

- * - * @param name a {@link java.lang.String} object. - * @param difficulty a {@link java.lang.String} object. - * @param description a {@link java.lang.String} object. - * @param icon a {@link javax.swing.ImageIcon} object. - */ - private QuestBattle(String name, String difficulty, String description, ImageIcon icon) { - super(name.substring(0, name.length() - 2), difficulty, description, icon); - - this.deckName = name; - } - - /** {@inheritDoc} */ - @Override - public String getName() { - return deckName; - } -} diff --git a/src/forge/quest/gui/main/QuestMainPanel.java b/src/forge/quest/gui/main/QuestMainPanel.java deleted file mode 100644 index b7f3399c01b..00000000000 --- a/src/forge/quest/gui/main/QuestMainPanel.java +++ /dev/null @@ -1,802 +0,0 @@ -package forge.quest.gui.main; - - -import forge.*; -import forge.deck.Deck; -import forge.gui.GuiUtils; -import forge.quest.data.QuestBattleManager; -import forge.quest.data.QuestData; -import forge.quest.data.item.QuestItemZeppelin; -import forge.quest.gui.QuestAbstractPanel; -import forge.quest.gui.QuestFrame; - -import javax.swing.*; -import javax.swing.border.EmptyBorder; -import javax.swing.border.EtchedBorder; -import javax.swing.border.TitledBorder; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.*; -import java.util.List; - - -/** - *

QuestMainPanel class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestMainPanel extends QuestAbstractPanel { - /** Constant serialVersionUID=6142934729724012402L */ - private static final long serialVersionUID = 6142934729724012402L; - - private forge.quest.data.QuestData questData; - - JLabel creditsLabel = new JLabel(); - JLabel lifeLabel = new JLabel(); - JLabel statsLabel = new JLabel(); - JLabel titleLabel = new JLabel(); - JLabel nextQuestLabel = new JLabel(); - - JComboBox petComboBox = new JComboBox(); - JComboBox deckComboBox = new JComboBox(); - - JButton questButton = new JButton("Quests"); - JButton playButton = new JButton("Play"); - - private QuestSelectablePanel selectedOpponent; - - JPanel nextMatchPanel = new JPanel(); - CardLayout nextMatchLayout; - - boolean isShowingQuests = false; - private JCheckBox devModeCheckBox = new JCheckBox("Developer Mode"); - //private JCheckBox newGUICheckbox = new JCheckBox("Use new UI", true); - private JCheckBox smoothLandCheckBox = new JCheckBox("Adjust AI Land"); - private JCheckBox petCheckBox = new JCheckBox("Summon Pet"); - - private JCheckBox plantBox = new JCheckBox("Summon Plant"); - /** Constant NO_DECKS_AVAILABLE="No decks available" */ - private static final String NO_DECKS_AVAILABLE = "No decks available"; - /** Constant BATTLES="Battles" */ - private static final String BATTLES = "Battles"; - /** Constant QUESTS="Quests" */ - private static final String QUESTS = "Quests"; - - //TODO: Make this ordering permanent - /** Constant lastUsedDeck="//TODO: Make this ordering permanent" */ - private static String lastUsedDeck; - private JButton zeppelinButton = new JButton("Launch
Zeppelin", - GuiUtils.getResizedIcon(GuiUtils.getIconFromFile("ZeppelinIcon.png"), 40, 40)); - private JPanel zeppelinPanel = new JPanel(); - - /** - *

Constructor for QuestMainPanel.

- * - * @param mainFrame a {@link forge.quest.gui.QuestFrame} object. - */ - public QuestMainPanel(QuestFrame mainFrame) { - super(mainFrame); - questData = AllZone.getQuestData(); - - initUI(); - } - - /** - *

initUI.

- */ - private void initUI() { - refresh(); - this.setLayout(new BorderLayout(5, 5)); - JPanel centerPanel = new JPanel(new BorderLayout()); - this.add(centerPanel, BorderLayout.CENTER); - - JPanel northPanel = createStatusPanel(); - this.add(northPanel, BorderLayout.NORTH); - - JPanel eastPanel = createSidePanel(); - this.add(eastPanel, BorderLayout.EAST); - - JPanel matchSettingsPanel = createMatchSettingsPanel(); - centerPanel.add(matchSettingsPanel, BorderLayout.SOUTH); - - centerPanel.add(nextMatchPanel, BorderLayout.CENTER); - this.setBorder(new EmptyBorder(5, 5, 5, 5)); - - } - - /** - *

createStatusPanel.

- * - * @return a {@link javax.swing.JPanel} object. - */ - private JPanel createStatusPanel() { - JPanel northPanel = new JPanel(); - JLabel modeLabel; - JLabel difficultyLabel;//Create labels at the top - titleLabel.setFont(new Font(Font.DIALOG, Font.PLAIN, 28)); - titleLabel.setAlignmentX(LEFT_ALIGNMENT); - northPanel.setLayout(new BoxLayout(northPanel, BoxLayout.Y_AXIS)); - northPanel.add(titleLabel); - - northPanel.add(Box.createVerticalStrut(5)); - - JPanel statusPanel = new JPanel(); - statusPanel.setLayout(new BoxLayout(statusPanel, BoxLayout.X_AXIS)); - statusPanel.setAlignmentX(LEFT_ALIGNMENT); - - modeLabel = new JLabel(questData.getMode()); - statusPanel.add(modeLabel); - statusPanel.add(Box.createHorizontalGlue()); - - difficultyLabel = new JLabel(questData.getDifficulty()); - statusPanel.add(difficultyLabel); - statusPanel.add(Box.createHorizontalGlue()); - - statusPanel.add(statsLabel); - - northPanel.add(statusPanel); - return northPanel; - } - - /** - *

createSidePanel.

- * - * @return a {@link javax.swing.JPanel} object. - */ - private JPanel createSidePanel() { - JPanel panel = new JPanel(); - JPanel optionsPanel;//Create options checkbox list - optionsPanel = createOptionsPanel(); - - List eastComponents = new ArrayList(); - //Create buttons - - JButton mainMenuButton = new JButton("Return to Main Menu"); - mainMenuButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent actionEvent) { - mainFrame.returnToMainMenu(); - } - }); - eastComponents.add(mainMenuButton); - - JButton cardShopButton = new JButton("Card Shop"); - cardShopButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent actionEvent) { - QuestMainPanel.this.showCardShop(); - } - }); - eastComponents.add(cardShopButton); - cardShopButton.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 20)); - - JButton bazaarButton = null; - if (questData.getMode().equals(forge.quest.data.QuestData.FANTASY)) { - - bazaarButton = new JButton("Bazaar"); - bazaarButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent actionEvent) { - QuestMainPanel.this.showBazaar(); - } - }); - eastComponents.add(bazaarButton); - bazaarButton.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 20)); - } - - - questButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent actionEvent) { - QuestMainPanel.this.showQuests(); - } - }); - eastComponents.add(questButton); - questButton.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 18)); - questButton.setPreferredSize(new Dimension(0, 60)); - - - playButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent actionEvent) { - QuestMainPanel.this.launchGame(); - } - }); - - playButton.setFont(new Font(Font.DIALOG, Font.BOLD, 28)); - playButton.setPreferredSize(new Dimension(0, 100)); - - - eastComponents.add(playButton); - eastComponents.add(optionsPanel); - - GuiUtils.setWidthToMax(eastComponents); - - panel.add(mainMenuButton); - GuiUtils.addGap(panel); - panel.add(optionsPanel); - panel.add(Box.createVerticalGlue()); - panel.add(Box.createVerticalGlue()); - - if (questData.getMode().equals(forge.quest.data.QuestData.FANTASY)) { - panel.add(this.lifeLabel); - this.lifeLabel.setFont(new Font(Font.DIALOG, Font.BOLD, 14)); - this.lifeLabel.setIcon(GuiUtils.getResizedIcon(GuiUtils.getIconFromFile("Life.png"), 30, 30)); - } - - GuiUtils.addGap(panel); - panel.add(this.creditsLabel); - this.creditsLabel.setIcon(GuiUtils.getResizedIcon(GuiUtils.getIconFromFile("CoinStack.png"), 30, 30)); - this.creditsLabel.setFont(new Font(Font.DIALOG, Font.BOLD, 14)); - GuiUtils.addGap(panel, 10); - panel.add(cardShopButton); - - if (questData.getMode().equals(forge.quest.data.QuestData.FANTASY)) { - GuiUtils.addGap(panel); - panel.add(bazaarButton); - } - - panel.add(Box.createVerticalGlue()); - - panel.add(questButton); - this.nextQuestLabel.setFont(new Font(Font.DIALOG, Font.PLAIN, 11)); - panel.add(nextQuestLabel); - GuiUtils.addGap(panel); - - panel.add(playButton); - - panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); - return panel; - } - - /** - *

createOptionsPanel.

- * - * @return a {@link javax.swing.JPanel} object. - */ - private JPanel createOptionsPanel() { - JPanel optionsPanel; - optionsPanel = new JPanel(); - optionsPanel.setLayout(new BoxLayout(optionsPanel, BoxLayout.Y_AXIS)); - - //optionsPanel.add(this.newGUICheckbox); - optionsPanel.add(Box.createVerticalStrut(5)); - optionsPanel.add(this.smoothLandCheckBox); - optionsPanel.add(Box.createVerticalStrut(5)); - optionsPanel.add(this.devModeCheckBox); - optionsPanel.setBorder(new TitledBorder(new EtchedBorder(), "Options")); - return optionsPanel; - } - - /** - *

createMatchSettingsPanel.

- * - * @return a {@link javax.swing.JPanel} object. - */ - private JPanel createMatchSettingsPanel() { - - JPanel matchPanel = new JPanel(); - matchPanel.setLayout(new BoxLayout(matchPanel, BoxLayout.Y_AXIS)); - - JPanel deckPanel = new JPanel(); - deckPanel.setLayout(new BoxLayout(deckPanel, BoxLayout.X_AXIS)); - - JLabel deckLabel = new JLabel("Use Deck"); - deckPanel.add(deckLabel); - GuiUtils.addGap(deckPanel); - - this.deckComboBox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent actionEvent) { - playButton.setEnabled(canGameBeLaunched()); - lastUsedDeck = (String) deckComboBox.getSelectedItem(); - } - }); - - deckPanel.add(this.deckComboBox); - GuiUtils.addGap(deckPanel); - - JButton editDeckButton = new JButton("Deck Editor"); - editDeckButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent actionEvent) { - showDeckEditor(); - } - }); - deckPanel.add(editDeckButton); - deckPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, deckPanel.getPreferredSize().height)); - deckPanel.setAlignmentX(LEFT_ALIGNMENT); - matchPanel.add(deckPanel); - - - GuiUtils.addGap(matchPanel); - - if (questData.getMode().equals(forge.quest.data.QuestData.FANTASY)) { - JPanel fantasyPanel = new JPanel(); - fantasyPanel.setLayout(new BorderLayout()); - - JPanel petPanel = new JPanel(); - petPanel.setLayout(new BoxLayout(petPanel, BoxLayout.X_AXIS)); - - this.petCheckBox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent actionEvent) { - if (petCheckBox.isSelected()) { - questData.getPetManager().setSelectedPet((String) petComboBox.getSelectedItem()); - } else { - questData.getPetManager().setSelectedPet(null); - } - - petComboBox.setEnabled(petCheckBox.isSelected()); - } - }); - - petPanel.add(this.petCheckBox); - GuiUtils.addGap(petPanel); - this.petComboBox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent actionEvent) { - if (petCheckBox.isSelected()) { - questData.getPetManager().setSelectedPet((String) petComboBox.getSelectedItem()); - } else { - questData.getPetManager().setSelectedPet(null); - } - } - }); - this.petComboBox.setMaximumSize( - new Dimension(Integer.MAX_VALUE, - (int) this.petCheckBox.getPreferredSize().getHeight())); - petPanel.add(this.petComboBox); - - this.plantBox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent actionEvent) { - questData.getPetManager().usePlant = plantBox.isSelected(); - } - }); - - GuiUtils.addGap(petPanel, 10); - petPanel.add(this.plantBox); - petPanel.setMaximumSize(petPanel.getPreferredSize()); - petPanel.setAlignmentX(LEFT_ALIGNMENT); - - fantasyPanel.add(petPanel, BorderLayout.WEST); - - zeppelinButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent actionEvent) { - questData.randomizeOpponents(); - refreshNextMatchPanel(); - QuestItemZeppelin zeppelin = (QuestItemZeppelin) questData.getInventory().getItem("Zeppelin"); - zeppelin.setZeppelinUsed(true); - zeppelinButton.setEnabled(false); - } - }); - - zeppelinButton.setMaximumSize(zeppelinButton.getPreferredSize()); - zeppelinPanel.setLayout(new BorderLayout()); - - fantasyPanel.add(zeppelinPanel, BorderLayout.EAST); - fantasyPanel.setAlignmentX(Component.LEFT_ALIGNMENT); - matchPanel.add(fantasyPanel); - } - return matchPanel; - } - - /** - *

createBattlePanel.

- * - * @return a {@link javax.swing.JPanel} object. - */ - private JPanel createBattlePanel() { - JPanel BattlePanel = new JPanel(); - BattlePanel.setLayout(new BoxLayout(BattlePanel, BoxLayout.Y_AXIS)); - BattlePanel.setBorder(new TitledBorder(new EtchedBorder(), "Available Battles")); - - List Battles = QuestBattle.getBattles(); - - for (QuestSelectablePanel Battle : Battles) { - BattlePanel.add(Battle); - Battle.addMouseListener(new SelectionAdapter(Battle)); - - GuiUtils.addGap(BattlePanel, 3); - } - - BattlePanel.setAlignmentX(LEFT_ALIGNMENT); - - return BattlePanel; - } - - /** - *

createQuestPanel.

- * - * @return a {@link javax.swing.JPanel} object. - */ - private JPanel createQuestPanel() { - JPanel questPanel = new JPanel(); - questPanel.setLayout(new BoxLayout(questPanel, BoxLayout.Y_AXIS)); - questPanel.setBorder(new TitledBorder(new EtchedBorder(), "Available Quests")); - - - List quests = QuestQuest.getQuests(); - - for (QuestQuest quest : quests) { - questPanel.add(quest); - quest.addMouseListener(new SelectionAdapter(quest)); - - GuiUtils.addGap(questPanel, 3); - } - - - return questPanel; - } - - /** - *

refresh.

- */ - void refresh() { - AllZone.getQuestData().saveData(); - - devModeCheckBox.setSelected(Constant.Runtime.DevMode[0]); - smoothLandCheckBox.setSelected(Constant.Runtime.Smooth[0]); - //newGUICheckbox.setSelected(Gui_NewGame.preferences.newGui); - - creditsLabel.setText(" " + questData.getCredits()); - statsLabel.setText(questData.getWin() + " wins / " + questData.getLost() + " losses"); - titleLabel.setText(questData.getRank()); - - //copy lastUsedDeck as removal triggers selection change. - String lastUsedDeck = QuestMainPanel.lastUsedDeck; - deckComboBox.removeAllItems(); - - if (questData.getDeckNames().size() > 0) { - deckComboBox.setEnabled(true); - - List deckNames = new ArrayList(questData.getDeckNames()); - - Collections.sort(deckNames, new Comparator() { - public int compare(String s, String s1) { - return s.compareToIgnoreCase(s1); - } - }); - - if (deckNames.contains(lastUsedDeck)) { - deckNames.remove(lastUsedDeck); - deckNames.add(0, lastUsedDeck); - } - - for (String deckName : deckNames) { - deckComboBox.addItem(deckName); - } - } else { - deckComboBox.addItem(NO_DECKS_AVAILABLE); - deckComboBox.setEnabled(false); - } - deckComboBox.setMinimumSize(new Dimension(150, 0)); - - questButton.setEnabled(nextQuestInWins() == 0); - - playButton.setEnabled(canGameBeLaunched()); - - if (questData.getMode().equals(QuestData.FANTASY)) { - lifeLabel.setText(" " + questData.getLife()); - - petComboBox.removeAllItems(); - - Set petList = questData.getPetManager().getAvailablePetNames(); - - if (petList.size() > 0) { - petComboBox.setEnabled(true); - petCheckBox.setEnabled(true); - for (String aPetList : petList) { - petComboBox.addItem(aPetList); - } - } else { - petComboBox.addItem("No pets available"); - petComboBox.setEnabled(false); - petCheckBox.setEnabled(false); - } - - if (!questData.getPetManager().shouldPetBeUsed()) { - petCheckBox.setSelected(false); - petComboBox.setEnabled(false); - } else { - petCheckBox.setSelected(true); - petComboBox.setSelectedItem(questData.getPetManager().getSelectedPet().getName()); - } - - - this.plantBox.setEnabled(questData.getPetManager().getPlant().getLevel() > 0); - this.plantBox.setSelected(questData.getPetManager().shouldPlantBeUsed()); - - QuestItemZeppelin zeppelin = (QuestItemZeppelin) questData.getInventory().getItem("Zeppelin"); - - if (zeppelin.getLevel() > 0) { - zeppelinPanel.removeAll(); - zeppelinPanel.add(zeppelinButton, BorderLayout.CENTER); - } - - if (!zeppelin.hasBeenUsed()) { - zeppelinButton.setEnabled(true); - } else { - zeppelinButton.setEnabled(false); - } - - - } - - if (nextQuestInWins() > 0) { - nextQuestLabel.setText("Next Quest in " + nextQuestInWins() + " Wins."); - } else { - nextQuestLabel.setText("Next Quest available now."); - } - - nextMatchLayout = new CardLayout(); - - refreshNextMatchPanel(); - } - - /** - *

refreshNextMatchPanel.

- */ - private void refreshNextMatchPanel() { - nextMatchPanel.removeAll(); - nextMatchLayout = new CardLayout(); - nextMatchPanel.setLayout(nextMatchLayout); - nextMatchPanel.add(createBattlePanel(), BATTLES); - nextMatchPanel.add(createQuestPanel(), QUESTS); - if (isShowingQuests) { - this.nextMatchLayout.show(nextMatchPanel, QUESTS); - } else { - this.nextMatchLayout.show(nextMatchPanel, BATTLES); - } - } - - /** - *

nextQuestInWins.

- * - * @return a int. - */ - private int nextQuestInWins() { - - // Number of wins was 25, lowereing the number to 20 to help short term questers. - if (questData.getWin() < 20) { - return 20 - questData.getWin(); - } - - // The int mul has been lowered by one, should face special opps more frequently. - int questsPlayed = questData.getQuestsPlayed(); - int mul = 5; - - if (questData.getInventory().hasItem("Zeppelin")) { - mul = 3; - } else if (questData.getInventory().hasItem("Map")) { - mul = 4; - } - - int delta = (questsPlayed * mul) - questData.getWin(); - - return (delta > 0) ? delta : 0; - } - - - /** - *

showDeckEditor.

- */ - void showDeckEditor() { - Command exit = new Command() { - private static final long serialVersionUID = -5110231879431074581L; - - public void execute() { - //saves all deck data - AllZone.getQuestData().saveData(); - - new QuestFrame(); - } - }; - - Gui_Quest_DeckEditor g = new Gui_Quest_DeckEditor(); - - g.show(exit); - g.setVisible(true); - mainFrame.dispose(); - }//deck editor button - - /** - *

showBazaar.

- */ - void showBazaar() { - mainFrame.showBazaarPane(); - } - - /** - *

showCardShop.

- */ - void showCardShop() { - Command exit = new Command() { - private static final long serialVersionUID = 8567193482568076362L; - - public void execute() { - //saves all deck data - AllZone.getQuestData().saveData(); - - new QuestFrame(); - } - }; - - Gui_CardShop g = new Gui_CardShop(questData); - - g.show(exit); - g.setVisible(true); - - this.mainFrame.dispose(); - - }//card shop button - - /** - *

launchGame.

- */ - private void launchGame() { - - //TODO: This is a temporary hack to see if the image cache affects the heap usage significantly. - ImageCache.clear(); - - QuestItemZeppelin zeppelin = (QuestItemZeppelin) questData.getInventory().getItem("Zeppelin"); - zeppelin.setZeppelinUsed(false); - questData.randomizeOpponents(); - - String humanDeckName = (String) deckComboBox.getSelectedItem(); - Deck humanDeck = questData.getDeck(humanDeckName); - Constant.Runtime.HumanDeck[0] = humanDeck; - moveDeckToTop(humanDeckName); - - Constant.Quest.oppIconName[0] = getMatchIcon(); - - // Dev Mode occurs before Display - Constant.Runtime.DevMode[0] = devModeCheckBox.isSelected(); - - //DO NOT CHANGE THIS ORDER, GuiDisplay needs to be created before cards are added - //if (newGUICheckbox.isSelected()) { - AllZone.setDisplay(new GuiDisplay4()); - //} else { - // AllZone.setDisplay(new GuiDisplay3()); - //} - - //Gui_NewGame.preferences.newGui = newGUICheckbox.isSelected(); - - Constant.Runtime.Smooth[0] = smoothLandCheckBox.isSelected(); - - - if (isShowingQuests) { - setupQuest(humanDeck); - } else { - setupBattle(humanDeck); - } - - AllZone.getQuestData().saveData(); - - AllZone.getDisplay().setVisible(true); - mainFrame.dispose(); - } - - - /** - *

setupBattle.

- * - * @param humanDeck a {@link forge.deck.Deck} object. - */ - void setupBattle(Deck humanDeck) { - - Deck computer = QuestBattleManager.getAIDeckNewFormat((selectedOpponent).getName()); - Constant.Runtime.ComputerDeck[0] = computer; - - AllZone.getGameAction().newGame(humanDeck, computer, forge.quest.data.QuestUtil.getHumanPlantAndPet(questData), - new CardList(), questData.getLife(), 20, null); - } - - /** - *

setupQuest.

- * - * @param humanDeck a {@link forge.deck.Deck} object. - */ - private void setupQuest(Deck humanDeck) { - Quest_Assignment selectedQuest = ((QuestQuest) selectedOpponent).getQuestAssignment(); - - Deck computerDeck = QuestBattleManager.getAIDeckNewFormat("quest" + selectedQuest.getId()); - Constant.Runtime.ComputerDeck[0] = computerDeck; - - AllZone.setQuestAssignment(selectedQuest); - - int extraLife = 0; - - if (questData.getInventory().getItemLevel("Gear") == 2) { - extraLife = 3; - } - - AllZone.getGameAction().newGame(humanDeck, computerDeck, - forge.quest.data.QuestUtil.getHumanPlantAndPet(questData, selectedQuest), new CardList(), - questData.getLife() + extraLife, selectedQuest.getComputerLife(), selectedQuest); - - } - - /** - *

getMatchIcon.

- * - * @return a {@link java.lang.String} object. - */ - String getMatchIcon() { - String oppIconName; - - if (isShowingQuests) { - Quest_Assignment selectedQuest = ((QuestQuest) selectedOpponent).getQuestAssignment(); - oppIconName = selectedQuest.getIconName(); - } else { - oppIconName = selectedOpponent.getName(); - oppIconName = oppIconName.substring(0, oppIconName.length() - 1).trim() + ".jpg"; - } - return oppIconName; - } - - /** - *

showQuests.

- */ - void showQuests() { - if (isShowingQuests) { - isShowingQuests = false; - questButton.setText("Quests"); - } else { - isShowingQuests = true; - questButton.setText("Battles"); - } - - if (selectedOpponent != null) { - selectedOpponent.setSelected(false); - } - - selectedOpponent = null; - - refresh(); - } - - class SelectionAdapter extends MouseAdapter { - QuestSelectablePanel selectablePanel; - - SelectionAdapter(QuestSelectablePanel selectablePanel) { - super(); - this.selectablePanel = selectablePanel; - } - - @Override - public void mouseClicked(MouseEvent mouseEvent) { - - if (selectedOpponent != null) { - selectedOpponent.setSelected(false); - } - - selectablePanel.setSelected(true); - - selectedOpponent = selectablePanel; - playButton.setEnabled(canGameBeLaunched()); - } - - } - - /** - *

moveDeckToTop.

- * - * @param humanDeckName a {@link java.lang.String} object. - */ - private void moveDeckToTop(String humanDeckName) { - QuestMainPanel.lastUsedDeck = humanDeckName; - } - - - /** - *

canGameBeLaunched.

- * - * @return a boolean. - */ - boolean canGameBeLaunched() { - return !(NO_DECKS_AVAILABLE.equals(deckComboBox.getSelectedItem()) || selectedOpponent == null); - } - - /** {@inheritDoc} */ - @Override - public void refreshState() { - this.refresh(); - } - -} diff --git a/src/forge/quest/gui/main/QuestQuest.java b/src/forge/quest/gui/main/QuestQuest.java deleted file mode 100644 index fad162655b9..00000000000 --- a/src/forge/quest/gui/main/QuestQuest.java +++ /dev/null @@ -1,115 +0,0 @@ -package forge.quest.gui.main; - -import forge.AllZone; -import forge.Quest_Assignment; -import forge.ReadQuest_Assignment; -import forge.gui.GuiUtils; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - -import javax.swing.*; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - *

QuestQuest class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestQuest extends QuestSelectablePanel { - /** Constant serialVersionUID=-162817410327650160L */ - private static final long serialVersionUID = -162817410327650160L; - - Quest_Assignment assignment; - - /** - *

Constructor for QuestQuest.

- * - * @param assignment a {@link forge.Quest_Assignment} object. - */ - public QuestQuest(Quest_Assignment assignment) { - super(assignment.getName(), assignment.getDifficulty(), assignment.getDesc(), GuiUtils.getIconFromFile(assignment.getIconName())); - this.assignment = assignment; - - JLabel repeatabilityLabel; - if (assignment.isRepeatable()) { - repeatabilityLabel = new JLabel("This quest is repeatable"); - } else { - repeatabilityLabel = new JLabel("This quest is not repeatable"); - } - - GuiUtils.addGap(centerPanel); - this.centerPanel.add(repeatabilityLabel); - } - - /** - *

getQuests.

- * - * @return a {@link java.util.List} object. - */ - public static List getQuests() { - List quests = new ArrayList(); - - List questList = readQuests(); - - for (Quest_Assignment assignment : questList) { - quests.add(new QuestQuest(assignment)); - } - return quests; - } - - /** - *

readQuests.

- * - * @return a {@link java.util.List} object. - */ - private static List readQuests() { - forge.quest.data.QuestData questData = AllZone.getQuestData(); - ReadQuest_Assignment read = new ReadQuest_Assignment(ForgeProps.getFile(NewConstants.QUEST.QUESTS), questData); - read.run(); - - List questsToDisplay = new ArrayList(); - - if (questData.getAvailableQuests() != null && questData.getAvailableQuests().size() > 0) { - List availableQuests = read.getQuestsByIds(questData.getAvailableQuests()); - questsToDisplay = availableQuests; - - } else { - List allAvailableQuests = read.getQuests(); - - List availableInts = new ArrayList(); - - int maxQuests = questData.getWin() / 10; - if (maxQuests > 5) { - maxQuests = 5; - } - if (allAvailableQuests.size() < maxQuests) { - maxQuests = allAvailableQuests.size(); - } - - Collections.shuffle(allAvailableQuests); - - for (int i = 0; i < maxQuests; i++) { - Quest_Assignment qa = allAvailableQuests.get(i); - - availableInts.add(qa.getId()); - - questsToDisplay.add(qa); - } - questData.setAvailableQuests(availableInts); - questData.saveData(); - }//else - return questsToDisplay; - } - - /** - *

getQuestAssignment.

- * - * @return a {@link forge.Quest_Assignment} object. - */ - public Quest_Assignment getQuestAssignment() { - return assignment; - } -} diff --git a/src/forge/quest/gui/main/QuestSelectablePanel.java b/src/forge/quest/gui/main/QuestSelectablePanel.java deleted file mode 100644 index e7107702656..00000000000 --- a/src/forge/quest/gui/main/QuestSelectablePanel.java +++ /dev/null @@ -1,125 +0,0 @@ -package forge.quest.gui.main; - -import forge.gui.GuiUtils; - -import javax.swing.*; -import javax.swing.border.CompoundBorder; -import javax.swing.border.EmptyBorder; -import javax.swing.border.LineBorder; -import java.awt.*; - -/** - *

QuestSelectablePanel class.

- * - * @author Forge - * @version $Id: $ - */ -public class QuestSelectablePanel extends JPanel { - /** Constant serialVersionUID=-1502285997894190742L */ - private static final long serialVersionUID = -1502285997894190742L; - - protected Color backgroundColor; - private boolean selected; - - ImageIcon icon; - String name; - String description; - String difficulty; - JPanel centerPanel = new JPanel(); - - /** - *

Constructor for QuestSelectablePanel.

- * - * @param name a {@link java.lang.String} object. - * @param difficulty a {@link java.lang.String} object. - * @param description a {@link java.lang.String} object. - * @param icon a {@link javax.swing.ImageIcon} object. - */ - public QuestSelectablePanel(String name, String difficulty, String description, ImageIcon icon) { - this.backgroundColor = getBackground(); - - this.name = name; - this.difficulty = difficulty; - this.description = description; - this.icon = icon; - - this.setLayout(new BorderLayout(5, 5)); - - - JLabel iconLabel; - - if (icon == null) { - iconLabel = new JLabel(GuiUtils.getEmptyIcon(40, 40)); - } else { - iconLabel = new JLabel(GuiUtils.getResizedIcon(icon, 40, 40)); - } - - iconLabel.setBorder(new LineBorder(Color.BLACK)); - iconLabel.setAlignmentY(TOP_ALIGNMENT); - - JPanel iconPanel = new JPanel(new BorderLayout()); - iconPanel.setOpaque(false); - iconPanel.add(iconLabel, BorderLayout.NORTH); - this.add(iconPanel, BorderLayout.WEST); - - centerPanel.setOpaque(false); - centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.Y_AXIS)); - this.add(centerPanel, BorderLayout.CENTER); - - JPanel centerTopPanel = new JPanel(); - centerTopPanel.setOpaque(false); - centerTopPanel.setAlignmentX(LEFT_ALIGNMENT); - centerTopPanel.setLayout(new BoxLayout(centerTopPanel, BoxLayout.X_AXIS)); - - JLabel nameLabel = new JLabel(this.name); - GuiUtils.setFontSize(nameLabel, 20); - nameLabel.setAlignmentY(BOTTOM_ALIGNMENT); - centerTopPanel.add(nameLabel); - - GuiUtils.addExpandingHorizontalSpace(centerTopPanel); - - JLabel difficultyLabel = new JLabel(this.difficulty); - difficultyLabel.setAlignmentY(BOTTOM_ALIGNMENT); - centerTopPanel.add(difficultyLabel); - centerPanel.add(centerTopPanel); - - GuiUtils.addGap(centerPanel); - - JLabel descriptionLabel = new JLabel(description); - descriptionLabel.setAlignmentX(LEFT_ALIGNMENT); - centerPanel.add(descriptionLabel); - - this.setMaximumSize(new Dimension(Integer.MAX_VALUE, 80)); - this.setBorder(new CompoundBorder(new LineBorder(Color.BLACK), new EmptyBorder(5, 5, 5, 5))); - } - - /** - *

isSelected.

- * - * @return a boolean. - */ - public boolean isSelected() { - return selected; - } - - /** - *

Setter for the field selected.

- * - * @param selected a boolean. - */ - public void setSelected(boolean selected) { - if (selected) { - this.setBackground(backgroundColor.darker()); - } else { - this.setBackground(backgroundColor); - } - - this.selected = selected; - } - - /** {@inheritDoc} */ - @Override - public String getName() { - return name; - } -} diff --git a/src/treeProperties/PropertyElement.java b/src/treeProperties/PropertyElement.java deleted file mode 100644 index 4fb020683af..00000000000 --- a/src/treeProperties/PropertyElement.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * PropertyElement.java - * - * Created on 19.08.2009 - */ - -package treeProperties; - - -/** - * The class PropertyElement. - * - * @author Clemens Koza - * @version V0.0 19.08.2009 - */ -public interface PropertyElement { - /** - * Returns the key of the property in the TreeProperties. - * - * @return a {@link java.lang.String} object. - */ - public String getKey(); - - /** - * Returns the type of the element. - * - * @return a {@link java.lang.Class} object. - */ - public Class getType(); - - /** - * Returns the value of the element. - * - * @return a {@link java.lang.Object} object. - */ - public Object getValue(); - - /** - * Sets the property value as a string. - * - * @param value a {@link java.lang.String} object. - */ - public void setValue(String value); -} diff --git a/src/treeProperties/PropertyType.java b/src/treeProperties/PropertyType.java deleted file mode 100644 index 86baeba0eab..00000000000 --- a/src/treeProperties/PropertyType.java +++ /dev/null @@ -1,44 +0,0 @@ -package treeProperties; - - -/** - * PropertyTypeHandler.java - * - * Created on 19.08.2009 - */ - - -/** - * The class PropertyType. A property type is used to process special, suffixed entries in a {@link TreeProperties} - * ' properties-file - * - * @author Clemens Koza - * @version V0.0 19.08.2009 - * - * @param - * - */ -public interface PropertyType { - /** - * The suffix, not including "--", that identifies this content type. - * - * @return a {@link java.lang.String} object. - */ - public String getSuffix(); - - /** - * The class that identifies this content type. - * - * @return a {@link java.lang.Class} object. - */ - public Class getType(); - - /** - * Returns an object for the specified value, in the context of a TreeProperties. - * - * @param p a {@link treeProperties.TreeProperties} object. - * @param s a {@link java.lang.String} object. - * @return a T object. - */ - public T toObject(TreeProperties p, String s); -} diff --git a/src/treeProperties/TreeProperties.java b/src/treeProperties/TreeProperties.java deleted file mode 100644 index b48e764cef6..00000000000 --- a/src/treeProperties/TreeProperties.java +++ /dev/null @@ -1,457 +0,0 @@ -package treeProperties; - - -/** - * TreeProperties.java - * - * Created on 19.08.2009 - */ - - -import treeProperties.types.FileType; - -import java.io.*; -import java.util.*; -import java.util.Map.Entry; - -import static java.lang.String.format; -import static java.util.Collections.unmodifiableList; - - -/** - * The class TreeProperties. This class allows for a tree-like structure of properties-files. This class lays some - * restrictions on the keys used in properties-files: - *
    - *
  • The use of "--" is forbidden
  • - *
  • The suffixes "--properties" and "--transparent-properties" are reserved for specifying additional - * properties-files in the tree (relative paths are relative to the properties-file where they are referenced)
  • - *
  • Other suffixes are used by {@link PropertyType}s. PropertyTypes are registered or unregistered using - * {@link #addType(PropertyType)} or {@link #removeType(PropertyType)}.
  • - *
- * Take a look at these files: - *

- *

- * #root.properties
- * title=directions
- * icons--properties=img/icons.properties
- *
- * #img/icons.properties
- * left--file=left.jpg
- * right--file=right.jpg
- * up--file=up.jpg
- * down--file=down.jpg
- * #note that the path does not contain "img/"
- * size--transparent-properties=size.properties
- *
- * #img/size.properties
- * width=20
- * height=20
- * 
- *

- * These properties are retrieved with - *

- *

- * getProperty("title") //directions
- * getFile("icons/left") //img/left.jpg
- * getFile("icons/right") //img/right.jpg
- * getFile("icons/up") //img/up.jpg
- * getFile("icons/down") //img/down.jpg
- * getProperty("icons/width") //20
- * getProperty("icons/height") //20
- * 
- *

- * As you can see, a properties file included with "--transparent-properties" hides its existence from the user. A - * file included with "--properties" is not hidden. The child properties are accessible as if their keys were - * prepended with the parent key, separated by a slash. - *

- * Note that --file, --properties and --transparent-properties entries will be relative to the included file, even - * if the properties file is transparent. - *

- * Also, the TreeProperties can be retrieved: - *

- *

- * getChildProperties("icons")
- * getTransparentProperties("icons/size")
- * 
- *

- *

- * TODO add edit & save support - * - * @author Clemens Koza - * @version V0.0 19.08.2009 - * @see Properties - */ -public class TreeProperties implements Iterable { - /** Constant suffixes */ - private static final Map> suffixes; - /** Constant types */ - private static final Map, PropertyType> types; - - /** Constant transparent="transparent-properties" */ - private static final String transparent = "transparent-properties"; - /** Constant child="properties" */ - private static final String child = "properties"; - - static { - types = new HashMap, PropertyType>(); - suffixes = new HashMap>(); - PropertyType[] pt = {new FileType()}; - for (PropertyType type : pt) { - addType(type); - } - } - - private File path; - private Map, PropertyType> instanceTypes; - private Map> instanceSuffixes; - private HashMap properties; - private List exceptions; - - /** - *

addType.

- * - * @param type a {@link treeProperties.PropertyType} object. - */ - public static void addType(PropertyType type) { - types.put(type.getType(), type); - suffixes.put(type.getSuffix(), type); - } - - /** - *

removeType.

- * - * @param type a {@link treeProperties.PropertyType} object. - */ - public static void removeType(PropertyType type) { - types.remove(type.getType()); - suffixes.remove(type.getSuffix()); - } - - /** - * Delegate to {@link #TreeProperties(File)} with a new {@link File#File(String)} - * - * @param f a {@link java.lang.String} object. - * @throws java.io.IOException if any. - */ - public TreeProperties(String f) throws IOException { - this(new File(f)); - } - - /** - * Delegate to {@link #TreeProperties(File)} with a new {@link File#File(File, String)} - * - * @param parent a {@link java.io.File} object. - * @param f a {@link java.lang.String} object. - * @throws java.io.IOException if any. - */ - public TreeProperties(File parent, String f) throws IOException { - this(new File(parent, f)); - } - - /** - * The constructor is forgiving in the way that Exceptions are not directly forwarded. The only fatal exception - * is if the parameter is null or not found. Instead, the rest of the properties are processed, so that the - * erroneous properties are the only ones not present in this TreeProperties. Afterwards, the exceptions can be - * accessed. - * - * @param f a {@link java.io.File} object. - * @throws java.io.IOException if any. - */ - public TreeProperties(File f) throws IOException { - if (f == null) throw new FileNotFoundException("null"); - this.path = f.getParentFile(); - instanceTypes = new HashMap, PropertyType>(types); - instanceSuffixes = new HashMap>(suffixes); - Properties p = new Properties(); - -// BufferedReader r = new BufferedReader(new FileReader(f)); -// p.load(r); -// r.close(); - BufferedInputStream is = new BufferedInputStream(new FileInputStream(f)); - p.load(is); - is.close(); - - Set> entries = p.entrySet(); - properties = new HashMap(); - List exceptions = new ArrayList(); - this.exceptions = unmodifiableList(exceptions); - for (Entry entry : entries) { - String key = (String) entry.getKey(); - String value = (String) entry.getValue(); - try { - String[] parts = key.split("--", 2); - Object result; - if (parts.length == 1) { - //Regular - result = value; - } else { - //suffix - if (parts[1].equals(transparent) || parts[1].equals(child)) { - TreeProperties child = new TreeProperties(path, FileType.getPath(value)); - exceptions.addAll(child.exceptions); - result = child; - } else { - PropertyType t = instanceSuffixes.get(parts[1]); - if (t == null) throw new IllegalArgumentException("No content type: " + parts[1]); - result = t.toObject(this, value); - } - } - properties.put(key, result); - } catch (Exception ex) { - exceptions.add(new Exception(format("File '%s', Property '%s':%n %s", f, key, ex.getMessage()), - ex.getCause())); - } - } - } - - /** - * Returns the exceptions that were thrown while creating the tree properties. - * - * @return a {@link java.util.List} object. - */ - public List getExceptions() { - return exceptions; - } - - /** - * If exceptions occurred during construction, this method throws an IOException that combines the messages of - * those exceptions. - * - * @throws java.io.IOException if any. - */ - public void rethrow() throws IOException { - if (exceptions.isEmpty()) return; - StringBuilder sb = new StringBuilder("The following exceptions occurred:"); - for (Exception ex : exceptions) { - sb.append("\n"); - sb.append(ex.getMessage()); - } - throw new IOException(sb.toString()); - } - - /** - * Returns the parent directory of this TreeProperties. - * - * @return a {@link java.io.File} object. - */ - public File getPath() { - return path; - } - - /** - * Checks if the key is valid for a query and throws an {@link IllegalArgumentException} if not. Slashes are - * allowed in this method, but suffixes are not - * - * @param key a {@link java.lang.String} object. - */ - private void checkQueryKey(String key) { - if (key.contains("--")) throw new IllegalArgumentException("Invalid key: " + key); - } - - /** - * Retrieves the string property for the given key. - * - * @param key a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public String getProperty(String key) { - return getProperty(key, String.class); - } - - /** - * Convenience for {@code getProperty(key, File.class)}. - * - * @param key a {@link java.lang.String} object. - * @return a {@link java.io.File} object. - */ - public File getFile(String key) { - return getProperty(key, File.class); - } - - /** - * Retrieves the child properties for the given key. Transparent properties can't be retrieved this way. - * - * @param key a {@link java.lang.String} object. - * @return a {@link treeProperties.TreeProperties} object. - */ - public TreeProperties getChildProperties(String key) { - return (TreeProperties) getProperty(key, "--" + child, true); - } - - /** - * Retrieves the child properties for the given key. - * - * @param key a {@link java.lang.String} object. - * @return a {@link treeProperties.TreeProperties} object. - */ - public TreeProperties getTransparentProperties(String key) { - return (TreeProperties) getProperty(key, "--" + transparent, true); - } - - /** - * Returns a property of the given type. This does not work to retrieve tree properties. - * - * @param key a {@link java.lang.String} object. - * @param cls a {@link java.lang.Class} object. - * @return a T object. - * @param a T object. - */ - @SuppressWarnings("unchecked") - public T getProperty(String key, Class cls) { - String suffix; - if (cls == String.class) suffix = ""; - else { - PropertyType t = instanceTypes.get(cls); - suffix = "--" + t.getSuffix(); - } - return (T) getProperty(key, suffix, true); - } - - /** - *

getProperty.

- * - * @param key a {@link java.lang.String} object. - * @param suffix a {@link java.lang.String} object. - * @param top a boolean. - * @return a {@link java.lang.Object} object. - */ - private Object getProperty(String key, String suffix, boolean top) { - checkQueryKey(key); - //first, try the key in the current file, as if there were no slash - //No subpath - either directly in the properties... - Object result; - if ((result = properties.get(key + suffix)) != null) return result; - - //...or in a transparent properties - - //look for all --transparent-properties - for (Entry entry : properties.entrySet()) { - if (entry.getKey().endsWith("--" + transparent)) { - TreeProperties p = (TreeProperties) entry.getValue(); - if ((result = p.getProperty(key, suffix, false)) != null) { - return result; - } - } - } - - //if there is no immediate containment, try the children - //try every combination - //for a/b/c, there could be a child "a/b--properties" that contains "c" - //or "a--properties" with "b/c" - int index = -1; - while ((index = key.indexOf('/', index + 1)) != -1) { - String first = key.substring(0, index), second = key.substring(index + 1); - - TreeProperties p = (TreeProperties) getProperty(first, "--" + child, false); - if (p == null) continue; - if ((result = p.getProperty(second, suffix, false)) != null) { - return result; - } - } - if (top) { - Exception ex = new Exception("TreeProperties returns null for " + key + suffix); -// ex.printStackTrace(); - System.err.println(ex); - } - return null; - } - - /** - * Returns an iterator over all the regular entries of this object. That means that transparent or child tree - * properties are not included. - * - * @return a {@link java.util.Iterator} object. - */ - public Iterator iterator() { - return iterator(""); - } - - ; - - /** - *

iterator.

- * - * @param prefix a {@link java.lang.String} object. - * @return a {@link treeProperties.TreeProperties.TreePropertiesIterator} object. - */ - private TreePropertiesIterator iterator(String prefix) { - return new TreePropertiesIterator(prefix); - } - - private final class TreePropertiesIterator implements Iterator { - private final String prefix; - private Iterator> entries; - private TreePropertiesIterator child; - private PropertyElement next; - - private TreePropertiesIterator(String prefix) { - entries = properties.entrySet().iterator(); - this.prefix = prefix; - } - - //After this call, the next element is determined, or the child iterator has next - - public boolean hasNext() { - if (next != null) return true; - else if (child != null && child.hasNext()) return true; - else if (entries.hasNext()) { - Entry entry = entries.next(); - final String[] parts = entry.getKey().split("--"); - final Class cls; - final Object value = entry.getValue(); - - if (parts.length == 1) { - cls = String.class; - } else if (parts[1].equals(transparent)) { - child = ((TreeProperties) entry.getValue()).iterator(prefix); - //recursive, for the case that the child iterator is empty - return hasNext(); - } else if (parts[1].equals(TreeProperties.child)) { - child = ((TreeProperties) entry.getValue()).iterator(prefix + parts[0] + "/"); - //recursive, for the case that the child iterator is empty - return hasNext(); - } else { - //class is determined by the content type - PropertyType t = instanceSuffixes.get(parts[1]); - cls = t.getType(); - } - next = new PropertyElement() { - - public String getKey() { - return prefix + parts[0]; - } - - - public Class getType() { - return cls; - } - - - public Object getValue() { - return value; - } - - - public void setValue(String value) { - } - }; - return true; - } else return false; - } - - - public PropertyElement next() { - if (!hasNext()) throw new NoSuchElementException(); - else if (next != null) { - PropertyElement next = this.next; - this.next = null; - return next; - } else return child.next(); - } - - - public void remove() { - throw new UnsupportedOperationException(); - } - } -} diff --git a/src/treeProperties/types/FileType.java b/src/treeProperties/types/FileType.java deleted file mode 100644 index e3d8525ca9a..00000000000 --- a/src/treeProperties/types/FileType.java +++ /dev/null @@ -1,80 +0,0 @@ -/** - * FileType.java - * - * Created on 19.08.2009 - */ - -package treeProperties.types; - - -import treeProperties.PropertyType; -import treeProperties.TreeProperties; - -import java.io.File; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - - -/** - * The class FileType. - * - * @author Clemens Koza - * @version V0.0 19.08.2009 - */ -public class FileType implements PropertyType { - /** Constant suffix="file" */ - public static final String suffix = "file"; - /** Constant type */ - public static final Class type = File.class; - - /** - *

Getter for the field suffix.

- * - * @return a {@link java.lang.String} object. - */ - public String getSuffix() { - return suffix; - } - - /** - *

Getter for the field type.

- * - * @return a {@link java.lang.Class} object. - */ - public Class getType() { - return type; - } - - - /** {@inheritDoc} */ - public File toObject(TreeProperties p, String s) { - String path = getPath(s); - File f = new File(path); - if (f.isAbsolute()) return f; - else return new File(p.getPath(), path); - } - - /** - * Returns a path path from a property value. Three substitutions are applied: - *
    - *
  • A "~/" or "~\" at the beginning is replaced with the user's home directory
  • - *
  • A "$$" anywhere is replaced with a single "$"
  • - *
  • A "${*}", where * is any string without "}", is replaced by {@link System#getProperty(String)}
  • - *
- * - * @param s a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public static String getPath(String s) { - if (s.startsWith("~/")) s = System.getProperty("user.home") + "/" + s.substring(2); - else if (s.startsWith("~\\")) s = System.getProperty("user.home") + "\\" + s.substring(2); - Matcher m = Pattern.compile("\\$\\$|\\$\\{([^\\}]*)\\}").matcher(s); - StringBuffer result = new StringBuffer(); - while (m.find()) { - if (m.group().equals("$$")) m.appendReplacement(result, Matcher.quoteReplacement("$")); - else m.appendReplacement(result, Matcher.quoteReplacement(System.getProperty(m.group(1)))); - } - m.appendTail(result); - return result.toString(); - } -}